编程题1

题目大意

为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k。因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。

思路

多次区间查询区间内等于x的个数
没有更新,不适用线段树或者树状数组。单纯遍历是O(n),先排序预处理然后二分查找是O(logn),但是排序会破坏区间。所以我们考虑一个区间内的数部分遍历部分二分查找,就是分块的思想,两端遍历,中间每个排序好的块二分查找个数。

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int>a[1000];
int b[300005];
int n,k,q;
int getp(int x){return x/k;
}
int query(int l,int r,int c){int res=0;int m=getp(l);int p=getp(r);for(int i=l;i<(m+1)*k;i++){if(b[i]==c)res++;}for(int i=m+1;i<p;i++){res+=upper_bound(a[i].begin(),a[i].end(),c)-lower_bound(a[i].begin(),a[i].end(),c);}for(int i=p*k;i<=r;i++){if(b[i]==c)res++;}return res;
}
int main(){scanf("%d",&n);k=sqrt(n);for(int i=1;i<=n;i++){scanf("%d",&b[i]);a[getp(i)].push_back(b[i]);}for(int i=0;i<=n/k;i++){sort(a[i].begin(),a[i].end());}scanf("%d",&q);int l,r,c;while(q--){scanf("%d%d%d",&l,&r,&c);printf("%d\n",query(l,r,c));}}

编程题2

题目大意

作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串——每个串珠要么无色,要么涂了若干种颜色。为了使手串的色彩看起来不那么单调,金主要求,手串上的任意一种颜色(不包含无色),在任意连续的m个串珠里至多出现一次(注意这里手串是一个环形)。手串上的颜色一共有c种。现在按顺时针序告诉你n个串珠的手串上,每个串珠用所包含的颜色分别有哪些。请你判断该手串上有多少种颜色不符合要求。即询问有多少种颜色在任意连续m个串珠中出现了至少两次。

思路

比第一题简单得多,滚动区间即可

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int>a[100005];
int now[55];
int ans[55];
int n,m,c;
int main(){scanf("%d%d%d",&n,&m,&c);int x,y;for(int i=1;i<=n;i++){scanf("%d",&x);while(x--){scanf("%d",&y);a[i].push_back(y);}}for(int i=1;i<=m;i++){for(int j=0;j<a[i].size();j++){now[a[i][j]]++;}}for(int i=1;i<=n;i++){for(int j=1;j<=c;j++){if(now[j]>1)ans[j]=1;}for(int j=0;j<a[i].size();j++){now[a[i][j]]--;}if(i+m>n)x=(i+m)%n;else x=i+m;for(int j=0;j<a[x].size();j++){now[a[x][j]]++;}}int res=0;for(int i=1;i<=c;i++){if(ans[i]==1)res++;}printf("%d",res);return 0;
}

编程题3

题目大意

字符串S由小写字母构成,长度为n。定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换。询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同?

思路

贪心或者dp,我写的是贪心。
首先理解交换字母,当我们以某个字母为目标时,我们尽量将所有字母向中间靠拢可以使得使用交换次数最小,具体是哪个字母我们需要遍历,每种字母的每个位置作为中间聚集点计算一遍答案求最长距离。
在计算时用到贪心思路,为了使得连续字母数最多,肯定是先将距离聚集点最近的点先交换,所以用两个动态指针向两边扩展,比较两边的距离,选短的进行交换,如此循环即可。
复杂度在O(n2)

AC代码

#include<stdio.h>
#include<string.h>
#include<vector>
#define ll long long
using namespace std;
char s[10005];
int m,n,k,l,r,num,x,left,right,leftp,rightp,ans;
vector<int>pose[30];
int main(){scanf("%s%d",&s,&m);n=strlen(s);for(int i=0;i<n;i++){pose[s[i]-'a'].push_back(i);}ans=0;for(int i=0;i<=25;i++){k=pose[i].size();for(int j=0;j<k;j++){l=pose[i][j],r=pose[i][j],num=1,x=m;left=j-1,right=j+1;leftp,rightp;while(left>=0&&right<k){leftp=l-pose[i][left]-1;rightp=pose[i][right]-r-1;if(leftp>x&&rightp>x)break;else if(leftp<rightp){x-=leftp;left--;l--;num++;}else{x-=rightp;right++;r++;num++;}}while(left>=0){leftp=l-pose[i][left]-1;if(leftp>x)break;x-=leftp;left--;l--;num++;}while(right<k){rightp=pose[i][right]-r-1;if(rightp>x)break;x-=rightp;right++;r++;num++;}ans=ans>num?ans:num;}}printf("%d",ans);return 0;
}

字节跳动2018算法工程师校招编程题题解(第二批)相关推荐

  1. 字节跳动秋招笔试四道编程题(2021-08-29)

    以下字节笔试编程题代码及思路由@nuoyanli提供,有兴趣的可以去这位ACM专业打铁选手那里找到更多刷题技巧. 文章目录 第一道:第一题自然数a.b(100%) 题目描述 思路 参考代码: 第二道: ...

  2. 阿里算法工程师在线编程题

    第一次投实习,阿里的在线编程题,只有一道,半个小时完成. 这道题主要要想到有递推公式 当N>=3时A(N)=M*(M-1)^(N-1)-A(N-1) N=2时,初值为M(M-1),因为只有两块, ...

  3. 蘑菇街2016研发工程师在线编程题 - 题解

    今天无聊地蛋疼,所以在牛客网随便找了套题做做,随手写了下解题报告,套题链接:点这里 总体来说这套题就考了下贪心和模拟,最后一题考了一个经典的动态规划,其实也有别的方法可以搞,这题对于大家练手还是不错的 ...

  4. 今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解

    以前做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解.这一场的题目偏技巧和算法,而第三批的题偏编码.这一场涉及的算法有二分查找.区间动态规划. 原题链接:点这儿. 第 ...

  5. 今日头条2018校园招聘后端开发工程师(第四批)编程题 - 题解

    做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解和第二批的题目,今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解. 这一场题目还是挺好玩的,也挺有技巧 ...

  6. 58同城2020校招转转算法岗笔试编程题

    58同城2020校招转转算法岗笔试编程题 第一题 题目描述:年末了要评选优秀员工了,给定一个优秀员工比率,在员工的评分上计算出能被选中的优秀员工的评分阈值.优秀员工人数=员工人数*优秀员工比率.员工人 ...

  7. 字节跳动经典算法题:给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数

    字节跳动经典算法题(提问次数最多) 题目描述:给定一个数n如23121:给定一组数字a,如[2 4 9]:求由a中元素组成的小于n的最大数. 思路分析:暴力分析手法 1. 判断该位的数值是否在数字a中 ...

  8. 今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解

    昨天做了下头条的后端开发工程师的编程题,这编码量大啊,两个小时,三个编程题,一个改错题,一个设计题,说实话,很考技术含量,而且编程题中有两个还特别考细心编码,如果两个小时能做三个题,确实非常不错了,写 ...

  9. 字节跳动面试算法题目以及答案

    题目来源于牛客 https://www.nowcoder.com/discuss/455003?type=post&order=time&pos=&page=2&cha ...

最新文章

  1. 旷视科技 Face++ 全资收购艾瑞思机器人 正式进军机器人业务
  2. gogs mysql 报错_linux上Docker安装gogs私服亲测(详解)
  3. 【单页应用】全局控制器app应该干些什么?
  4. 绕过360安全卫士的部分代码
  5. 华为鸿蒙系统不卡,华为鸿蒙系统,到底能不能取代安卓?网友:细节决定成败...
  6. asp.net core 环境(Development、Staging 、Production)
  7. fastapi PUT更新数据 / PATCH部分更新
  8. 录音喊话器的故障修理_我司quot;XAHHQ1型quot;喊话器 通过公安部检测
  9. 专访头条搜索:从推荐到搜索,如何构建搜索技术的另一种可能?
  10. Git提交失败之 Updates were rejected because the tip of your current branch is behind
  11. DB2开发系列之一——基本语法
  12. python面向对象的含义_Python面向对象(一)
  13. 21天jenkins打卡前置准备:linux环境
  14. Chromeedge好用扩展插件分享
  15. 最全静态网页模板网站
  16. 【Matlab水果蔬菜识别】灰度+二值化+腐蚀+直方图处理水果蔬菜识别【含GUI源码 1052期】
  17. 【贪心法】黑白连线问题
  18. 用HTML写一首绝句古诗,《绝句二首》_杜甫的诗词_诗词名句网
  19. 制图操作案例:ArcGIS Pro鹰眼图快速制图
  20. 笔记本开机数字小键盘自动打开问题

热门文章

  1. flutter 点击旋转动画_让动画实现更简单,Flutter 动画简易教程!
  2. MFC WM_MOUSELEAVE和WM_MOUSEHOVER消息
  3. 新手如何避开机器学习过程中的弯路
  4. 四款 MySQL Operator 助你容器数据库
  5. 使用公共 Registry - 每天5分钟玩转 Docker 容器技术(19)
  6. 九宫格拼图c语言程序,求问九宫拼图怎么判断有无解
  7. 苹果榜单优化的主要方式?
  8. 【问题解决】MISCONF Redis is configured to save RDB snapshots, but it is currently not a
  9. 2021高考成绩查询电话号码多少,重庆高考成绩查询电话号码多少,2021年重庆高考查分电话...
  10. Sys Tick【转】