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