網傳咪咕面試題-隊伍均分移動問題

題目

網傳這是一道咪咕音樂的筆試題。

/*
題目描述:
有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.nowcoder.com/) 經典排序算法就是前面講那幾...
    鍋與盆閱讀 7,745評論 6 14
  • 1.把二元查找樹轉變成排序的雙向鏈表 題目: 輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。 要求不...
    曲終人散Li閱讀 3,371評論 0 19
  • 那些叫囂著要好好珍惜的珍如寶石的時光,終究還是在慢慢消磨中蹉跎。
    之兮閱讀 212評論 0 0
  • 今天又看了一遍《少年派奇幻漂流》,依稀記得一點就是講一個小男孩跟一只老虎的故事,應該是好幾年前了。 今天又看了一次...
    梁木純閱讀 184評論 0 1
  • 我有一個讀者,最近在鬧離婚。 大半夜的,在微信上,給我發了50多條信息,有3000多字。 我早上醒來,還沒有起床,...
    彭晨龍閱讀 672評論 0 1