Leetcode原题
思路
应题目要求,必须在不复制数组的情况下,原地进行操作,所以这里我们的想法很简单,利用双指针去操作数组,当遍历时发现前面的数组元素不是0时我们就往前挪动,挪完以后,剩余的数都是0.再进行赋值即可。
双指针
public void moveZeroes(int[] nums) { if(nums==null){ return; } //第一次遍历时,j指针记录非0的个数,只要非0的都赋值给nums[j] int j=0; for(int i=0;i<nums.length;i++){ if(nums[i]!=0){ nums[j++]=nums[i]; } } //非0统计了,剩余的都是0,进行赋值 for (int i = j; i < nums.length; i++) { nums[i]=0; } //System.out.println(Arrays.toString(nums)); }
但是在这里有遍历2次,不知道有没有一次的方法。这里我看了一下官网评论区提示。参考快排置换的思想
快速排序思想
快速排序首先要确定一个待分割的元素做中间点x,然后把所有小于等于x的元素放到x的左边,大于x的元素放到其右边。
这里我们可以用0当做这个中间点,把不等于0(注意题目没说不能有负数)的放到中间点的左边,等于0的放到其右边。这的中间点就是0本身,所以实现起来比快速排序简单很多,我们使用两个指针i和j,只要nums[i]!=0,我们就交换nums[i]和nums[j]
对照动态图来理解(使用了某网友画的图):
代码实现
public void moveZeroes(int[] nums) { if (nums==null) return; int j=0; for (int i=0;i<nums.length;i++){ //当前元素!=0,就把其交换到左边,等于0的交换到右边 if (nums[i]!=0){ //临时变量转换 int tmp= nums[i]; nums[i]= nums[j]; nums[j++]= tmp; } } System.out.println(Arrays.toString(nums)); }
提交了一下
绝了,这效率还有一点拉跨哈哈,又是愉快学习的一天~
因为目前个人算法能力有限,有更好的方法的小伙伴可以在评论区留言分享,大家一起共同进步。
有兴趣的老爷,还可以关注我的公众号【一起收破烂】,回复【006】获取2022最新java面试资料以及简历模型120套哦~
在这里插入图片描述
有兴趣的老爷,还可以关注我的公众号【一起收破烂】,回复【006】获取 最新java面试资料以及简历模型120套哦~