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]
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
ダークモード
copyright (c) plsk.net