283. 移动零
题目:
思路:
【1】置换的方式(由于0是需要移到后面,倒不如说是非零的要往前挪动,前面有多少个0就需要移动多少格,为了尽量少的动,那么明确的计算出位置只交换一次是最少的,全部非零的都移动完了,也就说明必须要先遍历一遍数组,统计0的个数,和顺便挪动非零的数值,做完了,会发现由于挪动过程中某些0会被覆盖,所以往数组后面补0,补到满足即可,这不会对那些非零的造成问题,甚至你在互换的过程中将数据变动都可以,但是这样变换的操作就会增加)
代码展示:
//时间1 ms 击败 100% //内存44.1 MB 击败 26.77% //时间复杂度:O(n,其中 n 为序列长度。每个位置至多被遍历两次。 //空间复杂度:O(1)。只需要常数的空间存放若干变量。 class Solution { public void moveZeroes(int[] nums) { int count = 0; for (int i = 0; i < nums.length; i++){ if (nums[i] == 0) { count++; }else { nums[i-count] = nums[i]; } } while (count > 0) nums[nums.length - count--] = 0; } }