大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
922. 按奇偶排序数组 II 😀
题目描述
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
你可以返回任何满足上述条件的数组作为答案。
示例:
输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
提示:
2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000
分析
本来想用双指针,但是想错了题目限制条件
- 错误版本:
public int[] sortArrayByParityII(int[] A) {
int l=-1,r=-1;
for(int i=0;i<A.length;i++){
if((i&1)==1){
// odd
if((A[i]&1)!=1){
l=i;
}
}else{
// even
if((A[i]&1)!=0){
r=i;
}
}
if(l!=-1&&r!=-1){
A[l]^=A[r];
A[r]^=A[l];
A[l]^=A[r];
l=-1;r=-1;
}
}
return A;
}
- 错误原因:单纯的认为只要有一个是不合法的奇偶数,下一个非法的数肯定是奇偶性相反,所以样例
[648,831,560,986,192,424,997,829,897,843]
通过不了
发现问题后。
- 正确代码
直接存进去就行了
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
代码
class Solution {
public int[] sortArrayByParityII(int[] A) {
int[] odd = new int[A.length>>1];
int[] even = new int[A.length>>1];
int oddIdx=0,evenIdx=0;
for(int i=0;i<A.length;i++){
if((A[i]&1)==1)
odd[oddIdx++] = A[i];
else
even[evenIdx++] = A[i];
}
for(int i=0;i<A.length;i++){
if((i&1)==1)
A[i] = odd[i>>1];
else
A[i] = even[i>>1];
}
return A;
}
}
提交结果
2020年11月12日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn