题目描述


题解
////////////////////////////// 双指针法 ///////////////////////////
// 力扣
// 执行用时:3 ms, 在所有 Java 提交中击败了29.92%的用户
// 内存消耗:46.4 MB, 在所有 Java 提交中击败了77.86%的用户
class Solution {
public int[] exchange(int[] nums) {
int head = 0
int end = nums.length - 1
int temp = 0
while (head < end) {
if (nums[head] % 2 == 0 && nums[end] % 2 != 0) { // 头指针找偶数,尾指针找奇数
temp = nums[head]
nums[head] = nums[end]
nums[end] = temp
end -= 1
head += 1
}
else if (nums[head] % 2 == 0) { // 头指针找偶数,尾指针没找到奇数
end -= 1
continue
}
else if (nums[end] % 2 != 0) { // 尾指针找奇数,头指针没找到
head += 1
continue
}
else {
end -= 1
head += 1
}
}
return nums
}
}
///////////////////////////////// 直接法 /////////////////////////////
// 牛客
// 运行时间:9ms
// 占用内存:9780k
public class Solution {
public void reOrderArray(int[] array) {
int[] dummy = array.clone(); // 用于遍历,原array用于修改
int head = 0;
int countOdd_end = 0;
for (int x : array) {
if (!isEven(x))
countOdd_end += 1;
}
for (int x : dummy) {
if (isEven(x)) {
array[countOdd_end++] = x;
}
else {
array[head++] = x;
}
}
}
// 判断是否是偶数
private boolean isEven(int x) {
return (x % 2 == 0);
}
}
// 力扣
// 执行用时:4 ms, 在所有 Java 提交中击败了9.50%的用户
// 内存消耗:47.8 MB, 在所有 Java 提交中击败了12.24%的用户
public class Solution {
public int[] exchange(int[] array) {
int[] dummy = array.clone();
int head = 0;
int countOdd_end = 0;
for (int x : array) {
if (!isEven(x))
countOdd_end += 1;
}
for (int y : dummy) {
if (isEven(y)) {
array[countOdd_end++] = y;
}
else {
array[head++] = y;
}
}
return array;
}
// 判断是否是偶数
private boolean isEven(int x) {
return (x % 2 == 0);
}
}
//////////////////////////////////// 冒泡 ////////////////////////////
// 牛客
// 运行时间:9ms
// 占用内存:9652k
public class Solution {
public void reOrderArray(int[] array) {
int len = array.length;
int temp = 0;
for (int i = len - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (isEven(array[j]) && !isEven(array[j + 1])) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
// 判断是否是偶数
private boolean isEven(int x) {
return (x % 2 == 0);
}
}