zoukankan      html  css  js  c++  java
  • 面试题 17.05. 字母与数字

    面试题 17.05. 字母与数字

    • 令字母为1,数字为-1,先求前缀和,如果前缀和数组该位置为0,那么说明区间[0,i]之间和为零,我们需要最长的连续的子区间的和为0,那么我们先定义结果的这个区间的头为x,尾巴为y,当遍历前后缀和数组时,位置为0的地方,更新x,y的值为0,i,当遇到其他前缀和时,当map<int,int>mp里有没有这个,若没有,则存入map,用来记录除了前缀和第一次为0的其他前缀和的位置,如果发现非零的前缀和mp里有了,那么就判断哪个区间长即可,即判断 $ i-mp[sum[i]] $ 和 $ y-x+1 $ 的大小,若比之前的大,则更新x,y的值即可,最后返回array数组的x,y+1这段区间的值即可。
    class Solution {
    public:
        vector<string> findLongestSubarray(vector<string>& array) {
            map<int,int>mp;
            int sum[array.size()+10];
            int k[array.size()+10];
            for(int i=0;i<array.size();i++)
            {
                if((array[i]>="a"&&array[i]<="z")||(array[i]>="A"&&array[i]<="Z"))
                    k[i]=1;
                else
                    k[i]=-1;
            }
            sum[0]=k[0];
            for(int i=1;i<array.size();i++)
            {
                sum[i]=sum[i-1]+k[i];
            }
            int x=0,y=0;
            for(int i=0;i<array.size();i++)
            {
                if(sum[i]==0)
                {
                    x=0;y=i;
                }
                else if(!mp.count(sum[i]))
                {
                    mp[sum[i]]=i;
                }
                else if(i-mp[sum[i]]>y-x+1)
                {
                    x=mp[sum[i]]+1;
                    y=i;
                }
            }
            if(x==y)
                return {};
            return vector<string>(array.begin()+x,array.begin()+y+1);
        }
    };
    
  • 相关阅读:
    SQL 开窗函数
    使用 git 管理源代码
    mybatis常见问题
    es-删除记录
    Jmeter使用
    websocket在服务端获取客户端IP
    单点登录
    java中的HTTP客户端
    SpringBoot利用Redis管理分布式Session
    springboot中的统一异常处理
  • 原文地址:https://www.cnblogs.com/Vampire6/p/13210023.html
Copyright © 2011-2022 走看看