首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试过检查有效回文字符串问题,使用kotlin解决,但是有一个测试案例没有通过,我试了几次

试过检查有效回文字符串问题,使用kotlin解决,但是有一个测试案例没有通过,我试了几次
EN

Stack Overflow用户
提问于 2022-08-13 16:01:28
回答 2查看 175关注 0票数 0

如果在将所有大写字母转换为小写字母并删除所有非字母数字字符后,短语是一个回文,则它读取相同的前后向。字母数字字符包括字母和数字。

给定字符串s,如果是回文,则返回true,否则返回false。

示例1:

输入:S=“一个人,一个计划,一个运河:巴拿马”输出:真正的解释:"amanaplanacanalpanama“是一个回文。示例2:

输入:s=“赛车”输出:错误解释:"raceacar“不是回文。

myCode

代码语言:javascript
复制
class Solution {
      fun isPalindrome(s:String):Boolean {
    var s1 = s.toLowerCase()
    var myStringBuilder = StringBuilder()
    var n = s1.length-1
    var n1=myStringBuilder.length

    for ( i in 0..n) {
        if (Character.isLetterOrDigit(s1[i])) {
            myStringBuilder.append(s1[i])
        }
    }
     for( i in 0 .. (n1/2)-1){
            if(myStringBuilder[i] != myStringBuilder[n1-i-1]){
                return false
            }
     } 
        return true
}
}

第一个情况已通过,但这不是按照结果输入传递的:s=“竞赛--预期为true的汽车结果为false

EN

回答 2

Stack Overflow用户

发布于 2022-08-13 16:30:46

您可以使用这个简单的解决方案。

代码语言:javascript
复制
fun isPalindrome(s:String):Boolean {
    val str = s.filter { it.isLetterOrDigit() }.lowercase()
    for (i in 0..str.length/2 ){
        if (str[i]!=str[str.length-i-1])
            return false
    }
    return true
}

编辑:通过@cactustictacs注释,您可以以更简单的方式完成这一任务。

代码语言:javascript
复制
fun isPalindrome(s:String):Boolean {
    val str = s.filter { it.isLetterOrDigit() }.lowercase()
    return str == str.reversed()
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-13 17:09:31

您初始化n1太早了:

代码语言:javascript
复制
// create an -empty- StringBuilder
var myStringBuilder = StringBuilder()
...
// since it's empty, n1 == 0
var n1=myStringBuilder.length

在实际放置任何内容之前,将其设置为StringBuilder内容的长度。这是您正在设置的一个简单值,它不是对访问当前值的length getter的引用。你设定了一次,这就是它的价值永远。

因此,您的最后一个循环,即检查它是否为回文的循环,从未实际运行:

代码语言:javascript
复制
// since n1 is 0, this is for (i in 0..0)
for( i in 0 .. (n1/2)-1){

在将内容添加到n1之后,您可以通过初始化StringBuilder来修复它,这样您就可以获得它的最终长度:

代码语言:javascript
复制
for ( i in 0..n) {
    if (Character.isLetterOrDigit(s1[i])) {
        myStringBuilder.append(s1[i])
    }
}

// StringBuilder is complete, grab its final length
var n1 = myStringBuilder.length

// now you can use it
for (i in 0..(n1/2)-1) {

只有fyi,还有一个until操作符,它的工作方式类似于..,只是它不包括范围的最后一个值。所以你可以写

for (i in 0 until (n1/2))

如果你愿意的话!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73345773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档