从不同位置开始的数组

时间:2015-11-29 21:50:13

标签: java arrays

我正在尝试通过一个数组:

public static String calculate(int [] bills,int amount){
int size = bills.length;        
int cache = 0;
for (int i = 0; i < size; i++) {
    cache+=bills[i];
    if(cache==amount){
        return "OK";
    }
}
return "NO OK";
}

将按此顺序遍历数组(和总和):

1 2 5 7 = 1,3,8,15(总和)

但我想要的是:

第1次迭代:1 2 5 7 = 1,3,8,15

第二次迭代:2 5 7 1 = 2,7,14,15

第3次迭代:5 7 1 2 = 5,12,13,15

第4次迭代:7 1 2 5 = 7,8,10,15

注意:我打电话给第1,第2,第3,第4,因为我指的是2个循环的情况; 从技术上讲,我想要做的是从第二次迭代开始,等到达索引[3]时,然后转到索引[0]并将它们加起来。然后从索引[2]开始,当得到索引[3]时,它将索引[0]和[1]相加。

我尝试了不同的方法,使用double(和j = i)和j(第2次) 到达数组的最后位置(在这种情况下为[3])将其更改为零并且size = i(这将是它开始的点)但它无法正常工作... 也许它可以使用(%模数)但我希望看到其他人的想法总是有助于学习:)谢谢你们!

PS:我用这个作为数组(忽略方法的数量部分因为不是问题的一部分):

int[] bills = new int[] {1,2,5,7};
PSS:这是我尝试的代码(使用双循环并且它不是我犯的错误少,因为我错过了它,因为我删除并改变了很多尝试新事物,这可能有可怕的错误。 。):

    public static String calculate(int [] bills,int amount){

    int size = bills.length;        
    int cache = 0;
    int c = 1;
    int z = size-1;
    int s = 0;
    int w = 0;
    boolean TIME = false;

        for (int i = w; i < size;) {

            for (int j = i; j < size;j++){ 
                cache+=bills[j];
                if(cache==amount){
                    cache=0;
                    return "OK";
                }
                System.out.println(TIME);
                if(i>0 && j==z && TIME){
                    size=i;
                    i=0;
                    TIME=false;
                }
            }
            w++;
            size=z+1;
            cache=0;
            TIME=true;
        }
}

3 个答案:

答案 0 :(得分:0)

这是一个简单的逻辑。您可以添加一个新数组,然后当您遍历您的账单数组时,您可以将索引和前一个的总和添加到新数组,打印数组然后重新排序账单数组的数字并重复循环。

您可以使用System.arrayCopy更改对帐单数组中元素的顺序。我们假设你有

bills > [2, 5, 7, 1] : sum > [2, 7, 14, 15]

现在你需要旋转你的账单数组,所以后面这样做是使用arrayCopy

int firstElement = bills[0];
System.arraycopy(bills, 1, bills, 0, size-1);
bills[size-1] = firstElement;

在三行以上,复制数组的第一个元素,然后使用arrayCopy将bills[1]bills[2]bills[3]复制到位置bills[0]中的同一个数组,{{ 1}},bills[1]分别(基本上删除备份第一个元素,然后将所有元素移到左边),最后用bills[2]复制数组末尾的第一个元素。有关arrayCopy如何工作的更多详细信息,请参阅上面的here和javadoc链接。

您将获得以下内容:

bills[size-1] = firstElement

以下是代码示例

import java.util.Arrays;

[2, 5, 7, 1] : [2, 7, 14, 15]
[5, 7, 1, 2] : [5, 12, 13, 15]
[7, 1, 2, 5] : [7, 8, 10, 15]
[1, 2, 5, 7] : [1, 3, 8, 15]

答案 1 :(得分:0)

假设start是您希望开始的项目的索引,这应该可以解决问题:

cache += bills[(i+start)%size];

答案 2 :(得分:0)

这是基于Scott Hunter的回答。尝试

for (int start = 0; start < size; start++) {
    for (int i = 0; i < size; i++) {
        cache += bills[start + i];
        if (cache == amount) {
            // You probably want to keep track of indices added to cache...
            return "OK";
        } else if (cache > amount) {
            cache = 0;
            // this break breaks out of the "i" loop, but continues the "start" loop
            break;
        }
    }
}
return "NO OK";