【问题标题】:Return the sum of all palindromic numbers in an array返回数组中所有回文数的总和
【发布时间】:2021-02-24 15:04:39
【问题描述】:

我正在尝试使用 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])

【问题讨论】:

  • 所以很可能isPalindromereverse 都不起作用——你都测试过了吗?
  • 我不明白为什么人们如此热衷于做别人的功课。这是一个(很大程度上)合理的问题,但应该用可教的时刻和调试技巧来回答,而不是板上钉钉的答案。

标签: javascript arrays function palindrome


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题在于您的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])

    【讨论】:

      【解决方案3】:

      您可以简化回文确定并使用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]));

      【讨论】:

      • 请重新验证一次你的代码,答案应该是368,不是378
      • 是的,分心了片刻
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多