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