字节跳动2019春招实习岗笔试编程题

字节跳动2019实习岗笔试

    • 1、最少找几个硬币 1024-N 硬币值:1 4 16 64
    • 2、从左到右,删除连续重复元素 ,例如:删除AAA的A , 删除AABB的B
    • 3 、环形 1~n个人,有分数score , 给队友应奖励prize ,每个人若比相邻的score高,其prize应该比相邻prize高,输出最少的prize
    • 4 、N条绳子切成M份,求每份最长len

记录一下,做题的时候有点思路也写不出来,只能等结束后再花点时间写。实习岗的题比校招的简单,写代码的能力亟待加强。总结一下,第一题算术运算,第二题字符串的删除操作,第三题可用优先队列(可以写成priority_queue或set的,不知大佬怎么解决),第四题二分法(注意边界情况)。

1、最少找几个硬币 1024-N 硬币值:1 4 16 64

//1、最少找几个硬币 1024-N 硬币值:1 4 16 64
#include<iostream>
using namespace std;

int main(){
	int N;
	cin>>N;
	int ren = 1024-N;
	int res_64 = ren/64;
	int res_16 = ren%64/16;
	int res_4 =ren%16/4;
	int res_1 = ren%4;
	cout<<res_1+res_4+res_16+res_64<<'\n';
	return 0;
}

2、从左到右,删除连续重复元素 ,例如:删除AAA的A , 删除AABB的B

//2、从左到右,删除连续重复元素 ,例如:删除AAA的A , 删除AABB的B 

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
	int N;
	cin>>N;
	vector<string> vs_input;
	for(int i=0;i<N;i++){
		string test_string;
		cin>>test_string;
		vs_input.push_back(test_string);
	}

	for(int i=0;i<N;i++){
	string test_string = vs_input[i];
	if(test_string.size()>=3){
	for(string::iterator it=test_string.begin()+2;it!=test_string.end();){
		
		if(*it==*(it-1) && *it==*(it-2)){
			it = test_string.erase(it);
		}
		else if(it>test_string.begin()+2){
			if(*it==*(it-1) && *(it-2)==*(it-3))
				it = test_string.erase(it);
			else
				++it;
		}
		else
			++it;
	}
	}
	cout<<test_string<<endl;
	}
	return 0;
}

3 、环形 1~n个人,有分数score , 给队友应奖励prize ,每个人若比相邻的score高,其prize应该比相邻prize高,输出最少的prize

//3 、环形 1~n个人,有分数score , 给队友应奖励prize ,每个人若比相邻的score高,其prize应该比相邻prize高,输出最少的prize

#include<iostream>
#include<queue>
using namespace std;

struct ele{
	int score;
	int pos;
	ele(int p,int s):pos(p),score(s){}
};
struct mycmp{

	bool operator()(ele &a,ele &b){
		return a.score>b.score;
	}
};

int main(){
	int n;
	cin>>n;
	vector<int> res(n,0);
	for(int ni=0;ni<n;ni++){
		int m;
		cin>>m;
		vector<int> score(m);
		for(int i=0;i<m;i++)
			cin>>score[i];
		priority_queue<ele,vector<ele>,mycmp> pq;
		for(int i=0;i<m;i++)
			pq.push(ele(i,score[i]));
		vector<int> prize(m,0);
		while(!pq.empty()){
			ele eletmp = pq.top();
			pq.pop();
			int left=eletmp.pos-1,right=eletmp.pos+1;
			if(eletmp.pos==0){
				left=m-1;
			}else if(eletmp.pos==m-1){
				right=0;
			}
			if(score[left]<score[eletmp.pos]){
				prize[eletmp.pos]=prize[left]+1;
			}
			if(score[right]<score[eletmp.pos]){
				prize[eletmp.pos]=max(prize[eletmp.pos],prize[right]+1);
			}
			if(prize[eletmp.pos]==0)
				prize[eletmp.pos]=1;
		}
		for(int i=0;i<m;i++)
			res[ni] += prize[i];
	}
	for(int ni=0;ni<n;ni++)
			cout<<res[ni]<<'\n';

	return 0;
}

4 、N条绳子切成M份,求每份最长len

//4、N条绳子切成M份,求每份最长len

#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
bool check(vector<long long> rope,int M,long long len){
	//判断长度len能否切成M份
	int N=rope.size();
	int sum=0;
	for(int i=0;i<N;i++){
		sum += rope[i]/len;
	}
	if(sum>=M)return true;
	return false;
}
int main(){
	int N,M;
	cin>>N>>M;
	vector<long long> rope;
	for(int i=0;i<N;i++){
		long long tmp;
		cin>>tmp;
		rope.push_back(tmp*100);
	}
	//二分法查找最长
	long long Right=0;
	long long Left=0;
	for(int i=0;i<N;i++){
		Right = max(Right,rope[i]);
	}
	
	while(Left<=Right){
		long long Mid = (Left+Right)/2;
		if(check(rope,M,Mid))
			Left = Mid+1;
		else
			Right = Mid-1;
	}
	cout<<fixed<< setprecision(2) << 1.0*(double)Right/100.0 <<endl;
	return 0;
}

你可能感兴趣的:(笔试编程题)