ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-07 14:01:15  阅读:144  来源: 互联网

标签:奇数 int Offer nums 偶数 pBegin pEnd 数组


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


前言

//==================================================================
// 《剑指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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有