zoukankan      html  css  js  c++  java
  • 【Offer】[21] 【调整数组顺序使奇数位于偶数前面】

    题目描述

      输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,(偶数之间和奇数之间要保持相对顺序)

    思路分析

    1. 如果题目没有要求保持相对顺序,则可以利用快速排序中的“二分”的思想,设置两个指针分别指向数组的头和尾,要将奇数排在偶数的前面,就要头指针扫描到偶数时停止,尾指针要扫描到奇数时停止
    2. 如果题目中要求保持相对顺序,可以用直接插入法的思想,如果遇到奇数,就将该奇数排在它最前面的偶数之前。

    测试用例

    1. 功能测试:输入数组中的奇数、偶数交替出现;输入的数组中所有偶数都出现在奇数的前面;输入的数组中所有奇数都出现在偶数的前面。
    2. 特殊输入测试:输入nullptr指针;输入的数组只包含一个数字。

    Java代码

    public class Offer21 {
        public static void main(String[] args) {
            test1();
            test2();
            test3();
            test4();
        }
    
        public static void reOrderArray(int[] array) {
            Solution2(array);
        }
    
        
        /**
         * 这种方法会打乱偶数之间 奇数之间的相对顺序(题目中并没有要求)
         * 思路,利用快速排序中思想
         * @param array
         */
        private static void Solution1(int[] array) {
            if(array == null) {
                throw new IllegalArgumentException("参数非法!");
            }
            int i = 0;
            int j = array.length - 1;
            while (i < j) {
                while (i < j && !isEven(array[i])) {//如果是奇数i下标后移,直到指向偶数
                    i++;
                }
                while (i < j && isEven(array[j])) {//如果是偶数j 下标前移,直到指向奇数
                    j--;
                }
                if (i < j) {
                    int tmp = array[j];
                    array[j] = array[i];
                    array[i] = tmp;
                }
            }
        }
    
        /**
         * 当题目中要求要保持偶数之间 奇数之间的相对顺序时,
         * 就需要用到这种方法
         * 思路:插入排序的思想
         * @param array
         */
        private static void Solution2(int[] array) {
            if(array==null || array.length<=0) {
                throw new IllegalArgumentException("参数非法!");
            }
            int j,tmp;
            for(int i=1;i<array.length;i++) {
                if(!isEven(array[i])) {
                    tmp = array[i]; 
                    //此处j>=0的条件要放在前面 
                    for(j=i-1; j>=0 && isEven(array[j]);j--) {
                        array[j+1] = array[j];
                    }
                    array[j+1] = tmp;
                    
    //              这种方式 也行
    //              j=i;
    //              while(j>0 && isEven(array[j-1])) {
    //                  array[j] = array[j-1];
    //                  j--;
    //              }
    //              array[j] = tmp;
                    
                }
            }
        }
        
        
        private static boolean isEven(int number) {
            return (number & 1) == 0;
        }
    
        private static void test1() {
            int[] array = { -1, 9, 5, 2, 10, 6 };
            System.out.println("原始数组:" + Arrays.toString(array));
            reOrderArray(array);
            System.out.println("调整结果:" + Arrays.toString(array));
            System.out.println();
        }
        
        private static void test2() {
            int[] array = { 2,10,8, 9,-7,17};
            System.out.println("原始数组:" + Arrays.toString(array));
            reOrderArray(array);
            System.out.println("调整结果:" + Arrays.toString(array));
            System.out.println();
        }
    
        private static void test3() {
            int[] array = { 2};
            System.out.println("原始数组:" + Arrays.toString(array));
            reOrderArray(array);
            System.out.println("调整结果:" + Arrays.toString(array));
            System.out.println();
        }
        
        private static void test4() {
            int[] array = null;
            reOrderArray(array);
        }
    }
    

    代码链接

    剑指Offer代码-Java

  • 相关阅读:
    FNV与FNV-1a Hash算法说明【转】
    FNV哈希算法【转】
    git超详细教程【转】
    Git基础篇【转】
    Notepad++中常用的插件【转】
    美化博客园界面(让您的博客更加赏心悦目)希望对您有用【转】
    scanf()总结--从网上收来的,感觉很好,用来提醒自己,c语言真是博大精深!!【转】
    机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】
    ROS学习网址【原创】
    机器人操作系统ROS Indigo 入门学习(1)——安装ROS Indigo【转】
  • 原文地址:https://www.cnblogs.com/haoworld/p/offer21-diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-y.html
Copyright © 2011-2022 走看看