2020 字节跳动Byte Camp夏令营 笔试题交流

笔试一共150分钟,从9点到11点半,有单选、不定项选择、填空和编程四道。
回忆中。。。
单选飞速过了,所以题目记不清了。多选第一题是从归并排序、冒泡排序、直接选择排序、堆排序、快速排序、希尔排序选出稳定的排序算法;第二题好像是个操作系统多线程的问题,具体记不得了。
填空第一题是有1、2、、、101共101个数,甲乙两个人轮流取9个数,最后剩两个数,问这两数的绝对值之差S是多少(假设甲乙都足够聪明,甲要使S尽可能大,乙要使S尽可能小)  我也不知道乱猜的55。
填空第二题是a+b+c+d=20的正整数解有多少组。我觉得就是19个空插3个隔板的问题,直接C19、3=969了
接下来是编程题:(前三题比较简单都过了,最后一题暴力O(n2)超时过了50%,如果哪个大佬会请留言,感激不尽)

第一题

给定两维数组,数组中为0或1,1为障碍。给定初始坐标(x,y),给目的地坐标(X,Y),每一步可以上下左右移动,求出初始到结束的最短路径。
直接从初始坐标开始广搜即可。
#include<iostream>
#include<queue>
using namespace std;
struct point{
	int x,y,s;
};
int a[105][105],n,m,x1,y1,x2,y2,v[105][105];
queue<point> q;

int main(){
	int t; cin>>t;
	while(t--){
		cin>>m>>n>>y1>>x1>>y2>>x2;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>a[i][j];
				v[i][j]=0;
			}
		}
		while(!q.empty()) q.pop();
		if(x1==x2&&y1==y2){
			cout<<"1"<<endl; continue;
		}
		point p;
		p.x=x1; p.y=y1; p.s=1;
		q.push(p);
		bool flag=false;
		while(!q.empty()){
			p=q.front();
			q.pop();
			if(p.x<0||p.x>=n||p.y<0||p.y>=m) continue;
			if(v[p.x][p.y]||a[p.x][p.y]) continue;
			//cout<<p.x<<" "<<p.y<<endl;
			if(p.x==x2&&p.y==y2){
				flag=true; 
				cout<<p.s<<endl;
				break;
			}
			v[p.x][p.y]=1;
			point p1; p1.x=p.x+1; p1.y=p.y; p1.s=p.s+1; q.push(p1);
			point p2; p2.x=p.x-1; p2.y=p.y; p2.s=p.s+1; q.push(p2);
			point p3; p3.x=p.x; p3.y=p.y+1; p3.s=p.s+1; q.push(p3);
			point p4; p4.x=p.x; p4.y=p.y-1; p4.s=p.s+1; q.push(p4);
		}
		if(!flag) cout<<-1<<endl;
	}
}

第二题

给定n,两个人每次从中减去1到m任意数,有多组数据,问第一个人能赢的次数。
这个题以前看过的话应该很容易想到,就是看n%(m+1)是否等于0,如果等于0第二个人必赢,否则第一个人必赢。
#include<iostream>
using namespace std;
int main(){
	long long t,m,n,ans=0;
	cin>>t;
	while(t--){
		cin>>n>>m;
		if(n%(m+1)!=0) ans++;
	}
	cout<<ans;
}

第三题

第三题就是将json字符串中的注释去掉,注释有//和/*  */两种。
这个题主要就是分情况讨论了,用scan.nextLine()依次读取每一行,然后分情况//和/*以及是否在多行注释之间和*/这几种情况讨论,对应输出即可。最后记得每一行最后要System.out.println("");否则直接报PE。
import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String s;
		boolean flag=false;
		while(scan.hasNext()) {
			s=scan.nextLine();
			if(flag) {
				int index2=s.indexOf("*/");
				if(index2==-1) continue;
				flag=false;
				System.out.print(s.substring(index2+2));
			}
			int index2=s.indexOf("/*");
			if(index2!=-1) {
				System.out.print(s.substring(0,index2));
				flag=true;
				int index3=s.indexOf("*/");
				if(index3!=-1) {
					flag=false;
					System.out.print(s.substring(index3+2));
				}
			}
			else if(!flag) {
				int index=s.indexOf("//");
				if(index!=-1) {
					System.out.print(s.substring(0,index));
				}else {
					System.out.print(s);
				}
			}
            System.out.println("");
		}
	}

}

第四题

给定一个n节点的树,gcd(x,y)表示树的x节点到y节点的一条路径上所有节点的最大公约数,dist(表示路径的长度(节点数)。求gcd(x,y)>1的所有路径中最大的dist(x,y)。就是求一条路径上所有节点的公约数值大于1的最长路径。
我直接从所有结点都作为开始,暴力深搜,过了50%。
#include<iostream>
#include<vector>
using namespace std;

vector<int> e[200005];
int n,a[200005],v[200005],ans=1,k[200005];
int gcd(int x,int y){
	return y==0?x:gcd(y,x%y);
}
void f(int i,int now,int p){
	v[i]=1;
	if(now>ans) ans=now;
	for(int j=0;j<e[i].size();j++){
		if(!v[e[i][j]]&&k[e[i][j]]){
			int pp=gcd(p,gcd(a[i],a[e[i][j]]));
			if(pp>1) f(e[i][j],now+1,pp);
			else f(e[i][j],1,a[e[i][j]]);
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		k[i]=0;
	} 
	for(int i=0;i<n-1;i++){
		int x,y; cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	} 
	for(int i=1;i<=n;i++){
		for(int j=0;j<e[i].size();j++){
			if(gcd(a[i],a[e[i][j]])>1){
				k[i]=1; k[e[i][j]]=1;
				break;
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) v[j]=0;
		if(k[i]&&e[i].size()==1) f(i,1,a[i]);
	}
	if(ans==1) cout<<0;
	else cout<<ans;
}


#笔试题目##笔经#
全部评论
T4 可以用筛法对每个点权分解质因数,然后对每一个质因子,找出能点权被它整除的节点,在原图上连边,然后对得到的子图求一下树的直径? 时间复杂度就是所有数的质因子个数之和,应该是 O(n log m) 级别的,感觉可以过。
2 回复 分享
发布于 2020-07-31 17:31
楼主你好,请问笔试的时候可以先跳到最后的编程题页面吗?
点赞 回复 分享
发布于 2021-05-18 22:24
填空题第一题找到了:甲、乙两人轮流从1,2,3,…,100,101这101个自然数中每次划掉9 个数,经过11次后,还剩下两个数.如果甲第一个划数,请问甲是否有方法使得最后剩下的两个数之差是55?并说明理由. 是不是这个?
点赞 回复 分享
发布于 2020-07-31 12:07
想问一下老哥,编程题可不可以用python的
点赞 回复 分享
发布于 2020-07-28 00:04
第四题可以用lca倍增解决,请问n是多大的
点赞 回复 分享
发布于 2020-07-26 13:52
楼主你好,请问你是什么岗位?开发的话,是Java方向还是C++方向?或者其他语言方向~
点赞 回复 分享
发布于 2020-07-18 16:27

相关推荐

10-02 19:29
已编辑
浙江科技大学 运营
点赞 评论 收藏
分享
emmm别问我为啥上一条帖子隔了两个月我才开始投简历和拿offer,因为我懒😰简单流程如下:周一凌晨改好的简历,然后到处乱投简历;周二接到了三维家的一面通知,临时抱佛脚的背了一些八股;周三上午一面下午通知第二天hr面;周四上午hr面下午拿offer,遂收手支线:在BOSS上顺手投了几个大厂,投字节的时候不小心投城客户端了,结果过了一天HR突然把我简历要走了,还问我能不能整客户端,我直接一口答应(脏面评警告😢)结果在周三下午的时候给我打电话,说前端有空缺实习岗,问我有没有兴趣,然后就跟我约了周四下午一面😰我都没咋准备啊,咩都不会啊😭结果周四下午面完,晚上打电话通知过一面了,赶紧把二面约在下周一下午,留点缓冲时间。逆大天了,我一半的问题都不会,他居然给我过了?运气未免有点好了😥现在正在恶补计网、网安、性能优化的东西(这三大板块我是几乎一点不会,一面几乎一点答不出来,加上我又没怎么背八股,这块被干烂了😵)心得体会与经验:1.&nbsp;我giao怎么这么快就结束了,我还以为要找好久😨2.&nbsp;大厂的面试问题真的和中厂小厂很大不同,比如在三维家我能自己吹水到vue的数据劫持、Proxy代理响应式之类的他们就觉得很不错了,但是在字节你但凡敢提到一下就会追问你细节了,一追问马脚就全漏出来了3.&nbsp;有信心真的很重要,我感觉我能拿中厂offer最重要的就是吹水吹出自信来了,以至于三维家面试反问面试官有哪里还需要改进的时候,他就说很不错了解的很多😦4.&nbsp;理解很重要,我从头到尾真没背过很多八股,不过有一些知识确实是敲过代码验证过,所以面试的时候能吹水吹得出来😇想了解面经啥的可以直接评论区问我,但我可能也说不全,因为我没有记录,而且今天摆了一天感觉记忆快清空了😵下面是故事时间:我暑假刚开始的时候才开始准备八股,印象很深那个时候连什么原型、事件循环、闭包这些名词都没听过,资料也不知道怎么找,就一直零零散散的准备,感觉也只有js稍微背了一下八股,其他很多时候都是靠完全理解和手写熟悉一些机制的,但这样做效率很低,反正准备了一个多星期半个月就开摆了😭结果一摆就摆到了开学,笔记是乱七八糟的,八股是忘光光的,简历是一直没改的,实习也是一直没投过的。直到上周日晚上偶然和师兄聊天,他突然问我“你怎么还不找实习”,那天晚上才幡然醒悟,是时候做点事情了😡然后就按照上面描述的来走了。其实我感觉我从头到尾都没背特别多八股,也没怎么找刷题资料啥的,早期就是翻尚硅谷或者黑马的入门视频从头学起,中期用面试鸭看了一点点题,主要是在学js机制和敲js代码,后期才发现了w3c的面经网站,然后在那里看着学(那个时候已经懒得敲了,因为有些问题与代码感觉不像是给找实习的看的,忒细了点😂)接下来继续准备字节二面吧,虽然几乎没啥可能可以通过,但是万一有奇迹呢?😍😍😍也祝大家能够早日拿到心仪的offer
我的offer呢😡:我已经预见10天后你会发,节孝子启动了
投递三维家等公司10个岗位
点赞 评论 收藏
分享
11-13 11:25
吉林大学 Java
点赞 评论 收藏
分享
评论
14
34
分享

创作者周榜

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