題目
網傳這是一道咪咕音樂的筆試題。
/*
題目描述:
有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;
}