【问题标题】:Go through an array starting with different positions遍历从不同位置开始的数组
【发布时间】:2016-03-03 11:55:15
【问题描述】:

我正在尝试遍历一个数组:

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 2 5 7 = 1,3,8,15

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

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

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

注意:我称 1st,2nd,3rd,4th 是因为我指的是 2 个循环的情况; 从技术上讲,我想做的是从第二次迭代开始,依此类推,当它到达 index[3] 时,它会转到 index[0] 并将它们相加。然后从 index[2] 开始,当得到 index[3] 时,它将 index[0] 和 [1] 相加。

我使用双 for(and j=i) 和 j(of the 2nd for) 以不同的方式进行了尝试 到达数组的最后一个位置(在这种情况下为 [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;
        }
}

【问题讨论】:

  • 为什么将数字相加的顺序很重要?
  • 请展示您“尝试”了什么以及它与您想要的有何不同。
  • 完成,谢谢。我想尝试一些可能性,而不是在这个 4 个整数的数组上使用递归,虽然有点蛮力...感谢您的帮助,感谢询问

标签: java arrays


【解决方案1】:

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

您可以使用 System.arrayCopy 更改 bills 数组中元素的顺序。假设你有

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

现在你需要旋转你的 bills 数组,所以下面使用 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]bills[1]bills[2](基本上删除备份第一个元素,然后将所有元素向左移动)最后用bills[size-1] = firstElement复制数组末尾的第一个元素。有关 arrayCopy 工作原理的更多详细信息,请参阅here,上面给出了 javadoc 链接。

您将获得以下信息:

[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]

这里是代码示例,

导入 java.util.Arrays;

public class SumArray {
    public static void main(String[] args) {
        int[] bills = new int[] { 2, 5, 7, 1 };
        int size = bills.length;

        for (int i = 0; i < size; i++) {
            int[] sum = new int[size];
            for (int j = 0; j < size; j++) {
                if (j == 0) {
                    sum[j] = bills[j];
                } else {
                    sum[j] += sum[j - 1] + bills[j];
                }
            }

            System.out.println(Arrays.toString(bills) + " : " + Arrays.toString(sum));

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

【讨论】:

  • 我不认为这是问题所在。
  • 谢谢,我宁愿用这个来获取系列,但正如斯科特所说,问题是我如何才能通过该数组(4 次)将它们加起来并首先从 0 开始,然后遍历数组,但从索引 [1] 开始,当它到达 [3] 时继续到 0。依此类推:)
  • @ScottHunter 感谢您指出,我错过了问题的一部分。我更新了我的答案,至少给出了这个系列。
  • 谢谢你!这工作得很好;),我会更深入地研究arraycopy的语法;)我也会测试斯科特的......赞成!
  • @NormanCarrizo 由于声誉低下,不确定您是否还可以投票,无论如何欢迎您,很高兴答案毕竟对您有所帮助。感谢 Scott 用初始答案标记问题。
【解决方案2】:

这是基于 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";

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,只需两次迭代 start 和 i 从 0 到 bills.length
    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2022-01-08
    • 2016-05-31
    • 2017-10-24
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多