这是我的答案。但是,我无法通过"11"的测试用例。 我找不到代码中的问题。请帮忙!谢谢!
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x === 0) {
return true;
}
if (x < 0 || x % 10 === 0) {
return false;
}
let rev = 0;
while (x > rev) {
pop = x % 10;
x = x / 10;
rev = (rev * 10) + pop;
}
if (x === rev || x === rev / 10) {
return true;
}
else {
return false;
}
};
查找回文本质上是你通常使用字符串而不是数字变量做的事情,所以我建议将你的数字转换为字符串,然后从那里开始:
var isPalindrome = function(x) {
x = x + ""; // convert to string, if x be a number
var isPalindrome = true;
for (i = 0; i < x.length/2; i++) {
if (x.substring(i, i+1) != x.substring(x.length-1-i, x.length-i)) {
isPalindrome = false;
break;
}
}
return isPalindrome;
}
console.log(isPalindrome(1234321));
console.log(isPalindrome(1234329));
这里的策略只是迭代一半的字符串,并断言每个字符与另一半中的对应字符匹配。 请注意,对于具有奇数个字符的输入,我们不需要检查中间字符。
您的问题似乎是 LeetCode 9,在讨论板中,有很好的公认解决方案,例如:
JavaScript
var isPalindrome = function(x) {
if (x < 0)
return false;
let reversed = 0;
for (let i = x; i > 0; i = Math.floor(i / 10))
reversed = reversed * 10 + i % 10;
return reversed === x;
};
蟒
class Solution:
def isPalindrome(self, x):
if x < 0 or (x > 0 and not x % 10):
return False
return str(x) == str(x)[::-1]
爪哇岛
class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x != 0 && x % 10 == 0))
return false;
int reversed = 0;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return (x == reversed || x == reversed / 10);
}
}
还有一个类似的回文问题,如果你有兴趣,我刚刚复制了下面:
JavaScript I
var isPalindrome = function(s) {
var original = s.replace(/W/g, ''); // means NON-WORD characters
var reversed = original.split('').reverse().join('');
return original.toLowerCase() == reversed.toLowerCase();
};
JavaScript II
var isPalindrome = function(s) {
var original = s.replace(/[^a-z0-9]/isg, '');
var reversed = original.split('').reverse().join('');
return original.toLowerCase() == reversed.toLowerCase();
};
爪哇岛
class Solution {
public boolean isPalindrome(String s) {
String original = s.replaceAll("(?i)[^a-z0-9]", "").toLowerCase();
String reversed = new StringBuffer(original).reverse().toString();
return original.equals(reversed);
}
}
蟒
class Solution:
def isPalindrome(self, s):
s = ''.join(re.findall(r'(?is)[a-z0-9]+', s)).lower()
return s == s[::-1]
W
(非单词字符(匹配任何不匹配的单个字符w
(与[^a-zA-Z0-9_]
相同(。
参考
您可以在以下链接中找到其他说明:
LeetCode 9 JavaScript 讨论区
LeetCode 125 JavaScript 讨论区
使用字符串检查回文非常简单明了。话虽如此,如果您想看看如何在不将数字更改为字符串的情况下做到这一点,
- 首先初始化一个以
Math.pow(10, digit count-1)
开头的变量 - 循环直到开始值大于 0
- 内部循环比较第一个和最后一个数字,如果它们不相等,则返回 false
- 在每次迭代中,从 X 中删除第一个和最后一个数字并将 Start 减少 100
var isPalindrome = function(x) {
// as per question on leetcode negative values cannot be palindrome
if( x < 0) {
return false
}
x = Math.abs(x)
// to get the digits from start we need to get log10 of given value
let len = Math.ceil( Math.max( Math.log10(x), 1 ) ) - 1
let start = Math.pow(10, len)
while(start){
// compare first digit with the last digit
if(Math.floor(x/start) != (x % 10)){
return false
}
// remove first digit of current x
x = x % start
// remove last digit of current x
x = Math.floor(x/10)
// reduce start by 100 as we removed 2 digits
start = Math.floor(start / 100)
}
return true
};
console.log(isPalindrome(1))
console.log(isPalindrome(1221))
console.log(isPalindrome(-121))
console.log(isPalindrome(12341))
console.log(isPalindrome(100111))
注意:-我们做(digit count - 1)
,以便我们可以捕获第一个数字
Original leetcode question link