检查回文数的奇偶性?

9

检查回文数/字符串的奇偶长度是否是个好主意?大多数我找到的片段都没有执行这个基本测试。如果长度是偶数,它不能是回文吧?

if len(var) % 2 != 0:
  # could be a palindrome, continue...
else:
  break

还是直接比较第一个和最后一个数字/字母更好(即更快)?

编辑:好的,这是个愚蠢的问题,我应该再想一次! :)


6
医生,注意了,我持不同意见!快速节食并不能防止肥胖,我以鳕鱼为食进行减肥。 - Dave Jarvis
8个回答

25

ABBA - 一个四个字母的回文例子,表示长度为偶数。

回文是指一个单词、短语、数字或其他字符序列,在正反方向上阅读时都相同的特性...


6
请注意,如果你将任何单词正着和反着重复,无论它的长度是偶数还是奇数,组合后的单词都会有偶数长度,例如hello = helloolleh。 - Andrew Noyes
12
我从没想过这可能是一个编程问题的有效答案。 - James Brooks
4
@James "Dave Jarvis"修改了答案并放置了一个链接,原始答案非常有意义。 - eozzy
哈哈,我的原始答案形成了一个实际的句子,你做了什么?!?不错的链接! - TabbyCool
1
这应该是争取“最短被接受答案”奖项的候选之一。 - LarsH

10

检查回文最简单的方法是将字符串与它的反转进行比较:

def ispalindrome(s):
   return s == s[::-1]

这里使用了带有负步长的扩展切片,以反向遍历 s 并获取其反转结果。


2
你是不是想要两个等号(用于布尔返回值)?return s == s[::-1] - tgray
使用“==”而不是“=”。 - cmaynard

8

baab = 回文且长度为4,且长度为偶数


1
没有,我们也可以使用“baaaab” - 这仍然是一个回文。 - Aly
"b" 也是回文。"" 也是回文。唉。 - John Machin
@John,"b" 的长度是奇数。天哪。 - Nick Dandoulakis
2
@Nick:改一下措辞:回文可以是任意长度(甚至为0)。 - John Machin
回文并不需要偶数长度,它只需要在两个方向上读起来一样。天哪。http://zh.wikipedia.org/wiki/%E5%9B%9E%E6%96%87 - mynameiscoffey
显示剩余2条评论

3

试试这个:

is_palindrome = lambda s : all(s1==s2 for s1,s2 in zip(s[:len(s)/2],s[-1:-(len(s)+1)/2:-1]))

只检查前一半和后一半,并在发现不匹配时立即短路。

这个解决方案的内存占用与@sth的简单实现一样多,速度约为其1/10,并且认为“ab”是回文。以下是更好的解决方案,只有固定的内存开销:all(s[i]==s[-i-1] for i in range(len(s)//2))。它比你的示例还要快大约20%。 - Andrew Dalke
哎呀!我的测试有点儿过于简略 - 我已经编辑了我的答案,现在测试"ab"会失败。我最近的偏好是迭代元素,而不是使用整数下标进行索引,我想我将采用一个从字符串两端向内移动的生成器稍微不同的运行方式。 - PaulMcG
尝试使用islice、izip和reversed?all(c1 == c2 for c1、c2 in islice(izip(s,reversed(s)),0,len(s)//2)) - Andrew Dalke

2

简单情况:aa。

更复杂的情况:aaaa。

等等。


2
每当我读到“aa”时,我就会下意识地说“pahoehoe”。 - Andrew Dalke

2
如果字符串长度为偶数,则所有字符计数都应该是偶数,因此我们不能有一个字符的计数是奇数。
如果字符串长度为奇数,则一个字符计数必须是奇数,因此不是所有字符的计数都应该是偶数。
--------------- 我为后续角色实现了以下JavaScript代码:
function isStrPermutationOfPalindrome(_str) { // backward = forward
    var isPermutationOfPalindrome = true;
    var _strArr = [..._str];
    var _strArrLength = _strArr.length;
    var counterTable = getCharsTabularFrequencies(_str);
    var countOdd = 0;
    var countEven = 0;
    for (let [ky, val] of counterTable) {
        if (val % 2 == 0) {
            countEven = countEven + 1;
        } else {
            countOdd = countOdd + 1;
        }
    }
    if (_strArrLength % 2 == 0) {
        //Even count of all characters,otherwise false.
        //so can not have a character with odd count.
        if (countOdd != 0) {
            isPermutationOfPalindrome = false;
        }

    } else {
        //Odd count of 1 character
        //so not all chars with even count, only one char of odd count.

        if (countOdd > 1 || countOdd == 0) { //no odd, or more than one odd [ only one odd should be to return true]
            isPermutationOfPalindrome = false;
        }
    }
    return isPermutationOfPalindrome;
}


function getCharsTabularFrequencies(str) {
    str = str.toLowerCase();
    var arr = Object.assign([], str);
    var oMap = new Map();
    var _charCount = 0;
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === ' ') {
            continue;
        }
        _charCount = 0;
        for (let j = 1; j < arr.length; j++) {
            {
                if (arr[i] === arr[j]) {
                    _charCount = _charCount + 1;
                }
            }
        }
        if (i == 0)
            _charCount = _charCount + 1;
        if (!oMap.has(arr[i]))
            oMap.set(arr[i], _charCount)
    }
    return oMap;
}

let _str = 'tactcoapapa';
console.log("Is a string of '" + _str + "' is a permutation of a palindrome ? ANSWER => " + isStrPermutationOfPalindrome(_str));

1
感谢您实际解释计算偶数和奇数字符背后的目的。 - Omar Himada

1

长度为偶数的字符串也可以是回文。维基百科没有关于此限制的说明。


0
n=raw_input("Enter a string==>")
n=int(n)

start=0
term=n

while n>0:
    result=n%10
    start=start*10+result
    n=n/10

print start

if term==start:
    print "True"
else:
    print "False"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接