亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

javascript - Find the starting index of consecutive repeating elements in an array?
學(xué)習(xí)ing
學(xué)習(xí)ing 2017-06-26 10:51:51
0
3
1359
var arr = [1,2,3,9,9,9,9,6,7,8,10,10,10,15]

Find the starting index of consecutive repeated elements and seek an algorithm with lower complexity?

學(xué)習(xí)ing
學(xué)習(xí)ing

reply all(3)
Peter_Zhu
var arr = [1,2,3,9,9,9,9,6,7,8,10,10,10,15]
var dic = {}
for (k in arr){
     if (!dic[arr[k]]){dic[arr[k]] = [k]}
     else{dic[arr[k]][1] = k}
 }
for (k in dic){if (dic[k].length==1){delete(dic[k])}}

console.log(dic)
{ '9': [ '3', '6' ], '10': [ '10', '12' ] }

@boxsnake

var arr = [1,2,3,9,9,9,9,6,7,9,9,9,8,10,10,10,15,10,10]
var dic = {}
for (k in arr){
    k = Number(k)
    if(arr[k]==arr[k-1]||arr[k]==arr[k+1]){
        if (!dic[arr[k]]){dic[arr[k]] = [[k,k]];continue}
        s = dic[arr[k]].slice(-1)[0]
        if(k-s[1]==1){s[1]=k}
        else{dic[arr[k]].push([k,k])}
    }
}
console.log(dic)
{ '9': [ [ 3, 6 ], [ 9, 11 ] ],
  '10': [ [ 13, 15 ], [ 17, 18 ] ] }
學(xué)霸

Same as boxsnake is O(n):

var result = {}
for (let i = 1; i < arr.length; i += 1) {
  if (arr[i] === arr[i - 1]) {
    if (result[arr[i]]) {
      result[arr[i]].push(i - 1)
    } else {
      result[arr[i]] = [i - 1]
    }
    while (i < arr.length && arr[i] === arr[i + 1]) {
      i += 1
    }
  }
}
console.log(JSON.stringify(result))
代言
var result = [],
    flag = true;
    // 此處flag為true表示可以切換此標(biāo)識,反之就不可切換
    // 當(dāng)相鄰的兩個元素相等時,如果標(biāo)識可切換就說明是剛開始重復(fù)
    // 如果標(biāo)識不可切換,就說明是在某一段連續(xù)重復(fù)中還沒結(jié)束
    // 如果相鄰的不相等,且標(biāo)識可切換,就說明此處不連續(xù)重復(fù)
    // 如果標(biāo)識可切換,就說明此處是連續(xù)重復(fù)的中斷處
    // 這樣,就可以切換標(biāo)簽,然后供下一次連續(xù)開始是把標(biāo)記再切換回來

for(var i = 0, len = arr.length; i < len - 1; i++) {
    if(arr[i] == arr[i + 1] && flag) { // 可以切換標(biāo)識且連續(xù)相等->重復(fù)開始
        result.push(i);
        flag = false;
    } else if(arr[i] != arr[i + 1] && !flag) { // 不可以切換標(biāo)識但兩者不等->重復(fù)結(jié)束
        flag = true;
    }

    // 剩余兩種情況不做任何操作
    // 總體來說,就是flag = true就在重復(fù)之外,否則就在重復(fù)之內(nèi)
    // 在重復(fù)之外時,如果前后兩個相等就切換標(biāo)記,重復(fù)開始
    // 在重復(fù)之內(nèi)時,如果前后兩個不等就切換標(biāo)記,重復(fù)結(jié)束
}

console.log(result);

Run results:

Update

After seeing other people’s answers giving the starting and ending positions, I’m here to join in the fun.

var result = [],
    current = [], // 起始和終止位置緩存
    flag = true;

for(var i = 0, len = arr.length; i < len - 1; i++) {
    if(arr[i] == arr[i + 1] && flag) {
        current[0] = i; // 記錄起始位置
        flag = false;
    } else if(arr[i] != arr[i + 1] && !flag) {
        current[1] = i; // 記錄終止位置
        result.push(current);
        current = []; // 重置緩存
        flag = true;
    }

    // 下面這段代碼是為了判斷是否在循環(huán)中且數(shù)組遍歷到最后,如果是,在循環(huán)中需要跳出記錄,但是可以不用重置緩存和切換標(biāo)識,直接跳出,主體部分和上面記錄終止位置類似
    if(i == len - 2 && arr[i] == arr[i + 1] && !flag) { // 注意此處是len - 2
        current[1] = i + 1; // 注意是i + 1
        result.push(current);
        break;
    }
}

console.log(result);

Run results:

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template