LeetCode 283 Move Zeroes
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 283 Move Zeroes相关的知识,希望对你有一定的参考价值。
是道容易题,可以想到很多解法,但有些解法容易出小错误:
1)交换法:
用一个指针p保存零元素起始位置。遍历数组,当发现是非零元素,则和前面的零元素交换,同时p自增一。
这个方法有几个地方容易想错,首先p的初始值怎么定义,如果你把p定义为第一个零元素的下标,则刚开始p你可能会定义为-1,因为你不知道第一个元素是否为零。
但其实p的初值可以为0,当第一个元素为0时自然没错,当第一个元素为非零时,相当于自己和自己交换,也不会错。但这样处理,程序会显得很简洁。
2)整体移动法:
这个方法思路更简单,更不易出错。遍历数组,将所有非零的数依次往前移动,直到移到最后一个数为止。最后将末尾的部分全部赋值0。
1 //交换法 2 void moveZeroes(vector<int>& nums) { 3 int j = 0; 4 for(int i=0; i<nums.size(); i++){ 5 if(nums[i] != 0){ 6 swap(nums[i], nums[j++]); 7 } 8 } 9 } 10 11 //整体移动法 12 void moveZeroes(vector<int>& nums) { 13 int left = 0, right = 0, sz = nums.size(); 14 for(right = 0; right < sz; right++){ 15 if(nums[right] != 0){ 16 nums[left++] = nums[right]; 17 } 18 } 19 while(left < sz) 20 nums[left++] = 0; 21 }
以上是关于LeetCode 283 Move Zeroes的主要内容,如果未能解决你的问题,请参考以下文章