初级算法探索——数组篇(八)

问题:移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数

js解决办法:

testCallFunc8: function() {
    var zeroTable = [0,1,0,3,12];
    this.moveZeroToTheEnd4(zeroTable);
    cc.log("move zero to end: "+JSON.stringify(zeroTable));
},

// 思路:遍历数组,将==0的元素删除并插入最后,index--,并且移到最后的0不需要继续遍历
// 注意:时间复杂度O(n),但splice操作耗时较长
moveZeroToTheEnd: function(zeroTable) {
    var length = zeroTable.length;
    for (var i = 0; i < length; i++) {
        if (zeroTable[i] == 0) {
            length--;
            zeroTable.splice(i, 1);
            zeroTable.push(0);
            i--;
        }
    }
},

// 思路:冒泡排序,将0冒泡,注:sort在浏览器运行结果错误,本地运行成功
// 注意:时间复杂度高O(n^2)
moveZeroToTheEnd2: function(zeroTable) {
    // zeroTable.sort(function (x, y) {
    //     return x == 0;
    // });

    var zeronum = 0;
    for (var i = 0; i < zeroTable.length-zeronum; i++) {
        if (zeroTable[i] == 0) {
            for (var j = i; j < zeroTable.length-1; j++) {
                zeroTable[j] = zeroTable[j+1];
                zeroTable[j+1] = 0;
            }
            zeronum++;
            i--;
        }
    }
},

// 思路:找出0后第一个非0,交换位置
// 注意:思路正确,但是解法复杂度高,最坏需要O(n^2)
moveZeroToTheEnd3: function(zeroTable) {
    for (var i = 0; i < zeroTable.length; i++) {
        if (zeroTable[i] == 0) {
            for (var j = i+1; j < zeroTable.length; j++) {
                if (zeroTable[j] != 0) {
                    zeroTable[i] = zeroTable[j];
                    zeroTable[j] = 0;
                    break;
                }
            }
        }
    }
},

// 思路:记录非0前面有多少个0,将这个非0与最前面的0进行替换
// 注意:最优解,时间复杂度O(n)
moveZeroToTheEnd4: function(zeroTable) {
    var zeronum = 0;
    for (var i = 0; i < zeroTable.length; i++) {
        if (zeroTable[i] == 0) {
            zeronum++;
        } else {
            if (zeronum != 0) {
                zeroTable[i-zeronum] = zeroTable[i];
                zeroTable[i] = 0;
            }
        }
    }
},

运行结果截图:
这里写图片描述
执行耗时:
- splice 先删除再插入
这里写图片描述
- 0冒泡
这里写图片描述
- 找到0后面第一个非0,交换
这里写图片描述
- 记录0数量,遇到非0与打头的0交换
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhenyu5211314/article/details/81086292