剑指Offer-数组-(3)

知识点/数据结构:数组

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

1:自己写的代码,借助了其他的内存空间

奇数和奇数 偶数和偶数相对位置不变 指的是奇数之间的先后顺序不变,偶数也是。
自己的做法是把奇数挑选出来 ,放在一个新的数组里边;把偶数挑选出来。放在一个新的数组里边。最后把两个信息的数组覆写带原来的数组里边。但是自己的代码太长了 不简洁。

public class Solution {
    public void reOrderArray(int [] array) {
        int count1=0;  int count2=0;      
        for(int i=0;i<array.length;i++){
            if(array[i]%2==1){
                count1++;    
            }
        }
           count2=array.length-count1;  
            int a[]=new int[count1];
            int b[]=new int[count2];
            int m=0;int n=0;
            for(int i=0;i<array.length;i++){
                if(array[i]%2==1){
                    a[m]=array[i];
                    m++;
                }
            }
            for(int i=0;i<array.length;i++){
                if(array[i]%2==0){
                    b[n]=array[i];
                    n++;
                }
            }
            for(int i=0;i<a.length;i++){
               array[i]=a[i];
                
            }
            for(int i=0;i<b.length;i++){
                array[i+a.length]=b[i];
            }
       
    }
}

2:用了两个循环嵌套进行了遍历数组,时间复杂度为还是N(n^2),可以考虑用右移运算符代替取余运算


public class Solution{
    public void reOrderArray(int array[]){
        for(int i=0;i<array.length-1;i++){
            for(int j=0;j<array.length-1-i;j++){
               if((array[j]%2==0)&&(array[j+1]%2==1)){
                   int temp=array[j];
                   array[j]=array[j+1];
                   array[j+1]=temp;
               }
            }
        }
    }
}

较为简洁的思路(不满足相对位置不变,下面的解法是发生变化的):我们可以维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个数字指向的数字是偶数,并且第二个数字指向的数字是奇数,则交换两个数字。

public class Solution{
    public void reOrderArray(int array[]){
       int a=0;
        int b=array.length-1;
        while(a<b){
            while(a<b&&(array[a]&1)==1){
                a++;
            }
            while(a<b&&(array[b]&1)==0){
                b--;
            }
            if(a<b){
                int temp= array[a];
                array[a]=array[b];
                array[b]=temp;
            }
        }
    }
}

运行结果如下:
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%

测试用例:
[1,2,3,4,5,6,7]

对应输出应该为:

[1,3,5,7,2,4,6]

你的输出为:

[1,7,3,5,4,6,2]

猜你喜欢

转载自blog.csdn.net/qq_35649064/article/details/84791013