其他分享
首页 > 其他分享> > 《剑指Offer——调整数组顺序使奇数位于偶数前面》代码

《剑指Offer——调整数组顺序使奇数位于偶数前面》代码

作者:互联网

调整数组顺序使奇数位于偶数前面


前言

//==================================================================
// 《剑指Offer——调整数组顺序使奇数位于偶数前面》代码
// 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有
// 奇数位于数组的前半部分,所有偶数位于数组的后半部分。
//==================================================================


一、示例

1.调整数组顺序使奇数位于偶数前面

/*********************************************************************
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
*/
***********************************************************************/

二、代码解析

1.新建.cpp文件

代码如下(示例):

//==================================================================
// 《剑指Offer——调整数组顺序使奇数位于偶数前面》代码
// 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有
// 奇数位于数组的前半部分,所有偶数位于数组的后半部分。
//==================================================================



#include <iostream>
#include<vector>
using namespace std;

/*
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
*/
/*法一-----暴力解法*/
vector<int> exchange1(vector<int>& nums)
{
	int len = nums.size();
	int first = 0, last = len - 1;
	vector<int> newNum(len, 0);
	for (int i = 0; i < len; ++i)
	{
		if (nums[i] % 2 == 0)
		{
			newNum[last--] = nums[i];
		}
		else
		{
			newNum[first++] = nums[i];
		}
	}
	return newNum;
}

/*法二-----双指针*/
vector<int> exchange2(vector<int>& nums)
{
	int len = nums.size();
	int i = 0, j = len - 1;
	while (i < j)
	{
		while (i < j && (nums[i] % 2 == 1))
		{
			++i;
		}
		while (i < j && (nums[j] % 2 == 0))
		{
			--j;
		}
		swap(nums[i], nums[j]);
	}
	return nums;
}
/*测试代码打印*/
void Traversal(vector<int>& nums)
{
	for (int i = 0; i < nums.size(); ++i)
	{
		cout << nums[i] << " ";
	}
}

/*法三*/
void ReorderOddEven_1(int* pData, unsigned int length)
{
	if (pData == nullptr || length == 0)
	{
		return;
	}

	int* pBegin = pData;
	int* pEnd = pData + length - 1;

	while (pBegin < pEnd)
	{
		//向后移动pBegin,直到它指向偶数
		while (pBegin < pEnd && (*pBegin % 2) != 0)
		{
			pBegin++;
		}
		while (pBegin < pEnd && (*pEnd % 2) == 0)
		{
			pEnd--;
		}

		if (pBegin < pEnd)
		{
			int tmp = *pBegin;
			*pBegin = *pEnd;
			*pEnd = tmp;
		}
	}
}

/*发四---可拓展*/

bool isEven(int n)//修改条件,可拓展
{
	return (n % 2) == 0;
}

void ReorderOddEven_2(int* pData, unsigned int length)
{
	Reorder(pData, length, isEven);
}

void Reorder(int* pData, unsigned int length, bool (*func)(int))
{
	if (pData == nullptr || length == 0)
	{
		return;
	}

	int* pBegin = pData;
	int* pEnd = pData + length - 1;

	while (pBegin < pEnd)
	{
		//向后移动pBegin,直到它指向偶数
		while (pBegin < pEnd && !func(*pBegin))
		{
			pBegin++;
		}
		while (pBegin < pEnd && func(*pEnd))
		{
			pEnd--;
		}

		if (pBegin < pEnd)
		{
			int tmp = *pBegin;
			*pBegin = *pEnd;
			*pEnd = tmp;
		}
	}
}

int main()
{
	vector<int> nums = { 1,2,3,4 };
	cout << "剑指 Offer 21. 调整数组顺序使奇数位于偶数前面" << endl;
	vector<int> newNums1 = exchange1(nums);
	cout << "法一----暴力----->";
	Traversal(newNums1);
	cout << endl;
	vector<int> newNums2 = exchange1(nums);
	cout << "法二----暴力----->";
	Traversal(newNums2);
	cout << endl;


	return 0;
}

三,测试

请添加图片描述

标签:奇数,int,Offer,nums,偶数,pBegin,pEnd,数组
来源: https://blog.csdn.net/m0_46208939/article/details/120635446