我正在尝试通过一个数组:
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;
}
}
答案 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";