您的位置:首页 > 教育 > 培训 > 重庆新闻发布会最新_电子商务网站seo_seo教程培训班_登封网站关键词优化软件

重庆新闻发布会最新_电子商务网站seo_seo教程培训班_登封网站关键词优化软件

2025/2/27 12:51:36 来源:https://blog.csdn.net/weixin_47894469/article/details/145887914  浏览:    关键词:重庆新闻发布会最新_电子商务网站seo_seo教程培训班_登封网站关键词优化软件
重庆新闻发布会最新_电子商务网站seo_seo教程培训班_登封网站关键词优化软件

一、暴力解法:循环数组,如果=0则放到最后

class Solution {public void moveZeroes(int[] nums) {int k=0; // 0的个数// k为已经发现0的个数,只要将已经找出的0的前面的数for(int i=0; i<nums.length-k;){if(nums[i]==0){// 移动k++;// k为已经发现0的个数,后面k个0不用动了for(int j=i; j<nums.length-k; j++){ nums[j]=nums[j+1];}// 把倒数第K个数变为0nums[nums.length-k]=0;}if(nums[i]!=0){i++;}}}
}

注意:

  • 第一个for循环,条件为nums.length-k,k为已经发现0的个数,只要将已经找出的0的前面的数
  • 第一个for循环,条件为nums.length-k,k为已经发现0的个数,后面k个0不用动了
  • 考虑存在连续的0,if(nums[i]!=0){i++;},如果移动后的数不为零,则判断后一个(i++)数

二、正确解法:双指针

思路:使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。

class Solution {public void moveZeroes(int[] nums) {int n=nums.length, left = 0, right = 0;while(right<n){if(nums[right]!=0){// 不为0放到左边swap(nums,right,left);left++;}right++;}}public void swap(int[] nums, int a, int b){int tmp=nums[a];nums[a]=nums[b];nums[b]=tmp;}
}

注意:

  • 只需要动一边即可:致力于将左边都设置为非零数,右边自然会变成零

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com