題目:
非負數(shù)組A包含偶數(shù)和奇數(shù),將所有奇數(shù)排列在所有偶數(shù)后邊
例子:
Input: [3,1,2,4]Output: [2,4,3,1]The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted.
想法:本來想用一個標志位p來標識最后一個偶數(shù),如果再遍歷到偶數(shù)則和標志位下一位的奇數(shù)交換,這樣,時間復(fù)雜度為O(n),空間復(fù)雜度為O(1);但是仔細推敲是有問題的。
最后用了最笨的方法,即遍歷找到偶數(shù)和奇數(shù),再拼接起來,程序如下:
class Solution {
public int[] sortArrayByParity(int[] A) {
if(A.length<=0||A==null)return null;
int length=A.length;
int n=0;
for(int i=0;i<length;i++){
if(A[i]%2==0){
n++;
}
}
int[] AParity=new int[n];
int[] BOdd=new int[length-n];
int j=0;
int i=0;
int z=0;
int m=0;
while (j<length){
if(A[j]%2==0){
AParity[i]=A[j];
i++;
}else {
BOdd[z]=A[j];
z++;
}
j++;
}
while (m<length){
if(m<n){
A[m]=AParity[m];
}
else{
A[m]=BOdd[m-n];
}
m++;
}
return A;
}
}
這樣可以實現(xiàn),但是過于繁復(fù),25ms的通過時間??戳舜笊駛兊慕獯穑械莫毐脔鑿?,有的跟我的想法一樣,但更簡單。我與大神只差10000步。
神1:用是否為偶數(shù)重寫Arrays的排序算法
class Solution {
public int[] sortArrayByParity(int[] A) {
Integer[] B = new Integer[A.length];
for (int t = 0; t < A.length; ++t)
B[t] = A[t];
Arrays.sort(B, (a, b) -> Integer.compare(a%2, b%2));
for (int t = 0; t < A.length; ++t)
A[t] = B[t];
return A;
/* Alternative:
return Arrays.stream(A)
.boxed()
.sorted((a, b) -> Integer.compare(a%2, b%2))
.mapToInt(i -> i)
.toArray();
*/
}
}
鑒于比較函數(shù) Integer.compare還沒搞懂,現(xiàn)在無法驗證這種方法。
神2:遍歷兩遍A[n],找到奇偶數(shù)放到另一個數(shù)組中
class Solution {
public int[] sortArrayByParity(int[] A) {
int[] ans = new int[A.length];
int t = 0;
for (int i = 0; i < A.length; ++i)
if (A[i] % 2 == 0)
ans[t++] = A[i];
for (int i = 0; i < A.length; ++i)
if (A[i] % 2 == 1)
ans[t++] = A[i];
return ans;
}
}