zoukankan      html  css  js  c++  java
  • 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

    问题描述

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

    思路:

    1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这个数,然后把它后面的数字都往前面移动一位,这样最后空出一位放该偶数即可。但显然这样会重复移动很多次。时间复杂的O(n^2)
    2.在前后安排两个哨兵i,j,前面的用来指示偶数(即扫描如果是奇数就往后走),后面的用来指示奇数(遇到偶数就往前面走),当i扫描到偶数而j扫描到奇数时,我们就将其交换。类似扫描下去直到i,j相遇。但是该方法会改变原始元素的相对位置。
    3.(具有可扩展性的解法)
    如果题目改成:把数组中的数按照大小分为两部分,所有负数都在非负数的前面,该怎么做?当然我们改变2中的判断条件即可。那么是否可以用一种可扩展 的方法能解决这一类问题呢?
    当然可以。我们只要把判断部分换成一个通用的函数即可。(具体参考剑指Offer——105页)

    思路1代码:

        public void reOrderArray(int [] array) {
            if(array == null || array.length == 0){
                return;
            }
    
            int n = array.length;
            int count = 0;
    
            for(int i = 0; i < n && count < n; i++){
                count++;
                int a = array[i];
                if(a % 2 == 0){
                    for(int j = i; j < n-1; j++){
                        array[j] = array[j+1];
                    }
    
                    array[n-1] = a;
                    i--;
    
                }
            }
        }

    思路2代码:

    //未考虑元素的相对位置不变
    public void reOrderArray(int [] array) {
            if(array == null || array.length == 0){
                return;
            }
    
            int i = 0;
            int j = array.length - 1;
    
            while(i<j){
                while(i<j && array[i]%2 != 0){
                    i++;
                }
    
                while(i<j && array[j]%2 == 0){
                    j--;
                }
    
                if(i < j){
                    int tmp = array[i];
                    array[i] = array[j];
                    array[j] = tmp;
                }
            }
        }

    现在我们要针对思路2来考虑下:如果我们要求不能改变原始数组中元素的相对位置(奇数与奇数的相对位置,偶数与偶数的),该怎么做?(暂时还没想到好的方法)

  • 相关阅读:
    openssl 生成pfx
    webpack 编译时,提示 Unexpected token: keyword «const»
    .net core 使用 Serilog 作为日志提供者
    k近邻算法
    vscode 无法自动补全第三方库
    centos 7 安装 RabbitMQ
    .net core 发布程序命令(自带运行环境)
    安装node-sass
    .net core 拦截socket
    SDN第三次作业
  • 原文地址:https://www.cnblogs.com/wenbaoli/p/5655721.html
Copyright © 2011-2022 走看看