vivo 2020秋招笔试真题
vivo 2020秋招笔试真题
1、拆礼盒
【题目描述】小v所在的公司即将举行年会,年会方案设计过程中必不可少的一项就是抽奖活动。小v在本次活动中被委以重任,负责抽奖活动的策划;为了让中奖的礼物更加精美且富有神秘感,打算采用礼品盒来包装奖品,此时小v发挥了自己的创意想捉弄一下获奖的同事,便采取了多重包装来包装奖品。
现给出一个字符串,并假定用一对圆括号( )表示一个礼品盒,0表示奖品,你能据此帮获奖者算出最少要拆多少个礼品盒才能拿到奖品吗?
输入描述
一行字符串,仅有'('、')'、'0' 组成,其中一对'(' ')'表示一个礼品盒,‘0’表示奖品;输入的字符串一定是有效的,即'(' ')'一定是成对出现的。
输出描述
输出结果为一个数字,表示小v要拆的最少礼品盒数量
示例1
输入
(()(()((()(0)))))
输出
5
示例2
输入
(((0)))
输出
3
【解题思路】
记录左括号的数量,遇到右括号进行匹配即可。
【参考代码】
int solution(string str) { int L = 0; int sum = 0; for (int i = 0; i < str.size(); i++) { if (str[i] == '(') L++; else if (str[i] == ')') L--; else if (str[i] == '0') { sum = L; break; } } // TODO Write your code here return sum; }
2、报数
【题目描述】今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
输入描述
输入2个正整数,空格分隔,第一个代表人数N,第二个代表M:
输出描述
输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序:
示例1
输入
6 3
输出
3 6 4 2 5 1
说明
6个人排成一排,原始位置编号即为1-6。最终输出3 6 4 2 5 1表示的是原来编号为3的第一个出列,编号为1的最后一个出列。
【解题思路】
经典约瑟夫问题。
【参考代码】
void solution(int N, int M) { if (N < 1 || M < 1) return; vector<int> v(N); for (int i = 0; i < N; i++) v[i] = i + 1; int i = 0; while (v.size() > 0) { i += M - 1; if (i >= v.size()) i = i % v.size(); cout << v[i] << " "; v.erase(i + v.begin()); } cout << endl; }
3、跳盒子
【题目描述】小v在公司负责游戏运营,今天收到一款申请新上架的游戏“跳一跳”,为了确保提供给广大玩家朋友们的游戏都是高品质的,按照运营流程小v必须对新游戏进行全方位了解体验和评估。这款游戏的规则如下:
有n个盒子排成了一行,每个盒子上面有一个数字a[i],表示在该盒子上的人最多能向右移动a[i]个盒子(比如当前所在盒子上的数字是3,则表示可以一次向右前进1个盒子,2个盒子或者3个盒子)。
现在小v从左边第一个盒子上开始体验游戏,请问最少需要移动几次能到最后一个盒子上?
输入描述
输入:2 2 3 0 4
表示现在有5个盒子,上面的数字分别是2, 2, 3, 0, 4。
输出描述
输出:2
小v有两种跳法:
跳法1:盒子1 -> 盒子2 -> 盒子3 -> 盒子5,共3下
跳法2:盒子1 -> 盒子3 -> 盒子5,共2下
跳法2的步骤数最少,所以输出最少步数:2。
备注
如果没有盒子或跳不到最后一个盒子上,则返回-1;如果已经在最后盒子上,则直接返回0。
示例1
输入
2 2 3 0 4
输出
2
【解题思路】
i+a[i]即i位置最多可跳至i+a[i]位置,最后一个位置为N-1,假如我们想跳至位置j,我们只需在j前面中找出不小于j的数就代表可跳至j,取最前面的那一个不小于j的就可得到最小步数。
【参考代码】
int solution(int a[],
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> 本专刊由牛客官方团队打造,主要讲解名企校招技术岗位的笔试题。 内容中包含多个名企的笔试真题,附有题目思路及参考代码 本专刊购买后即可解锁所有章节,故不可以退换哦~ <