leetcode-移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
我的第一次解答
看错了题目,以为要排序
class Solution {
public void moveZeroes(int[] nums) {
int len=nums.length;
int end=len-1;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
for(int j=end;j>i;j--){
if(nums[j]!=0){
nums[i]=nums[j];
nums[j]=0;
end=j-1;
break;
}
}
}
if(i+1>=end){
break;
}
if(nums[i+1]==0){
for(int j=end;j>i+1;j--){
if(nums[j]!=0){
nums[i+1]=nums[j];
nums[j]=0;
end=j-1;
break;
}
}
}
if(nums[i]>0&&nums[i+1]>0&&nums[i]>nums[i+1]){
int temp=nums[i];
nums[i]=nums[i+1];
nums[i+1]=temp;
for(int j=0;j<i;j++){
temp=nums[i];
if(nums[j]>nums[i]){
for(int k=i;k>j;k--){
nums[k]=nums[k-1];
}
nums[j]=temp;
break;
}
}
}
}
}
}
我的第二次解答
class Solution {
public void moveZeroes(int[] nums) {
int xx = 0;
for (int i = 0; i < nums.length; i++) {
int temp = -1;
if (nums[i] != 0) {
for (int j = i - 1; j >= 0; j--) {
if (nums[j] == 0) {
temp = j;
}
}
if(temp==-1){
continue;
}
xx = nums[temp];
nums[temp] = nums[i];
nums[i] = xx;
}
}
}
}
官方解答
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length, left = 0, right = 0;
while (right < n) {
if (nums[right] != 0) {
swap(nums, left, right);
left++;
}
right++;
}
}
public void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/move-zeroes/solutions/489622/yi-dong-ling-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论区有人给出了更好的答案
直接将非0的数字左移即可,再填充剩下的格子为0
public void moveZeroes(int[] nums) {
int cur = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[cur] = nums[i];
cur++;
}
}
for (int i = cur; i < nums.length; i++) {
nums[i] = 0;
}
}

浙公网安备 33010602011771号