Python调整数组顺序使奇数位于偶数前面

本文阅读 2 分钟
首页 Python笔记 正文

注重函数的扩展性能。把函数中的判断条件写成一个判断条件的函数,方便与函数的扩展。对于奇数位于偶数前面的情况,类似于快排,在头和尾分别设置一个指针,头指针指向奇数则后移,尾指针指向偶数则前移。

  1. '''
  2. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分
  3. 所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  4. '''
  5. class Solution:
  6. # 一个类似于快排的方法, 只是简单的满足了奇数在前,偶数在后, 奇数的顺序发生了改变
  7. def reOrderArray(self, array):
  8. if len(array) < 1:
  9. return
  10. elif len(array) == 1:
  11. return array
  12. front = 0
  13. rear = len(array)-1
  14. while front <= rear:
  15. while array[front] & 0x1 == 1:
  16. front += 1
  17. while array[rear] & 0x1 == 0:
  18. rear -= 1
  19. array[front], array[rear] = array[rear], array[front]
  20. array[front], array[rear] = array[rear], array[front]
  21. return array
  22. # 直接利用Python的trick, 写一个简单的排列数组, 顺序不变
  23. def reOrderArray2(self, array):
  24. left = [x for x in array if x & 1]
  25. right = [x for x in array if not x & 1]
  26. return left + right
  27. def reOrderArray3(self, array):
  28. if len(array) < 1:
  29. return []
  30. if len(array) == 1:
  31. return array
  32. arrayOdd = []
  33. arrayEven = []
  34. for num in array:
  35. if num & 0x1:
  36. arrayOdd.append(num)
  37. else:
  38. arrayEven.append(num)
  39. return arrayOdd+arrayEven
  40. # 可扩展性的解法
  41. # 注意在一个函数的输入中, 输入另一个函数的写法func = self.fucName, funcName不需要加括号
  42. def Reorder(self, pData, length, func):
  43. if length == 0:
  44. return
  45. pBegin = 0
  46. pEnd = length - 1
  47. while pBegin < pEnd:
  48. while pBegin < pEnd and not func(pData[pBegin]):
  49. pBegin += 1
  50. while pBegin < pEnd and func(pData[pEnd]):
  51. pEnd -= 1
  52. if pBegin < pEnd:
  53. pData[pBegin], pData[pEnd] = pData[pEnd], pData[pBegin]
  54. return pData
  55. def isEven(self, n):
  56. return not n & 0x1
  57. def isNegtive(self, n):
  58. return n >= 0
  59. def ReorderOddEven(self, pData):
  60. length = len(pData)
  61. return self.Reorder(pData, length, func=self.isNegtive)
  62. S = Solution()
  63. # print(S.reOrderArray3([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]))
  64. # print(S.ReorderOddEven([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]))
  65. print(S.ReorderOddEven([-1, 2, -3, 4, -5, -6, 7, 8, 9, 10, -10]))
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

Python在O(1)时间删除链表结点
« 上一篇 01-21
Python链表中倒数第k个结点
下一篇 » 01-21

发表评论