三千里外欲封侯 2023-12-14 20:40 采纳率: 86.4%
浏览 4
已结题

leetcode验证回文字符串


bool isPalindrome(char* s) 
{
    int len=strlen(s);
    int i=0;
    int j=0;
    for(i=0;i<len;i++)
    {
        if(*(s+i)<='z'&&*(s+i)>='a')
        s[j++]=*(s+i);
        else if(*(s+i)<='9'&&*(s+i)>='0')
        s[j++]=*(s+1);
        else if(*(s+i)<='Z'&&*(s+i)>='A')
        s[j++]=tolower(*(s+i));
    }
    int fast=j-1;
    int slow=0;
    while(fast>slow)
    {
        if(*(s+fast)!=*(s+slow))
        return false;
        fast--;
        slow++;
    }
    return true;
}

测试用例是1a2,就输出true,这是为啥,其他的测例都正常过

  • 写回答

1条回答 默认 最新

  • 游戏开发小Y Unity3D领域新星创作者 2023-12-14 20:45
    关注

    函数 isPalindrome 的目的是检查一个字符串是否是回文。它首先通过循环遍历字符串,移除所有非字母和非数字字符,并将所有大写字母转换为小写。然后,它使用两个指针(fastslow)从字符串的两端开始,向中间移动,比较字符是否相同。

    问题出在以下这段代码:

    else if(*(s+i)<='9'&&*(s+i)>='0')
        s[j++]=*(s+1);
    

    当字符是数字时,你应该将 *(s+i) 添加到 s[j++],但你却错误地添加了 *(s+1)。这会导致数字字符没有被正确地添加到新字符串中。

    为了修复这个问题,你应该将上述代码行改为:

    else if(*(s+i)<='9'&&*(s+i)>='0')
        s[j++]=*(s+i);
    

    现在,让我们看看测试用例 "1a2" 是如何处理的:

    1. 遍历字符串 "1a2":
      • '1' 是一个数字字符,但由于上述错误,它没有被添加到新字符串中。
      • 'a' 是一个小写字母,被添加到新字符串中。
      • '2' 是一个数字字符,同样由于错误,没有被添加到新字符串中。
    2. 新字符串现在是 "a",它是一个回文字符串。
    3. 使用 fastslow 指针检查新字符串 "a",确实是回文。
    4. 返回 true

    修复上述错误后,再次运行测试用例 "1a2" 将返回 false,因为修复后的代码将正确处理数字字符。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 创建了问题 12月14日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错