题目:输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。 算法分析:在考虑到时间复杂度的同时,先使用定义一个数组存储要输入的字符串(空间主要浪费在这里),同时定义一个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;
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,,,,])
第一个参数为目标字符数组,第二个指定转化的数据格式,第三个任意类型的数据。
|