本文共 918 字,大约阅读时间需要 3 分钟。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0] 说明:必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。1、双指针
创建两个指针i和j,第一次遍历时,用指针j用来记录有多少非0元素,在每次遇到一个非0元素就将其往数组左边挪,j指针的下标指向了最后一个非0元素下标,第二次遍历时,起始位置从j开始,将剩下的元素全部置为0。class Solution { public void moveZeroes(int[] nums) { if(nums==null) { return; } //第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j] int j = 0; for(int i=0;i
2、快速排序
确定一个待分割的元素做中间点x,然后把所有小于等于x的元素放到x的左边,大于x的元素放到右边。 在此题中,用0当做这个中间点,把不等于0的放到中间点的左边(没说不能为负数,所以此处条件为不等于0),等于0的放到其右边。class Solution { public void moveZeroes(int[] nums) { //两个指针i和j int i = 0, j = 0; if(nums == null) return; for(i=0; i < nums.length; i++){ //当前元素!=0,就把其交换到左边,等于0的交换到右边 if(nums[i] != 0){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; j++; } } }}
转载地址:http://owwzi.baihongyu.com/