題目
網(wǎng)傳這是一道咪咕音樂的筆試題洛姑。
/*
題目描述:
有N隊學(xué)生蒜鸡,編號分別為1蜓洪,2,3坯苹,…隆檀,n。每隊上有若干學(xué)生粹湃,但學(xué)生總數(shù)必為n的倍數(shù)恐仑。可以在任一隊上移動若干個學(xué)生为鳄。
移動的規(guī)則是:在編號為1的隊上移動學(xué)生裳仆,只能移到編號為2的隊上;在編號為n的隊上移動的學(xué)生孤钦,只能移動到編號為n-1
的隊上歧斟;其他隊上移動的學(xué)生,可以移到相鄰左邊或右邊的隊上∑危現(xiàn)在要求找出一種移動方法静袖,用最少的移動次數(shù)使每隊上的
學(xué)生人數(shù)一樣多。例如:n=3俊扭,3隊學(xué)生分別為:3队橙,4,2則移動一次可以達(dá)到目的:從第2隊中移動一名學(xué)生到第3對中即可
實現(xiàn)每隊人數(shù)相同萨惑。
輸入:
要求從標(biāo)準(zhǔn)輸入中獲得兩類數(shù)據(jù)捐康,值的范圍正整數(shù)(1~100之間),表示隊數(shù)和每隊人數(shù)庸蔼;第一行輸入隊數(shù)解总,第二行輸入每隊
人數(shù),每行多個數(shù)值之間空格隔開朱嘴。
輸出:
程序輸出需要移動的次數(shù)
輸入示例:
3
3 4 2
輸出示例:
1
*/
他人解法
在網(wǎng)上看了下別人的解法倾鲫,但是邏輯好像有問題粗合,原文地址:網(wǎng)友博客
我的解法
我去他博客留了言,指出問題乌昔,沒有得到回應(yīng)隙疚,索性自己寫個Java版的解法,控制臺輸入什么的就不做了磕道,直接傳入數(shù)組寫算法供屉。大家看看,如有問題溺蕉,請大家斧正伶丐。
基本思路:
1、求數(shù)組平均數(shù)
2疯特、算每個數(shù)和平均數(shù)的差值
3哗魂、從左到右加差值,加1次就表示要移1步漓雅,總差值為0時表示不用移動录别。
代碼如下:
public static int getStep(int[] nums){
int total = 0;
for (int i : nums) {
total += i;
}
// 求平均數(shù),并驗證數(shù)據(jù)
int average = total / nums.length;
if(average*nums.length != total){
System.err.println("數(shù)據(jù)錯誤");
return -1;
}
// 生成新的平均數(shù)差值數(shù)組
int[] aveNums = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
aveNums[i] = nums[i] - average;
}
// 計算總的步數(shù)
int totalStep = 0;
int temp = 0;
for (int i : aveNums) {
temp = temp + i;
if(temp == 0){
continue;
}
totalStep++;
}
return totalStep;
}