奇偶数(leetcode)

 给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
请尽可能实现通过一次遍历并且原地操作(即不得借助其他数组)进行奇偶划分。

Input
输入有两行,第一行输入一个数字n表示数组的长度,第二行依次输入n个数字,表示数组的元素值。
Output
打印按照奇偶排列并各自排序后的新数组,元素之间用空格隔开

类似leetcode原题


思路:
思路: 先进行奇偶划分然后再排序
双指针遍历,一个从数组头部进行,一个从尾部运行;
对于两个指针指的数字进行判断,将会有四种情况:
1. 左偶右奇 不作处理,两个指针分别移动一个单位
2. 左奇右偶 进行交换,两个指针分别移动一个单位
3. 都是奇数 将尾部指针移动一个单位,再进行上述判断
4. 都是偶数 将头部指针移动一个单位,再进行上述判断

leetcode原题答案

class Solution:def sortArrayByParity(self, A: List[int]) -> List[int]:i = 0j = len(A) - 1while i < j:# 左偶右奇if A[i] % 2 == 0 and A[j] % 2 != 0:i += 1j -= 1# 左奇右偶elif A[i] % 2 != 0 and A[j] % 2 == 0:A[i], A[j] = A[j], A[i]i += 1j -= 1# 都是奇数elif A[i] % 2 != 0 and A[j] % 2 != 0:j -= 1# 都是偶数else:i += 1return A

本题答案

注意这道题要求是奇数在左边,偶数在右边,因此在双指针遍历时候要适当调整策略

import sysdef split_even_odd():length = int(sys.stdin.readline())l = sys.stdin.readline().strip().split(' ')i = 0j = len(l) - 1index = 0while i < j:# 左偶右奇if int(l[i]) % 2 == 0 and int(l[j]) % 2 != 0:l[i], l[j] = l[j], l[i]index = ii += 1j -= 1# 左奇右偶elif int(l[i]) % 2 != 0 and int(l[j]) % 2 == 0:index = ii += 1j -= 1# 都是奇数elif int(l[i]) % 2 != 0 and int(l[j]) % 2 != 0:i += 1# 都是偶数else:j -= 1print(' '.join(sorted(l[:index+1], key=lambda x: int(x)) + sorted(l[index+1:], key=lambda x: int(x))))split_even_odd()

注意以上index表示指向划分好的数组中最后一个偶数, 以便我们分别排序


暴力方法

length = int(input())
l = input().strip().split(' ')
print(' '.join(sorted([i for i in l if int(i) % 2 != 0], key=lambda x: int(x)) + sorted([i for i in l if int(i) % 2 == 0], key=lambda x: int(x))))

欢迎评论给出新的好方法.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部