给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
解题思路:
用一个指针j记录非零的下标,再指针循环的过程中遇到非零的元素进行交换或者将非零的元素赋值给指针j对应的零元素,再将j指针后的元素全部置为0即可.
1.比较暴力的方法 嘿嘿
public static void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
for (int h = j;h<nums.length;h++){
nums[h] = 0;
}
}
这种实现方式比较暴力,但是时间复杂度太高了,时间复杂度为O(2n) 效率比较低
2.用一层循环解决
public static void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]!=0){
int temp = nums[i];
nums[i]= nums[j];
nums[j++] = temp;
}
}
}
还有另外一种实现方式,原理和上一段代码一样:
public static void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
//进行比较,如果两指针不一样再循环
if (i != j) {
nums[j++] = nums[i];
//此处将循环的元素置为0
nums[i] =0;
}
}
}
}
时间复杂度为O(n),效率较高,哈哈。
文字和代码都是我自己手敲的,原创不易,能看到这篇文章的人都是有缘人,希望大家能多评论,多交流,献上我的膝盖。