【问题标题】:LeetCode 125: Palindrome Number Easy Leetcode [closed]LeetCode 125:回文数 Easy Leetcode [关闭]
【发布时间】:2020-06-05 03:07:08
【问题描述】:

这是我的答案。但是,我无法通过“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;
    }
};

【问题讨论】:

标签: javascript algorithm palindrome


【解决方案1】:

查找回文本质上是您通常使用字符串而不是数字变量来完成的事情,因此我建议将您的数字转换为字符串,然后从那里开始:

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));

这里的策略只是迭代字符串的一半,并断言每个字符与另一半中的对应字符匹配。请注意,对于奇数个字符的输入,我们不需要检查中间字符。

【讨论】:

  • 为什么使用子字符串而不是使用索引来访问字符串的元素?
  • @CodeManiac 我是一名 Java 开发人员(你能告诉我):-)
  • 啊,明白了:),这对我来说似乎有点矫枉过正,我们可以使用索引简单地访问字符串元素,即string[index]
【解决方案2】:

使用字符串检查回文非常简单直接。话虽如此,如果您想看看如何在不将数字更改为字符串的情况下做到这一点,

  • 首先初始化一个以Math.pow(10, digit count-1)开头的变量
  • 循环直到 start 的值大于 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

【讨论】:

    【解决方案3】:

    您的问题似乎是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;
    };
    

    Python

    class Solution:
        def isPalindrome(self, x):
            if x < 0 or (x > 0 and not x % 10):
                return False
    
            return str(x) == str(x)[::-1]
    

    Java

    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);
        }
    }
    

    还有一个类似的isPalindrome question,如果你有兴趣,我刚刚在下面复制:

    JavaScript 一世

    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();
    };
    
    

    Java

    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);
        }
    }
    

    Python

    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.com/problems/palindrome-number
    • 因为签名 x 应该是一个数字而不是字符串。即 /** * \@param {number} x * \@return {boolean} */
    • 没问题,我刚刚从 OP 的问题中删除了链接问题。
    猜你喜欢
    • 2022-06-12
    • 2021-08-11
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多