首先要说的是,这道题是一家公司的面试题。我对这道题比较感兴趣,虽然我对算法一无所知,但前两天还是仔细地研究了这道题,因为没有系统的学过算法,所以只是简单地实现了题目中的要求。
题目:
如何将N个球均分入M个包裹中,用算法实现,即如果N=9,M=3,输出【3,3,3】,如果N=11,M=3,则输出【4,4,3】
思路
- 先判断能否被均匀分配,如果能均匀分配,输出的值为N/M,如果不能,则跳到第2步。
- 记a=N/M+1,b=N/M,a和b是包裹中可能出现的球的个数。先将第一个包裹中球的个数设为a,其余包裹球的个数设为b。所有球的个数相加判断是否为N,如果满足该条件,则输出,否则,跳至第3步。
- 第一个,第二个包裹中球的个数都设为a,其余包裹球的个数设为b,再判断所有球的个数相加是否为N。如不满足条件,第一到第三的包裹球的个数设为a,其余包裹球个数设为b…如此循环,直到条件满足为止。
代码
public class BallTest {
/**
* 该方法通过输入N和M,通过数组的形式输出包裹中球的个数
* @param n
* @param m
* @return
*/
public int[] getArray(int n,int m){
int[]array=new int[m];
/**
* 如果能整除,则每个包裹中球的个数都相同,数组的每个元素的值也相同。
*/
if(n%m==0){
int result=n/m;
for(int i=0;i<array.length;i++){
array[i]=result;
}
}else{//如果不能整除,则执行下面的方法
array=getArray2(n, m);
}
return array;
}
/**
* 该方法是在N不能整除M的情况下,返回的数组
* @param n
* @param m
* @return
*/
public int[]getArray2(int n,int m){
int[]array=new int[m];
/**
* a和b是数组中元素可能的值,count为循环次数
*/
int a=(n/m)+1;
int b=n/m;
int count=1;
for(int index=0;index<array.length;index++){
for(int i=0;i<count;i++ ){
array[i]=a;
}
for(int j=count;j<array.length;j++ ){
array[j]=b;
}
/**
* 每次给数组元素赋值结束后,就判断每个元素值的和是不是等于n,如果等于,则跳出整个循环,返回生成的数组。
* 否则,循环的次数加一,继续下次的循环和赋值
*/
if(sum(array)==n){
System.out.println(sum(array)+"sum(array)");
break;
}else{
count++;
System.out.println(count+"count");
}
}
return array;
}
/**
* 数组元素求和
* @param a
* @return
*/
public int sum(int[] a){
int sum=0;
for(int z=0;z<a.length;z++){
sum=sum+a[z];
}
return sum;
}
}