将列表拆分为给定的等大小X和剩余列表不应小于大小Y.

时间:2013-12-19 10:59:03

标签: java

例如: 我有21个球的列表,我想在Bucket中分配它们。 铲斗尺寸应至少为2,最大为5。

I want output like 
B1 has 5 Balls
B2 has 5 Balls
B3 has 5 Balls
B4 has 4 Balls
B5 has 2 Balls

这意味着我想将Buckets分配给最大数量的球,然后保留。 我们可以采用无限量的铲斗。 如果可能的话,我想用JAVA代码。 请帮我找到解决方案 谢谢

3 个答案:

答案 0 :(得分:3)

n/5将为您提供大小为5的桶数。

n%5会给你剩下的部分。

如果n%5 >= 2,请创建一个新存储桶并放置它们。

如果n%5 = 1,请创建一个新存储桶,添加该存储桶,然后在另一个存储桶中选择一个存储桶。

此示例演示了算法:

public class Test {

    public static void main(String[] args) {        
        place(21,5);        
    }

    public static void place(int number, int sizeBucket){
        int nbBuckets = number / sizeBucket;
        int nbLeft = number % sizeBucket;
        List<Bucket> lBuckets = new ArrayList<>();
        for(int i = 0; i < nbBuckets; i++){
            lBuckets.add(new Bucket(sizeBucket, sizeBucket));
        }       
        if(nbLeft >= 2)
            lBuckets.add(new Bucket(5, nbLeft));
        else if (nbLeft == 1){
            Bucket b = lBuckets.get(lBuckets.size()-1);
            b.setSize(b.getSize()-1);
            lBuckets.add(new Bucket(sizeBucket, nbLeft+1));
        }
        System.out.println(lBuckets);
    }
}

class Bucket {
    private int capacity;
    private int size;

    public Bucket(int capacity, int size) {
        super();
        this.capacity = capacity;
        this.size = size;
    }

    public int getCapacity() {
        return capacity;
    }

    public void setCapacity(int capacity) {
        this.capacity = capacity;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    @Override
    public String toString() {
        return "Bucket [capacity=" + capacity + ", size=" + size + "]";
    }       
}

输出:

[Bucket [capacity=5, size=5], Bucket [capacity=5, size=5], Bucket [capacity=5, size=5], Bucket [capacity=5, size=4], Bucket [capacity=5, size=2]]

答案 1 :(得分:2)

1.检查一个桶装满5个球后是否留下至少两个球 2.如果不是,请尝试4等等......如果是2,那将是你的最后一桶 3.填充一个桶 4.只要你有足够的球,重复这些步骤

答案 2 :(得分:0)

我为你设计了一个通用方法,你可以输入最小,最大球数(用于桶)和总球数

获取要创建的存储区数量的方法。

long getNoOfBucket(long total, int max, int min) {
        if (total % max < min && total % max != 0) {
            return (total / max) + 1;
        } else {
            return total / max;
        }

获取存储桶列表的方法。

 List<List<Long>> getbucketOfBuckets(long total, int max, int min) {
            List<Long> tempBucket = null;
            List<List<Long>> parentbucket = new ArrayList<List<Long>>();
            if (total % max < min && total % max != 0) {
                long noOfBucket = getNoOfBucket(total, max, min); 
                for (long i = noOfBucket; i >= 1;i--) {
                    if (total % max < min && total % max !=0) {
                        total = total - min;
                        long tempVar = total+1;
                        tempBucket = new ArrayList<Long>();

                        for (long j = 1; j <= min; j++) {

                            tempBucket.add(tempVar);
                            tempVar++;
                        }
                        parentbucket.add(tempBucket);
                    } else {
                        long tempmax = 0;
                        if(total%max == 0){
                            tempmax = max;
                        }else{
                            tempmax = total%max;
                        }
                        total = total - tempmax;
                        long tempVar = total+1;
                        tempBucket = new ArrayList<Long>();
                        for (int j = 1; j <= tempmax; j++) {

                            tempBucket.add(tempVar);
                            tempVar++;
                        }
                        parentbucket.add(tempBucket);
                    }
                }
            }
else{
            for (long i = noOfBucket; i >= 1; i--) {

                total = total - max;
                long tempVar = total + 1;
                tempBucket = new ArrayList<Long>();
                for (int j = 1; j <= max; j++) {

                    tempBucket.add(tempVar);
                    tempVar++;
                }
                parentbucket.add(tempBucket);
            }
            }
            return parentbucket;

测试上述代码的主要方法

public static void main(String[] args) {
    long total = Long.valueOf(args[0]);
    int max = Integer.valueOf(args[1]);
    int min = Integer.valueOf(args[2]);
    long noOfBucket = BallServicesImplementation.getNoOfBucket(total, max,min);

    List<List<Long>> parentBuclet = BallServicesImplementation.getbucketOfBuckets(total, max, min);
    for(List<Long> itr : parentBuclet){
        System.out.println("size :: "+itr.size());
        for(Long seLong : itr){
            System.out.print(seLong+"\t");
        }
        System.out.println("");
        System.out.println("********************************************");
    }

我已经在不同的测试用例下对它进行了测试。我可以尝试一下,如果需要更多改进,请告诉我。 希望它会对你有所帮助。