2015-11-29 65 views
2

我試圖經過數組:轉到開始位置不同

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

第四迭代:7 1 2 5 = 7,8- ,10,15

注:我打電話給第一,第二,第三,第四,因爲我指的是2循環的情況; 在技術上我想要做的是從第二次迭代等到達索引時[3],然後索引[0]並添加它們。然後從索引[2]開始,索引[3]索引[0]和[1]。

我試着用不同的方式使用雙((和j = i)),並且當j(第二個) 達到數組的最後位置(在這種情況下爲[3])將其更改爲零並且大小=我(這將是它開始點),但它不能正常工作... 也可能它可以與(%模數)一起工作,但我希望看到其他人的想法總是有助於學習:)多謝你們!

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

請顯示您「嘗試過」以及它與您想要的有何不同。 –

+0

完成了,謝謝。我想嘗試一些可能性,而不使用這種4位整數數組的反覆次數,我有其他的嘗試或總和這種方式不給,但這是唯一剩下使它的作品。感謝您的幫助,並感謝詢問 –

回答

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],bills[1],bills[2]的相同陣列(基本上除去備份第一個元素,然後將所有元素移到左邊),最後複製第一個元素在arra的結尾y與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; 
     } 
    } 
} 
+1

我不認爲這是問題所在。 –

+0

謝謝,我寧願使用這一個獲得系列,但正如斯科特所說的問題是關於如何將這些數組(4次)添加到數組中,然後首先從0開始,然後遍歷數組從索引[1]開始,到達時[3]繼續到0.等等:) –

+0

@ScottHunter感謝您指出,我錯過了一部分的問題。我更新了我的答案,至少給了這個系列。 – Raf

0

假設start是要啓動與該項目的指標,這應該做的伎倆:

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

是的,只需雙迭代開始,我從0到bills.length –

+0

這看起來不錯,簡單謝謝:) –

0

這是基於斯科特·亨特的回答。嘗試

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";