问题:移动零
给定一个数组 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交换