牛客网 字节跳动2019春招研发部分编程题汇总(7道编程题)
[编程题] 万万没想到之聪明的编辑
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。
后面跟随N行,每行为一个待校验的字符串。
输出描述:
N行,每行包括一个被修复后的字符串。
输入例子1:
2 helloo wooooooow
输出例子1:
hello woow
题解:
每次取判断是否连续出现3个相同和是否出现"AABB"的形式即可。
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10; 4 char s[N]; 5 6 int main() 7 { 8 int n; 9 cin>>n; 10 while(n--) 11 { 12 cin>>s; 13 int k=0; 14 for(int i=0;s[i];i++) 15 { 16 s[k++]=s[i]; 17 if(k>=3&&s[k-3]==s[k-2]&&s[k-2]==s[k-1]) k--; 18 if(k>=4&&s[k-4]==s[k-3]&&s[k-2]==s[k-1]) k--; 19 20 } 21 s[k]='\0'; 22 cout<<s<<'\n'; 23 } 24 return 0; 25 }
[编程题] 万万没想到之抓捕孔连顺
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 128M,其他语言256M
输入描述:
第一行包含空格分隔的两个数字 N和D(1 ≤ N ≤ 1000000; 1 ≤ D ≤ 1000000)
第二行包含N个建筑物的的位置,每个位置用一个整数(取值区间为[0, 1000000])表示,从小到大排列(将字节跳动大街看做一条数轴)
输出描述:
一个数字,表示不同埋伏方案的数量。结果可能溢出,请对 99997867 取模
输入例子1:
4 3 1 2 3 4
输出例子1:
4
例子说明1:
可选方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)
输入例子2:
5 19 1 10 20 30 50
输出例子2:
1
例子说明2:
可选方案 (1, 10, 20)
题解:
双指针,如果当前r-l>=2,并且a[r]-a[l]<=D,则假设最后一个数就是第三个数,那么ans=ans+len(len-1);
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll C(ll n){return (n-1)*n/2;} 5 6 int main() 7 { 8 ll n,d,count=0; 9 cin>>n>>d; 10 vector<ll> v(n); 11 for(int i=0,j=0;i<n;i++) 12 { 13 cin>>v[i]; 14 while(i>=2 && (v[i]-v[j])>d) 15 j++; 16 count+=C(i-j); 17 } 18 cout<<count%99997867<<endl; 19 return 0; 20 }
[编程题]雀魂启动!
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
- 总共有36张牌,每张牌是1~9。每个数字4张牌。
- 你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌
- 14张牌中有2张相同数字的牌,称为雀头。
- 除去上述2张牌,剩下12张牌可以组成4个顺子或刻子。顺子的意思是递增的连续3个数字牌(例如234,567等),刻子的意思是相同数字的3个数字牌(例如111,777)
输入描述:
输入只有一行,包含13个数字,用空格分隔,每个数字在1~9之间,数据保证同种数字最多出现4次。
输出描述:
输出同样是一行,包含1个或以上的数字。代表他再取到哪些牌可以和牌。若满足条件的有多种牌,请按从小到大的顺序输出。若没有满足条件的牌,请输出一个数字0
输入例子1:
1 1 1 2 2 2 5 5 5 6 6 6 9
输出例子1:
9
例子说明1:
可以组成1,2,6,7的4个刻子和9的雀头
输入例子2:
1 1 1 1 2 2 3 3 5 6 7 8 9
输出例子2:
4 7
例子说明2:
用1做雀头,组123,123,567或456,789的四个顺子
输入例子3:
1 1 1 2 2 2 3 3 3 5 7 7 9
输出例子3:
0
例子说明3:
来任何牌都无法和牌
题解:
这题比较复杂,但是仔细分析,我们枚举这9个数字将其加进去,然后去判断是否可以胡牌即可。
在判断胡牌的时候,我们枚举每个数量大于1的牌,让其当雀头,数量大于2的牌当刻子或者顺子,递归判断是否成立。
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 inline bool ishu(vector<int>num) 6 { 7 if(num.empty()) return true; 8 int count0=0; 9 for(int i=0;i<num.size();++i) 10 { 11 if(num[0]==num[i]) count0++; 12 else break; 13 } 14 //雀头 15 if(num.size()%3!=0 && count0>=2) 16 { 17 vector<int> newnum(num.begin()+2,num.end()); 18 if(ishu(newnum)) return true; 19 } 20 //刻子 21 if(count0>=3) 22 { 23 vector<int> newnum(num.begin()+3,num.end()); 24 if(ishu(newnum)) return true; 25 } 26 //顺子 27 if(count(num.begin(),num.end(),num[0]+1)>0 && count(num.begin(),num.end(),num[0]+2)>0) 28 { 29 vector<int> newnum(num.begin()+1,num.end()); 30 newnum.erase(find(newnum.begin(),newnum.end(),num[0]+1)); 31 newnum.erase(find(newnum.begin(),newnum.end(),num[0]+2)); 32 if(ishu(newnum)) return true; 33 } 34 35 return false; 36 } 37 38 inline bool hupai(vector<int> num,int x) 39 { 40 if(count(num.begin(),num.end(),x)==4) 41 return false; 42 num.push_back(x); 43 sort(num.begin(),num.end()); 44 return ishu(num); 45 } 46 47 int main() 48 { 49 vector<int> num,ans; 50 for(int i=0;i<13;++i) 51 { 52 int tmp; 53 scanf("%d",&tmp); 54 num.push_back(tmp); 55 } 56 57 for(int i=1;i<=9;++i) 58 { 59 if(hupai(num,i)) 60 ans.push_back(i); 61 } 62 if(ans.size()==0) puts("0"); 63 else 64 { 65 for(int i=0;i<ans.size();++i) 66 printf("%d%c",ans[i],i==(ans.size()-1)?'\n':' '); 67 } 68 69 return 0; 70 }
[编程题] 特征提取
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
第一行包含一个正整数N,代表测试用例的个数。
每个测试用例的第一行包含一个正整数M,代表视频的帧数。
接下来的M行,每行代表一帧。其中,第一个数字是该帧的特征个数,接下来的数字是在特征的取值;比如样例输入第三行里,2代表该帧有两个猫咪特征,<1,1>和<2,2>
所有用例的输入特征总数和<100000
N满足1≤N≤100000,M满足1≤M≤10000,一帧的特征个数满足 ≤ 10000。
特征取值均为非负整数。
输出描述:
对每一个测试用例,输出特征运动的长度作为一行
输入例子1:
1 8 2 1 1 2 2 2 1 1 1 4 2 1 1 2 2 2 2 2 1 4 0 0 1 1 1 1 1 1
输出例子1:
3
例子说明1:
特征<1,1>在连续的帧中连续出现3次,相比其他特征连续出现的次数大,所以输出3
题解:使用pair和map,记录每个数对的上一个位置所在,和连续存在的长度,取最大值即可。
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef pair<int,int> pii; 4 int n,m,k,ans; 5 6 int main() 7 { 8 scanf("%d",&n); 9 while(n--) 10 { 11 map<pii,int> preindex,cnt; 12 scanf("%d",&m); ans=0; 13 for(int i=1;i<=m;++i) 14 { 15 scanf("%d",&k); 16 for(int j=1;j<=k;++j) 17 { 18 pii pi; 19 scanf("%d%d",&pi.first,&pi.second); 20 if(preindex[pi]<i-1) cnt[pi]=1; 21 else cnt[pi]++; 22 preindex[pi]=i; 23 ans=max(ans,cnt[pi]); 24 } 25 } 26 printf("%d\n",ans); 27 } 28 29 return 0; 30 }
[编程题]毕业旅行问题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
城市个数n(1<n≤20,包括北京)
城市间的车票价钱 n行n列的矩阵 m[n][n]
输出描述:
最小车费花销 s
输入例子1:
4 0 2 6 5 2 0 4 4 6 4 0 2 5 4 2 0
输出例子1:
13
例子说明1:
共 4 个城市,城市 1 和城市 1 的车费为0,城市 1 和城市 2 之间的车费为 2,城市 1 和城市 3 之间的车费为 6,城市 1 和城市 4 之间的车费为 5,依次类推。假设任意两个城市之间均有单程票可购买,且票价在1000元以内,无需考虑极端情况。
题解:TSP问题。状态压缩DP。
dp[i][j];表示经过i表示的城市并且以j城市结尾所需的最小费用。然后去判断。
参考代码:

1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int getAns(vector<vector<int>> &nums) 5 { 6 const int MAX=0x0fffffff; 7 int n=nums.size(); 8 int stateNum=1<<n; 9 // dp[i][j]表示经过了i中的城市,并且以j结尾的路径长度 10 vector<vector<int> > dp(stateNum,vector<int>(n,MAX)); 11 dp[1][0]=0; 12 for(int i=1;i<stateNum;i++) 13 { 14 for(int j=0;j<n;j++) 15 { 16 if(dp[i][j] != MAX) 17 { //如果已经访问过 18 for(int k=0;k<n;k++) 19 { 20 if( (i & (1 << k) ) == 0) 21 dp[i | (1 << k)][k] = min(dp[i | (1 << k)][k],dp[i][j] + nums[j][k]); 22 } 23 } 24 } 25 } 26 int res = MAX; 27 for(int i=1;i<n;i++) 28 res = min(res,dp[stateNum-1][i] + nums[i][0]); 29 return res; 30 } 31 int main() 32 { 33 int n; 34 while(cin>>n) 35 { 36 vector<vector<int>> edges(n,vector<int>(n,0)); 37 int x; 38 for(int i=0; i<n; i++) 39 for(int j=0; j<n; j++) 40 cin>>edges[i][j]; 41 42 cout<<getAns(edges)<<endl; 43 } 44 return 0; 45 }
[编程题]找零
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
一行,包含一个数N。
输出描述:
一行,包含一个数,表示最少收到的硬币数。
输入例子1:
200
输出例子1:
17
例子说明1:
花200,需要找零824块,找12个64元硬币,3个16元硬币,2个4元硬币即可。
题解:
参考代码:

1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int num; 6 while(cin>>num) 7 { 8 int cash=1024-num; 9 int num_64=cash/64; 10 int num_16=cash%64/16; 11 int num_4=cash%64%16/4; 12 int num_1=cash%64%16%4; 13 cout<<num_64+num_16+num_4+num_1<<endl; 14 } 15 return 0; 16 }
[编程题]机器人跳跃问题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
第一行输入,表示一共有 N 组数据.
第二个是 N 个空格分隔的整数,H1, H2, H3, ..., Hn 代表建筑物的高度
输出描述:
输出一个单独的数表示完成游戏所需的最少单位的初始能量
输入例子1:
5 3 4 3 2 4
输出例子1:
4
输入例子2:
3 4 4 4
输出例子2:
4
输入例子3:
3 1 6 4
输出例子3:
3
题解:倒着推。由上一个到下一个E变为2E-H,加上下一个的高度之后,变为上一个的两倍。
参考代码:

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e5+10; 5 int n,a[maxn],ans=0; 6 7 int main() 8 { 9 scanf("%d",&n); 10 for(int i=1;i<=n;++i) 11 scanf("%d",a+i); 12 13 for(int i=n;i>0;--i) 14 ans=(a[i]+ans+1)/2; 15 16 printf("%d\n",ans); 17 18 return 0; 19 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地