给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。
对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。
你可以返回 任何满足上述条件的数组作为答案 。
输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
输入:nums = [2,3]
输出:[2,3]
1 )原生sort + 一般方法
function sortArrayByParityII(nums: number[]): number[] {
// 进行升序排序
nums.sort((a, b) => a - b);
// 声明一个空数组用来存储奇偶排序后的数组
const res: number[] = [];
// 记录奇数、偶数位下标
let odd: number = 1;
let even: number = 0;
// 对数组进行遍历
nums.forEach(item => {
if (item % 2 === 1) {
res[odd] = item;
odd += 2;
} else {
res[even] = item;
even += 2;
}
})
return res;
};
2 )两次遍历 + & 运算判断奇偶对位存放
function sortArrayByParityII(nums: number[]): number[] {
const ans: number[] = new Array(nums.length);
let i: number = 0; // 默认i以0开始
for (const x of nums) {
if (!(x & 1)) {
ans[i] = x;
i += 2;
}
}
i = 1; // 这里 i 从1开始
for (const x of nums) {
if (x & 1) {
ans[i] = x;
i += 2;
}
}
return ans;
};
3 )双指针,奇偶交换
function sortArrayByParityII(nums: number[]): number[] {
const n: number = nums.length;
let j: number = 1; // j奇数从1开始
// i 索引从0开始,偶数,每次递增2,仍为偶数
for (let i: number = 0; i < n; i += 2) {
// i是偶数, 如果当前 nums[i] 是奇数, 注意,题目要求 nums[i] 最终也是偶数
if (nums[i] & 1) {
// 如果 nums[j]是奇数, j递增2,j仍旧奇数
while (nums[j] & 1) {
j += 2;
}
// 跳出while时, nums[j]为偶数了,交换 nums[i](当前奇数, 应为偶数) 和 nums[j](当前偶数, 应为奇数)
[nums[i], nums[j]] = [nums[j], nums[i]];
}
}
return nums;
};