diff --git a/README.md b/README.md index 73ab537..ec7fd7a 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ Continually updated Python Notebooks containing TDD-based coding challenges and | [unique_chars](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/unique_chars/unique_chars_solution.ipynb) | Determine if a string contains unique characters | | [reverse_string](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/reverse_string/reverse_string_solution.ipynb) | Reverse characters in a string | | [permutation](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/permutation/permutation_solution.ipynb) | Determine if a string is a permutation of another | -| [replace_char](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/replace_char/replace_char_solution.ipynb) | Encode spaces in a string in-place | | [compress](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/compress/compress_solution.ipynb) | Compress a string | | [rotation](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/rotation/rotation_solution.ipynb) | Determine if a string is a rotation of another | | [hash-map](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/hash_map/hash_map_solution.ipynb) | Implement a hash table with set, get, and remove methods | diff --git a/arrays_strings/replace_char/__init__.py b/arrays_strings/replace_char/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/arrays_strings/replace_char/replace_char_challenge.ipynb b/arrays_strings/replace_char/replace_char_challenge.ipynb deleted file mode 100644 index 77c60ab..0000000 --- a/arrays_strings/replace_char/replace_char_challenge.ipynb +++ /dev/null @@ -1,177 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook was prepared by [Donne Martin](http://donnemartin.com). Source and license info is on [GitHub](https://github.com/donnemartin/interactive-coding-challenges)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Challenge Notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problem: Given a string (a list of characters), replace all spaces with '%20', in-place\n", - "\n", - "* [Constraints](#Constraints)\n", - "* [Test Cases](#Test-Cases)\n", - "* [Algorithm](#Algorithm)\n", - "* [Code](#Code)\n", - "* [Unit Test](#Unit-Test)\n", - "* [Solution Notebook](#Solution-Notebook)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Constraints\n", - "\n", - "*Problem statements are sometimes ambiguous. Identifying constraints and stating assumptions can help to ensure you code the intended solution.*\n", - "\n", - "* Can we assume the string is ASCII?\n", - " * Yes\n", - " * Note: Unicode strings could require special handling depending on your language\n", - "* Is there enough space in the data structure for this operation?\n", - " * Yes\n", - "* Since Python strings are immutable and we are asked to do this in-place, can I use a bytearray or a list instead?\n", - " * Yes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test Cases\n", - "\n", - "* None -> None\n", - "* ' ' -> '%20'\n", - "* ' foo bar ' -> '%20foo%20bar%20'\n", - "* 'foo' -> 'foo'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Algorithm\n", - "\n", - "Refer to the [Solution Notebook](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/replace_char/replace_char_solution.ipynb). If you are stuck and need a hint, the solution notebook's algorithm discussion might be a good place to start." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def encode_spaces(string, length):\n", - " # TODO: Implement me\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Unit Test" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "**The following unit test is expected to fail until you solve the challenge.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# %load test_replace_char.py\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestReplace(object):\n", - " \n", - " def test_replace_char(self, func):\n", - " # | are used to satisfy the constraint that\n", - " # there is enough space in the string to\n", - " # replace ' ' with '%20'\n", - " # For each space, add two ||\n", - " str0 = None\n", - " str1 = bytearray(' ||')\n", - " str2 = bytearray(' foo bar ||||||')\n", - " str3 = bytearray('foo')\n", - " func(str0, 0)\n", - " func(str1, 1)\n", - " func(str2, 9)\n", - " func(str3, 3)\n", - " assert_equal(str0, None)\n", - " assert_equal(str1, '%20')\n", - " assert_equal(str2, '%20foo%20bar%20')\n", - " assert_equal(str3, 'foo')\n", - " print('Success: test_replace_char')\n", - "\n", - "def main():\n", - " test = TestReplace()\n", - " test.test_replace_char(encode_spaces)\n", - " \n", - "if __name__ == '__main__':\n", - " main()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution Notebook\n", - "\n", - "Review the [Solution Notebook](http://nbviewer.ipython.org/github/donnemartin/interactive-coding-challenges/blob/master/arrays_strings/replace_char/replace_char_solution.ipynb) for a discussion on algorithms and code solutions." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/arrays_strings/replace_char/replace_char_solution.ipynb b/arrays_strings/replace_char/replace_char_solution.ipynb deleted file mode 100644 index 7e6ca7c..0000000 --- a/arrays_strings/replace_char/replace_char_solution.ipynb +++ /dev/null @@ -1,240 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook was prepared by [Donne Martin](http://donnemartin.com). Source and license info is on [GitHub](https://github.com/donnemartin/interactive-coding-challenges)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution Notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problem: Given a string (a list of characters), replace in-place all spaces with '%20'\n", - "\n", - "* [Constraints](#Constraints)\n", - "* [Test Cases](#Test-Cases)\n", - "* [Algorithm](#Algorithm)\n", - "* [Code](#Code)\n", - "* [Pythonic-Code: Not In-Place](#Pythonic-Code:-Not-In-Place)\n", - "* [Unit Test](#Unit-Test)\n", - "* [Solution Notebook](#Solution-Notebook)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Constraints\n", - "\n", - "*Problem statements are sometimes ambiguous. Identifying constraints and stating assumptions can help to ensure you code the intended solution.*\n", - "\n", - "* Can we assume the string is ASCII?\n", - " * Yes\n", - " * Note: Unicode strings could require special handling depending on your language\n", - "* Is there enough space in the data structure for this operation?\n", - " * Yes\n", - "* Since Python strings are immutable and we are asked to do this in-place, can I use a list or a bytearray instead?\n", - " * Yes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test Cases\n", - "\n", - "* None -> None\n", - "* ' ' -> '%20'\n", - "* ' foo bar ' -> '%20foo%20bar%20'\n", - "* 'foo' -> 'foo'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Algorithm\n", - "\n", - "Since Python strings are immutable, we'll use a bytearray instead to exercise in-place string manipulation as you would get with a C string.\n", - "\n", - "* Count the number of spaces in the bytearray\n", - "* Determine the new bytearray length\n", - "* For each character code in the bytearray, starting from the end of the string\n", - " * If the character code is a space\n", - " * bytearray[new length] = '0',\n", - " * bytearray[new length - 1] = '2',\n", - " * bytearray[new length - 2] = '%',\n", - " * new length -= 3\n", - " * Else\n", - " * bytearray[new length] = character code,\n", - " * new length -= 1\n", - "\n", - "Complexity:\n", - "* Time: O(n)\n", - "* Space: In-place" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def encode_spaces(string, length):\n", - " if string is None:\n", - " return\n", - " num_spaces = string.count(' ')\n", - " new_length = length + 2 * num_spaces - 1\n", - " for i in xrange(length-1, -1, -1):\n", - " if chr(string[i]) == ' ':\n", - " string[new_length] = '0'\n", - " string[new_length-1] = '2'\n", - " string[new_length-2] = '%'\n", - " new_length -= 3\n", - " else:\n", - " string[new_length] = string[i]\n", - " new_length -= 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Pythonic-Code: Not In-Place\n", - "\n", - "The following code is Pythonic, but requires using additional data structures as Python strings are immutable. You could use a bytearray or a list instead of a string to simulate manipulating an array of characters." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import re\n", - "\n", - "\n", - "def encode_spaces_alt(string):\n", - " return re.sub(' ', '%20', string)\n", - "\n", - "def encode_spaces_alt2(string):\n", - " return string.replace(' ', '%20')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Unit Test" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overwriting test_replace_char.py\n" - ] - } - ], - "source": [ - "%%writefile test_replace_char.py\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestReplace(object):\n", - " \n", - " def test_replace_char(self, func):\n", - " # | are used to satisfy the constraint that\n", - " # there is enough space in the string to replace\n", - " # ' ' with '%20'\n", - " str0 = None\n", - " str1 = bytearray(' ||')\n", - " str2 = bytearray(' foo bar ||||||')\n", - " str3 = bytearray('foo')\n", - " func(str0, 0)\n", - " func(str1, 1)\n", - " func(str2, 9)\n", - " func(str3, 3)\n", - " assert_equal(str0, None)\n", - " assert_equal(str1, '%20')\n", - " assert_equal(str2, '%20foo%20bar%20')\n", - " assert_equal(str3, 'foo')\n", - " print('Success: test_replace_char')\n", - "\n", - "def main():\n", - " test = TestReplace()\n", - " test.test_replace_char(encode_spaces)\n", - " \n", - "if __name__ == '__main__':\n", - " main()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Success: test_replace_char\n" - ] - } - ], - "source": [ - "run -i test_replace_char.py" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/arrays_strings/replace_char/test_replace_char.py b/arrays_strings/replace_char/test_replace_char.py deleted file mode 100644 index 1d86f66..0000000 --- a/arrays_strings/replace_char/test_replace_char.py +++ /dev/null @@ -1,29 +0,0 @@ -from nose.tools import assert_equal - - -class TestReplace(object): - - def test_replace_char(self, func): - # | are used to satisfy the constraint that - # there is enough space in the string to replace - # ' ' with '%20' - str0 = None - str1 = bytearray(' ||') - str2 = bytearray(' foo bar ||||||') - str3 = bytearray('foo') - func(str0, 0) - func(str1, 1) - func(str2, 9) - func(str3, 3) - assert_equal(str0, None) - assert_equal(str1, '%20') - assert_equal(str2, '%20foo%20bar%20') - assert_equal(str3, 'foo') - print('Success: test_replace_char') - -def main(): - test = TestReplace() - test.test_replace_char(encode_spaces) - -if __name__ == '__main__': - main() \ No newline at end of file