剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
解题方法一
/**
* 暴力循环
* 执行用时:2 ms, 在所有 Java 提交中击败了74.59%的用户
* 内存消耗:49.2 MB, 在所有 Java 提交中击败了5.05%的用户
* 新建一个res数组,长度与原数组长度相同,然后进行两轮循环,先寻找奇数元素再遍历偶数元素。
* @param nums
* @return
*/
public int[] exchange(int[] nums) {
int[] res = new int[nums.length];
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] % 2 != 0){
res[j++] = nums[i];
}
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] % 2 == 0){
res[j++] = nums[i];
}
}
return res;
}
解题方法二
/**
* 双指针
*
* 算法流程:
* 初始化: i , j 双指针,分别指向数组 nums 左右两端;
* 循环交换: 当 i=j 时跳出;
* 指针 i 遇到奇数则执行 i=i+1 跳过,直到找到偶数;
* 指针 j 遇到偶数则执行 j=j−1 跳过,直到找到奇数;
* 交换 nums[i] 和 nums[j] 值;
* 返回值: 返回已修改的 nums 数组。
*
* 时间复杂度 O(N) : N 为数组 nums 长度,双指针 i, j 共同遍历整个数组。
* 空间复杂度 O(1) : 双指针 i, j 使用常数大小的额外空间。
*
* @param nums
* @return
*/
public int[] exchange2(int[] nums) {
if (nums == null || nums.length == 0) return nums;
int i = 0, j = nums.length - 1, tmp;
while(i < j) {
while(i < j && (nums[i] & 1) == 1) i++; // (nums[i] & 1) == 1 奇数
while(i < j && (nums[j] & 1) == 0) j--; //(nums[i] & 1) == 0 偶数
tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
return nums;
}
微信关注
阅读剩余
版权声明:
作者:理想
链接:https://www.imyjs.cn/archives/586
文章版权归作者所有,未经允许请勿转载。
THE END