题目:输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。
算法分析:在考虑到时间复杂度的同时,先使用定义一个数组存储要输入的字符串(空间主要浪费在这里),同时定义一个prior
和end
指针分别指向字符串的头部和尾部,头部和尾部指针依次向中间(strlen(str)/2)
靠拢。这样的时间复杂度缩短一半。
代码实现:
#include <stdio.h>
#include <stdlib.h>
//判断是否是回文字符串(不考虑健壮性)
int main()
{
printf("please enter a string:\n");
char str[100];//定义一个字符数组接收键盘输入的字符串
scanf("%s",&str);
char *prior,*end,i;//定义头部和尾部指针,类型是char
prior=str;
end=str+strlen(str)-1;
for(i=0;i<=strlen(str)/2; i++)
{
if(*prior==*end)
{
prior++;
end--;
}
else
{
printf("不是回文字符");
break;
}
}
if(i>strlen(str)/2)
printf("是回文字符");
return 0;
}
注意:
1.指针定义必须是char
型。
2.设置尾部指针时应当注意,str=str[0]
, 因此设置尾部指针时str+strlen(str)
必须减1
才是字符串的尾部。
-------------------------------------------分割线------------------------------------------------------------------
变形和改进:
题目来源leetcode:判断回文数,如果是,返回true,否则返回false。
代码如下:
bool isPalindrome(int x)
{//判断回文字符--->判断回文数
char str[100];
char *prior,*end;
int i;
sprintf(str,"%d",x);
prior=str;
end=str+strlen(str)-1;
for(i=0;i<=strlen(str)/2; i++)
{
if(*prior==*end)
{
prior++;
end--;
}
else
return false;
}
return true;
}
分析:基本算法思想不变,主要是关于sprintf()
函数的用法
#include <stdio.h>
int sprintf(char *string, char *format, [argument1,2,,,,])
//将格式化数据写入字符串string
第一个参数为目标字符数组,第二个指定转化的数据格式,第三个任意类型的数据。