今日头条编程题(手串、用户喜好)代码分享
1、手串
//手串,代码写的有点丑,还用了goto。。。基本思想就是每次将所有颜色++,当i>m的时候,将(i-m)时候的颜色--,依次判断颜色是否重复。复杂度O(n)。 ----- 100%
#include<bits/stdc++.h>
using namespace std;
int f[60];
set<int > s;
int have[20005][60];
int pos[20005];
int main()
{
int n,m,c;
scanf("%d%d%d",&n,&m,&c);
for(int i=1; i<=n+n; i++)
{
if(i>n)
{
goto loop;
}
int k;
scanf("%d",&k);
pos[i]=k;
pos[i+n]=k;
for(int j=0; j<k; j++)
{
scanf("%d",&have[i][j]);
int a=have[i][j];
have[i+n][j]=a;
}
loop :
for(int j=0;j<pos[i];j++)
{
int a=have[i][j];
f[a]++;
}
if(i>m)
{
int p=i-m;
int len=pos[p];
for(int j=0; j<len; j++)
{
int a=have[p][j];
f[a]--;
}
}
if(i>=m)
{
for(int j=1; j<=c; j++)
{
if(f[j]>=2)
{
s.insert(j);
}
}
}
}
printf("%d\n",s.size());
return 0;
}
/*
5 2 3
3 1 2 3
0
2 2 3
1 2
1 3
*/
2、用户喜好
//用户喜好,要先对k值进行离散化,因为k值(即用户喜好值)有可能特别大,比如1e9。然后用一个vector存储k出现的位置,排序(排不排都一样,放进去的时候肯定是顺序的),然后两次二分求出区间就ok了~(先还搞了个线段树,太失败...) ------100%
//Óû§Ï²ºÃ
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
const int maxn = 300007;
vector<int > v[maxn];
map<int ,int > ma;
int work1(int p ,int L)
{
int l=0,r=v[p].size()-1;
int ans=1e9;
while(l<=r)
{
int mid=(l+r)/2;
if(v[p][mid]>=L)
{
ans=min(ans,mid);
r=mid-1;
}
else
{
l=mid+1;
}
}
if(ans==1e9) return -1;
return ans;
}
int work2(int p ,int R)
{
int l=0,r=v[p].size()-1;
int ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(v[p][mid]<=R)
{
ans=max(ans,mid);
l=mid+1;
}
else
{
r=mid-1;
}
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
int num=1;
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
if(ma[a]==0)
{
ma[a]=num++;
}
v[ma[a]].push_back(i);
}
for(int i=1;i<=n;i++)
{
sort(v[i].begin(),v[i].end());
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int l,r,p,P;
scanf("%d%d%d",&l,&r,&P);
p=ma[P];
int L=work1(p,l);
int R=work2(p,r);
if(L==-1||R==-1)
{
printf("0\n");
}
else
{
printf("%d\n",R-L+1);
}
}
return 0;
}
/*
5
1 2 3 3 5
3
1 2 1
2 4 5
3 5 3
*/
然后打个广告撒~~
广州多益网络的内推开始了,内推后简历免筛选,笔试直通二笔,应聘失败也不影响正式秋招,多一次机会。
内推码: N3dut1
岗位在这里http://xz.duoyi.com/home/news/2018-recommend.html
直接网申,填上内推口令N3dut1
是9.16笔试,爱你萌~~~
hahahaha
查看9道真题和解析