我正在准备我的面试,并从简单的C编程问题开始工作。我遇到的一个问题是检查给定的字符串是否是回文。我写了一个代码来查找用户指定字符串是否是使用指针的回文。我想知道这是否是运行时方面的有效方法,还是我可以做的任何增强。如果有人建议如何在使用指针时删除除字母之外的其他字符(如撇号comas),那将是很好的。我在下面添加了我的功能。它接受一个指向字符串的指针作为参数并返回整数。
int palindrome(char* string)
{
char *ptr1=string;
char *ptr2=string+strlen(string)-1;
while(ptr2>ptr1){
if(tolower(*ptr1)!=tolower(*ptr2)){
return(0);
}
ptr1++;ptr2--;
}
return(1);
}
答案 0 :(得分:5)
“如何删除除字母以外的其他字符?”
我认为您不想实际删除它,只需跳过它就可以使用isalpha
来执行此操作。另请注意,条件ptr2 > ptr1
仅适用于abba
等字符数较多的字符串,但对于abcba
等字符串,条件应为ptr2 >= ptr1
:
int palindrome(char* string)
{
size_t len = strlen(string);
// handle empty string and string of length 1:
if (len == 0) return 0;
if (len == 1) return 1;
char *ptr1 = string;
char *ptr2 = string + len - 1;
while(ptr2 >= ptr1) {
if (!isalpha(*ptr2)) {
ptr2--;
continue;
}
if (!isalpha(*ptr1)) {
ptr1++;
continue;
}
if( tolower(*ptr1) != tolower(*ptr2)) {
return 0;
}
ptr1++; ptr2--;
}
return 1;
}
您可能需要#include <ctype.h>
答案 1 :(得分:0)
如果你只想使用指针来做这样的事情怎么样:
int main()
{
char str[100];
char *p,*t;
printf("Your string : ");
gets(str);
for(p=str ; *p!=NULL ; p++);
for(t=str, p-- ; p>=t; )
{
if(*p==*t)
{
p--;
t++;
}
else
break;
}
if(t>p)
printf("\nPalindrome");
else
printf("\nNot a palindrome");
getch();
return 0;
}
答案 2 :(得分:0)
int main()
{
const char *p = "MALAYALAM";
int count = 0;
int len = strlen(p);
for(int i = 0; i < len; i++ )
{
if(p[i] == p[len - i - 1])
count++;
}
cout << "Count: " << count;
if(count == len)
cout << "Palindrome";
else
cout << "Not Palindrome";
return 0;
}
答案 3 :(得分:-1)
我实际上已经对这类问题进行了很多实验。
可以做两种优化:
以下是代码草案,您可以如何进行矢量化:
int palindrome(char* string)
{
size_t length = strlen(string);
if (length >= sizeof(uintptr_t)) { // if the string fits into a vector
uintptr_t * ptr1 = (uintptr_t*)string;
size_t length_v /= sizeof(uintptr_t);
uintptr_t * ptr2 = (uintptr_t*)(string + (length - (length_v * sizeof(uintptr_t)))) + length_v - 1;
while(ptr2>ptr1){
if(*ptr1 != bswap(*ptr2)){ // byte swap for your word length, x86 has an instruction for it, needs to be defined separately
return(0);
}
ptr1++;ptr2--;
}
} else {
// standard byte by byte comparison
}
return(1);
}