码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-07 10:37:08      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

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

比如数组为:[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 data

data = [1,2,3,4,5]
print ReorderOddEven(data)


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

标签:

原文地址:http://blog.csdn.net/chixujohnny/article/details/51332127

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!