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

问题

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

解决

//1、暴力解法,一种神奇的解法 》》
class Solution {
    public int[] exchange(int[] nums) {
        //奇数:不能够被2整除;偶数:能够被2整除,0也是偶数
        int len1=nums.length;
        int[] a=new int[len1];
        int[] b=new int[len1];
        int a1=0,b1=0;
        for(int i=0;i<len1;i++){
            if(nums[i]%2!=0) a[a1++]=nums[i];
            if(nums[i]%2==0) b[b1++]=nums[i];
        }
        int te=0;
        for(int j=0;j<len1;j++){
            if(a[j]==0){
                 a[j]=b[te++];
            }           
        }
        return a;

    }
}
// 2、快慢指针,从一侧开始
class Solution {
    public int[] exchange(int[] nums) {
        int slow = 0,fast = 0;
        while(fast<nums.length){
            if((nums[fast]&1)==1) swap(nums,slow++,fast);
            fast++;
        }
        return nums;
    }

    public void swap(int[] nums,int a,int b){
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] =temp;
    }
}
// 3、利用双指针两头遍历交换
class Solution{
    public int[] exchange(int[] nums){
        if(nums.length==0) return nums;
        int left=0,right=nums.length-1,temp;

        while(left<right){                  //left从左至右寻找偶数,right从右至左寻找奇数
            while(left<right&&(nums[left]&1)==1) left++;            //如果left遇到奇数就跳过
            while(left<right&&(nums[right]&1)==0) right--;          //如果left遇到偶数就跳过

            // swap(nums,left,right);          //当left位置上是偶数、rigth位置上是奇数时,交换两数位置,达到奇数放前面,偶数放后面
            temp=nums[left];
            nums[left]=nums[right];
            nums[right]=temp;

        }
        return nums;
    }
    // public static void swap(int[] arr,int i,int j){      //交换数组两数位置方法
    //     int temp=arr[i];
    //     arr[i]=arr[j];
    //     arr[j]=temp;
    // }
}

总结

三种算法种最后一种时间复杂度较优,因为使用了双指针分别从两头遍历

posted @   new_monkey  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示