283. Move Zeroes

  问题: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循环,外层判断是否为0,内存将0用0之后的数字填补;再加一个循环,将被最后一位数字代替的0还原。

  错误:忽略了同时出现两次0的可能性,忽略了结尾同时有两个相同数字的可能性。

package com.wang.test;

/*
 * @tittle:283. Move Zeroes
 * @auther:wwwglin
 * @time:2016/04/14
 */
public class MoveZeroes {
    public void moveZeroes(int[] nums) {
        // 将非零元素前移,数组最后填充最后一个非0数字
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                for (int j = i ; j < nums.length-1; j++) {
                    nums[j] = nums[j +1 ];
                }                
            }
        }
        // 将填充数字替换为0
        for (int i = nums.length - 1; i > 0; i--) {
            if (nums[i] != nums[i - 1]) {
                break;
            }
            nums[i] = 0;
        }
        return;
    }

    public static void main(String[] args) {
        int[] nums = { 0, 0, 1 };
        System.out.print("old: ");
        for (int i : nums) {
            System.out.print(i + ",");
        }
        System.out.println();
        System.out.print("new: ");
        new MoveZeroes().moveZeroes(nums);
        for (int i : nums) {
            System.out.print(i + ",");
        }
    }
}

  改进:加一个判断,判断替换后本位是否还是0,如果是,重复执行。加一个变量,查看0出现次数。

public void moveZeroes(int[] nums) {
        // 将非零元素前移,数组最后填充最后一个非0数字
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] == 0) {
                for (int j = i; j < nums.length - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                count++;
            }
        }
        // 将填充数字替换为0for (int i = 1; i <= count; i++) {
            nums[nums.length - i] = 0;
        }
    }

  学习:注意while循环的使用。

  但是当我提交的时候提示超时-。-,看来还需要改进。

  解决:尝试转换为list进行解决,超时-。-

  最后百度解决-。-,然后学学把,差距还是很大的。。。

package com.wang.test;

import java.util.ArrayList;
import java.util.List;

/*
 * @tittle:283. Move Zeroes
 * @auther:wwwglin
 * @time:2016/04/14
 */
public class MoveZeroes {
    public void moveZeroes(int[] nums) {
        int i=0;  
        int j=0;  
        while(j<nums.length) {  
            if(nums[j]!=0) {  
               if(j!=i) {   
                    nums[i++] = nums[j];  
                    nums[j] = 0;  
               } else {  
                   ++i;  
               }  
            }   
            ++j;  
        }  

    }

    public static void main(String[] args) {
        int[] nums = { 0, 0, 1 };
        System.out.print("old: ");
        for (int i : nums) {
            System.out.print(i + ",");
        }
        System.out.println();
        System.out.print("new: ");
        new MoveZeroes().moveZeroes(nums);
        for (int i : nums) {
            System.out.print(i + ",");
        }
    }
}

来源:http://blog.csdn.net/xudli/article/details/48574521

  

 

posted @ 2016-04-14 15:48  wwwglin  阅读(172)  评论(0)    收藏  举报