【剑指offer】13.调整数组顺序使奇数位于偶数前面

题目

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变(加粗部分在原书上没有,但在牛客网在线OJ系统上存在)


分析

若是在牛客网上刷题,直接开两个数组,一个保存奇数,另一个保存偶数,遍历原数组把奇数和偶数分开就行。

不加上述加粗的条件的思路如下:指定两个指针low和high,分别指向第一个和最后一个元素,在low小于high的前提下,寻找到前半部分的第一个偶数和后半部分第一个奇数,然后对调即可,重复上述直至low等于high。

github链接:JZ13-调整数组顺序使奇数位于偶数前面


C++ 代码

1.牛客网刷题

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

class Solution {
	public:
	    void reOrderArray(vector<int> &array) {
			int len = array.size();
			if(len == 0){
				return;
			}
	        vector<int> even;
	        vector<int> odd;
	        for(int i = 0 ; i < len ; i++){
	        	if(array[i] % 2 == 0){
	        		even.push_back(array[i]);
				}else{
					odd.push_back(array[i]);
				}
			}
			int cnt = 0; 
			for(int i = 0 ; i < odd.size() ; i++){
				array[cnt++] = odd[i];
			}
			for(int i = 0 ; i < even.size() ; i++){
				array[cnt++] = even[i];
			}
		}
};


int main(){
	int n;
	while(cin>>n){
		vector<int> array(n);
		for(int i = 0 ; i < n ; i++){
			cin>>array[i];
		}
		Solution s;
		s.reOrderArray(array);
		for(int i = 0 ; i < array.size() ; i++){
			cout<<array[i]<<" ";
		}
	}
	
	return 0;
}

2 原书思路

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

class Solution {
	public:
	    void reOrderArray(vector<int> &array) {
	    	int size = array.size();
	    	int low = 0;
	    	int high = size - 1;
	    	while(low < high){
	    		while(low < high && !this->isEven(array[low])){	 	//从前到后找到偶数 
	    			low++;
				}
				while(low < high && this->isEven(array[high])){		//从后往前找奇数 
					high--;
				}
				if(low < high){
					array[low] += array[high];
					array[high] = array[low] - array[high];
					array[low] -= array[high];
				}
			}
	    }
	    
	    bool isEven(int n){
	    	return (n & 0x1) == 0;
		}
};

int main(){
	int n;
	while(cin>>n){
		vector<int> array(n);
		for(int i = 0 ; i < n ; i++){
			cin>>array[i];
		}
		Solution s;
		s.reOrderArray(array);
		for(int i = 0 ; i < array.size() ; i++){
			cout<<array[i]<<" ";
		}
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daipuweiai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值