题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
Leetcode链接:剑指offer面试题21:调整数组顺序使奇数位于偶数前面
算法分析
-
刚看到题目想到的是用快排思想,首尾双指针解决
时间复杂度为O(n),空间复杂度为O(1) -
看了leetcode题解后发现也可以用快慢指针解决
时间复杂度O(n),空间复杂度O(1)
Golang代码如下
// 首尾指针
func exchange1(nums []int) []int {
// 判空
if len(nums) == 0 {
return nums
}
// 判断奇偶
isEvenNum := func(num int) bool {
if num & 1 == 0 {
return true
}
return false
}
i, j := 0, len(nums) - 1
for i < j {
for i < j && isEvenNum(nums[j]) {
j--
}
nums[i], nums[j] = nums[j], nums[i]
i++
for i < j && !isEvenNum(nums[i]) {
i++
}
nums[i], nums[j] = nums[j], nums[i]
j--
}
return nums
}
// 快慢指针
func exchange2(nums []int) []int {
if len(nums) == 0 {
return nums
}
isEvenNum := func(num int) bool {
if num & 1 == 0 {
return true
}
return false
}
slow, fast := 0, 0
for fast < len(nums) {
if !isEvenNum(nums[fast]) {
nums[slow], nums[fast] = nums[fast], nums[slow]
slow++
}
fast++
}
return nums
}