zoukankan      html  css  js  c++  java
  • 剑指offer-调整数组顺序使奇数位于偶数前面

    题目:调整数组顺序使奇数位于偶数前面

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

    思路:这道题应该是考察排序的,相对位置不变意味着排序算法要稳定

    但是如果允许额外开辟空间的话,只需新建一个数组,将原数组的奇数放到新数组前面,偶数放到后面,便可以达到时间复杂度O(n),空间复杂度O(N)

    那么,先来开个数组,暴力解下:

     1 public class Solution {
     2     public void reOrderArray(int [] array) {
     3      int oddStart=0;
     4      int count=0;
     5      int []a=new int[array.length];
     6      for(int i=0;i<array.length;i++){
     7          if((array[i]&1)==1) count++;
     8      }
     9       for(int i=0;i<array.length;i++){
    10           if((array[i]&1)==1)a[oddStart++]=array[i];
    11           else{
    12               a[count++]=array[i];
    13           }
    14       }
    15         for(int i=0;i<array.length;i++){
    16          array[i]=a[i];
    17      } 
    18     }
    19 }

     思路:用类似于插入排序的思想,先寻找第一个奇数,从该奇数的位置往前找,只要有偶数出现,就交换这两个数的位置

    对于插入排序,最坏情况需要N^2/2 次比较和N^2/2次交换

    最好情况需要N-1次比较和0次交换

     1 public class Solution {
     2     public void reOrderArray(int [] array) {
     3         int odd=0;int even=0;
     4         for(int i=1;i<array.length;i++){
     5            if((array[i]&1)==1){  
     6             for(int j=i;j>0;j--){
     7                 if((array[j-1]&1)!=1){              
     8              int tmp=array[j];
     9             array[j]=array[j-1];
    10             array[j-1]=tmp;
    11             }
    12             }
    13         }
    14         }       
    15     }
    16 }

    看了下排名靠前的算法,下面这种毫无算法思想而言的解法居然也能排进前十

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 public class Solution {
     4     public void reOrderArray(int [] array) {
     5         List<Integer>ls1=new ArrayList<Integer>();
     6         List<Integer>ls2=new ArrayList<Integer>();
     7         for(int i=0;i<array.length;i++){
     8             if(array[i]%2==1){
     9                 ls1.add(array[i]);
    10             }
    11             else {
    12                 ls2.add(array[i]);
    13             }
    14         }
    15         ls1.addAll(ls2);
    16         for(int i=0;i<array.length;i++){
    17             array[i]=ls1.get(i);
    18         }
    19     }
    20     }

    排名第一的,居然是冒泡,是测试的数据量不够大么

     1 public class Solution {
     2     public void reOrderArray(int [] array) {
     3        for(int i= 0;i<array.length-1;i++){
     4             for(int j=0;j<array.length-1-i;j++){
     5                 if(array[j]%2==0&&array[j+1]%2==1){
     6                     int t = array[j];
     7                     array[j]=array[j+1];
     8                     array[j+1]=t;
     9                 }
    10             }
    11         }
    12     }
    13 }
  • 相关阅读:
    C语言中变量和函数类型
    ubuntu中耳机声音小的解决方案
    数据结构学习4——栈
    Linux 引导过程内幕
    linux gdb 没有符号表被读取。请使用 "file" 命令。
    linux 内存泄漏检查工具
    数据结构学习5——队列
    [转载]Ubuntu垃圾清理
    系统消息
    窗口相关概念和对应关系
  • 原文地址:https://www.cnblogs.com/pathjh/p/9139375.html
Copyright © 2011-2022 走看看