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

