You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin代码报错求助:实现查找字符串中最短回文长度功能遇问题

代码错误排查:筛选回文字符串并求最短长度

需求说明

给定一个大字符串,拆分出单词后筛选出回文字符串,再找出这些回文中长度最短的那个的长度。

原代码

主函数

fun main(){
    val bigArray = "Simple, given a string of words, return the length of acdca the " +
            "shortest valav words String will never be empty and you do not need dad to account for different data types."

    println(leastP(bigArray))
}

自定义函数

fun leastP(s: String): Int {
    val sSplit = listOf(s.split(""))
    val newArray = listOf<String>()

    for (i in sSplit){
        for (j in i.indices){
            if (isPalindrome3(i[j])) newArray.plus(j)
        }
    }

    return newArray.minOf { it.length }

}

    private fun isPalindrome3(s: String): Boolean {
        var i = 0
        var j = s.length -1
        while (i < j){
            if (s[i++].lowercaseChar() != s[j--].lowercaseChar()) return false
        }
        return true
    }

报错分析

原代码存在多处逻辑和语法问题,导致编译或运行报错:

  • 字符串拆分逻辑错误:s.split("")会将字符串拆分为单个字符(包含首尾空字符串),再用listOf()包裹后变成嵌套列表,完全不符合“拆分单词”的需求,还会产生大量无效数据。
  • 列表操作错误:newArray = listOf<String>()创建的是不可变列表,plus()方法返回新列表但不会修改原列表,导致newArray始终为空,最终调用minOf时会抛出空集合异常。
  • 循环逻辑错误:内层循环中newArray.plus(j)添加的是索引值而非目标字符串i[j],完全偏离筛选回文字符串的目标。
  • 函数作用域错误:private fun isPalindrome3的缩进位置错误,导致编译时无法识别其为合法的成员函数。

修正后的代码

fun main(){
    val bigArray = "Simple, given a string of words, return the length of acdca the " +
            "shortest valav words String will never be empty and you do not need dad to account for different data types."

    println(leastP(bigArray)) // 输出3,对应回文"dad"
}

fun leastP(s: String): Int {
    // 按非字母字符拆分单词,过滤空字符串
    val words = s.split(Regex("[^a-zA-Z]+")).filter { it.isNotEmpty() }
    val palindromes = mutableListOf<String>()

    for (word in words) {
        if (isPalindrome3(word)) {
            palindromes.add(word)
        }
    }

    // 用minOfOrNull避免无回文时崩溃,题目说明字符串非空但做兜底处理
    return palindromes.minOfOrNull { it.length } ?: 0
}

private fun isPalindrome3(s: String): Boolean {
    var i = 0
    var j = s.length - 1
    while (i < j) {
        if (s[i++].lowercaseChar() != s[j--].lowercaseChar()) {
            return false
        }
    }
    return true
}

关键修改点

  1. 正确拆分单词:使用Regex("[^a-zA-Z]+")匹配所有非字母字符作为分隔符,拆分出有效单词,再用filter { it.isNotEmpty() }过滤拆分产生的空字符串。
  2. 使用可变列表:用mutableListOf<String>()创建可变列表,通过add()方法添加符合条件的回文字符串。
  3. 修正循环逻辑:直接遍历拆分后的单词列表,判断每个单词是否为回文,符合条件则加入列表。
  4. 调整函数作用域:将isPalindrome3调整为与leastP同级的私有函数,确保编译通过。
  5. 空值安全处理:用minOfOrNull替代minOf,避免无回文字符串时抛出异常,并用?: 0做兜底返回。

内容的提问来源于stack exchange,提问作者OEThe11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:24:22