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

来源:互联网 发布:mac彩妆专柜 编辑:程序博客网 时间:2024/05/21 09:17

题目描述:给定一个整数数组,实现一个函数来调整数组中的数字顺序,使得奇数都在这个数组中的前半部分,偶数都在数组中的后半部分。

比如数组为:[1,2,3,4,5]。那么调整完后的数组为:[1,3,5,2,4]

笨方法

笨方法是从数组的第一个成员开始寻找,每当遇到一个偶数就将它取出,将后面所有的成员依次向前挪一位,再将这个取出的偶数放在最后一位。时间复杂度为O(n^2)


好方法

笨方法做了很多的无用功,因此可以用两个指针来实现。

设置两个指针p1,p2,它们分别指向数组的第一个位置和最后一个位置,当p1是奇数时就往后移动一个位置,直到遇到偶数为止。p1遇到偶数后再看p2,如果p2也是偶数那么一直向前移动一个位置,直到p2是奇数为止。这时如果p2是奇数了,还要判断一下p2是不是在p1的右面,如果在左面了,则已经完成函数的功能了,return一下就行了,否则交换p1和p2指向的数字(即奇偶调换)。


举例说明:

step1 : 1  2  3  4  5

            p1            p2


step2 : 1  2  3  4  5

                p1        p2


step3 : 1  5  3  4  2

                p1        p2


step4 : 1  5  3  2  4

                    p1    p2


step5 : 1  5  3  2  4

                   p2 p1

此时p2在p1的左面了,return [1,5,3,2,4]


源码

#coding:utf-8# 面试题14:让数组中的奇数位于偶数前面def ReorderOddEven(data): # data: [1,2,3,4,5]    p1 = 0 # 前指针    p2 = len(data) - 1 # 后指针    if p1 == p2:        return False    else:        while True:            if data[p1] % 2 == 1: # 如果p1位置的数是奇数                p1 += 1            else:                if data[p2] % 2 == 0: # 如果p2位置的是偶数的话                    p2 -= 1                else:                    if p1 > p2:                        break                    else: # 否则交换p1,p2的数字                        flag = data[p1]                        data[p1] = data[p2]                        data[p2] = flag        return datadata = [1,2,3,4,5]print ReorderOddEven(data)


0 0
原创粉丝点击