问题是:您得到一个包含整数的数组(其长度至少为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个数字的奇偶性。
- 如果第一个和第二个具有相同的奇偶校验,我们知道要返回的数字与第一个或第二个数字不具有相同的校验,并且在列表的其余部分中
- 否则(即,第一个和第二个具有不同的奇偶性(,如果第一个数字和第三个数字具有相同的奇偶性,则我们知道第二个数字是异常值
- 否则,只能是第二个和第三个具有相同奇偶性的情况,在这种情况下,第一个是异常值