题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
1 <= 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
解法一:快慢双指针
解题思路:
- 让j先走
- 如果nums[j]为奇数则与nums[i]进行交换并增加i的索引
- 循环直到j到达数组尾部
- 退出循环返回结果
–执行时间:28 ms --内存消耗:6 MB
func exchange(nums []int) []int {
i:=0
j:=0
var mid int
for j<len(nums){
if nums[j]%2!=0{
mid=nums[i]
nums[i]=nums[j]
nums[j]=mid
i++
}
j++
}
return nums
}
解法二:头尾双指针
解题思路:
- 从头部和尾部同时出发,如果满足交换条件则交换
- 不满足则判断头部位置的数值是否为奇数,为奇数:head++
- 再判断尾部位置的数值是否是偶数,为偶数:tail–
- 指针相遇则退出循环,返回结果
–执行时间:24 ms --内存消耗:6.2 MB
func exchange(nums []int) []int {
head:=0
tail:=len(nums)-1
var mid int
for head<tail{
if nums[head]%2==0 && nums[tail]%2!=0{
mid=nums[head]
nums[head]=nums[tail]
nums[tail]=mid
head++
tail--
}else{
if nums[head]%2!=0{
head++
}
if nums[tail]%2==0{
tail--
}
}
}
return nums
}
在LeetCode该题中,我也有提交题解,欢迎查看。昵称:Sakura。