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;
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章