标签:
public class Solution { public void reOrderArray(int [] array) { int jishu=0; int oushu=0; int i=0; int k=0; while(i<array.length&&k<array.length){ while(i<array.length){ if(array[i]%2==0){ oushu=array[i]; break; } i++; } k=i+1; while(k<array.length){ if(array[k]%2!=0){ jishu=array[k]; break; } k++; } if(k<array.length){ for(int j=k;j>i;j--){ array[j]=array[j-1]; } array[i++]=jishu; }else{ break; } } } }
这个题不算难,开始的时候思路错了,半天没绕过弯......
1.开始考虑到,如果技术和偶数的查找都从前往后那么,每次查找到偶数之后,还要从当前位置往后奇数,比较麻烦,为什么不从前边找偶数,从后边找奇数呢。。。后来证明自己太傻*了,没看清楚题,要求奇偶数的相对位置不变
2.后来从头开始找偶数,从找到偶数的位置开始找奇数,都找到之后把他们互换。。。。。。 又傻*了。这样做是会改变奇偶数各自的前后相对位置。
3.正解:每当找到前面的偶数和后面的奇数之后,那么把之间的部分(包括那个偶数)统一后移一位, 因为之间的都是偶数(从找到的偶数后面开始找到的第一个奇数和开始找到的偶数之间肯定都是偶数了),之前又没有偶数了(因为找的是从左往右第一个偶数),把他们统一后移一位,这样把提前保存起来的那个奇数放到前边空出来的那一位。这样相当于 132457 把5移动到2 4这两个偶数的前面,1 和5本来就是前后顺序的。这样堡整理调整之后的奇偶各自的相对顺序不会变。
4,。最后一个小点需要注意的,那就是在最后进行统一后移一位操作时,需要判断依次k的范围是否符合规范,因为可能前边一直没有break,导致k变成了最大值array.length。
这种解法的最坏时间复杂度为O(n平方);因为找偶数复杂度为n,找后面的奇数加上移动之间的数字也是n级别的复杂度,总体n的平方
可用用空间换时间的做法,new一个数组,从头开始遍历,遇到偶数保存进新数组,并且删除原先的偶数,最后将偶数部分接在奇数部分之后.
这个可以使用动态数组,也可以求出奇数的个数为n,遍历的时候从1开始保存奇数,从n开始保存偶数。时间复杂度为O(n)
标签:
原文地址:http://www.cnblogs.com/tobemaster/p/5875810.html