LeetCode283. Move Zeroes
来源:互联网 发布:易华录数据湖 编辑:程序博客网 时间:2024/05/21 09:53
Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
原题的意思是给定一个数组,将0元素移到数组尾部,并且不改变非零元素的相对位置。
方案一
我们观察数组前后改变的样式,就可以发现,第i个非零元素前面有count个0,那么他的位置就向前移动了count个位置,因此我们只需要将每个非零元素前面的0的个数计算出来,并且将非零元素向前移动count个位置;最后,从数组的尾部开始,将最后count个元素置为零即可。
void moveZeroes_1(int* nums, int numsSize){ int i=0; int count = 0; int m =numsSize-1; while(i<numsSize) { if (nums[i]==0) { count++;//计算0的个数 i++; } else //i不等于0 { nums[i-count] = nums[i]; //将nums[i]向前移动count个位置 i++; } } for (int j=count;j>=1;j--) //将数组的最后count个元素置为0 { nums[m] = 0; m--; }}
方案二
方案一中我们用了两个循环,太麻烦,虽然时间复杂度是o(n),但是我们试图在一个循环中完成操作,所以这个时候我们就需要两个变量来指示,一个试探0元素所在的位置,一个表示当前的非0元素。
先给出代码实现:
void moveZeroes(int* nums, int numsSize){ int i,j,temp; i=0; j=0;//j是试探指针,找出非零位置 while(j<numsSize) { if (nums[j]==0) { j++; } else { if (i!=j) { temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; } i++; j++; } }}
i指向当前的第一个零元素,j指向非零元素,并且i之前的元素都是非零元素,i和j之间都是零元素。
0 0
- leetcode283 : Move Zeroes
- [LeetCode283]Move Zeroes
- leetcode283 Move Zeroes
- LeetCode283. Move Zeroes
- leetcode283: Move Zeroes
- Leetcode283. Move Zeroes
- leetcode283~Move Zeroes
- leetcode283. Move Zeroes
- LeetCode283. Move Zeroes 解答
- leetcode283. [Array]Move Zeroes My Submissions Question
- LeetCode283——Move Zeroes我的解法
- leetcode283---Move Zeroes(把0移到数组后面)
- Leetcode283 Move Zeros
- LeetCode283——Move Zeroes(将0移动到数组最后面)
- Move Zeroes
- Move Zeroes
- Move Zeroes
- Move Zeroes
- PHP TP模板下的QQ登录(PC)
- Mb(全称为Mbps)与MB(Mbytes)的区别
- 怎么解决android开发的百度地图的签名问题
- 基于live555的rtsp封装rtspperf的客户端源码解析
- 34.Search for a Range LeetCode Java版代码
- LeetCode283. Move Zeroes
- 超图 获取空间所有集合
- c++string.find()函数用法
- Oracle 11G Client 客户端配制客户端监听和网络服务名
- 泛微8.0 应用中心菜单打开,解决菜单少问题
- JSON解析 null处理
- nginx的400错误bad request
- Android Volley 源码解读
- 谈谈SVD和LSA