求解一道排序算法题

let arr = [1,2,3,4,5,6,6,7,8,9,10,10,10,11,12,12,4,5]

如何通过js 把它切成 [1,2,3,4,5,6] [6,6] [6,7,8,9,10] [10,10,10] [10,11,12] [12,12] [12,4,5]

规则: 1、相邻不同的合为一组; 2、相邻相同的合为一组。

阅读 2.9k
6 个回答
let arr = [1,2,3,4,5,6,6,7,8,9,10,10,10,11,12,12,4,5]

let splitArray = function (A) {
  let global = [[A[0]]], local = global[0]
  for (var i = 1; i < A.length; i++) {
    let p = local[local.length - 1], pp = local[local.length - 2]
    if (A[i] === p && (p === pp || !pp) || A[i] !== p && p !== pp) {
      local.push(A[i])
    } else {
      local = [A[i - 1], A[i]]
      global.push(local)
    }
  }
  return global
}

console.log(splitArray(arr))
function merge(arr) {
    let _arr = []; // 临时存储
    let result = [];

    if (arr.length===0) {
        return [];
    } else if (arr.length===1) {
        return [arr];
    }

    _arr = [arr[0]];
    // 从第1个开始循环
    for(let i=1, len=arr.length; i<len; i++) {
        // 若当前的数与前一个不相等
        if (arr[i]!==arr[i-1]) {
            _arr.push(arr[i]);

            // 若当前的数与后一个相等时,则说明当前的队列完成
            if (arr[i]===arr[i+1]) {
                result.push(_arr);
                _arr =[arr[i]];
            }
        } else {
            _arr.push(arr[i]);
            if (arr[i]!==arr[i+1]) {
                result.push(_arr);
                _arr = [arr[i]];
            } 
        }
        if (i===len-1) {
            result.push(_arr);
        }
    }
    return result;
}

测试样例:

var arr = [1,2,3,4,5,6,6,7,8,9,10,10,10,11,12,12,4,5];
console.log( merge(arr) );
/* 
[
    [1, 2, 3, 4, 5, 6]
    [6, 6]
    [6, 7, 8, 9, 10]
    [10, 10, 10]
    [10, 11, 12]
    [12, 12]
    [12, 4, 5]
] 
*/

var arr = [];
console.log( merge(arr) ); // []

var arr = [1];
console.log( merge(arr) );
/*
[
    [1]
]
*/

var arr = [1, 2];
console.log( merge(arr) );
/*
[
    [1, 2]
]
*/

var arr = [1, 2, 3];
console.log( merge(arr) );
/*
[
    [1, 2, 3]
]
*/

var arr = [1, 1, 2, 2, 3];
console.log( merge(arr) );
/*
[
    [1, 1]
    [1, 2]
    [2, 2]
    [2, 3]
]
*/
let arr = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 12, 12, 4, 5]

//结果二维数组
let result = [[]]
//结果二维数组最后的索引
let resultLastIndex = 0
//当前 不同 0 / 相同 1 标示
let currentFlag = 0

arr.forEach((item, index) => {
  let r = result[resultLastIndex]
  let compare = r[r.length - 1]
  if (item !== compare) {
    if (currentFlag === 0) {
      r.push(item)
    } else {
      currentFlag = 0
      result.push([arr[index - 1], item])
      resultLastIndex++
    }
  } else {
    if (currentFlag === 0) {
      currentFlag = 1
      result.push([arr[index - 1], item])
      resultLastIndex++
    } else {
      r.push(item)
    }
  }
})

console.log(result)
// 测试用例
var arr = [[1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 12, 12, 4, 5], [1, 2], [1, 2, 3], [], [1,1,1,1,1,1]]

function splitFunc(arr) {
    let arr2 = [[]];

    for (let i = 0, len = arr.length; i < len; i++) {
        let currentVal = arr[i];
        let last = arr2[arr2.length - 1];
        if (i > 0 && currentVal === last[last.length - 1]) {
            let count = 2;
            while (i < len && arr[++i] === currentVal) {
                count++;
            }

            let newArr = [];
            for (let j = 0; j < count; j++) {
                newArr.push(currentVal);
            }
            arr2.push(newArr);
            arr2.push([]);

            i -= 2;
        } else {
            last.push(currentVal);
        }

    }

    return arr2;
}

// 输出结果
arr.forEach((item) => {
    console.log(splitFunc(item))
})
let arr = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 12, 12, 4, 5]

const splitArray = arr => arr.length <= 1 ? [] : (() => {
  const newarr = [arr.shift(), arr.shift()]
  while (arr.length > 0 && (arr[0] === newarr[newarr.length - 1]) === (newarr[0] === newarr[1])) {
    newarr.push(arr.shift())
  }
  return [newarr, ...splitArray([newarr[newarr.length - 1], ...arr])]
})()
console.log(splitArray(arr))

疑问,如果是[1,2,1,1,1,3,4]要怎么分?是[[1,2,1],[1,1,1],[1,3,4]]还是其他的?

function A2N( inArr ){ // 没有处理传入不是数组的情况,其他情况基本都处理啦。
   let len=inArr.length;
   if(len==0) return [];
   if(len==1) return [ [inArr[0] ];
   if(len==2) return [ [ inArr[0], inArr[1] ];
   let out=[],
       old0= inArr[0],
       old1= inArr[1];
   let tmp=[ old0, old1 ];
   for(let i=2;i<len;i++){
      let n=inArr[i];
      if(n == old1){
          if( n == old0){
              tmp.push(n);
          }else{
              out.push( tmp );
              tmp=[ n, n ];
              old0=n;
          }
      }else{
          if(old0 == old1){
              out.push(tmp);
              tmp = [ old1,n ];
              old1=n;
          }else{
              tmp.push(n);
              old0=old1;
              old1=n;
          }
      }
   }
   out.push(tmp);
   return out;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题