不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

题目

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

我的复述:

题解

双指针

  • 声明左指针left在数组的最左边,右指针right在数组的最右边;

  • 左指针left指向的数字为1,是奇数,因此移动到下一个数字2;

  • 左指针指向的数字2位偶数,右指针指向的数字3位奇数,因此将两个指针指向的数字调换;

  • 左指针指向下一个数字4,是偶数,需要调换,因此需要右指针right指向一个奇数,而此时的右指针指向的是数字6,也是偶数,所以将右指针向左移动一个位置,指向数字5;
  • 当右指针指向数字5的时候,发现是奇数,因此与左指针left指向的数字4进行调换;
  • 调换后,左指针继续向右边移动,当发现左右指针重合,遍历结束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Java
class Solution {
public int[] exchange(int[] nums) {
//定义左指针left
int left = 0;
//定义右指针right
int right = nums.length - 1;
//定义临时变量 tmp
int tmp;
//移动left 和 right,直到left在right右侧或者相遇为止
while (left < right) {
//如果left指针指向的元素是奇数,那么说明元素在左侧了,观察其它元素,即让 left 向右移动
while (left < right && (nums[left] & 1) == 1) left++;
//如果right指针指向的元素是偶数,那么说明元素在右侧了,观察其它元素,即让 right 向左移动
while (left < right && (nums[right] & 1) == 0) right--;
//否则就说明,此时要么 left 指向的元素值为偶数,要么 right 指向的元素为奇数
//交换这两个位置的元素
tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
return nums;
}
}

leetcode-cn执行:

1
2
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:48.9 MB, 在所有 Java 提交中击败了84.14%的用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Go
func exchange(nums []int) []int {
//定义左指针left
left := 0
//定义右指针right
right := len(nums) - 1
//定义临时变量 tmp
var tmp int
//移动left 和 right,直到left在right右侧或者相遇为止
for left < right {
//如果left指针指向的元素是奇数,那么说明元素在左侧了,观察其它元素,即让 left 向右移动
for left < right && (nums[left] & 1) == 1 {
left++
}
//如果right指针指向的元素是偶数,那么说明元素在右侧了,观察其它元素,即让 right 向左移动
for left < right && (nums[right] & 1) == 0 {
right--
}
//否则就说明,此时要么 left 指向的元素值为偶数,要么 right 指向的元素为奇数
//交换这两个位置的元素
tmp = nums[left]
nums[left] = nums[right]
nums[right] = tmp
}
return nums
}

leetcode-cn执行:

1
2
执行用时:16 ms, 在所有 Go 提交中击败了88.81%的用户
内存消耗:6.4 MB, 在所有 Go 提交中击败了23.34%的用户
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!