分球问题

首先要说的是,这道题是一家公司的面试题。我对这道题比较感兴趣,虽然我对算法一无所知,但前两天还是仔细地研究了这道题,因为没有系统的学过算法,所以只是简单地实现了题目中的要求。

题目:

如何将N个球均分入M个包裹中,用算法实现,即如果N=9,M=3,输出【3,3,3】,如果N=11,M=3,则输出【4,4,3】

思路

  1. 先判断能否被均匀分配,如果能均匀分配,输出的值为N/M,如果不能,则跳到第2步。
  2. 记a=N/M+1,b=N/M,a和b是包裹中可能出现的球的个数。先将第一个包裹中球的个数设为a,其余包裹球的个数设为b。所有球的个数相加判断是否为N,如果满足该条件,则输出,否则,跳至第3步。
  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;

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值