今日头条笔试
第一题
题目描述:
在n个元素的数组中,找到差值为k的数字对去重后的个数。
输入描述:
第一行,n和k,n表示数字个数,k表示差值
第二行,n个正整数
输出描述:
差值为k的数字对去重后的个数
示例 1
5 3
1 5 3 4 2
输出
3
示例 2
4 0
1 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\n", 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\n",ans); } return 0; }