牛客网&剑指Offer&调整数组顺序使奇数位于偶数前面

牛客网&剑指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];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值