调整数组顺序使得奇数位于偶数前面。不限排列顺序,只要求奇数在偶数前面。
package 剑指Offer; import java.util.LinkedList; /** * @program:多线程和IO * @descripton:调整数组顺序使得奇数位于偶数前面 * @author:ZhengCheng * @create:2021/10/11-14:05 **/ public class ChangePositon { //思路1:最简单的思路当然是遍历一次数组,将奇数保存在一个数组中,将偶数保存在一个数组中。然后复制。 //但是这样的方法需要占用On的空间,同时时间复杂度是On private int[] sortA(int[] arr){ LinkedList<Integer> tempa = new LinkedList<>(); LinkedList<Integer> tempb = new LinkedList<>(); for (int i = 0; i < arr.length; i++) { if (arr[i] % 2 ==1){ tempa.add(arr[i]); }else { tempb.add(arr[i]); } } for (int i = 0; i < arr.length; i++) { if (tempa.size() != 0){ arr[i] = tempa.remove(); }else { arr[i] = tempb.remove(); } } return arr; } //思路2:既然思路1中的方法占用了空间,那么我们是否可以想到使用原地交换的方式。 //使用双指针。 private int[] sortB(int[] arr){ int i = 0; int j = arr.length-1; //退出条件? i==j or i > j while (i < j){ while (arr[i] % 2 !=0){ i++; } while (arr[j] % 2 == 0){ j--; } if (i == j || i >j){ break; } swap(arr , i , j); } return arr; } private void swap(int[] arr ,int i ,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {1,2,4,5,6,3}; // new ChangePositon().sortA(arr); new ChangePositon().sortB(arr); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } } }