题目描述
给定一个数组 nums,编写函数将所有 0 移动到数组的末尾,且保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
要求:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。
解题思路
思路1:先复制最后置0,复制完成后数组中没有0元素
两个标志位同时向后移动,遇到非零元素则将其向前复制,最后当第一个标志位到数组末尾时,将两个标志位之间的元素全部置0。
思路2:一边遍历一边交换,始终保持原数组本身的数据组成
两个标志位同时先后移动,遇到非零元素则将两个标志位所指向的元素互换(此时会包含两个标志位指向同一个元素,本身和本身互换的情况,对算法本身没有影响),遍历到最后,零元素就全部位于数组末尾了。
以上两种思路均能保持非零元素的相对顺序
思路3:利用辅助数组
这个比较好理解,遇到非零元素就复制到新数组,剩下的位补0,但是这是违背要求的。
代码实现(Java)
// 思路1:先复制最后置0,复制完成后数组中没有0元素
public class Solution {
public void moveZeros(int[] nums){
int len = nums.length;
if (len == 0){
return;
}
int count = 0;
for (int i = 0; i < len; i++){ // 先复制
if (nums[i] != 0){
nums[count++] = nums[i];
}
}
// 此时数组中没有0元素了
for (int i = count; i < len; i++){// 然后置末尾的i 和j之间的元素全为0
nums[i] = 0;
}
}
}
// 思路2::一边遍历一边交换,始终保持原数组本身的数据组成
public class Solution {
public void moveZeros(int[] nums){
int len = nums.length;
if (len == 0){
return;
}
int i, j = 0;
for (i = 0; i < len; i++){
// 交换呀交换,只要遇到0元素,i和j总能错开的,所有肯定保证非零元素和零元素的交换
if (nums[i] != 0){
int temp = nums[i];
nums[i] = nums[j];
nums[j++] = temp;
}
}
}
}
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/63e5cd3d.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/63e5cd3d.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。