我正在使用CodeSignal来测试我的编码能力,但是遇到了一个问题。
现在,我正在尝试检查字符串是否是回文。
我已经写了应该可以工作的代码,但是1个测试用例一直失败。因此,19/20
测试用例可以正常工作,但是最后一个不能用(不确定哪个用例被隐藏以防止硬编码)。
checkPalindrome(char * inputString) {
char temp[strlen(inputString) + 1];
int d = 0;
for (int i = strlen(inputString) - 1; i >= 0; i--, d++)
temp[d] = inputString[i];
if (strcmp(temp, inputString) == 0)
return 1;
else return 0;
}
我不确定为什么1个测试用例会一直失败,我已经在CodeBlocks中测试了大量字符串,而且它们似乎是正确的。
答案 0 :(得分:1)
您在循环中遇到了问题。如果inputString
为空,则strlen(inputString)
为无符号长0。在无符号和有符号之间的运算符返回无符号的情况下,两个参数都强制转换为无符号。因此,(unsigned long)0 - (int)1
是(unsigned long)0 - (unsigned long)1
,它是2 64 -1(如果unsigned long
是8字节)。
当心有符号和无符号数字之间的运算符!
我知道更糟糕的例子:
int foo = -1;
unsigned bar = 0;
if (foo >= bar)
cout << "-1 >= 0" << endl;
else
cout << "-1 < 0" << endl;
猜猜这段代码会打印什么。
PS:评论中写的也是正确的。
答案 1 :(得分:0)
在一个变量而不是两个变量上运行for循环会更好。
checkPalindrome(char * inputString) {
int len = strlen(inputString);
char temp[len+1];
temp[len] = '\0';
for(int i = 0; i < len; i++){
temp[i] = inputString[len-1-i];
}
if (strcmp(temp, inputString) == 0)
return 1;
else return 0;
}
答案 2 :(得分:-1)
C解决方案
bool checkPalindrome(char * s) {
char *q = s + strlen(s) - 1;
while (q > s) {
if (*q-- != *s++)
return false;
}
return true;
}
JavaScript解决方案
function checkPalindrome(inputString) {
if(inputString.length === 1)
return true
let leftIdx = 0
let rightIdx = inputString.length - 1
while(leftIdx < rightIdx) {
if(inputString[leftIdx] === inputString[rightIdx]) {
leftIdx++;
rightIdx--;
} else
return false;
}
return true;
}