Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
二、思路分析:
思路一:
- 在头尾两端的指针向中间收缩的过程中进行判断交换位置即可
思路二:
- 遍历两边nums,第一遍遍历奇数,放在result数组中,第二遍遍历偶数,继续添加到result数组中
思路三:
- 首先从左边开始找到第一个偶数取名索引left,然后从这个偶数右边开始遍历索引index。
- 如果index遍历到奇数就和left的换位置,一起往右移。
- 是偶数的话,就index自己往右移。
三、AC 代码:
思路一:
class Solution {
public int[] exchange(int[] nums) {
int firstPointer = 0, secondPointer = nums.length - 1;
while (firstPointer < secondPointer) {
while (nums[firstPointer] % 2 == 1 && firstPointer < secondPointer) {
firstPointer++;
}
while (nums[secondPointer] % 2 == 0 && firstPointer < secondPointer) {
secondPointer--;
}
int temp = nums[firstPointer];
nums[firstPointer] = nums[secondPointer];
nums[secondPointer] = temp;
firstPointer++;
secondPointer--;
}
return nums;
}
}
思路二:
class Solution {
public int[] exchange(int[] nums) {
int n = nums.length, index = 0;
int[] result = new int[n];
for (int num : nums) {
if (num % 2 == 1) result[index++] = num;
}
for (int num : nums) {
if (num % 2 == 0) result[index++] = num;
}
return result;
}
}
思路三:
class Solution {
public int[] exchange(int[] nums) {
int left = 0;
while (left < nums.length) {
if (nums[left] % 2 == 0) {
break;
} else {
left++;
}
}
int index = left + 1;
while (index < nums.length) {
if (nums[index] % 2 != 0) {
swap(nums, left++, index++);
} else {
index++;
}
}
return nums;
}
public void swap(int[] nums, int i, int j) {
int tempVar = nums[i];
nums[i] = nums[j];
nums[j] = tempVar;
}
}