牛客网&剑指Offer&调整数组顺序使奇数位于偶数前面
代码实现1
class Solution {
public:
void reOrderArray(vector<int> &array) //引用array数组
{
if(array.empty()) //empty()作为判断容器是否为空的函数,若为空则为true
return;
int len = 0;
int oddnum = 0;
int evennum = 0;
int oddindex = 0;
int evenindex = 0;
len = array.size();
vector<int> vec(len);
for (vector<int>::iterator it = array.begin(); it != array.end(); it++)
{
if (*it % 2 == 0)
evennum++;
else
oddnum++;
}
evenindex = oddnum;
for (vector<int>::iterator it = array.begin(); it != array.end(); it++)
{
if (*it % 2 == 1)
{
vec[oddindex] = *it;
oddindex++;
}
else
{
vec[evenindex] = *it;
evenindex++;
}
}
//copy(vec.begin(), vec.end(), array.begin());//与下面for循环代码等效
for (int i = 0; i < len; i++)
{
array[i] = vec[i];
}
}
};
代码实现2
#include<iostream>
#include<vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array.empty()) //empty()作为判断容器是否为空的函数,若为空则为true
return;
vector<int>::iterator array_start = array.begin(); //数组array首地址
vector<int>::iterator array_end = array.end()-1; //数组array末地址
while (array_start < array_end)
{
//向后移动array_start,直到它指向偶数
while (array_start < array_end && (*array_start & 0x1) != 0)
array_start++;
//向前移动array_end,直到它指向奇数
while (array_start < array_end && (*array_end & 0x1) == 0)
array_end--;
//更换此时奇数与偶数的位置,但是不能并保证奇数和奇数,偶数和偶数之间的相对位置不变
if (array_start < array_end)
{
int temp = *array_start;
*array_start = *array_end;
*array_end = temp;
}
}
}
};
int main()
{
Solution test;
vector<int> vec = {1,5,8,4,3,2,9};
test.reOrderArray(vec);
cout << "main value is ";
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
cout << *it;
return 0;
}
代码实现3
#include<iostream>
#include<vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
class Solution {
public:
void reOrderArray(vector<int> &array,bool (*func)(int)) {
if(array.empty()) //empty()作为判断容器是否为空的函数,若为空则为true
return;
vector<int>::iterator array_start = array.begin(); //数组array首地址
vector<int>::iterator array_end = array.end()-1; //数组array末地址
while (array_start < array_end)
{
//向后移动array_start,直到它指向偶数
while (array_start < array_end && !func(*array_start))
array_start++;
//向前移动array_end,直到它指向奇数
while (array_start < array_end && func(*array_end))
array_end--;
//更换此时奇数与偶数的位置,但是不能并保证奇数和奇数,偶数和偶数之间的相对位置不变
if (array_start < array_end)
{
int temp = *array_start;
*array_start = *array_end;
*array_end = temp;
}
}
}
};
bool isEven(int n)
{
return(n & 1) == 0;
}
int main()
{
Solution test;
vector<int> vec = {1,5,8,4,3,2,9};
test.reOrderArray(vec, isEven);
cout << "main value is ";
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
cout << *it;
return 0;
}
编程笔记
- 代码实现1解题思路:1.遍历数组得出数组奇数与偶数的数量;2.新建一个数组开始存放数据,再次遍历数组,判断奇偶数,从不同的下标开始依次放置;3.将新建的数组依次赋值给原数组;
- 代码实现2解题思路:1.把第一个指针指向数组的第一个元素,把第二个指针指向数组的最后一个元素;2.在第一个指针的地址小于第二个指针的地址前提下,将指针1依次向后移动,直至遇到偶数;3.在第一个指针的地址小于第二个指针的地址前提下,将指针2依次向后移动,直至遇到奇数数;4.此时两个指针对应地址的数据进行交换;
- 代码实现3解题思路,基于代码实现2的基础上,如果把题目改成将数组中数值正数与负数前后分开或者改成将数组中数值是否能被3整除进行前后分开,这是一系列同类型的问题,只需要更改下条件即可,但是实际情况下我们可以给出一种模式,在这种模式下能够将已有的解决方案扩展到同类型的问题上去;
- 熟悉容器(vector)作为函数参数如何传参
vector作为函数参数如何传参参考链接 - array.empty()),empty()作为判断容器是否为空的函数,若为空则为true
- 容器vector的首末地址:
vector<int>::iterator array_start = array.begin(); //数组array首地址
vector<int>::iterator array_end = array.end()-1; //数组array末地址
- 奇偶数判断使用位运算效率更快, (*array_start & 0x1) != 0 ,*array_start此时为奇数;
- 将一个vector数值整体赋值另一个vector变量
//copy(vec.begin(), vec.end(), array.begin());//与下面for循环代码等效
for (int i = 0; i < len; i++)
{
array[i] = vec[i];
}
- 数值交换
指针交换数值参考链接