• 面试题 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);
        }
    };
    
  • 相关阅读:
    统计代码行数
    梯度下降算法
    multiplot 安装与配置
    ros 源码安装
    cmake 指定gcc/g++版本
    python 科学计算基础库安装
    协方差矩阵的含义
    pysvn 相关
    void 0与undefined
    BEM规范
  • 原文地址:https://www.cnblogs.com/Vampire6/p/13210023.html
Copyright © 2020-2023  润新知