提问人:meWho 提问时间:12/5/2022 更新时间:12/6/2022 访问量:90
嵌套循环值 i 和 j Kotlin 的 Slice()
Slice() nested for loop values i and j Kotlin
问:
我想切出一个范围,我可以在 Javascfript 中完成,但在 kotlin 中苦苦挣扎。
我目前的代码是:
internal class blah {
fun longestPalindrome(s: String): String {
var longestP = ""
for (i in 0..s.length) {
for (j in 1..s.length) {
var subS = s.slice(i, j)
if (subS === subS.split("").reversed().joinToString("") && subS.length > longestP.length) {
longestP = subS
}
}
}
return longestP
}
我得到的错误是:
Type mismatch.
Required:
IntRange
Found:
Int
有没有办法解决这个问题,保留我拥有的大部分代码?
答:
1赞
Tenfour04
12/5/2022
#1
正如错误消息所说,需要一个 IntRange,而不是两个 Int。因此,给它传递一个范围:slice
var subS = s.slice(i..j)
顺便说一句,你的代码中有一些错误:
- 您需要迭代到长度减去 1,因为范围从 0 开始。但更简单的方法是直接抓取范围:
indices
for (i in s.indices)
- 我假设应该是或更大,而不是 1 或更大,否则您将冗余地检查一些倒置的字符串。它应该看起来像 .
j
i
for (j in i until s.length)
- 您需要使用 而不是 .第二个运算符用于引用相等,对于两个计算的字符串,即使它们相同,它们也始终为 false。
==
===
- 我知道这可能只是练习,但即使有上述修复,如果字符串包含任何多代码单元代码点或任何字素簇,此代码也会失败。正确的方法是将 String 转换为字素簇列表,然后执行算法,但这相当复杂,可能应该依赖于一些 String 处理代码库。
0赞
meWho
12/6/2022
#2
class Solution {
fun longestPalindrome(s: String): String {
var longestPal = ""
for (i in 0 until s.length) {
for (j in i + 1..s.length) {
val substring = s.substring(i, j)
if (substring == substring.reversed() && substring.length > longestPal.length) {
longestPal = substring
}
}
}
return longestPal
}
}
此代码现在可以运行,但不幸的是,它还没有经过足够的优化,无法通过所有测试用例。
评论
IntRange
slice
IntRange
i.rangeTo(j)
i..j