LeetCode数组移零问题代码报错求助:请求排查错误原因
解决你的LeetCode移动零问题
嘿,我一眼就看到你代码里的几个问题啦,咱们一个个来理清楚:
1. 致命的循环条件错误
你写的for循环条件是:
for (int i = 0; i > nums.length;i++)
这里的判断条件是i > nums.length,但i初始值是0,而数组长度nums.length最小是0,所以这个条件从一开始就不成立,循环根本不会执行任何一次!这就是你代码运行没效果的核心原因,赶紧把条件改成i < nums.length才对。
2. 逻辑上的错误(即使循环条件改对了也会出问题)
假设你把循环条件改对了,当前的逻辑还是有问题:当nums[i]本身不是0的时候,你的while循环不会执行,j就等于i,然后你执行了:
nums[i] = nums[j]; // 相当于自己赋值给自己,没变化 nums[j] = 0; // 把原本非零的nums[i]改成了0!
比如输入[1,0],i=0时,j=i=0,执行完这两行后数组会变成[0,0],完全不符合预期。
正确的解法:双指针法
这道题最经典的解法是用双指针,既保证非零元素的相对顺序,又高效完成移动操作,有两种实现方式:
方式一:先移非零元素,再补零
class Solution { public void moveZeroes(int[] nums) { // 记录下一个非零元素要放置的位置 int nonZeroPos = 0; // 遍历数组,把所有非零元素移到数组前面 for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { nums[nonZeroPos] = nums[i]; nonZeroPos++; } } // 把剩下的位置全部设为0 for (int i = nonZeroPos; i < nums.length; i++) { nums[i] = 0; } } }
方式二:原地交换(更简洁)
class Solution { public void moveZeroes(int[] nums) { int left = 0; // left指针指向当前需要放置非零元素的位置 for (int right = 0; right < nums.length; right++) { // 右指针遇到非零元素,就和左指针位置交换 if (nums[right] != 0) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; left++; } } } }
这个思路的核心是:left指针始终等着放接下来的非零元素,right指针遍历整个数组,遇到非零就交换到left的位置,然后left右移。这样既保证了非零元素的相对顺序,又把所有零“挤”到了数组末尾。
内容的提问来源于stack exchange,提问作者Arif Howlader
相关产品推荐
相关产品推荐

