【vivo2019年】算法岗笔试题

题目描述:

小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--盒子4--盒子5,共3下

跳法2:盒子1--盒子3--盒子5,共2下

跳法2的步骤数量最少,所以输出最少步数:2。

输入:

2 2 3 0 4

输出:

2

核心代码:
 

int jump(int a[], int n) {
    int steps = 0;
    int start = 0;
    int end = 0;
    while(end < n - 1)
    {
        int max_pos = 0;
        for(int i = start; i <= end; ++i)
            max_pos = max(max_pos, i + a[i]);
        start = end + 1;
        end = max_pos;
        ++steps;
    }
    return steps;
}

题目描述:

今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N (N<100000) 个人排成一排,从第1个人开始报数: 如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。

输入描述:

输入2个正整数,空格分隔,第一个代表人数N,第二个代表M

输出描述:

输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序

输入:

6 3

输出:

3 6 4 2 5 1

这道题目就是简单的约瑟夫环

核心代码:

void loop(int n,int M)
{
    int a[n],m=0,number=0;
    int i,j;
    for(j=0;j0)
        {
            m++;
            if(m==M)
            {
                if(d >= 1)
                    printf(" %d",a[i]);
                else
                    printf("%d", a[i]);
                d++;
                a[i]=0;
                m=0;
                number++;
                if(number==n)
                {
                    break;
                }
                
            }
        }
        if(i==(n-1))
        {
            i=-1;
        }
    }
    cout << endl;
}

题目描述:

小v最近在玩一款挖矿的游戏, 该游戏介绍如下:
1、每次可以挖到多个矿石,每个矿石的重量都不一样,挖矿结束后需要通过一款平衡矿车运送下山; 
2、平衡矿车有左右2个车厢,中间只有1个车轮沿着导轨滑到山下,且矿车只有在2个车厢重量完全相等且矿石数量相差不超过1个的情况下才能成功运送矿石,否则在转弯时可能出现侧翻。

假设小v挖到了n (n<100) 个矿石,每个矿石重量不超过100,为了确保一次性将n个矿石都运送出去,一旦矿车的车厢重量不一样就需要购买配重砝码。请问小v每次最少需要购买多少重量的砝码呢? (假设车厢足够放下这些矿石和砝码,砝码重量任选)

输入描述:

输入n个正整数表示每个矿石的重量

输出描述:

输出一个正整数表示最少需要购买的砝码重量

输入:

3 7 4 11 8 10

输出:

1

说明:

小v可以将重量3,7和11的矿石放到左车厢,重量4,8和10放到右车厢,然后购买重量为1的砝码放到左车厢。

题解:其实可以转换为求n个数分成两半,使绝对值差就小,我们可以转化为01背包去做。

这个题目当时只过了差不多百分之八十,一直没有搞懂原因,今天摘抄题目的时候才发现题目要求是矿石的数量最多相差为1,哭唧唧,现在贴的是提交的代码,正确的之后再改吧!!!!

代码:

void loop(int n, int weight[])
{
    int Sum = 0, sum;
    int dp[10009];
    for(int i = 0; i < n; i++)
        Sum += weight[i];
    sum = Sum / 2;
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < n; i++)
        for(int v = sum; v >= weight[i]; v--)
            dp[v] = max(dp[v], dp[v - weight[i]] + weight[i]);
    Sum -= dp[sum];
   // cout << dp[sum] << endl;
   // cout << Sum << endl;
    if(Sum > dp[sum])
        cout << Sum - dp[sum] << endl;
    else
        cout << dp[sum] - Sum << endl;
}

 

你可能感兴趣的:(公司笔试题目)