前言
写的我脑子乱了
一、移动零
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
摘要:所有0移到数组末尾、保持非零元素的相对顺序、不复制数组、原地操作;
原思想:两个指针,首先第一个指针遍历,寻找到元素0的位置,然后遍历第二个指针,如果第二个指针指向元素不为0,则交换第一个指针指向0的元素和第二个指针指向的元素,然后继续遍历,找到元素0的位置,继续交换
原代码:
class Solution {
public void moveZeroes(int[] nums) {
int temp = 0;//作为交换
int k=0;//记录第一个指针应该移动几位
int m=0;//记录出现0的位置
int i=0;
while(i<nums.length){
for(int j=1;j<nums.length-1;j++){
if(nums[i]==0&&nums[i]<nums[j]){
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i= i+k+1;
k=0;
}
else if(nums[i]==0&&nums[i]==nums[j]){
m=j;
k++;
}
i = m;
}
}
}
}
问题:
时间复杂度过高
新思想:
1.往前挪动非0的
非0的往前挪,挪完之后,后面的就都是0了,然后在用0覆盖后面的
2.参照双指针解决
指针i指向0的元素,指针j是指向非0的元素
对于思想1的新代码:
public void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0)
return;
int index = 0;
//一次遍历,把非零的都往前挪
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0)
nums[index++] = nums[i];
}
//后面的都是0,
while (index < nums.length) {
nums[index++] = 0;
}
}
对于思想2的新代码:
public void moveZeroes(int[] nums) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
//只要不为0就往前挪
if (nums[j] != 0) {
//i指向的值和j指向的值交换
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
}
}
}