调整数组奇偶顺序

  • 题目描述:

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,是所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

  • 分析:

    我们要做的是调整数组中元素的顺序,所以显然函数中主要的操作是交换元素,也就是交换奇数和偶数,使奇数位于偶数前边。在前边各种数组的题目中,我们常用到使用两个指针的方法,一个从前向后移动,一个从后向前移动。当前边的指针指向一个偶数,而后边的指针指向一个奇数时,交换两个元素,直到两个指针相遇为止。

    void ReorderArray(int* pData, unsigned int length)
    {
    	if (pData == NULL || length <= 0)
    		return;
    
    	unsigned int Begin = 0;
    	unsigned int End = length - 1;
    	while (Begin < End)
    	{
    		while (Begin < End && (pData[Begin] & 1) != 0)
    			++Begin;
    
    		while (Begin < End && (pData[End] & 1) == 0)
    			--End;
    
    		if (Begin < End)
    		{
    			int temp = pData[Begin];
    			pData[Begin] = pData[End];
    			pData[End] = temp;
    		}
    	}
    }
    

    值得注意的是: 在判断数字的奇偶时,往往使用位运算“&1”,得1说明是奇数,反之为偶数;原因在于,只有当一个数的二进制表示中的最低位为1时这个数才是奇数。而使用取余%计算远远不如位运算效率高。

    另附一个小技巧:在求余运算中,如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率。

    n % m => n & (m - 1)

    例如:求 n % 32 ,可以将其转换为 n & (32-1)

时间: 2024-11-06 03:42:07

调整数组奇偶顺序的相关文章

剑指offer 面试题14 :调整数组的顺序使奇数位于偶数的前面

#include <stdio.h> void oddAheadOfEven(int array[],int start,int end) { int lastOddIndex = start-1; for(int index=start;index<=end;index++) { if(array[index]&0x01) { lastOddIndex++; int temp = array[lastOddIndex]; array[lastOddIndex] = array[

剑指offer_13:调整数组顺序

一:题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.二:题目分析注意本题要求要在调整好奇偶顺序后保持原来的顺序位置不变.因此解决该题的思想可以类比于冒泡排序,每一趟冒泡后会确定最后一个元素的位置.三:代码 public class Solution { public void reOrderArray(int [] array) { int temp=0; for(in

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

面试题 14:调整数组顺序使奇数位于偶数前面

使用两个指针,在数组头尾相对移动: 循环结束条件:头和尾重叠活着头在尾之后 左边指针右移条件:当前数是奇数 右边指针左移条件:当前数是偶数 当且仅当左边指针是偶数,右边指针是奇数,交换两个指针的值 此题注意扩展,函数功能的重用. package offer; import java.util.Arrays; /*面试题 14:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该函数数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的数组位于数组的后半部分.*/ pub

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. 1 package Solution; 2 3 /** 4 * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 5 * 题目:输入一个整数数组,实现一

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

1. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 1 /** 2 * 调整数组顺序使奇数位于偶数前面 3 * 4 * @author 5 * 6 */ 7 public class Solution { 8 9 public static void order(int[] array) { 10 11 if (null == array || array.length == 0 || array.length ==

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

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 首先,可以想到,用前后两个指针一个在数组首一个在数组尾同时往数组中间遍历,当遇到前指针遇到偶数后指针遇到奇数时,就将两个数交换,直到两指针相遇或者前指针超过了后指针,这个有点类似快速排序的思想: 程序设计如下: #include <iostream> #include <assert.h> using namespace std; void AdjustArr(in

面试题14:调整数组顺序使奇数位于偶数前面

// 面试题14_调整数组顺序使奇数位于偶数前面.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void swap(int *begin,int *end) { int temp; temp=*begin; *begin=*end; *end=temp; } void ReorderOddEven(int *pData,unsigned int len