给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
输入: nums = [0]
输出: [0]
class Solution {
public void moveZeroes(int[] nums) {
if(nums == null){
return;
}
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i] != 0){
nums[j++] = nums[i];
}
}
for(int i=j;i<nums.length;++i){
nums[i]=0;
}
}
}
这段代码实现了将数组中的所有零元素移动到数组末尾的操作,同时保持非零元素的相对顺序不变。下面是对代码的解释:
j
,初始化为0,用于记录非零元素应该放置的位置。
nums[j]
位置,并递增j
。
j
的值也指向了下一个可能为零的位置。
j
开始,将剩余的数组位置都置为零,以完成所有零元素的移动操作。
这段代码的时间复杂度为O(n),其中n是数组的长度,因为它只需要对数组进行两次遍历。
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
// 示例用例1
int[] nums1 = {0, 1, 0, 3, 12};
solution.moveZeroes(nums1);
System.out.println("移动零后的数组1:");
for (int num : nums1) {
System.out.print(num + " ");
}
System.out.println();
// 示例用例2
int[] nums2 = {0, 0, 0, 1, 2, 3};
solution.moveZeroes(nums2);
System.out.println("移动零后的数组2:");
for (int num : nums2) {
System.out.print(num + " ");
}
System.out.println();
}
}