面试题-今日头条2019笔试题
1. 字符串处理

这一题就是常规的字符串处理,需要同时满足1)出现次数>=3的一个字母只保留2个,2)出现AABB模式去掉其中一个字母
直接的办法是在原来的字符串中扫描,原地删除!可以先按照模式1删除,再按照模式2删除
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include<iostream>#include<string>usingnamespacestd;intmain(){    intN;    cin>>N;    for(inti=0;i<N;i++)    {        string s;        cin>>s;                intidx = 0;                while(idx<s.length()){            intj = idx+1;            while(j<s.length()&&s[j]==s[idx]) j++;            intlen = j-idx;            if(len>=3){                s.erase(idx,len-2);            }            idx++;        }        idx = 0;        while(idx+3<s.length()){            if(s[idx]==s[idx+1]&&s[idx+2]==s[idx+3]&&s[idx+2]!=s[idx+1])                s.erase(idx+3,1);            idx++;        }                cout<<s<<endl;    }} | 
 2.数组处理
 
我一开始的思路:
获得数组后,对每个位置向后遍历,知道出现差值>D, 然后在它们之间选择2个数,因此每一次扫描ans += C(n,2)
为什么是C(n,2)?
- 防止出现重复的组数。
假定扫描到该位置,考虑以该位置作为第一个地点,再看剩下的数字能否构成其余两个点
通过率只有20%,出现超时
- 将变量改为int型
- 边获得输入边扫描,同时用变量j来保存上一次左侧边界位置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include<iostream>#include<vector>usingnamespacestd;intmain(){    longlongN,D;    cin>>N>>D;        longlongans = 0;    vector<longlong> dis;    intj = 0;    for(inti=0;i<N;i++)    {        longlongx;        cin>>x;        dis.push_back(x);        while(i>=2 && dis[i]-dis[j]>D) j++;        ans += (longlong)(i-j)*(i-j-1)/2;    }    cout<<ans%99997867;    return0;} | 
3. map的应用
 
这里直接应用了map - map<pair<int,int>,int> Frequency;
但是输出的却是连续的,怎么办?
分别设置 preFreq 和 Freq,每一次用Freq更新PreFreq,同时preFreq清空。
遍历的适合根据preFreq进行次数更加,就可以做到统计连续值!
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include<iostream>#include<vector>#include<map>usingnamespacestd;intmain(){    intN;    cin>>N;    for(inti=0;i<N;i++)    {        intM;        cin>>M;        map<pair<int,int>,int> preFreq;        map<pair<int,int>,int> Freq;        intans = 1;        for(intj=0;j<M;j++){            intk;            cin>>k;            for(intl = 0;l<k;l++){                intx,y;                cin>>x>>y;                if(preFreq.count(make_pair(x,y))){                   preFreq[make_pair(x,y)]+=1;                   Freq[make_pair(x,y)]=preFreq[make_pair(x,y)];                   ans = max(ans,Freq[make_pair(x,y)]);                }                else                   Freq[make_pair(x,y)]+=1;             }            preFreq = Freq;            Freq.clear();        }        cout<<ans<<endl;    }    return0;} | 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号