题目1:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
- 考虑可扩展的解法,能秒杀 Offer
普通方法:先push_back()奇数,再push_back()偶数
class Solution {
public:
void reOrderArray(vector<int> &array) {
///使用临时的数组 实现过渡
vector<int> temp;
for(int i =0; i < array.size(); i++)
{
if(array[i] & 1) 按位与 与1进行操作,能够实现将判定该数是否为 奇偶
{
temp.push_back(array[i]);
}
}
for(int j =0; j < array.size(); j++)
{
if(!(array[j] & 1))
{
temp.push_back(array[j]);
}
}
array.swap(temp); //array = temp;
}
};
- 考虑可扩展的解法,能秒杀 Offer
如果是面试应届毕业生或者工作时间不长的程序员,面试官会满意前面的代码,但如果应聘者申请的是资深的开发职位,那面试官可能会接着问几个问题。
面试官:如果把题目改成数组中的数按照大小分为两部分,所有的负数在所有的非负数的前面,该怎么做?
如果再把题目改改,变成把数组中的数分成两部分,能被3整除的数都在不能被3整除的数的前面,怎么办?
这就是面试官在考察我们对可扩展性的理解,即希望我们能够给出一个模式,在这个模式下能够很方面第把已有的解决方案扩展到同类型的问题上去。
于是我们写出下面可扩展性的代码:
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array ==null && array.size()<=0)
{
return null;
}
int head = 0;
int tail =array.size()-1;
while(head < tail)
{
if(head < tail && (array[head] & 1) ==1)
{
head ++;
}
if(head < tail && (array[tail] & 1) ==0)
{
tail--;
}
if(head < tail)
{
int temp = head;
head = tail;
tail = temp;
}
}
return array;
};
牛客网: https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593.