死磕算法系列文章
“Leetcode : https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
“GitHub : https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_16_exchange/Solution.java
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
解题思路:
考虑定义双指针 i , j分列数组左右两端,循环执行:
可始终保证:指针 i 左边都是奇数,指针 j 右边都是偶数 。
算法流程:
复杂度分析:
x&1 位运算 等价于 x % 2x%2 取余运算,即皆可用于判断数字奇偶性。
package com.nateshao.sword_offer.topic_16_exchange;
import java.util.Arrays;
/**
* @date Created by 邵桐杰 on 2021/11/22 12:03
* @微信公众号 程序员千羽
* @个人网站 www.nateshao.cn
* @博客 https://nateshao.gitee.io
* @GitHub https://github.com/nateshao
* @Gitee https://gitee.com/nateshao
* Description: 调整数组顺序使奇数位于偶数前面
*/
public class Solution {
public static void main(String[] args) {
int[] nums = {2, 3, 5, 7, 7, 6, 8, 10};
int[] exchange = exchange(nums);
for (int i : exchange) {
System.out.print(i + " ");
}
System.out.println();
int[] ints = exchange2(nums);
for (int anInt : ints) {
System.out.print(anInt + " ");
}
}
public static int[] exchange(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
while (left < right && nums[left] % 2 != 0) left++;
while (left < right && nums[right] % 2 == 0) right--;
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
return nums;
}
public static int[] exchange2(int[] nums) {
int i = 0, j = nums.length - 1, tmp;
while (i < j) {
while (i < j && (nums[i] & 1) == 1) i++; //x&1位运算等价于 x %2取余运算,即皆可用于判断数字奇偶性。
while (i < j && (nums[j] & 1) == 0) j--;
tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
return nums;
}
}
参考链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/solution/mian-shi-ti-21-diao-zheng-shu-zu-shun-xu-shi-qi-4
革命尚未成功,同志仍需努力,冲冲冲