簡體   English   中英

將if / else塊轉換為三元運算符時的錯誤答案

[英]wrong answer when converting if/else block to ternary operator

我正在嘗試將Java代碼從if / else塊轉換為三元運算符。

我的代碼正在做的事情是找到一個數組的位置,在該位置已經出現了所有整數值,例如,

如果數組是{1,1,3,4,2,3,4,5,1,4}

答案是7因為到我的程序迭代到7th位時,它已經發現所有以前的數字都小於5。

如果array為{3,1,1,2,1,3} ,答案將為3因為到我的程序迭代到數組的3位置時,它已經迭代了所有小於3值。

現在,當我使用if / else塊時,我的代碼工作正常。

這是對我來說絕對正常的代碼,

public static int solution1 (int arrayMaxValue, int[] myArray){

    boolean b[] = new boolean[arrayMaxValue + 1];
    for (int i = 0; i < myArray.length; i++) {
        if (!b[myArray[i]]){
            b[myArray[i]] = true;
            if (b[myArray[i]]==true)
                arrayMaxValue--;
        }
        if (arrayMaxValue==0) return i;
    }
    return -1;
}

但是如果我將其if塊轉換為ternary operator ?

它給出了錯誤的輸出,

public static int solution2 (int arrayMaxValue, int[] myArray){
        boolean b[] = new boolean[arrayMaxValue + 1];
        for (int i = 0; i < myArray.length; i++) {


            b[myArray[i]] = (!b[myArray[i]]) ? true : false;
            if (b[myArray[i]]){
                arrayMaxValue--;
            }


            if (arrayMaxValue==0) return i;
        }
        return -1;
    }

這就是我檢查的方式

    int[] myArray = { 1,1,1,2,3,4,1 };
    // _ _ _ _ _
    int arrayMaxValue =4;

    System.out.println(solution1(arrayMaxValue, myArray));
    System.out.println("==============================");
    System.out.println(solution2(arrayMaxValue, myArray));

上面的數組的輸出應該為5因為當循環迭代到位置5時,發現了所有小於或等於4值,第一個解決方案給出了正確的答案,而第二個解決方案卻沒有。

這是上述數組的兩個解決方案的輸出,

5
==============================
4

三元運算符在做什么?

在您的三元運算符版本中,如果在執行三元運算符后b[myArray[i]]為true,則遞減arrayMaxValue ,並且三元運算符取反b[myArray[i]]

b[myArray[i]] = (!b[myArray[i]]) ? true : false;

是相同的

b[myArray[i]] = !b[myArray[i]];

在原始版本中,僅當b[myArray[i]]從false更改為true時,才減小arrayMaxValue ,並且永遠不要將b[myArray[i]]從true更改為false。

我認為三元運算符在您的代碼中沒有用,因為您的條件不僅可以根據條件為b[myArray[i]]分配值,而且還具有減少arrayMaxValue 您可以通過以下方式簡化代碼:

if (!b[myArray[i]]) {
    b[myArray[i]] = true;
    arrayMaxValue--;         
}

為了使三元運算符為b[myArray[i]]分配與原始代碼相同的值,它應該是:

b[myArray[i]] = (!b[myArray[i]]) ? true : b[myArray[i]];

(這是寫b[myArray[i]] = true;一種復雜方法)

但是arrayMaxValue--也將在b[myArray[i]]並保持為true時執行,這與原始實現的邏輯不同。

不是我建議的代碼。 使用if / else可以比這種方式更簡潔,更易讀。 我主要是為了說明為什么通常應該忽略?:

但是,僅使用?: ...來重寫函數是一個挑戰。

  public static int solution3(int arrayMaxValue, int[] myArray) {
    int result = -1;
    boolean b[] = new boolean[arrayMaxValue + 1];
    for (int i = 0; i < myArray.length && result == -1; i++) {
      arrayMaxValue = b[myArray[i]] ? arrayMaxValue : arrayMaxValue - 1;
      b[myArray[i]] = true;
      result = (arrayMaxValue == 0) ? i : result;
    }
    return result;
  }

要記住的主要事情是,如果您不想更改?:結果的左側,則可以將其舊值用作替代方法之一。

在先前的答案中,Eran正確地指出,您使用的三元運算符只是編寫b[myArray[i]] = !b[myArray[i]];一種復雜方法b[myArray[i]] = !b[myArray[i]]; 在對伊蘭答案的評論中,您指出您的任務是

使用if / else和三元運算符設計該程序

當然可以使用三元運算符。 您只需要使用運算符來分配其他值。 例如, arrayMaxValue的值:

for (int i = 0; i < myArray.length; i++) {
  arrayMaxValue -= b[myArray[i]] ? 0 : 1;
  b[myArray[i]] = true;
  if (arrayMaxValue==0) return i;
}

在這段代碼中,您將使用三元運算符來決定是否將arrayMaxValue減1(如果b[myArray[i]]false )(如果b[myArray[i]]true我們將其減0)。 。

PS注意, b[myArray[i]]值在循環的每次迭代中始終設置為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM