defverify(res, nums): assertsorted(res) == sorted(nums) is_even = True for num in res: if is_even: if num & 1: is_even = False else: assert num & 1 == 1
@pytest.mark.parametrize('nums, expected', [ ([3,1,2,4], [2,4,3,1]), ([0], [0]), ]) @pytest.mark.parametrize('sol', [Solution()]) deftest_solution(sol, nums, expected): res = sol.sortArrayByParity(nums.copy()) if res != expected: verify(res, nums)
Thoughts
用两个指针分别从数组首尾向中间扫描,即 i = 0 和 j = n - 1。如果 nums[i] 是偶数则右移 i 直到遇到奇数(或与 j 相遇),如果 nums[j] 是奇数则左移 j 直到遇到偶数(或与 i 相遇)。停下时如果 i 和 j 未相遇,说明 nums[i] 是奇数而 nums[j] 是偶数,将二者交换。重复处理直到 i 和 j 相遇即可。
classSolution: defsortArrayByParity(self, nums: list[int]) -> list[int]: i = 0 j = len(nums) - 1 while i < j: while i < j and nums[i] & 1 == 0: i += 1 while i < j and nums[j] & 1 == 1: j -= 1 if i < j: nums[i], nums[j] = nums[j], nums[i]