algorithm - 如何不在 Kotlin 中越界?

标签 algorithm kotlin

我得到了将当前元素与数组中的下一个元素进行比较的代码。但是它因越界而崩溃,因为我猜当它在最后一个元素上时没有下一个元素可以与之比较所以它崩溃了。如何处理这个以避免崩溃并停止对最后一个元素进行比较?这是我的代码

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 .

一些进一步的建议:

  • IntArrayArray<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/

相关文章:

algorithm - flajolet martin 素描是如何工作的?

javascript - 在 JavaScript 中从平面数组生成树结构(不使用对象引用)

string - 删除 kotlin 中的重音和变音符号

与 Kotlin、BaseObservable 和自定义委托(delegate)的 Android 数据绑定(bind)

android - EditText小部件滞后警报对话框的弹出速度

与 O-notation 的算法比较

algorithm - 如何找到 2 个数字的最高 GCD,使得这 2 个数字来自给定的数字范围?

使用泛型进行 Java 和 Kotlin 转换。失去类型安全

gradle - 尝试将木材添加到Kotlin项目中会导致多个 'Unable to resolve dependency for…' Gradle错误

algorithm - 实现 AMR 编码器