zoukankan      html  css  js  c++  java
  • 剑指offer-7:调整数组顺序使奇数位于偶数前面

    一、相对位置可以改变

    1、题目

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

    2、分析

      不考虑相对位置,可以类比快排,用左右指针法。

        left=0,从左向右遍历,若是奇数left加一,若是偶数与右边的奇数交换位置。

        right=arr.length-1,从右向左遍历,若是偶数right加一,若是奇数与左边的偶数交换位置。                     

    3、代码

    public static void reOrderArray(int [] array) {
        int i=0;
        int j=array.length-1;
        int temp=0;
       while(i<j){
     
           if ((array[i]&1)==1){
               i++;
               continue;
           }
           if ((array[j]&1)==0) {
               j--;
               continue;
           }
           temp=array[i];
           array[i]=array[j];
           array[j]=temp;
           i++;
           j--;
       }
       for (int ii=0;ii<array.length;ii++){
           System.out.print(array[ii]+",");
           System.out.println();
       }
    }

    二、相对位置不变

    1、题目

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

    2、分析

      考虑到要保持相对位置,就不能用左右指针法。

    (1)最简单的方法就是循环遍历两次,分别找到奇数、偶数添加到list集合中,最后再把集合中的元素添加到数组中。

    (2)类似于冒泡排序,从头开始,相邻元素只要是前偶后奇就交换,不同的是内循环每次都从头开始,防止一开始就有许多连续的偶数情况

    (3)

    3、代码

    //(1)
    import java.util.*;
    public class Solution {
        public void reOrderArray(int [] array) {
            List<Integer> list = new ArrayList();
            for(int i=0;i<array.length;i++){
                if((array[i]%2)==1){
                    list.add(array[i]);
                }
            }
            for(int i=0;i<array.length;i++){
                if((array[i]%2)==0){
                    list.add(array[i]);
                }
            }
            for(int i=0;i<array.length;i++){
                array[i] = list.get(i);
            }
        }
    }
    
    //(2)
    import java.util.*;
    public class Solution {
        public void reOrderArray(int [] array) {
            int temp = 0;
            int length = array.length;
            for(int i=0;i<length;i++){
                for(int j=0;j<length-1;j++){
                    if((array[j]%2==0)&&(array[j+1]%2==1)){
                        temp = array[j];
                        array[j] = array[j+1];
                        array[j+1] = temp;
                    }
                }
            }
        }
    }
    
    //(3)
    import java.util.*;
    public class Solution {
        public void reOrderArray(int [] array) {
            int left = 0;
            int right = 0;
            int size = array.length;
            while(right < size){
                if(array[right] % 2 != 0){
                    int temp = array[right];
                    for(int i=right ;left<i;i--){
                        array[i] = array[i-1];
                    }
                    array[left] = temp;
                    right ++;
                    left ++;
                }else{
                    right ++;
                }
            }
        }
    }
  • 相关阅读:
    [leedcode 104] Maximum Depth of Binary Tree
    [leedcode 103] Binary Tree Zigzag Level Order Traversal
    [leedcode 102] Binary Tree Level Order Traversal
    [leedcode 101] Symmetric Tree
    [leedcode 100] Same Tree
    [leedcode 99] Recover Binary Search Tree
    深入理解java虚拟机---内存分配策略(十三)
    jmeter4.0 源码编译 二次开发
    jmeter源码导入eclipse并执行
    深入理解java虚拟机---垃圾回收(十一)
  • 原文地址:https://www.cnblogs.com/JimShi/p/11389784.html
Copyright © 2011-2022 走看看