高质量代码(一):array元素移动问题

问题·描述

输入一个数组(可以是任意元素数组),实现一个函数来调整该数组的元素的顺序。使得所有满足这个“条件”

这个条件,可以是任意形式的;例如,是奇偶性,能被某数整除;然后又或者正负数

原书中给出的方法类似于快速排序:

依据所给的条件可以,设置function;(内置操作)

然后调用函数指针操作即可

使用:

vector< int >::iterator begin = array.begin() ;

vector< int >::iterator end = array,end();

func(*begin)

func(*end)


下面给出剑指offer,问题21具体求解

问题·描述

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

方法一:

(1)

时间复杂度:

O(n^2) 直接暴力求解


// 冒泡法

class Solution {
public:
	void reOrderArray(vector<int> &array) {

		for (int i = 0; i < array.size(); i++)
		{
			for (int j = array.size() - 1; j > i; j--)
			{
				if (array[j] % 2 == 1 && array[j - 1] % 2 == 0)  //前偶后奇交换
				{
					swap(array[j], array[j - 1]);
				}
			}
		}
	}
};

(2)改进

//快排

class Solution {
public:
	void reOrderArray(vector<int> &array) {
		vector<int>::iterator begin = array.begin();
		vector<int>::iterator end = array.end();

		while (begin < end)
		{
			while (begin < end && (*begin & 0x1) == 1)
				begin++;
			while (begin < end && (*end & 0x1) == 0)
				end--;
			if (begin < end)
			{
				int temp = *begin;
				*begin = *end;
				*end = temp;
			}
		}

	}
};
// 但是不能AC,还没有找到原因

方法二:

(1)空间复杂度

O(1): 无额外消耗

// vector 操作

class Solution {
public:
	void reOrderArray(vector<int> &array) {
		vector<int>::iterator even = array.begin();
		int size = array.size();

		for (int i = 0; i < size; ++i)
		{
			if (*even % 2 == 0)
			{
				int tmp = *even;
				even = array.erase(even);
				array.push_back(tmp);
			}
			else {
				even++;
			}
		}
	}
};



(2)创建额外vector

将需要移动的元素,取出并删除; 然后添加进新vector,然后合并两个vector

空间复杂度 O(n)

// 设置额外的数组空间

class Solution {
public:
	void reOrderArray(vector<int> &array) {
		vector<int> assist;
		vector<int>::iterator it1, it2;

		it1 = array.begin();
		for (; it1 != array.end();)
		{
			if (*it1 & 0x1 == 0) {  // 将所有的偶数取出,并删除
				assist.push_back(*it1);
				it1 = array.erase(it1);
			}
			else {
				it1++;
			}
		}

		vector<int>::iterator it3, it4;
		it3 = assist.begin();
		it4 = assist.end();

		for (; it3 != it4; ++it3)
		{
			array.push_back(*it3);
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值