Java 将if/else块转换为三值运算符时回答错误
我正在尝试将我的java代码从if/else块转换为三值运算符 我的代码所做的是查找一个数组的位置,在这个数组中,所有整数的值都已经出现了,例如 如果数组是Java 将if/else块转换为三值运算符时回答错误,java,arrays,Java,Arrays,我正在尝试将我的java代码从if/else块转换为三值运算符 我的代码所做的是查找一个数组的位置,在这个数组中,所有整数的值都已经出现了,例如 如果数组是{1,1,3,4,2,3,4,5,1,4} 答案应该是7,因为当我的程序迭代到7位置时,它已经发现前面所有的数字都小于5 如果数组是{3,1,1,2,1,3},答案将是3,因为当我的程序迭代到数组的3位置时,它已经迭代了所有小于3的值 现在,当我使用if/else块时,我的代码运行良好 这是对我来说绝对有效的代码 public static
{1,1,3,4,2,3,4,5,1,4}
答案应该是7
,因为当我的程序迭代到7
位置时,它已经发现前面所有的数字都小于5
如果数组是{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;
}
我就是这样检查的
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]]
为真,并且三元运算符对b[myArray[I]]的值求反,则您正在递减arrayMaxValue
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;
}
publicstaticint解决方案3(int-arrayMaxValue,int[]myArray){
int结果=-1;
布尔b[]=新布尔[arrayMaxValue+1];
对于(int i=0;i
要记住的主要一点是,如果您不想更改?:
结果赋值的左侧,您可以使用其旧值作为备选值之一。在前面的回答中,Eran正确地指出,您使用的三元运算符只是一种复杂的写入方式
b[myArray[i]=!b[myArray[i]]代码>
在对Eran anwer的评论中,您注意到您的任务是
使用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;
}
for(int i=0;i
在这段代码中,您将使用三元运算符来决定是否将arrayMaxValue
递减1(如果b[myArray[i]
为false
),或者不递减(如果b[myArray[i]
为true,我们将递减0)
请注意,b[myArray[i]]
值在您的周期的每次迭代中总是设置为true
。我没有收到您的回复,对不起,您能详细说明一下吗?我试着一次又一次地阅读我的Ternary运算符代码,但它似乎与if/else相同block@bhuvesh我试图澄清。我们被告知要同时使用if/else和三元运算符来设计这个程序…为什么不能使用三元运算符:s..还有,如果我用'if(!b[myArray[I]]){b[myArray[I]]来重新设计三元运算符=true;arrayMaxValue--;}`这不是和第一个一样吗?@bhuvesh当然可以使用三元运算符,但我不会使用它,因为它会降低代码的可读性。您需要确定b
元素在每种情况下的值,并将该值放入三元表达式中。是否要将b
元素更改为false?
for (int i = 0; i < myArray.length; i++) {
arrayMaxValue -= b[myArray[i]] ? 0 : 1;
b[myArray[i]] = true;
if (arrayMaxValue==0) return i;
}