Python 是否检查回文的偶数/奇数?
检查回文数字/字符串的奇偶长度是一个好主意吗?我遇到的大多数代码片段都不做这个基本测试。如果长度是偶数,就不能是回文,不是吗Python 是否检查回文的偶数/奇数?,python,testing,palindrome,Python,Testing,Palindrome,检查回文数字/字符串的奇偶长度是一个好主意吗?我遇到的大多数代码片段都不做这个基本测试。如果长度是偶数,就不能是回文,不是吗 if len(var) % 2 != 0: # could be a palindrome, continue... else: break 还是直接比较第一个和最后一个数字/字母更好(即更快) 编辑:好吧,愚蠢的问题,应该三思而后行!:) baab=回文,长度为4,是偶数偶数长度字符串也可以是回文。没有说明任何有关此限制的内容。-四个字母表示偶数长度的示例 回
if len(var) % 2 != 0:
# could be a palindrome, continue...
else:
break
还是直接比较第一个和最后一个数字/字母更好(即更快)
编辑:好吧,愚蠢的问题,应该三思而后行!:) baab=回文,长度为4,是偶数偶数长度字符串也可以是回文。没有说明任何有关此限制的内容。-四个字母表示偶数长度的示例 回文是一个单词、短语或其他序列,它们的前后读写相同
检查回文的最简单方法是简单地将字符串与其反面进行比较:
def ispalindrome(s):
return s == s[::-1]
这使用带有负步长的扩展切片向后遍历s
,得到相反的结果。简单情况:aa
更复杂的情况:aaaa
等等。试试这个:
is_palindrome = lambda s : all(s1==s2 for s1,s2 in zip(s[:len(s)/2],s[-1:-(len(s)+1)/2:-1]))
只检查前半部和后半部,发现不匹配时立即短路。如果string.length为偶数,则:所有字符计数都应为偶数,因此不能有奇数字符
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"
如果string.length为奇数,则:一个字符计数必须为奇数,因此并非所有字符的计数都应为偶数
---------------我为后续角色实现了以下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));
函数是并排排列(_str){//backward=forward
var isPermutationOfPalindrome=true;
var _strArr=[…_str];
var _strArrLength=_strArr.length;
var计数器表=getCharsTabularFrequencies(_str);
var countOdd=0;
var Count偶数=0;
for(让[ky,val]进入台面){
如果(值%2==0){
count偶数=count偶数+1;
}否则{
countOdd=countOdd+1;
}
}
如果(_strArrLength%2==0){
//所有字符的偶数计数,否则为false。
//所以不能有奇数的字符。
if(countOdd!=0){
IsPermutationofAlindrome=false;
}
}否则{
//1个字符的奇数计数
//所以不是所有字符都是偶数,只有一个字符是奇数。
如果(countOdd>1 | | countOdd==0){//无奇数,或多于一个奇数[只有一个奇数应返回true]
IsPermutationofAlindrome=false;
}
}
返回Alindrome的isPermutationofAlindrome;
}
函数getCharsTabularFrequencies(str){
str=str.toLowerCase();
var arr=Object.assign([],str);
var oMap=新映射();
var_charCount=0;
for(设i=0;i”+ISSTRPermutationofAlindrome(_str));
还考虑到,如果你向后重复任何单词,不管它是否有偶数或奇数长度,组合词将有一个偶数的长度,例如Hello=HeloLoLH。我决不会猜到这可能是一个与编程有关的问题的有效答案。@杰姆斯“Dave Jarvis”修改了答案并放置了一个链接,原来的答案很有意思。哈哈,我原来的答案形成了一个真实的句子,你做了什么?!?链接不错!这应该是“最短可接受答案”奖。博士,注意,我不同意!禁食并不能防止肥胖,我以鳕鱼为主食。不,或者我们可以吃baaaab-这仍然是回文BB也是回文:-)“b”也是回文。“”也是回文。嘘。@John,“b”的长度很奇怪。嘘。@Nick:重写:回文可以有任何长度(甚至0)。您想要两个等号吗(对于布尔返回值)returns s==s[:-1]
use==not=(更多字符以使堆栈溢出愉快)每当我读到“aa”时,我会下意识地说“pahoehoe”。这个解决方案占用的内存与@sth:更简单的实现一样多,大约是速度的1/10,并且说“ab”是回文。这里有一个只有固定内存开销的更好的解决方案:范围(len(s)//2)内i的all(s[i]==s[-i-1])。它也比你的例子快20%左右。哎哟!我的测试有点太轻了——我编辑了我的答案,现在测试“ab”失败了。我最近更倾向于对元素进行迭代,而不是使用整型下标进行索引,我想我将使用一个从字符串两端进入的生成器对此进行稍微不同的运行。尝试islice、izip和reversed?all(c1==c2表示c1,islice中的c2(izip(s,reversed(s)),0,len(s)//2))感谢您实际解释了计算偶数和奇数字符的目的