今日头条笔试

第一题

题目描述:

在n个元素的数组中,找到差值为k的数字对去重后的个数。

输入描述:

第一行,n和k,n表示数字个数,k表示差值

第二行,n个正整数

输出描述:

差值为k的数字对去重后的个数

示例 1

5 3

1 5 3 4 2

输出

3

示例 2

4 0

1 1 1 1

输出

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+7;
int a[N];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;++i) scanf("%d",&a[i]);
    sort(a, a+n);
    n = unique(a, a+n) -a;
    int r = 0, ans=0;
    for(int l=0; l<n;++l)
    {
        while(r<n&&a[r]-a[l]<k) ++r;
        if(r==n) break;
        if(a[r]-a[l] == k) ++ans;
    }
    printf("%d
", ans);
    return 0;
}

 第二题

题目描述:

定义两个字符变量:s和m,再定义两种操作,

第一种操作:

m=s;

s=s+s;

第二种操作:

s=s+m;

假设初始化如下:

s="a"; m=s;

求最小的操作步骤数,可以将s拼接到长度等于n;

该题的解放有多种,我在这介绍两种思路:1.dfs 2. bfs

DFS

#include <iostream>
#include<map>
using namespace std;
int minStep=INT_MAX;
void dfs(string s,string m,int step,int n){
    if(s.size()>=n){
        if(s.size()==n)
        {
            minStep=(step<minStep?step:minStep);
        }
    }
    else{
        dfs(s+s,s,step+1,n);
        dfs(s+m,m,step+1,n);
    }
}

int getMinStep(int n)
{
    dfs("a","a",0,n);
    return minStep;
}

int main(){
    int n;
    while(cin>>n){
        cout<<getMinStep(n)<<endl;
    }
}

BFS

#include <bits/stdc++.h>
using namespace std;
map<int,map<int,int> >mmp;
 
int main(){
    int n;
    while(~scanf("%d",&n)){
        int s = 1,m = 1;mmp.clear();
        queue<pair<pair<int,int>,int > >q;
        q.push({{s,m},0});
        mmp[1][1] = 1;
        int ans = 0;
        while(!q.empty()){
            int ss = q.front().first.first;
            int mm = q.front().first.second;
            int step = q.front().second;
            q.pop();
            if(ss == n){
                ans = step;
                break;
            }
            if(ss > n) continue;
            if(!mmp.count(ss+mm) || !mmp[ss+mm].count(mm)){
                q.push({{ss+mm,mm},step+1});
                mmp[ss+mm][mm] = 1;
            }
            if(!mmp.count(ss+ss) || !mmp[ss+ss].count(ss)){
                q.push({{ss+ss,ss},step+1});
                mmp[ss+ss][ss] = 1;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ktao/p/8642579.html