def uniq_merge(A,B):
C = []
i=0
j=0
while(i<len(A) and j<len(B)):
if(A[i]==B[j]):
C.append(A[i])
i=i+1
j=j+1
elif(A[i]<B[j]):
C.append(A[i])
i=i+1
else:
C.append(B[j])
j=j+1

while(i<len(A)):
C.append(A[i])
i=i+1
while(j<len(B)):
C.append(B[j])
j=j+1
return C

def uniq(A):
if(len(A)==0 or len(A)==1):
return A
else:
L=A[0:len(A)//2]
R=A[len(A)//2:len(A)]
return uniq_merge(uniq(L),uniq(R))




gemini

from typing import List, TypeVar

# 任意の比較可能な型を許容するための型定義
T = TypeVar('T')

def uniq_merge(left: List[T], right: List[T]) -> List[T]:
"""
2つのソート済みリストをマージし、重複を排除した新しいリストを返す。
入力リスト自体に重複があっても、出力では排除される堅牢な実装。
"""
merged = []
i, j = 0, 0
len_left, len_right = len(left), len(right)

# 内部関数: 重複チェック付きのappend
def safe_append(value):
# mergedが空か、最後の要素と異なる場合のみ追加
if not merged or merged[-1] != value:
merged.append(value)

while i < len_left and j < len_right:
if left[i] < right[j]:
safe_append(left[i])
i += 1
elif left[i] > right[j]:
safe_append(right[j])
j += 1
else:
# 等しい場合は片方を追加し、両方のインデックスを進める
safe_append(left[i])
i += 1
j += 1

# 残りの要素を処理
while i < len_left:
safe_append(left[i])
i += 1

while j < len_right:
safe_append(right[j])
j += 1

return merged

def uniq(arr: List[T]) -> List[T]:
"""
マージソートの分割統治法を用いてリストをソートおよびユニーク化する。
"""
if len(arr) <= 1:
# 要素数が0または1なら、重複排除の必要なし(そのまま返す)
# ※副作用を防ぐためコピーを返すのが安全な場合もあるが今回はそのまま
return arr

mid = len(arr) // 2

# 再帰的に分割
left_sorted = uniq(arr[:mid])
right_sorted = uniq(arr[mid:])

return uniq_merge(left_sorted, right_sorted)

if __name__ == "__main__":
# テストケース: 重複が激しい、順序がバラバラ
data = [5, 1, 3, 3, 5, 1, 2, 9, 1, 5]
result = uniq(data)

print(f"Original: {data}")
print(f"Result : {result}")

# 期待される出力: [1, 2, 3, 5, 9]



最終更新日時: 2026/01/29 10:13

top
copyright (c) plsk.net