将if / else块转换为三元运算符时的错误答案

时间:2015-01-30 19:23:26

标签: java arrays

我正在尝试将我的java代码从if / else块转换为三元运算符。

我的代码正在做的是找到一个数组的位置,在该位置已经出现了所有整数值,例如,

如果数组是{1,1,3,4,2,3,4,5,1,4}

答案是7,因为当我的程序迭代到7th位置时,它已经发现所有以前的数字都小于5.

如果数组是{3,1,1,2,1,3},答案将是3,因为当我的程序迭代到数组的3位置时,它已经迭代了所有小于{{{的值。 1}}。

现在,当我使用if / else阻止时,我的代码工作正常。

这是对我来说非常好的代码,

3

但如果我将其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

我在三元运算符中做错了什么?

3 个答案:

答案 0 :(得分:5)

在三元运算符版本中,如果在执行三元运算符后arrayMaxValue为真,则递减b[myArray[i]],并且三元运算符否定b[myArray[i]]的值。

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

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

在原始版本中,只有当arrayMaxValue从false更改为true且您永远不会将b[myArray[i]]从true更改为false时,您才会递减b[myArray[i]]

我不认为三元运算符在您的代码中有用,因为您的条件不仅仅是根据条件将值赋给b[myArray[i]] - 它还具有递减{{1}的副作用}。您可以通过这种方式简化代码:

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--出现时执行,并且保持为真,这与原始实现的逻辑不同。

答案 1 :(得分:2)

这是我推荐的代码。使用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;
  }

要记住的主要事情是,如果您不想更改?:结果分配的左侧,您可以使用其旧值作为替代方案之一。

答案 2 :(得分:2)

在上一个答案中,Eran正确地指出您使用的三元运算符只是一种复杂的写入方式 b[myArray[i]] = !b[myArray[i]]; 在对Eran's anwer的评论中,您注意到您的任务是

  

使用if / else和ternary运算符设计此程序

肯定可以使用三元运算符。您只需要使用运算符来指定其他值。例如。 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]]为{ {1}}我们将减去0)。

P.S。请注意,在您的周期的每次迭代中,true值始终设置为b[myArray[i]]