Write a function reverseWords() that takes a message as an array of characters and reverses the order of the words in place.
function reverseWords(message) {
// O(n)
// first reverse all chars in the message
reverse(message, 0, message.length - 1);
// O(n)
// then re-reverse each word
let left = 0;
for (let i = 0; i <= message.length; i++) {
if (message[i] === ' ' || i === message.length) {
reverse(message, left, i - 1);
left = i + 1;
}
}
}
function reverse(message, left, right) {
// O(n)
while (left < right) {
const temp = message[left];
message[left] = message[right];
message[right] = temp;
left++;
right--;
}
}
// Tests
let desc = 'one word';
let input = 'vault'.split('');
reverseWords(input);
let actual = input.join('');
let expected = 'vault';
assertEqual(actual, expected, desc);
desc = 'two words';
input = 'thief cake'.split('');
reverseWords(input);
actual = input.join('');
expected = 'cake thief';
assertEqual(actual, expected, desc);
desc = 'three words';
input = 'one another get'.split('');
reverseWords(input);
actual = input.join('');
expected = 'get another one';
assertEqual(actual, expected, desc);
desc = 'multiple words same length';
input = 'rat the ate cat the'.split('');
reverseWords(input);
actual = input.join('');
expected = 'the cat ate the rat';
assertEqual(actual, expected, desc);
desc = 'multiple words different lengths';
input = 'yummy is cake bundt chocolate'.split('');
reverseWords(input);
actual = input.join('');
expected = 'chocolate bundt cake is yummy';
assertEqual(actual, expected, desc);
desc = 'empty string';
input = ''.split('');
reverseWords(input);
actual = input.join('');
expected = '';
assertEqual(actual, expected, desc);
function assertEqual(a, b, desc) {
if (a === b) {
console.log(`${desc} ... PASS`);
} else {
console.log(`${desc} ... FAIL: ${a} != ${b}`);
}
}