Yorumlarda, problemi çözmek için aklınıza gelebilecek neredeyse tüm yöntemleri sundunuz.
Elbette, burada klasik çözüm deseni iki işaretçidir.
İşte zaman karmaşıklığı
O(n) ve bellek karmaşıklığı O(1) olan mükemmel çözüm:def move_zeroes(nums: list[int]) -> None:
insert_pos = 0
for i in range(len(nums)):
if nums[i] != 0:
# Sıfır olmayan öğeyi "soldaki" sıfırla takas et
nums[insert_pos], nums[i] = nums[i], nums[insert_pos]
insert_pos += 1Hiçbir bellek ayırması yok. Listenin ortasından
pop() yok. Diziyi tam olarak bir kez geçiyoruz. insert_pos değişkeni her zaman ilk uygun sıfırı gösterir. Sıfırdan farklı bir sayı bulduğumuzda, Python'daki yerleşik demet açma mekanizması sayesinde onları yer değiştiriyoruz.🐍 Ama daha kurnazca bir şey olmadan ilginç olmazdı. İşte size jeneratör kullanmadan tek satırda bir Python esnekliği:
nums.sort(key=bool, reverse=True)Bu nasıl çalışıyor?
bool(0) False verir, diğer sayılar True verir. Python'daki yerleşik Timsort sıralaması kararlıdır — eşit öğelerin orijinal sırasını kesinlikle korur. Tüm True (sayılar) kendi sıralarını koruyarak sola kayar, tüm False (sıfırlar) ise sağa uçar.Evet, resmi olarak burada karmaşıklık O(n log n)'dir, bu algoritmik olarak iki işaretçiden daha kötüdür. Ancak Timsort'un can sıkıcı C dilinde yazılmış olması nedeniyle, küçük hacimli gerçek listelerde bu kod, saf Python döngülerini yürütme hızı açısından fiziksel olarak parçalayacaktır.
#algosöyleşi
Yorumlar
0Henüz yorum yok.