检查字符串是否是回文(CodeSignal测试用例问题)

时间:2019-03-31 14:14:23

标签: c string

我正在使用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中测试了大量字符串,而且它们似乎是正确的。

3 个答案:

答案 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解决方案

  1. 给出的最小字符串长度为> 1
  2. 获取两个指向字符串的第一个和最后一个字符的指针
  3. 比较指针字符,并不断增加第一个指针,并不断减少最后一个指针,直到两个指针相遇
  4. 如果字符不匹配,则返回false,否则返回true
  5. O(n)时间| O(1)空间复杂度
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;


}