2016-09-21 100 views
1
Given an array of ints, return true if every element is a 1 or a 4. 

only14([1, 4, 1, 4]) → true 
only14([1, 4, 2, 4]) → false 
only14([1, 1]) → true 

我想出了以下算法返回所有預期的答案,除了一個空數組,應該返回true空數組返回true?鑑於int數組,如果每一個元素是1或返回true 4

public boolean only14(int[] nums) { 

    boolean flag = false; 

    for (int i = 0; i < nums.length; i++) { 

    if (nums[i] == 1 || nums[i] == 4) { 
     flag = true; 
    } else { 
     return false; 
    } 
    } 
    return flag; 
} 

從解決方案,下面的輸入應該產生true,但我想不通爲什麼:

only14([]) → true

我知道默認值是0,所以我錯過了什麼,我應該期望布爾的返回值是true

+4

擺脫flag'的'實現它,只是返回'末TRUE'。 –

+2

因爲空集不包含不是1或4的數字。 –

+3

我知道您不是在問如何編寫能夠爲空集返回true的代碼。相反,你在問爲什麼應該爲空集返回true。如果是這樣的話,請閱讀這篇關於材料條件操作符[這裏]的文章(https://en.wikipedia.org/wiki/Material_conditional)。第一段就夠了。 – Haozhun

回答

4

以下應該工作。除非有沒有1或4

public boolean only14(int[] nums) { 
    for (int i = 0; i < nums.length; i++) { 
    int val = nums[i]; 
    if (val != 1 && val != 4) { 
     return false; 
    } 
    } 
    return true; 
} 
3

空集包含空值不屬於任何價值14,所以它應該是true它返回true。我希望能有一個像for-each loop

public boolean only14(int[] nums) { 
    for (int n : nums) {  // for each int n in nums 
     if (n == 1 || n == 4) { // if it is 1 or 4 keep looping 
      continue; 
     } 
     return false;   // it isn't 1 or 4, return false 
    } 
    return true;    // every value is 1 or 4. 
} 

在Java 8+,你可以用一個IntStream

public boolean only14(int[] nums) { 
    return IntStream.of(nums).allMatch(x -> x == 1 || x == 4); 
} 
+0

更簡單,更優雅的算法。而且,現在我的解釋更加清晰。我錯誤地解釋了這些指令 - 我以爲它正在尋找一個必須包含1或4的數組,而不是隻包含替代值的數組。一個有趣的差異(對我來說,至少)。 – Vordhosbn

+0

任何你堅持積極條件而不是'if(n!= 1 && n!= 4)的原因返回false;'? – shmosel

+0

@shmosel作爲cybersam的答案的替代方案。在這裏工作。我個人認爲這樣更具可讀性。 –