字节跳动后端工程师实习生笔试题-c++

字节跳动后端工程师实习生笔试题链接

笔试题

  • 1. 最大映射
  • 2. 木棒拼图
  • 3. 魔法权值
  • 4. 或与加

1. 最大映射

有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

输入描述:

每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母

输出描述:

输出一个数,表示最大和是多少。

示例1
输入例子:

2
ABC
BCA

输出例子:

1875

有时间找了一份笔试题做做,结果还是一言难尽,这些编程题的题目都需要深刻的去理解,不然忽略一小段话,一个小细节,都会让自己在电脑面前怀疑半天,刷了一些算法题,能力提升没提升不知道,反正心里承受能力是一定会提升的,行了,下面看看这份笔试题。

  1. 题目解析:这道题的输入是n条字符串,字符串为A-J,映射为0-9,不同字符映射为不同的数字,如示例1:可以将ABC映射为987,则BCA就为879,和为1866;或者将ABC映射为897,则BCA就为978,和为1875;或者将ABC映射为789,则BCA就为897,和为1696,最大值为1875,所以输出最大值即可。还有最重要的一个条件:且它们的字符串不能有前导零, 意思就是字符串的首字母不能赋值为0,输入描述中也说过,至少存在一个字符不是任何字符串的首字母,题目大致意思也就这些。

  2. 解题思路:我当时看完题目一想,好吧不会,我承认我是菜狗。不会怎么办呢?百度呗,看了某位佬的思路和解法,这位佬将这道题也只写了一半,没有将字符串不能有前导零考虑在内,但有了思路,接下来就自己思考思考吧,不然就会变得越来越菜。大致思路,要求得最大和与字符出现的位置和次数有关,对于某一字符串来说,越排在前面的字符,它所占的权值就越大,所以可以对字符串的位置设置权值,如1,10,100,1000…等,权重有那么多种,为什么要设置为1,10,100,1000…这种,这种设置对于后续来说方便计算,结合下图来看:由下图知,最后我们只需将权值与分配的数字相乘就可以得到最大和。
    在这里插入图片描述

  3. 代码如下:

#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;int main() 
{int n;cin >> n;string str;long long MAX = 0, A[10] = {0};while (n--) {cin >> str;for (int i = str.length() - 1; i >= 0; i--) {A[str[i] - 'A'] += pow(10, str.length() - i - 1);}}sort(A, A + 10);for (int i = 0; i <= 9; i++) {MAX += (A[i] * i);}cout << MAX;
}

上述代码没有考虑到它们的字符串不能有前导零这一条件,所以20个样例过了17个,然后思考怎么设置零不能出现在最前面的位置,试着思考思考。用set?map?unordered_map?用这类容器将出现的首字符记录下来,解决应该可以解决,我没想到,因为还需要对权重进行排序,而上述容器是不能排序的,又或者说他们是已经排好序的,所以我直接再用一个数组hash来记录首字母的出现情况,给权重排序时顺便给hash也排序,因为需要对他们一一对应,完整代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <algorithm>
#include <set>
using namespace std;int main()
{long long ret = 0;int n = 0;cin >> n;string str;long long weight[10] = { 0 }; // weight用来记录权重int ch[10] = { 0 }, hash[10] = { 0 }; // hash用来记录哪个字母是首字母,ch用来记录数字分配给哪个字母,hash和ch搭配起来使用for (int i = 0; i < 10; ++i)ch[i] = i; // 首先就将0给A,1给B...i表示哪个数字,ch[i]表示哪个字母for (int i = 0; i < n; ++i){cin >> str;int size = str.size();for (int i = size - 1; i >= 0; --i){weight[str[i] - 'A'] += pow(10, size - i - 1);if (i == 0)hash[str[i] - 'A'] = 1; // 记录哪个字母是在首位出现的}}// 对权值和对应的字母排序for (int i = 0; i < 10; ++i){for (int j = i + 1; j < 10; ++j){if (weight[i] > weight[j]){swap(weight[i], weight[j]);swap(ch[i], ch[j]);}}}int i = 1;while (hash[ch[0]]) // hash[ch[0]]表示分配0的字母是否在字符串的首位出现{swap(weight[i], weight[0]);swap(ch[i], ch[0]);++i;}for (int i = 0; i < 10; ++i)ret += i * weight[i];cout << ret;return 0;
}

当然还有别的解法,欢迎各位佬分享自己的心得,可以互相交流交流。

2. 木棒拼图

有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 0 的简单多边形且所有木棒都要用上,简单多边形即不会自交的多边形。

初始集合是空的,有两种操作,要么给集合添加一个长度为 L 的木棒,要么删去集合中已经有的某个木棒。每次操作结束后你都需要告知是否能用集合中的这些木棒构成一个简单多边形。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

输入描述:

每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n 表示操作的数量(1 ≤ n ≤ 50000)
,接下来有n行,每行第一个整数为操作类型 i (i ∈ {1,2}),第二个整数为一个长度 L(1 ≤ L
≤1,000,000,000)。如果 i=1 代表在集合内插入一个长度为 L 的木棒,如果 i=2 代表删去在集合内的一根长度为
L的木棒。输入数据保证删除时集合中必定存在长度为 L 的木棒,且任意操作后集合都是非空的。

输出描述:

对于每一次操作结束有一次输出,如果集合内的木棒可以构成简单多边形,输出 “Yes” ,否则输出 “No”。

示例1
输入例子:
5
1 1
1 1
1 1
2 1
1 2
输出例子:
No
No
Yes
No
No

  1. 题目解析:这道题的意思简单明了,有一个集合,这个集合存放正整数,这些正整数代表着多边形的边,可以向这个集合插入或者删除数据,如果这些边可以组成一个多边形,那么输出Yes,否则输出No,每次插入或者删除都需要输出,并且将要删除的边一定是在这个集合中的。
  2. 解题思路:第一次读完题后,完全没思路,这根本和leetcode中的算法题不一样,而且经过第一道题的铺垫,觉得这道题应该很高大上,因为与多边形有关,所以往难的方向猜,一定有某位数学家得出通过边的长短来计算能否构成多边形的公式,脑海中出现一位数学家坐在木质凳子上用一根笔在纸上留下绚丽多彩的一笔,但我肯定不知道这个公式,以为这道题又要寄了;为了这道题不寄,我明白我必须要做出一些行动来尝试尝试,我就往简单的方向猜,提到能否构成多边形,通常做的最多的就是判断三条边能否构成一个三角形,而想要三条边构成一个三角形,那么只需要三条边中的最长边小于另外两边之和,那么判断构成多边形的条件是不是只要最长的边小于其余的边之和即可? 我不知道,所以就尝试尝试呗。分析,其余边之和大于最长边的长度,那么其余边就可以将最长边给围起来,其余边之和比最长边越长,那么所围的面积就越大,其余边之和比最长边小,那么就围不在一起,就不能构成多边形。
    在这里插入图片描述
  3. 代码如下,(代码有些丑陋,有优化的地方欢迎指出。曾经看到一个视频,视频中的人说,代码对于程序员来说是隐私,就好比是我们穿着内裤的颜色,代码写的差我认,但你不能看我“内裤”的颜色)
#include <iostream>
#include <map>
using namespace std;void print(map<long long, int> &hash, long long &sum, int &size)
{if (size < 3)cout << "No" << endl;else if (size >= 3){int max_len = (--hash.end())->first; // 每次取出最长的边int tmp = sum - max_len;if (tmp > max_len)cout << "Yes" << endl;elsecout << "No" << endl;}
}int main()
{int n = 0, size = 0;map<long long, int> hash;long long sum = 0;cin >> n;while (n--){int op = 0, len = 0;cin >> op >> len;if (op == 1){sum += len;hash[len]++;++size;print(hash, sum, size);}else if (op == 2){sum -= len;hash[len]--;if (hash[len] == 0)hash.erase(len);--size;print(hash, sum, size);}}return 0;
}

3. 魔法权值

给出 n 个字符串,对于每个 n 个排列 p,按排列给出的顺序(p[0] , p[1] … p[n-1])依次连接这 n 个字符串都能得到一个长度为这些字符串长度之和的字符串。所以按照这个方法一共可以生成 n! 个字符串。

一个字符串的权值等于把这个字符串循环左移 i 次后得到的字符串仍和原字符串全等的数量,i 的取值为 [1 , 字符串长度]。求这些字符串最后生成的 n! 个字符串中权值为 K 的有多少个。

注:定义把一个串循环左移 1 次等价于把这个串的第一个字符移动到最后一个字符的后面。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

输入描述:

每组测试用例仅包含一组数据,每组数据第一行为两个正整数 n, K , n 的大小不超过 8 , K 不超过 200。接下来有 n行,每行一个长度不超过 20 且仅包含大写字母的字符串。

输出描述:

输出一个整数代表权值为 K 的字符串数量。

示例1
输入例子:
3 2
AB
RAAB
RA
输出例子:3

  1. 题目解析:这道题的意思还是有些难理解的,接下来分析一下,有n个字符串,这n个字符串可以通过不同的排列组成新的字符串,会有n*(n-1)*(n-2)*…*2*1个新的字符串,然后就是这个权值,将组成新的字符串向左移动 i 位 (i 的取值为 [1 , 字符串长度]),如果移动后的字符串等于移动前的字符串,那么这个字符串的权值就+1,输出组合后权值为 K 的新字符串的个数,题目的是、大致意思就这些。
  2. 解题思路:要组成新的字符串,全排列的算法就可以算出(知道的就用递归做,不知道的建议先学习一下全排列);组成新的字符串后,那就开始向左移动,要是单纯的将新的字符串进行移动,那么太耗时了,所以不建议,有另一个思路就是将新的字符串加等于本身的字符串,然后只需要将寻找的区间往后滑动即可,不善于表达,如下图所示:
    在这里插入图片描述
  3. 代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;int n = 0, k = 0, ret = 0;
bool check[10]; // 检查该数据的位置是否使用,true表示使用,false表示未使用
vector<string> combstr; // 组合后的字符串数组
vector<string> path; // 已选取的字符串
// 全排列算法
void dfs(vector<string>& nums)
{if (path.size() == n){string comb;for (auto& str : path)comb += str;combstr.push_back(comb);// 顺便处理combstrcombstr[combstr.size() - 1] += combstr[combstr.size() - 1];return;}for (int i = 0; i < n; ++i){if (!check[i]){check[i] = true;path.push_back(nums[i]); // 选取该位置的字符串dfs(nums);check[i] = false;path.pop_back();}}
}
int main()
{cin >> n >> k;vector<string> nums(n);int len = 0;for (int i = 0; i < n; ++i){cin >> nums[i];len += nums[i].size();}dfs(nums);for (int i = 0; i < combstr.size(); ++i){string prostr = combstr[i].substr(0, len); // 原始字符串int count = 0;for (int j = 1; j <= len; ++j) // 取值为[1, 字符串长度]{string tmp = combstr[i].substr(j, len);if (prostr == tmp)++count;}if (count == k)++ret;}cout << ret << endl;// 检查组合后的字符串是否正确//for (int i = 0; i < combstr.size(); ++i)//	cout << combstr[i] << endl;return 0;
}

4. 或与加

给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。

比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

输入描述:

每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。 满足 0 < x , k ≤ 2,000,000,000。

输出描述:

输出一个数y。

示例1
输入例子:
5 1
输出例子:
2

  1. 题目解析:这道题的题意清晰明了,但是做法肯定不是从1开始暴力求解,这样耗时非常高,所以用别的方法解决;题目中出现与或等逻辑算术,那么就要向二进制的方向思考,1 | 0 = 1, 1 | 1 = 1,所以只要找x的二进制为0的位置,在二进制为0的位置加1就不会向前进位,这样x + y = x | y;还有一个问题是找第k个,假设x为10,二进制为1010,我们可以在0的位置插入1,插入1后如:0001,0100,0101这3种,只看x为0的位置,那么上述是0的位置为1,10,11,如果k=1,那么y=0001;如果k=2,那么y=0100;如果k=3,那么y=0101;如果k=4,那么y=10000…所以我们可以将k的二进制位放在x二进制为0的位置上,其余位置附0即可,如下图所示:

在这里插入图片描述
2. 代码如下:

#include <iostream>
#include <vector>
using namespace std;int main()
{long long x = 0, k = 0;cin >> x >> k;vector<int> binary; // 存放k二进制位的数组while (k){binary.push_back(k % 2);k /= 2;}long long tmp = 1;long long y = 0;int count = 0;while (count < binary.size()){while (x % 2){x /= 2;tmp *= 2;}if (binary[count] == 1){y += tmp;}x /= 2;tmp *= 2;++count;}cout << y << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金航标和萨科微总经理宋仕强说,中国还有一个优势就是有全世界最大的半导体消费市场

金航标和萨科微总经理宋仕强说&#xff0c;中国还有一个优势就是有全世界最大的半导体消费市场&#xff0c;有超过1万亿人民币的规模&#xff0c;全球占比34%&#xff0c;领先美国&#xff08;27%&#xff09;&#xff0c;更大幅领先欧洲和日韩&#xff0c;金航标电子是在的中国…

【C语言】字符分类函数与字符转换函数

1. 字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff1a; int islower ( int c ); islow…

【测试开发】自动化测试 selenium 篇

目录 一. 什么是自动化测试 二. selenium 1. selenium的工作原理 2. seleniumJava的环境搭建(Chrome浏览器) 三. selenium中常用的API 1. 定位元素 findElement 1.1 css选择语法 1.2 xpath 2. 操作测试对象 2.1 sendKeys-在对象上模拟按键输入 2.2 click-点击对象…

elasticsearch8.12 分词器安装

分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 分词器下载地址 analysis-ik Releases infinilabs/analysis-ik GitHub 一个简便 安装方式 安装完成之后 会提示重启&#xff0c;重启es即可 ./bin/elasticsearch-pl…

配置LVS NAT模式

配置LVS NAT模式 环境准备 client1&#xff1a;eth0->192.168.88.10&#xff0c;网关192.168.88.5lvs1: eth0 -> 192.168.88.5&#xff1b;eth1->192.168.99.5web1&#xff1a;eth1->192.168.99.100&#xff1b;网关192.168.99.5web2&#xff1a;eth1->192.168…

基于C语言的“贪吃蛇”游戏设计理念

3.功能描述&#xff1a;本游戏主要实现以下几种功能 图1.游戏功能模块 3.1. 贪吃蛇的控制功能&#xff1a;通过各种条件的判断&#xff0c;实现对游戏蛇的左移、右移、下移、上移、自由移动&#xff0c;贪吃蛇的加长功能。 3.2. 游戏显示更新功能&#xff1a;当贪吃蛇左右移动、…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…

算法笔记p154最大公约数和最小公倍数

目录 最大公约数辗转相除法证明例子代码实现 最小公倍数代码实现 最大公约数 正整数a与b的最大公约数是指a与b的所有公约数中最大的那个公约数&#xff0c;一般用gcd(a, b)表示a和b的最大公约数。 辗转相除法 设a、b均为正整数&#xff0c;则gcd(a, b) gcd(b, a % b)。即被…

【C语言_字符函数和字符串函数_复习篇】

目录 一、字符函数 1.1 字符分类函数 1.2 字符转换函数 二、字符串函数 2.1 strlen函数 2.1.1 strlen函数的使用 2.1.2 strlen函数的模拟实现 2.2 strcpy函数 2.2.1 strcpy函数的使用 2.2.2 strcpy函数的模拟实现 2.3 strcat函数 2.3.1 strcat函数的使用 2.3.2 strcat函数的…

hololens2发布unity设置

生成vs工程再向hololens发布时&#xff0c; Architecture选X64或ARM64都可以成功发布

es索引操作命令

索引操作 index 创建索引 put 方法创建索引 使用 put 创建索引时必须指明文档id&#xff0c;否则报错 # PUT 创建命令 # test1 索引名称 # type1 类型名称&#xff0c;默认为_doc&#xff0c;已经被废弃 # 1 文档id PUT /test1/type1/1 {"name":"zhangsan&…

【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 二叉树的前序遍历2. 二叉树的中序遍历3. 二叉树的后序遍历 1. 二叉树的前序遍历 点击查看题目 根…

lv17 安防监控项目实战 3

代码目录 框架 our_storage 编译最终生成的目标文件obj 编译生成中间的.o文件 data_global.c 公共资源定义&#xff08;使用在外extern即可&#xff09;定义了锁定义了条件变量消息队列id、共享内存id、信号量id及key值发送短信、接收短信的号码向消息队列发送消息的函数&am…

华为汽车业务迎关键节点,长安深蓝加入HI模式,车BU预计今年扭亏

‍编辑 |HiEV 一年之前&#xff0c;同样是在电动汽车百人会的论坛上&#xff0c;余承东在外界对于华为和AITO的质疑声中&#xff0c;第一次公开阐释了华为选择走智选车模式的逻辑。 一年之后&#xff0c;伴随问界M7改款、问界M9上市&#xff0c;华为智选车模式的面貌已经发生了…

【Maven篇】解锁 Maven 的智慧:依赖冲突纷争下的版本调停者

缘起 软件开发世界是一个充满无限可能的领域&#xff0c;但同时也伴随着诸多挑战。其中之一&#xff0c;就是依赖冲突的问题。在这篇文章中&#xff0c;我们将揭开 Maven 这位“版本调停者”的神秘面纱&#xff0c;深入探讨如何在版本纠纷的盛宴中解决依赖问题。 Maven&#…

RDP爆破

工具&#xff1a;超级弱口令检查工具 第一步&#xff1a;双击打开工具 第二步&#xff1a;导入账号 第三步&#xff1a;导入密码 第三步&#xff1a;线程 线程默认是50&#xff0c;如果担心影响业务可以修改为5 第四步&#xff1a;填写目标 第五步&#xff1a;选择需要检查的…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

jenkins使用公共库问题

Jenkins解决上编译解决引用问题 本地运行 把公共库创建链接到指定项目目录下即可 mklink /d /j D:\codepath\xxxx\yyyyy\tool_base D:\codepath\tool_base

香港公司变更注册地址所需材料及流程全解析

香港公司变更注册地址&#xff1a;所需材料及流程全解析 各位老板好&#xff0c;我是经典世纪胡云帅&#xff0c;随着业务的拓展和发展&#xff0c;香港公司可能需要变更其注册地址。变更注册地址不仅关系到公司的日常运营&#xff0c;还与公司的法律地位和品牌形象息息相关。本…

cesium HeadingPitchRoll HeadingPitchRange

一、HeadingPitchRoll表示Heading、Pitch、Roll&#xff0c;用于orientation属性上的&#xff0c;比如camera的setView&#xff0c;flyTo var heading Cesium.Math.toRadians(0.0);var pitch Cesium.Math.toRadians(-25.0);var roll Cesium.Math.toRadians(0);viewer.camera…