Return数组中所有回文数的和
Return the sum of all palindromic numbers in an array
我正在尝试使用 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])
您的 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);
问题出在您的 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])
可以简化回文判断,用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]));
我正在尝试使用 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])
您的 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);
问题出在您的 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])
可以简化回文判断,用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]));