我得到了将当前元素与数组中的下一个元素进行比较的代码。但是它因越界而崩溃,因为我猜当它在最后一个元素上时没有下一个元素可以与之比较所以它崩溃了。如何处理这个以避免崩溃并停止对最后一个元素进行比较?这是我的代码
fun myFunction(arr: Array<Int>): Int{
if (arr.isEmpty()) return 0
var result = 0
for (item in arr.indices) {
if (arr[item] > 0 && arr[item + 1] < 0){
result ++
}
if (arr[item] < 0 && arr[item + 1] > 0){
result ++
}
}
return result
}
最佳答案
您问题的直接答案:
代替
for (item in arr.indices)
你应该写
for (item in 0..(arr.lastIndex - 1))
解释:arr.indices
返回范围 0..arr.lastIndex
但是在循环中,您正在检查当前索引之后的元素;因此你最多只能到arr.lastIndex - 1
.
一些进一步的建议:
IntArray
比Array<Int>
更有效率你可以把两者结合起来
if
使用||
将语句合并为一个(或)运算符。如果您要计算符号变化的次数,则需要考虑如何解释 0。在您的代码中,输入
[1,-1]
会给出 1 个符号变化的结果,但是[1,0,-1]
会给出 0,这似乎是错误的。要解决这个问题,请将 0 视为正值:
if ((arr[item] >= 0 && arr[item + 1] < 0) || arr[item] < 0 && arr[item + 1] >= 0) {
result++
}
你不需要检查数组是否为空;只需删除该行。如果数组为空或只有 1 个元素,则不会进入循环。
最后,您可以使用标准库的一些很酷的功能(在文档中查找它们以了解它们),这可以使您的函数简洁:
fun myFunction(arr: IntArray): Int {
var result = 0
arr.asList().zipWithNext().forEach { (a, b) ->
if ((a >= 0 && b < 0) || (a < 0 && b >= 0))
result++
}
return result
}
更简洁的是:
fun myFunction(arr: IntArray) =
arr.asList().zipWithNext().count { (a, b) -> (a >= 0) != (b >= 0) }
引用文献:single-expression functions , zipWithNext , count , destructuring .
关于algorithm - 如何不在 Kotlin 中越界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72986409/