剑指offer——调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面

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

遍历一遍数组,可以使用队列或者来将偶数先暂时存放起来,然后将奇数按照顺序放到数组的前边,最后遍历队列或栈,将偶数按照顺序放入

注意:使用队列的话,先入先出,从奇数后面挨着往后放

  使用栈的话,先入后出,从数组的最后一个位置开始往前放

而且注意在队列或者栈中要使用引用类型Integer,而不能使用基本数据类型int

队列实现:

import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    public void reOrderArray(int [] array) {
        Queue<Integer> queue = new LinkedList<>();
        int flag = 0;
        for(int i = 0; i < array.length; ++i){
            if(array[i] % 2 == 0){
                queue.offer(array[i]);
            }else{
                array[flag++] = array[i];
            }
        }
        while(queue.peek() != null){
            array[flag++] = queue.poll();
        }
    }
}

 

使用队列时注意:

判断是否为空(获取但不删除) queue.peek() == null  区别于queue.element()为空时抛异常

添加元素:queue.offer()  满了时 返回false,而add()满了时,会报错

弹出元素:queue.poll()  为空时 返回null, 而remove()满了时,会抛异常

而且要注意:Queue是一个接口,不能直接使用它,而需要使用实现了它的类

参考:Java 集合深入理解(9):Queue 队列

栈实现:

  • push 入栈
  • pop 栈顶元素出栈,并返回
  • peek 获取栈顶元素,并不删除
  • empty 

参考:Java 集合深入理解(13):Stack 栈

import java.util.Stack;
public class Solution {
    public void reOrderArray(int [] array) {
        Stack<Integer> stack = new Stack<>();
        int flag = 0;
        for(int i = 0; i < array.length; ++i){
            if(array[i] % 2 == 0){
                stack.push(array[i]);
            }else{
                array[flag++] = array[i];
            }
        }
        flag = array.length - 1;
        while(!stack.empty()){
            array[flag--] = stack.pop();
        }
    }
}

  

原文地址:https://www.cnblogs.com/SkyeAngel/p/8532257.html