标签:
题目描述:给定一个整数数组,实现一个函数来调整数组中的数字顺序,使得奇数都在这个数组中的前半部分,偶数都在数组中的后半部分。
比如数组为:[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)
标签:
原文地址:http://blog.csdn.net/chixujohnny/article/details/51332127