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

题目:

输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

分析:

只需要设置头尾两个指针遍历就可以了,前面遇到偶数记下来,后面遇到奇数记下来,交换,知道后面的指针小于前面的指针。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

实现如下:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>  

using namespace std;  

void dodata(int* rd, const int num)
{
        if(num <= 0) return;
        int ieven = num-1, iodd = 0;
        while(ieven > iodd)
        {
                if(rd[iodd] %2 == 1)
                {
                        iodd ++;
                        continue;
                }
                if(rd[ieven]%2 == 0)
                {
                        ieven --;
                        continue;
                }
                int t = rd[iodd];
                rd[iodd] = rd[ieven];
                rd[ieven] = t;
                iodd ++;
                ieven --;
        }
}  

int main()
{
        int inter[10] = {1,2,3,4,5,6,7,8,9,10};
        dodata(inter, 10);
        int i = 0;
        while(i < 10)
        {
                cout << inter[i++] << ",";
        }
        cout << endl;
        return 0;
}

编译:

g++ test.cpp -o test

执行:

./test

运行结果为:(输入是:1,2,3,4,5,6,7,8,9,10)

1,9,3,7,5,6,4,8,2,10,

作者:csdn博客 hhh3h

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 数组
, int
, include
, 奇数
, 偶数
, 奇数和偶数
, 奇数阶
数组前面
,以便于您获取更多的相关知识。

时间: 2024-10-30 07:33:39

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

剑指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]

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

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

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

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

微软面试题解析:整数的二进制表示中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 使用移位操作,来实现. 具体实现如下: #include<iostream> using namespace std; int binary1num(int d) { int cnt = 0; while(d/2 != 0) { if(d%2 == 1) cnt ++; d = d/2; } if(d%2 == 1) cnt ++; return cnt; } in

微软面试题解析:栈的push、pop序列(栈)

题目:输入两个整数序列.其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序. 为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如: 输入的push序列是1,2,3,4,5 ,那么4,5,3,2,1就有可能是一个pop序列. 因为可以有如下的push和pop序列: push 1, push 2, push 3, push 4, pop, push 5, pop, pop, pop, pop 这样的的得到的pop序列就是4,5,3,2,1. 但是序列4,

微软面试题解析:实现一个挺高级的字符匹配算法

题目: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3这些都要找出来 其实就是类似一些和谐系统. 分析: 自然匹配就是对待匹配的每个字符挨个匹配 设你的待匹配字串长度位n,模式字符串长度位m. 对于待匹配字符串中的任意一个字符最坏情况下要匹配m次,也就是说这个字符不在模式字符串中. 所以最坏情况下总共是m*n此匹配,时间复杂度就是O(m*n) 更多精彩内容:http://www.bianceng.cnhttp://www.biance

微软面试题解析:求一个矩阵中最大的二维矩阵(元素和最大)

题目:求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码 分析: 直接遍历二维数组,求出最大的二维数组就OK了 实现如下: #include<iostream> using namespace std; int max_matrix(int (*array)[5], int maxx, int maxy, int& posi, int

网易面试题解析:和为n连续正数序列(数组)

网易面试题:和为n连续正数序列(数组) 题目:输入一个正数n,输出所有和为n连续正数序列. 例如:输入15,由于 1+ 2 + 3 + 4 +5 = 4 + 5 + 6 = 7 + 8 = 15, 所以输入3个连续序列1,2,3,4,5  和 4,5,6 和7,8. 分析: 找连续序列可以从2个开始找,再找3个,4个等等,那到什么时候结束呢? 当发现找到的k个数的起始数小于1,终止. 还可以分析出,当k为偶数的时候, n*1.0/k = *.5 ,小数位必须是5,否则找不成功,continue.

微软面试题解析:使用多线程实现一个队列

题目:实现一个队列 队列的应用场景为: 一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列. 分析: 首先得设计一个队列,并且最好是循环队列,否则队列里面的空间很容易一下就使用完了. 题目要求使用生产者线程和消费者线程,所以得设计成线程保护,否则取数据和推送数据很容易搞错.可以使用线程的互斥变量:pthread_mutex_t 加pthread_mutex_lock 锁,解锁:pthread_mutex_unlock 比如:生产者线程每隔1s推送:1,2,3,4,5,6,7,