剑指Offer之调整数组顺序使奇数位于偶数前面

#include <stdio.h>
#include <malloc.h>

int *number;

void SortOddBeforeEven(int *number,int n){
    int left = 0,right = n-1;
    //下标
    int oIndex = 0,eIndex = 0;
    //二分遍历
    while(left < right){
        //从左边直到第一个偶数
        while(left < right && (number[left] % 2 != 0)){
            left++;
        }
        //从右边直到第一个奇数
        while(left < right && (number[right] % 2 == 0)){
            right--;
        }
        //奇偶数交换
        if(left < right){
            int temp;
            temp = number[left];
            number[left] = number[right];
            number[right] = temp;
        }
    }
}

int main()
{
	int i,n;
	while(scanf("%d",&n) != EOF){
	    number = (int *)malloc(sizeof(int)*n);
	    for(i = 0;i < n;i++){
	        scanf("%d",&number[i]);
	    }
	    SortOddBeforeEven(number,n);
        for(i = 0;i < n;i++){
            if(i == n-1){
                printf("%d\n",number[i]);
            }
            else{
                printf("%d ",number[i]);
            }
        }
	}
	return 0;
}
题目描述:

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

输入:

每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。

输出:

对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。

样例输入:
5
1 2 3 4 5
样例输出:
1 3 5 2 4
/*********************************
*   日期:2013-11-15
*   作者:SJF0115
*   题号: 题目1516:调整数组顺序使奇数位于偶数前面
*   来源:http://ac.jobdu.com/problem.php?pid=1516
*   结果:AC
*   来源:剑指Offer
*   总结:
**********************************/
#include <stdio.h>
#include <malloc.h>

int *number;

void SortOddBeforeEven(int *number,int n){
    if(n <= 0 || number == NULL){
        return;
    }
    int oIndex = 0,eIndex = 0,i;
    int *odd,*even;
    odd = (int *)malloc(sizeof(int)*n);
    even = (int *)malloc(sizeof(int)*n);
    //寻找奇偶数
    for(i = 0;i < n;i++){
        //奇数
        if(number[i] & 0x1 != 0){
            odd[oIndex++] = number[i];
        }
        //偶数
        else{
            even[eIndex++] = number[i];
        }
    }
    //输出奇数
    for(i = 0;i < oIndex;i++){
        //只有奇数
        if(i == oIndex - 1 && eIndex == 0){
            printf("%d",odd[i]);
        }
        else{
            printf("%d ",odd[i]);
        }
    }
    //输出偶数
    for(i = 0;i < eIndex;i++){
        if(i != eIndex - 1){
            printf("%d ",even[i]);
        }
        else{
            printf("%d",even[i]);
        }
    }
    printf("\n");
}

int main()
{
	int i,n;
	while(scanf("%d",&n) != EOF){
	    number = (int *)malloc(sizeof(int)*n);
	    for(i = 0;i < n;i++){
	        scanf("%d",&number[i]);
	    }
	    SortOddBeforeEven(number,n);
	}
	return 0;
}
时间: 2024-09-16 12:08:55

剑指Offer之调整数组顺序使奇数位于偶数前面的相关文章

剑指offer系列之十二:调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 这道题第一思路自然是这样的:从头开始遍历这个数组,如果遇到偶数就把这个数之后的所有数往前移动一位,这样数组会留出一个空位,移动完毕之后把该偶数放到该空位即可.这样处理的话需要两次循环,一次是遍历,另一次是移位,所以时间复杂度是O(n2).下面是这种思路的实现代码(已被牛客AC): public void reOrd

微软面试题解析:调整数组顺序使奇数位于偶数前面(数组)

题目: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 分析: 只需要设置头尾两个指针遍历就可以了,前面遇到偶数记下来,后面遇到奇数记下来,交换,知道后面的指针小于前面的指针. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ 实现如下: #include<iostream> #include<stdio.h> #

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

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序使得所有奇数位于前面半部分,偶数位于后半部分. 分析: 1. 方案一:最朴素做法是枚举数组,发现一个奇数就把数字放到前面,然后移到后面的数字.时间复杂度为O(n^2) 2. 方案二:最常用的的双指针法,设置两个指针p1,p2初始化指向数组的第一个数和数组的最后一个数.      总的由以下四种情况     (1)如果p1指向的数为奇数则p1向后移到一位,如果p2指向的数是偶数则p2向前移到一位.     (2)如果p1指向的数为奇数则p

[剑指Offer]10.旋转数组的最小数字

题目1386:旋转数组的最小数字 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数. 输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000). 输出:

剑指Offer之翻转单词顺序

题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 输入: 每个测试案例为一行,表示一句英文句子. 我们保证一个句子的单词数不会超过600

《剑指offer》-旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 考察二分查找.虽然是有序数组进行了旋转的,但实际上依然可以用二分的做法来找. int minNumberInRotateArray(vector<int> rotateArray){ int low = 0; int

《剑指offer》-递增数组中找到和为S的(最小)两个元素

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 首先一个坑是,返回值的问题.题目描述说返回两个数字,并且小的在前面,大的在后面. C++的返回值明明只有一个啊?那就要放到数组或者其他容器里面,或者作为一个对象返回..本题中使用vector容器进行存储. 其次容易想到两边夹的方法,直接写就好了 class Solution { public: vect

剑指offer学习笔记1

C++的标准不允许复制构造函数传值参数.A(const A& other){},如果是传值参数,把形参复制到实参会调用复制构造函数,就会形成无休止的递归调用从而导致栈溢出. 赋值运算符函数 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString& str); ~CMyString(); CMyString& operator=(const CMyString& ot

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a