zoukankan      html  css  js  c++  java
  • 《剑指Offer》题目:调整数组顺序使奇数位于偶数前面

    题目描述:调整数组顺序使奇数位于偶数前

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    题目分析:

    题目的关键在于在移位以后,奇数和奇数以及偶数和偶数之间的相对位置保持不变。

    Java代码:

    public class ReOrderArray {
    
        //这种方法不能保证奇数和奇数,偶数和偶数之间的相对位置不变
        public static void reOrderArray(int [] array) {
            if (array.length == 0 || array.length == 1) return;
            int p1 = 0;
            int p2 = array.length-1;
            int temp = 0;
            while (p1 < p2){
                if (array[p1] %2 == 0){
                    if (array[p2] % 2 == 0) p2--;
                    else {
                        temp = array[p2];
                        array[p2] = array [p1];
                        array[p1] = temp;
                        p1++;
                        p2--;
                    }
                }else {
                    p1++;
                }
            }
        }
    
        //这种方法可以保证奇数和奇数,偶数和偶数之间的相对位置不变
        public static void reOrderArray1(int [] array){
            if (array.length == 0 || array.length == 1) return;
            int p1 = 0;
            int p2 = 1;
            int temp = 0;
            while ( p2 < array.length){
                //如果p1已经指向了偶数,这时开始向后移动p2,直到p2指向奇数,然后开始交换
                if (array[p1] % 2 == 0){
                    if (array[p2] % 2 == 0){
                        p2++;
                    }else {
                        //为保证相对位置不变,采用移位
                        temp = array[p2];
                        for (int i = p2; i > p1; --i){
                            array[i] = array[i-1];
                        }
                        array[p1] = temp;
                    }
                }
                //如果p1指向的元素为奇数,p1向后移直到指向偶数,此时p2始终位于p1后面一位
                else {
                    p1++;
                    p2 = p1+1;
                    continue;
                }
            }
        }
        public static void main(String[] args){
            int [] arr = new int[]{1,-3,4,-6,8,-9,7};
            reOrderArray1(arr);
            for (int i=0; i<arr.length; ++i){
                System.out.print(arr[i]+ " ");
            }
    
        }
    }
    技进乎艺,艺进乎道
  • 相关阅读:
    iPhone网络编程初体验
    va_list实现不定参数C函数
    iphone网络编程总结(链接)
    一周好文(4)
    10个迷惑新手的Cocoa&Objectivec开发问题
    Flash通过Action Script调用C++接口
    easyui表单对numberbox控件进行赋值需要注意
    asp.net生成缩略图及给原始图加水印
    用超链接在页面之间传值的注意事项(来自:http://www.souzz.net)
    超酷的分类导航代码
  • 原文地址:https://www.cnblogs.com/weekend/p/6979649.html
Copyright © 2011-2022 走看看