数组和矩阵问题:奇数下标都是奇数或者偶数下标都是偶数
【题目】
给定一个长度不小于2的数组 arr, 实现一个函数调整 arr, 要么让所有的偶数下标都是偶数,要么让所有的奇数下标都是奇数。
【题目】
如果 arr 的长度为 N,函数要求时间复杂度为 O(N), 额外空间复杂度为 O(1)。
【难度】
一星
【解答】
1. 设置变量 even, 表示目前 arr 最左边的偶数下标,初始时 even=0;
2. 设置变量odd, 表示当前 arr 最右边的奇数下标,初始时 odd=1;
3. 不断检查 arr 的最后一个数,即 arr[N-1]。如果 arr[N-1] 为偶数,交换 arr[N-1] 和 arr[even], 然后令 even = even + 2。如果 arr[N-1] 为奇数,交换 arr[N-1] 和 arr[odd], 然后令 odd = odd + 2。继续重复步骤3。
4. 如果 even 或者 odd 大于或等于N,即超出数组边界,过程终止。
总之:如果最后位置的数是偶数,就向偶数下标发送;最后位置的数是奇数,就向奇数下标发;如果偶数下标或奇数下标已经无法再向右移动,说明调整结束。调整的过程请查看如下代码中的 modify 方法。
1 import java.util.Arrays; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 int[] arr = {1,8,3,2,4,6}; 7 new Main().modify(arr); 8 System.out.println(Arrays.toString(arr));//[6, 1, 8, 3, 2, 4] 9 } 10 11 public void modify(int[] arr){ 12 if(arr == null || arr.length < 2) return; 13 int even = 0; 14 int odd = 1; 15 int end = arr.length - 1; 16 while(even <= end && odd <= end){ 17 if(arr[end] % 2 == 0){//偶数 18 swap(arr, even, end); 19 even += 2; 20 }else{//奇数 21 swap(arr, odd, end); 22 odd += 2; 23 } 24 } 25 } 26 27 public void swap(int[] arr, int i, int j){ 28 int tmp = arr[i]; 29 arr[i] = arr[j]; 30 arr[j] = tmp; 31 } 32 33 }