面试题-今日头条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>
 
using namespace std;
 
int main()
{
    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
        string s;
        cin>>s;
         
        int idx = 0;
         
        while(idx<s.length()){
            int j = idx+1;
            while(j<s.length()&&s[j]==s[idx]) j++;
            int len = 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>
 
using namespace std;
 
int main()
{
    long long N,D;
    cin>>N>>D;
     
    long long ans = 0;
    vector<long long> dis;
    int j = 0;
    for(int i=0;i<N;i++)
    {
        long long x;
        cin>>x;
        dis.push_back(x);
 
        while(i>=2 && dis[i]-dis[j]>D) j++;
        ans += (long long)(i-j)*(i-j-1)/2;
    }
    cout<<ans%99997867;
    return 0;
}
 
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>
 
using namespace std;
 
 
 
int main()
{
    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
        int M;
        cin>>M;
        map<pair<int,int>,int> preFreq;
        map<pair<int,int>,int> Freq;
        int ans = 1;
        for(int j=0;j<M;j++){
            int k;
            cin>>k;
            for(int l = 0;l<k;l++){
                int x,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;
    }
    return 0;
}
 
 

 

posted @ 2020-03-20 14:58  青云_1999  阅读(235)  评论(0)    收藏  举报