解法一
indexs: 用来记录元素为0的下标
先遍历nums将为0的下标记录,然后倒着遍历nums 将indexs中记录的下标都删除,最后在最后加index.length
个0。
/*
* @lc app=leetcode.cn id=283 lang=javascript
*
* [283] 移动零
*/
// @lc code=start
/**
* Time complexity: O(n)
* spatiay complexity: O(n)
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
let indexs = [];
nums.forEach((item, index) => {
if (item == 0) {
indexs.push(index);
}
})
for (let i = nums.length; i >= 0; i--) {
if (indexs.includes(i)) {
nums.splice(i, 1);
}
}
indexs.forEach(item => {
nums.push(0);
})
return nums;
};
// @lc code=end
解法二
思想是将非零元素向左挪, 非零元素都挪到左边了,剩下的就都是0了 我们创建两个指针 i 和 j,第一次遍历的时候指针j用来记录非0元素往数组左边挪到了第几位,第一次遍历完后,j指针的下标就指向了最后一个 非0 元素下标。 第二次遍历的时候,起始位置就从 j 开始到结束,将剩下的这段区域内的元素全部置为 0。
/*
* @lc app=leetcode.cn id=283 lang=javascript
*
* [283] 移动零
*/
// @lc code=start
/**
* Time complexity:
* spatiay complexity:
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
if(nums.length == 1){
return nums;
}
let j = 0;
for(let i =0 ; i< nums.length ;i++){
if(nums[i]!=0){
nums[j++] = nums[i];
}
}
for(let i= j; i< nums.length; i++){
nums[i] =0;
}
return nums;
};
// @lc code=end
/*
* @lc app=leetcode.cn id=283 lang=java
*
* [283] 移动零
*/
// @lc code=start
class Solution {
public void moveZeroes(int[] nums) {
int j = 0 ;
for(int i =0 ; i < nums.length ; i++){
int num = nums[i];
if(num != 0){
nums[j++] = num;
}
}
for(int i = j ; i < nums.length ; i++){
nums[i] = 0;
}
}
}
// @lc code=end
解法3
function bubbleSort(nums){
for(let i = nums.length - 1 ; i > 0 ; i-- ){
for(let j = 0 ; j < i ; j++ ){
if(nums[j] == 0){
[nums[j+1], nums[j]] = [nums[j], nums[j+1]]
}
}
}
}