【问题标题】:Can I please get some feedback on this `isPalindrome()` function in C?我能得到一些关于 C 中这个 `isPalindrome()` 函数的反馈吗?
【发布时间】:2010-10-29 01:11:47
【问题描述】:

我正在用 C 编写一些有用的函数。其中之一是 isPalindrome()

我想确定一个数字是否是回文,我应该...

  • 获取数组中的所有数字
  • 使用两个索引进行迭代 - 一个从 0 开始,一个从数组计数开始
  • 增加/减少索引,同时在数组匹配时为数组下标,如果数组计数为 0,我们就有一个回文(即完成遍历所有数字)。

我想出了...

int isPalindrome(int num) {

    int places[100];
    int i = 0;
    while (num > 0) {
        places[i++] = num % 10; 
        num /= 10;
    }

    int j = 0;
    while (i >= 0 && places[j++] == places[--i]) {
    }
    return i == -1;

}

这通常是如何完成的?

我正在自学 C,虽然我可以知道我的代码何时编译并且不需要花费一整天的时间来解决问题,但我没有任何专家的眼睛可以告诉我如果我走在正确的轨道上。

那么,对我的代码有什么改进或建议吗?

非常感谢!

【问题讨论】:

  • IsPalindrome 是一个有用的函数吗?为了谁? ;-)
  • @Steven:它可能对从事Project Euler 挑战的人有用。 :)
  • 欧拉计划我写这个的原因:)
  • 对于places,可能不需要100元素,因为输入的是int,而INT_MAX = +2,147,483,647只有10个位数,
  • @Greg 我们对“有用”的定义截然不同;-)

标签: c palindrome


【解决方案1】:

您只需要在 i > j 时循环。一次i <= j,您只是再次检查所有字符。

【讨论】:

  • @pmg: 当 i == j 比较总是正确的。
  • @Jeremy:是的,但这是第一次进行比较。
【解决方案2】:

虽然在下面使用内联 ++-- 运算符可能看起来很聪明:

while (i >= 0 && places[j++] == places[--i]) { 
} 

如果你把这些放在循环体中,你的代码会更容易阅读:

while (i >= 0 && places[j] == places[i-1]) { 
    j++;
    i--;
} 

这样,代码的读者不必考虑在条件测试中更改ij 的值可能产生的副作用。可能对编译代码的速度没有可测量的影响(尽管,如果性能对这个函数很重要,你应该检查你的编译器)。

另外,如果i == 0,您将访问places[-1]

【讨论】:

    【解决方案3】:

    我只是使用sprintf 来“将字符串转换为数字”:

    char places[100];
    sprintf(places, "%i", num);
    i = strlen(places);
    

    【讨论】:

    • 谢谢,这看起来很有用。不幸的是,我在编写代码时并不知道这一点。
    【解决方案4】:

    在java中

    static boolean isPalindrome(String p) {
        return p.equals(new StringBuilder(p).reverse().toString());
    }
    

    在 c++ 和 c 中

    int IsPalindrome(char *string) {
        int bottom = 0, top;
    
        top = strlen(string) - 1;
        while(bottom < top && string[bottom] == string[top]) {
            ++bottom;
            --top;
        }
        return (bottom >= top ? 1:0);
    }
    

    注意,如果您需要为数字输入执行此操作,则需要编写 itoa 函数。或使用 (link)。

    一般情况下就是这样。这也适用于所有基地,而不仅仅是 10。

    【讨论】:

    • 当我们讨论其他语言的主题时......在 scala -> def isPalindrome(p: String) = p.equals(p.reverse)
    • 我可能的回文不是字符串,而是'int'。
    • 如果你的意思是越短越好,那么在 J 中它是:((-:|.)@:":)"0
    • @alex 是的,我认为这是错误。
    • 在 C++ 中,我会使用 std::string 而不是 char*,然后使用 begin/rbegin 来获取正向和反向迭代器,或者制作字符串的 reverse_copy,然后进行比较为 Java 解决方案做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多