鱼C论坛

 找回密码
 立即注册
查看: 2471|回复: 5

[已解决]力扣C语言简单问题

[复制链接]
发表于 2020-4-25 11:46:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
代码:
  1. bool isPalindrome(char * s){
  2.     if(s==NULL){//空字符串为有效回文串
  3.         return true;
  4.     }
  5.     char s1[sizeof(s)];
  6.     char s2[sizeof(s)];
  7.     int t=0;int p=0;
  8.     for(int i=0;i<sizeof(s);i++){//将字符串中字符变小写后正着输入新字符串
  9.         if(s[i]>='A'&&s[i]<='Z'){
  10.             s[i]=s[i]+32;
  11.         }
  12.         if((s[i]>='a'&&s[i]<='z')){
  13.             s1[t]=s[i];
  14.             t=t+1;
  15.         }   
  16.     }
  17.     for(int j=(sizeof(s)-1);j>=0;j--){//将字符串中字符变小写后倒着输入新字符串
  18.         if(s[j]>='A'&&s[j]<='Z'){
  19.             s[j]=s[j]+32;
  20.         }
  21.         if((s[j]>='a'&&s[j]<='z')){
  22.             s2[p]=s[j];
  23.             p=p+1;
  24.         }
  25.     }
  26.     if(s1==s2){//判断两个新字符串是否相等
  27.         return true;
  28.     }
  29.     else
  30.     {
  31.         return false;
  32.     }
  33. }
复制代码

我这个东西有什么问题那?输入"A man, a plan, a canal: Panama"后应该是true,我的代码却是false,找不出问题。
最佳答案
2020-4-25 12:54:27
问题很多啊。不一一列举了
字符串操作最好使用专用的函数库 string.h
帮你修改了。
  1. #include <stdio.h>
  2. #include <string.h>
  3. bool isPalindrome(char * s){
  4.     if(s==NULL){//空字符串为有效回文串
  5.         return true;
  6.     }
  7.     int len=strlen(s);
  8.     char s1[len+1];
  9.     char s2[len+1];
  10.     int t=0;int p=0;
  11.     for(int i=0;i<len;i++){//将字符串中字符变小写后正着输入新字符串
  12.         if(s[i]>='A'&&s[i]<='Z'){
  13.             s[i]=s[i]+32;
  14.         }
  15.         if((s[i]>='a'&&s[i]<='z')){
  16.             s1[t]=s[i];
  17.             t=t+1;
  18.         }
  19.     }
  20.     s1[t]='\0';

  21.     for(int j=len;j>=0;j--){//将字符串中字符变小写后倒着输入新字符串
  22.         if(s[j]>='A'&&s[j]<='Z'){
  23.             s[j]=s[j]+32;
  24.         }
  25.         if((s[j]>='a'&&s[j]<='z')){
  26.             s2[p]=s[j];
  27.             p=p+1;
  28.         }
  29.     }
  30.     s2[p]='\0';
  31.     if(strcmp(s1,s2)){//判断两个新字符串是否相等
  32.         return false;
  33.     }
  34.     else
  35.     {
  36.         return true;
  37.     }
  38. }
  39. int main(void) {
  40.     char str[100]={'\0'};
  41.     strcpy(str,"A man, a plan, a canal: Panama");
  42.     if (isPalindrome(str))
  43.         printf("YES");
  44.     else
  45.         printf("NO");
  46.         return 0;
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 12:54:27 | 显示全部楼层    本楼为最佳答案   
问题很多啊。不一一列举了
字符串操作最好使用专用的函数库 string.h
帮你修改了。
  1. #include <stdio.h>
  2. #include <string.h>
  3. bool isPalindrome(char * s){
  4.     if(s==NULL){//空字符串为有效回文串
  5.         return true;
  6.     }
  7.     int len=strlen(s);
  8.     char s1[len+1];
  9.     char s2[len+1];
  10.     int t=0;int p=0;
  11.     for(int i=0;i<len;i++){//将字符串中字符变小写后正着输入新字符串
  12.         if(s[i]>='A'&&s[i]<='Z'){
  13.             s[i]=s[i]+32;
  14.         }
  15.         if((s[i]>='a'&&s[i]<='z')){
  16.             s1[t]=s[i];
  17.             t=t+1;
  18.         }
  19.     }
  20.     s1[t]='\0';

  21.     for(int j=len;j>=0;j--){//将字符串中字符变小写后倒着输入新字符串
  22.         if(s[j]>='A'&&s[j]<='Z'){
  23.             s[j]=s[j]+32;
  24.         }
  25.         if((s[j]>='a'&&s[j]<='z')){
  26.             s2[p]=s[j];
  27.             p=p+1;
  28.         }
  29.     }
  30.     s2[p]='\0';
  31.     if(strcmp(s1,s2)){//判断两个新字符串是否相等
  32.         return false;
  33.     }
  34.     else
  35.     {
  36.         return true;
  37.     }
  38. }
  39. int main(void) {
  40.     char str[100]={'\0'};
  41.     strcpy(str,"A man, a plan, a canal: Panama");
  42.     if (isPalindrome(str))
  43.         printf("YES");
  44.     else
  45.         printf("NO");
  46.         return 0;
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-25 16:07:39 | 显示全部楼层
sunrise085 发表于 2020-4-25 12:54
问题很多啊。不一一列举了
字符串操作最好使用专用的函数库 string.h
帮你修改了。

你的代码中s1[t]='\0'和s2[p]='\0'这两步是要干什么那,不太懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-25 16:14:32 | 显示全部楼层
害羞的新手 发表于 2020-4-25 16:07
你的代码中s1[t]='\0'和s2='\0'这两步是要干什么那,不太懂

还有到这输入时既然是从0开始的,为什么要j=len而不是j=len-1呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-25 16:18:28 | 显示全部楼层
本帖最后由 sunrise085 于 2020-4-25 16:56 编辑
害羞的新手 发表于 2020-4-25 16:07
你的代码中s1[t]='\0'和s2='\0'这两步是要干什么那,不太懂


设置字符串的结尾字符。否则的话,printf或者strcmp可能会出错
因为printf打印%s时,是遇到'\0'才结束的。
strcmp比较字符串大小,若前面字符都一致,遇到'\0'就不再比较了。否则,本来相同的两个字符串,因为没有结束字符,会越界对未知的单元行比较,而未知的单元一般是不一样的,那么结果就出错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-4-25 16:32:41 | 显示全部楼层
sunrise085 发表于 2020-4-25 16:18
设置字符串的结尾字符。否则的话,printf或者strcmp可能会出错
因为printf打印%s时,是遇到'\0'才结束的 ...

我懂了,但是在DVC++上用你这串代码输"OP"时输出no
在力扣上把代码打进去显示"OP"却是错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 10:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表