第一题
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一
第一遍
void ReorderOddEven_1(int *pData, unsigned int length)
{
//1.如果数组为nullptr,长度为0,返回
if (!pData&&length == 0)
return;
//2.设定两个指针,第一个指向偶数,初始值是第一个,第二个总指向奇数,初始值是最后一个
int* even = pData;
int* odd = pData + length - 1;
//3.循环条件:当偶数指针在奇数指针前面时
while (even < odd)
{
//3.1 如果第一个不指向偶数,往后移一个指针
while (even < odd && (*even & 0x1) != 0)//0x1是零,不是欧
even++;
//3.2 如果第二个指针不指向奇数,往前移一个指针
while (even < odd && (*odd & 0x1) != 1)
odd--;
//3.3 如果奇数在偶数前面,交换两个指针的值
if (even < odd)
{
int temp = *even;
*even = *odd;
*odd = temp;
}
}
}
第二遍
class Solution {
public:
void reOrderArray(vector<int> &array) {
//1.记录数组长度
int length = array.size();
//2.如果数组为nullptr,或者长度为0,返回
if(length == 0)
return ;
//3.设置两个指针,even指向偶数指针,odd指向奇数指针,偶数指针在奇数指针前面
int* even = &array[0];
int* odd = &array[length-1];
//4.while even在odd前面时
while(even<odd)
{
//4.1 如果even没有指向偶数,则往后移动一个
while(even<odd&&(*even & 0x1)!=0)
even++;
//4.2 如果odd没有指向奇数,则向前移动一个
while(even<odd&&(*odd & 0x1)!=1)
odd--;
//4.3 如果偶在奇前,交换奇偶指针
if(even<odd)
{
int temp=*even;
*even = *odd;
*odd=temp;
}
}
}
};
方法二:解耦
将代码分为两个部分:操作、标准。
解耦提高代码的重用性,因为标准可能不一样,但是总体设计架构是不变的。
void ReorderOddEven_2(int *pData, unsigned int length)
{
//Reorder(int *pData, unsigned int length, bool(*func)(int))
//函数参数,直接传递函数名,
return Reorder(pData,length,isEven);
}
void Reorder(int *pData, unsigned int length, bool(*func)(int))
{
//1.如果数组为nullptr,长度为0,返回
if (!pData&&length == 0)
return;
//2.设定两个指针,第一个指向偶数,初始值是第一个,第二个总指向奇数,初始值是最后一个
int* even = pData;
int* odd = pData + length - 1;
//3.循环条件:当偶数指针在奇数指针前面时
while (even < odd)
{
//3.1 如果第一个不指向偶数,往后移一个指针
while (even < odd && !func(*even))//0x1是零,不是欧
even++;
//3.2 如果第二个指针不指向奇数,往前移一个指针
while (even < odd && func(*odd))
odd--;
//3.3 如果奇数在偶数前面,交换两个指针的值
if (even < odd)
{
int temp = *even;
*even = *odd;
*odd = temp;
}
}
}
//是否为偶数
bool isEven(int n)
{
return (n & 1) == 0 ;//要加括号,不然一直是false
}
补一下优先级的知识
C++
运算符
描述
例子
可重载性
第一级别
::
作用域解析符
Class::age = 2;
不可重载
第二级别
()
函数调用
isdigit('1')
可重载
()
成员初始化
c_tor(int x, int y) : _x(x), _y(y*10){};
可重载
[]
数组数据获取
array[4] = 2;
可重载
->
指针型成员调用
ptr->age = 34;
可重载
.
对象型成员调用
obj.age = 34;
不可重载
++
后自增运算符
for( int i = 0; i < 10; i++ ) cout << i;
可重载
--
后自减运算符
for( int i = 10; i > 0; i-- ) cout << i;
可