subtree(users/wpcarro): docking briefcase at '24f5a642'
git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
This commit is contained in:
commit
019f8fd211
766 changed files with 175420 additions and 0 deletions
62
users/wpcarro/scratch/facebook/move-zeroes-to-end.py
Normal file
62
users/wpcarro/scratch/facebook/move-zeroes-to-end.py
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
from collections import deque
|
||||
|
||||
def move_zeroes_to_end_quadratic(xs):
|
||||
"""
|
||||
This solution is suboptimal. It runs in quadratic time, and it uses constant
|
||||
space.
|
||||
"""
|
||||
i = 0
|
||||
while i < len(xs) - 1:
|
||||
if xs[i] == 0:
|
||||
j = i + 1
|
||||
while j < len(xs) and xs[j] == 0:
|
||||
j += 1
|
||||
if j >= len(xs):
|
||||
break
|
||||
xs[i], xs[j] = xs[j], xs[i]
|
||||
i += 1
|
||||
|
||||
def move_zeroes_to_end_linear(xs):
|
||||
"""
|
||||
This solution is clever. It runs in linear time proportionate to the number
|
||||
of elements in `xs`, and has linear space proportionate to the number of
|
||||
consecutive zeroes in `xs`.
|
||||
"""
|
||||
q = deque()
|
||||
for i in range(len(xs)):
|
||||
if xs[i] == 0:
|
||||
q.append(i)
|
||||
else:
|
||||
if q:
|
||||
j = q.popleft()
|
||||
xs[i], xs[j] = xs[j], xs[i]
|
||||
q.append(i)
|
||||
|
||||
def move_zeroes_to_end_linear_constant_space(xs):
|
||||
"""
|
||||
This is the optimal solution. It runs in linear time and uses constant
|
||||
space.
|
||||
"""
|
||||
i = 0
|
||||
for j in range(len(xs)):
|
||||
if xs[j] != 0:
|
||||
xs[i], xs[j] = xs[j], xs[i]
|
||||
i += 1
|
||||
|
||||
|
||||
################################################################################
|
||||
# Tests
|
||||
################################################################################
|
||||
|
||||
xss = [
|
||||
[1, 2, 0, 3, 4, 0, 0, 5, 0],
|
||||
[0, 1, 2, 0, 3, 4],
|
||||
[0, 0],
|
||||
]
|
||||
|
||||
f = move_zeroes_to_end_linear_constant_space
|
||||
|
||||
for xs in xss:
|
||||
print(xs)
|
||||
f(xs)
|
||||
print(xs)
|
||||
Loading…
Add table
Add a link
Reference in a new issue