最近我在 codewar 上遇到了這個問題,并試圖解決它:“如果我們列出所有低于 10 且是 3 或 5 的倍數的自然數,我們得到 3、5、6 和 9。這些倍數的總和是 23。完成解決方案,使其回傳傳入數字以下的所有 3 或 5 的倍數之和。此外,如果數字為負數,則回傳 0(對于具有它們的語言)。
注意:如果數字是 3 和 5 的倍數,則只計算一次。"
如果沒有包含“兩者的倍數......算一次”的要求,那么現在代碼將全部結束。
我試圖通過使用陣列和 if else 陳述句來解決它,正如您從我所附的代碼中看到的那樣,但我以錯誤的形式碰壁,告訴我 reduce 命令無法在空陣列上執行,當我確實考慮了這種情況,并在 intersectionResult 未定義時添加了 if 陳述句。非常感謝有關錯誤的更多詳細資訊,解決錯誤的正確語法,甚至執行錯誤的正確方法的幫助。如果需要,我會很樂意提供更多細節
if (number < 0) {
return 0;
};
let numbersBelow = [];
for (var i = 0; i <= number - 1; i ) {
numbersBelow.push(i);
};
let multiplesOfThree = [];
let multiplesOfFive = [];
for (var t = 0; t < numbersBelow.length; t ){
if (numbersBelow[t] % 3 === 0) {
multiplesOfThree.push(numbersBelow[t]);
} else if (numbersBelow[t] % 5 === 0) {
multiplesOfFive.push(numbersBelow[t]);
}
};
let intersectionResult = [];
intersectionResult = multiplesOfFive.filter(x => multiplesOfThree.indexOf(x) !== -1);
if (intersectionResult.length === 0) { intersectionResult = [0, 0]};
const reducer = (accumulator, curr) => accumulator curr;
return multiplesOfThree.reduce(reducer) multiplesOfFive.reduce(reducer) - intersectionResult.reduce(reducer);
}
this is the error message when testing on code wars:
TypeError: Reduce of empty array with no initial value
at Array.reduce (<anonymous>)
at solution (/workspace/node/test.js:28:32)
at test (/workspace/node/test.js:37:16)
at Suite.<anonymous> (/workspace/node/test.js:51:3)
at Object.create (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/interfaces/common.js:148:19)
at context.describe.context.context (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/interfaces/bdd.js:42:27)
at /workspace/node/test.js:49:1
at Object.<anonymous> (/workspace/node/test.js:82:3)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at ModuleWrap.<anonymous> (internal/modules/esm/translators.js:199:29)
at ModuleJob.run (internal/modules/esm/module_job.js:183:25)
at async Loader.import (internal/modules/esm/loader.js:178:24)
at async formattedImport (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/nodejs/esm-utils.js:7:14)
at async Object.exports.requireOrImport (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/nodejs/esm-utils.js:48:32)
at async Object.exports.loadFilesAsync (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/nodejs/esm-utils.js:88:20)
at async singleRun (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/cli/run-helpers.js:125:3)
at async Object.exports.handler (/workspace/node/node_modules/.pnpm/mocha@9.1.3/node_modules/mocha/lib/cli/run.js:374:5)
uj5u.com熱心網友回復:
也許我錯過了一些東西,但在我看來,你把事情復雜化了。只需將非 0 和 3的倍數或5 的倍數以下的所有內容相加即可。
document.addEventListener(`change`, handle);
function handle(evt) {
if (evt.target.id === `startnr`) {
return sumOfMultiples(evt.target.value);
}
}
function sumOfMultiples(nr) {
console.clear();
let sum = 0;
if (nr < 0) {
return console.log(`number should be > 0`);
}
while (nr--) {
if (nr > 0 && nr % 3 === 0 || nr % 5 === 0) {
sum = nr;
}
}
console.log(sum);
}
<input type="number" id="startnr" value=10> start number
uj5u.com熱心網友回復:
如果你把
multiplesOfThree.reduce(reducer, 0) multiplesOfFive.reduce(reducer, 0) - intersectionResult.reduce(reducer, 0)
在您的代碼中,您應該修復您的錯誤
但我認為下面的方法更合適
const multiplyAndSum = (upperLimit, dividends) =>
Array.from({
length: upperLimit - 1
}, (_, i) => i 1)
.filter(n => dividends.some(d => n % d === 0))
.reduce((res, n) => res n, 0)
console.log(multiplyAndSum(10, [3, 5]))
console.log(multiplyAndSum(-1, [3, 5]))
uj5u.com熱心網友回復:
一種略有不同的方法,其中有兩個變數表示倍數和一個總值。
const
sum = n => {
if (n <= 0) return 0;
let total = 0,
three = 0,
five = 0;
while (three < n || five < n) {
if (three === five) {
total = three;
three = 3;
five = 5;
continue;
}
if (three < five && three < n) {
total = three;
three = 3;
continue;
}
if (five < three && five < n) {
total = five;
five = 5;
}
}
return total;
}
console.log(sum(10));
uj5u.com熱心網友回復:
用于[...new Set(finalArray)]洗掉重復項。
細節在例子中注釋
// Utility function
const log = data => console.log(JSON.stringify(data));
/**
* @desc Given a number, list a multiples of 3 and 5 that are less
* than the given number. If the given number is less than 4 return 0
* @param {number} number - The number that serves as the limit
* @return {array<number>} The array of multiples of 3 and 5 up to but
* not including the given number.
*/
function threeFive(number) {
// Return 0 if number is less than 4
if (number < 4) return 0;
/*
Create an array of <number>-1 empty slots...
.map() returns the <i>nterval times 3 if it is less than the <number>...
...otherwise returns null...
...all nulls and zeros will be .filter()'ed out.
The next expression is identical to the previous with the exception
of multiplying by 5 instead of 3
*/
const three = [...new Array(number-1)].map(
(_, i) => (i * 3) < number ? i * 3 : null)
.filter(n => n);
const five = [...new Array(number-1)].map(
(_, i) => (i * 5) < number ? i * 5 : null)
.filter(n => n);
/*
merge the two arrays with .concat()...
...convert it into a Set...
...convert the Set back into an array thereby eliminating all
duplicates...
...and finally .reduce() the sum of all numbers
*/
return [...new Set(three.concat(five))].reduce((sum, add) => sum add)
}
log(threeFive(10));
log(threeFive(44));
log(threeFive(98));
log(threeFive(3));
log(threeFive(-9));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/496492.html
標籤:javascript 数组
下一篇:洗掉特定螢屏尺寸的底部邊框
