vivo 2020届校招在线编程笔试B卷

1.小v最近在玩一款挖矿的游戏,该游戏介绍如下:

1、每次可以挖到多个矿石,每个矿石的重量都不一样,挖矿结束后需要通过一款平衡矿车运送下山;

2、平衡矿车有左右2个车厢,中间只有1个车轮沿着导轨滑到山下,且矿车只有在2个车厢重量完全相等且矿石数量相差不超过1个的情况下才能成功运送矿石,否则在转弯时可能出现侧翻。

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

private static int solution(int[] input) {
 
        // TODO Write your code here
        
        int sum = 0;
        int n = input.length;
        for(int i = 0; i < n; i++) sum += input[i];
        int halfNum=(n+1)/2;
        int halfWeight=(sum+1)/2;
        int diff = 10000;                  // 两车矿石的重量差
        // 动态规划,dp[i][j]表示用i块矿石能否使重量为j
        boolean[][] dp=new boolean[105][10005];
        dp[0][0]=true;
        int weight=0;//一辆矿石车的重量
        for(int i=0;i<n;i++){
            for(int j=sum;j>=input[i];j--){
                for(int k=n;k>=0;k--){
                    // 如果可以用k块矿石凑j-input[i]的重量
                    if(dp[k][j-input[i]]){
                        dp[k+1][j]=true;//选上第i块石头凑出重量j
                        if(k+1==halfNum&&Math.abs(j-halfWeight)<diff){
                            diff=Math.abs(j-halfWeight);
                            weight=j;
                        }
                    }
                }
            }
        }
        return Math.abs(sum-weight*2);
    }

2.今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:

将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;

最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。

 private static String solution(int[] input) {
        int n=input[0];
        int m=input[1];
        // TODO Write your code here
        ArrayList<Integer> list=new ArrayList();
        for(int i=0;i<n;i++){
            list.add(i+1);
        }
        StringBuilder res=new StringBuilder();
        int temp=0;
        for(int j=0;j<n;j++){
            temp=(temp+m-1)%list.size();
            res.append(list.get(temp)+" ");
            list.remove(temp);
        }
        return res.toString().trim();
    }

3.小v在公司负责游戏运营,今天收到一款申请新上架的游戏“跳一跳”,为了确保提供给广大玩家朋友们的游戏都是高品质的,按照运营流程小v必须对新游戏进行全方位了解体验和评估。这款游戏的规则如下:

    有n个盒子排成了一行,每个盒子上面有一个数字a[i],表示在该盒子上的人最多能向右移动a[i]个盒子(比如当前所在盒子上的数字是3,则表示可以一次向右前进1个盒子,2个盒子或者3个盒子)。

现在小v从左边第一个盒子上开始体验游戏,请问最少需要移动几次能到最后一个盒子上?

private static int solution(int[] input) {
         
        // TODO Write your code here
        if(input.length==1) return 0;
        if(input.length>1&&input[0]==0) return -1;
        int[] dp=new int[input.length];
       for(int i=0;i<input.length;i++){
           int range=Math.min(input.length-1,i+input[i]);
           for(int j=i+1;j<=range;j++){
               if(dp[j]==0) dp[j]=dp[i]+1;
           }
       }
       return dp[input.length-1]==0?-1:dp[input.length-1];
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值