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

题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
知识点
数组
思路
解法一、多开一个数组先存偶数数字,把所有奇数数字移到前面,再将偶数数字拼接到最后。
解法二、在当前数组中进行交换:
even用来存第一个偶数数字下标;
odd存需要换的奇数数字下标;
flag表示偶数下标是否已经存过,否则为false,是则为true,存过将不再存;
每次even<odd时,将odd下标的数字换到第一个even数字前,并更新下标。
剑指offer_调整数组顺序使奇数位于偶数前面

代码

public class Solution {
    public void reOrderArray(int [] array) {
        int even=0;
        for(int i=0;i<array.length;i++){
            if((array[i]&1)==0){
                even++;//计算偶数个数
            }
        }
        int[] array1 = new int[even];//开个新数组存偶数
        int j=0;
        int odd=0;
        for(int i=0;i<array.length;i++){
            if((array[i]&1)==0){
                array1[j]=array[i];
                j++;
            }else{
                array[odd]=array[i];
                odd++;//将奇数往前放
            }
        }
        for(int i=0;i<array1.length;i++){
            array[odd] = array1[i];//将偶数拼到奇数后面
            odd++;
        }
    }
}
public class Solution {
    public void reOrderArray(int [] array) {
        int even=-1;//偶数下标
        int odd=-1;//奇数下标
        boolean flag = false;//是否更新过偶数下标
        for(int i=0;i<array.length;i++){
            if((array[i]&1)==1){
                odd=i;
            }else if((array[i]&1)!=1&&flag==false){
                even=i;//只要存第一个偶数下标
                flag=true;
            }
            if(even<odd&&(odd!=-1)&&(even!=-1)){
                int tempt = array[odd];
                for(int j=odd;j>even;j--){
                    array[j]=array[j-1];
                }
                array[even] = tempt;
                odd = even;
                even++;//将奇数移到第一个偶数前,第一个偶数下标++
            }
        }
    }
}
上一篇:Java基础语法之for/while循环——求100以内奇数/偶数和


下一篇:3.7牛客2021年度训练联盟热身训练赛第一场D.Some sum[思维]