Kotlin:找到奇偶异常值.我们需要打印与Array中其他数字不同的数字



问题是:您得到一个包含整数的数组(其长度至少为3,但可能非常大(。数组要么完全由奇数整数组成,要么完全由除单个整数N以外的偶数整数组成;"异常值";N.

现在我的代码是:

fun find(integers: Array<Int>): Int {
var sumEven = 0
var sumOdd = 0

for ( i in integers){
if(integers[i]%2==0){
sumEven+=1
} else{
sumOdd+=1
}
}
if (sumEven>sumOdd){
for(i in integers){
if(integers[i]%2!=0){
print(integers[i])
} 
}

} else{
for(i in integers){
if(integers[i]%2==0){
print(integers[i])
}
}
}
return 0
}

请原谅我使用了3个循环,但我想了解为什么这段代码不起作用,以及我错在哪里。

i不是数组的索引,而是数组的每个元素,因此可以直接使用i而不是integers[i]

此外,你应该return的结果,而不是打印它

以下是您的代码应该是什么样子:

fun find(integers: Array<Int>): Int {
var sumEven = 0
var sumOdd = 0

for (i in integers){
if(i % 2==0){
sumEven+=1
} else{
sumOdd+=1
}
}
if (sumEven > sumOdd){
for(i in integers){
if(i % 2 != 0){
return i
}
}
} else{
for(i in integers){
if(i % 2==0){
return i
}
}
}
error("This should never be reached")
}

然而,使用3个循环效率很低,而且代码总体上不太习惯。这里有一个更快的版本,通过数组最多进行一次迭代。

fun find(integers: Array<Int>): Int {
val firstParity = integers[0] % 2
val secondParity = integers[1] % 2
val thirdParity = integers[2] % 2
return when (firstParity) {
secondParity -> integers.first { it % 2 != firstParity }
thirdParity -> integers[1]
else -> integers[0]
}
}

这里的诀窍是,我们只需要比较前3个数字的奇偶性。

  • 如果第一个和第二个具有相同的奇偶校验,我们知道要返回的数字与第一个或第二个数字不具有相同的校验,并且在列表的其余部分中
  • 否则(即,第一个和第二个具有不同的奇偶性(,如果第一个数字和第三个数字具有相同的奇偶性,则我们知道第二个数字是异常值
  • 否则,只能是第二个和第三个具有相同奇偶性的情况,在这种情况下,第一个是异常值

相关内容

最新更新