JAVA -将一个数组中的零全部已到数组后,且原来的元素相对位置不变

将一个数组中的零全部已到数组后,且原来的元素相对位置不变

给定一个数组 nums, 编写一个函数将所有 0 移动到它的末尾,同时保持非零元素的相对顺序。
例如, 定义 nums = [0, 1, 0, 3, 12],调用函数之后, nums 应为 [1, 3, 12, 0, 0]。:

  • 方法1
    冒零法
  • 方法2
    指针法

方法1-冒零法

/*法1,采用的是冒泡的变体 思路:
* 1、采用冒泡排序
* 2、swape条件为 元素不为零即可
* 进一步优化,本题采用该方法
* 1、采用冒泡排序
* 2、添加遍历是否结束的标志位
*/

    public static int[] BoubleArr(int[] arr){
        boolean flage = false;//冒泡标志位
        for(int i=0;i<arr.length; i++){//       冒泡模板
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j]!=0) {//判断元素如果不为零则 进行下一次循环
                    continue;
                }else{
                    if(arr[j+1]!=0){//  交换元素,事实上我们不需要使用第三方变量因为我们知道一个元素一定为零
                        arr[j] = arr[j+1];
                        arr[j+1] = 0;
                        flage = true;
                    }
                }
                if(!flage){//标志位为false代表遍历到了最后,直接结束
                    return arr;
                }
            }
        }
        return arr;
    }

方法2-指针法

/*
* 指针法:
* 1、设置两个指针pre post,从前向后移动两个指针
* 2、pre移动到第一个0元素
* 3、post从pre的位置开始移动到第一个非零元素
* 4、交换pre和post角标所致的两个元素
* 优化:
* 设置标志位,标志遍历是否结束
* 条件是:如若post最后没有遍历到非零元素即跳出遍历
* */

 public static int[] f(int[] arr) {
        int size = arr.length;
        int pre = 0, post = 0;// 找到第一个为零的坐标,后者定位非零的角标
        while (true) {
            boolean flage = false;//判断是否结束的标志位
            for (int j = pre; j < size; j++) {//    从前向后定位第一个为零的数
                if (arr[j] == 0) {
                    pre = j;
                    break;
                }
            }
            for (int k = pre; k < size; k++) {//            从pre起始开始找到第一个非零元素
                if (arr[k] != 0) {
                    post = k;
                    flage = true;
                    break;
                }
            }
            if (!flage) {// 代表随后找不到非零元素
                break;
            }
            int swape = arr[pre];// 交换
            arr[pre] = arr[post];
            arr[post] = swape;
            pre++;//改变pre的角标
        }
        return arr;
    }

猜你喜欢

转载自blog.csdn.net/CTPeng/article/details/82468474