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

127 阅读1分钟

题目描述

在这里插入图片描述

在这里插入图片描述

// 力扣
// 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
// 使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。


// 牛客
// 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有
// 的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇
// 数和奇数,偶数和偶数之间的相对位置不变。

// 牛客的题目要难一点点,需要保证奇数之间,偶数之间的相对位置不变。

题解

////////////////////////////// 双指针法 ///////////////////////////
// 力扣
// 执行用时: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);
	}
}