数组和矩阵问题:奇数下标都是奇数或者偶数下标都是偶数

题目

  给定一个长度不小于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 }

 

posted @ 2019-03-13 15:00  米突小搞羊  阅读(542)  评论(0编辑  收藏  举报