一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
题目描述
给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 任何满足上述条件的数组作为答案 。(出自力扣)
- 示例1:
输入: nums = [4,2,5,7]
输出: [4,5,2,7]
解释: [4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
- 示例2:
输入: nums = [2,3]
输出: [2,3]
提示:
- 2 <= nums.length <= 2 * 104
- nums.length 是偶数
- nums 中一半是偶数
- 0 <= nums[i] <= 1000
思路分析
根据题意可以知道,给出的非负整数数组nums,数组中一半是奇数,一半是偶数,奇偶数的数量是相等的,奇偶数所对应的下标的数量也是相等的,并且数组的元素数量也是一个偶数;我们可以这样子,指定一个新数组newNums,新数组newNums的长度和原数组nums的长度一样,指定两个指针i=0和j=1分别对应着奇数和偶数的下标;循环遍历原数组,使得原数组的每一项除以2,若能整除就是偶数,若不能整除就是奇数;每一次循环中,若是不能整除,i增加2,若是能整除,j增加2;在每次循环中,条件成立的的原数组元素根据对应的下边i或者j放进新数组newNums中,这样组成的新数组newNums就是题目中所要的目的结果。
AC代码
let nums = [4,2,5,7];
function getNewNums( nums ) {
let newNums = new Array(nums.length);
let i = 0;
let j = 1;
for(let n=0; n<nums.length;n++) {
if(nums[n] % 2 === 0) {
newNums[j] = nums[n];
j += 2
} else {
newNums[i] = nums[n];
i += 2
}
}
console.log(newNums)
}
getNewNums(nums)
总结
这道题的难点就是怎么每隔一个就放进一个奇数或者偶数,只要我们先确定好奇偶数的下标,然后碰到奇数和偶数的时候就根据奇数和偶数的下标放进数组就可以了。注意,这里不需要从小到大或者从大到小排序。