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


    题目

      给定一个长度不小于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 }
  • 相关阅读:
    WinForm窗体间传值
    C# 把字符串类型日期转换为日期类型
    datagridview数据导出到excel
    C#中对文件的操作小结
    保证应用程序只有一个实例运行
    c#读取excel到dataset
    让select下的option选中
    使用mpvue开发小程序教程(二)
    手把手教你用vue-cli构建一个简单的路由应用
    wangEditor
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10523172.html
Copyright © 2020-2023  润新知