1. 程式人生 > 其它 >劍指Offer21.調整陣列順序使奇數偶數前面

劍指Offer21.調整陣列順序使奇數偶數前面

題目

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。

示例:

輸入:nums =[1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。


提示:

0 <= nums.length <= 50000
1 <= nums[i] <= 10000

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解題方法

左右指標 與 快慢指標

時間複雜度O(n),空間複雜度O(1)

程式碼

// 左右指標
func exchange(nums []int) []int {
	if len(nums) <= 1{
		return nums
	}
	// 定義左右兩個指標
	left,right := 0,len(nums)-1
	// 兩指標相遇是迴圈結束
	for left < right{
		// 如果左指標元素為偶數,右指標為奇數,兩元素進行交換
		if nums[left]%2==0&&nums[right]%2!=0{
			nums[left],nums[right]=nums[right],nums[left]
		}
		// 左指標一直往右移動,直到為奇數
		for left < right && nums[left] % 2 != 0{
			left++
		}
		// 右指標一直往左移動,直到為偶數
		for left < right && nums[right] % 2 == 0{
			right--
		}
	}
	return nums
}

// 快慢指標
func exchange2(nums []int) []int {
	if len(nums) <= 1{
		return nums
	}
	// 定義兩個快慢指標,快指標先走,左指標指向待替換的元素,快指標找到下一個需要替換的奇數
	for low,fast := 0,0;fast < len(nums);fast++{
		// 當快指標找到奇數時進行替換
		if nums[fast] % 2 != 0{
			nums[low],nums[fast] = nums[fast],nums[low]
			low++
		}
	}
	return nums
}