剑指Offer面试题21--调整数组顺序使得奇数在偶数前

设计思想(一):

维护两个指针,第一个指针初始化指数组首地址,它只向后移动;第二个初始化指数组末尾,它只向前移动。在二者相遇前,若第一个指针指偶数,第二个指针指奇数则交换二者位置

代码:

#include <iostream>
using namespace std;

void RecorderOddEven(int* pData, unsigned int length)
{
	if (pData == nullptr || length <= 0)
		return;

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

	while (pstart < pEnd)
	{
		while ((pstart < pEnd) && (((*pstart) & 0x1)==1))  //(*pstart & 0x1 != 1)运算速度比(*pstart %2 != 1)快
		{
			pstart++;
		}

		while (pstart < pEnd && (((*pEnd) & 0x1)!=1))
		{
			pEnd--;
		}

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


	}
}

void Teat1()
{
	const int length_Data = 10;
	int Data1[length_Data] = { 5, 9, 8, 4, 1, 10, 2, 7, 3, 6 };
	RecorderOddEven(Data1, length_Data);

	for (int i = 0; i < length_Data; ++i)
		cout << Data1[i] << " ";
}

int main()
{
	Teat1();

	return 0;

}


设计思想二、

如果要求把数组按照大小分成两部分,所有负数排在非负数前面,怎么做?

能被3整除的数排在不能被3整除的数前面,怎么做?

如果面试官希望我们给出一种模式,解决一系列问题的通用办法,而不是专门为一个问题定义一个函数

void Recorder(int* pData, int length,bool (*func)(int))
{
	if (pData == nullptr || length <= 0)
				return;
	int* pstart = pData;
	int* pEnd = pData + length - 1;
	
	while (pstart < pEnd)
	{
		while ((pstart < pEnd) && (func(*pstart)==1))  //(*pstart & 0x1 == 1)运算速度比(*pstart %2 == 1)快
		{
			pstart++;
		}

		while ((pstart < pEnd) && (func(*pEnd)!=1))  //(*pstart & 0x1 != 1)运算速度比(*pstart %2 != 1)快
		{
			pEnd--;
		}
		if (pstart < pEnd)
		{
			int tmp = *pstart;
			*pstart = *pEnd;
			*pEnd = tmp;
		}

	}

}

bool IsEven(int x)
{
	return (x & 0x01) == 1;//分组标准在此函数定义,其他部分不用改
}

void RecorderOddEven(int* pData, int length)
{
	Recorder(pData, length, IsEven);
}

对于设计思想二,我们需要学习的是:

(1)int (*p)();   p是指向函数的指针,该函数返回一个整型值。学习指向函数的指针的用法

        区别int *p();  p是一个返回指针的函数,该指针指整型数据   

(2)学习上例中函数解耦的方法(解耦成两部分,一是判断数字应该在数组前半部分还是后半部分,二是拆分数组)。解耦的好处是提高了代码的可重用性

牛客网上的这道题题目要求如下:

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if(array.size()==0)
            return;
       vector<int>:: iterator it=array.begin();
        unsigned int size=array.size();
       while(size)
        {
           if(*it%2==0)
           {
               int tmp=*it;
              array.erase(it);
               array.push_back(tmp);
               size--;
           }
           
           else
           {
            ++it;
               --size;
               }
       }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80946812