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%内容,订阅专栏后可继续查看/也可单篇购买

2021名企校招笔试真题-技术 文章被收录于专栏

&lt;p&gt; 本专刊由牛客官方团队打造,主要讲解名企校招技术岗位的笔试题。 内容中包含多个名企的笔试真题,附有题目思路及参考代码 本专刊购买后即可解锁所有章节,故不可以退换哦~ &lt;

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务