2019字节跳动研发笔试题题解(C++)
第一题:
用STL的string的 find 和 erase:
首先,通过find找到需要删除的字符/字符串的位置:
string str;
string target;
int pos = str.find(target);
然后通过erase进行删除:
n = target.size();
str = str.erase(pos,n);
第二题:
https://www.nowcoder.com/questionTerminal/c0803540c94848baac03096745b55b9b?toCommentId=3154435
#include<iostream>
using namespace std;int main(){long long N,D;while(cin>>N>>D){long long res=0;long long *a=new long long[N];for(long long i=0,j=0;i<N;i++){cin>>a[i];while (i >= 2 && (a[i] - a[j]) > D) { j++;}res +=(i - j-1) * (i - j) / 2;}cout<<res%99997867;return 0;}
}
我当时做的时候纠结的就是如何才能做到不重不漏啊(梦回高中了属于是),我的算法本来想用双循环找一串符合条件的数来Cn3的,感觉重合了,一时间想不出怎么搞就跳了,这里的话相当于锁定了一个最大数,然后让其他数来进行组合,这样的话就可以实现
3.17:我是个sb,只要最大值和最小值不就得了,排列组合nm呢
这里好像是有坑的,int 还会超限。。long都不行,必须得long long。。
第三题:
雀魂启动!
我写这题的时候一直在想如何判断胡,感觉好难顶,常用函数调用还不是太熟练,而且用的是dfs,不禁令人感叹。
核心代码:
bool isHu(vector<int> nums) {//其实是一个dfs的过程if (nums.empty()) return true;//递归出口int cnt = count(nums.begin(), nums.begin() + 4, nums[0]);//记录与首元素相同的数字的个数if (nums.size() % 3 != 0 && cnt >= 2) {//取雀头(只会取一次)if (isHu(vector<int>(nums.begin() + 2, nums.end()))) return true;}if (cnt >= 3) {//取刻子(三个相同的数字)if (isHu(vector<int>(nums.begin() + 3, nums.end()))) return true;}if (count(nums.begin(), nums.end(), nums[0] + 1) > 0 && count(nums.begin(), nums.end(), nums[0] + 2) > 0) {//取顺子int val = nums[0];nums.erase(nums.begin());//去掉一个首元素(顺子的第一个)nums.erase(find(nums.begin(), nums.end(), val + 1));//去掉一个首元素+1(顺子的第二个)nums.erase(find(nums.begin(), nums.end(), val + 2));//去掉一个首元素+2(顺子的第三个)if (isHu(nums)) return true;}return false;
}
for (int i = 1; i <= 9; ++i) {//遍历下一张可能的牌if (count(nums.begin(), nums.end(), i) == 4) continue;//最多就4张,真的不能再多了nums.insert(lower_bound(nums.begin(), nums.end(), i), i);//插入i,函数lower_bound()在first和last中的前闭后开区间,进行二分查找。返回从first开始的第一个大于或等于val的元素的地址。如果所有元素都小于val,则返回last的地址。注意:数组必须是排好序的数组。if (isHu(nums)) res.push_back(i); //判断是否oknums.erase(lower_bound(nums.begin(), nums.end(), i));//恢复原始nums数组}
第四题:
特征提取
https://www.nowcoder.com/questionTerminal/5afcf93c419a4aa793e9b325d01957e2?answerType=1&f=discussion
核心知识:map,pair
用双字典轮滚解决
用一个老字典和一个新字典,最后的时候把老的换成新的,新的变空等待输入,这种方法适用于过去数据要传递到未来的情况。(连续问题)
#include<bits/stdc++.h>using namespace std;
int main(){int N,m;cin>>N;while(N--){cin>>m;int f,x,y;map<pair<int,int>,int> pre;//历史帧数map<pair<int,int>,int> now;//现在帧数int max_ = 0;for(int i =0; i< m;i++){cin>>f;for(int j =0; j< f;j++){cin>>x>>y;if(pre.count({x,y})){now[{x,y}] = pre[{x,y}] + 1;//又出现了一次,就是老的加1}else{now[{x,y}] = 1;//从来没有出现过}if(now[{x,y}]>max_){//时时更新任何一个连续帧max_ = now[{x,y}];}}//如果这帧为0,那么就不会保留任何历史信息了,因为now在这轮没有任何内容。pre.clear();//清空历史,把now变为历史pre.swap(now);//now 置空,同时,now变成上一个,这样的话连续问题就可以解决}cout<<max_<<endl;}return 0;
}
// 查询关键字为key的元素的个数,在map里结果非0即1
size_t count( const Key& key ) const; //
第五题:
https://www.nowcoder.com/questionTerminal/3d1adf0f16474c90b27a9954b71d125d?answerType=1&f=discussion
第一篇题解,很详细。
他的代码没有注释,所以写一下基于注释的代码
// 代码
#include<bits/stdc++.h>
using namespace std;
int main() {int n;cin >> n;vector<vector<int> > cost(n,vector<int>(n));//初始化for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin >> cost[i][j];//输入int all = 1<<(n-1);//位运算,取2个n-1次方vector<vector<int> > dp(n,vector<int>(all));//初始化for(int i=0;i<n;i++)dp[i][0] = cost[i][0];//因为题目要求返回原点for(int j=1;j<all;j++){for(int i=0;i<n;i++){dp[i][j] = INT_MAX;//取最大值防止。。if(((j>>(i-1))&1)==0){for(int k=1;k<n;k++){if(((j>>(k-1))&1)==1){dp[i][j] = min(dp[i][j],cost[i][k]+dp[k][j^(1<<(k-1))]);}//带着循环看。就是取这几个的最小值。}}}}cout << dp[0][all-1] << endl;
}
第六题:
略。
第七题:
机器人跳跃问题
数学归纳法了属于是
方法一:
归纳:
#include<iostream>
#include<vector>#include<cmath>using namespace std;int main(){int N;int ans = 0;cin >> N;vector<int>D(N,0);for(int i = 0;i<N;i++)cin >>D[i];for(auto i in D){ans+=D[i]/pow(2,i);}cout<<ans<<endl;return 0;}
方法二,逆着解。
#include<iostream>
#include<vector>#include<cmath>using namespace std;int main(){int N;int ans = 0;cin >> N;vector<int>D(N,0);for(int i = 0;i<N;i++)cin >>D[i];for(int j=N-1;j>=0;j--){ans = ceil((D[j]+ans)/2.0);//注意c++中除法整数/整数为0,ceil向上取整要整数/float类型}cout<<ans<<endl;return 0;}
差不多就这样吧,焯!
2019字节跳动研发笔试题题解(C++)相关推荐
- 2021.4.11 字节跳动实习笔试题---情报解密
2021.4.11 字节跳动实习笔试题-情报解密 题目内容 题目内容: 给你一个字符串,该字符串中有数字,字母(字母只有大写字母)以及一些其他的字符(例如:%,.等),如果首字母为字母或者数字的话,就 ...
- 字节跳动校招笔试题汇总
1. 世界杯开幕式 思路:跟leetcode上求岛屿数量问题很像,使用DFS,这里要注意的是搜索方向从4个变成了8个,并且要输出最大区域里的人数. # coding:utf-8 M, N = list ...
- 字节跳动软件测试笔试题面试题-它终于来了
岗位是深圳这边的IES系统的测试工程师... 第一次得到大厂的面试,心情有点小激动.面试全程线上,听面试官说她是一面.面试官是女士,带个眼镜的.黄头发. 1.自我介绍 2.我看你最近的工作才一年,换工 ...
- 字节跳动历届笔试题(3)
题目描述 [编码题]字符串S由小写字母构成,长度为n.定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换.询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同? 输入描述: ...
- 这道字节跳动的面试题,据说多数人都不会
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 前 ...
- 字节跳动2020秋招研发笔试题
字节跳动秋招研发笔试题 最近在忙考研,高数复习完了,看了下数据结构和算法,然后对人生比较迷茫. 该不该放弃考研,又怕考不上面临找工作的问题,索性看了几家科技巨头的秋招试题,贴下来和大家分享下 基本都是 ...
- 小鹏汽车2019春招自动驾驶中心研发笔试题(部分题解)
小鹏汽车2019春招自动驾驶中心研发笔试题(部分题解) 链接:https://www.nowcoder.com/questionTerminal/ebd81731da404c0f9505c8a933c ...
- 蘑菇街2015校招 Java研发笔试题 详解,2015java
蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A. 父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B. 改变 ...
- 2021多益网络春季校园招聘游戏研发笔试题(回忆版)
2021多益网络春季校园招聘游戏研发笔试题 笔试题分为15道单选题,填空题,简答题,1道编程题 1单选题 就几乎是数据结构,计算机网络的题目,期末考试那种程度的选择题 2填空题 (1)求时间复杂度 ( ...
最新文章
- IntelliJ IDEA 最常用配置,应用、永久激活
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
- centos6 mysql5.7.16_centos 6.5装mysql5.7
- 普通话计算机考试相关信息,普通话考试常见问题有哪些
- 【AI产品】产品小姐姐分析抖音背后的计算机视觉技术
- 2018常见的java面试题_2018新版Java常见面试题
- Mono新突破:CentOS 7.2下安装Mono 5.0
- MariaDB 条件语句WHERE
- 静态网页托管_求职季,教你制作一份精美的在线网页简历,程序员必看!!
- java6打印机不能用_高分求解:java中调用的打印机在什么情况下不可用?
- Django复习:模型与管理网站
- CButton相关函数介绍
- 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第一节课笔记
- 线程池提交任务时submit()和execute()的区别
- Leetcode #317:离建筑物最近的距离
- netcore读取json文件_.Net Core读取Json配置文件的实现示例
- Win10怎么卸载.net framework?
- 电力安全教育之临时用电
- LaTeX中文生僻字显示
- java微博源码_基于jsp的微博-JavaEE实现微博 - java项目源码