我有一個二進制陣列,想用這個函式計算連續最長的 1 數。特別是,當我將此值用于數字時,[1,1,0,1]它會正確計數。
let nums = [1, 1, 0, 1, 1, 1];
var findMaxConsecutiveOnes = function(nums) {
let val = 0;
if (nums.length >= 1) {
console.log(nums.sort().reverse());
for (i = 0; i <= nums.length - 1; i ) {
if (nums[i] === nums[i 1]) {
val ;
} else {
console.log(val);
return val;
}
}
console.log(val);
return 0;
}
};
findMaxConsecutiveOnes(nums)
uj5u.com熱心網友回復:
這是一個簡單的問題Array.prototype.reduce:
const maxConsecutiveOnes = (ns) => ns .reduce (
({max, curr}, n) => n == 1 ? {curr: curr 1, max: curr >= max ? curr 1 : max} : {max, curr: 0},
{max: 0, curr: 0}
) .max
console .log (maxConsecutiveOnes ([1, 1, 0, 1]))
console .log (maxConsecutiveOnes ([1, 1, 0, 1, 1, 1]))
我們將陣列折疊成一個{max: Number, curr: Number}物件,從{max: 0, curr: 0}. 在每一步,如果我們有0,我們會重置curr并0保持max。否則我們遞增curr,如果大于max,我們也使用它max。最后,我們只是提取max累積物件的屬性。
因此,例如,我們將通過以下步驟[1, 1, 0, 1, 1, 1, 0, 1]:
| n | 累加器 | 筆記 |
|---|---|---|
| - | {max: 0, curr: 0} |
初始累加器值 |
| 1 | {max: 1, curr: 1} |
增加curr和max |
| 1 | {max: 2, curr: 2} |
增加curr和max |
| 0 | {max: 2, curr: 0} |
重置curr為0 |
| 1 | {max: 2, curr: 1} |
增量curr |
| 1 | {max: 2, curr: 2} |
增量curr |
| 1 | {max: 3, curr: 3} |
增加curr和max |
| 0 | {max: 3, curr: 0} |
重置curr為0 |
| 1 | {max: 3, curr: 1} |
增量curr |
| - | - | 現在我們提取max并回傳3 |
uj5u.com熱心網友回復:
我認為如果你像在第 6 行對你的 console.log() 那樣對它進行排序,它會起作用。如果你不想改變你的陣列,你應該嘗試使用你排序的副本。我認為在某些情況下您會離開回圈。[1100111] 讓你在零時回傳 val,但之后你仍然有更多。不過我不確定,我沒有花時間檢查它。
uj5u.com熱心網友回復:
如果我理解正確,您需要在二進制陣列中找到最大連續 1。
如果沒有,請忽略。
如果是,
根據您當前的代碼,
可以說,你有3個。1,1,1。索引 0 處的值等于索引 1。val 變為 1。索引 1 等于索引 2。val 現在變為 2。它停止。盡管您有三個連續的 1,但您只列印了 2 個。
現在來看 1,1,0,1 的情況
您不應該對其進行排序。首先,它將所有 1 組合在一起。在 [1,1,0,1] => 的情況下,當你排序時,它是 [1,1,1,0] => 所以它列印 3-1 = 2
在 [1, 1, 0, 1, 1, 1] 的情況下
它排序為 [1,1,1,1,1,0]。所以列印 5-1=4
嘗試不排序。一個優點是您不會失去最大值。其次,您不會對陣列進行兩次迭代(在排序的情況下,它會在內部進行迭代)
因此,您也許可以嘗試通過每個元素進行映射并跟蹤連續的 1。也留個柜臺。如果遇到 0,請重置計數器。同樣在遞增之后和重置之前,檢查當前序列是否大于最大值
這是一種可能性。可能有更多的方法。
let nums = [1, 1, 0, 1];
var findMaxConsecutiveOnes = function(nums) {
let val = 0;
let max = 0;
nums.map(el => {
if(el == 1){
val ;
max = val > max ? val : max
}
else{
max = val > max ? val : max
val = 0;
}
})
return max
};
findMaxConsecutiveOnes(nums)
uj5u.com熱心網友回復:
在 forEach 回圈中做一些簡單的事情怎么樣:
const binaryArray = [1, 1, 0, 1, 1, 1]
const getMaxConsecutiveOnes = (arr) => {
let countOfOnes = 0
let maxConsecutiveOnes = 0
arr.forEach(num => {
if (num === 1) {
countOfOnes
} else if (countOfOnes > maxConsecutiveOnes) {
maxConsecutiveOnes = countOfOnes
countOfOnes = 0
}
})
// Final check of which is longer to account for end of array
return maxConsecutiveOnes > countOfOnes ? maxConsecutiveOnes : countOfOnes
}
console.log(getMaxConsecutiveOnes(binaryArray)) // expected output: 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/494593.html
標籤:javascript 算法 数据结构
上一篇:如何從物件串列中獲取唯一值?
