今日头条编程题(手串、用户喜好)代码分享

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
#字节跳动#
全部评论
import java.util.ArrayList; import java.util.Scanner; public class Main1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); //珠子的个数 int m=sc.nextInt(); //连续不能出现同一种颜色的珠子数 int c=sc.nextInt(); //颜色的种类 ArrayList<ArrayList<Integer>> arr=new ArrayList<ArrayList<Integer>>(); for(int i=0;i<n;i++){ ArrayList<Integer> list=new ArrayList<Integer>(); int k=sc.nextInt(); for(int j=0;j<k;j++){ list.add(sc.nextInt()); } arr.add(list); } f(arr,n,m,c); } } private static void f(ArrayList<ArrayList<Integer>> arr, int n, int m, int c) { if(m==1){ System.out.println(0); return; } ArrayList<ArrayList<Integer>> p=new ArrayList<ArrayList<Integer>>(); int sum=0; for(int i=1;i<=c;i++){   //每一种颜色进行判断      ArrayList<Integer> list=new ArrayList<Integer>();      int count=1;      for(ArrayList<Integer> t:arr){      for(int j=0;j<t.size();j++){      if(t.get(j)==i){      list.add(count);      t.remove(Integer.valueOf(i));      }      }      count++;      }      p.add(list); } for(ArrayList<Integer> t:p){ if(t.size()==1){ continue; } if((t.get(0)==1)&&(t.get(t.size()-1)==n)){ sum++; continue; } for(int i=1;i<t.size();i++){ if((t.get(i)-t.get(i-1))<m){ sum++; continue; } } } System.out.println(sum); } }
点赞 回复 分享
发布于 2017-09-10 22:23
哈哈哈
点赞 回复 分享
发布于 2017-09-10 22:13
喜好度那题有没有人从 L到R直接遍历全AC的?
点赞 回复 分享
发布于 2017-09-10 22:07
邀请码get, 第二题莫队给我冲过去了。 
点赞 回复 分享
发布于 2017-09-10 21:43
多益是9.16笔试
点赞 回复 分享
发布于 2017-09-10 21:28
居然是个广告贴。。
点赞 回复 分享
发布于 2017-09-10 21:18
这不是我印象中的头条。。。
点赞 回复 分享
发布于 2017-09-10 21:02

相关推荐

不愿透露姓名的神秘牛友
08-08 10:30
点赞 评论 收藏
分享
评论
2
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务