返回数组中所有回文数的总和

时间:2021-02-24 15:04:39

标签: javascript arrays function palindrome

我正在尝试使用 javascript 获取数组中回文数的总和

代码得到输出 0 而不是得到回文值的总和:

function reverse(n) {
    var rem, res = 0
    while (n > 0) {
        rem = n % 10
        res = res * 10 + rem
        n = n / 10
    }
    return res
}

function isPalindrome(n) {
    if (n == reverse(n)) return true
}

function sumArray(arr) {
    var sum = 0
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] > 10 && isPalindrome(arr[i])) {
            sum += arr[i]
        }
        
    }
    console.log(sum);    
}


sumArray([12, 313, 11, 44, 9, 1])

3 个答案:

答案 0 :(得分:2)

您的 reverse 函数没有正确实现。例如,对于 12,它给出 Infinity。我认为更简单的方法是先将数字转换为字符串,然后反转字符串:

function isPalindrome(n) {
    const str = String(n);
    return str === [...str].reverse().join('');
}

function sumArray(arr) {
    var sum = 0
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] > 10 && isPalindrome(arr[i])) {
            sum += arr[i]
        }
        
    }
    console.log(sum);    
}


sumArray([12, 313, 11, 44, 9, 1])
console.log(  313 +11+ 44);

function isPalindrome(n) {
    if (n < 10) return false;
    const str = String(n);
    return str === [...str].reverse().join('');
}

function sumArray(arr) {
  return arr
    .filter(isPalindrome)
    .reduce((a, b) => a + b, 0);
}


console.log(sumArray([12, 313, 11, 44, 9, 1]));
console.log(              313 +11+ 44);

答案 1 :(得分:1)

问题出在您的 reverse() 函数中。 n = n / 10 会留下一些乱七八糟的小数,导致循环无法终止。

while (n > 0) {
    rem = n % 10
    res = res * 10 + rem
    n = n / 10
}

仅对这个结果进行四舍五入会使您的代码按预期运行。

while (n > 0) {
    rem = n % 10
    res = res * 10 + rem
    n = Math.round(n / 10)
}

下面是四舍五入变化的代码

  function reverse(n) {
    var rem, res = 0
    while (n > 0) {
      rem = n % 10
      res = res * 10 + rem
      n = Math.round(n / 10)
    }
    return res
  }

  function isPalindrome(n) {
    if (n == reverse(n)) return true
  }

  function sumArray(arr) {
    var sum = 0
    for (var i = 0; i < arr.length; i++) {
      if (arr[i] > 10 && isPalindrome(arr[i])) {
        sum += arr[i]
      }

    }
    console.log(sum);
  }

  sumArray([12, 313, 11, 44, 9, 1])

答案 2 :(得分:1)

可以简化回文判断,用Array.reduce求和

const isPalindrome = n =>
  n > 10 && `${n}` === [...`${n}`].reverse().join("") ? n : 0;
const sumOfPalindromes = arr =>
  arr.reduce((acc, val) => acc + isPalindrome(val), 0);
console.log(sumOfPalindromes([12, 313, 11, 44, 9, 1]));

相关问题