移动数组中出现的0,并且移动到末尾

126 阅读1分钟

算法:移动数组中出现的0,并且移动到末尾

思路1:

时间复杂度为O(n^2)(不建议使用)-->原因:便利时间复杂度为O(n),arr.splice的时间复杂度也为O(n),合起来复杂度就为O(n^2)

例如数组 let arr = [1, 2, 0, 3, 0, 5, 7, 0, 9];

const moveZrrer1 = () => {
    let arr = [1, 2, 0, 3, 0, 5, 7, 0, 9]
    if (arr.length === 0) return;
    let zrrorLength = 0;
    for (let i = 0; i < arr.length - zrrorLength; i++) {
      if (arr[i] === 0) {
        arr.push(0);
        arr.splice(i, 1)
        zrrorLength++;
      }
    };
    console.log(arr)
  };

打印出来的结果是:

image.png

出现问题:如果数组是连续的0,例如:let arr = [1, 2, 0, 0, 0, 3, 0, 5, 7, 0, 9]

结果就是:

image.png

方案:在截取数组后减去一位元素

 const moveZrrer1 = () => {
    let arr = [1, 2, 0, 0, 0, 3, 0, 5, 7, 0, 9]
    if (arr.length === 0) return;
    let zrrorLength = 0;
    for (let i = 0; i < arr.length - zrrorLength; i++) {
      if (arr[i] === 0) {
        arr.push(0);
        arr.splice(i, 1)
        i--;  //这里减去一位元素
        zrrorLength++;
      }
    };
    console.log(arr)
  };

image.png

思路2(推荐):

时间复杂度为O(n)-->只有一次遍历,时间复杂度为O(n);

  const moveZrrer2 = (arr) => {
    // let arr = [1, 2, 0, 3, 0, 5, 7, 0, 9]
    // let arr = [1, 2, 0, 0, 0, 3, 0, 5, 7, 0, 9]
    if (arr.length === 0) return;
    let i;
    let j = -1;//先赋值为负数初始化
    for (i = 0; i < arr.length; i++) {
      if (arr[i] === 0) {
        if (j < 0) {
          j = i
        }
      }

    }
    if (arr[i] !== 0 && j > 0) {
      let n = arr[i];
      arr[i] = arr[j];
      arr[j] = n
    }
  };