問題:找到一個索引 N,其中 N 左邊的整數之和等于 N 右邊的整數之和。如果沒有索引可以實作這一點,則回傳 -1。
我的解決方案
function findEvenIndex(arr) {
var sum = i => i.reduce((a, b) => a b),
l = arr.length;
for (let j = 0; j <= l; j ) {
if (sum(arr.slice(0, j - 1)) === sum(arr.slice(j, l))) {
return j
} else {
continue;
}
}
return -1
}
console.log(
findEvenIndex([1, 2, 3, 4, 3, 2, 1])
)
當我在說 findEvenIndex([1,2,3,4,3,2,1]) 上運行它時,它沒有回傳任何東西?在這個例子的情況下,阻止3回傳的錯誤在哪里?
我已經將 for 回圈程序設定如下,看看發生了什么
for(let j = 0; j <= arr.length; j ){
var left = arr.slice(0, j-1), right = arr.slice(j)
console.log(left, right)
}
/* returns
[1] [3,4,3,2,1]
[1,2] [4,3,2,1]
[1,2,3] [3,2,1]
as expected
*/
但是,當嘗試 console.log 這些陣列的總和時:
function sum(i){ return i.reduce((a, b) => a b)}
var l = arr.length;
for(let j = 0; j <= l; j ){
var left = arr.slice(0, j-1), right = arr.slice(j)
console.log(sum(left), sum(right))
}
使用上面的代碼片段, findEvenIndex([1,2,3,4,3,2,1]) 回傳“15 16”?
uj5u.com熱心網友回復:
您可以使用reduce() 獲得如下索引。您關于 reduce() 的實作不正確。
function findEvenIndex(arr)
{
for(let i = 0; i < arr.length; i ) {
let leftSum = arr.slice(0, i).reduce((accumulator, current) => accumulator current, 0);
let rightSum = arr.slice(i 1).reduce((accumulator, current) => accumulator current, 0);
if (leftSum === rightSum) {
return i;
}
}
return -1;
}
console.log(
findEvenIndex([1, 2, 3, 4, 3, 2, 1])
)
請查看以下博客以了解 Array reduce() 的作業原理
https://www.javascripttutorial.net/javascript-array-reduce/
uj5u.com熱心網友回復:
您的代碼的主要問題是呼叫sum([])會引發錯誤(您將在除錯期間在控制臺中找到):
減少沒有初始值的空陣列
reduce如果您的陣列沒有任何值,該方法不知道要回傳什么。您可以通過將初始值作為第二個引數傳遞給 來解決它.reduce:
const add = (a, b) => a b;
[1, 2, 3].reduce(add); // add(add(1, 2), 3)
[1, 2].reduce(add); // add(1, 2)
[1].reduce(add); // 1
[].reduce(add); // ERROR: Reduce of empty array
// with no initial value
[1, 2].reduce(add, 0); // add(add(0, 1), 2)
[1].reduce(add, 0); // add(0, 1)
[].reduce(add, 0); // 0
一旦你解決了這個問題,除錯其余的代碼就更容易了。
修復它
這是我認為應該做的一個例子:
顯示代碼片段
function findEvenIndex(arr) {
// Add a seed value --v
var sum = i => i.reduce((a, b) => a b, 0),
l = arr.length;
for (let j = 0; j <= l; j ) {
const left = arr.slice(0, j);
const right = arr.slice(j 1);
const leftSum = sum(left);
const rightSum = sum(right);
console.log(
{ left, right, leftSum, rightSum }
);
if (leftSum === rightSum) {
return j
}
}
return -1
}
console.log(
findEvenIndex([1]), // 0
findEvenIndex([1, 2, 3, 4, 3, 2, 1]), // 3
findEvenIndex([10, 0, 5, 5]), // 1
findEvenIndex([3, 2, 1]) // -1
)
另一種方法
請注意,為每個索引回圈陣列的所有元素是非常昂貴的!更有效的方法是:
- 取源陣列的總和,將其存盤為
rightSum - 定義
leftSum為 0 - 看看整數值索引0和減去從它
rightSum - 如果
leftSum === rightSum,回傳0 - 否則,添加值
leftSum并增加索引 - 到達最終索引后,回傳
-1
顯示代碼片段
const findEvenIndex = (arr) => {
let leftSum = 0;
let rightSum = arr
.reduce((a, b) => a b, 0);
for (let i = 0; i < arr.length; i = 1) {
const n = arr[i];
rightSum -= n;
if (leftSum === rightSum) return i;
leftSum = n;
}
return -1;
}
console.log(
findEvenIndex([1]), // 0
findEvenIndex([1, 2, 3, 4, 3, 2, 1]), // 3
findEvenIndex([10, 0, 5, 5]), // 1
findEvenIndex([3, 2, 1]) // -1
)
uj5u.com熱心網友回復:
完成我的解決方案后,我注意到它實際上與上面@Abu 的答案相同。這個想法是蠻力通過陣列的方式,在你進行時比較兩半。
/*
Find an index N where the sum of the integers to the left of N is equal to the sum of the integers to the right of N. If there is no index that would make this happen, return -1
*/
const array = [10, 90, 10, 1, 10, 90, 10];
// incrementTotal :: (Number t, Number n) -> t
incrementTotal = (total, number) => total number;
// indexIsEqual :: (Array a, Number c) -> Boolean
function indexIsEqual(array, count) {
let chunkL = array.slice(0, count-1);
let chunkR = array.slice(count , );
return chunkL.reduce(incrementTotal) === chunkR.reduce(incrementTotal);
}
// findEvenIndex :: (Array a) -> (a[x] || -1)
function findEvenIndex(array) {
for (let count = 2; count < array.length; count ) {
if (indexIsEqual(array, count)) {
return array[count-1];
}
}
return -1;
}
console.log(findEvenIndex(array));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357530.html
標籤:javascript 数组
上一篇:單擊下拉按鈕時傳遞資料
