2013-11-10 37 views
-1

好吧所以...我需要檢查一個數組是否是一個完整的鏈。我會告訴你這是什麼意思:循環來擊中數組中的每個元素?

我有arr [5,3,2,0,4,1]。 N(數組大小)= 6,N-1 = 5.所以數組應該包含數字0-5。那麼我們從arr [0]開始。因此我們去arr [5] = 1,arr [1] = 3,arr [3] = 0,這會使我們回到arr [0]。

由於這個數組沒有去每個數字,它不是一個完整的鏈。我希望這是有道理的大聲笑。

我應該在java中寫一個開始於arr [0]的方法,並像我說的那樣通過,如果它碰到數組中的每個數字,它就是完整的鏈(true)。如果它回到一個已經被打的數字,它就不是(false)。

我明白這背後的邏輯......我只是不能實現它。我不知道如何使用循環來跟蹤數字和索引......(我們應該使用循環)。

任何人都可以幫助指向正確的方向嗎?我不在尋找代碼,但如果有人可以解釋我將如何實現一個循環,這將是非常棒的!

+0

「但如果有人可以解釋我可能會如何實現一個循環」 - 一個基本的Java教程也許? –

+0

http://www.tutorialspoint.com/java/java_loop_control.htm – Evans

+0

你問過你的助教/助教/教授嗎? – 2013-11-10 01:58:41

回答

0

您可以使用for循環在數組中迭代。 下面是一個例子:

int[] array = new int[4]; 
array[0] = 2; 
array[1] = 5; 
array[2] = 1; 
array[3] = 8; 

for(int i = 0; i<array.length; i++){ 
    System.out.println("The element in the array at position: "+ i +" is: " + array[i]); 
} 

如何你可以看到,我宣佈和第一初始化數組。在for循環中,首先聲明並初始化一個臨時變量(當for循環結束時該變量將被刪除)爲0(int i = 0)。接下來,我編寫「for循環」的末尾表達式(這個表達式決定了什麼時候for會結束,在這種情況下,for循環將運行直到「i」小於數組.length(4)。接下來,我將通過一個(i ++)來增加temp變量。

在這種情況下for循環的主體很簡單(在給定位置(i)中打印數組的元素)。但它可以是任何你想要做的陣列。

我希望你能理解。 PS:對不起,我的英文不好。我的第一語言是西班牙語。 :D

+0

java數組有一個長度屬性,而不是方法。所以你實際上想要使用'array.length'而不是'array.length()' –

+0

upss!是的,抱歉。我使用的最多的是List,list.size():D –

-1

我將描述一個方法,該方法返回給定索引位置處的值,給定一個ints數組。

public static int getAtPosition(int nextPosition, int... elements) { 
    return elements[nextPosition]; 
} 

實質上,無論我使用什麼值nextPosition來用於索引到數組中。

接下來,考慮接下來,您使用arr[0]開始播種nextPosition,如果與方法調用結合使用,則會導致下一個位置值1

您也正確地觀察到它發生振盪,從而導致此鏈無效。

現在,這裏的訣竅是選擇一個數據結構來存儲我們所看到的元素,並防止我們再次觸發重複。我們使用Set<Integer>來實現這一點,因爲我們可以相對便宜地使用add,並且Set的接口強制它返回true當且僅當此元素未被添加到set之前。

public static boolean invalidChain(Set<Integer> values, int index) { 
    return !values.add(index); 
} 

的解釋:

  • 給定一組整數的,我補充一點,我剛剛看到的索引位置。
  • 如果成功添加了索引位置,我將返回false - 因爲成功的add()意味着該值從未放入集合中。
  • 如果索引位置沒有成功添加,我將返回true - 出於上述相反原因。

考慮到了這一切,你現在創作的循環利用布爾invalidChain和INT getAtPosition。提示:invalidChain只有條件你應該檢查循環。

0

你想要一個計數器(初始化爲0)的元素落在你的鏈條之外。您還需要一個與您的數組大小相同的布爾類型的數組。這個布爾類型的數組將跟蹤您是否有重複的元素。

爲了使程序更快,在你的for循環(用於迭代你的數組)時,當你發現一個元素落在你的鏈範圍之外時,你增加計數器並跳出循環。之後,你只需檢查計數器== 0.如果它是0,那麼你的鏈是完整的,否則不完整。我希望這有幫助。

如何檢查一個元素是否超出範圍?檢查元素是否=> array.length或< 0(如果我理解你的問題是正確的)

我意識到你可能正在做一個家庭作業或類似的東西,我遺漏了大部分代碼供你使用它自己。下面是我怎麼會用一個boolean類型的數組跟蹤元素的元素:

int[] arrayToCheck = new int[]{5, 3, 2, 0, 1, 1}; 
boolean[] arrayMarker = new boolean[arrayToCheck.length]; 

int count = 0; // count the number out of the chain 

for (int i : arrayToCheck) { 
    // here you need to write code to check the element i is within 
    // your range, if not, increment counter, break out 

    if (arrayMarker[i] != true) { 
     arrayMarker[i] = true; 
    } else { 
     count++; 
     break; 
    } 
} 

boolean completeChain = (count == 0) ? true : false; 
System.out.println("is completeChain: " + completeChain); 
0

假設編號是唯一的:

public int sum(int[] arr) { 
    int ret = 0; 
    for (int i : arr) { 
     ret += arr[i]; 
    } 
    return ret; 
} 

int[] arr = { 5, 3, 2, 0, 4, 1 }; 
int tmp = arr[0]; 
int sum = 0; 
for (int i = 0; i < arr.length; i++) { 
    sum += arr[tmp]; 
    tmp = arr[tmp]; 
} 
System.out.println(sum == sum(arr)); 
2

我會用一個輔助boolean[]告訴我們,如果我們打的指數第二次。既然你顯然需要有一種方法來存儲你已經看到的元素,並且由於無論如何這個結構在最壞的情況下會佔用線性空間,所以你最好使用它。我會做這樣

public static boolean arrayIsCompleteChain(int[] array) { 
    boolean[] visited = new boolean[array.length]; 
    int index = 0; 
    int steps = 0; 

    // stop once we visit an index twice 
    while(!visited[index]) { 
     visited[index] = true; // mark index as visited 
     index = array[index]; // go to the next index 
     steps++;    // count this step 
    } 

    // if we made one step for every index, then the array is a complete chain 
    if(steps == array.length) { 
     return true; 
    } else { 
     return false; 
    } 

    // for anyone reading this who thinks to himself the "if" construct is 
    // unnecessary: this is for didactic purposes 
} 

注意,此方法不會做任何驗證輸入,即檢查是否包含會把索引越界或陣列本身null是否元素。如果你想要的話,這很容易做到。

相關問題