LeetCode 热题 100 -- 283、移动零

LeetCode 热题 100 -- 283、移动零 大家好今天依旧来分享我的Hot100的解题思路今天开始做双指针类型的题目。1、分析题目题目给定一个nums要求把其中的0移动到末尾但不能改变非零元素的相对顺序并且要求不能复制数组也就是不开辟新的空间进行操作。题目意思很好理解重点是思路。其实如果没有什么限制条件的话我们可以很容易的想到说再创建一个数组result随后遍历nums记录0的个数同时将非零元素存入result最后在补上对应个数的0。或者遍历nums若当前元素为0直接remove同时记录0的个数完成后再在数组后补零即可。这当然没问题这是一道难度为简单的题目很多方法都能解决但我们还是要尝试用双指针来解决重点是培养双指针的解题思路。2、解题思路可以创建left和right两个指针初始化都为0。若nums[right]为0则left不动right右移一位若nums[right]非零则left、right均右移一位。这样做能保证left指针的左侧不包括自身均为非零元素right指针左侧直到left位置均为0。显而易见要用到循环终止条件只需要right nums.length即可。以下是我的初次代码实现相信各位大佬肯定发现这版代码可以优化。当数组的开头是非零元素时会进行自身跟自身进行比较的情况是浪费效率的。同时由于每次交换除自身与自身交换时right所在位置都会被赋值为0所以可以不用使用temp直接nums[left] nums[right] , nums[right] 0就行。再同时可以观察到right在每次循环都需要自增所以可以用for循环实现right自增而不需要手动自增。最终的代码实现如下提交记录如下3、总结这道题目难度不大主要是用来训练双指针的解题思路作为一名小白写的代码肯定还有许多需要优化的地方如果有大佬有好的建议希望能不吝赐教我们下次见喽。