我是靠谱客的博主 淡淡太阳,最近开发中收集的这篇文章主要介绍2019年字节跳动笔试题解答,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Z国的货币系统包含面值1元、4元、16元、64元共计四种硬币,以及面值1024元的纸币。

现在小Y使用1024元的纸币购买了一件价值为N的商品,请问最少他会收到多少硬币。

输入格式

共一行,包含整数N。

输出格式

共一行,包含一个数,表示最少收到的硬币数。

数据范围

0<N≤10240<N≤1024

输入样例:

200

输出样例:

17

样例解释

花200,需要找零824块,找12个64元硬币,3个16元硬币,2个4元硬币即可。

简单的贪心即可

#include <iostream>

using namespace std;

int main()
{
	int arr[] = { 64,16,4,1 };
	int n, temp, res = 0;
	cin >> n;
	temp = 1024 - n;
	for (int i = 0; i < 4; i++) {
		res += temp / arr[i];
		temp = temp % arr[i];
	}
	cout << res << endl;
}

我叫王大锤,是一家出版社的编辑。

我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。

但是,优秀的人总能在平凡的工作中发现真理。

我发现了一个发现拼写错误的捷径:

1.三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello

2.两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello

3.上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC

我特喵是个天才!

我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。

用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!

......

万万没想到,我被开除了,临走时老板对我说:“做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。”

我现在整个人红红火火恍恍惚惚的......

请听题:请实现大锤的自动校对程序

输入格式

第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。

后面跟随N行,每行为一个待校验的字符串,由大写英文字母和小写英文字母构成。

输出格式

N行,每行包括一个被修复后的字符串。

数据范围

N≤1000N≤1000,
字符串长度≤1000000字符串长度≤1000000

输入样例:

2
helloo
wooooooow

输出样例:

hello
woow

 

 这是一道字符串模拟的题目,不要想着使用正则表达式或者,也不能在原字符串上删除字符串,方法一可以用双指针算法

这里为了方便直接使用原始的char字符串,而不用C++ string

#include <iostream>
#include <string>

using namespace std;

const int N = 1000010;

int main()
{
	int n;
	cin >> n;
	char str[N];
	while (n--) {
		cin >> str;
		int j = 0;
		for (int i = 0; str[i]; i++) {
			str[j++] = str[i];
			if (j >= 3 && str[j - 3] == str[j - 2] && str[j - 2] == str[j - 1])
				j--;
			if (j >= 4 && str[j - 4] == str[j - 3] && str[j - 2] == str[j - 1])
				j--;
		}
		str[j] = '';
		cout << str << endl;
	}
}

方法二是在开一个字符串,做字符串拼接处理,这里用C++ 的标准输入输出,string可能会超时,需要加入加速指令

#include <iostream>
#include <string>

using namespace std;

 
static int n=[](){
 
    std::ios::sync_with_stdio(false);
 
    std::cin.tie(nullptr);
 
    return 0;
 
}();


int main()
{
	int n;
	cin >> n;
	string str;
	while (n--) {
		cin >> str;
		string res = "";
		int j = -1;
		for (int i = 0; str[i]!=''; i++) {
			if (j >= 1 && res[j] == res[j - 1] && res[j-1]== str[i]) {
				continue;
			}
			else if (j >= 2 && res[j - 1] == res[j - 2] && res[j] == str[i]) {
				continue;
			}
			else {
				res += str[i];
				j++;
			}
		}
		//str[j] = '';
		cout << res << endl;
	}
}

有N根绳子,第i根绳子长度为LiLi,现在需要M根等长的绳子,你可以对N根绳子进行任意裁剪(不能拼接),请你帮忙计算出这M根绳子最长的长度是多少。

输入格式

第一行包含2个正整数N、M,表示原始绳子的数量和需求绳子的数量。

第二行包含N个整数,其中第 i 个整数LiLi表示第 i 根绳子的长度。

输出格式

输出一个数字,表示裁剪后最长的长度,保留两位小数。

数据范围

1≤N,M≤1000001≤N,M≤100000,
0<Li<1090<Li<109

输入样例:

3 4
3 5 4

输出样例:

2.50

样例解释

第一根和第三根分别裁剪出一根2.50长度的绳子,第二根剪成2根2.50长度的绳子,刚好4根。

 

这里是浮点数型二分,浮点数二分要特别注意程序的调试

#include <iostream>
#include <algorithm>
const int N = 100010;
const double eps = 0.0001;
using namespace std;

bool check(double Li,int n, int m, int L[]) {
	int count = 0;
	for (int i = 0; i < n; i++) {
		count += int(1.0*L[i]/ Li);
	}
	return count >= m;
}

int main()
{
	int n, m;
	int L[N];
	scanf("%d %d", &n, &m);
	int L_max = 0;
	for (int i = 0; i < n; i++) {
		scanf("%d", &L[i]);
		L_max = max(L_max, L[i]);
	}
	double left = 0, right = 1.0*L_max;
	//cout << left << " " << right << endl;
	while (1) {
		double mid = 1.0*(right + left) / 2;
		//cout << left << " " << mid << " " << right << endl;
		if (abs(right - left) < 0.001)
			break;
		if (check(mid, n, m, L)) {
			left = mid + eps;
		}
		else {
			right = mid - eps;
		}
	}
	printf("%.2lf", left);

}

上面的程序写的不太有经验,事实上,浮点数二分可以这样写

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 100010;

int n, m;
int a[N];
bool check(double mid) {
	int s = 0;
	for (int i = 0; i < n; i++) {
		s += a[i] / mid;
		if (s >= m)
			return true;
	}
	return false;

}

int main()
{
	scanf("%d %d", &n, &m);
	int L_max = 0;
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	double left = 0, right = 1e9;
	while (right-left>1e-4) {
		double mid = (right + left) / 2;
		if (check(mid))
			left = mid;
		else
			right = mid;
	}
	printf("%.2lf", left);

}

有n个人参加编程比赛,比赛结束后每个人都得到一个分数;现在所有人排成一圈(第一个和第n个相邻)领取奖品,要求:

1、如果某个人的分数比左右的人高,那么奖品数量也要比左右的人多;

2、每个人至少得到一个奖品;

问最少应该准备多少个奖品。

输入格式

第一行是整数T,表示测试样例个数。

每个测试样例的第一行是一个整数n,表示参加比赛的人数。

第二行是n个正整数a[i],表示从第1个人到第n个人的分数。

输出格式

对每个测试样例,输出应该准备的最少奖品,每个结果占一行。

数据范围

1≤T≤101≤T≤10,
0<n<1000000<n<100000,
0<a[i]<1000000<a[i]<100000

输入样例:

2
2
1 2
4
1 2 3 3

输出样例:

3
8

 

可以用贪心的思想来解决,先将原数组按分数从小到大排序,同时记录下原来的下标,这一个操作可直接用C++ pair完成,注意在sort中调用pair默认按第一个元素排序。从分数最小的开始,每次考察他左右两个,分数,如果比他小,他的分数就要在左右两个分数的基础上+1,注意这里写法

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 100010;
int n;
int score[N];                      // 得分
int b[N] = { 0 };                   // 糖果数量
pair<int, int> children[N];

int main()
{
	int T;
	cin >> T;
	while (T--) {
		cin >> n;
		// 小朋友按分数从小到大排序
		for (int i = 0; i < n; i++) {
			cin >> score[i];
			children[i] = { score[i],i };
		}
		sort(children, children + n);

		for (int i = 0; i < n; i++) {
			auto iter = children[i];
			int left = (iter.second - 1 + n) % n;       // 左边小朋友的编号
			int right = (iter.second + 1) % n;          // 右边小朋友的编号
			int leftScore = 1, rightScore = 1;
			if (iter.first > score[left])
				leftScore = b[left] + 1;
			if (iter.first > score[right])
				rightScore = b[right] + 1;
			b[iter.second] = max(leftScore, rightScore);
		}

		long long res = 0;
		for (int i = 0; i < n; i++)
			res += b[i];

		cout << res << endl;
	}
}

 

最后

以上就是淡淡太阳为你收集整理的2019年字节跳动笔试题解答的全部内容,希望文章能够帮你解决2019年字节跳动笔试题解答所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部