剑指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是一个接口,不能直接使用它,而需要使用实现了它的类
栈实现:
- push 入栈
- pop 栈顶元素出栈,并返回
- peek 获取栈顶元素,并不删除
- empty
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(); } } }