剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
用到 位运算 知识点;
描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
链接
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - 力扣(LeetCode) (leetcode-cn.com)
解法一:双指针,可以实现 原地交换
1 class Solution { 2 public int[] exchange(int[] nums) { 3 int left = 0, right = nums.length - 1; 4 while (left < right) { 5 // 目标: 奇数在前,偶数在后 6 // 如果为奇数,往前进一位 7 while (left < right && (nums[left] & 1) == 1 ) { 8 left++; 9 } 10 11 // 如果为偶数,后退一位 12 while (left < right && (nums[right] & 1) == 0) { 13 right--; 14 } 15 16 // 此时,left侧 是 偶数,right侧 是 奇数,交换 17 int tmp = nums[left]; 18 nums[left] = nums[right]; 19 nums[right] = tmp; 20 } 21 return nums; 22 } 23 }
解法二: 双端队列 (不推荐,输出的时候 Deque 需要转成 int[] 输出,很麻烦)
1 class Solution { 2 public int[] exchange(int[] nums) { 3 Deque<Integer> tmp = new ArrayDeque<Integer>(); 4 for (int num:nums) { 5 if((num & 1) == 1){ 6 tmp.addFirst(num); 7 } 8 else { 9 tmp.addLast(num); 10 } 11 } 12 int[] arr2 = Arrays.stream(tmp.toArray(new Integer[]{})).mapToInt(Integer::valueOf).toArray(); 13 return arr2; 14 } 15 }
参考
调整数组顺序使奇数位于偶数前面 - 力扣(LeetCode) (leetcode-cn.com)