Solve InterviewCake's reverse-words

Wrote a function to reverse the words in a list of characters. A word is a
space-delimited strings of characters.

The trick here is to first reverse the entire string and then reverse each word
individually.
This commit is contained in:
William Carroll 2020-02-18 14:17:59 +00:00
parent 9fc29831e0
commit acf1b8c4f0
2 changed files with 64 additions and 1 deletions

View file

@ -0,0 +1,63 @@
import unittest
def reverse(xs, i, j):
"""Reverse array of characters, xs, in-place."""
while i < j:
xs[i], xs[j] = xs[j], xs[i]
i += 1
j -= 1
def reverse_words(xs):
reverse(xs, 0, len(xs) - 1)
i = 0
j = i
while j < len(xs):
while j < len(xs) and xs[j] != ' ':
j += 1
reverse(xs, i, j - 1)
j += 1
i = j
# Tests
class Test(unittest.TestCase):
def test_one_word(self):
message = list('vault')
reverse_words(message)
expected = list('vault')
self.assertEqual(message, expected)
def test_two_words(self):
message = list('thief cake')
reverse_words(message)
expected = list('cake thief')
self.assertEqual(message, expected)
def test_three_words(self):
message = list('one another get')
reverse_words(message)
expected = list('get another one')
self.assertEqual(message, expected)
def test_multiple_words_same_length(self):
message = list('rat the ate cat the')
reverse_words(message)
expected = list('the cat ate the rat')
self.assertEqual(message, expected)
def test_multiple_words_different_lengths(self):
message = list('yummy is cake bundt chocolate')
reverse_words(message)
expected = list('chocolate bundt cake is yummy')
self.assertEqual(message, expected)
def test_empty_string(self):
message = list('')
reverse_words(message)
expected = list('')
self.assertEqual(message, expected)
unittest.main(verbosity=2)

View file

@ -1,7 +1,7 @@
* Array and string manipulation
** DONE Merging Meeting Times
** DONE Reverse String in Place
** TODO Reverse Words
** DONE Reverse Words
** TODO Merge Sorted Arrays
** TODO Cafe Order Checker
* Hashing and hash tables