美文网首页
网传咪咕面试题-队伍均分移动问题

网传咪咕面试题-队伍均分移动问题

作者: 紫石南 | 来源:发表于2017-03-11 11:53 被阅读763次

    题目

    网传这是一道咪咕音乐的笔试题。

    /*
    题目描述:
    有N队学生,编号分别为1,2,3,…,n。每队上有若干学生,但学生总数必为n的倍数。可以在任一队上移动若干个学生。
    移动的规则是:在编号为1的队上移动学生,只能移到编号为2的队上;在编号为n的队上移动的学生,只能移动到编号为n-1
    的队上;其他队上移动的学生,可以移到相邻左边或右边的队上。现在要求找出一种移动方法,用最少的移动次数使每队上的
    学生人数一样多。例如:n=3,3队学生分别为:3,4,2则移动一次可以达到目的:从第2队中移动一名学生到第3对中即可
    实现每队人数相同。
    
    输入:
    要求从标准输入中获得两类数据,值的范围正整数(1~100之间),表示队数和每队人数;第一行输入队数,第二行输入每队
    人数,每行多个数值之间空格隔开。
    
    输出:
    程序输出需要移动的次数
    
    输入示例:
    3
    3 4 2
    
    输出示例:
    1  
    */
    

    他人解法

    在网上看了下别人的解法,但是逻辑好像有问题,原文地址:网友博客

    我的解法

    我去他博客留了言,指出问题,没有得到回应,索性自己写个Java版的解法,控制台输入什么的就不做了,直接传入数组写算法。大家看看,如有问题,请大家斧正。
    基本思路:
    1、求数组平均数
    2、算每个数和平均数的差值
    3、从左到右加差值,加1次就表示要移1步,总差值为0时表示不用移动。
    代码如下:

        public static int getStep(int[] nums){
            int total = 0;
            for (int i : nums) {
                total += i;
            }
    //      求平均数,并验证数据
            int average = total / nums.length;
            if(average*nums.length != total){
                System.err.println("数据错误");
                return -1;
            }
    //      生成新的平均数差值数组
            int[] aveNums = new int[nums.length];
            for (int i = 0; i < nums.length; i++) {
                aveNums[i] = nums[i] - average;
            }
    //      计算总的步数
            int totalStep = 0;
            int temp = 0;
            for (int i : aveNums) {
                temp = temp + i;
                if(temp == 0){
                    continue;
                }
                totalStep++;
            }
            return totalStep;
        }
    

    相关文章

      网友评论

          本文标题:网传咪咕面试题-队伍均分移动问题

          本文链接:https://www.haomeiwen.com/subject/cwuagttx.html