版权声明:醋姑娘 https://blog.csdn.net/weixin_37023469/article/details/84401256
今天打开LeetCode做到这题的时候,发现已经忘记怎么用指针了。
首先讲讲这题的思路吧,要实现很简单,遍历一遍取所有的偶数,再遍历一遍取所有的奇数加到新数组里去。但其实可以优化成遍历一遍的:因为数组是定长的,偶数个数+奇数个数 = 总个数。所以我只要遍历一遍,如果是偶数就从前往后写,如果是奇数就从后往前写:
int odd = ASize - 1;//奇数从末尾往前写
int even = 0;//偶数从前开始往后写
完整代码
int* sortArrayByParity(int* A, int ASize, int* returnSize) {
*returnSize = ASize;
int* ResArray = (int*) malloc((*returnSize)*sizeof(int));
int even = 0;
int odd = *returnSize - 1;
for(int i = 0;i < ASize;i++){
if(A[i]&1){
ResArray[odd--] = A[i];
}
else{
ResArray[even++] = A[i];
}
}
return ResArray;
}
不知道读者有没有发现,我是用A[i]&1来判断奇偶的,值为1的是奇数,值为0的是偶数。
&是位运算中的按位与运算符号,比如说5的二进制是101,1的二进制是1,补成和5一样的三位,是001。现在我们把101和001进行按位与运算,得到结果是001,即1。
显然奇数最低位必为1,而偶数最后一位必为0,和1进行与运算只有0、1两个结果,因为1的高位补0,与运算结果永远是0。
使用位运算比平时常见的A[i]%2==0方法来判断奇偶快多了!如果我把那行if改成
if(A[i]%2==1)
提交结果是
然后发现这道题还有
思路很简单,因为题目保证奇数偶数各一半,所以用odd和even记录下一个空位的下标。odd:1、3、5、7……;even:0、2、4、6……
int* sortArrayByParityII(int* A, int ASize, int* returnSize) {
*returnSize = ASize;
int* ResArray = (int*) malloc(*returnSize*sizeof(int));
int odd = 1;
int even = 0;
for(int i=0;i<ASize;i++){
if(A[i]&1)
{
ResArray[odd] = A[i];
odd+=2;
}
else{
ResArray[even] = A[i];
even+=2;
}
}
return ResArray;
}