diff --git a/.ipynb_checkpoints/Practice-checkpoint.ipynb b/.ipynb_checkpoints/Practice-checkpoint.ipynb new file mode 100644 index 00000000..dec76da5 --- /dev/null +++ b/.ipynb_checkpoints/Practice-checkpoint.ipynb @@ -0,0 +1,187 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'HELLO'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'hello'\n", + "s.upper()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hi\n" + ] + } + ], + "source": [ + "set1 = set()\n", + "print('hi')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('hello',)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import timeit\n", + "timeit\n", + "singleton = 'hello',\n", + "singleton" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{'banana', 'apple', 'orange', 'pear'}\n" + ] + } + ], + "source": [ + "basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}\n", + "print(type(basket))\n", + "print(basket)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{' ', 't', 's', 'i', 'h', 'o', 'e', 'n', 'm', 'g'}\n" + ] + } + ], + "source": [ + "chars = {c for c in 'this is something'}\n", + "print(chars)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'A man, a plan, a canal: Panama'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "'return' outside function (, line 7)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m return False\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m 'return' outside function\n" + ] + } + ], + "source": [ + "s='ab'\n", + "s=s.casefold()\n", + "chars = list(filter(lambda c:c.isalpha(), s))\n", + "low, high=0, len(chars)-1\n", + "while(low + + Python-for-Algorithm-and-Interviews + + + + + + org.python.pydev.PyDevBuilder + + + + + + org.python.pydev.pythonNature + + diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 00000000..d001f0ae --- /dev/null +++ b/.pydevproject @@ -0,0 +1,5 @@ + + +Default +python interpreter + diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb similarity index 74% rename from Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb rename to 01-Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb index 5f2b2c4f..84b0069a 100644 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb +++ b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb @@ -10,23 +10,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb similarity index 87% rename from Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb rename to 01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb index 7f3a7a2d..118bd5dc 100644 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb +++ b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb @@ -15,10 +15,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -33,7 +31,7 @@ " '''\n", " Prints first item in a list of values.\n", " '''\n", - " print values[0]\n", + " print(values[0])\n", " \n", "func_constant([1,2,3])" ] @@ -54,10 +52,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -75,7 +71,7 @@ " Takes in list and prints out all values\n", " '''\n", " for val in lst:\n", - " print val\n", + " print(val)\n", " \n", "func_lin([1,2,3])" ] @@ -96,10 +92,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -131,7 +125,7 @@ " '''\n", " for item_1 in lst:\n", " for item_2 in lst:\n", - " print item_1,item_2\n", + " print(item_1,item_2)\n", " \n", "lst = [0, 1, 2, 3]\n", "\n", @@ -159,10 +153,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "def print_once(lst):\n", @@ -170,15 +162,13 @@ " Prints all items once\n", " '''\n", " for val in lst:\n", - " print val" + " print(val)" ] }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -204,10 +194,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "def print_3(lst):\n", @@ -215,21 +203,19 @@ " Prints all items three times\n", " '''\n", " for val in lst:\n", - " print val\n", + " print(val)\n", " \n", " for val in lst:\n", - " print val\n", + " print (val)\n", " \n", " for val in lst:\n", - " print val" + " print (val)" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -265,10 +251,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, + "execution_count": 12, + "metadata": {}, "outputs": [], "source": [ "def comp(lst):\n", @@ -277,23 +261,21 @@ " Then is prints the first 1/2 of the list O(n/2)\n", " Then prints a string 10 times O(10)\n", " '''\n", - " print lst[0]\n", + " print(lst[0])\n", " \n", - " midpoint = len(lst)/2\n", + " midpoint = len(lst) // 2\n", " \n", " for val in lst[:midpoint]:\n", - " print val\n", + " print(val)\n", " \n", " for x in range(10):\n", - " print 'number'" + " print('number')" ] }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -346,10 +328,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, + "execution_count": 14, + "metadata": {}, "outputs": [], "source": [ "def matcher(lst,match):\n", @@ -364,10 +344,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "data": { @@ -375,7 +353,7 @@ "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -386,10 +364,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "data": { @@ -397,7 +373,7 @@ "True" ] }, - "execution_count": 22, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -408,10 +384,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "data": { @@ -419,7 +393,7 @@ "False" ] }, - "execution_count": 24, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -445,26 +419,22 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": true - }, + "execution_count": 21, + "metadata": {}, "outputs": [], "source": [ "def printer(n=10):\n", " '''\n", " Prints \"hello world!\" n times\n", " '''\n", - " for x in range(10):\n", - " print 'Hello World!'" + " for x in range(n):\n", + " print('Hello World!')" ] }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -498,10 +468,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, + "execution_count": 23, + "metadata": {}, "outputs": [], "source": [ "def create_list(n):\n", @@ -515,10 +483,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -529,7 +495,7 @@ } ], "source": [ - "print create_list(5)" + "print(create_list(5))" ] }, { @@ -558,23 +524,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb new file mode 100644 index 00000000..713ba5a6 --- /dev/null +++ b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb @@ -0,0 +1,202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Big O Notation\n", + "In this lecture we will go over how the syntax of Big-O Notation works and how we can describe algorithms using Big-O Notation!\n", + "\n", + "We previously discussed the functions below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# First function (Note the use of xrange since this is in Python 2)\n", + "def sum1(n):\n", + " '''\n", + " Take an input of n and return the sum of the numbers from 0 to n\n", + " '''\n", + " final_sum = 0\n", + " for x in range(n+1): \n", + " final_sum += x\n", + " \n", + " return final_sum" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def sum2(n):\n", + " \"\"\"\n", + " Take an input of n and return the sum of the numbers from 0 to n\n", + " \"\"\"\n", + " return (n*(n+1))/2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we want to develop a notation to objectively compare the efficiency of these two algorithms. A good place to start would be to compare the number of assignments each algorithm makes.\n", + "\n", + "The original **sum1** function will create an assignment **n+1** times, we can see this from the range based function. This means it will assign the final_sum variable n+1 times. We can then say that for a problem of n size (in this case just a number n) this function will take 1+n steps.\n", + "\n", + "This **n** notation allows us to compare solutions and algorithms relative to the size of the problem, since sum1(10) and sum1(100000) would take very different times to run but be using the same algorithm. We can also note that as n grows very large, the **+1** won't have much effect. So let's begin discussing how to build a syntax for this notation.\n", + "________\n", + "\n", + "Now we will discuss how we can formalize this notation and idea.\n", + "\n", + "Big-O notation describes *how quickly runtime will grow relative to the input as the input get arbitrarily large*.\n", + "\n", + "Let's examine some of these points more closely:\n", + "\n", + "* Remember, we want to compare how quickly runtime will grows, not compare exact runtimes, since those can vary depending on hardware.\n", + "\n", + "* Since we want to compare for a variety of input sizes, we are only concerned with runtime grow *relative* to the input. This is why we use **n** for notation.\n", + "\n", + "* As n gets arbitrarily large we only worry about terms that will grow the fastest as n gets large, to this point, Big-O analysis is also known as **asymptotic analysis**\n", + "\n", + "\n", + "As for syntax sum1() can be said to be **O(n)** since its runtime grows linearly with the input size. In the next lecture we will go over more specific examples of various O() types and examples. To conclude this lecture we will show the potential for vast difference in runtimes of Big-O functions.\n", + "\n", + "## Runtimes of Common Big-O Functions\n", + "\n", + "Here is a table of common Big-O functions:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + "
Big-OName
1Constant
log(n)Logarithmic
nLinear
nlog(n)Log Linear
n^2Quadratic
n^3Cubic
2^nExponential
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's plot the runtime versus the Big-O to compare the runtimes. We'll use a simple [matplotlib](http://matplotlib.org/) for the plot below. (Don't be concerned with how to use matplotlib, that is irrelevant for this part)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 0, 'n')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAAJQCAYAAAB1t1kcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAADhoUlEQVR4nOzdd5xU9b3/8deZtmW2F3bpoKIoKIoKUgVRYy9YoibqNfaSXG/M9Zd4Y8u9saQaW6LRWGMwsYFdsSACooBRbDSVvsvusm1mp8/398fsLiAMnN2dmfM9M5/n4+FD2TLzWfbt2c9+53s+X0MphRBCCCGEECI5h9UFCCGEEEIIoTtpmoUQQgghhNgDaZqFEEIIIYTYA2mahRBCCCGE2ANpmoUQQgghhNgDaZqFEEIIIYTYA1emnsgwjG+BdiAGRJVShxmGUQE8DQwDvgXOVko1Z6omIYQQQgghzMj0SvN0pdTBSqnDOv/8c+AtpdQI4K3OPwshhBBCCKEVq7dnnAo81vnfjwGnWVeKEEIIIYQQu5bJplkBbxiGsdQwjMs631ajlNrc+d91QE0G6xFCCCGEEMKUjO1pBiYrpTYahtEPeNMwjK+2f6dSShmGsdOZ3q+99pravHkzhmGglKK8vJzq6moikQhOpxOAWCyG2+0mGo0C4HK5evX+SCSCYRg4nU6i0ShOpxOlFPF4vPv9DocDh8NBNBrF5XIRj8d7/H7DMIjFYrhcLmKxGEqp7vfL1yRfU7q+JtrCEItDSR6uPHdWfE3Z+H3K1NfUEVU0R13kGXEq3LGs+Jps9X0ijtqyAgW4avcnqgz7f03Z+H2SrynnvqZYLNY4Y8aManYhY02zUmpj57+3GIbxPDAOqDcMo79SarNhGP2BLd/9vNLSUsaPH5+pMkUS69evZ/DgwVaXIXpJReN8c9dcUIph/3U0DpczpY8v+bCfl9fHeHF9nGMGOJg2LLV52J5kY9faXrwV/1t/Iv+Q0yk/5hyry7GEZEMkY2U2li1btjbZ+zKyPcMwDK9hGMVd/w0cC3wGzAEu7PywC4HZmahH9JxhGFaXIPog0tIBSuEqLUh5wwySDzva4E+8sDewML3fO8nGzuIhPx2LErfzeI+80uJqrCPZEMnomo1MrTTXAM93/iW4gKeUUq8ZhvER8E/DMC4G1gJnZ6ge0UMVFRVWlyD6ILLVD4C70puWx5d82M/GjkTTPMib3h9Oko2dBT6ahepowT3scDzDDtvzJ2QpyYZIRtdsZGSlWSn1tVJqTOc/o5RSv+58e5NSaoZSaoRS6mil1NZM1CN6rqGhweoSRB+EO5tmT3l6mmbJh72EYoqGIDgMqClI73NJNnak4nH88/4CgHda7q4yg2RDJKdrNjJ5I6CwsZKSEqtLEH2Q7pVmyYe9bOpQKGBAAbgd6V1plmzsKPTlm8Qa1uAsH0z+gSdZXY6lJBsJSil8Ph9K7TQLIWcVFhbS1taW1ucwDIOioqIebQWRplmYEovFrC5B9EF301yRnqZZ8mEv6/2Z2ZoBko3v8r/7ZwAKp16K4cztH8GSjQSfz0deXh4ej8fqUrQRiURwu91pfY5wOIzP56O4uNj051h9uImwCb/fb3UJopeUUoSbOrdnpKlplnzYy4bOb9egNN8ECJKN7UU2fkZ41XsYeUUUHnGB1eVYTrKRoJSShvk74vF42p/D4/H0eHVfmmZhSm1trdUliF6K+cOocBRHvgtHYXouzJIPe9mQoZsAQbKxPf+8xCpzwfjzcBTI1gTJhkgm3avMvSVNszClrq7O6hJEL3VvzSj3pm2Mj+TDPuJKsTGD2zMkGwmx9i0Elj4LhoF36uVWl6MFyYY+6uvrufjiixk7dizTp0/n7LPPZvXq1Sl57Jdffpmvvvpqzx+4nUgk0v3f69at45lnnklJLX0lTbMwRdff+sSepfsmQJB82ElDEEJxKPNAsTv9TbNkI6Hj/b9BLEzeqONxVQ23uhwtSDb0oJTi/PPPZ/LkySxbtox33nmHm266KWUTLF555RVWrFjRo8/ZfoFHp6Y5t+9CEKaVlpZaXYLopfBWH5C+/cwg+bCTrkNNMrGfGSQbACoSpGPB3wAZM7c9yYYe5s+fj9vt5qKLLup+2+jRo1FKcdNNNzF37lwMw+C6665j5syZvP/++9x5551UVFTw1VdfMWbMGB544AEMw+DWW2/l1VdfxeVyMX36dE466SReffVVFixYwO9//3see+wx3nvvPR5//HHC4TDDhw/nL3/5C4WFhVx99dUUFxfz8ccfs2XLFm655RZOPfVUbr31VlauXMnUqVM555xzuOqqqyz7u5KmWZjS2NiI15u+pkukT6Spa3JGUdqeQ/JhH5nczwySDYDA0meI+xpxDToIz94TrS5HG5KNnR370Mdpedw3Ljkk6fu+/PJLxowZs9PbX3zxRZYvX878+fNpampixowZTJyYyO+nn37KwoUL6d+/P8cddxyLFy9m33335eWXX2bx4sUYhkFrayulpaUcf/zxHHvssZx66qlA4pelCy9MHAb961//mieffJLLLrsMSGzZefXVV/nss8+46KKLOPXUU7n55pu59957mTVrVqr/WnpMtmcIU2RFwL4ysT1D8mEfGzK4nxkkG0qpbYeZHHmltscDWyHXs6G7Dz74gDPOOAOn00m/fv2YNGkSH3+caOrHjh3LwIEDcTgcHHjggaxbt46SkhLy8vL48Y9/zIsvvkhBwa5PTvryyy854YQTmDRpEv/617922O984okn4nA4OOCAA7Q84ERWmoUp4XDY6hJEL8QjMaJtiaPf3KXpO/pN8mEfXU3z4Aw1zbmejfDKd4lu/gJHSS0Fh5xudTlayfVs7MruVoTTZeTIkcyZM6dHn5OXl9f9306nk2g0isvlYu7cubz33nvMnj2bhx56iNmzZ+/0uVdffTVPPvkko0eP5qmnnmLBggXd7+savaeU0vKwF1lpFqYEAgGrSxC9EGnuXGUuK8Rwpu9/d8mHPfgiiuYweBxQnZ+Z58z1bPjfuQ8A75RLMFwyi3d7uZ4NXUydOpVQKMSjjz7a/bbPP/+c0tJSnn/+eWKxGI2NjSxcuJCxY8cmfRyfz0dbWxvHHHMMt912G5999hkARUVF+Hy+HT6upqaGSCTCv/71r10+1vZzmr/7+VaSlWZhiszTtKd0nwTYRfJhD137mQcWGjgytE0gl7MR2fwFoa/exvAUUjjxoj1/Qo7J5WzoxDAMnnjiCW644Qbuvvtu8vLyGDJkCLfddht+v58pU6ZgGAa33HILNTU1rFq1apeP4/P5+OEPf0gwGEQpxf/93/8BcPrpp3Pttdfy4IMP8uijj3LDDTdwzDHHUFVVxaGHHrrLhnj7ySqjRo3C6XQyZcoUzj33XEtvBDR0XP7e3qJFi9TIkSOtLiPnrV27lqFDh1pdhuih5gWraV64htJxw6k8ct+0PY/kwx7mborxzLdxptY4OG9vZ0aeM5ez0fLU1QQ+/AeFUy6l9Iw7rS5HO7mcje21tbVRUiKH3WwvFArtsAUkXXb1d79s2bKlM2bMOGxXHy/bM4QpcsSnPYWb03t8dhfJhz1suwkwc8+Zq9mItdYRWPoMGA68R15hdTlaytVsiD3T9YZZaZqFKcXFxVaXIHph27i59HZJkg97WJ/hyRmQu9nwz/8rxCLkH3SiHGaSRK5mQ+yZ05mZV8J6SppmYUpTU5PVJYgeUkoRae4AwF1RmNbnknzoLxJXbA6AQWJPc6bkYjbiIR8dCx8BwDvtaour0VcuZkOYE41GrS5hl6RpFqaUl5dbXYLooVh7EBWJ4Sz04CxI78ugkg/91QUgrqBfPuQ5M9c052I2AoufQnW04B4+Ds/wcVaXo61czIYwx+XSc06FNM3CFBkNZD/hDE3OAMmHHXRtzRiYwa0ZkHvZUPHYtsNMZJV5t3ItG8K87UfO6USaZmFKMBi0ugTRQ5kaNweSDzvI9KEmXXItG8HlLxNr+hZn1XDyDzzB6nK0lmvZEOZJ0yxsTeZp2k+mbgIEyYcdZPr47C65lg3/2/cCnUdmO/S8mUkXuZYNnQ0ePDijz/e9730PgHXr1vHMM890v/2pp57i+uuv32FOc098/PHH/PznP09JjbsiTbMwpa6uzuoSRA91bc/wVKa/aZZ86E0p1X2wyaAM3gQIuZWN8DeLiaxdglFYTsG4c60uR3u5lA2R0HWD3+uvvw7s3DR3iUQivXr8Qw45hDvuuKP3Be6BNM3ClPz8DJ25K1Imk9szJB96aw5DRxSKXFCW4dG4uZQNX9eR2ZN+hCMvg8OwbSqXsmFHy5cv55hjjmHy5Mmcf/75tLS0ALBs2TImT57M1KlTuemmm5g4cSKQaIBPOOEEpk2bxrRp01i8eDEA77//PieccALnnXceEyZMALatbN96660sWrSIqVOncv/99wOJX6bOO+88DjvsMG6++ebuegYPHsxNN93EhAkTOP3001m6dCknn3wyhxxyCK+++mr3c51zzjlA4oTCq6++mkmTJjF58mTmzJnT578TPW9PFNopKCiwugTRA/FwlJgvhOF04CpJ//dO8qG37bdmZPrQgFzJRrTha0LLXwanh8Ipl1hdji3kSjZ64rXaiWl53OPqFvb4c6688kruvPNOJk2axG233cadd97J7bffzjXXXMNdd93FuHHjuPXWW7s/vqqqiueee478/HzWrFnDpZdeyttvvw3Ap59+yoIFC3Y6AfLmm2/m3nvvZdasWUBie8by5ct5++23KSgoYNy4cVx66aUMGjSo+0jvX/3qV5x//vn8+te/5rnnnmPFihVcddVVHH/88Ts89u9+9ztKSkpYsGABQHfT3xey0ixMaW5utroE0QNdq8yu8kIMR/qbJMmH3qw41KRLrmTDP+/PoBQFh52Fs6TG6nJsIVeyYUdtbW20trYyadIkAM4991wWLVpEa2srPp+PceMSoxTPPPPM7s+JRqNce+21TJo0iYsuuogVK1Z0v2/s2LGmj0yfOnUqhYWF5Ofns99++7FhwwYgcYLk0UcfDcD+++/PpEmTcLvdHHDAAaxbt26nx5k3bx6XXLLtF9iysrKe/SXsgqw0C1MqKyutLkH0QLgpM8dnd5F86K17pTnD+5khN7IR92+lY/FTAHinXWVxNfaRC9noqd6sCOvi/vvvp7q6mvnz5xOPx+nfv3/3+woLzR+wlZeX1z2n2el0du+Ddrvd3a+UORyO7mPYHQ4HsVgsVV/GbslKszClvb3d6hJED2RyPzNIPnTXdRNgpsfNQW5kw7/gbxAJkLf/0bj77291ObaRC9mwq5KSEsrKyli0aBEATz/9NBMnTqS0tJSioiKWLFkCwHPPPdf9OW1tbdTU1OBwOHj66adNNbJFRUX4fL6d3p6KJnjatGk89NBD3X+W7RkiY8LhsNUliB4INyUuQpmYnAGSD50FooqGILgMqLVgC2m2Z0NFgnTMT/xg9k6/xuJq7CXbs2EnHR0djBo1qvuf++67j/vvv5+bbrqJyZMn89lnn3H99dcDcPfdd3PttdcydepU/H4/JSUlAFx88cXMmjWLKVOmsGrVKrzePf/8GTVqFE6nkylTpnTfCAiJiT99dd1119Ha2srEiROZMmUK8+fP7/NjGqkoLJ0WLVqkRo4caXUZOS8UCpGXl2d1GcKk9Q+/T2Srn4EXTCCvpiTtzyf50NfK1jh/+DzG0CKDXxyU+R152Z6Njg+eoHXWf+IaeCBVP3s34zda2lm2Z8Ostra27sbTDnw+H0VFRQDcdddd1NXVpXzMWzwex+FI/7rurv7uly1btnTGjBmH7erjZaVZmCLzNO1DxeJEWjqAzG3PkHzoa13nfuYhFmzNgOzOhorH8XeOmSuafo00zD2UzdnIZm+88QZTp05l4sSJLFq0iJ/97Gcpf47ezmlON7kRUJgio4HsI9LcAXGFq7QAhzszJ5JJPvS13uKmOZuzEfrqLaL1K3GUDSD/kNOsLsd2sjkb2WzmzJnMnDkzrc+RiVXm3tCzKqGdrrtUhf627WcuythzSj70tc7X2TRnLg47yOZsdK0ye6dejuHs3bG/uSybsyH6RtdXbaRpFqa0trZaXYIwKdI5bs6doZsAQfKhq1BMURcAhwEDLBg3B9mbjciGTwmveg8jr4jCCRdaXY4tZWs2RN9laoRcT0nTLEypqqqyugRhkhUrzZIPPW3sUChgQAG4M3DIza5kazZ879wLQOGEC3AU2OcmLp1kazZE33XNadaNNM3CFFkRsA9ZaRZdurZmWDGfuUs2ZiO6dT3Bj58HhwvvkVdYXY5tZWM2RGrISrOwNV3vZBU7UnHVfbBJJleaJR966p6cUWRd05yN2fC/ex/EYxSMPQNn+SCry7GtbMyGXQ0ePHintz3yyCPMmjXLgmpSM6c5HfRc/xbaqa2ttboEYUK0NYCKxXEW5eHIy9z/3pIPPXVNzrBypTnbshH3byXwwZMAeI/6scXV2Fu2ZSPbXHTRRWl9fKUUSqldTspwu/W8sVZWmoUpMk/THqzYzwySDx1F4oqNHWAAgyxsmrMtG/73H0aFOxJHZg84wOpybC3bspFt7rjjDu655x4ATj75ZG655RaOPvpoDj/88O7jtWOxGDfddBMzZsxg8uTJPProo0DiAJTTTjuNadOmMWnSJF555RUA1q1bx7hx47jyyiuZOHEiGzdu3OVz6/oqhKw0C1PMHIcprBfpbJozuZ8ZJB862pQY101tAeQ7rWuasykbKhyg470HAfAe9ROLq7G/bMpGqvzuhtfS8rg/u+24Pj9GNBpl7ty5vPnmm/zmN7/h+eef54knnqCkpIS33nqLUCjE8ccfz/Tp0xk4cCCPP/44JSUlNDU1ceyxx3L88ccDsGbNGu677z4OP/zwpM+l65xmaZqFKU5nZg7JEH0Tbsr8fmaQfOhonQZbMyC7stHx4T+I+5twDxmLZ59JVpdje9mUjVxw0kknATBmzBjWrVsHwDvvvMMXX3zBnDlzgMSx1GvWrGHAgAH83//9HwsXLsThcLB582a2bNkCJPZP765hBn3nNEvTLExpa2ujvLzc6jLEHnSvNFdltmmWfOhnvc/akwC7ZEs2VDyGv3PMnPeoH2v7Q91OsiUbqZSKFeF0ycvLAxK/7ESjUSCxL/mOO+5gxowZO3zsU089RWNjI++88w5ut5sxY8YQCoUAKCws3ONzxWIxLcfO6bn+LbRTXV1tdQliD5RS21aaKzL7sqfkQz86TM6A7MlG8NMXiTV9i7NqOPkHnWR1OVkhW7KRy4466igeeeSR7j3Iq1evxu/309bWRnV1NW63m/nz57N+/foePa6ODTPISrMwaevWraZ+OxTWibUHUZEYjkIPzsLMHk8r+dBLLK7YoMn2jGzIhlIK/1t3A+Cdfg2GQ7YVpEI2ZCNbdHR0MGrUqO4/X3XVVaY+74ILLmD9+vVMmzYNpRRVVVU8+eSTnHXWWZx77rlMmjSJgw8+mBEjRvSonlgspuX2HWmahSm6zkwU21i1ygySD93UBSCqoCoPCl3WNs3ZkI3w6veJrP83jqIqCg8/x+pyskY2ZCNbNDU17fb9L774Yvd/V1ZW8sknnwCJG/ZuvPFGbrzxxp0+54033tjlYy1cuLAPlVpLtmcIU+RlNP1tm5yR2f3MIPnQjS5bMyA7suF/608AFE69DMNTYHE12SMbsiHSQ9ftGdI0C1Pq6+utLkHsQfdKc1XmV5olH3rpbpot3poB9s9GZONnhL56G8NTiHfSxVaXk1Xsng2RPrrOaZamWZhSVJT51UvRM90rzRWZ/15JPvTSNTnD6v3MYP9s+N5OHO5QcMT5OLwy6SGV7J4NkT467mcGaZqFyAqJyRmdpwFasNIs9BFXSovjs7NBdOt6gh8/Bw4n3mnmbowSQmQvaZqFKT6fz+oSxG7EOsLEg1EMjwunNy/jzy/50MeWIITiUO6BEo/1TbOds+F/936Ix8g/ZCauisFWl5N17JwNkV6xWMzqEnZJmmZhSk1NjdUliN2IdJ8E6LXk0AXJhz502poB9s1G3L+VwAdPAFB01I8triY72TUbIv3cbrfVJeySNM3ClIaGBqtLELuxbWuGNXsEJR/60GlyBtg3G/4Ff0OFO8gbeRTugaOtLicr2TUb2Wjw4NS+krJu3TomTpy409tvu+023n333T1+fteJg7rRc6aH0I4cGau3rpVmtwUzmkHyoROdJmeAPbOhwgE63nsQAO9RP7G4muxlx2yIvrnhhhvS+vjRaDSt4+pkpVmYUlFRYXUJYjesXmmWfOghrhTrNNueYcdsdHw0i7ivEffgQ/CMmGJ1OVnLjtnIJcuXL+eYY45h8uTJnH/++bS0tACwbNkyJk+ezNSpU7npppt2uaKczNVXX83s2bMBGDNmDLfffjvTpk1j0qRJrFy5EgC/389//dd/cfTRR3PkkUfyyiuvAInV6xNOOIFp06Yxbdo0Fi9eDMD777/PCSecwHnnnceECRNS+DewM1lpFqY0NDQwdOhQq8sQSWwbN2fNSrPkQw8NQQjEoNQN5Xl6NM12y4aKx/C/cy8A3hk/ltXQNLJbNjLhnN8cmpbHnXX90h5/zpVXXsmdd97JpEmTuO2227jzzju5/fbbueaaa7jrrrsYN24ct956a5/qqqys5N133+Xhhx/m3nvv5e677+YPf/gDEydO5L777qO1tbW7ea6qquK5554jPz+fNWvWcOmll/L2228D8Omnn7JgwYK050lWmoUpJSUlVpcgkogFI8T8YQyXA1epNaeVST70sLZzlXmoJvuZwX7ZCH76IrHGb3BWDiP/oJOtLier2S0buaStrY3W1lYmTZoEwLnnnsuiRYtobW3F5/Mxbtw4AM4888w+Pc9JJ50EJFad169fD8A777zDfffdx9SpUzn55JMJBoNs2LCBaDTKtddey6RJk7joootYsWJF9+OMHTs2I7+AyUqzMEXX8S9ix+OzrVoVk3zoQcem2U7ZUErhfytxmIl3+jUYDj0PWMgWdspGpvRmRdjO8vISI1KdTmf3zX9KKR5++GH233//HT72jjvuoLq6mvnz5xOPx+nfv3/3+woLCzNSr6w0C1P8fr/VJYgkuo/PtmhrBkg+dNHVNA/TqGm2UzbCK+cRWf8xDm8lhePOsbqcrGenbOSakpISysrKWLRoEQBPP/00EydOpLS0lKKiIpYsWQLAc889l/LnPuqoo3jooYdQKnE9+/TTT4HE6ndNTQ0Oh4Onn37akl+6ZKVZmFJbW2t1CSKJ7pVmi24CBMmHDuJKdU/O0Gml2U7Z8L31JwAKj7wCw5OZlatcZqdsZLuOjg5GjRrV/eerrrqK+++/n5/+9KcEAgGGDRvGvfcm9vrffffdXHvttTgcDiZOnJh0m83q1at3eMxf//rXpmr52c9+xi9+8QsmT55MPB5n6NChzJo1i4svvpgLL7yQp59+mhkzZuD1Zn6hyOjq5HW1aNEiNXLkSKvLyHlr166VGzY0tfmZpQS+aaTm1IPx7mvNYQGSD+tt9Cv+95MolXnw60P1ORjALtkIr1tG0x+Oxsgrot/Ny3EUllpdUtazSzbSra2tzVb7u30+H0VFiUWau+66i7q6Ou64446UPkcoFOreupFOu/q7X7Zs2dIZM2YctquPl5VmYYqup/MIPVaaJR/W03E/M9gnG765dwFQOOlH0jBniF2yIXb0xhtvcNdddxGNRhk8eDD33Xdfyp9D16k10jQLU0pL5YeIjuLhKNG2IDgM3GXWTM4AyYcO1mq4NQPskY1I3QpCn74Erjy8R15hdTk5ww7ZEDubOXMmM2fOTOtzOJ163oQrNwIKUxobG60uQexC96EmFV4Mh3X/O0s+rPetpivNdsiG/627ASgcdy7OUtlnmyl2yIawhq7HaEvTLEyRFQE9RRo7j8+2cGsGSD6sFo0rNnatNGtyEmAX3bMRa95AYOm/wHDgPerHVpeTU3TPhrCOrDQLWwuHw1aXIHYh3Gjt8dnddUg+LLWxA6IKavKhwKVX06x7Nnzv3AvxKPmHnI6rarjV5eQU3bMhrKPrkAppmoUpgUDA6hLELoQb2wHrm2bJh7XW+uKAflszQO9sxHyNdCx6AoCio6+1tpgcpHM2hLXi8bjVJeySNM3CFJmnqafug00sbpolH9bSdXIG6J2NjvcegEiAvAOOxT1g1J4/QaSUztnINRs3buQHP/gBhx12GIcccgjXX389oVCoz4/7/vvvc845PTsoaN26dcyePbv7zx9//DE///nP+1xLKkjTLEypq6uzugTxHbFghFh7EMPlwFVq7UEMkg9r6dw065qNeLAN//yHAFlltoqu2cg1SikuvPBCTjjhBJYsWcKSJUsIBALcfPPNaXvO3d3ot27dOp555pnuPx9yyCEpnwPdW9I0C1M8Ho/VJYjv6J7PXFmE4bC2WZJ8WCccU2zqAAMYrNlNgKBvNjoWPooKtOLZawKevY6wupycpGs2cs17771HXl4eP/jBD4DETXi//vWvefrpp/nrX//K9ddf3/2x55xzDu+//z4A1113HUcddRQTJkzg9ttv7/6YuXPnMn78eKZNm8ZLL73U/fY77riDK664guOOO44rrriCdevWccIJJzBt2jSmTZvG4sWLAbj11ltZvHgxU6dO5f77799htdrn83H11VczadIkJk+ezJw5c9L+97M9mdMsTCkuLra6BPEd3TcBVlq7NQMkH1ba0KGIAwMLIc+pX9OsYzZUJIj/3T8D4JVVZsvomA2rbb62Ii2P2/+urUnf99VXXzFmzJgd3lZSUsKQIUN2uyL8y1/+kvLycmKxGKeddhqff/45e++9N9deey2zZ89mr7324kc/+tEOn7NixQpeeeUVCgoK6Ojo4LnnniM/P581a9Zw6aWX8vbbb3PzzTdzzz338PTTTwN0N+kAv/vd7ygpKWHBggUAtLS09PSvok+kaRamNDU1dR+bKfSgy+QMkHxYSdf5zF10zEbgo1nE2+pxDRhN3v5HW11OztIxG8K8F154gccee4xoNEp9fT1fffUV8XicoUOHsvfeewNw9tln89hjj3V/znHHHUdBQeIgrmg0yvXXX8/y5ctxOp2sWbOm++OSTc+YN28eDz30UPefy8rK0vCVJSdNszClvLzc6hLEd+jUNEs+rKPzfmbQLxsqFsX39j0AFB39n9oe15sLdMuGDna3Ipwu++23307bHNra2tiyZQsVFRU7NLNdNweuXbuWe++9l7feeouysjKuvvpqUzcOFhZuu//m/vvvp7q6mvnz5xOPx+nfv3/3+3T9/1L2NAtTZDSQfiKdTbPVB5uA5MNKXU3zME2bZt2yEfxkNrHGb3BWDSd/zKlWl5PTdMtGrjryyCMJBALMmjULgFgsxo033sgll1zC0KFDWb58OfF4nA0bNrB06VIA2tvbKSwspKSkhC1btjB37lwARowYwbp16/jmm28AePbZZ5M+b1tbGzU1NTgcDp5++mlisRgARUVF+Hy+XX7OtGnTdlhpzvT2DGmahSnBYNDqEsR2Yh1hYh1hDLcTV0m+1eVIPiwSiCrqA+A0YEChnk2zTtlQSuGb+ycAio76MYZTXmy1kk7ZyGWGYfD4448zZ84cDjvsMPbee28cDgfXXXcd48ePZ+jQoUyYMIFf/OIX3XufR48ezUEHHcT48eO57LLLGD9+PAD5+fn88Y9/5JxzzmHatGlUVVUlfd6LL76YWbNmMWXKFFatWoXX6wVg1KhROBwOpkyZwv3337/D51x33XW0trYyceJEpkyZwvz589P0t7Jrhq6nrnRZtGiRGjlypNVl5LxQKEReXp7VZYhOgfVb2TzrI/L6lzLwh9bf+S/5sMaK1jh//DzGUK/BL8bo2QDqlI3gF2/S/OD3cZTU0u+mjzFcetSVq3TKhpXa2tooKSmxuoxuixcv5tJLL+WJJ57Y6QbBTInH4zgc6V/X3dXf/bJly5bOmDHjsF19vKw0C1NknqZedNrPDJIPq+i+nxn0yoZv7h8B8E67UhpmDeiUDbHN+PHj+fTTTy1rmAEikYhlz7070jQLU/Lzrd8CILbp3s+swbg5kHxYxQ5Nsy7ZCH/9AZGvP8AoKKVw4n9YXY5An2wI/WRilbk39KxKaKdrRIzQg24rzZIPa3yj+U2AoE82fHPvAsA75RIc+TIfWAe6ZEPoR5pmYWvNzc1WlyA6KaW0a5olH5nXGlZsDUGeA/pbe4r6bumQjcimzwl98Qa4CyicernV5YhOOmRD6Gl3h6pYSZpmYUplZaXVJYhOMX+YeDCCI8+Fs0iPfZmSj8zbfpXZoelMU9AjG743/wBA4YTzcRYlv5tfZJYO2RB6crn0vLFZmmZhSnt7u9UliE7h7eYz6zIAXvKRed+2J5rm4cV6ZCAZq7MRrV9F8N8vgNNN0VE/trQWsSOrsyH01TWzWTfSNAtTwuGw1SWITpEmvbZmgOTDCt0rzZo3zVZnwzf3LlCKwnHn4SwbaGktYkdWZ0NsU19fz8UXX8zYsWOZPn06Z599NqtXr0768WPGjKGpqWmntz/yyCPdh6T0ha7jkPVc/xbaqa2ttboE0SncmFid0alplnxkVlypbSvNGt8ECNZmI9q0jsDSf4LDiXfGf1pWh9g1uW7oQSnF+eefz7nnnsvDDz8MwGeffUZDQwP77LNPjx7roosuSklNbrc7JY+TarLSLEyReZr6CDf6Ab2aZslHZm3ugFAcKjxQ6tG7abYyG/63/gTxGAVjz8RVNcyyOsSuyXVDD/Pnz8ftdu/Q8I4ePZpYLMY555zT/bbrr7+ep556qvvPd999N5MmTeLoo4/m66+/BuCOO+7gnnvuAeDrr7/m9NNPZ8qUKUybNq37aG0zdJ3TLCvNwhQZDaSHHSZnaDKjGSQfmfatzx77mcG6bMRaNtGx+O9gGHiPvtaSGsTuyXVjZ1//9vW0PO5e//29pO/78ssve3WQSUlJCQsWLGDWrFnccMMNO23LuOyyy7j22ms56aSTCAaDxONx048tI+eErXk8HqtLEECsPYgKR3EUenB69ZicAZKPTPvGl/jhY4em2aps+N+5F2Jh8secgrt2P0tqELsn1w17O+OMM7r//dFHH+3wvvb2djZv3sxJJ50EJA6yKSw0PxtTl5vcv0tWmoUpra2tlJWVWV1Gztu2yuy1uJIdST4y65t2/Q816WJFNmK+RvwLHwOg6OifZvS5hXly3djZ7laE02XkyJHMmTNnp7e7XK4dVoeDweAO79++sU11kxuLxbQcOycrzcKUqiqZbaqDbYea6HWimeQjc4IxxaYOcBgwxKt/02xFNvzv/hkiAfJGfQ/3oAMz/vzCHLlu6GHq1KmEQiEeffTR7rd9/vnnKKVYsWIFoVCI1tZW3nvvvR0+7/nnn+/+9+GHH77D+4qLixkwYAAvv/wyAKFQiI6ODtM16dgwgzTNwqTW1larSxBAWMNxcyD5yKS1PoUCBhUaeJz6N82Zzka8o4WO+X8FoOgYWWXWmVw39GAYBk888QTz5s1j7NixTJgwgV/96lf069eP0047jUmTJnHRRRdx0EEH7fB5LS0tTJ48mQceeIBf//rXOz3uX/7yFx588EEmT57Mcccdx5YtW0zXpOucZj1beaEdXe9kzTURzY7P7iL5yJxvbHKoSZdMZ8M//6+okA/PvkfiGXb4nj9BWEauG/ro378/jzzyyE5vv/XWW7n11lt3evsnn3wCwC233LLD23/+8593//fee+/N7Nmze1WPrnOaZaVZmCLzNK2n4opwU2LcnFuzplnykTldh5roPp+5SyazEQ+245/3FwCKjrkuY88rekeuGyIZmdMsbE3maVov2tqBisRwFufjzNfrgiL5yAy13aEmup8E2CWT2ehY+Aiqoxn38PF49pmUsecVvSPXDZGMrq9CSNMsTPF69ZrWkIvCDXpuzQDJR6Y0h6E1AoUu6JdvdTXmZCobKhzA/879QGIvs64jq8Q2ct0QycicZmFrTqfT6hJyXrih8/jsav2aZslHZmw/as5hk6YwU9noWPwk8fYtuAaNIW//ozPynKJv5LohktH1l15pmoUpbW1tVpeQ80JdTbNm4+ZA8pEpdtvPDJnJhoqG8b31JwCKj71O2x+4Ykdy3RDJ6Do9Q5pmYUp1dbXVJeS87skZ1fo1zZKPzPjWZpMzIDPZCHw0i3jLJly1I8kbfULan0+khlw3RDIyp1nY2tatW60uIafFIzEizYkTLXQ7DRAkH5kQiyvW+u1zEmCXdGdDxaLdq8xFx/wUQ9O9kGJnct3QR1VVFVOnTu3+56677rK0nt2tNP/5z3/e4aCUs88+e48zv8eMGUNTU1Of69KzlRfa0XVmYq7oOgnQXeHFcOrXFEg+0m9jB0TiUJ0PRW77NM3pzkbw4+eJNX6Ds2ov8g8+La3PJVJLrhv6KCgo2OnEP1395S9/4eyzz6awsBCAf/7znxl7bv1++gotycto1go36nsTIEg+MuEbXxyw135mSG82VDyOb+4fACg6+loMp6wD2YlcN/TW1tbGuHHjWLVqFQCXXHIJjz32GACDBw/mhhtuYMKECZx22mk0NjYCsHz5co455hgmT57M+eefT0tLCwAnn3wyt9xyC0cffTSHH344ixYtAhIryjfddBMzZsxg8uTJ3Ud5f/DBB5x88slceOGFjB8/nssuuwylFA888AB1dXWccsopnHLKKcCOq8g//OEPmT59OhMmTNjhWPBUkSuMMKW+vp6hQ4daXUbO2jZuTr/9zCD5yAS7nQTYJZ3ZCC5/mWjdChxlAyk47Oy0PIdIH7lu7OyKhemZT/yXibuf7R8IBJg6dWr3n6+99lpmzpzJnXfeydVXX83ll19OS0sLF154IQB+v59DDjmE2267jd/85jfd/1x55ZXceeedTJo0idtuu40777yT22+/HYBoNMrcuXN58803+c1vfsPzzz/PE088QUlJCW+99RahUIjjjz+e6dOnE4vF+PTTT1m4cCH9+/fnuOOOY/HixVx++eXcf//9zJkzh8rKyp2+jnvuuYfy8nICgQAzZszglFNOoaKiImV/j9I0C1OKivRc4cwVEY3HzYHkIxPWdDbNexfb6wXCdGVDKYXvjd8lnmPGTzBcnrQ8j0gfuW7oI9n2jOnTpzN79myuv/76Hd7vcDg4/fTTgcSe4gsuuIC2tjZaW1uZNClxsNC5557LRRdd1P05J510EpBYGV63bh0A77zzDl988QVz5swBEqvba9aswel0MnbsWAYOHAjAgQceyLp16zjiiCN2+3U88MADvPzyywBs3LiRNWvWSNMsRK4JNeq90izSqy2saAiCxwED9bsP1BKhz14lunE5jpJaCo843+pyhEiJPa0IZ1o8HmflypUUFBTQ2tra3cR+l5kxj3l5eUBiPnc0GgUSv/zecccdzJgxY4ePnTdvXvfHf/dzknn//feZN28er7/+OoWFhZx88smEQqE91tUTGV2yMAzDaRjGx4ZhvNT55+GGYSw2DGO1YRhPG4YhSwWa8vl8VpeQs6L+EPGOMIbHhatEz2PgJB/p9fV285mdNptBnI5sKKVof/23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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from math import log\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "plt.style.use('bmh')\n", + "\n", + "# Set up runtime comparisons\n", + "n = np.linspace(1,10,1000)\n", + "labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']\n", + "big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]\n", + "\n", + "# Plot setup\n", + "plt.figure(figsize=(12,10))\n", + "plt.ylim(0,50)\n", + "\n", + "for i in range(len(big_o)):\n", + " plt.plot(n,big_o[i],label = labels[i])\n", + "\n", + "\n", + "plt.legend(loc=0)\n", + "plt.ylabel('Relative Runtime')\n", + "plt.xlabel('n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how much of a difference a Big-O efficiency can make for the same n value against the projected runtime! Clearly we want to choose algorithms that stay away from any exponential, quadratic, or cubic behavior!\n", + "\n", + "In the next lecture we will learn how to properly denote Big-O and look at examples of various problems and calculate the Big-O of them!" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb similarity index 61% rename from Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb rename to 01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb index 0ba05663..cf92fa84 100644 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb +++ b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb @@ -23,27 +23,25 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "def method1():\n", " l = []\n", - " for n in xrange(10000):\n", + " for n in range(10000):\n", " l = l + [n]\n", "\n", "def method2():\n", " l = []\n", - " for n in xrange(10000):\n", + " for n in range(10000):\n", " l.append(n)\n", "\n", "def method3():\n", - " l = [n for n in xrange(10000)]\n", + " l = [n for n in range(10000)]\n", "\n", "def method4():\n", - " l = range(10000) # Python 3: list(range(10000))" + " l = list(range(10000))" ] }, { @@ -55,19 +53,17 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10 loops, best of 3: 162 ms per loop\n", - "1000 loops, best of 3: 820 µs per loop\n", - "1000 loops, best of 3: 307 µs per loop\n", - "10000 loops, best of 3: 77.7 µs per loop\n" + "184 ms ± 9.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", + "829 µs ± 125 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", + "574 µs ± 134 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", + "194 µs ± 11.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], @@ -93,61 +89,86 @@ "source": [ "### Table of Big-O for common list operations\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "** Please note, in order to see this table, you may need to download this .ipynb file and view it locally, sometimes GitHub or nbveiwer have trouble showing the HTML for it... **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
OperationBig-O Efficiency
index []O(1)
index assignmentO(1)
appendO(1)
pop()O(1)
pop(i)O(n)
insert(i,item)O(n)
del operatorO(n)
iterationO(n)
contains (in)O(n)
get slice [x:y]O(k)
del sliceO(n)
set sliceO(n+k)
reverseO(n)
concatenateO(k)
sortO(n log n)
multiplyO(nk)
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", "
Operation Big-O Efficiency
index []O(1)
index assignmentO(1)
appendO(1)
pop()O(1)
pop(i)O(n)
insert(i,item)O(n)
del operatorO(n)
iterationO(n)
contains (in)O(n)
get slice [x:y]O(k)
del sliceO(n)
set sliceO(n+k)
reverseO(n)
concatenateO(k)
sortO(n log n)
multiplyO(nk)
" ] }, @@ -162,10 +183,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "d = {'k1':1,'k2':2}" @@ -173,10 +192,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -184,7 +201,7 @@ "1" ] }, - "execution_count": 12, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -239,24 +256,25 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb similarity index 81% rename from Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb rename to 01-Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb index 0238db22..ba511d30 100644 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb +++ b/01-Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb @@ -24,10 +24,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "# First function (Note the use of xrange since this is in Python 2)\n", @@ -36,7 +34,7 @@ " Take an input of n and return the sum of the numbers from 0 to n\n", " '''\n", " final_sum = 0\n", - " for x in xrange(n+1): \n", + " for x in range(n+1): \n", " final_sum += x\n", " \n", " return final_sum" @@ -44,10 +42,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -55,7 +51,7 @@ "55" ] }, - "execution_count": 5, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -66,10 +62,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "def sum2(n):\n", @@ -81,18 +75,16 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "55" + "55.0" ] }, - "execution_count": 9, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -115,17 +107,14 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 5.15 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "100000 loops, best of 3: 4.86 µs per loop\n" + "5.17 µs ± 94.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], @@ -135,17 +124,14 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 16.54 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "10000000 loops, best of 3: 173 ns per loop\n" + "161 ns ± 9.09 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)\n" ] } ], @@ -172,23 +158,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb b/01-Algorithm Analysis and Big O/01-Introduction to Algorithm Analysis and Big O .ipynb similarity index 81% rename from Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb rename to 01-Algorithm Analysis and Big O/01-Introduction to Algorithm Analysis and Big O .ipynb index 0238db22..ba511d30 100644 --- a/Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb +++ b/01-Algorithm Analysis and Big O/01-Introduction to Algorithm Analysis and Big O .ipynb @@ -24,10 +24,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "# First function (Note the use of xrange since this is in Python 2)\n", @@ -36,7 +34,7 @@ " Take an input of n and return the sum of the numbers from 0 to n\n", " '''\n", " final_sum = 0\n", - " for x in xrange(n+1): \n", + " for x in range(n+1): \n", " final_sum += x\n", " \n", " return final_sum" @@ -44,10 +42,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -55,7 +51,7 @@ "55" ] }, - "execution_count": 5, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -66,10 +62,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "def sum2(n):\n", @@ -81,18 +75,16 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "55" + "55.0" ] }, - "execution_count": 9, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -115,17 +107,14 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 5.15 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "100000 loops, best of 3: 4.86 µs per loop\n" + "5.17 µs ± 94.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], @@ -135,17 +124,14 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 16.54 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "10000000 loops, best of 3: 173 ns per loop\n" + "161 ns ± 9.09 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)\n" ] } ], @@ -172,23 +158,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/01-Algorithm Analysis and Big O/02-Big O Notation.ipynb b/01-Algorithm Analysis and Big O/02-Big O Notation.ipynb new file mode 100644 index 00000000..713ba5a6 --- /dev/null +++ b/01-Algorithm Analysis and Big O/02-Big O Notation.ipynb @@ -0,0 +1,202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Big O Notation\n", + "In this lecture we will go over how the syntax of Big-O Notation works and how we can describe algorithms using Big-O Notation!\n", + "\n", + "We previously discussed the functions below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# First function (Note the use of xrange since this is in Python 2)\n", + "def sum1(n):\n", + " '''\n", + " Take an input of n and return the sum of the numbers from 0 to n\n", + " '''\n", + " final_sum = 0\n", + " for x in range(n+1): \n", + " final_sum += x\n", + " \n", + " return final_sum" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def sum2(n):\n", + " \"\"\"\n", + " Take an input of n and return the sum of the numbers from 0 to n\n", + " \"\"\"\n", + " return (n*(n+1))/2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we want to develop a notation to objectively compare the efficiency of these two algorithms. A good place to start would be to compare the number of assignments each algorithm makes.\n", + "\n", + "The original **sum1** function will create an assignment **n+1** times, we can see this from the range based function. This means it will assign the final_sum variable n+1 times. We can then say that for a problem of n size (in this case just a number n) this function will take 1+n steps.\n", + "\n", + "This **n** notation allows us to compare solutions and algorithms relative to the size of the problem, since sum1(10) and sum1(100000) would take very different times to run but be using the same algorithm. We can also note that as n grows very large, the **+1** won't have much effect. So let's begin discussing how to build a syntax for this notation.\n", + "________\n", + "\n", + "Now we will discuss how we can formalize this notation and idea.\n", + "\n", + "Big-O notation describes *how quickly runtime will grow relative to the input as the input get arbitrarily large*.\n", + "\n", + "Let's examine some of these points more closely:\n", + "\n", + "* Remember, we want to compare how quickly runtime will grows, not compare exact runtimes, since those can vary depending on hardware.\n", + "\n", + "* Since we want to compare for a variety of input sizes, we are only concerned with runtime grow *relative* to the input. This is why we use **n** for notation.\n", + "\n", + "* As n gets arbitrarily large we only worry about terms that will grow the fastest as n gets large, to this point, Big-O analysis is also known as **asymptotic analysis**\n", + "\n", + "\n", + "As for syntax sum1() can be said to be **O(n)** since its runtime grows linearly with the input size. In the next lecture we will go over more specific examples of various O() types and examples. To conclude this lecture we will show the potential for vast difference in runtimes of Big-O functions.\n", + "\n", + "## Runtimes of Common Big-O Functions\n", + "\n", + "Here is a table of common Big-O functions:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + "
Big-OName
1Constant
log(n)Logarithmic
nLinear
nlog(n)Log Linear
n^2Quadratic
n^3Cubic
2^nExponential
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's plot the runtime versus the Big-O to compare the runtimes. We'll use a simple [matplotlib](http://matplotlib.org/) for the plot below. (Don't be concerned with how to use matplotlib, that is irrelevant for this part)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 0, 'n')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAAJQCAYAAAB1t1kcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAADhoUlEQVR4nOzdd5xU9b3/8deZtmW2F3bpoKIoKIoKUgVRYy9YoibqNfaSXG/M9Zd4Y8u9saQaW6LRWGMwsYFdsSACooBRbDSVvsvusm1mp8/398fsLiAMnN2dmfM9M5/n4+FD2TLzWfbt2c9+53s+X0MphRBCCCGEECI5h9UFCCGEEEIIoTtpmoUQQgghhNgDaZqFEEIIIYTYA2mahRBCCCGE2ANpmoUQQgghhNgDaZqFEEIIIYTYA1emnsgwjG+BdiAGRJVShxmGUQE8DQwDvgXOVko1Z6omIYQQQgghzMj0SvN0pdTBSqnDOv/8c+AtpdQI4K3OPwshhBBCCKEVq7dnnAo81vnfjwGnWVeKEEIIIYQQu5bJplkBbxiGsdQwjMs631ajlNrc+d91QE0G6xFCCCGEEMKUjO1pBiYrpTYahtEPeNMwjK+2f6dSShmGsdOZ3q+99pravHkzhmGglKK8vJzq6moikQhOpxOAWCyG2+0mGo0C4HK5evX+SCSCYRg4nU6i0ShOpxOlFPF4vPv9DocDh8NBNBrF5XIRj8d7/H7DMIjFYrhcLmKxGEqp7vfL1yRfU7q+JtrCEItDSR6uPHdWfE3Z+H3K1NfUEVU0R13kGXEq3LGs+Jps9X0ijtqyAgW4avcnqgz7f03Z+H2SrynnvqZYLNY4Y8aManYhY02zUmpj57+3GIbxPDAOqDcMo79SarNhGP2BLd/9vNLSUsaPH5+pMkUS69evZ/DgwVaXIXpJReN8c9dcUIph/3U0DpczpY8v+bCfl9fHeHF9nGMGOJg2LLV52J5kY9faXrwV/1t/Iv+Q0yk/5hyry7GEZEMkY2U2li1btjbZ+zKyPcMwDK9hGMVd/w0cC3wGzAEu7PywC4HZmahH9JxhGFaXIPog0tIBSuEqLUh5wwySDzva4E+8sDewML3fO8nGzuIhPx2LErfzeI+80uJqrCPZEMnomo1MrTTXAM93/iW4gKeUUq8ZhvER8E/DMC4G1gJnZ6ge0UMVFRVWlyD6ILLVD4C70puWx5d82M/GjkTTPMib3h9Oko2dBT6ahepowT3scDzDDtvzJ2QpyYZIRtdsZGSlWSn1tVJqTOc/o5RSv+58e5NSaoZSaoRS6mil1NZM1CN6rqGhweoSRB+EO5tmT3l6mmbJh72EYoqGIDgMqClI73NJNnak4nH88/4CgHda7q4yg2RDJKdrNjJ5I6CwsZKSEqtLEH2Q7pVmyYe9bOpQKGBAAbgd6V1plmzsKPTlm8Qa1uAsH0z+gSdZXY6lJBsJSil8Ph9K7TQLIWcVFhbS1taW1ucwDIOioqIebQWRplmYEovFrC5B9EF301yRnqZZ8mEv6/2Z2ZoBko3v8r/7ZwAKp16K4cztH8GSjQSfz0deXh4ej8fqUrQRiURwu91pfY5wOIzP56O4uNj051h9uImwCb/fb3UJopeUUoSbOrdnpKlplnzYy4bOb9egNN8ECJKN7UU2fkZ41XsYeUUUHnGB1eVYTrKRoJSShvk74vF42p/D4/H0eHVfmmZhSm1trdUliF6K+cOocBRHvgtHYXouzJIPe9mQoZsAQbKxPf+8xCpzwfjzcBTI1gTJhkgm3avMvSVNszClrq7O6hJEL3VvzSj3pm2Mj+TDPuJKsTGD2zMkGwmx9i0Elj4LhoF36uVWl6MFyYY+6uvrufjiixk7dizTp0/n7LPPZvXq1Sl57Jdffpmvvvpqzx+4nUgk0v3f69at45lnnklJLX0lTbMwRdff+sSepfsmQJB82ElDEEJxKPNAsTv9TbNkI6Hj/b9BLEzeqONxVQ23uhwtSDb0oJTi/PPPZ/LkySxbtox33nmHm266KWUTLF555RVWrFjRo8/ZfoFHp6Y5t+9CEKaVlpZaXYLopfBWH5C+/cwg+bCTrkNNMrGfGSQbACoSpGPB3wAZM7c9yYYe5s+fj9vt5qKLLup+2+jRo1FKcdNNNzF37lwMw+C6665j5syZvP/++9x5551UVFTw1VdfMWbMGB544AEMw+DWW2/l1VdfxeVyMX36dE466SReffVVFixYwO9//3see+wx3nvvPR5//HHC4TDDhw/nL3/5C4WFhVx99dUUFxfz8ccfs2XLFm655RZOPfVUbr31VlauXMnUqVM555xzuOqqqyz7u5KmWZjS2NiI15u+pkukT6Spa3JGUdqeQ/JhH5nczwySDYDA0meI+xpxDToIz94TrS5HG5KNnR370Mdpedw3Ljkk6fu+/PJLxowZs9PbX3zxRZYvX878+fNpampixowZTJyYyO+nn37KwoUL6d+/P8cddxyLFy9m33335eWXX2bx4sUYhkFrayulpaUcf/zxHHvssZx66qlA4pelCy9MHAb961//mieffJLLLrsMSGzZefXVV/nss8+46KKLOPXUU7n55pu59957mTVrVqr/WnpMtmcIU2RFwL4ysT1D8mEfGzK4nxkkG0qpbYeZHHmltscDWyHXs6G7Dz74gDPOOAOn00m/fv2YNGkSH3+caOrHjh3LwIEDcTgcHHjggaxbt46SkhLy8vL48Y9/zIsvvkhBwa5PTvryyy854YQTmDRpEv/617922O984okn4nA4OOCAA7Q84ERWmoUp4XDY6hJEL8QjMaJtiaPf3KXpO/pN8mEfXU3z4Aw1zbmejfDKd4lu/gJHSS0Fh5xudTlayfVs7MruVoTTZeTIkcyZM6dHn5OXl9f9306nk2g0isvlYu7cubz33nvMnj2bhx56iNmzZ+/0uVdffTVPPvkko0eP5qmnnmLBggXd7+savaeU0vKwF1lpFqYEAgGrSxC9EGnuXGUuK8Rwpu9/d8mHPfgiiuYweBxQnZ+Z58z1bPjfuQ8A75RLMFwyi3d7uZ4NXUydOpVQKMSjjz7a/bbPP/+c0tJSnn/+eWKxGI2NjSxcuJCxY8cmfRyfz0dbWxvHHHMMt912G5999hkARUVF+Hy+HT6upqaGSCTCv/71r10+1vZzmr/7+VaSlWZhiszTtKd0nwTYRfJhD137mQcWGjgytE0gl7MR2fwFoa/exvAUUjjxoj1/Qo7J5WzoxDAMnnjiCW644Qbuvvtu8vLyGDJkCLfddht+v58pU6ZgGAa33HILNTU1rFq1apeP4/P5+OEPf0gwGEQpxf/93/8BcPrpp3Pttdfy4IMP8uijj3LDDTdwzDHHUFVVxaGHHrrLhnj7ySqjRo3C6XQyZcoUzj33XEtvBDR0XP7e3qJFi9TIkSOtLiPnrV27lqFDh1pdhuih5gWraV64htJxw6k8ct+0PY/kwx7mborxzLdxptY4OG9vZ0aeM5ez0fLU1QQ+/AeFUy6l9Iw7rS5HO7mcje21tbVRUiKH3WwvFArtsAUkXXb1d79s2bKlM2bMOGxXHy/bM4QpcsSnPYWb03t8dhfJhz1suwkwc8+Zq9mItdYRWPoMGA68R15hdTlaytVsiD3T9YZZaZqFKcXFxVaXIHph27i59HZJkg97WJ/hyRmQu9nwz/8rxCLkH3SiHGaSRK5mQ+yZ05mZV8J6SppmYUpTU5PVJYgeUkoRae4AwF1RmNbnknzoLxJXbA6AQWJPc6bkYjbiIR8dCx8BwDvtaour0VcuZkOYE41GrS5hl6RpFqaUl5dbXYLooVh7EBWJ4Sz04CxI78ugkg/91QUgrqBfPuQ5M9c052I2AoufQnW04B4+Ds/wcVaXo61czIYwx+XSc06FNM3CFBkNZD/hDE3OAMmHHXRtzRiYwa0ZkHvZUPHYtsNMZJV5t3ItG8K87UfO6USaZmFKMBi0ugTRQ5kaNweSDzvI9KEmXXItG8HlLxNr+hZn1XDyDzzB6nK0lmvZEOZJ0yxsTeZp2k+mbgIEyYcdZPr47C65lg3/2/cCnUdmO/S8mUkXuZYNnQ0ePDijz/e9730PgHXr1vHMM890v/2pp57i+uuv32FOc098/PHH/PznP09JjbsiTbMwpa6uzuoSRA91bc/wVKa/aZZ86E0p1X2wyaAM3gQIuZWN8DeLiaxdglFYTsG4c60uR3u5lA2R0HWD3+uvvw7s3DR3iUQivXr8Qw45hDvuuKP3Be6BNM3ClPz8DJ25K1Imk9szJB96aw5DRxSKXFCW4dG4uZQNX9eR2ZN+hCMvg8OwbSqXsmFHy5cv55hjjmHy5Mmcf/75tLS0ALBs2TImT57M1KlTuemmm5g4cSKQaIBPOOEEpk2bxrRp01i8eDEA77//PieccALnnXceEyZMALatbN96660sWrSIqVOncv/99wOJX6bOO+88DjvsMG6++ebuegYPHsxNN93EhAkTOP3001m6dCknn3wyhxxyCK+++mr3c51zzjlA4oTCq6++mkmTJjF58mTmzJnT578TPW9PFNopKCiwugTRA/FwlJgvhOF04CpJ//dO8qG37bdmZPrQgFzJRrTha0LLXwanh8Ipl1hdji3kSjZ64rXaiWl53OPqFvb4c6688kruvPNOJk2axG233cadd97J7bffzjXXXMNdd93FuHHjuPXWW7s/vqqqiueee478/HzWrFnDpZdeyttvvw3Ap59+yoIFC3Y6AfLmm2/m3nvvZdasWUBie8by5ct5++23KSgoYNy4cVx66aUMGjSo+0jvX/3qV5x//vn8+te/5rnnnmPFihVcddVVHH/88Ts89u9+9ztKSkpYsGABQHfT3xey0ixMaW5utroE0QNdq8yu8kIMR/qbJMmH3qw41KRLrmTDP+/PoBQFh52Fs6TG6nJsIVeyYUdtbW20trYyadIkAM4991wWLVpEa2srPp+PceMSoxTPPPPM7s+JRqNce+21TJo0iYsuuogVK1Z0v2/s2LGmj0yfOnUqhYWF5Ofns99++7FhwwYgcYLk0UcfDcD+++/PpEmTcLvdHHDAAaxbt26nx5k3bx6XXLLtF9iysrKe/SXsgqw0C1MqKyutLkH0QLgpM8dnd5F86K17pTnD+5khN7IR92+lY/FTAHinXWVxNfaRC9noqd6sCOvi/vvvp7q6mvnz5xOPx+nfv3/3+woLzR+wlZeX1z2n2el0du+Ddrvd3a+UORyO7mPYHQ4HsVgsVV/GbslKszClvb3d6hJED2RyPzNIPnTXdRNgpsfNQW5kw7/gbxAJkLf/0bj77291ObaRC9mwq5KSEsrKyli0aBEATz/9NBMnTqS0tJSioiKWLFkCwHPPPdf9OW1tbdTU1OBwOHj66adNNbJFRUX4fL6d3p6KJnjatGk89NBD3X+W7RkiY8LhsNUliB4INyUuQpmYnAGSD50FooqGILgMqLVgC2m2Z0NFgnTMT/xg9k6/xuJq7CXbs2EnHR0djBo1qvuf++67j/vvv5+bbrqJyZMn89lnn3H99dcDcPfdd3PttdcydepU/H4/JSUlAFx88cXMmjWLKVOmsGrVKrzePf/8GTVqFE6nkylTpnTfCAiJiT99dd1119Ha2srEiROZMmUK8+fP7/NjGqkoLJ0WLVqkRo4caXUZOS8UCpGXl2d1GcKk9Q+/T2Srn4EXTCCvpiTtzyf50NfK1jh/+DzG0CKDXxyU+R152Z6Njg+eoHXWf+IaeCBVP3s34zda2lm2Z8Ostra27sbTDnw+H0VFRQDcdddd1NXVpXzMWzwex+FI/7rurv7uly1btnTGjBmH7erjZaVZmCLzNO1DxeJEWjqAzG3PkHzoa13nfuYhFmzNgOzOhorH8XeOmSuafo00zD2UzdnIZm+88QZTp05l4sSJLFq0iJ/97Gcpf47ezmlON7kRUJgio4HsI9LcAXGFq7QAhzszJ5JJPvS13uKmOZuzEfrqLaL1K3GUDSD/kNOsLsd2sjkb2WzmzJnMnDkzrc+RiVXm3tCzKqGdrrtUhf627WcuythzSj70tc7X2TRnLg47yOZsdK0ye6dejuHs3bG/uSybsyH6RtdXbaRpFqa0trZaXYIwKdI5bs6doZsAQfKhq1BMURcAhwEDLBg3B9mbjciGTwmveg8jr4jCCRdaXY4tZWs2RN9laoRcT0nTLEypqqqyugRhkhUrzZIPPW3sUChgQAG4M3DIza5kazZ879wLQOGEC3AU2OcmLp1kazZE33XNadaNNM3CFFkRsA9ZaRZdurZmWDGfuUs2ZiO6dT3Bj58HhwvvkVdYXY5tZWM2RGrISrOwNV3vZBU7UnHVfbBJJleaJR966p6cUWRd05yN2fC/ex/EYxSMPQNn+SCry7GtbMyGXQ0ePHintz3yyCPMmjXLgmpSM6c5HfRc/xbaqa2ttboEYUK0NYCKxXEW5eHIy9z/3pIPPXVNzrBypTnbshH3byXwwZMAeI/6scXV2Fu2ZSPbXHTRRWl9fKUUSqldTspwu/W8sVZWmoUpMk/THqzYzwySDx1F4oqNHWAAgyxsmrMtG/73H0aFOxJHZg84wOpybC3bspFt7rjjDu655x4ATj75ZG655RaOPvpoDj/88O7jtWOxGDfddBMzZsxg8uTJPProo0DiAJTTTjuNadOmMWnSJF555RUA1q1bx7hx47jyyiuZOHEiGzdu3OVz6/oqhKw0C1PMHIcprBfpbJozuZ8ZJB862pQY101tAeQ7rWuasykbKhyg470HAfAe9ROLq7G/bMpGqvzuhtfS8rg/u+24Pj9GNBpl7ty5vPnmm/zmN7/h+eef54knnqCkpIS33nqLUCjE8ccfz/Tp0xk4cCCPP/44JSUlNDU1ceyxx3L88ccDsGbNGu677z4OP/zwpM+l65xmaZqFKU5nZg7JEH0Tbsr8fmaQfOhonQZbMyC7stHx4T+I+5twDxmLZ59JVpdje9mUjVxw0kknATBmzBjWrVsHwDvvvMMXX3zBnDlzgMSx1GvWrGHAgAH83//9HwsXLsThcLB582a2bNkCJPZP765hBn3nNEvTLExpa2ujvLzc6jLEHnSvNFdltmmWfOhnvc/akwC7ZEs2VDyGv3PMnPeoH2v7Q91OsiUbqZSKFeF0ycvLAxK/7ESjUSCxL/mOO+5gxowZO3zsU089RWNjI++88w5ut5sxY8YQCoUAKCws3ONzxWIxLcfO6bn+LbRTXV1tdQliD5RS21aaKzL7sqfkQz86TM6A7MlG8NMXiTV9i7NqOPkHnWR1OVkhW7KRy4466igeeeSR7j3Iq1evxu/309bWRnV1NW63m/nz57N+/foePa6ODTPISrMwaevWraZ+OxTWibUHUZEYjkIPzsLMHk8r+dBLLK7YoMn2jGzIhlIK/1t3A+Cdfg2GQ7YVpEI2ZCNbdHR0MGrUqO4/X3XVVaY+74ILLmD9+vVMmzYNpRRVVVU8+eSTnHXWWZx77rlMmjSJgw8+mBEjRvSonlgspuX2HWmahSm6zkwU21i1ygySD93UBSCqoCoPCl3WNs3ZkI3w6veJrP83jqIqCg8/x+pyskY2ZCNbNDU17fb9L774Yvd/V1ZW8sknnwCJG/ZuvPFGbrzxxp0+54033tjlYy1cuLAPlVpLtmcIU+RlNP1tm5yR2f3MIPnQjS5bMyA7suF/608AFE69DMNTYHE12SMbsiHSQ9ftGdI0C1Pq6+utLkHsQfdKc1XmV5olH3rpbpot3poB9s9GZONnhL56G8NTiHfSxVaXk1Xsng2RPrrOaZamWZhSVJT51UvRM90rzRWZ/15JPvTSNTnD6v3MYP9s+N5OHO5QcMT5OLwy6SGV7J4NkT467mcGaZqFyAqJyRmdpwFasNIs9BFXSovjs7NBdOt6gh8/Bw4n3mnmbowSQmQvaZqFKT6fz+oSxG7EOsLEg1EMjwunNy/jzy/50MeWIITiUO6BEo/1TbOds+F/936Ix8g/ZCauisFWl5N17JwNkV6xWMzqEnZJmmZhSk1NjdUliN2IdJ8E6LXk0AXJhz502poB9s1G3L+VwAdPAFB01I8triY72TUbIv3cbrfVJeySNM3ClIaGBqtLELuxbWuGNXsEJR/60GlyBtg3G/4Ff0OFO8gbeRTugaOtLicr2TUb2Wjw4NS+krJu3TomTpy409tvu+023n333T1+fteJg7rRc6aH0I4cGau3rpVmtwUzmkHyoROdJmeAPbOhwgE63nsQAO9RP7G4muxlx2yIvrnhhhvS+vjRaDSt4+pkpVmYUlFRYXUJYjesXmmWfOghrhTrNNueYcdsdHw0i7ivEffgQ/CMmGJ1OVnLjtnIJcuXL+eYY45h8uTJnH/++bS0tACwbNkyJk+ezNSpU7npppt2uaKczNVXX83s2bMBGDNmDLfffjvTpk1j0qRJrFy5EgC/389//dd/cfTRR3PkkUfyyiuvAInV6xNOOIFp06Yxbdo0Fi9eDMD777/PCSecwHnnnceECRNS+DewM1lpFqY0NDQwdOhQq8sQSWwbN2fNSrPkQw8NQQjEoNQN5Xl6NM12y4aKx/C/cy8A3hk/ltXQNLJbNjLhnN8cmpbHnXX90h5/zpVXXsmdd97JpEmTuO2227jzzju5/fbbueaaa7jrrrsYN24ct956a5/qqqys5N133+Xhhx/m3nvv5e677+YPf/gDEydO5L777qO1tbW7ea6qquK5554jPz+fNWvWcOmll/L2228D8Omnn7JgwYK050lWmoUpJSUlVpcgkogFI8T8YQyXA1epNaeVST70sLZzlXmoJvuZwX7ZCH76IrHGb3BWDiP/oJOtLier2S0buaStrY3W1lYmTZoEwLnnnsuiRYtobW3F5/Mxbtw4AM4888w+Pc9JJ50EJFad169fD8A777zDfffdx9SpUzn55JMJBoNs2LCBaDTKtddey6RJk7joootYsWJF9+OMHTs2I7+AyUqzMEXX8S9ix+OzrVoVk3zoQcem2U7ZUErhfytxmIl3+jUYDj0PWMgWdspGpvRmRdjO8vISI1KdTmf3zX9KKR5++GH233//HT72jjvuoLq6mvnz5xOPx+nfv3/3+woLCzNSr6w0C1P8fr/VJYgkuo/PtmhrBkg+dNHVNA/TqGm2UzbCK+cRWf8xDm8lhePOsbqcrGenbOSakpISysrKWLRoEQBPP/00EydOpLS0lKKiIpYsWQLAc889l/LnPuqoo3jooYdQKnE9+/TTT4HE6ndNTQ0Oh4Onn37akl+6ZKVZmFJbW2t1CSKJ7pVmi24CBMmHDuJKdU/O0Gml2U7Z8L31JwAKj7wCw5OZlatcZqdsZLuOjg5GjRrV/eerrrqK+++/n5/+9KcEAgGGDRvGvfcm9vrffffdXHvttTgcDiZOnJh0m83q1at3eMxf//rXpmr52c9+xi9+8QsmT55MPB5n6NChzJo1i4svvpgLL7yQp59+mhkzZuD1Zn6hyOjq5HW1aNEiNXLkSKvLyHlr166VGzY0tfmZpQS+aaTm1IPx7mvNYQGSD+tt9Cv+95MolXnw60P1ORjALtkIr1tG0x+Oxsgrot/Ny3EUllpdUtazSzbSra2tzVb7u30+H0VFiUWau+66i7q6Ou64446UPkcoFOreupFOu/q7X7Zs2dIZM2YctquPl5VmYYqup/MIPVaaJR/W03E/M9gnG765dwFQOOlH0jBniF2yIXb0xhtvcNdddxGNRhk8eDD33Xdfyp9D16k10jQLU0pL5YeIjuLhKNG2IDgM3GXWTM4AyYcO1mq4NQPskY1I3QpCn74Erjy8R15hdTk5ww7ZEDubOXMmM2fOTOtzOJ163oQrNwIKUxobG60uQexC96EmFV4Mh3X/O0s+rPetpivNdsiG/627ASgcdy7OUtlnmyl2yIawhq7HaEvTLEyRFQE9RRo7j8+2cGsGSD6sFo0rNnatNGtyEmAX3bMRa95AYOm/wHDgPerHVpeTU3TPhrCOrDQLWwuHw1aXIHYh3Gjt8dnddUg+LLWxA6IKavKhwKVX06x7Nnzv3AvxKPmHnI6rarjV5eQU3bMhrKPrkAppmoUpgUDA6hLELoQb2wHrm2bJh7XW+uKAflszQO9sxHyNdCx6AoCio6+1tpgcpHM2hLXi8bjVJeySNM3CFJmnqafug00sbpolH9bSdXIG6J2NjvcegEiAvAOOxT1g1J4/QaSUztnINRs3buQHP/gBhx12GIcccgjXX389oVCoz4/7/vvvc845PTsoaN26dcyePbv7zx9//DE///nP+1xLKkjTLEypq6uzugTxHbFghFh7EMPlwFVq7UEMkg9r6dw065qNeLAN//yHAFlltoqu2cg1SikuvPBCTjjhBJYsWcKSJUsIBALcfPPNaXvO3d3ot27dOp555pnuPx9yyCEpnwPdW9I0C1M8Ho/VJYjv6J7PXFmE4bC2WZJ8WCccU2zqAAMYrNlNgKBvNjoWPooKtOLZawKevY6wupycpGs2cs17771HXl4eP/jBD4DETXi//vWvefrpp/nrX//K9ddf3/2x55xzDu+//z4A1113HUcddRQTJkzg9ttv7/6YuXPnMn78eKZNm8ZLL73U/fY77riDK664guOOO44rrriCdevWccIJJzBt2jSmTZvG4sWLAbj11ltZvHgxU6dO5f77799htdrn83H11VczadIkJk+ezJw5c9L+97M9mdMsTCkuLra6BPEd3TcBVlq7NQMkH1ba0KGIAwMLIc+pX9OsYzZUJIj/3T8D4JVVZsvomA2rbb62Ii2P2/+urUnf99VX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B0TiUJ0PRW77NM3pzkbw4+eJNX6Ds2ov8g8+La3PJVJLrhv6KCgo2OnEP1395S9/4eyzz6awsBCAf/7znxl7bv1++gotycto1go36nsTIEg+MuEbXxyw135mSG82VDyOb+4fACg6+loMp6wD2YlcN/TW1tbGuHHjWLVqFQCXXHIJjz32GACDBw/mhhtuYMKECZx22mk0NjYCsHz5co455hgmT57M+eefT0tLCwAnn3wyt9xyC0cffTSHH344ixYtAhIryjfddBMzZsxg8uTJ3Ud5f/DBB5x88slceOGFjB8/nssuuwylFA888AB1dXWccsopnHLKKcCOq8g//OEPmT59OhMmTNjhWPBUkSuMMKW+vp6hQ4daXUbO2jZuTr/9zCD5yAS7nQTYJZ3ZCC5/mWjdChxlAyk47Oy0PIdIH7lu7OyKhemZT/yXibuf7R8IBJg6dWr3n6+99lpmzpzJnXfeydVXX83ll19OS0sLF154IQB+v59DDjmE2267jd/85jfd/1x55ZXceeedTJo0idtuu40777yT22+/HYBoNMrcuXN58803+c1vfsPzzz/PE088QUlJCW+99RahUIjjjz+e6dOnE4vF+PTTT1m4cCH9+/fnuOOOY/HixVx++eXcf//9zJkzh8rKyp2+jnvuuYfy8nICgQAzZszglFNOoaKiImV/j9I0C1OKivRc4cwVEY3HzYHkIxPWdDbNexfb6wXCdGVDKYXvjd8lnmPGTzBcnrQ8j0gfuW7oI9n2jOnTpzN79myuv/76Hd7vcDg4/fTTgcSe4gsuuIC2tjZaW1uZNClxsNC5557LRRdd1P05J510EpBYGV63bh0A77zzDl988QVz5swBEqvba9aswel0MnbsWAYOHAjAgQceyLp16zjiiCN2+3U88MADvPzyywBs3LiRNWvWSNMsRK4JNeq90izSqy2saAiCxwED9bsP1BKhz14lunE5jpJaCo843+pyhEiJPa0IZ1o8HmflypUUFBTQ2tra3cR+l5kxj3l5eUBiPnc0GgUSv/zecccdzJgxY4ePnTdvXvfHf/dzknn//feZN28er7/+OoWFhZx88smEQqE91tUTGV2yMAzDaRjGx4ZhvNT55+GGYSw2DGO1YRhPG4YhSwWa8vl8VpeQs6L+EPGOMIbHhatEz2PgJB/p9fV285mdNptBnI5sKKVof/23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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from math import log\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "plt.style.use('bmh')\n", + "\n", + "# Set up runtime comparisons\n", + "n = np.linspace(1,10,1000)\n", + "labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']\n", + "big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]\n", + "\n", + "# Plot setup\n", + "plt.figure(figsize=(12,10))\n", + "plt.ylim(0,50)\n", + "\n", + "for i in range(len(big_o)):\n", + " plt.plot(n,big_o[i],label = labels[i])\n", + "\n", + "\n", + "plt.legend(loc=0)\n", + "plt.ylabel('Relative Runtime')\n", + "plt.xlabel('n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how much of a difference a Big-O efficiency can make for the same n value against the projected runtime! Clearly we want to choose algorithms that stay away from any exponential, quadratic, or cubic behavior!\n", + "\n", + "In the next lecture we will learn how to properly denote Big-O and look at examples of various problems and calculate the Big-O of them!" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Algorithm Analysis and Big O/Big O Examples .ipynb b/01-Algorithm Analysis and Big O/03-Big O Examples .ipynb similarity index 88% rename from Algorithm Analysis and Big O/Big O Examples .ipynb rename to 01-Algorithm Analysis and Big O/03-Big O Examples .ipynb index 8a5ab890..118bd5dc 100644 --- a/Algorithm Analysis and Big O/Big O Examples .ipynb +++ b/01-Algorithm Analysis and Big O/03-Big O Examples .ipynb @@ -15,10 +15,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -33,7 +31,7 @@ " '''\n", " Prints first item in a list of values.\n", " '''\n", - " print values[0]\n", + " print(values[0])\n", " \n", "func_constant([1,2,3])" ] @@ -54,10 +52,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -75,7 +71,7 @@ " Takes in list and prints out all values\n", " '''\n", " for val in lst:\n", - " print val\n", + " print(val)\n", " \n", "func_lin([1,2,3])" ] @@ -96,10 +92,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -131,7 +125,7 @@ " '''\n", " for item_1 in lst:\n", " for item_2 in lst:\n", - " print item_1,item_2\n", + " print(item_1,item_2)\n", " \n", "lst = [0, 1, 2, 3]\n", "\n", @@ -159,10 +153,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "def print_once(lst):\n", @@ -170,15 +162,13 @@ " Prints all items once\n", " '''\n", " for val in lst:\n", - " print val" + " print(val)" ] }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -204,10 +194,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "def print_3(lst):\n", @@ -215,21 +203,19 @@ " Prints all items three times\n", " '''\n", " for val in lst:\n", - " print val\n", + " print(val)\n", " \n", " for val in lst:\n", - " print val\n", + " print (val)\n", " \n", " for val in lst:\n", - " print val" + " print (val)" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -265,10 +251,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, + "execution_count": 12, + "metadata": {}, "outputs": [], "source": [ "def comp(lst):\n", @@ -277,23 +261,21 @@ " Then is prints the first 1/2 of the list O(n/2)\n", " Then prints a string 10 times O(10)\n", " '''\n", - " print lst[0]\n", + " print(lst[0])\n", " \n", - " midpoint = len(lst)/2\n", + " midpoint = len(lst) // 2\n", " \n", " for val in lst[:midpoint]:\n", - " print val\n", + " print(val)\n", " \n", " for x in range(10):\n", - " print 'number'" + " print('number')" ] }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -346,10 +328,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, + "execution_count": 14, + "metadata": {}, "outputs": [], "source": [ "def matcher(lst,match):\n", @@ -364,10 +344,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 15, + "metadata": {}, "outputs": [ { "data": { @@ -375,7 +353,7 @@ "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -386,10 +364,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 16, + "metadata": {}, "outputs": [ { "data": { @@ -397,7 +373,7 @@ "True" ] }, - "execution_count": 22, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -408,10 +384,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 17, + "metadata": {}, "outputs": [ { "data": { @@ -419,7 +393,7 @@ "False" ] }, - "execution_count": 24, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -445,10 +419,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": true - }, + "execution_count": 21, + "metadata": {}, "outputs": [], "source": [ "def printer(n=10):\n", @@ -456,15 +428,13 @@ " Prints \"hello world!\" n times\n", " '''\n", " for x in range(n):\n", - " print 'Hello World!'" + " print('Hello World!')" ] }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, + "execution_count": 22, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -498,10 +468,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, + "execution_count": 23, + "metadata": {}, "outputs": [], "source": [ "def create_list(n):\n", @@ -515,10 +483,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, + "execution_count": 24, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -529,7 +495,7 @@ } ], "source": [ - "print create_list(5)" + "print(create_list(5))" ] }, { @@ -558,23 +524,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb b/01-Algorithm Analysis and Big O/04-Big O for Python Data Structures.ipynb similarity index 61% rename from Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb rename to 01-Algorithm Analysis and Big O/04-Big O for Python Data Structures.ipynb index 0ba05663..cf92fa84 100644 --- a/Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb +++ b/01-Algorithm Analysis and Big O/04-Big O for Python Data Structures.ipynb @@ -23,27 +23,25 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "def method1():\n", " l = []\n", - " for n in xrange(10000):\n", + " for n in range(10000):\n", " l = l + [n]\n", "\n", "def method2():\n", " l = []\n", - " for n in xrange(10000):\n", + " for n in range(10000):\n", " l.append(n)\n", "\n", "def method3():\n", - " l = [n for n in xrange(10000)]\n", + " l = [n for n in range(10000)]\n", "\n", "def method4():\n", - " l = range(10000) # Python 3: list(range(10000))" + " l = list(range(10000))" ] }, { @@ -55,19 +53,17 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10 loops, best of 3: 162 ms per loop\n", - "1000 loops, best of 3: 820 µs per loop\n", - "1000 loops, best of 3: 307 µs per loop\n", - "10000 loops, best of 3: 77.7 µs per loop\n" + "184 ms ± 9.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", + "829 µs ± 125 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", + "574 µs ± 134 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", + "194 µs ± 11.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], @@ -93,61 +89,86 @@ "source": [ "### Table of Big-O for common list operations\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "** Please note, in order to see this table, you may need to download this .ipynb file and view it locally, sometimes GitHub or nbveiwer have trouble showing the HTML for it... **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
OperationBig-O Efficiency
index []O(1)
index assignmentO(1)
appendO(1)
pop()O(1)
pop(i)O(n)
insert(i,item)O(n)
del operatorO(n)
iterationO(n)
contains (in)O(n)
get slice [x:y]O(k)
del sliceO(n)
set sliceO(n+k)
reverseO(n)
concatenateO(k)
sortO(n log n)
multiplyO(nk)
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", "
Operation Big-O Efficiency
index []O(1)
index assignmentO(1)
appendO(1)
pop()O(1)
pop(i)O(n)
insert(i,item)O(n)
del operatorO(n)
iterationO(n)
contains (in)O(n)
get slice [x:y]O(k)
del sliceO(n)
set sliceO(n+k)
reverseO(n)
concatenateO(k)
sortO(n log n)
multiplyO(nk)
" ] }, @@ -162,10 +183,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "d = {'k1':1,'k2':2}" @@ -173,10 +192,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -184,7 +201,7 @@ "1" ] }, - "execution_count": 12, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -239,24 +256,25 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb b/01-Algorithm Analysis and Big O/05-Algorithm Analysis and Big O Quiz.ipynb similarity index 74% rename from Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb rename to 01-Algorithm Analysis and Big O/05-Algorithm Analysis and Big O Quiz.ipynb index 5f2b2c4f..84b0069a 100644 --- a/Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb +++ b/01-Algorithm Analysis and Big O/05-Algorithm Analysis and Big O Quiz.ipynb @@ -10,23 +10,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Introduction to Array Based Sequences.ipynb b/02-Array Sequences/.ipynb_checkpoints/01-Introduction to Array Based Sequences-checkpoint.ipynb similarity index 86% rename from Array Sequences/Introduction to Array Based Sequences.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/01-Introduction to Array Based Sequences-checkpoint.ipynb index b9225c24..c24dc9b1 100644 --- a/Array Sequences/Introduction to Array Based Sequences.ipynb +++ b/02-Array Sequences/.ipynb_checkpoints/01-Introduction to Array Based Sequences-checkpoint.ipynb @@ -12,9 +12,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -35,9 +33,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -58,9 +54,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -90,23 +84,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Low Level Arrays.ipynb b/02-Array Sequences/.ipynb_checkpoints/02-Low Level Arrays-checkpoint.ipynb similarity index 82% rename from Array Sequences/Low Level Arrays.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/02-Low Level Arrays-checkpoint.ipynb index e5ad10f9..2f7fe0c7 100644 --- a/Array Sequences/Low Level Arrays.ipynb +++ b/02-Array Sequences/.ipynb_checkpoints/02-Low Level Arrays-checkpoint.ipynb @@ -21,23 +21,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Dynamic Array Exercise.ipynb b/02-Array Sequences/.ipynb_checkpoints/04-Dynamic Array Exercise-checkpoint.ipynb similarity index 82% rename from Array Sequences/Dynamic Array Exercise.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/04-Dynamic Array Exercise-checkpoint.ipynb index 732a6e15..8fc728ba 100644 --- a/Array Sequences/Dynamic Array Exercise.ipynb +++ b/02-Array Sequences/.ipynb_checkpoints/04-Dynamic Array Exercise-checkpoint.ipynb @@ -24,27 +24,23 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class M(object):\n", " \n", " def public(self):\n", - " print 'Use Tab to see me!'\n", + " print('Use Tab to see me!')\n", " \n", " def _private(self):\n", - " print \"You won't be able to Tab to see me!\"" + " print(\"You won't be able to Tab to see me!\")" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "m = M()" @@ -52,10 +48,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -71,16 +65,14 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "You won't be able to see me!\n" + "You won't be able to Tab to see me!\n" ] } ], @@ -100,10 +92,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "import ctypes\n", @@ -165,10 +155,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "# Instantiate\n", @@ -177,10 +165,8 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "# Append new element\n", @@ -189,10 +175,8 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -200,7 +184,7 @@ "1" ] }, - "execution_count": 46, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -212,10 +196,8 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [], "source": [ "# Append new element\n", @@ -224,10 +206,8 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "data": { @@ -235,7 +215,7 @@ "2" ] }, - "execution_count": 48, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -247,10 +227,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "data": { @@ -258,7 +236,7 @@ "1" ] }, - "execution_count": 50, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -270,10 +248,8 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -281,7 +257,7 @@ "2" ] }, - "execution_count": 51, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -307,23 +283,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Amortization.ipynb b/02-Array Sequences/.ipynb_checkpoints/05-Amortization-checkpoint.ipynb similarity index 82% rename from Array Sequences/Amortization.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/05-Amortization-checkpoint.ipynb index d58ff51c..577a33aa 100644 --- a/Array Sequences/Amortization.ipynb +++ b/02-Array Sequences/.ipynb_checkpoints/05-Amortization-checkpoint.ipynb @@ -22,23 +22,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Array Mini-Project.ipynb b/02-Array Sequences/.ipynb_checkpoints/06-Array Mini-Project-checkpoint.ipynb similarity index 82% rename from Array Sequences/Array Mini-Project.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/06-Array Mini-Project-checkpoint.ipynb index 1a4dc652..14d016e4 100644 --- a/Array Sequences/Array Mini-Project.ipynb +++ b/02-Array Sequences/.ipynb_checkpoints/06-Array Mini-Project-checkpoint.ipynb @@ -23,23 +23,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb b/02-Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb similarity index 100% rename from Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb diff --git a/Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb b/02-Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb similarity index 100% rename from Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb diff --git a/Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb b/02-Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb similarity index 100% rename from Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb diff --git a/Array Sequences/.ipynb_checkpoints/Dynamic Arrays-checkpoint.ipynb b/02-Array Sequences/.ipynb_checkpoints/Dynamic Arrays-checkpoint.ipynb similarity index 100% rename from Array Sequences/.ipynb_checkpoints/Dynamic Arrays-checkpoint.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/Dynamic Arrays-checkpoint.ipynb diff --git a/Array Sequences/.ipynb_checkpoints/Introduction to Array Based Sequences-checkpoint.ipynb b/02-Array Sequences/.ipynb_checkpoints/Introduction to Array Based Sequences-checkpoint.ipynb similarity index 100% rename from Array Sequences/.ipynb_checkpoints/Introduction to Array Based Sequences-checkpoint.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/Introduction to Array Based Sequences-checkpoint.ipynb diff --git a/Array Sequences/.ipynb_checkpoints/Low Level Arrays-checkpoint.ipynb b/02-Array Sequences/.ipynb_checkpoints/Low Level Arrays-checkpoint.ipynb similarity index 100% rename from Array Sequences/.ipynb_checkpoints/Low Level Arrays-checkpoint.ipynb rename to 02-Array Sequences/.ipynb_checkpoints/Low Level Arrays-checkpoint.ipynb diff --git a/02-Array Sequences/01-Introduction to Array Based Sequences.ipynb b/02-Array Sequences/01-Introduction to Array Based Sequences.ipynb new file mode 100644 index 00000000..c24dc9b1 --- /dev/null +++ b/02-Array Sequences/01-Introduction to Array Based Sequences.ipynb @@ -0,0 +1,106 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction to Array Based Sequences\n", + "\n", + "In this lecture, we will get a brief overview of the \"sequence\" type object classes available in Python. These are mainly the **list**,**tuple**, and **string** objects. The main commonaility between these object types is the ability to index to access individual elements in the sequence. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l = [1,2,3]\n", + "l[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = (1,2,3)\n", + "t[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'1'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = '123'\n", + "s[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Please refer to the video lecture for the remaining information.\n", + "## The section consists mostly of video explanations not well-suited for Jupyter Notebooks.\n", + "# Thanks!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/02-Array Sequences/02-Low Level Arrays.ipynb b/02-Array Sequences/02-Low Level Arrays.ipynb new file mode 100644 index 00000000..2f7fe0c7 --- /dev/null +++ b/02-Array Sequences/02-Low Level Arrays.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Low Level Arrays" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Please refer to the video lecture for the remaining information.\n", + "## The section consists mostly of video explanations not well-suited for Jupyter Notebooks.\n", + "# Thanks!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Array Sequences/Dynamic Arrays.ipynb b/02-Array Sequences/03-Dynamic Array.ipynb similarity index 100% rename from Array Sequences/Dynamic Arrays.ipynb rename to 02-Array Sequences/03-Dynamic Array.ipynb diff --git a/02-Array Sequences/04-Dynamic Array Exercise.ipynb b/02-Array Sequences/04-Dynamic Array Exercise.ipynb new file mode 100644 index 00000000..8fc728ba --- /dev/null +++ b/02-Array Sequences/04-Dynamic Array Exercise.ipynb @@ -0,0 +1,305 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dynamic Array Exercise\n", + "____\n", + "\n", + "In this exercise we will create our own Dynamic Array class!\n", + "\n", + "We'll be using a built in library called [ctypes](https://docs.python.org/2/library/ctypes.html). Check out the documentation for more info, but its basically going to be used here as a raw array from the ctypes module.\n", + "If you find yourself very interested in it, check out: [Ctypes Tutorial](http://starship.python.net/crew/theller/ctypes/tutorial.html)\n", + "\n", + "Also..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**A quick note on public vs private methods, we can use an underscore _ before the method name to keep it non-public. For example:**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "class M(object):\n", + " \n", + " def public(self):\n", + " print('Use Tab to see me!')\n", + " \n", + " def _private(self):\n", + " print(\"You won't be able to Tab to see me!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "m = M()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Use Tab to see me!\n" + ] + } + ], + "source": [ + "m.public()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You won't be able to Tab to see me!\n" + ] + } + ], + "source": [ + "m._private()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check out PEP 8 and the Python docs for more info on this!\n", + "_____\n", + "\n", + "### Dynamic Array Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import ctypes\n", + "\n", + "class DynamicArray(object):\n", + " '''\n", + " DYNAMIC ARRAY CLASS (Similar to Python List)\n", + " '''\n", + " \n", + " def __init__(self):\n", + " self.n = 0 # Count actual elements (Default is 0)\n", + " self.capacity = 1 # Default Capacity\n", + " self.A = self.make_array(self.capacity)\n", + " \n", + " def __len__(self):\n", + " \"\"\"\n", + " Return number of elements sorted in array\n", + " \"\"\"\n", + " return self.n\n", + " \n", + " def __getitem__(self,k):\n", + " \"\"\"\n", + " Return element at index k\n", + " \"\"\"\n", + " if not 0 <= k \u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;31m# Run and test\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mReversalTest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrev_word\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'rev_word' is not defined" ] } ], @@ -228,7 +218,7 @@ " assert_equal(sol('space after '),'after space')\n", " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", + " print(\"ALL TEST CASES PASSED\")\n", " \n", "# Run and test\n", "t = ReversalTest()\n", @@ -245,23 +235,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb b/02-Array Sequences/Array Sequences Interview Questions/05-Sentence-Reversal/05-Sentence Reversal.ipynb similarity index 89% rename from Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb rename to 02-Array Sequences/Array Sequences Interview Questions/05-Sentence-Reversal/05-Sentence Reversal.ipynb index e6cf296a..8819e575 100644 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb +++ b/02-Array Sequences/Array Sequences Interview Questions/05-Sentence-Reversal/05-Sentence Reversal.ipynb @@ -46,9 +46,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -68,9 +66,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -104,9 +100,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -130,7 +124,7 @@ " assert_equal(sol('space after '),'after space')\n", " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", + " print(\"ALL TEST CASES PASSED\")\n", " \n", "# Run and test\n", "t = ReversalTest()\n", @@ -147,23 +141,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb b/02-Array Sequences/Array Sequences Interview Questions/06-String-Compression/06-String Compression -SOLUTION.ipynb similarity index 89% rename from Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb rename to 02-Array Sequences/Array Sequences Interview Questions/06-String-Compression/06-String Compression -SOLUTION.ipynb index 629aafd8..d027573e 100644 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb +++ b/02-Array Sequences/Array Sequences Interview Questions/06-String-Compression/06-String Compression -SOLUTION.ipynb @@ -25,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def compress(s):\n", @@ -75,10 +73,8 @@ }, { "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -86,7 +82,7 @@ "'A5B4C4'" ] }, - "execution_count": 66, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -104,10 +100,8 @@ }, { "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -129,7 +123,7 @@ " assert_equal(sol(''), '')\n", " assert_equal(sol('AABBCC'), 'A2B2C2')\n", " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", "\n", "# Run Tests\n", "t = TestCompress()\n", @@ -146,23 +140,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb b/02-Array Sequences/Array Sequences Interview Questions/06-String-Compression/06-String Compression .ipynb similarity index 71% rename from Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb rename to 02-Array Sequences/Array Sequences Interview Questions/06-String-Compression/06-String Compression .ipynb index e8c7d5f4..2bd8d1c4 100644 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb +++ b/02-Array Sequences/Array Sequences Interview Questions/06-String-Compression/06-String Compression .ipynb @@ -23,10 +23,8 @@ }, { "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def compress(s):\n", @@ -35,22 +33,9 @@ }, { "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "compress('AAAAABBBBCCCC')" ] @@ -64,19 +49,9 @@ }, { "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "\"\"\"\n", "RUN THIS CELL TO TEST YOUR SOLUTION\n", @@ -89,7 +64,7 @@ " assert_equal(sol(''), '')\n", " assert_equal(sol('AABBCC'), 'A2B2C2')\n", " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", "\n", "# Run Tests\n", "t = TestCompress()\n", @@ -106,23 +81,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb b/02-Array Sequences/Array Sequences Interview Questions/07-Unique-Characters-in-String/07-Unique Characters in String - SOLUTION.ipynb similarity index 87% rename from Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb rename to 02-Array Sequences/Array Sequences Interview Questions/07-Unique-Characters-in-String/07-Unique Characters in String - SOLUTION.ipynb index c93f14c1..7ff82318 100644 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb +++ b/02-Array Sequences/Array Sequences Interview Questions/07-Unique-Characters-in-String/07-Unique Characters in String - SOLUTION.ipynb @@ -20,10 +20,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def uni_char(s):\n", @@ -32,10 +30,8 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "def uni_char2(s):\n", @@ -59,10 +55,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -85,7 +79,7 @@ " assert_equal(sol(''), True)\n", " assert_equal(sol('goo'), False)\n", " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", " \n", "# Run Tests\n", "t = TestUnique()\n", @@ -102,23 +96,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb b/02-Array Sequences/Array Sequences Interview Questions/07-Unique-Characters-in-String/07-Unique Characters in String.ipynb similarity index 88% rename from Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb rename to 02-Array Sequences/Array Sequences Interview Questions/07-Unique-Characters-in-String/07-Unique Characters in String.ipynb index 9659d2bf..e6f8e1e2 100644 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb +++ b/02-Array Sequences/Array Sequences Interview Questions/07-Unique-Characters-in-String/07-Unique Characters in String.ipynb @@ -40,9 +40,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -65,7 +63,7 @@ " assert_equal(sol(''), True)\n", " assert_equal(sol('goo'), False)\n", " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", " \n", "# Run Tests\n", "t = TestUnique()\n", @@ -82,23 +80,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/01-Stacks, Queues, and Deques Overview-checkpoint.ipynb similarity index 90% rename from Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/.ipynb_checkpoints/01-Stacks, Queues, and Deques Overview-checkpoint.ipynb index e020c9b7..42dbbded 100644 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/01-Stacks, Queues, and Deques Overview-checkpoint.ipynb @@ -31,23 +31,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/.ipynb_checkpoints/02-Stacks Overview-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/02-Stacks Overview-checkpoint.ipynb new file mode 100644 index 00000000..038a04af --- /dev/null +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/02-Stacks Overview-checkpoint.ipynb @@ -0,0 +1,92 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stacks Overview\n", + "\n", + "**Please see the lecture video for the full Overview on Stacks!**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "____\n", + "\n", + "A stack is an ordered collection of items where the addition of new items and the removal of existing items always takes place at the same end. This end is commonly referred to as the “top.” The end opposite the top is known as the “base.” \n", + "\n", + "The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest. The most recently added item is the one that is in position to be removed first. \n", + "\n", + "**This ordering principle is sometimes called LIFO, last-in first-out.** It provides an ordering based on length of time in the collection. Newer items are near the top, while older items are near the base.\n", + "\n", + "For example, consider the figure below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "url ='https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png'\n", + "\n", + "Image(url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how the first items \"pushed\" to the stack begin at the base, and as items are \"popped\" out. Stacks are fundamentally important, as they can be used to reverse the order of items. The order of insertion is the reverse of the order of removal.\n", + "\n", + "Considering this reversal property, you can perhaps think of examples of stacks that occur as you use your computer. For example, every web browser has a Back button. As you navigate from web page to web page, those pages are placed on a stack (actually it is the URLs that are going on the stack). The current page that you are viewing is on the top and the first page you looked at is at the base. If you click on the Back button, you begin to move in reverse order through the pages.\n", + "\n", + "In the next lecture we will implement our own Stack class!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extra Resources:\n", + "[Wikipedia Page on Stacks](http://bit.ly/1OJybGQ)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/03-Implementation of Stack-checkpoint.ipynb similarity index 84% rename from Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/.ipynb_checkpoints/03-Implementation of Stack-checkpoint.ipynb index fc3983dd..921d820c 100644 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/03-Implementation of Stack-checkpoint.ipynb @@ -31,10 +31,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Stack:\n", @@ -68,10 +66,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "s = Stack()" @@ -79,10 +75,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -93,15 +87,13 @@ } ], "source": [ - "print s.isEmpty()" + "print(s.isEmpty())" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "s.push(1)" @@ -109,10 +101,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "s.push('two')" @@ -120,10 +110,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -131,7 +119,7 @@ "'two'" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -142,10 +130,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "s.push(True)" @@ -153,10 +139,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -164,7 +148,7 @@ "3" ] }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -175,10 +159,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "data": { @@ -186,7 +168,7 @@ "False" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -197,10 +179,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "data": { @@ -208,7 +188,7 @@ "True" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -219,17 +199,18 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "two\n" - ] + "data": { + "text/plain": [ + "'two'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -238,10 +219,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -249,7 +228,7 @@ "1" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -260,10 +239,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { @@ -271,7 +248,7 @@ "1" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -282,10 +259,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "data": { @@ -293,7 +268,7 @@ "True" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -312,23 +287,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/.ipynb_checkpoints/04-Queues Overview-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/04-Queues Overview-checkpoint.ipynb new file mode 100644 index 00000000..d16ebe90 --- /dev/null +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/04-Queues Overview-checkpoint.ipynb @@ -0,0 +1,121 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Queues Overview\n", + "\n", + "In this lecture we will get an overview of what a Queue is, in the next lecture we will implement our own Queue class." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "____\n", + "A **queue** is an ordered collection of items where the addition of new items happens at one end, called the “rear,” and the removal of existing items occurs at the other end, commonly called the “front.” As an element enters the queue it starts at the rear and makes its way toward the front, waiting until that time when it is the next element to be removed.\n", + "\n", + "The most recently added item in the queue must wait at the end of the collection. The item that has been in the collection the longest is at the front. This ordering principle is sometimes called **FIFO, first-in first-out**. It is also known as “first-come first-served.”\n", + "\n", + "The simplest example of a queue is the typical line that we all participate in from time to time. We wait in a line for a movie, we wait in the check-out line at a grocery store, and we wait in the cafeteria line. The first person in that line is also the first person to get serviced/helped. \n", + "\n", + "Let's see a diagram which shows this and compares it to the Stack Data Structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "url = 'https://netmatze.files.wordpress.com/2014/08/queue.png'\n", + "Image(url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how we have two terms here, **Enqueue** and **Dequeue**. The enqueue term describes when we add a new item to the rear of the queue. The dequeue term describes removing the front item from the queue.\n", + "\n", + "Let's take a look at how pop and push methods would work with a Queue (versus that of a Stack):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "HTTPError", + "evalue": "HTTP Error 404: Not Found", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mHTTPError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0murl2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mImage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, url, filename, format, embed, width, height, retina, unconfined, metadata)\u001b[0m\n\u001b[1;32m 1229\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretina\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mretina\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1230\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munconfined\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munconfined\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1231\u001b[0;31m super(Image, self).__init__(data=data, url=url, filename=filename, \n\u001b[0m\u001b[1;32m 1232\u001b[0m metadata=metadata)\n\u001b[1;32m 1233\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, url, filename, metadata)\u001b[0m\n\u001b[1;32m 635\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmetadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 637\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 638\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 639\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36mreload\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1261\u001b[0m \u001b[0;34m\"\"\"Reload the raw data from file or URL.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1262\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0membed\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1263\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mImage\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1264\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretina\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1265\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_retina_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36mreload\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 665\u001b[0m \u001b[0;31m# Deferred import\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0murllib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0murlopen\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 667\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0murlopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 668\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 669\u001b[0m \u001b[0;31m# extract encoding from header, if there is one:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(url, data, timeout, cafile, capath, cadefault, context)\u001b[0m\n\u001b[1;32m 220\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 221\u001b[0m \u001b[0mopener\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_opener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 222\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopener\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 223\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minstall_opener\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopener\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[1;32m 529\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprocessor\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess_response\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mmeth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprocessor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 531\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmeth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 533\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mhttp_response\u001b[0;34m(self, request, response)\u001b[0m\n\u001b[1;32m 638\u001b[0m \u001b[0;31m# request was successfully received, understood, and accepted.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 639\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m200\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mcode\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m300\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 640\u001b[0;31m response = self.parent.error(\n\u001b[0m\u001b[1;32m 641\u001b[0m 'http', request, response, code, msg, hdrs)\n\u001b[1;32m 642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36merror\u001b[0;34m(self, proto, *args)\u001b[0m\n\u001b[1;32m 567\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhttp_err\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 568\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'default'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'http_error_default'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0morig_args\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 569\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_chain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 570\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 571\u001b[0m \u001b[0;31m# XXX probably also want an abstract factory that knows when it makes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[0;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[1;32m 500\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhandler\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandlers\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 501\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 502\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 503\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mhttp_error_default\u001b[0;34m(self, req, fp, code, msg, hdrs)\u001b[0m\n\u001b[1;32m 647\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPDefaultErrorHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 648\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mhttp_error_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 649\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 650\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 651\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPRedirectHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mHTTPError\u001b[0m: HTTP Error 404: Not Found" + ] + } + ], + "source": [ + "url2 = 'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\n", + "Image(url2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "You should now have a basic understanding of Queues and the FIFO principal for them. In the next lecture we will implement our own Queue class!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/05-Implementation of Queue-checkpoint.ipynb similarity index 88% rename from Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/.ipynb_checkpoints/05-Implementation of Queue-checkpoint.ipynb index 23c0e784..4c2cc2eb 100644 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/05-Implementation of Queue-checkpoint.ipynb @@ -39,9 +39,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Queue:\n", @@ -64,9 +62,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "q = Queue()" @@ -75,9 +71,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -97,9 +91,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -119,9 +111,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "q.enqueue(1)" @@ -130,9 +120,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -159,23 +147,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/.ipynb_checkpoints/06-Deques Overview-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/06-Deques Overview-checkpoint.ipynb new file mode 100644 index 00000000..f9b805fc --- /dev/null +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/06-Deques Overview-checkpoint.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deques Overview\n", + "\n", + "A deque, also known as a double-ended queue, is an ordered collection of items similar to the queue. It has two ends, a front and a rear, and the items remain positioned in the collection. What makes a deque different is the unrestrictive nature of adding and removing items. New items can be added at either the front or the rear. Likewise, existing items can be removed from either end. In a sense, this hybrid linear structure provides all the capabilities of stacks and queues in a single data structure. \n", + "\n", + "It is important to note that even though the deque can assume many of the characteristics of stacks and queues, it does not require the LIFO and FIFO orderings that are enforced by those data structures. It is up to you to make consistent use of the addition and removal operations.\n", + "\n", + "Let's see an Image to visualize the Deque Data Structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "Image('http://www.codeproject.com/KB/recipes/669131/deque.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how we can both add and remove from the front and the back of the Deque. In the next lecture, we will implement our own Deque class!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb b/03-Stacks, Queues and Deques/.ipynb_checkpoints/07-Implementation of Deque-checkpoint.ipynb similarity index 80% rename from Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/.ipynb_checkpoints/07-Implementation of Deque-checkpoint.ipynb index 9016eaa9..68822c47 100644 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/.ipynb_checkpoints/07-Implementation of Deque-checkpoint.ipynb @@ -24,9 +24,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Deque:\n", @@ -54,10 +52,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "d = Deque()" @@ -65,10 +61,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "d.addFront('hello')" @@ -76,10 +70,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "d.addRear('world')" @@ -87,10 +79,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { @@ -98,7 +88,7 @@ "2" ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -109,10 +99,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -123,15 +111,13 @@ } ], "source": [ - "print d.removeFront() + ' ' + d.removeRear()" + "print(d.removeFront() + ' ' + d.removeRear())" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "data": { @@ -139,7 +125,7 @@ "0" ] }, - "execution_count": 15, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -158,23 +144,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb b/03-Stacks, Queues and Deques/01-Stacks, Queues, and Deques Overview.ipynb similarity index 90% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb rename to 03-Stacks, Queues and Deques/01-Stacks, Queues, and Deques Overview.ipynb index e020c9b7..42dbbded 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb +++ b/03-Stacks, Queues and Deques/01-Stacks, Queues, and Deques Overview.ipynb @@ -31,23 +31,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/02-Stacks Overview.ipynb b/03-Stacks, Queues and Deques/02-Stacks Overview.ipynb new file mode 100644 index 00000000..038a04af --- /dev/null +++ b/03-Stacks, Queues and Deques/02-Stacks Overview.ipynb @@ -0,0 +1,92 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stacks Overview\n", + "\n", + "**Please see the lecture video for the full Overview on Stacks!**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "____\n", + "\n", + "A stack is an ordered collection of items where the addition of new items and the removal of existing items always takes place at the same end. This end is commonly referred to as the “top.” The end opposite the top is known as the “base.” \n", + "\n", + "The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest. The most recently added item is the one that is in position to be removed first. \n", + "\n", + "**This ordering principle is sometimes called LIFO, last-in first-out.** It provides an ordering based on length of time in the collection. Newer items are near the top, while older items are near the base.\n", + "\n", + "For example, consider the figure below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "url ='https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png'\n", + "\n", + "Image(url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how the first items \"pushed\" to the stack begin at the base, and as items are \"popped\" out. Stacks are fundamentally important, as they can be used to reverse the order of items. The order of insertion is the reverse of the order of removal.\n", + "\n", + "Considering this reversal property, you can perhaps think of examples of stacks that occur as you use your computer. For example, every web browser has a Back button. As you navigate from web page to web page, those pages are placed on a stack (actually it is the URLs that are going on the stack). The current page that you are viewing is on the top and the first page you looked at is at the base. If you click on the Back button, you begin to move in reverse order through the pages.\n", + "\n", + "In the next lecture we will implement our own Stack class!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extra Resources:\n", + "[Wikipedia Page on Stacks](http://bit.ly/1OJybGQ)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/Implementation of Stack.ipynb b/03-Stacks, Queues and Deques/03-Implementation of Stack.ipynb similarity index 84% rename from Stacks, Queues and Deques/Implementation of Stack.ipynb rename to 03-Stacks, Queues and Deques/03-Implementation of Stack.ipynb index fc3983dd..921d820c 100644 --- a/Stacks, Queues and Deques/Implementation of Stack.ipynb +++ b/03-Stacks, Queues and Deques/03-Implementation of Stack.ipynb @@ -31,10 +31,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Stack:\n", @@ -68,10 +66,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "s = Stack()" @@ -79,10 +75,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -93,15 +87,13 @@ } ], "source": [ - "print s.isEmpty()" + "print(s.isEmpty())" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "s.push(1)" @@ -109,10 +101,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "s.push('two')" @@ -120,10 +110,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -131,7 +119,7 @@ "'two'" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -142,10 +130,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "s.push(True)" @@ -153,10 +139,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -164,7 +148,7 @@ "3" ] }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -175,10 +159,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "data": { @@ -186,7 +168,7 @@ "False" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -197,10 +179,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "data": { @@ -208,7 +188,7 @@ "True" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -219,17 +199,18 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "two\n" - ] + "data": { + "text/plain": [ + "'two'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -238,10 +219,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -249,7 +228,7 @@ "1" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -260,10 +239,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { @@ -271,7 +248,7 @@ "1" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -282,10 +259,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "data": { @@ -293,7 +268,7 @@ "True" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -312,23 +287,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/04-Queues Overview.ipynb b/03-Stacks, Queues and Deques/04-Queues Overview.ipynb new file mode 100644 index 00000000..d16ebe90 --- /dev/null +++ b/03-Stacks, Queues and Deques/04-Queues Overview.ipynb @@ -0,0 +1,121 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Queues Overview\n", + "\n", + "In this lecture we will get an overview of what a Queue is, in the next lecture we will implement our own Queue class." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "____\n", + "A **queue** is an ordered collection of items where the addition of new items happens at one end, called the “rear,” and the removal of existing items occurs at the other end, commonly called the “front.” As an element enters the queue it starts at the rear and makes its way toward the front, waiting until that time when it is the next element to be removed.\n", + "\n", + "The most recently added item in the queue must wait at the end of the collection. The item that has been in the collection the longest is at the front. This ordering principle is sometimes called **FIFO, first-in first-out**. It is also known as “first-come first-served.”\n", + "\n", + "The simplest example of a queue is the typical line that we all participate in from time to time. We wait in a line for a movie, we wait in the check-out line at a grocery store, and we wait in the cafeteria line. The first person in that line is also the first person to get serviced/helped. \n", + "\n", + "Let's see a diagram which shows this and compares it to the Stack Data Structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABiYAAAQrCAMAAAFIgNSEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAE4UExURQAAAEFwnUl9rEFxnEV3pUJynUJyngAAAEFvmgAAAAAAAD9wmgAAAAAAAD9vnwAAAEBymwAAAD9wmz9/nwAAAAAAAD9vnwAAAFiX0AAAAFWSyFmY0gAAAFaTylKNwU6HulKNwz9vmgAAAE+IuwAAAD9xm0JynAAAAENzngAAAE2Etj90nwAAAD9vm0p/rk6Ft0p/sEZ5pwAAAD9vmz9xnEN0n0d6qQAAAER1oUFxmgAAAAAAAD9vnAAAAEFvmwAAAAAAAEFxnAAAAD9ymT9vnAAAAAAAAEFvnAAAAEFxnD9vmgAAAAAAAEFvnFqa0wAAAEFxm0BxnVub1VeVzFOPxViWzgAAAFCKvVSQx0N0n0JxnEFvnEFxmz9wnFGLwEFxmk6GuEuBskFvmkh8qkyCtER2pD9wmz9wnCPP8ZcAAABodFJOUwCf//////8I9xAYaIcgEI+PKHgIlzAgn/84//+n/////zBA/69I/kj+t/8YUED/////v/BY//9Y/6/HYFDPp2jXv3AoYN94t+fPcIDvx//335f//////////ofXgOj/7///5/////j4bCHutwAAAAlwSFlzAAAXEQAAFxEByibzPwAAT/VJREFUeNrt3Q1/49S57mFTASYhIYRJJqQTYDDpmZOSUup2miEmnSFsh4AzGKZFZw7DgUJh7+//DY7fLdnya/wi2df/BxNblmWt9ax73XqWlqRcDgCAmfB60OaH7BbiWZThq4Y1yhkoxWfDC9H+J+WlCIaWov1v/cXeWadI1dZnV+F5+ktxEytFvWnVX5613tb+O85dhqkvRdhbirAUedv5k7lSNOiWovkuU7qolyKyPFxiHCYsxUn9n2rr/3LucdgpRZidUnSaUP1FqdxpQ/V/Wksz0KKaPEmlYUxaigx4t1IohVIohVIohVIohVIohVIohVIohVIohVJkuRSFLJeiPMtSlJdViuaYa+2fwvaUW26O39a2sLe8UpTbA+GFy6m33SpFYamx2L2p78hh7halaAymH87/rECsFG9ltY/6aPzz3Rnkfk87C7rvf62/fz1S+Dv1BV+P+EIaOuAg+v5ern/OwsgvLL0Uz/rf/zS0FAlfSGUpgjSWIlyJUvQVI5ulyIerUIrGqfjsl6KnTWW1FPFiZLYUMWlkthQxaWS3FNE2leFSRIqR5VJ0i5HtUoSrUIpmopz5UuTDcC+9pRhzNlxnIubcS1GYZn7e9oTFnX8pclNMmNzuNPowd9H89kHzXZjr/I30UwspRa5Y+7Fq48cbv1+pv3x81L9LvbEodqe+RktxsJDjqLC3FOV8t26bpTiJvs+NW4pWqcuLyfXCeCmuW4PA5W4pjju7NE4pamtFS7GgXK8URkux0f7dsKb13OMHue772n+nD/pLUalU2l9uFPMszO3XLjpozObdPco1puwv4Mg88iutHQov2o3q4rzju2GttmudfmmysYLFjYGE0+9SmkZyFjo1em6lOA1XoRS9Aszq2GC4EqVYYDHmWYpCuAqlyIXFlRgzX9RVM0oxukXVuMx+LBYVjLlnSatRCuf1pitF7cTve0P3epwvLLsY9+vvv+7Zp2gwfqq9vxt5/27SF1aMN1ZizsYKzvF7phRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRKoRRjl+KXrJYi92p81gIAAAvjl84zerJbhq8mmDi2zIcqzOzQrF6C3TDjpQhPm/HoPgFmP2y/uml/lP5SNP49iz4IJvZUmzAtD7cZoxT9D+WJliDMYiz6HtGTlVKE173tJ3WP6Blaiqv6fm629rkcKcVmRyVZ6GmvI4/o2Ys8lCfyp5SVVD6VxmdYRSmUQimUQimUQimUQimUQimUQimUQimUQilSVYpilktRaA/DTl2Knvs8LqcU4VlzR4rTjmjWhkKvm6XZWl4p2tU5fSk6f4tLK0Uu3MjV7hocXp5Me2ai8bUn9XtTnsz95MZq9FGxYvwht2L8tTdCkfdv1t9HnlD0Sv19MOoLS+DDUTdaeif6/lEu99qoLyyDYNTtoXr19PaoL2SiFM/SUIpwNUpRXYVS9AYjo6XoKUZWSxF/YFJWSxGXRmZLEWtT2S1FtBgZLkVEGhkuRUQaWS5Ft01luhSdYmS7FLVHIISrUIowxaUIJ3hGz2JKMc2Mz7G/UFlYKXKTz/sMW+NckWeptB++Uu4+qKdZjuoCS1Her/3zoPugoI1y/fEq7bHJMLEU7YfGdJ/Okyv1lWJ+fdRl2FeKyNN52i+LU5SiG4sFHJmHBwmlyPWUItctRW5gKbbPuy3qqLk0XFQpoj8T5uKP5Gk+qKc1gToXJpaiUn9GT7ExAv648YynxlNwcmGl8Z3a00FOFpMlhZE9aoze7jQufCg296O2Sw/C3UbTy4+euXuwtDGQ0oA9q2RrJGeRT4WZY08brkQpFlmMOZZicU+Fmat3L04acz0CCVeiFPVibGS/FIcLug5rvqU4W4lShCtRikVd3ZTx0QOlSF0pXprokTz3RxU7tyQe9kxJeNFbs707GX2y0J+SvrBivBsp3zdZLcSLlZg/EyiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUiiFUijF+KxGKT7tluHXHAAAAABkhW9//yyR20633q8UK2p3Ej56NpBbbLV+KU+lUEzvI+7SyOBITK+LSADOxGKZodiMVn8rLO1FYVjuyKbGTS7+YS764b5Q3DYU8V4pKRT7rbfbvR82/60mbEYo5hOKzgrJocjFRSIUU4dia2QHFYaFFrtJoWh/qIOapW2ftl72huI41yecPlWw7RlkFnXTfdywhHa9HofhSX35TdO2a8vz0coPt+tm3wlb81ZG4YFQzCLJe1Cv2dPIzQIKYf0BtbnibjT1aK+9F4ZbtbsrtZ8xUL/bQ1igiplf3iy1SE0oIBRCAaEQCgiFUEAohAJCIRRCIRRCIRRCAaEQCgiFUEAohAJCIRQQCqFAqkJR6LuSqLjwaXzJFzNtn6xbKMrN51s2aqPx4KlaKGpTXhcaisY/V7VZuM3d6Py7hqE4bhW8Ufbi+aKroP3I0+b/jeecFoqNPVu/UFy2n/16mLtqqGJJoahetJ9CWwtFLlyzUGBuBAMjcV/lLDwYPybE4V5wR81kVER/b63w3aAVnjY//3bQ51+3Yv9w0Ap/GfMX1r47e/bBKOt5qf75V89G3D3h48GfvzfWLwhFqyZHHQXcZgPj/cKqsCEUKaE8KmEVikUO7+wKRUp4MlQYQrFgYRwKRUq4GCwMoUiNMIRi4ZwPEIZQpEYYQrEMiknCEIplCaMgFKkVhlAsVxj5UChSwHEYm+kiFON3KU1mme3FYrEKoahX0AJu0T3rCUmV1QtFoVGYjblPmuqGImxM1Dpo9fi1H268bt0n8aC9tDmNpXVnxc7CfF84DlctFLncddj8t0apldXWa6lTE5XGvw/a94hufa15UBmOcbP1bhtu/XuZyx00Xl31hGKn8XIzjIeiefPpsK+Hq2QvFE9GhKJR4PCi86pba5FQdJdGQnHTeHkZjq+KdqWGESl0X7Z6nvo9SLuhaC9cheHAQaXohqKSK3XL27zzbaUvFO3PI6FoL8zfLhT73VBEdron9CtyviI5FoXo/YW7SWxz5Z0w6WWd7WgoxssD2o26G4rmwqNmKOqcNF5WO6vud7/1YLgoMuYViSUpxITffF1pv6p0DTMX9lRow1UasRvRdYyO0izuZZw12560vioLmXe7lqGYdKZ/JTtToDN4MLuq937OYl6xoo8kyWaKt5KxyGi2vYrCyOzAx+rFIrtjUCsnjCwPBzYvqT0XihSMzFbDVXp6ZYZDEd52uEIoZqeK1YpF5k8dCYUZH0KxlqH456iK+rL++UujavrH2/7C2vDywHpoXnb9j1FNdnAwXzRXeHt4qEb/wvpwN0jgh8gKXyR8/iK6hacJK3wW+fz1pF/4apJf6OfLpG26icnieXegkt5XOWlxuLfVTrqO+yAUQiEUQiEUQiEUEAqhgFAIBYRCKCAUQgGhEAoIhVAIhVAIhVAIBYRCKCAUQgGhEAoIhVBAKIQCQiEUEAqhEAqhEAqhSH0oflY7i+WvboAAAAAAAAAAAACQzCcJNz9269vFM+Dk4s9v3HK7pWKxpHYn4JW53IW4tGoPr5k/38/l0Q/1GBRPK/U/p+r4Vn1TnXem3uh1GF52QqKObx2JZ7eQxFZEHSp5aZGoRmr/sPn6LNxrR6b1wXktRlfNl+Uw3/qwHOnddkXi1pEIw2r0zUajssNYJB5HDT0MC42/hc77dXT7+URiN/rmvD8SG2G42e26eiJx3V4aisStIxE/jOqPRDtWYbjfH4ke+YjEfCPRfHfReBGPxE531X2RmHMkrtrvSgmRCMOD9qoHIjHTSJz0ReI87JIQiQ4nInHbSBz0hqUvEoUWuSRNRD8UiVtFoiuK06RIVOJmHIalWCQuZHYzisRppKJbUTlIduzogW4ud9lYfLKmWfmcRjvC3lfdpK3fjFs5+W6YFCaRuE0k8i0rrh2kxoYCd9qZc60fuq7/3YvEpxp2ItH80rV8YgbXA0YOgJojH5utI6VWg9+JjWiU4x+GazncMbcrM5/UT1HUW31bFrVBjO1c7rjY+ryWU3QG/Nq9VnGn9ba4boewuUVcI+vMXVoi0RlixbIjAZEQCYiESEAkRAIiIRIQCZGASIiESIiESIiESEAkRAIiIRIQCZGASIgEREIkIBIiAZEQCZEQCZEQCZGASIgEREIkIBIiAZEQCYiESEAkRAIiIRIQCZGYLBLuo7WcSPTfTG7hkRhwP7tw3SLRV+bFR2IltTlNJErXtUd5FOu3vKw1zie1JbvhEiLRvK1pXR1hpft6LXunMLfTuP1umA+X0TuFHYHWn08Vrm3v9KDRDPPNillK71T7t3LQjERujSNxcFL/97r50IJF10EnEg+erHkkDmsxKOW2wlb5w9pTDJYTifr/1cdrG4nmffLDsBmTVjgOlxOJXONW2a1I5MMncmzMNRI/q52FMjgSv6ichfLXOTyUGVPx6atJcfj1JzWTSWP59c2Oxu6PUFjyBt7prPC3j5N/4a2xf2E9+G5QZ/Z0xBHA31sb+G1Ebzj4IfafjfkL636oda/x+YeDDwCaNf0/g1f4tLHCOwM/f3u8X1j7I61nL404KP6gsYGfR1TkV7f+BZEIxkoU7w3+/GH9859u/QsiMV493WYDIiESIrG2kdhoPZBRJJZOGO6KREpEEYpEOngyIhQiscD+qSoSWbAKkVgc+aH9k0ikxSpEIi1WIRILDsWhSKTdKkRisZwPDIVIpMUqRCItViESabEKkUiLVYhEWqxCJNJiFSKxnFCIRDooJoRCJJYkilAk0hKKgkik1CpEYkmcNEJRv6pQJFJgFVG7EIllhkIkRCLDkSgVG8w6ECsViUqtgirbi2nBM7ttwllre+HGCkUinHEljT9AMYvQnq9UJAZkremORK9RrEwkctXwwWIiEYabnRqsv7guhZH20BpWCsPj2oty4+1249+NBOGuZiS62ojU0mYzf6okfB7997q+sDR2JMLTXKnx/iK8aKsxsrlKeFWfZbYbj0T9o92+MxOrG4n4P1dhbyR6/mn+Ww7365oa07EjXxz1MhKJ5sIhP5KhSIRjROKm8fqycUuiehvP90SidV+9WqOOVd3FaCeIaqJTp/XGnxCJzYGRKK1CJJq3oRoRibBzq6jrMCKUTiSqYc+q0fBMFIlGJTePQfs10dZPLBIjjvCypIlwnEg0yXdiEo9E2K2QbtWVxjkOTo5EITESnRyhTxNDyFAkSgMKk6CJ7tK+SPQd/OZyhXDCY6duJKqJkeiI96CxcH/VIjEoZWgtvanf2LO7xlE0Eh0fOEiKRK7vrM3YkQg7p0IbDnUSxis9Xz+W3WgdFaxQJAZYRbPgN40/p92kot1lJ7zsfn4TjtVeu/38YSwS+Ui31nhR6b4My+1XG+E4wyXZOopNvv14kyc9B5vV+t9q4+VOd+lxT9WVI7VUGRaJ3UqD+iYaw4Cnxdbv7XRTy63cdnPpZS3fy7ekWbsZcnPhfhgOE1+2IpFoFWe1CuqWMN/J0Wol32zV0mZ9pK241Vh8EYZ77RCW2hVai9XFkgdCMpbZTTy6tIj7Qa9lJHLN8RyRSMFox4TFzs7t+jMXidNwRR8Zk70RwHBFQ5HBsdhJrUIk5jYqvpqiyGIkVtMqMnmmaCWtIpvn7FbRKjJ69nQFRZHRSBRWLxRZnVGwelaR2bkdYVgUiXTMslk1UWQ3Ei2ruBCJpc88q/ZMERCJpc0BrFlFKBKpmI3ZPscvEkvXRGPSgEgsORL5xVzBIhIjI1ERidT0ThWRSM31ExWRSEkkGrHYE4k0RCK36Keqi8TKIxIiIRIikblIfDminv7Z2MC7Iyr6pSG/8HSsX1gT3hvRIF8aUdHDKvLFqFiP9wtrwj9GVcPLA1e401xh4CNoP8qNCNW4v7AmvPh6RHt8mPz5/T+0Pv/8g+QVXm5vIHh2y19YG74I+nkR+fxuwufBD5EVXk9a4f3ICk8TPv9ykl/o58OkrwRv5rBgBunskapZLK8NtJZXVM5CeT74eOsNtZOSLOgbtZOmkQGIhEiIhEiIhEiIBERCJCASIgGREAmIhEhAJEQCIiESEAmRUDsiIRIiIRIQCZGASIgEREIkIBIiAZEQCYiESEAkRAIiIRIiIRIiIRIiAZEQCYiESEAkRAIiIRIQCZGASIgEREIkIBIiIRIiIRIiIRIQCZGASIgEREIkIBIiAZEQCYiESEAkRAKpiMRbameRBAMDcV/lLJaPBkXiD+pm0ar4MSEM94I7agYAAAAAAAAAAAAAAAAAAAAAACBbvPHfwcf/+u7ZGDx/71HwiQrDivP00bPJeDv4cHl7exlGuNgQPsye4Nnk/PGz5exrmMC+EGL5knj27D9/W5oirrvecN5csimKWL4mnr228B09a7T/B/GFm42F58KI5Wti4Xfz2W+0/gHm8VgcsX6aGCCJng/KvWvV35f7jKXFVs+Khcj7Qu+W9iJfrMrtaWLpmtiqN8WrpE+Oop+M0MROs0lXCoVKtZmcjKuJ5heLpcLpsSSGJlKhiYE2kduINvvhmggT2vlYmjiNu0pjPLik7dBESjUR+2ioJurWUO398HwMTWz0GsPp4L0BTWRHExt9m6hElgzTRPwoq72kovHQRDo1kR/32OkgTGRMTfRT1HhoYpmauE44ORHJsU/H0EQ5sWVXp9aEE+g0sVRN7N5+LPZoaBIQVVaSJg40FZpI2fmJxtjp8QBJbLffFYdoYndo517/8HKYT2gqNJEyTTQb5k3PwuYpuMv4gNCDHiWVx2naPR8eRt8/6BUMaCIVT2pqnmUL890lO2GY5Aud5ts68I+fn4idV9jonAYsRTf1OJ5/t34otjdneW2HJpb/9LLkXDc8GrzOSSl2Hvu8k1kXe4adWgOzXfJJ57Hro03XrRcSDJpIxRP9NqqxhnuRO2m+2Os9nGqw0ez+Y/Od4hs46RvB6rT3XmfYiWumoOnQRFqfcrndbqXOoYEmemQhmKCJqC4uqoIJmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJmgBN0ARogiZAEzQB0ARAEwBNADQB0ARAEwBNADQB0ARAEwBNADQB0ARAEwBN0ARogiZAEzQBmqAJgCYAmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJmgBN3FYT+bBBcdg6xbCw6vUcttDiaCJXCMv1P9dhdc01McHKrTrDamui1SjyxXpn2VZAtfa60tHEg1XuRSNlq4a5qzDcqb3aqVfGQXvhZu3Nk4inaJyrrYnHLUk0GsBm801TG4+fNDWxEYbb6+ETteZ+VP973OwtquFxc2Gl8WeTT6yBJm4qlYMnsX6v8braPWCqaWK1FRHLJ1o1cdpu+I2itxYWGokXTazHsdN+qz2ExUql9TIf0cT1ijeDmE80/my1jppqncMuTaylJs7qUW9FvvHnKLyI5tibzcOG9dFEPvY3pondYQMSWAFNtDhpBDu8OKj932gAJ83l1+0cuxzerJMmGqPU9WPKm1yvJnJy7JXWBLAWmvjnl2oOq8pL77EJIMY/Xp5CEnfUG1aZFw+/nkQQ94M/qDOsPHe/CMbjxQ8Tb/vDL4OxeXMuG8i9Nf4Gvnk/aQNfjb+B4Pv5lAGrwhvBu5Mdlj36ZsYbyD19ZbINvBP0yOKTScch/veLWZcBq8Nr706erLzy/iw38OEUA2u/jw4h3JlmZO5/zbQMWKVM5flUg1pvzG4D040133vtlhuIjkLcvgxYIaZrT29/M7sNfPGvW56SnHID382wDKCJSIvM7AZmuQugCZqgCZqgCZrICE9CmqAJdLnsXixMEzSBBreexU8TNLFqlG5pFTRBE6yCJmiCVdAETbAKmqAJVlHjmCZoAre3CpqgCVZBEzTBKmiCJtaV0ymsgiZoglXQBE2wCpqgCVZBEzSBaa2CJmiCVdAETawhhfGtgiZoglXQBE2wCpqgCYxvFTRBE+tmFUWaoAlMZBU0QRPrbBUXGzRBE6i2raL2oN/wnCZoArnDhlW0HvZLEzSBtlU0OaQJmsBZGKFKEzSxkJGdDqnbvXwYjthDmkiDJnZjQdrPvCa2U7x7lV5NXNJEGjVRaHVX24W9Zpx2aWJxuqCJNGuiNWaeymOOW2niJryu/fu4XrDrzegHjUXhaa07CMOzdv7bPcQ/DsNCd+WjxsrH+fb7qzC8ivzsdSRjuGmkCqWxdEET6ddE85C882bzvBG5vegK2+X2omp40VxUjBx0HcYmMDRuPx+WOwMsG7U3nQ9rG8oP/amZaKK+rNsxnyakHqXOvSyjZY/c4bJR4uJBY+WTzqJOQba7X2v80vXB+eh8ppJYXJpIoyb2uw2nEbXiSawtlSO5R+ebtReVaKy7fWkYXmyVIw2k0NPqCrnBPzWdJnYqLfajm26+3Km92ugsvY7IdqgmIvtUbQ8WJWviuLuBzdrLzdHHUTSxCE1s3E4T9RZQbgc139s+uu1rI9LWkjURdpvNZXthsiYSf+q2407V3JB2HhsIHaGJWC7cdqJETWxHv38wzVEoTcxeExuJo96TaiJs/d2ILqz/2YquXBmuiZ2eBlYcrImkn5rlsVP0aK3Ya1HjaCJGZaAmyiPHWmliCT5RnnToKEkTxdbyGNvxrn+kJsKkBpKoicSfmrsmtifQRDHC1uBjp3qHFF11myZScey0EU5mFb2aOG112qWeplCKdvdjaqIc+f5JfqAmEn9q7pq4nEAT/SlOMbJqRxPHtx60o4n55NhPJrKKhHGn67a2+lauDjx2OkjSxE3fBraTNLExs/HfsTURbdIXMU1cRBp9c+l50u6ddRfmY4lViSbSOO6Un8Qq4poodo+Oktp0/aT3g8gXw26r6g7Ftl7vxrKESAu9jAisMFg+U2rirNDmcIgmcu0rGTabU/JamngQNrP9jdjSSKXk9sIn3Q0cdc81RJKx1rmOwk1IEykai53AKupNu9GEKq0ZzPmoKRx1Th5cdRLnRksvJjaF2NLDSGpQai88acm1PpBb7SS6ST9123GniOASNNGd01KK2Vx76VW9sR9Eu4re6S+l1vub2E9sRtYs00Sazk+MbxXb0VZ0Ef/sOvJRvnNauMl59ExE7qS7gcjS08j3D6J71pwoXY4M/iT91ALPfh/k0gFNzPOc3ZPkCfoznrmTWwVoYl3OY+fDic9V0ARNrPjcjov5WsXKaOImYdI2TazofKf5WkVpVqNFoIkFzgE8n3tWAZrI2LzYuWcVoInMzRVnFTRBE6yCJmiCVdAETUxW1ayCJmiilyKroAma6IFV0ARNJFlFQbujCZqIW0Wo4dEETbAKmqAJVkETNDE2J12ryKdnPihoYnma6FjFBcugCZpocZzmZzTQBE0sQRPRR4PsaYc0sfaauEj5w3xogiYWqomzvjtWbmiINLHuPtHzAKlzDZEm5BNxXWiINEETcV2YLEsTNBHXhbmyNEETPbrQEmmCJkATNAGaoAnQxDQb+Oa7qTbwamcDL/5JE1i6Jn5+a3Yb+NPLt2yQf/ptqg18/PrsyoC1F8X9X2a5gS//OI0k7nQ38Mk0G/hxpmXASvHXjyZuj3+Y7QbuBvcm3MCf44ctH068gWfBn2ZbBqwWnwav/jhmS7j3a/DTndlvIPci+HjctOL+o+Cr/g18GXw07gbe/jn4ZQ6VAGAqVw7uj+9FvwZvqjGsePI28Rjb35+qNawuH06Tyt8z4osVdomphnw/eEnNgSacGgRN0ARogiYAmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJgCZoAjRBE6AJmgBN0ARAEwBNADQB0ARAEwBNADQB0ARAEwBNADQB0ARAEwBNADRBE6AJmgBN0ARogiYAmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJgCYAmgBoAqAJgCZoAjRBE6AJmgBN0ARAEwBNADQB0ARAEwBNADQB0ARAEwBNADQB0ARAEwBNADRBE6AJmgBNDOefX6o5rCovvccmgBj/eHkKSdxRb1hlXjz8ehJB3A/+oM6w8tz9IhiPFz+oLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwyd3/4bJwHefz02VvqCuvA98Gr/34+ztOe3n7+axDcVWFYce4E/5nkKWhvB0+XvMOFynGxuFMpCB3mJYnfT/iwzL/8sry93TwJI1wJH+bAxJJ49uy3b5e1s9dhD2cCiFnz5kfZedL447CfGyHErG1iCkk8++CLZezqQVsGx5VCZetJ611VDDFTPn84jSaWYhRHTQ2UOgsOOQXmwLc/ZkUTmwmucN5YdimMmCFfvpMVTTRNoWdhOWkhsPB0YhmaeJzc+htL98QRa6iJAUdJp4wCa6qJ/KC231i+GzmWquajH9+EYTn+havWeNX5bnTpWa/d7PWd/Ng/d6aQJlKkieN6YzxI+KAxQHsUVUh0zkehV0l7kVMb1Y2exKRXa+W+FL/FloZDE0vXRKMp5hM+2IgZyChN9Jzw2x9bE4+dKaSJNGpi9CcjNNFs0MVS4fS4+XJzTE3sNFevFAqVauPVtaZDE6ugicZsqePWm8vYF4drYiMmIBOtaCIFmtiuN8OLW2riNJ4KXEbPig/XRJhgN9oOTSxVE4VBKXar8x9LE73nwaNNe6gm9mNjWy2F7ms8NLFMTZQGj/Y0WvP2GJrYiCUQbd8YRxPV3kkljbFcjYcmlqmJSiPDTfyoGNXBME3s9B3xRLr7oZqITz2sceHgiSZSrImxfaJ/uCiy0WGa2OhTQIUmaCIVx04HgzWRG1MTB32aOBitias+BZRogiZSkWMf3W7cKUykOFoTB8nf1HhoYuljsdV5aOJktCbOaYImVvOcXXLLHiPHLid+0TWvNJFSTWz2nVwbmk8UekjMSpJ8oveLu9oOTaRAE0mnyY5j11XU35yOnWMPytR7NHHkSIkmUqiJ80g+3C+WfPRdaYgmLqbRhJFXmkijJjYHHDz1XGfXezFeXz4xaPvFIZrYNZWDJlJ77elx8uLT2NvopIvLSFM/GaaJg1HnsY+1FZpImSZ2wp6JeJEhoYGp+GH0/YNh971p+M2D7vtqryYcPNFESu9lk+8/4oke1lRj8/x2w76B2nDY5qs9Wmtr4vHQ9Bw0sSRN7PddCt28b0HsqKYUbfePe06u7fSL4iyWnXdcpPXF+PUTsVmAG25UQBPLvzdm+y7755uxFh8muEl9SuBmtW+FMH5DnMJ1pPc/7p7VbmjnJqqJQvN6046A9hxL0UQqbiw+YN5RGLn9RnPctEs+6Xrs+qhu+6b9B/2fNcVRil2P3ZneUS2a2kETKbrZ/tkAUVz1Zd2ddjv8vh3RA6LYzWr2cnFNtG9SYLoTTaTsARS9TfN0o98qjjqfHuT6NNG7geg8kM2Y85R67+9UTZo6CJpYtiZqiXW7VVe3oj3/dWRAai+SjD+uPfkuvoHD9tHPSd8D8QqNI6rr5gVKtWfm9Yz8tu8gWK5oNzSRIk300T7Ur+ZFEzTR7PhbongimqCJFseyXtBED0W3qwRN9HAZeoY8aAKgCYAmAJoAaAKgCYAmAJoAaAKgCYAmaAI0QROgCZoATdAEQBMATQA0AdAEQBMATQA0AdAEQBMATQA0AdAEQBMATQA0QROgCZoATdAEaIImAJoAaAKgCYAmAJoAaAKgCYAmAJoAaAKgCYAmAJoAaAKgCYAmaAI0QROgCZoATdAEQBMATQA0AdAEQBMATQA0AdAEQBMATQA0AdAEQBMATQA0QROgCZoATdAEaIImAJoAaAKgCYAmAJoAaAKgCYAmAJoAaAKgCYAmAJoAaAKgCYAmaAI0QROgCZoATdAEQBMATQA0AdAEQBMATQA0AdAEsPaaCEORwPpo4iZscLjemjhr1kL4RJOjiVyrMYTFtdbEwRi1EO1HtMzV1kT9380wzK+3JiqOJWkiHt9qWKIJmqCJSHyfhJf1P6X6AcRF66Ot2uvrjc46N+HZOmhis1YT1UaJN8q1CrjZbC88qr3bbVRVg12tc8U10Tx2qrWFm4uwYx0N2uvchOW18IntsNIs9lXt37oqrroLw3A/l7tuvtrWOldaE9s34UnDCrabYnhc+/ckvGm8aa3zZJUlEddEK7dqCKA+ItVaWPuzE1YdO63NuNOTSIp9Fh51nKOtm5OVlkRn3Gm30fwbh0sX4V7jo3K9NrY7dkoT66CJSqVSrDWHy86iQn1IMh8JfBhurbYkOpo4rDf/ciyR3q2/iC+kibXIJwqtv0ftYfrdmCbCYcNSq3bsFNdEjibWVBO1v6e53GntIGqnctCvidr5iw2aoIn10sR1vVU03zSOnXIxTeQqq90Ohmhiv/6eJtbTJw5zG4M1UdPM9XppotpadF3PtGhiDTVx0T0RkWtO+7loiqCzOAx31koTm81TEO2x2KgmrhuD1VhdTbRonbM7Og9vmlPhwvg5u41VPk2VoIl6NxE+aZ6m69HEab1eClrnqmqi2Gj4161pGyeN87bNE3i5+knccr7TEi5X+JBhr3G2uuUPT1qvzrqzx9sLW1WwFQ6dM4lsawLIFt98N5UmXlVzWFVeepdPAFH+9DJNALdPKO6/UHFYWb784zQ2cUfFYYWN4t7EkviITWCVuTuxKP4sm8Bq83nwwUSSePkndYZV50Xw8binKe4/Cr5SYVgDXn8ajMdn70+87beCsfnm/bls4MMvx9/Cm7fdwIu7cykDVkhtwUfjH5a980r/iNatN5D7a3B//C38mqCKXybZwPP/9drsKwErxNNXJsvf3wnen/EG3ggmPFX/6JveDbw32Qb+FdydcRmwQnz726TjvF/HO8lbbyAXTDyj6+9P4xt4Z9IN3AtmWwlYIT6c4iz574NZbiD32hQTul6JdtP/773JN/B8tmXACvE/70zeHJ49+nSGG5imQcb6+ak28OyVP8ywDFglpmpP916b4QZePJ9qiuMbt9zA27MsA1aIr36+5aTbW29gymumPnjplhuYaRmwQnzxr1s2h1tvYMom/fY3s9PE7cuAFeKne1M1h4ez28Dtm/SUG5hlGbDu6cQMGmSQpl1wxTtogiZAEzQBmqAJ0ARNgCZoAr3shwc0QRPocnTr59HSBE2sFu2bftMETaDJRl0TVZqgCXS4rIvigCZoAh2ehLdLKWiCJqQUNEETK07+dikFTdDE6lG6VUpBEzQhpaAJmpBS0ARNSClogiakFNOmFDRBEyucUhzSBE3g9ikFTdCElIImaGKNUopjmqAJ3DaloAmakFLQBE1IKWiCJtaU02lSCpqgiVXmfIqUgiZoQkpBEzQhpaAJmpBS0ARNYNqUgiZoQkpBEzQhpaAJmpBSHNMETWDKlIImaEJKQRM0IaWgCZqQUoyfUtAETUgpaIImpBQ0QRPIjZ1S0ARNrAmFcVMKmqCJdaE4ZkpBEzQhpaAJmiAKmqAJdFKKIk3QBOIpRYEmaAITHT3RBE0QBU3QhJSCJmgC46cUNEET63z0tBvSBE0gIoq9kCZoArnDTkpxE9IETaDGcTOl2A2Tn6JNEzSxflTrYthrSCLcogmaQCulaFKmCZpAK6VoQRM0gcZ4E03QBLrchDRBEwsd1ilGeJC+/dsNY5zSRCo1sd1qQSeVUuYlcR5rcTepPm5KvESbJlKhieFByhblWGGepPq4KfHgiSbSp4kwrGRdEynevY0bmsiKJhqTDQqn5XT2rqujiX5V0ESqNVFna6yLhmliZqrYpYm0ayK3UQ/UA5pYlCq2aCL1mshth1loVpNo4qzRG29cNOYZRT/IF9ujChftIaqrMLyKVMx1ZCuNhlztDs1VIze7PI5dKXTUHK3Ij6OKMk2kXxON4cz9zrvLZuRid7DbqS+63s7lHofhRttdytF22W0Om83R0W5bLEa2fhj75aSfmoUmDsKwlDvpP4Dfai96kOssL0cKsh1Ze6Pbs+e71RatwoNIAccYw+uogiYyoIn6I0QuWq8fJAz1b7cXndTD3+weCz0NpNNpXnc2UOp+2hnZqkS+9mAmZxUGaaLcn9VWIkNtozTRKPP1wXl0AwM00fil4kGrhkargiYyoIlcN1JX9ZcXW+Vo8La7Tel6pCYaqxVPoqdsB2gi6admp4m2zG+64mw8PWizte+jNNFZYbd7f/BkTdSL1Dz6epJ4fUSfKmgiC5o4b0dqo3O8WztICo+6zaOeGOab3dxQTZQ7h2HVzgrJmkj8qSk1UWkT1cRV59erXQfbjih3mCaOu8XbbClpkCYi8zWqo2+vX1PFKU1kQBNX7WhHUsDL9rIH3SZbHKWJzfjR98EQTST91K3PY0c0Ucn1tu5oqUdpIpphVdvfS9TETmTp5jgF2TigiflrYj88uJ0mSq1Y5nuifhrv8OujNcM1cdNNTLotPVETiT81S020P9+NHgRt9Lf+RE1Ek+3u1hI1UXtxGV26PWkBaGIOmjgaeRg7ShPtBr7TE/Vi6+9Rf+tP1kS02eWGaiLxp2aZT/TtxlZ04QhNxDZQGqWJzejSEk2kQBOTJ6mDfKIaHTgpthb2Bn2IJmKd/3BNJP7UXDVRnEAT5cRJSoM0cbvJYzQxB01sTPI05kRNVLrNv68pbPe28yGaKPR+f3ugJkZOF525JsoTaCKcXhOPaSIN+UTj1NfBLTRRHqKJwgSaKPV+P59dTVSjlyptD9VEdM2tHE2kYtzpSThZSjHo/ER9LCgS35P8FJqINpBSbpgm+n5qvpq4mPDYKbHaEjWxcatBQJqYz1jshD1twnnsndby4/5BrcmOnRJ/LVETs7mYaWxN7CVrIppmdJYeT6SJU5pIoSbyk6UUPZooRhrqTdLKG/2a2E7SxMagpnSQpImbxWriQbQgXaVH1+0sHSju/SRNHNBEGs/ZlSZKKeKaqJ9puu5vS5GVj8bURC7xvvKR2VTdIdiDWc3FHVsT0YLku7561l03sjRxUDVSkGKnus9vWxCamNd57IlSiv7rJzb6T2v1n/Jtnr8r5HrPVVWjmujv/SMH8odh4hm0hWkiMq+k/TrfOYrbiM/46G/p3clKJ2FsbscRTaRybsckKUVUE5XoAGLSNra6n9+EMU2EfUtPky5PetxZWAjDhBZ6e00UOgzTRP3IqHHwsxP2zHZtNOpK39Kz1hnNm9bCB62htI3GDWDbmihGZqnsTXEZL03MTROTpBT1g4B6CzprtYPOtQ6HYXd2Qinaeivdsw+FbldZbbW0amdptdtr1q6juIq3r2K01SX+1G3ndiQdmHVfX0QuAO0u3e8ujeRDD5IGirsLTirdQ9VqOPR+sDSxvDmAE6QUPacGutcTNe8L39MUImfiznpnhTcvlCgnLe0ON+1EtthtYMczOT0RuaBnpCY694K6iaVDpe5VHD3z+foaenvBVa6SeE1RrC5pYvnzYhspxeHEmoiPJJ5GPjnoaTS1fCWiiXx76WGunHhNUXeKbPuSt4tYq0v6qSmoRGke7uwXi93TybWTH93hhHodlfd7z87XZ4xd15Oxo2JkgHi/udvH0VGDs2pr4nzttnGR5n/Z8IrryjRnWWhijpoYP6XIt5tQ0sMHHzQPMfaiCfteO+mIDSxdtq+mOy0Wu60h37SFi+i4zWZ9m+cbjRa6NfynFsN2ei5Bp4l5aiI/8cSniRn1EM+sQBPrck1Rae73uqQJmsiWJiZIKWiCJtZDE7lwzvdqogmayJom5p1S0ARNZE0TzQHOY5oYo++giTXRRPO81OEcNbGdA01kShNzTylAE1nTxALOUoAmMqWJeacUoInMaWLOKQVoInuakFLQBE1IKWiCJqQUNEETE91XXEpBEzQhpaAJmpBS0ARNTIKUgiZoQkpBEzQhpaAJmphYFFIKmqCJLgUpBU3QRJyilIImaEJKQRM0QRQ0QROTphRFDY8maCKeUhS0PJqgCUdPNEETREETNCGloAmakFLQBE3MQBPxo6ddx1E0QRNRUezJLWiCJlrPU2ykFDfybZqgiTrHzZRiN5zkKdqgiRXWRPN5tXvN5yluaYc0QROxR52WtUOaoIlWSnHbZ1GDJlZIE3s0QRM0EeUmpAmaoIkuu2GMUw2RJtZcE3txSbhEmybWXRM3YS8aIk2styY2bmiCJmhiuCo0RJow7hRXhdkdNEETcVWY3UETNBFXhdkdNEETParQEmmCJuKq0BJpgibiqtASaYIm4qowu4MmaCKuigNNkSZoAjRBE6AJmgBN0ARogiZAEzRBEzRBEzSxRnzz3VTN4dXZbWBpTfqVGZYBK8RL796yQd56A1M26X9+OTtR3b4MWCH+9PItm8OtNzBlk/75rdlp4vZlwNonFPdfzHADL713ywb50r+n2oWnMywDVokv/zhNg7wzww1M1SLv/3JbXc+2DFgpo7g3cWv46MVMN/CPl2/ZIL//bfIN/O7pTMuAVeLuxO3hz8FsN5D760cTS+IPsQ388p9JN/DHWZcBq8TnwQcTtYaXf5r1BnIvHn490YFTjyRqBz//e6INPPtt9mXASvEi+HjcEfr7j4Kv5rCBT4NXfxxzA/d+DX7qP5L/w/gbePbuw+D1OZQBq8XrT4Px+Oz9OW3g7hdjbuDFD8kb+PCTYNxd+HxOZRiLt4Kx+eZ9LROr3/kEE+RO77xibAurztNXJsvk3wlYBVaabyceNP6aU2CV+XCKk4u/N+aLFeZ/3pnidPmjT1UcVpap5qDce03FYVX56mfTb4EoX/yLJoAoP92bShMP1RykE3wCNEEToAmaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaoAnQBE2AJmgCNEETAE0ANAHQBEATAE0ANAHQBEATAE0ANAHQBEATAE0ANAHQBE2AJmgCNEEToAmaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaoAnQBE2AJmgCNEETAE0ANAHQBEATAE0ANAHQBEATAE0ANAHQBEATAE0ANAHQBE2AJmgCNEEToAmaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaoAnQBE2AJmgCNEETAE0ANAHQBEATAE0ANAHQBEATAE0ANAHQBEATAE0ANAHQBE2AJmgCNEEToAmaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJgCaAGgCoAmAJtQcaIImQBM0AZqgCYAmAJoAaAKgCYAmAJoAaAKgCYAmAJoAaAKgCYAmAJoAaAKgCZrAqvPNd1Np4lU1h1XlpXf5BBDlTy/TBHD7hOL+CxWHleXLP05jE3dUHFbYKO5NLImP2ARWmbsTi+LPsgmsNp8HH0wkiZd/UmdYdV4EH497muL+o+ArFYY14PWnwXh89r7KAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALDWfPjWl8Ec+ObN99UtAGSd1/8aBB/dfzYH3vn1lSB4844qBoDM8sbT4JV3n82Rdx4F36xtTrFxdnAd9lA9Km1qdwCywrfBb989mzNf/z14un4ZRb5SDYdwc5nX+gCkng9fC959tgB+/0qwXglF4SIcg4ttTRBAul3if4J3ni2Ee4+CT9enXivhuNwUtEIAKeZF8PzZgrgXvPbGelRq/qjnTMRp7OPdnXLcKc60QwBp5avg52cL44PgpbWo1LOoBZwMOFd9FT1tUdQSAaSUL4J/Lc4m3g6+WYc6jaQS1f1hOUfk5EV1V1sEkEp+Cu4tziaePQxWv0bzkdmvj0esu3/TXXdfYwSQRoJggS7xLFgDm+imCNf5SdaumhwLgE2sgU3sdfr98lj9/kl3amzCp9uFQuFw6PcPa2uMnFO7WarsFIs318XiTmXUdX1L+EkAbGJ9bOKyO891zOygO+502fvRk/Yng7rt/fYKTwZufr+YNAn3ZFA3v4SfBMAm1skmuicmTsf8Rikc2PF2ps0OurKi0Mlckj8/vRl8uUY5sdtewk8CYBNrZBOnnS7xeOzvdE9PPJhtn7016rq+/ZnbxDQ/CYBNrJFNnEycTESv1z6eZZ/9INI5X0VODpxFLu07mq1NTPeTANjE+tjEdnfe0vhf2g8H9by36bO7F29Uhoxz9U3GWsJPAmAT62MTh1NdVt091J5dn91Ja84Tv1gc9PESfhIAm1gfm+jepeNggm91h2S2Z9Vn77Q/2BnwzeP2CltL/0kAbGJ9bOJqyLDLYM7DAX3z1H322egT6dXk0bEl/CQANrE+NlGZyiaKM88mLgZsMELnMsDSsn8SAJtYH5t4HI4aeRk+6JSfjU0UxjhDcpU8BLSEnwTAJtbHJk6nOjfRnQSUm41NdA7bi5WBHCcPEi3hJwGwifWxif2hN2ia+EvT9tnFcAKKy/5JAGxifWxio9sVjn+3u+55760Z2UR5kj57Z9k/CYBNrNFV2MdjP2qiy8VAa1lAn319tvSfBMAm1vKeTuVxv1IafBuoW48A7U1cgCX8JAA2sU53iL2ZdEpsvvtI7MOBfXZpsj77oHPz7ultYnE/CYBNrOfzJsZ8aunFkBH74pR9dimc+kK2JfwkADaxVk+vO57MJy6G3Xn8eNRIzqBr3W6mvpBtCT8JgE2slU3kuw8m6nt+RB+7N0PPZVyNeBLewDMhnavBq5M+XnQJPwmATayVTeR2uycbwicbQx3lIrJmUq+8O/RqvYjH9JlMZ8vXE3baS/hJAGxivWwiOpBU6/4HPVM69yD6NNDL5HVOBg9Jxb7e12dHcpoJB4GW8JMA2MSa2UTPoz7Ll313w9vdil1ncD0o6diIZCbRCzE2D3qfMt33zcgPVJI3XzhIurxjCT8JgE2sm03k8scJl5VdFGs8SbrgrHo5aEOb1dhNLiqlwuOdYnfZyePBZzYqsV84vtzteFShclIdPLS0hJ8EwCbWzSZ6u8zRPNkdYDgXg79zkO/MQ006Ab5xPMbv7qXiJwGwifWziVp3e3UzosO8iHXI58kTaLeT74Nx3ZhGVRp+zXepOmIPjtPykwDYxPrZRKPDvTxJ7ixv9hp3w8gfxZdeJk5DfdDbbZ+0p9o+aCcjA/dgc2dAv31yuT1kx5fwkwDYxBraRKfnLBTOmg9duCz0JA2nPTnHdSV5Qulh4bLx9d2pdqD9+1eFwuHYX1rCTwJgE+gfndrqPey+VCkA2ARiThEbp7lRIwDYBHp4EDmhrTYAsAkksH/kKaAA2AQAgE2wCQBgE2wCANgEmwAANsEmAABsAgDAJgAAbAIAwCYAAGwCAMAm2AQAsAk2AQBsgk0AAJtgEwAANgEAYBMAADYBAGATAAA2AQBgEwAANsEmAIBNsAkAYBNsAgDYBJsAALAJAACbAACwCQAAmwAAsAkAAJtgEwDAJtgEALAJNgEAbIJNAADYBACATQAA2AQAgE0AANgEAIBNAADYBJsAADbBJgCATbAJAGATbAIAwCYAAGwCAMAmAABsAgDAJgAAbIJNAACbYBMAwCbYBACwCTYBAGyCTQAA2AQAgE0AANgEAIBNAADYBACATbAJAGATbAIA2ASbAAA2wSYAAGwCAMAmAABsAgDAJgAAbAIAwCYAAGyCTQAAm2ATAMAm2AQAsAk2AQBgEwAANgEAYBMAADYBAGATAAA2wSYAgE2wCQBgE2wCANgEmwAAsAkAAJsAALAJAACbAACwCQAAmwAAsAk2AQBsgk0AAJtgEwDAJtgEAIBNAADYBACATQAA2AQAgE0AANhEBmzislgsbmsRALByNrF7VWlyWSjkp99MMQzDghaRcU4rMQQUYBO5XCGMc7zJJtaWg57GUFYlAJto2ESrNzisVOt9wyWbWGebqMxn0wWuAzaxAjZRH3So+8Q+m2ATbAJgE8nyvejpKPKFy0qlVNjo/+LhWaVytj/AJgqFXa1jZWxis9CI8+ZV7GzFfq0BVEqHSWvmNku1z/bZBLCKNlEfdjprf3QdHac+iHxp9zwyfr3faxP79Y2UNzWPFbGJ7cbSvWa4TxqLSjeRllEtxdfsfnjzoHmsET/jIekEm8iwTWzWjWErovnjpmU8KNdeX7c7/t26DVQva/awfVbPPuI2sV1ft2xu7GrZRP244MnjwtVJ/czVfsMCLg/ryeZOwyg2u2vWw188rTWso8aMiObyQuGy3oIKdeSZYBMZtIlqsU7zUG8reVLsTtc/Gp3EabcTOYzaRP6cSWTbJg4KHba7nX+t68/Hmkw3xGfd81nNNR+3PshXI28MOoFNrMyE2PCmMGi1YvPleeJsqKZNHDCJrNtE//BQo/M/66y00TvN4aqeKHTWvO5+UIqMVbIJsIkVGXTaqfZPdTos1C66OujYRKPT2E60iZO6yzCJlckmDiNDSXFXKEa/tdFxlJ41I8cWbAJsYmVOYee2Ii5wVo4dWxa76Ucu0SYe1BON6r52kWWbSD43UR62UplNAOtkE41ZKVeNT+qZxfFhr+Lzg7OJQtNDjjWMVbaJx535Tu0ctHPgwCaAdbCJhuZL7WPE/QTFn0dOTPbaRPOvKY+rbBO7vccJlx3fYBPAGthEY0rsRccvNqJjUS3Fn8ZnOh1uxWyimVAUtY2VtYnGrLdy94LL+onq6/wom2gkoa6lAZvIqk0057MXHleak2JPmpo/6VwftVsMo31/wyeqlcP6dRNP+q6byOWO4z6CFbOJXKVxWWV97lO+0Ljq7iJ5zahNNJLQ+iy63asNFQ02kSmb2O+dD9sdTzqLnL3ePIimCFeRLzzpuwo7d1g/q3Ge1z5W1CZyG+dhfwsYYRO5c1dhg02s4mOJ9usPIGgkBvlC/MZO+/XHVFx2r6jNxy6v3XWxbSbpTIKN+0Qh4aZe24/rT6R4vD1szd34I0z2C7VvPFDLWDeb+HqBNvGqh5wCQLb4LHi+OJe4F/yixgEgU3wf/HtxNvFu8IUaB4BMceen4LuF2cTD4K4aB4Bs8WnwaFFnJ/4SfKW+ASBrvB+8spB84uuXuQQAZJE3XgS/m79L/Dn46XN1DQCZ5E9/Df4y14zi64+C4L/UMwBkN6P4Igh++3E+HvH8P0HwQiYBAFnn9S+DBo+CGfHwYePPNz+8Mf+dv/v6D5989sus9vynzz774a33s7YHKdiFD+t78M2s9iD45bMvfvjq88zFAUDaMqHv/zsIXv343/96PrOBs7efP3/v17pdfnI3G3uQgl2488Nfa3vwUW0P/jmzRPS758///XP9YOPbDzMSBwCp4863QfCf38/rnMrbPwfB0zfSvgdp2IXv57kHz97+uNZPpz8OAFJoEk+DR79/Nlfe/kvwy4dp3oM07MInwcP7c54p98+Xg2/eSHUlAEghXwWvzLlraHQPvwXfpncPUrALfwuCfy3gwpvvHgZvpjgOAFLIm8FHi7l8/I/BZ2ndg1RUwu+eLWoXPkltHACkkO8X1Tc8e/ZB8j0Ll78HKdiFH4KPF3ZTsPdSGwcAKeTz4OHi7m37n+BvadyDFOzC3eDh14vchU9TGQcAaeTb4MfFdQ7vJA02LH8PUlEJ/2dxe/Ds9ymNA4A08mXwzgL7p+C1NO7B2lVCWuMAII0s/yneKXiO+LpVQlrjAIBNsAk2wSYANsEm2ASbANgEm2ATbAJgE2yCTbAJgE3ontgEmwDSy8bRkzybYBNsAkAij6thjRKbYBNsAkAf+YuwxTITCjbBJtgEkFqO2z6xxISCTbAJNgGkl8Pq0hMKNsEm2AQgoWATbIJNAFlld8kJBZtgE2wCSDkHS00o2ASbYBOAhIJNsAk2AUgo2ASbYBOAhIJNsAk2AUgo2ASbYBMAUpJQsAk2wSaA7CUUl2yCTbAJAEMSivIGm2ATbAJAChIKNsEm2AQgoWATbIJNABIKNsEm2AQgoWATbIJNAFhkQsEm2ASbALLH9s3CEgo2wSbYBJBFdhaVULAJNsEmAAkFm2ATbAKQULAJNsEmAAkFm2ATbALAIhMKNsEm2AQgoWATbIJNABIKNsEm2AQgoWATbIJNAFhkQsEm2ASbACQUbIJNsAlAQsEm2ASbACQUM08o2ASbYBOAhIJNsAk2Aaw+m9fzSCjYBJtgE8DKUJlDQsEm2ASbACQUbIJNsAlAQsEm2ASbADDzhIJNsAk2AUgo2ASbYBPAWiYU15tsgk2wCQBDEooKm2ATbALAHBMKNsEm2AQgoWATbIJNABIKNsEm2ASAmScUbIJNsAlgPROKfIVNsAk2AUgoBiQUZ7Ubjx+yCTbBJoB1Z6OckFDsXjSW7LEJNsEmAFz2JBT5vfb7KptgE2wCQDyhOOs85a7GKZtgE2wCQDShiHPMJtgEmwAQSyjibLAJNsEmANQ5SLSJSzbBJtgEgPbMpn7O2QSbYBPAutOd2ZTALptgE2wC2eZqSBd3oXpGE5vZ1M8Wm2ATbGJsniSqqHxQ2tbVLJHykC6uqnqmHWzqNnA2wSbYxLgUhmnpeF+Pk0KbeKx6ho82VW7CkRyyCTbBJmZhE3Wn2NDtLNEmpHRTsjHKKvbYBJtgE5PZRLEnab/q3GJzFo8VBptIm1VU2QSbYBO3somGVZTHP90HNpE1qzhlE2yCTdzWJmoSuzC1JmM2sVuqHO9VKoXha22eVuqrnc0+TyxcVnaKW5XLQpo2mmwVx2yCTbCJ29tELvd4uKQ2H1QqR8eVytmIWej7jytbxZGd1xSMuwPL3+i8bKJ5kXGp/rIU6wxvSslfOIxPbTupW0Wp8fKg//f75wNth/3rNjntnTNXfpBcqBlvdGqr2GATbIJNzMAmcqctSe30y67ao7qj5GPTq9h61av6smLjdaF/N/qfK9Z6vEwhN8UOzGWjKbWJ7fJYZ2n3EidO3d4mtpPnVZ/kc3Pf6NRWcckm2ASbmIVN5LYSD71KycO9fQewSZ1XeXsGNjHWDsxlo6m0iUpr9WKlUCjtdS4aeJJPDHbNrQ8KhxuFy2I7JLe0iXz7F09aVbp/2bbbq7lvdGqrOGcTbIJNzMQm8tX+dKLd21QrzV4sXzhOnhV13LGGy8L27oOt1vSpm/ItbWLMHZjLRlNpE81etmsKhVbUTuKJXTsaXc+P3tBiapvYb/7aTaw+863aO5r3Rqe3il02wSbYxCxsIrfTt8JB0hUV+y0L2E84HIxYzG5kHGFqmxh3B+ay0cXaxMjLhw+Sr7nbbS2NjuQ/SL6wrHRbm9gccHC+03foP5eNTm8VW2yCTayGTWwcPckv1SZavch1r1B75xPmmz1qtdvNHrWmScX3P39yW5sYewfmstFl20SYaBMHA04qRU9PVAddw71zO5u4TkhcGjQjfTPnjc4LNsEmMmITj6vzHhwfaROFnt6p1f+c9U8Q6rnI4iwc0MO2HxUzpU2MvQPz2eiybeIo0Sb6N9AX17OBk9a2b2UTpf68ZVA1z2WjbIJNrLNN5AeeilxCNtE5fDvvSS4G9iwnA69iqtzKJsbegflsNJ3nJgZtoNh7GJ50zHE7m2ieB68W+rnqTV/mslE2wSbWO5s4nv9sm5E2UYkPErcUfZwg4Na8mXzsMDzMzdgmxt6BOW00szZxMfBBC7ezietRN9mrzHejbIJNrPmg02F13gnFSJs4jkv4wchbb7Z6tv3Bsw5vZRNj78CcNppZmygPtO3b2cSomqtuz3ejbIJNrP0p7HknFKNsYrPnfHNplIBP4hs+mLVNjL0Dc9po1m1if9Y2cTP+MzDmslE2wSZMiN2db0IxyiZ2eu7qdDrmbZjbG76YtU2MvQNz2mhmbaI40bmJQSdr+tc9H3/O8Fw2yibYBJuIXkFVWrhNnPXOv98d92aA2xOdm9gdNKGob92xd2BOG82sTVwOjHSSTZwMOCXTv+4E55TnslE2wSbYxJwTiuE2Ueq//c2TcU/pXgy0tgSb2B50dW3/umPvwHw2mlmb2AgHTPrdLCfYxFZy9Dae9K3b2u7NGHU3l42yCTbBJuacUAyziXwxYVrJ5bjjM5eDlH6WcHld69qvau/KD/rXvRx/gGguG82qTbSP0HvO/nYvd4zfKyMpSO0rJuPrtkbsrkdfgjiXjbIJNsEm5pxQDLaJ7fZlG9XDpJPqe+P2dD1nf/dvkq7C7lyyPca6Y+/AfDaaWZvoTIeI3Pxpvzzgnk6dI5O9/gbRu+5l+3bzfU0z//jocu4bZRNsgk3MN6FItonDrZsBvUd3gKbaf4nsbqUY6dc2W9ZWPe0Xf59NtGdU3XQ96XF1wLrj7sB8NrpQmxh5W6dJbKJ73B4eVx7XHmDUfupUYqCLnZWLO2eVo9aVDBc7CetudlpLee+0UEsADgunlZNqwrymuWyUTbAJNjHXhKIwYn762eBT0HWtXxVqPfBGofB456J/fKor9JudyunV1pN4txQfetjvFO/6+KpUOW97Yjlh3XF3YD4bXbpNRHd8IpvIbV8nPZViwOMeSomPeqgkrrs/8Hq48wVslE2wCTbRn1BcLsQmygPzlsrA78TnpjzuX+HmwYDb8nQHyWOPeign3sJn3B2Yy0YXwdArOTantYnuaeToU5cGPjzu8KLvQXetMxwJl8MUiv0HGUcJRxlz2SibYBNsoi+hKM/s1N554tHaztmIcZb8Zf+hXnmn/04Q27Ht31wOmOnUOsl60/egu1Z3dzj1Dsxno9mmlihdnhU6FyUMfsZovUoKhbPHhbGfuFG7vcnjq0JhRJXNZaNsgk2wibklFLdgsybgSqlQGGFau7VR5UK3Vxh6k8/t2t3dTgsz3oG5bHRlGGoTawubYBNZtYm5JBSLZmH3ggabYBNsYv1sInUJBZtgE2yCTbCJdNlE9hMKNsEm2ASbYBPztInMJxRsgk2wCTbBJuZrE7ntmywnFGyCTbAJNsEm5mwTnRt8ZzKhYBMpI19/TN+uemATbGK1bCLTCcV2vVva0BOBTbAJNjFHm8h2QgGwCTbBJuZuExk/QwGwCTbBJuZsExIKgE2wCTYhoQDYBJtgExIKgE2wCTYxH5uQUABsgk2wCQkFwCbYBJuQUABsgk2wCQkFwCbYBJtYvE1IKAA2wSbYhIQCYBNsgk1Mz+a1hAJgE2yCTQyhIqEA2ASbYBMSCoBNsAk2IaEA2ASbYBMSCoBNsAk2sWCbkFAAbIJNsIlxE4rrTXIH2ASbYBNDEooKvQNsgk2wCQkFwCbYBJuQUABsgk2wCQkFwCbYBJuQUABsgk2wieXbxPCEIs87ADbBJtbcJoYkFGe1G48f6gsANsEm1twmchvlhIRi96KxZE9fALAJNrHuNpHLXfYkFPm99vuqvgBgE2yCTcQTirPOU+5qnOoMADbBJthENKGIc6wzANgEm2ATsYQijnvIAmyCTbCJBgeJNuEWsgCbYBNsojOzqZ9zvQHAJtjEuttEd2ZTAru6A4BNsIm1tonYzKZ+tnQHAJtgE+trEwMHmzqUdQcAm2AT62oT+cpNOBI37ADYBJtY50GnjVFW4YYdAJtgE+s+02moVbhhB8Am2IQJscOswg07AD0km2ATQ6zCDTsAPSSbYBPDrMINOwA9JJtgE0Oswg07AD0km2ATQ6zCDTsAPSSbYBPDrMINOwA2wSbYxBCrcMMOgE2wCTYBgE2wCTYBgE2wCTYBgE2wCTYBgE2wCTYBgE2wCTbBJgA2wSbYBJsAVs0mvl5g5/BqkMY9SMEuvBbcW2Qn/TCdcQCQRj4Lni+ub7gX/JLGPVi3SqjtwjepjAOANPJ98O/FdQ7vBl+kcQ9SsAtvBX9eoE38GHySyjgASCN3fgq+W+BYx9007kEaduGX4J8L24OvX0lpHACkkk+DR4sak/5L8FU69yAFu/B+8H8XdnYivXEAkEreD15ZyFHk1y8P6huWvwfpqIR3FnNa4FHwX6mNA4BU8saL4Hfz7xv+HPz0eXr3IAW7cOdp8PcFHM3/MfjpborjACCd/OmvwV/mehz59UfBoEPYtOxBCnbh/Z+Cl+d7huLe79IfBwApzSi+CILffpxPz/D8P0Hw4vP070EKduHOP4Lg0f+ZU05x/y9B8OXdDMQBQFp5/cugwaNgRjx82PjzzQ9vZGYPUrALf2vtwW+z2oPgt1cbf158dSc7cZgtd1//4ZPPfplVaX767LMf3npfhwEAK5Enf//fQfDqx//+1/OZDaa9/fz5e7/WLfQTs3oBINPc+TYI/vP7eZ1nefvnIHj6hloGgKyaxNPg0e/nOiXg2dt/CX75UE0DQBb5KnhlzibRMIrfgm/VNQBkjzeDjxZzSfkfg8/UNgBkje8X5RLPnn3gPoYAkDU+Dx4u7n63/wn+psYBIFN8G/y4OJt4x7ATAGSML4N3FmcTz4LX1DgAZApP9gYAsAkAAJsAALAJAACbAACwCQAAm2ATAMAm2AQAsAk2AQBsgk0AANgEAIBNAADYBACATQAA2AQAgE2wCQBgE2wCANgEmwAANsEmAIBNsAkAAJsAALAJAACbAACwCQAAmwAAsAk2AQBsgk0AAJtgEwDAJtgEAIBNAADYBACATQAA2AQAgE0AANgEAIBNsAkAYBNsAgDYBJsAADbBJgAAbAIAwCYAAGwCAMAmAABsAgDAJtgEALAJNgEAbIJNAACbYBMAADYBAGATAAA2AQBgEwAANgEAYBMAADbBJgCATbAJAGATbAIA2ASbAACwCQAAmwAAsAkAAJsAALAJAACbYBMAwCbYBACwCTYBAGyCTQAA2AQAgE0AANgEAIBNAADYBACATQAA2ASbAAA2wSYAgE2wCQBgE2wCAMAmAABsAgDAJgAAbAIAwCYAAGyCTQAAm2ATAMAm2AQAsAk2AQBgEwAANgEAYBMAADYBAGATAAA2AQBgE2wCANgEmwAANsEmAIBNsAkAAJsAALAJAACbAACwCQAAmwAAsAk2AQBsgk0AAJtgEwDAJtgEALAJNgEAYBMAADYBAGATAAA2AQBgEwAANsEmAIBNsAkAYBNsAgDYBJsAALAJAACbAACwCQAAmwAAsAkAAJsAALAJNgEAbIJNAACbYBMAwCbYBACATQAA2AQAgE0AANgEAIBNAADYBJsAADbBJgCATbAJAGATbAIAwCYAAGwCAMAmAABsAgDAJgAAbAIAwCbYBACwCTYBAGyCTQAAm2ATAAA2AQBgEwAANgEAYBMAgGXbxNcLtIlX2QQAZIvPgueLc4l7wS9qHAAyxffBvxdnE+8GX6hxAMgUd34KvluYTTwM7qpxAMgWnwaPFnV24i/BV+obALLG+8ErC8knvn6ZSwBAFnnjRfC7+bvEn4OfPlfXAJBJ/vTX4C9zzSi+/igI/ks9A0B2M4ovguC3H+fjEc//EwQvZBIAkHVe/zJo8CiYEQ8fNv5888MbKncC/j/NTDKNxmc3QQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "url = 'https://netmatze.files.wordpress.com/2014/08/queue.png'\n", + "Image(url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how we have two terms here, **Enqueue** and **Dequeue**. The enqueue term describes when we add a new item to the rear of the queue. The dequeue term describes removing the front item from the queue.\n", + "\n", + "Let's take a look at how pop and push methods would work with a Queue (versus that of a Stack):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "HTTPError", + "evalue": "HTTP Error 404: Not Found", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mHTTPError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0murl2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mImage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, url, filename, format, embed, width, height, retina, unconfined, metadata)\u001b[0m\n\u001b[1;32m 1229\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretina\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mretina\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1230\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munconfined\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munconfined\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1231\u001b[0;31m super(Image, self).__init__(data=data, url=url, filename=filename, \n\u001b[0m\u001b[1;32m 1232\u001b[0m metadata=metadata)\n\u001b[1;32m 1233\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, url, filename, metadata)\u001b[0m\n\u001b[1;32m 635\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmetadata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 637\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 638\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 639\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36mreload\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1261\u001b[0m \u001b[0;34m\"\"\"Reload the raw data from file or URL.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1262\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0membed\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1263\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mImage\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1264\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretina\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1265\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_retina_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/display.py\u001b[0m in \u001b[0;36mreload\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 665\u001b[0m \u001b[0;31m# Deferred import\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0murllib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0murlopen\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 667\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0murlopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 668\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 669\u001b[0m \u001b[0;31m# extract encoding from header, if there is one:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(url, data, timeout, cafile, capath, cadefault, context)\u001b[0m\n\u001b[1;32m 220\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 221\u001b[0m \u001b[0mopener\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_opener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 222\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopener\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 223\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minstall_opener\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopener\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[1;32m 529\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprocessor\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess_response\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mmeth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprocessor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 531\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmeth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 533\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mhttp_response\u001b[0;34m(self, request, response)\u001b[0m\n\u001b[1;32m 638\u001b[0m \u001b[0;31m# request was successfully received, understood, and accepted.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 639\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m200\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mcode\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m300\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 640\u001b[0;31m response = self.parent.error(\n\u001b[0m\u001b[1;32m 641\u001b[0m 'http', request, response, code, msg, hdrs)\n\u001b[1;32m 642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36merror\u001b[0;34m(self, proto, *args)\u001b[0m\n\u001b[1;32m 567\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhttp_err\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 568\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'default'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'http_error_default'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0morig_args\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 569\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_chain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 570\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 571\u001b[0m \u001b[0;31m# XXX probably also want an abstract factory that knows when it makes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[0;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[1;32m 500\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhandler\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandlers\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 501\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 502\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 503\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mhttp_error_default\u001b[0;34m(self, req, fp, code, msg, hdrs)\u001b[0m\n\u001b[1;32m 647\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPDefaultErrorHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 648\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mhttp_error_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 649\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 650\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 651\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPRedirectHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mHTTPError\u001b[0m: HTTP Error 404: Not Found" + ] + } + ], + "source": [ + "url2 = 'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\n", + "Image(url2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "You should now have a basic understanding of Queues and the FIFO principal for them. In the next lecture we will implement our own Queue class!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/Implementation of Queue.ipynb b/03-Stacks, Queues and Deques/05-Implementation of Queue.ipynb similarity index 88% rename from Stacks, Queues and Deques/Implementation of Queue.ipynb rename to 03-Stacks, Queues and Deques/05-Implementation of Queue.ipynb index 23c0e784..4c2cc2eb 100644 --- a/Stacks, Queues and Deques/Implementation of Queue.ipynb +++ b/03-Stacks, Queues and Deques/05-Implementation of Queue.ipynb @@ -39,9 +39,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Queue:\n", @@ -64,9 +62,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "q = Queue()" @@ -75,9 +71,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -97,9 +91,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -119,9 +111,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "q.enqueue(1)" @@ -130,9 +120,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -159,23 +147,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/06-Deques Overview.ipynb b/03-Stacks, Queues and Deques/06-Deques Overview.ipynb new file mode 100644 index 00000000..f9b805fc --- /dev/null +++ b/03-Stacks, Queues and Deques/06-Deques Overview.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deques Overview\n", + "\n", + "A deque, also known as a double-ended queue, is an ordered collection of items similar to the queue. It has two ends, a front and a rear, and the items remain positioned in the collection. What makes a deque different is the unrestrictive nature of adding and removing items. New items can be added at either the front or the rear. Likewise, existing items can be removed from either end. In a sense, this hybrid linear structure provides all the capabilities of stacks and queues in a single data structure. \n", + "\n", + "It is important to note that even though the deque can assume many of the characteristics of stacks and queues, it does not require the LIFO and FIFO orderings that are enforced by those data structures. It is up to you to make consistent use of the addition and removal operations.\n", + "\n", + "Let's see an Image to visualize the Deque Data Structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAATQAAAD1CAYAAADeQgk6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAGYktHRAD/AP8A/6C9p5MAAB7XSURBVHhe7d0JlBTV1QfwOwszDIMzrCIoIIiKAdTAETUH40IUI2riFhKTmBw1QUI+QRBZVEg8IC4QcQU0+aIRyYnRL4qgonjUSKLGLSdDgiKGVUD2Zfbpnvrq/+Y19Azdw3T3ne6q6v/vnD5U1fRM0a+rb7936y05jkuIiAIg1/5LROR7DGhEFBgZb3KeddZ5UlHRxu6JhEI1UlNTKfn5BVJYWGyPNlZfLxLvf7169Qr3Z2xFE2WjjAe0QYPOkS5d3rF7qVu37hxZv17v7xGRf7DJSUSBEbiAlpPDGE2UrTyQQ7tUioqW2r3Ubd16qXz6qd7fIwqinJwcOeWUb9m9xtwfSW6cekFNTYWEQrVSWNhO8vML7VGR4uI6ee+9t+xe5jCgEWWh448/R/r00cs179x5jpSVZT53zfYZEQUGAxpRFgpqrpkBjSgLFRYeZbd0FBeX2q3M8kRAC4fL7ZaOAwcO2C0iyiaeCGiOE7ZbOuoxlICIsg6bnEQUGAxoRBQYGQ9o8TrwJSus23olChztHLN2DjwVgQtonGiDqHnaOWbtHHgq2OQkosBgQCOiwMh4QMNEjpqiB8wSUWzauWbt1FGyMv7fKCwssls68vLa2i0iikc718yARkSkjAGNiAKDAY0oC2nnmrVz4cnySEDT7RcTCoXsFhHFop1r1s6FJ8sTAS0U0u25XFFRYbeIKJuwyUlEgcGARkSBwYBGlGX0c8zemX8w4wEtP99uKOH9AKLmaeeYtXPgqWANjYgCgwGNiAKDAY2IAiPjAa2oqNhu6SgoaG+3iCge7Vyzdi48WRkPaHl5uiWRk5Nnt4go27DJSUSBwYBGRIHBgEaUhbRzzdq58GR5IqDV11fbLR1VVVV2i4hi0c41a+fCk+WJgOY4NXZLR21trd0iomzCJicRBQYDGhEFRsYDmvZqMcqLQhMFjnaOWTsHnoqMB7Q85X6w2usNEgWNdo5ZOweeCjY5iSgwGNCIKDAyHtBycnLslo7cXI7lJDoS7VwzV0632rcvsVs68vM52wbRkWjnmrVz4clik5OIAoMBjYgCgwGNKAtp55q1c+HJYkAjykLauWbtXHiyPBHQtJfB2r9/v90iomzikRqa7j1kx3HsFhFlEzY5iSgwGNCIKDAyHtC0l7/SXp6LKGi0c8zaOfBUZDygcfogovTSzzF750PHJicRBQYDGhEFRsYDWkFBod3SkZfX1m4RUTzauWbtXHiyMh7QCgt1A1Benm6AJAoiTh9ERORxDGhEFBgMaERZSDvXrJ0LT5YnAprj6E6fWVdXZ7eIKBbtXLN2LjxZOU6GR3JPmHCHLFr0rvTocZE90lgotP+IAa+gwG641q9/1v17D8vIkSPtESKKtnLlShk7dqV06jTFHknNvn0r5ZJLVsrMmTp/LxUZD2jr16+XtWvX2r34jjrqKMlv4b3hfv36SWlpqd0jSs33v/99qa6ulhdeeMEe8TcGNCKPufXWW2Xu3Ll2D/2g8uX444+X6667TqZNm+Y2qfRmZGVAa56XAhpvCrQyfPAwPXHTBz4k6fDTn/5ULr74YrsXLB06dJDVq1ebx4cffig/+9nPZMaMGTJv3jz7DIpFO8esnQNPhS8C2t/+9jfzDelX+OB98sknjR733nuv/WljuNjqOcK+RVAL69+/v3mcdtppctttt8nXvvY1+ec//2mfIbJ8+XL55je/aVIQBQUF5ue///3v7U8PWbx4sQwZMkSKioqkffv25nc2bNhgf9rYl19+KaeffrpcdNFFvpwdubKyUjZufFz27p1y8LF9e/OPHTtulz177o35+PLLu9y/WW7/emb5osk5adIkuf/+++2ev6CG9uSTT8rOnTvtkcZQU6uqqpLBgwebD9rWrVtl8+bN0qVLF7nvvvtk4cKFZr979+5y/fXXyx133HGwORX53TPOOMOcY/v27XLqqafK7373Ozn55JPlxhtvNNvRUI74P/ld03INh8OyYsUK+c53viOPPfaYKSv4y1/+IqFQyJQRym3JkiVyyy23yEsvvSQjRowwz3nkkUfMsdmzZ8vVV19tZqN45513ZNiwYdK3b99GTc5//etf5obThRdeaN6bNm3amL/hJ/v27WtR3hpQdgcOHHl6IOSt0eTPOAQ0r5s4caLd8h/83zt37mz3Djdq1CjH/VA4U6dOddzgZB5uLc258847nXbt2jmLFi1y3BqB8/zzzztuLcMZP368/c1Dv3v33Xeb33G/eZ3LLrvMGTp0qH2G4/zkJz9x3A+u3QsOlCsuXzdImYfbjHdyc3OdyZMn22fEd9VVV5lyAfcD63Tq1MlxvzTNfiwoZzdQOq+99ppTUlLi/OpXv7I/Ia/xRUCbMGGC3fKfyAev6eODDz4wP8eHxf1mc9xmptmH2tpax232ODNmzLBHGjzwwAOO22xy3GaO2cfvuk0osx3hNrHM39+7d6/ZD3JAc5vyTllZmXm4zXjHrY06HTt2dKZPn26f5Zgvg5tuuskZMGCA49ZynW7dujlus9Jxm4vm52vWrDHl5dbuzH4sKGf8bn5+vvPoo4/ao+RFvsihud+8dsufYuXQ3A+Y/amYbdwoiPjvf/8r5eXlJo8T7dxzzxU32JkkeASq+tHc2ob51w1o5t8gQxNy4MCB5oGcFpqZN998s2k6oikOaFZ+9tlnphn6/vvvm/zaFVdcYZqoiTjhhBNk0KBB8oc//EH27NljjwYfmtrIYfuFLyKFG3jtlj/hg4cPXPQDyeeIeP3rooMcxCqHps+J8HuZpQI3VvBB3LFjh6xatcrkHfHl0LNnTznmmGPk888/t88UkyPDl4DbnLRHYuvcubO8+eab5r08//zzzd/OBm3btvVVdxVfBDRcRIl+o/oZPmToSPzXv/7VHmnw1ltvmTt1p5xyij1yZCi7oN41xTXx6aefmse///1vefrpp+Xhhx82NVm36WkeuLmCGwEoAzzmzJljasgRKB909fjNb35jbsJ88cUX5oEbDqgpR8OdUgQ+BDcESNztzAZ++nL0RUDDbfk1a9bYveDDnbPx48ebD9iiRYtk06ZN8uc//1l+/etfy9ixY02wayncecKHHc0u3BGMNMWCAM1qBHc8cHd3ypQpcs0118jzzz9vfo6aL7ZRs+rWrZt53pYtW+THP/6x+XkEmqm//e1v5ZlnnjHdOlCDRkCLVXMuLi6WZcuWmab+Oeecc1jQCyJf1fbd/6znIbE7d+5cu+cvLbnLiTtoTeEmwT333OP06dPHJKN79epl7q7hrlxErN/FzQa8revWrTP727Ztc4YPH24S4Th+//33m+NELXXrrbfaLe/zzdAnP/dFI/Iz9PlDU90PfHP7EE2KsrIyu0dE6YA8JfKMfuGbgOY2r+RPf/qT3SOidEDuGjlsv/BNQMPdPfQ3+uijj+wRImptr7zyysEhYn7gm4AGGFP33HPPcUZaojTB2OIePXrYPe/zVUCDMWPGyIMPPmj3iKi1IGeN3LWf+C6g9erVy/T/+eMf/2iPEFFrQM4auWs/8V1AgzPPPNP0AscUMESkD7lq5KyRu/YTX0/B/eKLL5o5wDBTqRdt3LhRLrhgpHTocIw9Elu8UV0YqlNZuc+M1ywu7iAHDuyWa6+9Uu6663b7jAYff/yxXHPNdW6Q726PxBb/PGH3PPvd8+S65ymVHTs2yqRJ42TcuF/YZzTA1M0/+MH10q1bb3sktnjnCYUwxrJc8vLypajoKNmyZa08+uj9Zg6yaEuWLJP/+Z9bpWvX4+yR2OKfp9Y9T4V7njbuedq75/lcnnpqwWEz9z711GKZNWuOlJR0tkcOh09HvJFjdXU1UlNTKfn5BdK2bbF7njWyfPmLZqSBnyFHPX36dDPI3298v6bAe++9J2+88YZMnjw57iDvTEEOYtSoBdK580zJzW3nPlJbOqyiokyGDFks8+c3vtBeffVVueWWt6VLl9vccxS7j9S+VXfvXi6XXfbJYXPEY1bXu+5a7waaMW6waO8GwNQmN/zqq8UyevQ+N3COsUcazJv3mDz2mOMGzmvd85S450mtH9TOnfNl6tRS98vgWnukwe233+3W8gdJaekw9zylJqCnYvfue9wAPcxMDOln6ET7ve99z6R3/MaXTc5oZ511lltr+IFMmDDBzCbqNW3alLiBtmPKwaw5mDK6oKDUnif1JkJeXrHdOlybNh3NeVINZs1BjRTnaDhP63XqRAA7dB7ffxRUIDeNHLUfgxkE4l3E7BRYGAPTJmMlIEwb7BXhsO5aCFVVlXaLSBdy0shNI0ftV4H5WsIkkJiJ4vLLLzeLZWAqGS9MmxMO19gtHchDBV2cKd6S1txlgIWsNWG+fj964oknzOfF7yuEBa6efeKJJ5q5rTC9C6bgQRXaC4EtCNq1a2e3dMRr2mqvO9J8hd3XKeSUoTUza9YsMxsvFpjxu8AmDs4++2x56KGHzCylWNEHiU7MhdVS2R4EY90r0l7hKCfHWzdxsg1yzsg9IweNXHQQBD4TijtOGFmAO1yYDx6T+WGyxJqa5puCGMOG5DRW4sYspcmuC6q9HEK8OFtbq9vUKS/333qT1DKolSHXjJwzcs/IQQdF4ANaBMajYUZTBDfMXop+NpjnacGCBbJ+/Xr7rMYwnzpycZgFFW86vsXw+/GeH4v2zCvx+l4FSbx1EpIX+zLXbtp6fYgxWh24npFjRq4ZOWe/L0DUVNYEtAh8WDAfPFYuRzP0vPPOM4vRjhs3TqZNmyZLly49rGmK1bExSBerBiEIojmLAIfa2+uvv25WYiI9JSUldktHXl7sKcu146ZXe3QikCGXjJwycsvIMSPXHERZF9CawlxPyLGh5oXVgZD4RgdSzDEfq/sHjm3btk3WrVt3sPbWp08fsxgHZtXFKudBVl+vG7yP1PSnxhLJ7eKLGV/auL6RS0ZOGV/GQZb1AS0agtkFF1xgamE33nijHGnkAX6O5egKCwvNhTJ48GAT2CL0q/Px26/paj7V1+suspJsbjJboHyQw0VrAK0L5Habgy8I5IiRK0bOGLljfFn7ffRCSzGgNSNWLgeLBh977LEmn4Zvv3fffdes/INOibhbhLxbRCKrM7UEhhvFky3NJ034ItKUm3tordVUIEeLIIRrDKkNtALQGoi+tqLh+cgF44sYuWHkiPH7yBn7aS4zDQxozUDXBdTCsDgtLqwbbrjBLIuGAIZAhrwblokjf4oXIJKV7LAz5GCRi0UtDNcZavsITsjZIneLHG40NCWR60XOF9cgcsDIBeMLFrlh5Ij1b6z4AwNaHLjYu3bterAWhsVnkVdDk9RvU6poSldNMBw+YLd0NA0KmYZcK3KuSFEgBxuphSE3ixxtvPwtrkHkeJEeQc4XNTHkyPw0739rYkCLY/jw4Wb6Hz/UwvRrGvFHBKSvq4Nux2avTSqDQIacK2pjaPoiF9uSnC1yu6i94YtVe+RGEDCgBYB+Lkg5atFh8CWEnCtyr5EUBloDyJshR4tcbVPZ2oxMBANaK6ut1W3qlJf7c/CzVzmO7swsyS7gg1YAWgORm0zI1SJni5wacrionfl86sK0YEBrZbwImxO/xnGE1lfC4sWZcLjCbumorEx9eifkaNGkRL4MudtI7Q05Xe30QtAwoFGLlZaW2i0d+fnxRwRod+Hz8/dKpPaGnC5yuxQfA1pA1NfrDiSsq+NwLvIfBrRWlq7B6aGQ7ky21dW6IwKI0oEBrZWxB3/itPv55ebGzjtpdyfkHAWZx4BGnoM+WZpac4Ea8hYGtIBIV00wFNK9K1herjsigLIbA1or0u7wmpcXv+ai3c0hxsgbo75et9+W43C9B9LDgNaKtPsM5eRk7xjS1qA/G4ruxJSUOAY08iTH0Z1rPNZgb/356jg0KdMY0Cgh2t1Q4jVtw+Fyu6WjokI390fexIAWAPpz8McfEaAd0LJ8tUBSxoDWyrST6LFWTucsDEQNGNBaWV2dblOnpkZ3REC2014jgU3bzGJAoxbTXzk9/l3bdPXidxzd7v2xbj5Q+jCgUYtpz5DaXL86omQwoLWy9PXg122KVlXp3mUkSgcGtFaWrtk2wmHd6YPC8U4UMNpd0bKk2DyLAY08p337+OuPJiMvL/6IAO0hYwxomcWARgnRHnsZqyaYp1ytzcnhZZ4t+E4HhHbTKV6H17o63dkxKiuZqyM9DGitSHvwczrn4M+GHvz6NUHl9isljAGtFXHws7fp5+qK7RZlCgMaeVI4XG23dHCNhOzAgBYAWIRWU3Mrp6dvvcwau6WDq1hlBwa0ACgu1m3q5ObGHxHAcfDkZQxorayuTrepw8Hp3saV8jOLAa2VhcPag591RwR4Vbp68IdC++yWjv3799stygQGNGox/cHp8e8ysgc/JYMBLTB0mzqxRgRoTx/khjT7L5EOBrRWlq7ZNmpqdJs6lZVcL5P8hwGtlbEHf+K0OyTn5MSvCaarGwqlBwMaeY7+epnxc3XaXzi8yZlZDGiUEO0Or7W1uiMCKLvlOOw406r69TtPevZ8y+6lbufO86Ws7E2712Dfvn0ydOgPpUePpfZIatCVoa7uh/Lee43/3saNG+XCC6e653nGHklNdfVG6dRpqixb1vjvlZWVyY9+tNj92Wx7JDUVFWUyZMhimT+/8d9btmyZTJtW5p5nij2Sml27lsnll5fJzJmx/966devklVdekb1795ruHVh/AKM8Iv9CbW2tFEQtqICfYVUvdJ7u0KHDwUe3bt3k2GOPlWOOOabR87NdVgc0XDzbtm2TL7/8Ur766itzoUUeWL0HRRM9rCj6Ymt6MWJtTFxo3/72t6VPnz7mOTBgwKVy9NE6gQbKyy+VDz5o/PcQ0M4884fSvTsDWizxAtobb7whEyZ8oBbQ9u59U0aOfD9uQItcW6WlpeZaSWT5wcrKSvO7eK/xL67XzZs3m+u3zibucL0WFRXJiSeeaB4DBw5UH0XidYEPaAhMq1atks8//9w8qqqqDl5I6IaAb7jjjjvOfOPhIotcbIn0uUIRRi42/C4eEQxo8WU6oK1cuVLGjl2pFtD27Vspl1yyMm5AS4fq6mpZs2aNudZx3eP6x/Xeq1cvOeOMM9xyGKI+bZKXBCqgYfbTjz76yP3Af2A+fHhp+IbCNxW+sU466SRp27atfXZ6BC2gjRgx1f0S0AtoHTtOlZdfPjygjRq10P2SecQeSQ0C2kknzZdFix6zRxoEMaDFg/fuH//4h3z88cfmc4JWxIUXXignnHCCfUYw+P6mwBdffCELFiyQyZMny5133mneuMsuu0zuvfdeue+++2TGjBly1VVXyamnnpr2YJYuaGZoam5er3QNSdKe6jvboYZ29dVXy913320+GxdddJGsWLFCbrvtNvM5QX4vCHwZ0FD4eBPwZuBNwZuDNwlvFt40vHlBFatCrZ0U5syrwde3b18ZPXq0+RzdcMMNsnz5clMpmD9/vhw44N9O1b4JaChkFDYKHYWPNwFvBt4UvDleVV2t3YOfg5811dfr9oT147xrnTt3lptuuslUCi6++GKZN2+e3HPPPbJ9+3b7DP/wfEBDoaJwUcgobBQ6Ch9vgj8E555LInflWqK51Zi089ahkN1oQnuBZr/PjIvcGlI3P//5z+Xpp582KZsNGzbYn3qfZwMaChGFiUJF4aKQo7tDUPqha4qm5tbLZA/+zOrUqZNMnDhRpkyZIs8++6zMmTPHdFvyOs8FNBQaCg+FiMJEoaJwqXmhkO7FVlenOyKA/Ak3nCZNmiRXXHGFSfe8/vrr9ife5KmAhsJCoaHwUIjad+8yIV2D00Mh3aZOtgxJUm5FB3byAHTveOCBB0wuG5WM8nJvrqfqiYCGwkEhobBQaEHrG0OJKSwstFs6cnPjd9fRnuItXq4uKK688kpT2UAPg//85z/2qHdkvGMtCuWRRx6R6dOnm177QdOuXQfp2/cJu4em3B67FRtqdPF6YYTDVbJ27e1SXX34t2N+foH079/QQRV9uI40tTSS7vE+zOFwpWzdeq/s2rXVHmmADry9ep0qPXvOMfuOE3bP0/xd1+bOU1Oz1a2Fr5BPPnnHHmmAvoSnnz5CevS4y+w7Tsg9T/NdCTBCLWqUWiPl5avd92CD2wL4P3ukATrWfve749zrrqEjbH19rfvaK8x2PHgt8W5Y7Njxmpx/fmd55pmF9khwYcjfHXfcISNGjHBf8/n2aANcJ5gxRX9d2iNLS0Crd+vhqH1hWFG0N99803TBmDlzphkPGURPPvlkzGRqomP5IlCG6HfX1OOPP263DsHfjx6GlYguXbocdqHideD1NIULt+l721LoM3jmmWfavQaosS9evNjuHYIhO8nemECtf/DgwXavAcZBLlmyxO4dgiFxyS5C3L9/fxk0aJDdCz50nTr55JPlkksuMYP90Rvh7bfflp07d2akJ0JaAtquXbvMB+Tcc8+V8ePHy8iRI+Xll1+Wzz77zFRdich/EDr+/ve/y5gxY8wEDxgkj4oLxkWj9tuvXz/7zPRJS0Bbu3atDBs2zMwQgKoovgEx9Qk6yn7jG99IqqZCRJnz4YcfytChQ6Vjx46ye/due7QBamaYJgmD4dMtLY3cPXv2mDY3IIKjADAA+fLLLzfNCBQOEfnH17/+dTnttNMOC2aA1AQ+85mQtoAWK4+EwkChoHCIyD9QEXnxxRele/fu9sghmKIr8AENL7IpFAYKJcjzMxEFFW7ooBM8mp3R0BrDDZdMSEtAw4uLNDkjUAgojCDPjEEUdNdee60MHz78sBlftmzZYrfSKy0BremLw4tHIaAwiMjfnnrqKTPrczTcAMyEtAS0pi8OLx6FQET+h+nqn3vuOTn66KPtEXQy3mG30istAS36xeFF48UnMmc/EXkbbuz98pe/PLimaqy7n+mQloAWeXF4sXjRvKtJFDwYCjVgwADTrxTL9GVCWgIaXhxeJF4sXjQRBQ8+4y+88IL06NEjY7NxpGWkQO/evc1KM1iRCcMiiCi4li5dahYqSkNoOUxaamiYPQErMzGYEQXfpZdeKtOmTbN76ZWWGtrtt98us2bNsntEFHQ1NTXq89q1RFoCWqZeHBFll7QENCIKFnTFQiqpJTCOu6Ki+YkzYeDAgSlP8ppwQMMwplWrVtm9+IqLi1u8AC6GP3Xt2tXuEZHXzZ37kMye/b/Ss+fFZh9RpO4IS5zm5LSR/PzYE2du2LBIHn10asqjhxIOaJhJdOzY2dK794/skcZCoXL3xTX/yjCNcWQKtE2bXpWpU6+XiRNvbjhARJ734IPzZeHCUunWTWf44s6d8904UJqZgDZ79j7p0mWMPZKar75aLKNH75Nx43T+HhG1Pq8GtLR02yAiSgcGNCJKmPaaRjHmf01KUgFN6+QRAV3wiSiwMrBCXYt44r/l1cIhIn9hKCGiwGBAI6KEtW3b1m7pyM3VmR8xqYCmdfII7cIhotalPZQRnW41JBXQtE4ewXGeRKSBTU4iCgwGNCIKDAY0IkrKkcZsJwqzcqQq4YCmcdJo2oVCROlRX19pt3RUVVXZreQlHNA0ThpNu1CIKHuxyUlEgcGARkSeoDF3dsIBTeOkROR/LZyQusWONONtSyQc0DROGk27UIgoe7HJSUSBwYBGRIHBgEZECSspKbFbOvLzS+1WapIKaFonj9AuHCJqXTmRZds8xhM1NK8WDhH5C5ucRBQYDGhEFBgMaESUlHBYdxx2RUWF3UpewgFN46TRtAuFiNJDe6acUChkt5KXcEDTOGk0Th9ERFrY5CSiwGBAI6KkaC8QHg7bjRQk/F/SOGk0rppO5E/5+XZDSSACmnahEFH2Yv2IiAKDAY2IEpav3LQK1Mrp2oVDRK2ruLjYbunIy2tnt1KTVEDTOnmEduEQUXZik5OIAoMBjYgCgwGNiDzBcertVvISDmgaJyUi/6ut3We3dJSXH7BbyUs4oGmcNJp2oRBR9mKTk4gCgwGNiAKDAY2IktJGt3+91NbajRQkHNA0ThpNu1CIKD28uFhbxmtoXMGOiLSwyUlEgcGARkQJKyoqsls6cnMzODhd6+QR2oVDRK2roKDAbunIzc3g9EFaJ4/QLhwiyk5schJRYDCgEVFgMKARUVLq63U7pdbW1tit5CUc0DROGk27UIgoPUKhKrulo6am2m4lL+GApnHSaNqFQkTZi01OIgoMBjQiSor2sEXHsRspSDigaZw0GsdyEvmT9uqToZDdSEHCAU3jpNG4JCcRaWGTk4gCgwGNiDxAJ/eUZEBj4osom5WUlNgtHXl5On8vx3HZ7RYZNeoXsnHjFGnbtpc9kppdu34hL700WXr37m2PEJHXbd68WXr27CmnnPIte6Qx3OzLjVNdqq4+IOFwyI0h7d1A1jDRRVXVfhk+/GxZuHCe2U9WwgFt9Ojx8sYb70pRUUNEDYfr3P9gufsfy3f/g0eZY03V18e/O7p69QrZtGmTHHfccfYIEVFyEg5oRERexZsCRBQYDGhEFBgMaEQUGAxoRBQYDGhEFBgMaEQUGAxoRBQYDGhEFBAi/w/W56D6Uw33tQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "Image('http://www.codeproject.com/KB/recipes/669131/deque.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how we can both add and remove from the front and the back of the Deque. In the next lecture, we will implement our own Deque class!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/Implementation of Deque.ipynb b/03-Stacks, Queues and Deques/07-Implementation of Deque.ipynb similarity index 80% rename from Stacks, Queues and Deques/Implementation of Deque.ipynb rename to 03-Stacks, Queues and Deques/07-Implementation of Deque.ipynb index 9016eaa9..68822c47 100644 --- a/Stacks, Queues and Deques/Implementation of Deque.ipynb +++ b/03-Stacks, Queues and Deques/07-Implementation of Deque.ipynb @@ -24,9 +24,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Deque:\n", @@ -54,10 +52,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "d = Deque()" @@ -65,10 +61,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "d.addFront('hello')" @@ -76,10 +70,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "d.addRear('world')" @@ -87,10 +79,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { @@ -98,7 +88,7 @@ "2" ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -109,10 +99,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -123,15 +111,13 @@ } ], "source": [ - "print d.removeFront() + ' ' + d.removeRear()" + "print(d.removeFront() + ' ' + d.removeRear())" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "data": { @@ -139,7 +125,7 @@ "0" ] }, - "execution_count": 15, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -158,23 +144,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/01-Implement-a-Stack/01-Implement a Stack - SOLUTION.ipynb similarity index 84% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/01-Implement-a-Stack/01-Implement a Stack - SOLUTION.ipynb index cb9fd690..7a33b782 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/01-Implement-a-Stack/01-Implement a Stack - SOLUTION.ipynb @@ -11,10 +11,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Stack(object):\n", @@ -41,23 +39,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/01-Implement-a-Stack/01-Implement a Stack .ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/01-Implement-a-Stack/01-Implement a Stack .ipynb new file mode 100644 index 00000000..06953061 --- /dev/null +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/01-Implement-a-Stack/01-Implement a Stack .ipynb @@ -0,0 +1,57 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implement a Stack \n", + "\n", + "A very common interview question is to begin by just implementing a Stack! Try your best to implement your own stack!\n", + "\n", + "It should have the methods:\n", + "\n", + "* Check if its empty\n", + "* Push a new item\n", + "* Pop an item\n", + "* Peek at the top item\n", + "* Return the size" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Stack(object):\n", + " \n", + " \n", + " # Fill out the Stack Methods here\n", + " pass" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/02-Implement-a-Queue/02-Implement a Queue - SOLUTION.ipynb similarity index 84% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/02-Implement-a-Queue/02-Implement a Queue - SOLUTION.ipynb index a400bb3d..fd5d7571 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/02-Implement-a-Queue/02-Implement a Queue - SOLUTION.ipynb @@ -12,9 +12,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Queue:\n", @@ -37,23 +35,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/02-Implement-a-Queue/02-Implement a Queue.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/02-Implement-a-Queue/02-Implement a Queue.ipynb new file mode 100644 index 00000000..ae0cda90 --- /dev/null +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/02-Implement-a-Queue/02-Implement a Queue.ipynb @@ -0,0 +1,51 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implement a Queue\n", + "\n", + "It's very common to be asked to implement a Queue class! The class should be able to do the following:\n", + "\n", + "* Check if Queue is Empty\n", + "* Enqueue\n", + "* Dequeue\n", + "* Return the size of the Queue" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Queue(object):\n", + " pass" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/03-Implement-a-Deque/03-Implement a Deque - SOLUTION.ipynb similarity index 86% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/03-Implement-a-Deque/03-Implement a Deque - SOLUTION.ipynb index af87180e..cb7750cd 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/03-Implement-a-Deque/03-Implement a Deque - SOLUTION.ipynb @@ -12,9 +12,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Deque:\n", @@ -43,23 +41,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/03-Implement-a-Deque/03-Implement a Deque .ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/03-Implement-a-Deque/03-Implement a Deque .ipynb new file mode 100644 index 00000000..a7c0e1da --- /dev/null +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/03-Implement-a-Deque/03-Implement a Deque .ipynb @@ -0,0 +1,51 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implement a Deque \n", + "\n", + "Finally, implement a Deque class! It should be able to do the following:\n", + "\n", + "* Check if its empty\n", + "* Add to both front and rear\n", + "* Remove from Front and Rear\n", + "* Check the Size" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Deque(object):\n", + " pass" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/04-Balanced-Parantheses-Check/04-Balanced Parentheses Check - SOLUTION.ipynb similarity index 88% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/04-Balanced-Parantheses-Check/04-Balanced Parentheses Check - SOLUTION.ipynb index a4cf7848..cc5a4c16 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/04-Balanced-Parantheses-Check/04-Balanced Parentheses Check - SOLUTION.ipynb @@ -28,10 +28,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def balance_check(s):\n", @@ -74,10 +72,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -85,7 +81,7 @@ "True" ] }, - "execution_count": 13, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -96,10 +92,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -107,7 +101,7 @@ "True" ] }, - "execution_count": 16, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -118,10 +112,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { @@ -129,7 +121,7 @@ "False" ] }, - "execution_count": 17, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -147,10 +139,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -172,7 +162,7 @@ " assert_equal(sol('[](){([[[]]])}('),False)\n", " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", " assert_equal(sol('[[[]])]'),False)\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", " \n", "# Run Tests\n", "\n", @@ -190,23 +180,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/04-Balanced-Parantheses-Check/04-Balanced Parentheses Check .ipynb similarity index 53% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/04-Balanced-Parantheses-Check/04-Balanced Parentheses Check .ipynb index a4cf7848..d88791ba 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/04-Balanced-Parantheses-Check/04-Balanced Parentheses Check .ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Balanced Parentheses Check - SOLUTION\n", + "# Balanced Parentheses Check \n", "\n", "## Problem Statement\n", "\n", @@ -15,15 +15,7 @@ "\n", "## Solution\n", "\n", - "This is a very common interview question and is one of the main ways to check your knowledge of using Stacks! We will start our solution logic as such:\n", - "\n", - "First we will scan the string from left to right, and every time we see an opening parenthesis we push it to a stack, because we want the last opening parenthesis to be closed first. (Remember the FILO structure of a stack!)\n", - "\n", - "Then, when we see a closing parenthesis we check whether the last opened one is the corresponding closing match, by popping an element from the stack. If it’s a valid match, then we proceed forward, if not return false. \n", - "\n", - "Or if the stack is empty we also return false, because there’s no opening parenthesis associated with this closing one. In the end, we also check whether the stack is empty. If so, we return true, otherwise return false because there were some opened parenthesis that were not closed. \n", - "\n", - "Here's an example solution:" + "Fill out your solution below:" ] }, { @@ -36,48 +28,13 @@ "source": [ "def balance_check(s):\n", " \n", - " # Check is even number of brackets\n", - " if len(s)%2 != 0:\n", - " return False\n", - " \n", - " # Set of opening brackets\n", - " opening = set('([{') \n", - " \n", - " # Matching Pairs\n", - " matches = set([ ('(',')'), ('[',']'), ('{','}') ]) \n", - " \n", - " # Use a list as a \"Stack\"\n", - " stack = []\n", - " \n", - " # Check every parenthesis in string\n", - " for paren in s:\n", - " \n", - " # If its an opening, append it to list\n", - " if paren in opening:\n", - " stack.append(paren)\n", - " \n", - " else:\n", - " \n", - " # Check that there are parentheses in Stack\n", - " if len(stack) == 0:\n", - " return False\n", - " \n", - " # Check the last open parenthesis\n", - " last_open = stack.pop()\n", - " \n", - " # Check if it has a closing match\n", - " if (last_open,paren) not in matches:\n", - " return False\n", - " \n", - " return len(stack) == 0" + " pass" ] }, { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -97,9 +54,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -119,9 +74,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -148,9 +101,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -172,7 +123,7 @@ " assert_equal(sol('[](){([[[]]])}('),False)\n", " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", " assert_equal(sol('[[[]])]'),False)\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", " \n", "# Run Tests\n", "\n", @@ -190,23 +141,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/05-Implement-a-Queue-Using-Two-Stacks/05-Implement a Queue -Using Two Stacks - SOLUTION.ipynb similarity index 86% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/05-Implement-a-Queue-Using-Two-Stacks/05-Implement a Queue -Using Two Stacks - SOLUTION.ipynb index e66de679..7e63cb58 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/05-Implement-a-Queue-Using-Two-Stacks/05-Implement a Queue -Using Two Stacks - SOLUTION.ipynb @@ -11,10 +11,8 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "stack1 = []\n", @@ -34,10 +32,8 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "class Queue2Stacks(object):\n", @@ -72,10 +68,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -95,11 +89,11 @@ "\"\"\"\n", "q = Queue2Stacks()\n", "\n", - "for i in xrange(5):\n", + "for i in range(5):\n", " q.enqueue(i)\n", " \n", - "for i in xrange(5):\n", - " print q.dequeue()" + "for i in range(5):\n", + " print(q.dequeue())" ] }, { @@ -112,23 +106,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/05-Implement-a-Queue-Using-Two-Stacks/05-Implement a Queue -Using Two Stacks .ipynb similarity index 50% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb rename to 03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/05-Implement-a-Queue-Using-Two-Stacks/05-Implement a Queue -Using Two Stacks .ipynb index e66de679..a77bcfe1 100644 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb +++ b/03-Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/05-Implement-a-Queue-Using-Two-Stacks/05-Implement a Queue -Using Two Stacks .ipynb @@ -4,19 +4,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Implement a Queue - Using Two Stacks - SOLUTION\n", + "# Implement a Queue - Using Two Stacks\n", "\n", "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." ] }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ + "# Uses lists instead of your own Stack class.\n", "stack1 = []\n", "stack2 = []" ] @@ -27,17 +26,13 @@ "source": [ "## Solution\n", "\n", - "The key insight is that a stack reverses order (while a queue doesn't). A sequence of elements pushed on a stack comes back in reversed order when popped. Consequently, two stacks chained together will return elements in the same order, since reversed order reversed again is original order.\n", - "\n", - " We use an in-stack that we fill when an element is enqueued and the dequeue operation takes elements from an out-stack. If the out-stack is empty we pop all elements from the in-stack and push them onto the out-stack. " + "Fill out your solution below:" ] }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class Queue2Stacks(object):\n", @@ -45,20 +40,18 @@ " def __init__(self):\n", " \n", " # Two Stacks\n", - " self.instack = []\n", - " self.outstack = []\n", + " self.stack1 = []\n", + " self.stack2 = []\n", " \n", " def enqueue(self,element):\n", " \n", - " # Add an enqueue with the \"IN\" stack\n", - " self.instack.append(element)\n", + " # FILL OUT CODE HERE\n", + " pass\n", " \n", " def dequeue(self):\n", - " if not self.outstack:\n", - " while self.instack:\n", - " # Add the elements to the outstack to reverse the order when called\n", - " self.outstack.append(self.instack.pop())\n", - " return self.outstack.pop() " + " \n", + " # FILL OUT CODE HERE\n", + " pass " ] }, { @@ -72,34 +65,20 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "\"\"\"\n", "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", "\"\"\"\n", "q = Queue2Stacks()\n", "\n", - "for i in xrange(5):\n", + "for i in range(5):\n", " q.enqueue(i)\n", " \n", - "for i in xrange(5):\n", - " print q.dequeue()" + "for i in range(5):\n", + " print(q.dequeue())" ] }, { @@ -112,23 +91,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/Linked List Overview.ipynb b/04-Linked Lists/.ipynb_checkpoints/01-Linked List Overview-checkpoint.ipynb similarity index 84% rename from Linked Lists/Linked List Overview.ipynb rename to 04-Linked Lists/.ipynb_checkpoints/01-Linked List Overview-checkpoint.ipynb index 16a79138..c8a3524a 100644 --- a/Linked Lists/Linked List Overview.ipynb +++ b/04-Linked Lists/.ipynb_checkpoints/01-Linked List Overview-checkpoint.ipynb @@ -20,23 +20,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/.ipynb_checkpoints/Singly Linked Lists-checkpoint.ipynb b/04-Linked Lists/.ipynb_checkpoints/02-Singly Linked Lists-checkpoint.ipynb similarity index 78% rename from Linked Lists/.ipynb_checkpoints/Singly Linked Lists-checkpoint.ipynb rename to 04-Linked Lists/.ipynb_checkpoints/02-Singly Linked Lists-checkpoint.ipynb index f0f1677d..4da872d3 100644 --- a/Linked Lists/.ipynb_checkpoints/Singly Linked Lists-checkpoint.ipynb +++ b/04-Linked Lists/.ipynb_checkpoints/02-Singly Linked Lists-checkpoint.ipynb @@ -14,23 +14,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/.ipynb_checkpoints/Singly Linked List Implementation-checkpoint.ipynb b/04-Linked Lists/.ipynb_checkpoints/03-Singly Linked List Implementation-checkpoint.ipynb similarity index 84% rename from Linked Lists/.ipynb_checkpoints/Singly Linked List Implementation-checkpoint.ipynb rename to 04-Linked Lists/.ipynb_checkpoints/03-Singly Linked List Implementation-checkpoint.ipynb index efa1ee5c..57ec8b4a 100644 --- a/Linked Lists/.ipynb_checkpoints/Singly Linked List Implementation-checkpoint.ipynb +++ b/04-Linked Lists/.ipynb_checkpoints/03-Singly Linked List Implementation-checkpoint.ipynb @@ -13,10 +13,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Node(object):\n", @@ -36,10 +34,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "a = Node(1)\n", @@ -49,10 +45,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "a.nextnode = b" @@ -60,10 +54,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "b.nextnode = c" @@ -98,23 +90,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/Doubly Linked Lists.ipynb b/04-Linked Lists/.ipynb_checkpoints/04-Doubly Linked Lists-checkpoint.ipynb similarity index 77% rename from Linked Lists/Doubly Linked Lists.ipynb rename to 04-Linked Lists/.ipynb_checkpoints/04-Doubly Linked Lists-checkpoint.ipynb index 929355be..a4e20ed5 100644 --- a/Linked Lists/Doubly Linked Lists.ipynb +++ b/04-Linked Lists/.ipynb_checkpoints/04-Doubly Linked Lists-checkpoint.ipynb @@ -12,23 +12,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/.ipynb_checkpoints/Doubly Linked List Implementation-checkpoint.ipynb b/04-Linked Lists/.ipynb_checkpoints/05-Doubly Linked List Implementation-checkpoint.ipynb similarity index 84% rename from Linked Lists/.ipynb_checkpoints/Doubly Linked List Implementation-checkpoint.ipynb rename to 04-Linked Lists/.ipynb_checkpoints/05-Doubly Linked List Implementation-checkpoint.ipynb index d409f9d3..5d5a004b 100644 --- a/Linked Lists/.ipynb_checkpoints/Doubly Linked List Implementation-checkpoint.ipynb +++ b/04-Linked Lists/.ipynb_checkpoints/05-Doubly Linked List Implementation-checkpoint.ipynb @@ -12,9 +12,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class DoublyLinkedListNode(object):\n", @@ -36,9 +34,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "a = DoublyLinkedListNode(1)\n", @@ -49,9 +45,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Setting b after a\n", @@ -62,9 +56,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Setting c after a\n", @@ -89,23 +81,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/.ipynb_checkpoints/Linked List Overview-checkpoint.ipynb b/04-Linked Lists/01-Linked List Overview.ipynb similarity index 84% rename from Linked Lists/.ipynb_checkpoints/Linked List Overview-checkpoint.ipynb rename to 04-Linked Lists/01-Linked List Overview.ipynb index 16a79138..c8a3524a 100644 --- a/Linked Lists/.ipynb_checkpoints/Linked List Overview-checkpoint.ipynb +++ b/04-Linked Lists/01-Linked List Overview.ipynb @@ -20,23 +20,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/Singly Linked Lists.ipynb b/04-Linked Lists/02-Singly Linked Lists.ipynb similarity index 78% rename from Linked Lists/Singly Linked Lists.ipynb rename to 04-Linked Lists/02-Singly Linked Lists.ipynb index f0f1677d..4da872d3 100644 --- a/Linked Lists/Singly Linked Lists.ipynb +++ b/04-Linked Lists/02-Singly Linked Lists.ipynb @@ -14,23 +14,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/Singly Linked List Implementation.ipynb b/04-Linked Lists/03-Singly Linked List Implementation.ipynb similarity index 84% rename from Linked Lists/Singly Linked List Implementation.ipynb rename to 04-Linked Lists/03-Singly Linked List Implementation.ipynb index efa1ee5c..57ec8b4a 100644 --- a/Linked Lists/Singly Linked List Implementation.ipynb +++ b/04-Linked Lists/03-Singly Linked List Implementation.ipynb @@ -13,10 +13,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Node(object):\n", @@ -36,10 +34,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "a = Node(1)\n", @@ -49,10 +45,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "a.nextnode = b" @@ -60,10 +54,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "b.nextnode = c" @@ -98,23 +90,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/.ipynb_checkpoints/Doubly Linked Lists-checkpoint.ipynb b/04-Linked Lists/04-Doubly Linked Lists.ipynb similarity index 77% rename from Linked Lists/.ipynb_checkpoints/Doubly Linked Lists-checkpoint.ipynb rename to 04-Linked Lists/04-Doubly Linked Lists.ipynb index 929355be..a4e20ed5 100644 --- a/Linked Lists/.ipynb_checkpoints/Doubly Linked Lists-checkpoint.ipynb +++ b/04-Linked Lists/04-Doubly Linked Lists.ipynb @@ -12,23 +12,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/Doubly Linked List Implementation.ipynb b/04-Linked Lists/05-Doubly Linked List Implementation.ipynb similarity index 84% rename from Linked Lists/Doubly Linked List Implementation.ipynb rename to 04-Linked Lists/05-Doubly Linked List Implementation.ipynb index d409f9d3..5d5a004b 100644 --- a/Linked Lists/Doubly Linked List Implementation.ipynb +++ b/04-Linked Lists/05-Doubly Linked List Implementation.ipynb @@ -12,9 +12,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class DoublyLinkedListNode(object):\n", @@ -36,9 +34,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "a = DoublyLinkedListNode(1)\n", @@ -49,9 +45,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Setting b after a\n", @@ -62,9 +56,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Setting c after a\n", @@ -89,23 +81,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb b/04-Linked Lists/Linked Lists Interview Problems/01-Singly-Linked-List-Cycle-Check/01-Singly Linked List Cycle Check - SOLUTION.ipynb similarity index 91% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb rename to 04-Linked Lists/Linked Lists Interview Problems/01-Singly-Linked-List-Cycle-Check/01-Singly Linked List Cycle Check - SOLUTION.ipynb index f0752ac6..7c614eea 100644 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb +++ b/04-Linked Lists/Linked Lists Interview Problems/01-Singly-Linked-List-Cycle-Check/01-Singly Linked List Cycle Check - SOLUTION.ipynb @@ -18,9 +18,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Node(object):\n", @@ -48,10 +46,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "def cycle_check(node):\n", @@ -84,10 +80,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -129,7 +123,7 @@ " assert_equal(sol(a),True)\n", " assert_equal(sol(x),False)\n", " \n", - " print \"ALL TEST CASES PASSED\"\n", + " print(\"ALL TEST CASES PASSED\")\n", " \n", "# Run Tests\n", "\n", @@ -147,23 +141,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/04-Linked Lists/Linked Lists Interview Problems/01-Singly-Linked-List-Cycle-Check/01-Singly Linked List Cycle Check.ipynb b/04-Linked Lists/Linked Lists Interview Problems/01-Singly-Linked-List-Cycle-Check/01-Singly Linked List Cycle Check.ipynb new file mode 100644 index 00000000..566656cf --- /dev/null +++ b/04-Linked Lists/Linked Lists Interview Problems/01-Singly-Linked-List-Cycle-Check/01-Singly Linked List Cycle Check.ipynb @@ -0,0 +1,148 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Singly Linked List Cycle Check \n", + "\n", + "## Problem\n", + "\n", + "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", + "\n", + "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", + "\n", + "You've been given the Linked List Node class code:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "class Node(object):\n", + " \n", + " def __init__(self,value):\n", + " \n", + " self.value = value\n", + " self.nextnode = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solution\n", + "\n", + "Fill out your solution:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def cycle_check(node):\n", + "\n", + " pass #Your function should return a boolean" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test Your Solution" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "AssertionError", + "evalue": "None != True", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 36\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTestCycleCheck\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 37\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcycle_check\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mtest\u001b[0;34m(self, sol)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0massert_equal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msol\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 30\u001b[0m \u001b[0massert_equal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msol\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/unittest/case.py\u001b[0m in \u001b[0;36massertEqual\u001b[0;34m(self, first, second, msg)\u001b[0m\n\u001b[1;32m 910\u001b[0m \"\"\"\n\u001b[1;32m 911\u001b[0m \u001b[0massertion_func\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getAssertEqualityFunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfirst\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 912\u001b[0;31m \u001b[0massertion_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfirst\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 913\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 914\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0massertNotEqual\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfirst\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.8/unittest/case.py\u001b[0m in \u001b[0;36m_baseAssertEqual\u001b[0;34m(self, first, second, msg)\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0mstandardMsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'%s != %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0m_common_shorten_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfirst\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 904\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_formatMessage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstandardMsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 905\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfailureException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 906\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 907\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0massertEqual\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfirst\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAssertionError\u001b[0m: None != True" + ] + } + ], + "source": [ + "\"\"\"\n", + "RUN THIS CELL TO TEST YOUR SOLUTION\n", + "\"\"\"\n", + "from nose.tools import assert_equal\n", + "\n", + "# CREATE CYCLE LIST\n", + "a = Node(1)\n", + "b = Node(2)\n", + "c = Node(3)\n", + "\n", + "a.nextnode = b\n", + "b.nextnode = c\n", + "c.nextnode = a # Cycle Here!\n", + "\n", + "\n", + "# CREATE NON CYCLE LIST\n", + "x = Node(1)\n", + "y = Node(2)\n", + "z = Node(3)\n", + "\n", + "x.nextnode = y\n", + "y.nextnode = z\n", + "\n", + "\n", + "#############\n", + "class TestCycleCheck(object):\n", + " \n", + " def test(self,sol):\n", + " assert_equal(sol(a),True)\n", + " assert_equal(sol(x),False)\n", + " \n", + " print(\"ALL TEST CASES PASSED\")\n", + " \n", + "# Run Tests\n", + "\n", + "t = TestCycleCheck()\n", + "t.test(cycle_check)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb b/04-Linked Lists/Linked Lists Interview Problems/02-Linked-List-Reversal/02-Linked List Reversal - SOLUTION.ipynb similarity index 76% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb rename to 04-Linked Lists/Linked Lists Interview Problems/02-Linked-List-Reversal/02-Linked List Reversal - SOLUTION.ipynb index 5ac84405..f534503f 100644 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb +++ b/04-Linked Lists/Linked Lists Interview Problems/02-Linked-List-Reversal/02-Linked List Reversal - SOLUTION.ipynb @@ -15,10 +15,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Node(object):\n", @@ -46,10 +44,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "def reverse(head):\n", @@ -87,10 +83,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "# Create a list of 4 nodes\n", @@ -114,10 +108,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -130,17 +122,15 @@ } ], "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" + "print(a.nextnode.value)\n", + "print(b.nextnode.value)\n", + "print(c.nextnode.value)" ] }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "ename": "AttributeError", @@ -149,7 +139,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" ] } @@ -167,18 +157,16 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" + "<__main__.Node at 0x7f4e3414f730>" ] }, - "execution_count": 46, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -189,10 +177,8 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -205,17 +191,15 @@ } ], "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" + "print(d.nextnode.value)\n", + "print(c.nextnode.value)\n", + "print(b.nextnode.value)" ] }, { "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "ename": "AttributeError", @@ -224,13 +208,13 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" ] } ], "source": [ - "print a.nextnode.value # This will give an error since it now points to None" + "print(a.nextnode.value) # This will give an error since it now points to None" ] }, { @@ -245,23 +229,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/04-Linked Lists/Linked Lists Interview Problems/02-Linked-List-Reversal/02-Linked List Reversal .ipynb b/04-Linked Lists/Linked Lists Interview Problems/02-Linked-List-Reversal/02-Linked List Reversal .ipynb new file mode 100644 index 00000000..53b2b38d --- /dev/null +++ b/04-Linked Lists/Linked Lists Interview Problems/02-Linked-List-Reversal/02-Linked List Reversal .ipynb @@ -0,0 +1,173 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linked List Reversal \n", + "\n", + "## Problem\n", + "\n", + "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", + "\n", + "You are given the example Linked List Node class:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Node(object):\n", + " \n", + " def __init__(self,value):\n", + " \n", + " self.value = value\n", + " self.nextnode = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solution\n", + "\n", + "Fill out your solution below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def reverse(head):\n", + " \n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test Your Solution\n", + "\n", + "**Note, this isn't a classic run cell for testing your solution, please read the statements below carefully**\n", + "\n", + "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and make sure the results match the logic here below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a list of 4 nodes\n", + "a = Node(1)\n", + "b = Node(2)\n", + "c = Node(3)\n", + "d = Node(4)\n", + "\n", + "# Set up order a,b,c,d with values 1,2,3,4\n", + "a.nextnode = b\n", + "b.nextnode = c\n", + "c.nextnode = d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's check the values of the nodes coming after a, b and c:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(a.nextnode.value)\n", + "print(b.nextnode.value)\n", + "print(c.nextnode.value)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "d.nextnode.value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "reverse(a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(d.nextnode.value)\n", + "print(c.nextnode.value)\n", + "print(b.nextnode.value)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(a.nextnode.value) # This will give an error since it now points to None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", + "\n", + "## Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb b/04-Linked Lists/Linked Lists Interview Problems/03-Linked-List-Nth-to-Last-Node/03-Linked List Nth to Last Node - SOLUTION.ipynb similarity index 66% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb rename to 04-Linked Lists/Linked Lists Interview Problems/03-Linked-List-Nth-to-Last-Node/03-Linked List Nth to Last Node - SOLUTION.ipynb index 457e6e48..83704c6c 100644 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb +++ b/04-Linked Lists/Linked Lists Interview Problems/03-Linked-List-Nth-to-Last-Node/03-Linked List Nth to Last Node - SOLUTION.ipynb @@ -13,9 +13,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Node:\n", @@ -27,11 +25,21 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'nth_to_last_node' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# This would return the node d with a value of 4, because its the 2nd to last node.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mtarget_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnth_to_last_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'nth_to_last_node' is not defined" + ] + } + ], "source": [ "a = Node(1)\n", "b = Node(2)\n", @@ -50,20 +58,19 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "ename": "NameError", + "evalue": "name 'target_node' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtarget_node\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'target_node' is not defined" + ] } ], "source": [ @@ -92,10 +99,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": 9, + "metadata": {}, "outputs": [], "source": [ "def nth_to_last_node(n, head):\n", @@ -104,7 +109,7 @@ " right_pointer = head\n", "\n", " # Set right pointer at n nodes away from head\n", - " for i in xrange(n-1):\n", + " for i in range(n-1):\n", " \n", " # Check for edge case of not having enough nodes!\n", " if not right_pointer.nextnode:\n", @@ -131,10 +136,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -171,7 +174,7 @@ " def test(self,sol):\n", " \n", " assert_equal(sol(2,a),d)\n", - " print 'ALL TEST CASES PASSED'\n", + " print('ALL TEST CASES PASSED')\n", " \n", "# Run tests\n", "t = TestNLast()\n", @@ -188,23 +191,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/04-Linked Lists/Linked Lists Interview Problems/03-Linked-List-Nth-to-Last-Node/03-Linked List Nth to Last Node .ipynb b/04-Linked Lists/Linked Lists Interview Problems/03-Linked-List-Nth-to-Last-Node/03-Linked List Nth to Last Node .ipynb new file mode 100644 index 00000000..e0c7b2b3 --- /dev/null +++ b/04-Linked Lists/Linked Lists Interview Problems/03-Linked-List-Nth-to-Last-Node/03-Linked List Nth to Last Node .ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linked List Nth to Last Node \n", + "\n", + "## Problem Statement\n", + "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Node:\n", + "\n", + " def __init__(self, value):\n", + " self.value = value\n", + " self.nextnode = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Example Input and Output:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = Node(1)\n", + "b = Node(2)\n", + "c = Node(3)\n", + "d = Node(4)\n", + "e = Node(5)\n", + "\n", + "a.nextnode = b\n", + "b.nextnode = c\n", + "c.nextnode = d\n", + "d.nextnode = e\n", + "\n", + "# This would return the node d with a value of 4, because its the 2nd to last node.\n", + "target_node = nth_to_last_node(2, a) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "target_node.value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solution\n", + "Fill out your solution below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nth_to_last_node(n, head):\n", + "\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test Your Solution" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", + "\n", + "PLEASE NOTE THIS IS JUST ONE CASE\n", + "\"\"\"\n", + "\n", + "from nose.tools import assert_equal\n", + "\n", + "a = Node(1)\n", + "b = Node(2)\n", + "c = Node(3)\n", + "d = Node(4)\n", + "e = Node(5)\n", + "\n", + "a.nextnode = b\n", + "b.nextnode = c\n", + "c.nextnode = d\n", + "d.nextnode = e\n", + "\n", + "####\n", + "\n", + "class TestNLast(object):\n", + " \n", + " def test(self,sol):\n", + " \n", + " assert_equal(sol(2,a),d)\n", + " print('ALL TEST CASES PASSED')\n", + " \n", + "# Run tests\n", + "t = TestNLast()\n", + "t.test(nth_to_last_node)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/04-Linked Lists/Linked Lists Interview Problems/04-Implement-a-Doubly-Linked-List/04-Implement a Doubly Linked List.ipynb b/04-Linked Lists/Linked Lists Interview Problems/04-Implement-a-Doubly-Linked-List/04-Implement a Doubly Linked List.ipynb new file mode 100644 index 00000000..19dd3d24 --- /dev/null +++ b/04-Linked Lists/Linked Lists Interview Problems/04-Implement-a-Doubly-Linked-List/04-Implement a Doubly Linked List.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implement a Doubly Linked List\n", + "\n", + "For this interview problem, implement a node class and show how it can be used to create a doubly linked list." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Node(object):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Doubly Linked List here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test Your Solution\n", + "Note that there is no test for this solution (because it would give away the answer structure).\n", + "\n", + "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a singly linked list." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb b/04-Linked Lists/Linked Lists Interview Problems/04-Implement-a-Doubly-Linked-List/04-Implement a Linked List -SOLUTION.ipynb similarity index 85% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb rename to 04-Linked Lists/Linked Lists Interview Problems/04-Implement-a-Doubly-Linked-List/04-Implement a Linked List -SOLUTION.ipynb index 303ba52f..b357a10e 100644 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb +++ b/04-Linked Lists/Linked Lists Interview Problems/04-Implement-a-Doubly-Linked-List/04-Implement a Linked List -SOLUTION.ipynb @@ -25,9 +25,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class LinkedListNode(object):\n", @@ -41,9 +39,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "a = LinkedListNode(1)\n", @@ -54,9 +50,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "a.nextnode = b\n", @@ -73,9 +67,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class DoublyLinkedListNode(object):\n", @@ -90,9 +82,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "a = DoublyLinkedListNode(1)\n", @@ -103,9 +93,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Setting b after a\n", @@ -116,9 +104,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Setting c after a\n", @@ -136,23 +122,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/04-Linked Lists/Linked Lists Interview Problems/05-Implement-a-Singly-Linked-List/05-Implement a Singly Linked List.ipynb b/04-Linked Lists/Linked Lists Interview Problems/05-Implement-a-Singly-Linked-List/05-Implement a Singly Linked List.ipynb new file mode 100644 index 00000000..2cc0fc3b --- /dev/null +++ b/04-Linked Lists/Linked Lists Interview Problems/05-Implement-a-Singly-Linked-List/05-Implement a Singly Linked List.ipynb @@ -0,0 +1,68 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implement a Singly Linked List\n", + "\n", + "For this interview problem, create a node class and show how it can be used to create a Singly Linked List" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Node(object):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Singly Linked List here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test Your Solution\n", + "\n", + "Note that there is no test for this solution (because it would give away the answer structure).\n", + "\n", + "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a doubly linked list." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Recursion/.ipynb_checkpoints/Introduction to Recursion-checkpoint.ipynb b/05-Recursion/.ipynb_checkpoints/01-Introduction to Recursion-checkpoint.ipynb similarity index 93% rename from Recursion/.ipynb_checkpoints/Introduction to Recursion-checkpoint.ipynb rename to 05-Recursion/.ipynb_checkpoints/01-Introduction to Recursion-checkpoint.ipynb index 0a165bd9..c339a9d1 100644 --- a/Recursion/.ipynb_checkpoints/Introduction to Recursion-checkpoint.ipynb +++ b/05-Recursion/.ipynb_checkpoints/01-Introduction to Recursion-checkpoint.ipynb @@ -57,10 +57,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def fact(n):\n", @@ -86,10 +84,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -97,7 +93,7 @@ "120" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -117,10 +113,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -131,7 +125,7 @@ "" ] }, - "execution_count": 10, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -158,23 +152,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/05-Recursion/.ipynb_checkpoints/02-Recursion Homework Example Problems-checkpoint.ipynb b/05-Recursion/.ipynb_checkpoints/02-Recursion Homework Example Problems-checkpoint.ipynb new file mode 100644 index 00000000..60eae68a --- /dev/null +++ b/05-Recursion/.ipynb_checkpoints/02-Recursion Homework Example Problems-checkpoint.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Recursion Homework Problems \n", + "\n", + "This assignment is a variety of small problems to begin you getting used to the idea of recursion. They are not full-blown interview questions, but do serve as a great start for getting your mind \"in the zone\" for recursion problems.\n", + "\n", + "\n", + "______\n", + "### Problem 1\n", + "\n", + "**Write a recursive function which takes an integer and computes the cumulative sum of 0 to that integer**\n", + "\n", + "**For example, if n=4 , return 4+3+2+1+0, which is 10.**\n", + "\n", + "This problem is very similar to the factorial problem presented during the introduction to recursion. Remember, always think of what the base case will look like. In this case, we have a base case of n =0 (Note, you could have also designed the cut off to be 1).\n", + "\n", + "In this case, we have:\n", + " n + (n-1) + (n-2) + .... + 0\n", + "\n", + "Fill out a sample solution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def rec_sum(n):\n", + " \n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_sum(4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "______\n", + "### Problem 2\n", + "\n", + "**Given an integer, create a function which returns the sum of all the individual digits in that integer. For example:\n", + "if n = 4321, return 4+3+2+1**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sum_func(n):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sum_func(4321)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Hints:*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# You'll neeed to use modulo\n", + "4321%10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "4321 / 10" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "We'll need to think of this function recursively by knowing that:\n", + "4502 % 10 + sum_func(4502/10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "________\n", + "### Problem 3\n", + "*Note, this is a more advanced problem than the previous two! It aso has a lot of variation possibilities and we're ignoring strict requirements here.*\n", + "\n", + "Create a function called word_split() which takes in a string **phrase** and a set **list_of_words**. The function will then determine if it is possible to split the string in a way in which words can be made from the list of words. You can assume the phrase will only contain words found in the dictionary if it is completely splittable.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "word_split('themanran',['the','ran','man'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "word_split('ilovedogsJohn',['i','am','a','dogs','lover','love','John'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "word_split('themanran',['clown','ran','man'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def word_split(phrase,list_of_words, output = None):\n", + " pass " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Good Luck!\n", + "\n", + "Check out the Solutions Notebook once you're done!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Recursion/.ipynb_checkpoints/Recursion Homework Example Problems - SOLUTIONS-checkpoint.ipynb b/05-Recursion/.ipynb_checkpoints/03-Recursion Homework Example Problems - SOLUTIONS-checkpoint.ipynb similarity index 74% rename from Recursion/.ipynb_checkpoints/Recursion Homework Example Problems - SOLUTIONS-checkpoint.ipynb rename to 05-Recursion/.ipynb_checkpoints/03-Recursion Homework Example Problems - SOLUTIONS-checkpoint.ipynb index f7bafd8e..62d10b65 100644 --- a/Recursion/.ipynb_checkpoints/Recursion Homework Example Problems - SOLUTIONS-checkpoint.ipynb +++ b/05-Recursion/.ipynb_checkpoints/03-Recursion Homework Example Problems - SOLUTIONS-checkpoint.ipynb @@ -27,10 +27,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def rec_sum(n):\n", @@ -46,10 +44,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -57,7 +53,7 @@ "10" ] }, - "execution_count": 8, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -80,9 +76,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def sum_func(n):\n", @@ -92,15 +86,13 @@ " \n", " # Recursion\n", " else:\n", - " return n%10 + sum_func(n/10)" + " return n%10 + sum_func(n//10)" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -126,22 +118,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# You'll neeed to use modulo\n", "4321%10" @@ -149,24 +128,11 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "432" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "4321 / 10" + "4321 // 10" ] }, { @@ -176,7 +142,9 @@ }, "source": [ "We'll need to think of this function recursively by knowing that:\n", - "4502 % 10 + sum_func(4502/10)" + "4502 % 10 + sum_func(4502//10)\n", + "\n", + "Hint2: python3 automatically converts the result of a division to float! Make sure to use integer division (a//b)" ] }, { @@ -194,76 +162,35 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['the', 'man', 'ran']" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "word_split('themanran',['the','ran','man'])" ] }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['i', 'love', 'dogs', 'John']" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "word_split('ilovedogsJohn',['i','am','a','dogs','lover','love','John'])" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "word_split('themanran',['clown','ran','man'])" ] }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def word_split(phrase,list_of_words, output = None):\n", @@ -305,23 +232,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/.ipynb_checkpoints/Recursion Homework Example Problems-checkpoint.ipynb b/05-Recursion/.ipynb_checkpoints/04-Recursion Homework Example Problems - PRACTICE-checkpoint.ipynb similarity index 79% rename from Recursion/.ipynb_checkpoints/Recursion Homework Example Problems-checkpoint.ipynb rename to 05-Recursion/.ipynb_checkpoints/04-Recursion Homework Example Problems - PRACTICE-checkpoint.ipynb index ebe52213..2aba6d5b 100644 --- a/Recursion/.ipynb_checkpoints/Recursion Homework Example Problems-checkpoint.ipynb +++ b/05-Recursion/.ipynb_checkpoints/04-Recursion Homework Example Problems - PRACTICE-checkpoint.ipynb @@ -26,23 +26,22 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def rec_sum(n):\n", - " \n", + " if n == 0:\n", + " return 0\n", + " else:\n", + " return n + rec_sum(n-1)\n", " pass" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -50,7 +49,7 @@ "10" ] }, - "execution_count": 8, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -73,21 +72,21 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def sum_func(n):\n", + " if(n<10):\n", + " return n\n", + " else:\n", + " return n%10 + sum_func(int(n/10))\n", " pass" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -113,10 +112,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { @@ -124,7 +121,7 @@ "1" ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -136,18 +133,16 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "432" + "432.1" ] }, - "execution_count": 14, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -181,10 +176,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "data": { @@ -192,7 +185,7 @@ "['the', 'man', 'ran']" ] }, - "execution_count": 32, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -203,10 +196,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -214,7 +205,7 @@ "['i', 'love', 'dogs', 'John']" ] }, - "execution_count": 33, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -225,10 +216,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { @@ -236,7 +225,7 @@ "[]" ] }, - "execution_count": 34, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -247,13 +236,19 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "def word_split(phrase,list_of_words, output = None):\n", + " if output is None:\n", + " output = []\n", + " \n", + " for word in list_of_words:\n", + " if phrase.startswith(word):\n", + " output.append(word)\n", + " word_split(phrase[len(word):], list_of_words, output)\n", + " return output\n", " pass " ] }, @@ -265,27 +260,34 @@ "\n", "Check out the Solutions Notebook once you're done!" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/.ipynb_checkpoints/Memoization-checkpoint.ipynb b/05-Recursion/.ipynb_checkpoints/05-Memoization-checkpoint.ipynb similarity index 91% rename from Recursion/.ipynb_checkpoints/Memoization-checkpoint.ipynb rename to 05-Recursion/.ipynb_checkpoints/05-Memoization-checkpoint.ipynb index 7de1aee7..23e604c1 100644 --- a/Recursion/.ipynb_checkpoints/Memoization-checkpoint.ipynb +++ b/05-Recursion/.ipynb_checkpoints/05-Memoization-checkpoint.ipynb @@ -18,9 +18,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Create cache for known results\n", @@ -40,9 +38,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -75,9 +71,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Memoize:\n", @@ -100,9 +94,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def factorial(k):\n", @@ -125,23 +117,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Introduction to Recursion.ipynb b/05-Recursion/01-Introduction to Recursion.ipynb similarity index 93% rename from Recursion/Introduction to Recursion.ipynb rename to 05-Recursion/01-Introduction to Recursion.ipynb index 0a165bd9..c339a9d1 100644 --- a/Recursion/Introduction to Recursion.ipynb +++ b/05-Recursion/01-Introduction to Recursion.ipynb @@ -57,10 +57,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def fact(n):\n", @@ -86,10 +84,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -97,7 +93,7 @@ "120" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -117,10 +113,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -131,7 +125,7 @@ "" ] }, - "execution_count": 10, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -158,23 +152,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/05-Recursion/02-Recursion Homework Example Problems.ipynb b/05-Recursion/02-Recursion Homework Example Problems.ipynb new file mode 100644 index 00000000..60eae68a --- /dev/null +++ b/05-Recursion/02-Recursion Homework Example Problems.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Recursion Homework Problems \n", + "\n", + "This assignment is a variety of small problems to begin you getting used to the idea of recursion. They are not full-blown interview questions, but do serve as a great start for getting your mind \"in the zone\" for recursion problems.\n", + "\n", + "\n", + "______\n", + "### Problem 1\n", + "\n", + "**Write a recursive function which takes an integer and computes the cumulative sum of 0 to that integer**\n", + "\n", + "**For example, if n=4 , return 4+3+2+1+0, which is 10.**\n", + "\n", + "This problem is very similar to the factorial problem presented during the introduction to recursion. Remember, always think of what the base case will look like. In this case, we have a base case of n =0 (Note, you could have also designed the cut off to be 1).\n", + "\n", + "In this case, we have:\n", + " n + (n-1) + (n-2) + .... + 0\n", + "\n", + "Fill out a sample solution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def rec_sum(n):\n", + " \n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_sum(4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "______\n", + "### Problem 2\n", + "\n", + "**Given an integer, create a function which returns the sum of all the individual digits in that integer. For example:\n", + "if n = 4321, return 4+3+2+1**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sum_func(n):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sum_func(4321)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Hints:*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# You'll neeed to use modulo\n", + "4321%10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "4321 / 10" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "We'll need to think of this function recursively by knowing that:\n", + "4502 % 10 + sum_func(4502/10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "________\n", + "### Problem 3\n", + "*Note, this is a more advanced problem than the previous two! It aso has a lot of variation possibilities and we're ignoring strict requirements here.*\n", + "\n", + "Create a function called word_split() which takes in a string **phrase** and a set **list_of_words**. The function will then determine if it is possible to split the string in a way in which words can be made from the list of words. You can assume the phrase will only contain words found in the dictionary if it is completely splittable.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "word_split('themanran',['the','ran','man'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "word_split('ilovedogsJohn',['i','am','a','dogs','lover','love','John'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "word_split('themanran',['clown','ran','man'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def word_split(phrase,list_of_words, output = None):\n", + " pass " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Good Luck!\n", + "\n", + "Check out the Solutions Notebook once you're done!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Recursion/Recursion Homework Example Problems - SOLUTIONS.ipynb b/05-Recursion/03-Recursion Homework Example Problems - SOLUTIONS.ipynb similarity index 74% rename from Recursion/Recursion Homework Example Problems - SOLUTIONS.ipynb rename to 05-Recursion/03-Recursion Homework Example Problems - SOLUTIONS.ipynb index f7bafd8e..62d10b65 100644 --- a/Recursion/Recursion Homework Example Problems - SOLUTIONS.ipynb +++ b/05-Recursion/03-Recursion Homework Example Problems - SOLUTIONS.ipynb @@ -27,10 +27,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def rec_sum(n):\n", @@ -46,10 +44,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -57,7 +53,7 @@ "10" ] }, - "execution_count": 8, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -80,9 +76,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def sum_func(n):\n", @@ -92,15 +86,13 @@ " \n", " # Recursion\n", " else:\n", - " return n%10 + sum_func(n/10)" + " return n%10 + sum_func(n//10)" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -126,22 +118,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# You'll neeed to use modulo\n", "4321%10" @@ -149,24 +128,11 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "432" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "4321 / 10" + "4321 // 10" ] }, { @@ -176,7 +142,9 @@ }, "source": [ "We'll need to think of this function recursively by knowing that:\n", - "4502 % 10 + sum_func(4502/10)" + "4502 % 10 + sum_func(4502//10)\n", + "\n", + "Hint2: python3 automatically converts the result of a division to float! Make sure to use integer division (a//b)" ] }, { @@ -194,76 +162,35 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['the', 'man', 'ran']" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "word_split('themanran',['the','ran','man'])" ] }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['i', 'love', 'dogs', 'John']" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "word_split('ilovedogsJohn',['i','am','a','dogs','lover','love','John'])" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "word_split('themanran',['clown','ran','man'])" ] }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def word_split(phrase,list_of_words, output = None):\n", @@ -305,23 +232,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Homework Example Problems.ipynb b/05-Recursion/04-Recursion Homework Example Problems - PRACTICE.ipynb similarity index 79% rename from Recursion/Recursion Homework Example Problems.ipynb rename to 05-Recursion/04-Recursion Homework Example Problems - PRACTICE.ipynb index ebe52213..2aba6d5b 100644 --- a/Recursion/Recursion Homework Example Problems.ipynb +++ b/05-Recursion/04-Recursion Homework Example Problems - PRACTICE.ipynb @@ -26,23 +26,22 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def rec_sum(n):\n", - " \n", + " if n == 0:\n", + " return 0\n", + " else:\n", + " return n + rec_sum(n-1)\n", " pass" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -50,7 +49,7 @@ "10" ] }, - "execution_count": 8, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -73,21 +72,21 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def sum_func(n):\n", + " if(n<10):\n", + " return n\n", + " else:\n", + " return n%10 + sum_func(int(n/10))\n", " pass" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -113,10 +112,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { @@ -124,7 +121,7 @@ "1" ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -136,18 +133,16 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "432" + "432.1" ] }, - "execution_count": 14, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -181,10 +176,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "data": { @@ -192,7 +185,7 @@ "['the', 'man', 'ran']" ] }, - "execution_count": 32, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -203,10 +196,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -214,7 +205,7 @@ "['i', 'love', 'dogs', 'John']" ] }, - "execution_count": 33, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -225,10 +216,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { @@ -236,7 +225,7 @@ "[]" ] }, - "execution_count": 34, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -247,13 +236,19 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "def word_split(phrase,list_of_words, output = None):\n", + " if output is None:\n", + " output = []\n", + " \n", + " for word in list_of_words:\n", + " if phrase.startswith(word):\n", + " output.append(word)\n", + " word_split(phrase[len(word):], list_of_words, output)\n", + " return output\n", " pass " ] }, @@ -265,27 +260,34 @@ "\n", "Check out the Solutions Notebook once you're done!" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Memoization.ipynb b/05-Recursion/05-Memoization.ipynb similarity index 91% rename from Recursion/Memoization.ipynb rename to 05-Recursion/05-Memoization.ipynb index 7de1aee7..23e604c1 100644 --- a/Recursion/Memoization.ipynb +++ b/05-Recursion/05-Memoization.ipynb @@ -18,9 +18,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Create cache for known results\n", @@ -40,9 +38,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -75,9 +71,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Memoize:\n", @@ -100,9 +94,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def factorial(k):\n", @@ -125,23 +117,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 1 - Reverse String - SOLUTION-checkpoint.ipynb b/05-Recursion/Recursion Interview Problems/01-Reverse-String/01-Reverse String - SOLUTION.ipynb similarity index 87% rename from Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 1 - Reverse String - SOLUTION-checkpoint.ipynb rename to 05-Recursion/Recursion Interview Problems/01-Reverse-String/01-Reverse String - SOLUTION.ipynb index 3f683cab..d24c58f7 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 1 - Reverse String - SOLUTION-checkpoint.ipynb +++ b/05-Recursion/Recursion Interview Problems/01-Reverse-String/01-Reverse String - SOLUTION.ipynb @@ -21,10 +21,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def reverse(s):\n", @@ -39,10 +37,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -50,7 +46,7 @@ "'dlrow olleh'" ] }, - "execution_count": 10, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -76,10 +72,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -103,7 +97,7 @@ " assert_equal(solution('hello world'),'dlrow olleh')\n", " assert_equal(solution('123456789'),'987654321')\n", " \n", - " print 'PASSED ALL TEST CASES!'\n", + " print('PASSED ALL TEST CASES!')\n", " \n", "# Run Tests\n", "test = TestReverse()\n", @@ -124,23 +118,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 1 - Reverse String -checkpoint.ipynb b/05-Recursion/Recursion Interview Problems/01-Reverse-String/01-Reverse String .ipynb similarity index 88% rename from Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 1 - Reverse String -checkpoint.ipynb rename to 05-Recursion/Recursion Interview Problems/01-Reverse-String/01-Reverse String .ipynb index 4d4308f6..dad38cbb 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 1 - Reverse String -checkpoint.ipynb +++ b/05-Recursion/Recursion Interview Problems/01-Reverse-String/01-Reverse String .ipynb @@ -18,9 +18,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "def reverse(s):\n", @@ -31,9 +29,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -68,9 +64,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -94,7 +88,7 @@ " assert_equal(solution('hello world'),'dlrow olleh')\n", " assert_equal(solution('123456789'),'987654321')\n", " \n", - " print 'PASSED ALL TEST CASES!'\n", + " print('PASSED ALL TEST CASES!')\n", " \n", "# Run Tests\n", "test = TestReverse()\n", @@ -111,23 +105,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 2 - String Permutation- SOLUTION-checkpoint.ipynb b/05-Recursion/Recursion Interview Problems/02-String-Permutation/02-String Permutation- SOLUTION.ipynb similarity index 92% rename from Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 2 - String Permutation- SOLUTION-checkpoint.ipynb rename to 05-Recursion/Recursion Interview Problems/02-String-Permutation/02-String Permutation- SOLUTION.ipynb index 31274b2b..93d49093 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 2 - String Permutation- SOLUTION-checkpoint.ipynb +++ b/05-Recursion/Recursion Interview Problems/02-String-Permutation/02-String Permutation- SOLUTION.ipynb @@ -34,10 +34,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def permute(s):\n", @@ -62,10 +60,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -73,7 +69,7 @@ "['abc', 'acb', 'bac', 'bca', 'cab', 'cba']" ] }, - "execution_count": 24, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -92,10 +88,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -119,7 +113,7 @@ " assert_equal(sorted(solution('abc')),sorted(['abc', 'acb', 'bac', 'bca', 'cab', 'cba']))\n", " assert_equal(sorted(solution('dog')),sorted(['dog', 'dgo', 'odg', 'ogd', 'gdo', 'god']) )\n", " \n", - " print 'All test cases passed.'\n", + " print('All test cases passed.')\n", " \n", "\n", "\n", @@ -153,23 +147,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 2 - String Permutation.ipynb b/05-Recursion/Recursion Interview Problems/02-String-Permutation/02-String Permutation.ipynb similarity index 89% rename from Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 2 - String Permutation.ipynb rename to 05-Recursion/Recursion Interview Problems/02-String-Permutation/02-String Permutation.ipynb index e2585c12..b8548e71 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 2 - String Permutation.ipynb +++ b/05-Recursion/Recursion Interview Problems/02-String-Permutation/02-String Permutation.ipynb @@ -38,9 +38,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -68,9 +66,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -94,7 +90,7 @@ " assert_equal(sorted(solution('abc')),sorted(['abc', 'acb', 'bac', 'bca', 'cab', 'cba']))\n", " assert_equal(sorted(solution('dog')),sorted(['dog', 'dgo', 'odg', 'ogd', 'gdo', 'god']) )\n", " \n", - " print 'All test cases passed.'\n", + " print('All test cases passed.')\n", " \n", "\n", "\n", @@ -113,23 +109,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 3 - Fibonacci Sequence - SOLUTION-checkpoint.ipynb b/05-Recursion/Recursion Interview Problems/03-Fibonacci-Sequence/03-Fibonacci Sequence - SOLUTION.ipynb similarity index 88% rename from Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 3 - Fibonacci Sequence - SOLUTION-checkpoint.ipynb rename to 05-Recursion/Recursion Interview Problems/03-Fibonacci-Sequence/03-Fibonacci Sequence - SOLUTION.ipynb index 30914e73..8dcb5da7 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 3 - Fibonacci Sequence - SOLUTION-checkpoint.ipynb +++ b/05-Recursion/Recursion Interview Problems/03-Fibonacci-Sequence/03-Fibonacci Sequence - SOLUTION.ipynb @@ -33,9 +33,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def fib_rec(n):\n", @@ -52,9 +50,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -82,10 +78,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "# Instantiate Cache information\n", @@ -111,10 +105,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { @@ -122,7 +114,7 @@ "55" ] }, - "execution_count": 9, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -142,10 +134,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "def fib_iter(n):\n", @@ -164,10 +154,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -175,7 +163,7 @@ "28657" ] }, - "execution_count": 14, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -195,10 +183,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -222,7 +208,7 @@ " assert_equal(solution(10),55)\n", " assert_equal(solution(1),1)\n", " assert_equal(solution(23),28657)\n", - " print 'Passed all tests.'\n", + " print('Passed all tests.')\n", "# UNCOMMENT FOR CORRESPONDING FUNCTION\n", "t = TestFib()\n", "\n", @@ -243,23 +229,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 3 - Fibonacci Sequence-checkpoint.ipynb b/05-Recursion/Recursion Interview Problems/03-Fibonacci-Sequence/03-Fibonacci Sequence.ipynb similarity index 91% rename from Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 3 - Fibonacci Sequence-checkpoint.ipynb rename to 05-Recursion/Recursion Interview Problems/03-Fibonacci-Sequence/03-Fibonacci Sequence.ipynb index e85c24d0..d946ac97 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 3 - Fibonacci Sequence-checkpoint.ipynb +++ b/05-Recursion/Recursion Interview Problems/03-Fibonacci-Sequence/03-Fibonacci Sequence.ipynb @@ -42,9 +42,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "def fib_rec(n):\n", @@ -55,9 +53,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -86,9 +82,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Instantiate Cache information\n", @@ -104,9 +98,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -148,9 +140,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -179,9 +169,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -205,7 +193,7 @@ " assert_equal(solution(10),55)\n", " assert_equal(solution(1),1)\n", " assert_equal(solution(23),28657)\n", - " print 'Passed all tests.'\n", + " print('Passed all tests.')\n", "# UNCOMMENT FOR CORRESPONDING FUNCTION\n", "t = TestFib()\n", "\n", @@ -226,23 +214,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 4 - Coin Change - SOLUTION-checkpoint.ipynb b/05-Recursion/Recursion Interview Problems/04-Coin-Change/04-Coin Change - SOLUTION.ipynb similarity index 86% rename from Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 4 - Coin Change - SOLUTION-checkpoint.ipynb rename to 05-Recursion/Recursion Interview Problems/04-Coin-Change/04-Coin Change - SOLUTION.ipynb index a3ace666..9e22d086 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/.ipynb_checkpoints/Recursion Problem 4 - Coin Change - SOLUTION-checkpoint.ipynb +++ b/05-Recursion/Recursion Interview Problems/04-Coin-Change/04-Coin Change - SOLUTION.ipynb @@ -39,10 +39,8 @@ }, { "cell_type": "code", - "execution_count": 60, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def rec_coin(target,coins):\n", @@ -85,19 +83,9 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "rec_coin(63,[1,5,10,25])" ] @@ -113,25 +101,9 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from IPython.display import Image\n", "Image(url='http://interactivepython.org/runestone/static/pythonds/_images/callTree.png')" @@ -152,10 +124,8 @@ }, { "cell_type": "code", - "execution_count": 53, - "metadata": { - "collapsed": false - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def rec_coin_dynam(target,coins,known_results):\n", @@ -205,22 +175,9 @@ }, { "cell_type": "code", - "execution_count": 56, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "target = 74\n", "coins = [1,5,10,25]\n", @@ -243,9 +200,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", @@ -263,7 +218,7 @@ " assert_equal(solution(23,coins),5)\n", " assert_equal(solution(74,coins),8)\n", "\n", - " print 'Passed all tests.'\n", + " print('Passed all tests.')\n", " \n", "# Run Test\n", "\n", @@ -286,23 +241,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 4 - Coin Change.ipynb b/05-Recursion/Recursion Interview Problems/04-Coin-Change/04-Coin Change.ipynb similarity index 92% rename from Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 4 - Coin Change.ipynb rename to 05-Recursion/Recursion Interview Problems/04-Coin-Change/04-Coin Change.ipynb index f8785dfb..29ed5698 100644 --- a/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 4 - Coin Change.ipynb +++ b/05-Recursion/Recursion Interview Problems/04-Coin-Change/04-Coin Change.ipynb @@ -53,9 +53,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -86,9 +84,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", @@ -106,7 +102,7 @@ " assert_equal(solution(45,coins),3)\n", " assert_equal(solution(23,coins),5)\n", " assert_equal(solution(74,coins),8)\n", - " print 'Passed all tests.'\n", + " print('Passed all tests.')\n", "# Run Test\n", "\n", "test = TestCoins()\n", @@ -125,23 +121,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/.ipynb_checkpoints/Tree Representation Implementation (Lists)-checkpoint.ipynb b/06-Trees/.ipynb_checkpoints/01-Tree Representation Implementation (Lists)-checkpoint.ipynb similarity index 87% rename from Trees/.ipynb_checkpoints/Tree Representation Implementation (Lists)-checkpoint.ipynb rename to 06-Trees/.ipynb_checkpoints/01-Tree Representation Implementation (Lists)-checkpoint.ipynb index ad33ac3f..fd7e466e 100644 --- a/Trees/.ipynb_checkpoints/Tree Representation Implementation (Lists)-checkpoint.ipynb +++ b/06-Trees/.ipynb_checkpoints/01-Tree Representation Implementation (Lists)-checkpoint.ipynb @@ -11,10 +11,8 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def BinaryTree(r):\n", @@ -52,23 +50,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/.ipynb_checkpoints/Tree Representation Implementation (Nodes and References)-checkpoint.ipynb b/06-Trees/.ipynb_checkpoints/02-Tree Representation Implementation (Nodes and References)-checkpoint.ipynb similarity index 85% rename from Trees/.ipynb_checkpoints/Tree Representation Implementation (Nodes and References)-checkpoint.ipynb rename to 06-Trees/.ipynb_checkpoints/02-Tree Representation Implementation (Nodes and References)-checkpoint.ipynb index 5ca824e2..dc3df223 100644 --- a/Trees/.ipynb_checkpoints/Tree Representation Implementation (Nodes and References)-checkpoint.ipynb +++ b/06-Trees/.ipynb_checkpoints/02-Tree Representation Implementation (Nodes and References)-checkpoint.ipynb @@ -11,10 +11,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class BinaryTree(object):\n", @@ -62,10 +60,8 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -73,17 +69,15 @@ "text": [ "a\n", "None\n", - "<__main__.BinaryTree object at 0x104779c10>\n", + "<__main__.BinaryTree object at 0x7f7c951d7340>\n", "b\n", - "<__main__.BinaryTree object at 0x103b42c50>\n", + "<__main__.BinaryTree object at 0x7f7c951d7370>\n", "c\n", "hello\n" ] } ], "source": [ - "from __future__ import print_function\n", - "\n", "r = BinaryTree('a')\n", "print(r.getRootVal())\n", "print(r.getLeftChild())\n", @@ -100,23 +94,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/.ipynb_checkpoints/Binary Heap Implementation-checkpoint.ipynb b/06-Trees/.ipynb_checkpoints/03-Binary Heap Implementation-checkpoint.ipynb similarity index 91% rename from Trees/.ipynb_checkpoints/Binary Heap Implementation-checkpoint.ipynb rename to 06-Trees/.ipynb_checkpoints/03-Binary Heap Implementation-checkpoint.ipynb index e5630cee..80515f00 100644 --- a/Trees/.ipynb_checkpoints/Binary Heap Implementation-checkpoint.ipynb +++ b/06-Trees/.ipynb_checkpoints/03-Binary Heap Implementation-checkpoint.ipynb @@ -28,9 +28,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class BinHeap:\n", @@ -97,36 +95,27 @@ " self.percDown(i)\n", " i = i - 1" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/.ipynb_checkpoints/Binary Search Trees-checkpoint.ipynb b/06-Trees/.ipynb_checkpoints/04-Binary Search Trees-checkpoint.ipynb similarity index 97% rename from Trees/.ipynb_checkpoints/Binary Search Trees-checkpoint.ipynb rename to 06-Trees/.ipynb_checkpoints/04-Binary Search Trees-checkpoint.ipynb index c6679bb0..a31c8826 100644 --- a/Trees/.ipynb_checkpoints/Binary Search Trees-checkpoint.ipynb +++ b/06-Trees/.ipynb_checkpoints/04-Binary Search Trees-checkpoint.ipynb @@ -16,10 +16,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class TreeNode:\n", @@ -248,10 +246,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -283,23 +279,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Tree Representation Implementation (Lists).ipynb b/06-Trees/01-Tree Representation Implementation (Lists).ipynb similarity index 87% rename from Trees/Tree Representation Implementation (Lists).ipynb rename to 06-Trees/01-Tree Representation Implementation (Lists).ipynb index ad33ac3f..fd7e466e 100644 --- a/Trees/Tree Representation Implementation (Lists).ipynb +++ b/06-Trees/01-Tree Representation Implementation (Lists).ipynb @@ -11,10 +11,8 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def BinaryTree(r):\n", @@ -52,23 +50,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Tree Representation Implementation (Nodes and References).ipynb b/06-Trees/02-Tree Representation Implementation (Nodes and References).ipynb similarity index 85% rename from Trees/Tree Representation Implementation (Nodes and References).ipynb rename to 06-Trees/02-Tree Representation Implementation (Nodes and References).ipynb index 5ca824e2..dc3df223 100644 --- a/Trees/Tree Representation Implementation (Nodes and References).ipynb +++ b/06-Trees/02-Tree Representation Implementation (Nodes and References).ipynb @@ -11,10 +11,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class BinaryTree(object):\n", @@ -62,10 +60,8 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -73,17 +69,15 @@ "text": [ "a\n", "None\n", - "<__main__.BinaryTree object at 0x104779c10>\n", + "<__main__.BinaryTree object at 0x7f7c951d7340>\n", "b\n", - "<__main__.BinaryTree object at 0x103b42c50>\n", + "<__main__.BinaryTree object at 0x7f7c951d7370>\n", "c\n", "hello\n" ] } ], "source": [ - "from __future__ import print_function\n", - "\n", "r = BinaryTree('a')\n", "print(r.getRootVal())\n", "print(r.getLeftChild())\n", @@ -100,23 +94,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Binary Heap Implementation.ipynb b/06-Trees/03-Binary Heap Implementation.ipynb similarity index 91% rename from Trees/Binary Heap Implementation.ipynb rename to 06-Trees/03-Binary Heap Implementation.ipynb index e5630cee..80515f00 100644 --- a/Trees/Binary Heap Implementation.ipynb +++ b/06-Trees/03-Binary Heap Implementation.ipynb @@ -28,9 +28,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class BinHeap:\n", @@ -97,36 +95,27 @@ " self.percDown(i)\n", " i = i - 1" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Binary Search Trees.ipynb b/06-Trees/04-Binary Search Trees.ipynb similarity index 97% rename from Trees/Binary Search Trees.ipynb rename to 06-Trees/04-Binary Search Trees.ipynb index c6679bb0..a31c8826 100644 --- a/Trees/Binary Search Trees.ipynb +++ b/06-Trees/04-Binary Search Trees.ipynb @@ -16,10 +16,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class TreeNode:\n", @@ -248,10 +246,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -283,23 +279,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems/.ipynb_checkpoints/Binary Search Tree Check-checkpoint.ipynb b/06-Trees/Trees Interview Problems/.ipynb_checkpoints/01-Binary Search Tree Check-checkpoint.ipynb similarity index 84% rename from Trees/Trees Interview Problems/.ipynb_checkpoints/Binary Search Tree Check-checkpoint.ipynb rename to 06-Trees/Trees Interview Problems/.ipynb_checkpoints/01-Binary Search Tree Check-checkpoint.ipynb index 74a68fe1..d1ce2354 100644 --- a/Trees/Trees Interview Problems/.ipynb_checkpoints/Binary Search Tree Check-checkpoint.ipynb +++ b/06-Trees/Trees Interview Problems/.ipynb_checkpoints/01-Binary Search Tree Check-checkpoint.ipynb @@ -20,9 +20,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Code goes Here" @@ -38,23 +36,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems/.ipynb_checkpoints/Tree Level Order Print-checkpoint.ipynb b/06-Trees/Trees Interview Problems/.ipynb_checkpoints/02-Tree Level Order Print-checkpoint.ipynb similarity index 90% rename from Trees/Trees Interview Problems/.ipynb_checkpoints/Tree Level Order Print-checkpoint.ipynb rename to 06-Trees/Trees Interview Problems/.ipynb_checkpoints/02-Tree Level Order Print-checkpoint.ipynb index 7d44b4d9..62de6e6c 100644 --- a/Trees/Trees Interview Problems/.ipynb_checkpoints/Tree Level Order Print-checkpoint.ipynb +++ b/06-Trees/Trees Interview Problems/.ipynb_checkpoints/02-Tree Level Order Print-checkpoint.ipynb @@ -57,23 +57,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems/Trim a Binary Search Tree .ipynb b/06-Trees/Trees Interview Problems/.ipynb_checkpoints/03-Trim a Binary Search Tree -checkpoint.ipynb similarity index 87% rename from Trees/Trees Interview Problems/Trim a Binary Search Tree .ipynb rename to 06-Trees/Trees Interview Problems/.ipynb_checkpoints/03-Trim a Binary Search Tree -checkpoint.ipynb index b3aa23dd..85791572 100644 --- a/Trees/Trees Interview Problems/Trim a Binary Search Tree .ipynb +++ b/06-Trees/Trees Interview Problems/.ipynb_checkpoints/03-Trim a Binary Search Tree -checkpoint.ipynb @@ -33,9 +33,9 @@ "source": [ "def trimBST(tree,minVal,maxVal):\n", " \n", - " print tree.left # LeftChild\n", - " print tree.right # Right Child\n", - " print tree.val # Node's value\n", + " print(tree.left) # LeftChild\n", + " print(tree.right) # Right Child\n", + " print(tree.val) # Node's value\n", " \n", " pass\n", "\n", @@ -54,23 +54,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Binary Search Tree Check - SOLUTION-checkpoint.ipynb b/06-Trees/Trees Interview Problems/01-Binary-Search-Tree-Check/01-Binary Search Tree Check - SOLUTION.ipynb similarity index 74% rename from Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Binary Search Tree Check - SOLUTION-checkpoint.ipynb rename to 06-Trees/Trees Interview Problems/01-Binary-Search-Tree-Check/01-Binary Search Tree Check - SOLUTION.ipynb index 1ac09210..12b720fc 100644 --- a/Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Binary Search Tree Check - SOLUTION-checkpoint.ipynb +++ b/06-Trees/Trees Interview Problems/01-Binary-Search-Tree-Check/01-Binary Search Tree Check - SOLUTION.ipynb @@ -19,16 +19,18 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" + "ename": "NameError", + "evalue": "name 'tree' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtree_vals\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtree_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0minorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtree\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0msort_check\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtree_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'tree' is not defined" ] } ], @@ -57,10 +59,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -133,23 +133,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems/Binary Search Tree Check.ipynb b/06-Trees/Trees Interview Problems/01-Binary-Search-Tree-Check/01-Binary Search Tree Check.ipynb similarity index 84% rename from Trees/Trees Interview Problems/Binary Search Tree Check.ipynb rename to 06-Trees/Trees Interview Problems/01-Binary-Search-Tree-Check/01-Binary Search Tree Check.ipynb index 74a68fe1..d1ce2354 100644 --- a/Trees/Trees Interview Problems/Binary Search Tree Check.ipynb +++ b/06-Trees/Trees Interview Problems/01-Binary-Search-Tree-Check/01-Binary Search Tree Check.ipynb @@ -20,9 +20,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Code goes Here" @@ -38,23 +36,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Tree Level Order Print - SOLUTION-checkpoint.ipynb b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/.ipynb_checkpoints/02-Tree Level Order Print - SOLUTION-checkpoint.ipynb similarity index 91% rename from Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Tree Level Order Print - SOLUTION-checkpoint.ipynb rename to 06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/.ipynb_checkpoints/02-Tree Level Order Print - SOLUTION-checkpoint.ipynb index 015366eb..bada18d3 100644 --- a/Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Tree Level Order Print - SOLUTION-checkpoint.ipynb +++ b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/.ipynb_checkpoints/02-Tree Level Order Print - SOLUTION-checkpoint.ipynb @@ -30,10 +30,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "class Node:\n", @@ -45,10 +43,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "def levelOrderPrint(tree):\n", @@ -59,7 +55,7 @@ " while len(nodes)!=0:\n", " currentNode=nodes.popleft()\n", " currentCount-=1\n", - " print currentNode.val,\n", + " print(currentNode.val,)\n", " if currentNode.left:\n", " nodes.append(currentNode.left)\n", " nextCount+=1\n", @@ -68,7 +64,7 @@ " nextCount+=1\n", " if currentCount==0:\n", " #finished printing current level\n", - " print '\\n',\n", + " print('\\n',)\n", " currentCount, nextCount = nextCount, currentCount" ] }, @@ -91,23 +87,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems/Tree Level Order Print.ipynb b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/.ipynb_checkpoints/02-Tree Level Order Print-checkpoint.ipynb similarity index 90% rename from Trees/Trees Interview Problems/Tree Level Order Print.ipynb rename to 06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/.ipynb_checkpoints/02-Tree Level Order Print-checkpoint.ipynb index 7d44b4d9..62de6e6c 100644 --- a/Trees/Trees Interview Problems/Tree Level Order Print.ipynb +++ b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/.ipynb_checkpoints/02-Tree Level Order Print-checkpoint.ipynb @@ -57,23 +57,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems - SOLUTIONS/Tree Level Order Print - SOLUTION.ipynb b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/02-Tree Level Order Print - SOLUTION.ipynb similarity index 91% rename from Trees/Trees Interview Problems - SOLUTIONS/Tree Level Order Print - SOLUTION.ipynb rename to 06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/02-Tree Level Order Print - SOLUTION.ipynb index 015366eb..bada18d3 100644 --- a/Trees/Trees Interview Problems - SOLUTIONS/Tree Level Order Print - SOLUTION.ipynb +++ b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/02-Tree Level Order Print - SOLUTION.ipynb @@ -30,10 +30,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "class Node:\n", @@ -45,10 +43,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "def levelOrderPrint(tree):\n", @@ -59,7 +55,7 @@ " while len(nodes)!=0:\n", " currentNode=nodes.popleft()\n", " currentCount-=1\n", - " print currentNode.val,\n", + " print(currentNode.val,)\n", " if currentNode.left:\n", " nodes.append(currentNode.left)\n", " nextCount+=1\n", @@ -68,7 +64,7 @@ " nextCount+=1\n", " if currentCount==0:\n", " #finished printing current level\n", - " print '\\n',\n", + " print('\\n',)\n", " currentCount, nextCount = nextCount, currentCount" ] }, @@ -91,23 +87,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/02-Tree Level Order Print.ipynb b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/02-Tree Level Order Print.ipynb new file mode 100644 index 00000000..62de6e6c --- /dev/null +++ b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/02-Tree Level Order Print.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tree Level Order Print \n", + "\n", + "Given a binary tree of integers, print it in level order. The output will contain space between the numbers in the same level, and new line between different levels. For example, if the tree is: \n", + "___\n", + "![title](tree_print.png)\n", + "___\n", + "The output should be: \n", + "\n", + " 1 \n", + " 2 3 \n", + " 4 5 6" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solution\n", + "\n", + "Fill out your solution below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Node:\n", + " def __init__(self, val=None):\n", + " self.left = None\n", + " self.right = None\n", + " self.val = val " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def levelOrderPrint(tree):\n", + " #Code here\n", + " pass" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Trees/Trees Interview Problems - SOLUTIONS/tree_print.png b/06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/tree_print.png similarity index 100% rename from Trees/Trees Interview Problems - SOLUTIONS/tree_print.png rename to 06-Trees/Trees Interview Problems/02-Tree-Level-Order-Print/tree_print.png diff --git a/Trees/Trees Interview Problems/.ipynb_checkpoints/Trim a Binary Search Tree -checkpoint.ipynb b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/.ipynb_checkpoints/03-Trim a Binary Search Tree -checkpoint.ipynb similarity index 87% rename from Trees/Trees Interview Problems/.ipynb_checkpoints/Trim a Binary Search Tree -checkpoint.ipynb rename to 06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/.ipynb_checkpoints/03-Trim a Binary Search Tree -checkpoint.ipynb index b3aa23dd..85791572 100644 --- a/Trees/Trees Interview Problems/.ipynb_checkpoints/Trim a Binary Search Tree -checkpoint.ipynb +++ b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/.ipynb_checkpoints/03-Trim a Binary Search Tree -checkpoint.ipynb @@ -33,9 +33,9 @@ "source": [ "def trimBST(tree,minVal,maxVal):\n", " \n", - " print tree.left # LeftChild\n", - " print tree.right # Right Child\n", - " print tree.val # Node's value\n", + " print(tree.left) # LeftChild\n", + " print(tree.right) # Right Child\n", + " print(tree.val) # Node's value\n", " \n", " pass\n", "\n", @@ -54,23 +54,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems - SOLUTIONS/Trim a Binary Search Tree - SOLUTION.ipynb b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/.ipynb_checkpoints/03Trim a Binary Search Tree - SOLUTION-checkpoint.ipynb similarity index 95% rename from Trees/Trees Interview Problems - SOLUTIONS/Trim a Binary Search Tree - SOLUTION.ipynb rename to 06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/.ipynb_checkpoints/03Trim a Binary Search Tree - SOLUTION-checkpoint.ipynb index 36e4317d..5ad75a29 100644 --- a/Trees/Trees Interview Problems - SOLUTIONS/Trim a Binary Search Tree - SOLUTION.ipynb +++ b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/.ipynb_checkpoints/03Trim a Binary Search Tree - SOLUTION-checkpoint.ipynb @@ -37,10 +37,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def trimBST(tree, minVal, maxVal): \n", @@ -78,23 +76,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/03-Trim a Binary Search Tree .ipynb b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/03-Trim a Binary Search Tree .ipynb new file mode 100644 index 00000000..85791572 --- /dev/null +++ b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/03-Trim a Binary Search Tree .ipynb @@ -0,0 +1,76 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trim a Binary Search Tree \n", + "\n", + "## Problem Statement\n", + "\n", + "Given the root of a binary search tree and 2 numbers min and max, trim the tree such that all the numbers in the new tree are between min and max (inclusive). The resulting tree should still be a valid binary search tree. So, if we get this tree as input:\n", + "___\n", + "\n", + "![title](bst1.png)\n", + "___\n", + "and we’re given **min value as 5** and **max value as 13**, then the resulting binary search tree should be: \n", + "___\n", + "![title](bst_trim.png)\n", + "___\n", + "We should remove all the nodes whose value is not between min and max. \n", + "\n", + "___\n", + "** Feel free to reference the lecture on Binary Search Tree for the node class, but what it more important here is the logic of your function. In which case your function should be in the form:**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def trimBST(tree,minVal,maxVal):\n", + " \n", + " print(tree.left) # LeftChild\n", + " print(tree.right) # Right Child\n", + " print(tree.val) # Node's value\n", + " \n", + " pass\n", + "\n", + "# Use tree.left , tree.right , and tree.val as your methods to call" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "** There is no solution cell because the nature of the code should be more logical and a test would essentially give away the answer. Just focus your answer to fill out the logic of the solution using the methods described above **\n", + "\n", + "## Best of luck!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Trim a Binary Search Tree - SOLUTION-checkpoint.ipynb b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/03Trim a Binary Search Tree - SOLUTION.ipynb similarity index 95% rename from Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Trim a Binary Search Tree - SOLUTION-checkpoint.ipynb rename to 06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/03Trim a Binary Search Tree - SOLUTION.ipynb index 36e4317d..5ad75a29 100644 --- a/Trees/Trees Interview Problems - SOLUTIONS/.ipynb_checkpoints/Trim a Binary Search Tree - SOLUTION-checkpoint.ipynb +++ b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/03Trim a Binary Search Tree - SOLUTION.ipynb @@ -37,10 +37,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def trimBST(tree, minVal, maxVal): \n", @@ -78,23 +76,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Trees/Trees Interview Problems - SOLUTIONS/bst1.png b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/bst1.png similarity index 100% rename from Trees/Trees Interview Problems - SOLUTIONS/bst1.png rename to 06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/bst1.png diff --git a/Trees/Trees Interview Problems - SOLUTIONS/bst_trim.png b/06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/bst_trim.png similarity index 100% rename from Trees/Trees Interview Problems - SOLUTIONS/bst_trim.png rename to 06-Trees/Trees Interview Problems/03-Trim-a-Binary-Search-Tree/bst_trim.png diff --git a/Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/01-Sequential Search-checkpoint.ipynb similarity index 84% rename from Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/01-Sequential Search-checkpoint.ipynb index f514dc75..2940779d 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/01-Sequential Search-checkpoint.ipynb @@ -20,9 +20,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def seq_search(arr,ele):\n", @@ -51,10 +49,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "arr = [1,9,2,8,3,4,7,5,6]" @@ -62,10 +58,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -76,15 +70,13 @@ } ], "source": [ - "print seq_search(arr,1)" + "print(seq_search(arr,1))" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -95,7 +87,7 @@ } ], "source": [ - "print seq_search(arr,10)" + "print(seq_search(arr,10))" ] }, { @@ -109,10 +101,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "def ordered_seq_search(arr,ele):\n", @@ -150,10 +140,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "arr.sort() " @@ -161,10 +149,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -172,7 +158,7 @@ "True" ] }, - "execution_count": 22, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -183,10 +169,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "data": { @@ -194,7 +178,7 @@ "False" ] }, - "execution_count": 24, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -213,23 +197,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/02-Implementation of Binary Search-checkpoint.ipynb similarity index 80% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/02-Implementation of Binary Search-checkpoint.ipynb index aa558014..2905e78f 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/02-Implementation of Binary Search-checkpoint.ipynb @@ -18,10 +18,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "def binary_search(arr,ele):\n", @@ -35,7 +33,7 @@ " \n", " while first <= last and not found:\n", " \n", - " mid = (first+last)/2 # or // for Python 3\n", + " mid = (first+last)//2\n", " \n", " # Match found\n", " if arr[mid] == ele:\n", @@ -55,10 +53,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "# list must already be sorted!\n", @@ -67,10 +63,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -78,7 +72,7 @@ "True" ] }, - "execution_count": 15, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -89,10 +83,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "data": { @@ -100,7 +92,7 @@ "False" ] }, - "execution_count": 16, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -118,10 +110,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "def rec_bin_search(arr,ele):\n", @@ -133,7 +123,7 @@ " # Recursive Case\n", " else:\n", " \n", - " mid = len(arr)/2\n", + " mid = len(arr)//2\n", " \n", " # If match found\n", " if arr[mid]==ele:\n", @@ -152,10 +142,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "data": { @@ -163,7 +151,7 @@ "True" ] }, - "execution_count": 18, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -174,10 +162,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -185,7 +171,7 @@ "False" ] }, - "execution_count": 20, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -204,23 +190,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/03-Implementation of a Hash Table-checkpoint.ipynb similarity index 91% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/03-Implementation of a Hash Table-checkpoint.ipynb index aa8703ba..cfbb1785 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/03-Implementation of a Hash Table-checkpoint.ipynb @@ -26,9 +26,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class HashTable(object):\n", @@ -126,10 +124,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "h = HashTable(5)" @@ -137,10 +133,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "# Put our first key in\n", @@ -149,10 +143,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "h[2] = 'two'" @@ -160,10 +152,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "h[3] = 'three'" @@ -171,10 +161,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -182,7 +170,7 @@ "'one'" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -193,10 +181,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "h[1] = 'new_one'" @@ -204,10 +190,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -215,7 +199,7 @@ "'new_one'" ] }, - "execution_count": 10, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -226,10 +210,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -240,7 +222,7 @@ } ], "source": [ - "print h[4]" + "print(h[4])" ] }, { @@ -255,23 +237,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Bubble Sort.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/04-Implementation of Bubble Sort-checkpoint.ipynb similarity index 85% rename from Sorting and Searching/Implementation of Bubble Sort.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/04-Implementation of Bubble Sort-checkpoint.ipynb index f88f1bd4..99ce390f 100644 --- a/Sorting and Searching/Implementation of Bubble Sort.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/04-Implementation of Bubble Sort-checkpoint.ipynb @@ -25,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def bubble_sort(arr):\n", @@ -45,10 +43,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "arr = [3,2,13,4,6,5,7,8,1,20]\n", @@ -57,10 +53,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -68,7 +62,7 @@ "[1, 2, 3, 4, 5, 6, 7, 8, 13, 20]" ] }, - "execution_count": 8, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -87,23 +81,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Selection Sort.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/05-Implementation of Selection Sort-checkpoint.ipynb similarity index 91% rename from Sorting and Searching/Implementation of Selection Sort.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/05-Implementation of Selection Sort-checkpoint.ipynb index c6d82a2d..36a61d40 100644 --- a/Sorting and Searching/Implementation of Selection Sort.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/05-Implementation of Selection Sort-checkpoint.ipynb @@ -26,9 +26,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def selection_sort(arr):\n", @@ -51,9 +49,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -82,23 +78,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Insertion Sort.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/06-Implementation of Insertion Sort-checkpoint.ipynb similarity index 88% rename from Sorting and Searching/Implementation of Insertion Sort.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/06-Implementation of Insertion Sort-checkpoint.ipynb index 86b90033..51cde501 100644 --- a/Sorting and Searching/Implementation of Insertion Sort.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/06-Implementation of Insertion Sort-checkpoint.ipynb @@ -25,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def insertion_sort(arr):\n", @@ -51,10 +49,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -62,7 +58,7 @@ "[1, 2, 3, 4, 5, 6, 8, 12, 25, 41]" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -83,23 +79,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Shell Sort.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/07-Implementation of Shell Sort-checkpoint.ipynb similarity index 88% rename from Sorting and Searching/Implementation of Shell Sort.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/07-Implementation of Shell Sort-checkpoint.ipynb index 52bc30fc..16d55a18 100644 --- a/Sorting and Searching/Implementation of Shell Sort.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/07-Implementation of Shell Sort-checkpoint.ipynb @@ -25,13 +25,11 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def shell_sort(arr):\n", - " sublistcount = len(arr)/2\n", + " sublistcount = len(arr)//2\n", " \n", " # While we still have sub lists\n", " while sublistcount > 0:\n", @@ -41,8 +39,8 @@ "\n", " \n", "\n", - " sublistcount = sublistcount / 2\n", - "\n", + " sublistcount = sublistcount // 2\n", + " \n", "def gap_insertion_sort(arr,start,gap):\n", " for i in range(start+gap,len(arr),gap):\n", "\n", @@ -61,9 +59,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -92,23 +88,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Merge Sort.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/08-Implementation of Merge Sort-checkpoint.ipynb similarity index 91% rename from Sorting and Searching/Implementation of Merge Sort.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/08-Implementation of Merge Sort-checkpoint.ipynb index 5a38965b..d643cc46 100644 --- a/Sorting and Searching/Implementation of Merge Sort.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/08-Implementation of Merge Sort-checkpoint.ipynb @@ -25,15 +25,13 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def merge_sort(arr):\n", " \n", " if len(arr)>1:\n", - " mid = len(arr)/2\n", + " mid = len(arr)//2\n", " lefthalf = arr[:mid]\n", " righthalf = arr[mid:]\n", "\n", @@ -66,9 +64,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -97,23 +93,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb b/07-Searching and Sorting/.ipynb_checkpoints/09-Implementation of Quick Sort-checkpoint.ipynb similarity index 90% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb rename to 07-Searching and Sorting/.ipynb_checkpoints/09-Implementation of Quick Sort-checkpoint.ipynb index 7a00715a..b5faf25f 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb +++ b/07-Searching and Sorting/.ipynb_checkpoints/09-Implementation of Quick Sort-checkpoint.ipynb @@ -24,10 +24,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def quick_sort(arr):\n", @@ -78,10 +76,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -89,7 +85,7 @@ "[1, 2, 3, 4, 4, 5, 6, 7, 11, 12]" ] }, - "execution_count": 6, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -110,23 +106,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Sequential Search.ipynb b/07-Searching and Sorting/01-Sequential Search.ipynb similarity index 84% rename from Sorting and Searching/Sequential Search.ipynb rename to 07-Searching and Sorting/01-Sequential Search.ipynb index f514dc75..2940779d 100644 --- a/Sorting and Searching/Sequential Search.ipynb +++ b/07-Searching and Sorting/01-Sequential Search.ipynb @@ -20,9 +20,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def seq_search(arr,ele):\n", @@ -51,10 +49,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "arr = [1,9,2,8,3,4,7,5,6]" @@ -62,10 +58,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -76,15 +70,13 @@ } ], "source": [ - "print seq_search(arr,1)" + "print(seq_search(arr,1))" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -95,7 +87,7 @@ } ], "source": [ - "print seq_search(arr,10)" + "print(seq_search(arr,10))" ] }, { @@ -109,10 +101,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "def ordered_seq_search(arr,ele):\n", @@ -150,10 +140,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "arr.sort() " @@ -161,10 +149,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -172,7 +158,7 @@ "True" ] }, - "execution_count": 22, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -183,10 +169,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, + "execution_count": 9, + "metadata": {}, "outputs": [ { "data": { @@ -194,7 +178,7 @@ "False" ] }, - "execution_count": 24, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -213,23 +197,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Binary Search.ipynb b/07-Searching and Sorting/02-Implementation of Binary Search.ipynb similarity index 80% rename from Sorting and Searching/Implementation of Binary Search.ipynb rename to 07-Searching and Sorting/02-Implementation of Binary Search.ipynb index aa558014..2905e78f 100644 --- a/Sorting and Searching/Implementation of Binary Search.ipynb +++ b/07-Searching and Sorting/02-Implementation of Binary Search.ipynb @@ -18,10 +18,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "def binary_search(arr,ele):\n", @@ -35,7 +33,7 @@ " \n", " while first <= last and not found:\n", " \n", - " mid = (first+last)/2 # or // for Python 3\n", + " mid = (first+last)//2\n", " \n", " # Match found\n", " if arr[mid] == ele:\n", @@ -55,10 +53,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "# list must already be sorted!\n", @@ -67,10 +63,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -78,7 +72,7 @@ "True" ] }, - "execution_count": 15, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -89,10 +83,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, + "execution_count": 7, + "metadata": {}, "outputs": [ { "data": { @@ -100,7 +92,7 @@ "False" ] }, - "execution_count": 16, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -118,10 +110,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "def rec_bin_search(arr,ele):\n", @@ -133,7 +123,7 @@ " # Recursive Case\n", " else:\n", " \n", - " mid = len(arr)/2\n", + " mid = len(arr)//2\n", " \n", " # If match found\n", " if arr[mid]==ele:\n", @@ -152,10 +142,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, + "execution_count": 11, + "metadata": {}, "outputs": [ { "data": { @@ -163,7 +151,7 @@ "True" ] }, - "execution_count": 18, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -174,10 +162,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 12, + "metadata": {}, "outputs": [ { "data": { @@ -185,7 +171,7 @@ "False" ] }, - "execution_count": 20, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -204,23 +190,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of a Hash Table.ipynb b/07-Searching and Sorting/03-Implementation of a Hash Table.ipynb similarity index 91% rename from Sorting and Searching/Implementation of a Hash Table.ipynb rename to 07-Searching and Sorting/03-Implementation of a Hash Table.ipynb index aa8703ba..cfbb1785 100644 --- a/Sorting and Searching/Implementation of a Hash Table.ipynb +++ b/07-Searching and Sorting/03-Implementation of a Hash Table.ipynb @@ -26,9 +26,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class HashTable(object):\n", @@ -126,10 +124,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "h = HashTable(5)" @@ -137,10 +133,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "# Put our first key in\n", @@ -149,10 +143,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "h[2] = 'two'" @@ -160,10 +152,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "h[3] = 'three'" @@ -171,10 +161,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -182,7 +170,7 @@ "'one'" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -193,10 +181,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "h[1] = 'new_one'" @@ -204,10 +190,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { @@ -215,7 +199,7 @@ "'new_one'" ] }, - "execution_count": 10, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -226,10 +210,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -240,7 +222,7 @@ } ], "source": [ - "print h[4]" + "print(h[4])" ] }, { @@ -255,23 +237,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Bubble Sort-checkpoint.ipynb b/07-Searching and Sorting/04-Implementation of Bubble Sort.ipynb similarity index 85% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Bubble Sort-checkpoint.ipynb rename to 07-Searching and Sorting/04-Implementation of Bubble Sort.ipynb index f88f1bd4..99ce390f 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Bubble Sort-checkpoint.ipynb +++ b/07-Searching and Sorting/04-Implementation of Bubble Sort.ipynb @@ -25,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def bubble_sort(arr):\n", @@ -45,10 +43,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "arr = [3,2,13,4,6,5,7,8,1,20]\n", @@ -57,10 +53,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -68,7 +62,7 @@ "[1, 2, 3, 4, 5, 6, 7, 8, 13, 20]" ] }, - "execution_count": 8, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -87,23 +81,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb b/07-Searching and Sorting/05-Implementation of Selection Sort.ipynb similarity index 91% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb rename to 07-Searching and Sorting/05-Implementation of Selection Sort.ipynb index c6d82a2d..36a61d40 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb +++ b/07-Searching and Sorting/05-Implementation of Selection Sort.ipynb @@ -26,9 +26,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def selection_sort(arr):\n", @@ -51,9 +49,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -82,23 +78,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb b/07-Searching and Sorting/06-Implementation of Insertion Sort.ipynb similarity index 88% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb rename to 07-Searching and Sorting/06-Implementation of Insertion Sort.ipynb index 86b90033..51cde501 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb +++ b/07-Searching and Sorting/06-Implementation of Insertion Sort.ipynb @@ -25,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def insertion_sort(arr):\n", @@ -51,10 +49,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -62,7 +58,7 @@ "[1, 2, 3, 4, 5, 6, 8, 12, 25, 41]" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -83,23 +79,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb b/07-Searching and Sorting/07-Implementation of Shell Sort.ipynb similarity index 88% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb rename to 07-Searching and Sorting/07-Implementation of Shell Sort.ipynb index 52bc30fc..16d55a18 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb +++ b/07-Searching and Sorting/07-Implementation of Shell Sort.ipynb @@ -25,13 +25,11 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def shell_sort(arr):\n", - " sublistcount = len(arr)/2\n", + " sublistcount = len(arr)//2\n", " \n", " # While we still have sub lists\n", " while sublistcount > 0:\n", @@ -41,8 +39,8 @@ "\n", " \n", "\n", - " sublistcount = sublistcount / 2\n", - "\n", + " sublistcount = sublistcount // 2\n", + " \n", "def gap_insertion_sort(arr,start,gap):\n", " for i in range(start+gap,len(arr),gap):\n", "\n", @@ -61,9 +59,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -92,23 +88,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb b/07-Searching and Sorting/08-Implementation of Merge Sort.ipynb similarity index 91% rename from Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb rename to 07-Searching and Sorting/08-Implementation of Merge Sort.ipynb index 5a38965b..d643cc46 100644 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb +++ b/07-Searching and Sorting/08-Implementation of Merge Sort.ipynb @@ -25,15 +25,13 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def merge_sort(arr):\n", " \n", " if len(arr)>1:\n", - " mid = len(arr)/2\n", + " mid = len(arr)//2\n", " lefthalf = arr[:mid]\n", " righthalf = arr[mid:]\n", "\n", @@ -66,9 +64,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -97,23 +93,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Sorting and Searching/Implementation of Quick Sort.ipynb b/07-Searching and Sorting/09-Implementation of Quick Sort.ipynb similarity index 90% rename from Sorting and Searching/Implementation of Quick Sort.ipynb rename to 07-Searching and Sorting/09-Implementation of Quick Sort.ipynb index 7a00715a..b5faf25f 100644 --- a/Sorting and Searching/Implementation of Quick Sort.ipynb +++ b/07-Searching and Sorting/09-Implementation of Quick Sort.ipynb @@ -24,10 +24,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def quick_sort(arr):\n", @@ -78,10 +76,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -89,7 +85,7 @@ "[1, 2, 3, 4, 4, 5, 6, 7, 11, 12]" ] }, - "execution_count": 6, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -110,23 +106,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/.ipynb_checkpoints/Implementation of Graph Overview-checkpoint.ipynb b/08-Graphs/.ipynb_checkpoints/01-Implementation of Graph Overview-checkpoint.ipynb similarity index 82% rename from Graphs/.ipynb_checkpoints/Implementation of Graph Overview-checkpoint.ipynb rename to 08-Graphs/.ipynb_checkpoints/01-Implementation of Graph Overview-checkpoint.ipynb index 5d2d34d8..6ae4e9ff 100644 --- a/Graphs/.ipynb_checkpoints/Implementation of Graph Overview-checkpoint.ipynb +++ b/08-Graphs/.ipynb_checkpoints/01-Implementation of Graph Overview-checkpoint.ipynb @@ -18,10 +18,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "from enum import Enum \n", @@ -41,10 +39,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "from collections import OrderedDict\n", @@ -69,10 +65,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "class Graph:\n", @@ -95,10 +89,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "g = Graph()\n", @@ -107,19 +99,17 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "OrderedDict([(0, <__main__.Node instance at 0x103a761b8>),\n", - " (1, <__main__.Node instance at 0x104dfef80>)])" + "OrderedDict([(0, <__main__.Node at 0x7fef88790be0>),\n", + " (1, <__main__.Node at 0x7fef88790b80>)])" ] }, - "execution_count": 15, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -138,23 +128,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Implementation of Adjacency List.ipynb b/08-Graphs/.ipynb_checkpoints/02-Implementation of Adjacency List-checkpoint.ipynb similarity index 83% rename from Graphs/Implementation of Adjacency List.ipynb rename to 08-Graphs/.ipynb_checkpoints/02-Implementation of Adjacency List-checkpoint.ipynb index 83f84026..da321838 100644 --- a/Graphs/Implementation of Adjacency List.ipynb +++ b/08-Graphs/.ipynb_checkpoints/02-Implementation of Adjacency List-checkpoint.ipynb @@ -14,10 +14,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Vertex:\n", @@ -60,10 +58,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "class Graph:\n", @@ -109,10 +105,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "g = Graph()\n", @@ -122,23 +116,21 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{0: <__main__.Vertex instance at 0x10476b680>,\n", - " 1: <__main__.Vertex instance at 0x104cce5f0>,\n", - " 2: <__main__.Vertex instance at 0x10395d950>,\n", - " 3: <__main__.Vertex instance at 0x1039c00e0>,\n", - " 4: <__main__.Vertex instance at 0x1039c4e60>,\n", - " 5: <__main__.Vertex instance at 0x1039c45f0>}" + "{0: <__main__.Vertex at 0x7fc9084f7e50>,\n", + " 1: <__main__.Vertex at 0x7fc9084f7fd0>,\n", + " 2: <__main__.Vertex at 0x7fc9084f7940>,\n", + " 3: <__main__.Vertex at 0x7fc9084f7eb0>,\n", + " 4: <__main__.Vertex at 0x7fc9084f7f40>,\n", + " 5: <__main__.Vertex at 0x7fc9084f7ac0>}" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -149,10 +141,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "g.addEdge(0,1,2)" @@ -160,37 +150,35 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 connectedTo: [1]\n", - "[<__main__.Vertex instance at 0x104cce5f0>]\n", + "dict_keys([<__main__.Vertex object at 0x7fc9084f7fd0>])\n", "\n", "\n", "1 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "2 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "3 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "4 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "5 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n" ] @@ -198,9 +186,9 @@ ], "source": [ "for vertex in g:\n", - " print vertex\n", - " print vertex.getConnections()\n", - " print '\\n'" + " print(vertex)\n", + " print(vertex.getConnections())\n", + " print('\\n')" ] }, { @@ -213,23 +201,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/.ipynb_checkpoints/Word Ladder Example Problem-checkpoint.ipynb b/08-Graphs/.ipynb_checkpoints/03-Word Ladder Example Problem-checkpoint.ipynb similarity index 90% rename from Graphs/.ipynb_checkpoints/Word Ladder Example Problem-checkpoint.ipynb rename to 08-Graphs/.ipynb_checkpoints/03-Word Ladder Example Problem-checkpoint.ipynb index a90aefdd..ab03f959 100644 --- a/Graphs/.ipynb_checkpoints/Word Ladder Example Problem-checkpoint.ipynb +++ b/08-Graphs/.ipynb_checkpoints/03-Word Ladder Example Problem-checkpoint.ipynb @@ -14,9 +14,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Vertex:\n", @@ -43,9 +41,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Graph:\n", @@ -91,10 +87,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "def buildGraph(wordFile):\n", @@ -104,9 +98,9 @@ " wfile = open(wordFile,'r')\n", " # create buckets of words that differ by one letter\n", " for line in wfile:\n", - " print line\n", + " print(line)\n", " word = line[:-1]\n", - " print word\n", + " print(word)\n", " for i in range(len(word)):\n", " bucket = word[:i] + '_' + word[i+1:]\n", " if bucket in d:\n", @@ -132,23 +126,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/.ipynb_checkpoints/Knight's Tour Example Problem-checkpoint.ipynb b/08-Graphs/.ipynb_checkpoints/04-Knight's Tour Example Problem-checkpoint.ipynb similarity index 90% rename from Graphs/.ipynb_checkpoints/Knight's Tour Example Problem-checkpoint.ipynb rename to 08-Graphs/.ipynb_checkpoints/04-Knight's Tour Example Problem-checkpoint.ipynb index 1504a502..96dd0f9b 100644 --- a/Graphs/.ipynb_checkpoints/Knight's Tour Example Problem-checkpoint.ipynb +++ b/08-Graphs/.ipynb_checkpoints/04-Knight's Tour Example Problem-checkpoint.ipynb @@ -14,9 +14,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def knightGraph(bdSize):\n", @@ -37,9 +35,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def genLegalMoves(x,y,bdSize):\n", @@ -64,9 +60,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def knightTour(n,path,u,limit):\n", @@ -91,23 +85,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Implementation of Depth First Search.ipynb b/08-Graphs/.ipynb_checkpoints/05-Implementation of Depth First Search-checkpoint.ipynb similarity index 90% rename from Graphs/Implementation of Depth First Search.ipynb rename to 08-Graphs/.ipynb_checkpoints/05-Implementation of Depth First Search-checkpoint.ipynb index 9551040f..dd2f9279 100644 --- a/Graphs/Implementation of Depth First Search.ipynb +++ b/08-Graphs/.ipynb_checkpoints/05-Implementation of Depth First Search-checkpoint.ipynb @@ -15,10 +15,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "graph = {'A': set(['B', 'C']),\n", @@ -40,10 +38,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -51,7 +47,7 @@ "{'A', 'B', 'C', 'D', 'E', 'F'}" ] }, - "execution_count": 15, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -78,10 +74,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -89,7 +83,7 @@ "{'A', 'B', 'C', 'D', 'E', 'F'}" ] }, - "execution_count": 12, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -116,10 +110,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { @@ -127,7 +119,7 @@ "[['A', 'B', 'E', 'F'], ['A', 'C', 'F']]" ] }, - "execution_count": 11, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -162,23 +154,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Implementation of Breadth First Search.ipynb b/08-Graphs/.ipynb_checkpoints/06-Implementation of Breadth First Search-checkpoint.ipynb similarity index 93% rename from Graphs/Implementation of Breadth First Search.ipynb rename to 08-Graphs/.ipynb_checkpoints/06-Implementation of Breadth First Search-checkpoint.ipynb index cd18f9b7..4810b9fb 100644 --- a/Graphs/Implementation of Breadth First Search.ipynb +++ b/08-Graphs/.ipynb_checkpoints/06-Implementation of Breadth First Search-checkpoint.ipynb @@ -17,9 +17,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "graph = {'A': set(['B', 'C']),\n", @@ -41,9 +39,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -80,9 +76,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -119,9 +113,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -160,23 +152,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Implementation of Graph Overview.ipynb b/08-Graphs/01-Implementation of Graph Overview.ipynb similarity index 82% rename from Graphs/Implementation of Graph Overview.ipynb rename to 08-Graphs/01-Implementation of Graph Overview.ipynb index 5d2d34d8..6ae4e9ff 100644 --- a/Graphs/Implementation of Graph Overview.ipynb +++ b/08-Graphs/01-Implementation of Graph Overview.ipynb @@ -18,10 +18,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "from enum import Enum \n", @@ -41,10 +39,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "from collections import OrderedDict\n", @@ -69,10 +65,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "class Graph:\n", @@ -95,10 +89,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "g = Graph()\n", @@ -107,19 +99,17 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "OrderedDict([(0, <__main__.Node instance at 0x103a761b8>),\n", - " (1, <__main__.Node instance at 0x104dfef80>)])" + "OrderedDict([(0, <__main__.Node at 0x7fef88790be0>),\n", + " (1, <__main__.Node at 0x7fef88790b80>)])" ] }, - "execution_count": 15, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -138,23 +128,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/.ipynb_checkpoints/Implementation of Adjacency List-checkpoint.ipynb b/08-Graphs/02-Implementation of Adjacency List.ipynb similarity index 83% rename from Graphs/.ipynb_checkpoints/Implementation of Adjacency List-checkpoint.ipynb rename to 08-Graphs/02-Implementation of Adjacency List.ipynb index 83f84026..da321838 100644 --- a/Graphs/.ipynb_checkpoints/Implementation of Adjacency List-checkpoint.ipynb +++ b/08-Graphs/02-Implementation of Adjacency List.ipynb @@ -14,10 +14,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "class Vertex:\n", @@ -60,10 +58,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "class Graph:\n", @@ -109,10 +105,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "g = Graph()\n", @@ -122,23 +116,21 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{0: <__main__.Vertex instance at 0x10476b680>,\n", - " 1: <__main__.Vertex instance at 0x104cce5f0>,\n", - " 2: <__main__.Vertex instance at 0x10395d950>,\n", - " 3: <__main__.Vertex instance at 0x1039c00e0>,\n", - " 4: <__main__.Vertex instance at 0x1039c4e60>,\n", - " 5: <__main__.Vertex instance at 0x1039c45f0>}" + "{0: <__main__.Vertex at 0x7fc9084f7e50>,\n", + " 1: <__main__.Vertex at 0x7fc9084f7fd0>,\n", + " 2: <__main__.Vertex at 0x7fc9084f7940>,\n", + " 3: <__main__.Vertex at 0x7fc9084f7eb0>,\n", + " 4: <__main__.Vertex at 0x7fc9084f7f40>,\n", + " 5: <__main__.Vertex at 0x7fc9084f7ac0>}" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -149,10 +141,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "g.addEdge(0,1,2)" @@ -160,37 +150,35 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 connectedTo: [1]\n", - "[<__main__.Vertex instance at 0x104cce5f0>]\n", + "dict_keys([<__main__.Vertex object at 0x7fc9084f7fd0>])\n", "\n", "\n", "1 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "2 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "3 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "4 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n", "5 connectedTo: []\n", - "[]\n", + "dict_keys([])\n", "\n", "\n" ] @@ -198,9 +186,9 @@ ], "source": [ "for vertex in g:\n", - " print vertex\n", - " print vertex.getConnections()\n", - " print '\\n'" + " print(vertex)\n", + " print(vertex.getConnections())\n", + " print('\\n')" ] }, { @@ -213,23 +201,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Word Ladder Example Problem.ipynb b/08-Graphs/03-Word Ladder Example Problem.ipynb similarity index 90% rename from Graphs/Word Ladder Example Problem.ipynb rename to 08-Graphs/03-Word Ladder Example Problem.ipynb index a90aefdd..ab03f959 100644 --- a/Graphs/Word Ladder Example Problem.ipynb +++ b/08-Graphs/03-Word Ladder Example Problem.ipynb @@ -14,9 +14,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Vertex:\n", @@ -43,9 +41,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "class Graph:\n", @@ -91,10 +87,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "def buildGraph(wordFile):\n", @@ -104,9 +98,9 @@ " wfile = open(wordFile,'r')\n", " # create buckets of words that differ by one letter\n", " for line in wfile:\n", - " print line\n", + " print(line)\n", " word = line[:-1]\n", - " print word\n", + " print(word)\n", " for i in range(len(word)):\n", " bucket = word[:i] + '_' + word[i+1:]\n", " if bucket in d:\n", @@ -132,23 +126,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Knight's Tour Example Problem.ipynb b/08-Graphs/04-Knight's Tour Example Problem.ipynb similarity index 90% rename from Graphs/Knight's Tour Example Problem.ipynb rename to 08-Graphs/04-Knight's Tour Example Problem.ipynb index 1504a502..96dd0f9b 100644 --- a/Graphs/Knight's Tour Example Problem.ipynb +++ b/08-Graphs/04-Knight's Tour Example Problem.ipynb @@ -14,9 +14,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def knightGraph(bdSize):\n", @@ -37,9 +35,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def genLegalMoves(x,y,bdSize):\n", @@ -64,9 +60,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def knightTour(n,path,u,limit):\n", @@ -91,23 +85,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/.ipynb_checkpoints/Implementation of Depth First Search-checkpoint.ipynb b/08-Graphs/05-Implementation of Depth First Search.ipynb similarity index 90% rename from Graphs/.ipynb_checkpoints/Implementation of Depth First Search-checkpoint.ipynb rename to 08-Graphs/05-Implementation of Depth First Search.ipynb index 9551040f..dd2f9279 100644 --- a/Graphs/.ipynb_checkpoints/Implementation of Depth First Search-checkpoint.ipynb +++ b/08-Graphs/05-Implementation of Depth First Search.ipynb @@ -15,10 +15,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "graph = {'A': set(['B', 'C']),\n", @@ -40,10 +38,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -51,7 +47,7 @@ "{'A', 'B', 'C', 'D', 'E', 'F'}" ] }, - "execution_count": 15, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -78,10 +74,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -89,7 +83,7 @@ "{'A', 'B', 'C', 'D', 'E', 'F'}" ] }, - "execution_count": 12, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -116,10 +110,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { @@ -127,7 +119,7 @@ "[['A', 'B', 'E', 'F'], ['A', 'C', 'F']]" ] }, - "execution_count": 11, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -162,23 +154,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/.ipynb_checkpoints/Implementation of Breadth First Search-checkpoint.ipynb b/08-Graphs/06-Implementation of Breadth First Search.ipynb similarity index 93% rename from Graphs/.ipynb_checkpoints/Implementation of Breadth First Search-checkpoint.ipynb rename to 08-Graphs/06-Implementation of Breadth First Search.ipynb index cd18f9b7..4810b9fb 100644 --- a/Graphs/.ipynb_checkpoints/Implementation of Breadth First Search-checkpoint.ipynb +++ b/08-Graphs/06-Implementation of Breadth First Search.ipynb @@ -17,9 +17,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "graph = {'A': set(['B', 'C']),\n", @@ -41,9 +39,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -80,9 +76,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -119,9 +113,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -160,23 +152,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement a Graph-checkpoint.ipynb b/08-Graphs/Graph Interview Questions/.ipynb_checkpoints/01-Implement a Graph-checkpoint.ipynb similarity index 83% rename from Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement a Graph-checkpoint.ipynb rename to 08-Graphs/Graph Interview Questions/.ipynb_checkpoints/01-Implement a Graph-checkpoint.ipynb index b6362791..cec7b0d3 100644 --- a/Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement a Graph-checkpoint.ipynb +++ b/08-Graphs/Graph Interview Questions/.ipynb_checkpoints/01-Implement a Graph-checkpoint.ipynb @@ -23,23 +23,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement Depth First Search Algorithm-checkpoint.ipynb b/08-Graphs/Graph Interview Questions/.ipynb_checkpoints/02-Implement Depth First Search Algorithm-checkpoint.ipynb similarity index 88% rename from Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement Depth First Search Algorithm-checkpoint.ipynb rename to 08-Graphs/Graph Interview Questions/.ipynb_checkpoints/02-Implement Depth First Search Algorithm-checkpoint.ipynb index 94da601e..a7a98ac6 100644 --- a/Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement Depth First Search Algorithm-checkpoint.ipynb +++ b/08-Graphs/Graph Interview Questions/.ipynb_checkpoints/02-Implement Depth First Search Algorithm-checkpoint.ipynb @@ -40,23 +40,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Graph Interview Questions/Implement Breadth First Search Algorithm.ipynb b/08-Graphs/Graph Interview Questions/.ipynb_checkpoints/03-Implement Breadth First Search Algorithm-checkpoint.ipynb similarity index 88% rename from Graphs/Graph Interview Questions/Implement Breadth First Search Algorithm.ipynb rename to 08-Graphs/Graph Interview Questions/.ipynb_checkpoints/03-Implement Breadth First Search Algorithm-checkpoint.ipynb index 039d98f3..b9ded929 100644 --- a/Graphs/Graph Interview Questions/Implement Breadth First Search Algorithm.ipynb +++ b/08-Graphs/Graph Interview Questions/.ipynb_checkpoints/03-Implement Breadth First Search Algorithm-checkpoint.ipynb @@ -40,23 +40,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Graph Interview Questions/Implement a Graph.ipynb b/08-Graphs/Graph Interview Questions/01-Implement a Graph.ipynb similarity index 83% rename from Graphs/Graph Interview Questions/Implement a Graph.ipynb rename to 08-Graphs/Graph Interview Questions/01-Implement a Graph.ipynb index b6362791..cec7b0d3 100644 --- a/Graphs/Graph Interview Questions/Implement a Graph.ipynb +++ b/08-Graphs/Graph Interview Questions/01-Implement a Graph.ipynb @@ -23,23 +23,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Graph Interview Questions/Implement Depth First Search Algorithm.ipynb b/08-Graphs/Graph Interview Questions/02-Implement Depth First Search Algorithm.ipynb similarity index 88% rename from Graphs/Graph Interview Questions/Implement Depth First Search Algorithm.ipynb rename to 08-Graphs/Graph Interview Questions/02-Implement Depth First Search Algorithm.ipynb index 94da601e..a7a98ac6 100644 --- a/Graphs/Graph Interview Questions/Implement Depth First Search Algorithm.ipynb +++ b/08-Graphs/Graph Interview Questions/02-Implement Depth First Search Algorithm.ipynb @@ -40,23 +40,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement Breadth First Search Algorithm-checkpoint.ipynb b/08-Graphs/Graph Interview Questions/03-Implement Breadth First Search Algorithm.ipynb similarity index 88% rename from Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement Breadth First Search Algorithm-checkpoint.ipynb rename to 08-Graphs/Graph Interview Questions/03-Implement Breadth First Search Algorithm.ipynb index 039d98f3..b9ded929 100644 --- a/Graphs/Graph Interview Questions/.ipynb_checkpoints/Implement Breadth First Search Algorithm-checkpoint.ipynb +++ b/08-Graphs/Graph Interview Questions/03-Implement Breadth First Search Algorithm.ipynb @@ -40,23 +40,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Graphs/words.txt b/08-Graphs/words.txt similarity index 100% rename from Graphs/words.txt rename to 08-Graphs/words.txt diff --git a/Riddles/.ipynb_checkpoints/How to Approach Riddles-checkpoint.ipynb b/09-Riddles/.ipynb_checkpoints/01-How to Approach Riddles-checkpoint.ipynb similarity index 77% rename from Riddles/.ipynb_checkpoints/How to Approach Riddles-checkpoint.ipynb rename to 09-Riddles/.ipynb_checkpoints/01-How to Approach Riddles-checkpoint.ipynb index 6d3eb2cd..f26fc8bc 100644 --- a/Riddles/.ipynb_checkpoints/How to Approach Riddles-checkpoint.ipynb +++ b/09-Riddles/.ipynb_checkpoints/01-How to Approach Riddles-checkpoint.ipynb @@ -12,23 +12,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Riddles/How to Approach Riddles.ipynb b/09-Riddles/01-How to Approach Riddles.ipynb similarity index 77% rename from Riddles/How to Approach Riddles.ipynb rename to 09-Riddles/01-How to Approach Riddles.ipynb index 6d3eb2cd..f26fc8bc 100644 --- a/Riddles/How to Approach Riddles.ipynb +++ b/09-Riddles/01-How to Approach Riddles.ipynb @@ -12,23 +12,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Bridge Crossing - SOLUTION-checkpoint.ipynb b/09-Riddles/Riddle Interview Problems/01-Bridge-Crossing/01-Bridge Crossing - SOLUTION.ipynb similarity index 93% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Bridge Crossing - SOLUTION-checkpoint.ipynb rename to 09-Riddles/Riddle Interview Problems/01-Bridge-Crossing/01-Bridge Crossing - SOLUTION.ipynb index 6932931a..babeb820 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Bridge Crossing - SOLUTION-checkpoint.ipynb +++ b/09-Riddles/Riddle Interview Problems/01-Bridge-Crossing/01-Bridge Crossing - SOLUTION.ipynb @@ -44,23 +44,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Bridge Crossing - SOLUTION.ipynb b/09-Riddles/Riddle Interview Problems/01-Bridge-Crossing/01-Bridge Crossing.ipynb similarity index 51% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Bridge Crossing - SOLUTION.ipynb rename to 09-Riddles/Riddle Interview Problems/01-Bridge-Crossing/01-Bridge Crossing.ipynb index 6932931a..bf2f5ac0 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Bridge Crossing - SOLUTION.ipynb +++ b/09-Riddles/Riddle Interview Problems/01-Bridge-Crossing/01-Bridge Crossing.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Bridge Crossing - SOLUTION" + "# Bridge Crossing" ] }, { @@ -18,49 +18,29 @@ "The travelers have one flashlight among them. Each traveler walks at a different speed: The first can cross the bridge in 1 minute, the second in 2 minutes, the third in 5 minutes, and the fourth takes 10 minutes to cross the bridge. If two travelers cross together, they walk at the speed of the slower traveler.\n", "\n", "What is the least amount of time in which all the travelers can cross from one side of the bridge to the other?\n", - "\n", - "## Solution\n", - "\n", - "This is part of a common group of [river crossing](https://en.wikipedia.org/wiki/River_crossing_puzzle) puzzles. Its know as the [Bridge and Torch problem](https://en.wikipedia.org/wiki/Bridge_and_torch_problem) (sometimes the times assigned to each person are different).\n", - "\n", - "The solution to this version is:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
MoveTime
(1) & (2) Cross with Torch2
(1) Returns with Torch1
(5) & (10) Cross with Torch10
(2) Returns with Torch2
(1) & (2) Cross with Torch2
 17
" + "\n" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Coins and a Scale - SOLUTION.ipynb b/09-Riddles/Riddle Interview Problems/02-Coins-and-a-Scale/02-Coins and a Scale - SOLUTION.ipynb similarity index 91% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Coins and a Scale - SOLUTION.ipynb rename to 09-Riddles/Riddle Interview Problems/02-Coins-and-a-Scale/02-Coins and a Scale - SOLUTION.ipynb index dd6ce0ad..ab9c39c7 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Coins and a Scale - SOLUTION.ipynb +++ b/09-Riddles/Riddle Interview Problems/02-Coins-and-a-Scale/02-Coins and a Scale - SOLUTION.ipynb @@ -17,23 +17,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/09-Riddles/Riddle Interview Problems/02-Coins-and-a-Scale/02-Coins and a Scale .ipynb b/09-Riddles/Riddle Interview Problems/02-Coins-and-a-Scale/02-Coins and a Scale .ipynb new file mode 100644 index 00000000..fc651052 --- /dev/null +++ b/09-Riddles/Riddle Interview Problems/02-Coins-and-a-Scale/02-Coins and a Scale .ipynb @@ -0,0 +1,35 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Coins and a Scale \n", + "## Problem Statement\n", + "\n", + "You have eight coins and a two-pan scale. All the coins weigh the same, **except for one** which is heavier than all the others. The coins are otherwise indistinguishable. You may make no assumptions about how much heavier the heavy coin is. What is the minimum number of weighings needed to be certain of identifying the heavy coin?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Egg Drop - SOLUTION-checkpoint.ipynb b/09-Riddles/Riddle Interview Problems/03-Egg-Drop/03-Egg Drop - SOLUTION.ipynb similarity index 95% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Egg Drop - SOLUTION-checkpoint.ipynb rename to 09-Riddles/Riddle Interview Problems/03-Egg-Drop/03-Egg Drop - SOLUTION.ipynb index 3a39349e..0e19d09e 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Egg Drop - SOLUTION-checkpoint.ipynb +++ b/09-Riddles/Riddle Interview Problems/03-Egg-Drop/03-Egg Drop - SOLUTION.ipynb @@ -51,23 +51,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/09-Riddles/Riddle Interview Problems/03-Egg-Drop/03-Egg Drop .ipynb b/09-Riddles/Riddle Interview Problems/03-Egg-Drop/03-Egg Drop .ipynb new file mode 100644 index 00000000..4b9a3c20 --- /dev/null +++ b/09-Riddles/Riddle Interview Problems/03-Egg-Drop/03-Egg Drop .ipynb @@ -0,0 +1,38 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Egg Drop \n", + "This is probably the most common brain teaser riddle out of the group, so really try to think algorithmically about this problem before looking at the solution!\n", + "## Problem Statement\n", + "\n", + "A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.\n", + "\n", + "Show algorithmically how you would go about doing this in as few drops as possible. (Your answer should be a number of the fewest drops needed for testing 2 eggs on 100 floors)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Hallway Lockers -SOLUTION.ipynb b/09-Riddles/Riddle Interview Problems/04-Hallway-Lockers/04-Hallway Lockers -SOLUTION.ipynb similarity index 96% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Hallway Lockers -SOLUTION.ipynb rename to 09-Riddles/Riddle Interview Problems/04-Hallway-Lockers/04-Hallway Lockers -SOLUTION.ipynb index 3e7b54f7..a51dc1b4 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Hallway Lockers -SOLUTION.ipynb +++ b/09-Riddles/Riddle Interview Problems/04-Hallway-Lockers/04-Hallway Lockers -SOLUTION.ipynb @@ -41,23 +41,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/09-Riddles/Riddle Interview Problems/04-Hallway-Lockers/04-Hallway Lockers.ipynb b/09-Riddles/Riddle Interview Problems/04-Hallway-Lockers/04-Hallway Lockers.ipynb new file mode 100644 index 00000000..8495c76f --- /dev/null +++ b/09-Riddles/Riddle Interview Problems/04-Hallway-Lockers/04-Hallway Lockers.ipynb @@ -0,0 +1,35 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hallway Lockers\n", + "## Problem Statement\n", + "\n", + "You are in a hallway lined with 100 lockers. You start with one pass and open the lockers, so that the *opened* lockers are now with their doors opened out. You begin by closing **every second** locker. Then you go to close **every third** locker and **close it if it is open or open it if it’s closed** — we will refer to this as \"toggling\" the lockers. You continue toggling every nth locker on pass number n. After your hundredth pass of the hallway, in which you toggle only locker number 100, how many lockers are open?\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/09-Riddles/Riddle Interview Problems/05-Jugs-of-Water/05-Jugs of Water - SOLUTION.ipynb b/09-Riddles/Riddle Interview Problems/05-Jugs-of-Water/05-Jugs of Water - SOLUTION.ipynb new file mode 100644 index 00000000..a5577345 --- /dev/null +++ b/09-Riddles/Riddle Interview Problems/05-Jugs-of-Water/05-Jugs of Water - SOLUTION.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jugs of Water - SOLUTION\n", + "## Problem Statement\n", + "\n", + "You have a five gallons jug and a three gallons jug, and an unlimited supply of water (but no measuring cups) How would you come up with exactly four gallons of water?\n", + "\n", + "## Solution\n", + "\n", + "This problem has a cameo in the movie Die Hard 3. The solution is below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "Image(url='http://mindyourdecisions.com/blog/wp-content/uploads/2013/02/water-jug-riddle-1.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hopefully your interviews are not as stressful as this:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('BVtQNK_ZUJg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Yippee Ki Yay" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/09-Riddles/Riddle Interview Problems/05-Jugs-of-Water/05-Jugs of Water .ipynb b/09-Riddles/Riddle Interview Problems/05-Jugs-of-Water/05-Jugs of Water .ipynb new file mode 100644 index 00000000..878051e3 --- /dev/null +++ b/09-Riddles/Riddle Interview Problems/05-Jugs-of-Water/05-Jugs of Water .ipynb @@ -0,0 +1,35 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jugs of Water \n", + "## Problem Statement\n", + "\n", + "You have a five gallons jug and a three gallons jug, and an unlimited supply of water (but no measuring cups) How would you come up with exactly four gallons of water?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Light Switches - SOLUTION.ipynb b/09-Riddles/Riddle Interview Problems/06-Light-Switches/06-Light Switches - SOLUTION.ipynb similarity index 91% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Light Switches - SOLUTION.ipynb rename to 09-Riddles/Riddle Interview Problems/06-Light-Switches/06-Light Switches - SOLUTION.ipynb index f06d5f7d..aac7e69d 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Light Switches - SOLUTION.ipynb +++ b/09-Riddles/Riddle Interview Problems/06-Light-Switches/06-Light Switches - SOLUTION.ipynb @@ -25,23 +25,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/09-Riddles/Riddle Interview Problems/06-Light-Switches/06-Light Switches .ipynb b/09-Riddles/Riddle Interview Problems/06-Light-Switches/06-Light Switches .ipynb new file mode 100644 index 00000000..2d68143c --- /dev/null +++ b/09-Riddles/Riddle Interview Problems/06-Light-Switches/06-Light Switches .ipynb @@ -0,0 +1,37 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Light Switches\n", + "## Problem Statement\n", + "\n", + "You are in a hallway next to three light switches, all of which are off. Each switch activates a different *incandescent* light bulb in the room at the end of the hall. You cannot see the lights from where the switches are. Your task is to determine which light corresponds to each switch. However, you may go into the room with the lights only once.\n", + "\n", + "**Note: This is a bit of \"trick\" question, so don't spend too much time on it. Although it is more on the \"fun\" side of brain teaser type questions.**\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Ropes Burning - SOLUTION-checkpoint.ipynb b/09-Riddles/Riddle Interview Problems/07-Ropes-Burning/07-Ropes Burning - SOLUTION.ipynb similarity index 88% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Ropes Burning - SOLUTION-checkpoint.ipynb rename to 09-Riddles/Riddle Interview Problems/07-Ropes-Burning/07-Ropes Burning - SOLUTION.ipynb index a4473f76..182865ea 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Ropes Burning - SOLUTION-checkpoint.ipynb +++ b/09-Riddles/Riddle Interview Problems/07-Ropes-Burning/07-Ropes Burning - SOLUTION.ipynb @@ -27,23 +27,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Ropes Burning - SOLUTION.ipynb b/09-Riddles/Riddle Interview Problems/07-Ropes-Burning/07-Ropes Burning.ipynb similarity index 55% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Ropes Burning - SOLUTION.ipynb rename to 09-Riddles/Riddle Interview Problems/07-Ropes-Burning/07-Ropes Burning.ipynb index a4473f76..6dd17500 100644 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Ropes Burning - SOLUTION.ipynb +++ b/09-Riddles/Riddle Interview Problems/07-Ropes-Burning/07-Ropes Burning.ipynb @@ -4,46 +4,36 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Ropes Burning - SOLUTION\n", + "# Ropes Burning \n", "## Problem Statement\n", "\n", "You have two ropes. Each takes exactly 60 minutes to burn.\n", "\n", "They are made of different material so even though they take the same amount of time to burn, they burn at separate rates. In addition, each rope burns inconsistently.\n", "\n", - "How do you measure out exactly 45 minutes?\n", - "\n", - "## Solution\n", - "\n", - "Take one rope and burn it at both ends.\n", - "\n", - "At the same time, burn one end of the other rope.\n", - "\n", - "When the first rope finishes burning, light the other end of the remaining rope.\n", - "\n", - "When it burns out, that's 45 minutes." + "How do you measure out exactly 45 minutes?" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/10-Mock Interviews/01-Large E-Commerce Company/01-On-Site-Question-1/01-On-Site Question 1 - SOLUTION.ipynb similarity index 78% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/01-On-Site-Question-1/01-On-Site Question 1 - SOLUTION.ipynb index 2ac17359..a1f784f2 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/01-On-Site-Question-1/01-On-Site Question 1 - SOLUTION.ipynb @@ -46,9 +46,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "def profit(stock_prices):\n", @@ -76,10 +74,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -87,7 +83,7 @@ "39" ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -110,10 +106,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "def profit2(stock_prices):\n", @@ -153,10 +147,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "ename": "Exception", @@ -165,8 +157,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Exception Raised\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprofit2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprofit2\u001b[0;34m(stock_prices)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Check length\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstock_prices\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Need at least two stock prices!'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# Start minimum price marker at first price\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Exception Raised\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprofit2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mprofit2\u001b[0;34m(stock_prices)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Check length\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstock_prices\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Need at least two stock prices!'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# Start minimum price marker at first price\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mException\u001b[0m: Need at least two stock prices!" ] } @@ -178,10 +170,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { @@ -189,7 +179,7 @@ "-1" ] }, - "execution_count": 12, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -210,23 +200,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb b/10-Mock Interviews/01-Large E-Commerce Company/01-On-Site-Question-1/01-On-Site Question 1.ipynb similarity index 91% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/01-On-Site-Question-1/01-On-Site Question 1.ipynb index 301d05a0..0726438d 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/01-On-Site-Question-1/01-On-Site Question 1.ipynb @@ -34,23 +34,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/10-Mock Interviews/01-Large E-Commerce Company/02-On-Site-Question-2/02-On-Site Question 2 - SOLUTION.ipynb similarity index 90% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/02-On-Site-Question-2/02-On-Site Question 2 - SOLUTION.ipynb index f4f594ff..ded3038f 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/02-On-Site-Question-2/02-On-Site Question 2 - SOLUTION.ipynb @@ -43,10 +43,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "def index_prod(lst):\n", @@ -89,10 +87,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "data": { @@ -100,7 +96,7 @@ "[24, 12, 8, 6]" ] }, - "execution_count": 20, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -111,10 +107,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { @@ -122,7 +116,7 @@ "[24, 0, 0, 0, 0]" ] }, - "execution_count": 21, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -142,23 +136,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb b/10-Mock Interviews/01-Large E-Commerce Company/02-On-Site-Question-2/02-On-Site Question 2 .ipynb similarity index 88% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/02-On-Site-Question-2/02-On-Site Question 2 .ipynb index 03231384..de447f10 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/02-On-Site-Question-2/02-On-Site Question 2 .ipynb @@ -29,23 +29,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb b/10-Mock Interviews/01-Large E-Commerce Company/03-On-Site-Question-3/03-On-Site Question 3 - SOLUTION.ipynb similarity index 91% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/03-On-Site-Question-3/03-On-Site Question 3 - SOLUTION.ipynb index f3b22b3b..79c21d9b 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/03-On-Site-Question-3/03-On-Site Question 3 - SOLUTION.ipynb @@ -13,10 +13,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "r1 = {\n", @@ -69,10 +67,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "def calc_overlap(coor1,dim1,coor2,dim2):\n", @@ -110,10 +106,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "def calc_rect_overlap(r1,r2):\n", @@ -125,7 +119,7 @@ " \n", " # If either returned None tuples, then there is no overlap!\n", " if not w_overlap or not h_overlap:\n", - " print 'There was no overlap!'\n", + " print('There was no overlap!')\n", " return None\n", " \n", " # Otherwise return the dictionary format of the overlapping rectangle\n", @@ -141,18 +135,16 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'h': 11, 'w': 5, 'x': 2, 'y': 5}" + "{'x': 2, 'y': 5, 'w': 5, 'h': 11}" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -174,23 +166,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb b/10-Mock Interviews/01-Large E-Commerce Company/03-On-Site-Question-3/03-On-Site Question 3.ipynb similarity index 87% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/03-On-Site-Question-3/03-On-Site Question 3.ipynb index b7d2c7e4..43c2cd76 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/03-On-Site-Question-3/03-On-Site Question 3.ipynb @@ -13,10 +13,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "r1 = {\n", @@ -56,23 +54,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb b/10-Mock Interviews/01-Large E-Commerce Company/04-Phone-Screen/04-Phone Screen - SOLUTION.ipynb similarity index 95% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/04-Phone-Screen/04-Phone Screen - SOLUTION.ipynb index 042f7a06..5f192cec 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/04-Phone-Screen/04-Phone Screen - SOLUTION.ipynb @@ -63,23 +63,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb b/10-Mock Interviews/01-Large E-Commerce Company/04-Phone-Screen/04-Phone Screen .ipynb similarity index 89% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb rename to 10-Mock Interviews/01-Large E-Commerce Company/04-Phone-Screen/04-Phone Screen .ipynb index f9dd3787..3cb28e95 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb +++ b/10-Mock Interviews/01-Large E-Commerce Company/04-Phone-Screen/04-Phone Screen .ipynb @@ -27,23 +27,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/10-Mock Interviews/02-Large Search Engine Company /01-On-Site-Question-1/01-On-Site Question 1 - SOLUTION.ipynb b/10-Mock Interviews/02-Large Search Engine Company /01-On-Site-Question-1/01-On-Site Question 1 - SOLUTION.ipynb new file mode 100644 index 00000000..2b13d615 --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /01-On-Site-Question-1/01-On-Site Question 1 - SOLUTION.ipynb @@ -0,0 +1,122 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 1 - SOLUTION\n", + "___\n", + "\n", + "## Question\n", + "** Given a dice which rolls 1 to 7 (with uniform probability), simulate a 5 sided dice. Preferably, write your solution as a function. **\n", + "\n", + "## Requirements\n", + "\n", + "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've solved it on pen and paper! **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SOLUTION\n", + "\n", + "This is a new problem we haven't seen directly before! Many times this question is asked in the form of functions e.g. your given a function random_7() and you have to take it as an input and create random_5()\n", + "\n", + "The key to solving this problem is to make sure you focus on the requirement that the final distribution of the rolls be uniform, also you were not given any requirements on Time and Space, so the solution is actually *very* simple, just keep re-rolling if you get a number greater than 5!\n", + "\n", + "We can code this out:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from random import randint\n", + " \n", + "def dice7():\n", + " return randint(1, 7)\n", + " \n", + "# Our Solution\n", + "def convert7to5():\n", + " \n", + " # Starting roll (just needs to be larger than 5)\n", + " roll = 7\n", + " \n", + " while roll > 5:\n", + " \n", + " roll = dice7()\n", + " print('dice7() produced a roll of ',roll)\n", + " print(' Your final returned roll is below:')\n", + " return roll" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dice7() produced a roll of 3\n", + " Your final returned roll is below:\n" + ] + }, + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "convert7to5()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, the next problem (On-Site Question 2) will be harder, the reverse conversion of rolls! This question should serve as a reminder not to overthink the solution to a question! Keep in mind that our solution has the potential to run for infinity if we keep rolling 6s and 7s (although this is highly unlikely).\n", + "\n", + "## Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /01-On-Site-Question-1/01-On-Site Question 1 .ipynb b/10-Mock Interviews/02-Large Search Engine Company /01-On-Site-Question-1/01-On-Site Question 1 .ipynb new file mode 100644 index 00000000..4c78a6b6 --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /01-On-Site-Question-1/01-On-Site Question 1 .ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 1 \n", + "___\n", + "\n", + "## Question\n", + "** Given a dice which rolls 1 to 7 (with uniform probability), simulate a 5 sided dice. Preferably, write your solution as a function. **\n", + "\n", + "## Requirements\n", + "\n", + "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've solved it on pen and paper! **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /02-On-Site-Question-2/02-On-Site Question 2 - SOLUTION.ipynb b/10-Mock Interviews/02-Large Search Engine Company /02-On-Site-Question-2/02-On-Site Question 2 - SOLUTION.ipynb new file mode 100644 index 00000000..b8871858 --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /02-On-Site-Question-2/02-On-Site Question 2 - SOLUTION.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 2 - SOLUTION\n", + "___\n", + "\n", + "## Question\n", + "** Given a dice which rolls from 1 to 5, simulate a uniform 7 sided dice! **\n", + "\n", + "## Requirements\n", + "\n", + "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've come up with a solution by hand! **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SOLUTION\n", + "\n", + "Because the 5 sided dice can not produce 7 possible outcomes on a single roll, we immediately know that we need to roll the dice at least twice. \n", + "\n", + "If we roll the dice twice we have 25 possible combinations of the results of the two rolls. While 25 is not divisible by 7, 21 is. This means we can implement our previous strategy of throwing out rolls not in our intended range.\n", + "\n", + "It's also important to note that we can't expand the solution to implement more rolls in order to not throw any out, because 5 and 7 are both prime which means that no exponent of 5 will be divisible by 7 no matter how high you go.\n", + "\n", + "We will define our range as a section of the 25 possible combinations of rolls. A good way to do this is by converting the two rolls into a unique outcome number in the range 1 through 25.\n", + "\n", + "We will create this number by taking the rolls, then we take the first roll and after subtracting 1 from it we multiply it by 5. Now the first roll corresponds with a value of 0, 5, 10, 15 and 20.\n", + "\n", + "Then we take the second roll and add it to the result of the first manipulation. Giving us a range of 1-25.\n", + "\n", + "So our final solution is to roll the dice twice. Check the manipulated range from 1 to 25, if its greater than 21, do a reroll. Let's see it in action:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from random import randint\n", + " \n", + "def dice5():\n", + " return randint(1, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now for our conversion function:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def convert5to7():\n", + "\n", + " # For constant re-roll purposes\n", + " while True:\n", + "\n", + " # Roll the dice twice\n", + " roll_1 = dice5()\n", + " roll_2 = dice5()\n", + " \n", + " #print 'The rolls were {} and {}'.format(roll_1,roll_2)\n", + "\n", + " # Convert the combination to the range 1 to 25\n", + " num = ( (roll_1-1) * 5 ) + ( roll_2 ) \n", + "\n", + " #print 'The converted range number was:',num\n", + " if num > 21:\n", + "\n", + " # re-roll if we are out of range\n", + " continue\n", + "\n", + " return num %7 + 1 " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "convert5to7()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /02-On-Site-Question-2/02-On-Site Question 2 .ipynb b/10-Mock Interviews/02-Large Search Engine Company /02-On-Site-Question-2/02-On-Site Question 2 .ipynb new file mode 100644 index 00000000..df7821e0 --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /02-On-Site-Question-2/02-On-Site Question 2 .ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 2 \n", + "___\n", + "\n", + "## Question\n", + "** Given a dice which rolls from 1 to 5, simulate a uniform 7 sided dice! **\n", + "\n", + "## Requirements\n", + "\n", + "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've come up with a solution by hand! **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /03-On-Site-Question-3/03-On-Site Question 3 -SOLUTION.ipynb b/10-Mock Interviews/02-Large Search Engine Company /03-On-Site-Question-3/03-On-Site Question 3 -SOLUTION.ipynb new file mode 100644 index 00000000..799ac82b --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /03-On-Site-Question-3/03-On-Site Question 3 -SOLUTION.ipynb @@ -0,0 +1,89 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 3 - SOLUTION\n", + "\n", + "## Question\n", + "\n", + "**Given a string, write a function that uses recursion to reverse it. **\n", + "\n", + "## Requirements\n", + "\n", + "** You MUST use pen and paper or a whiteboard to answer this, no coding allowed! **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "____" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SOLUTION\n", + "\n", + "Hopefully you remember this problem, you've already seen it! The solution is:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "def reverse(s):\n", + " \n", + " # Base Case\n", + " if len(s) <= 1:\n", + " return s\n", + "\n", + " # Recursion\n", + " return reverse(s[1:]) + s[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "## Notes\n", + "\n", + "Remember when recursion questions arise, think about the base case and the recursive case. Review the recusion section of the course for review for this problem." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /03-On-Site-Question-3/03-On-Site Question 3 .ipynb b/10-Mock Interviews/02-Large Search Engine Company /03-On-Site-Question-3/03-On-Site Question 3 .ipynb new file mode 100644 index 00000000..071f91aa --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /03-On-Site-Question-3/03-On-Site Question 3 .ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 3 \n", + "\n", + "## Question\n", + "\n", + "**Given a string, write a function that uses recursion to reverse it. **\n", + "\n", + "## Requirements\n", + "\n", + "** You MUST use pen and paper or a whiteboard to answer this, no coding allowed! **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "____" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /04-On-Site-Question-4/04-On-Site Question 4 - SOLUTION.ipynb b/10-Mock Interviews/02-Large Search Engine Company /04-On-Site-Question-4/04-On-Site Question 4 - SOLUTION.ipynb new file mode 100644 index 00000000..bff41dba --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /04-On-Site-Question-4/04-On-Site Question 4 - SOLUTION.ipynb @@ -0,0 +1,247 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 4 - SOLUTION\n", + "\n", + "## Question\n", + "**Find the squareroot of a given number rounded down to the nearest integer, without using the sqrt function. For example, squareroot of a number between [9, 15] should return 3, and [16, 24] should be 4.**\n", + "\n", + "## Requirements\n", + "\n", + "** Feel free to code this out (but its recommended that you use paper/pencil or whiteboard)**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Solution\n", + "\n", + "The squareroot of a (non-negative) number N always lies between 0 and N/2. The straightforward way to solve this problem would be to check every number k between 0 and N/2, until the square of k becomes greater than or rqual to N. If k^2 becomes equal to N, then we return k. Otherwise, we return k-1 because we're rounding down. Here's the code:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def solution(num): \n", + " if num<0: \n", + " raise ValueError \n", + " if num==1: \n", + " return 1 \n", + " for k in range(1+(num//2)): \n", + " if k**2==num: \n", + " return k \n", + " elif k**2>num: \n", + " return k-1 \n", + " return k " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solution(14)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solution(15)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solution(16)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The complexity of this approach is O(N), because we have to check N/2 numbers in the worst case. This linear algorithm is pretty inefficient, we can use some sort of binary search to speed it up. We know that the result is between 0 and N/2, so we can first try N/4 to see whether its square is less than, greater than, or equal to N. If it’s equal then we simply return that value. If it’s less, then we continue our search between N/4 and N/2. Otherwise if it’s greater, then we search between 0 and N/4. In both cases we reduce the potential range by half and continue, this is the logic of binary search. We’re not performing regular binary search though, it’s modified. We want to ensure that we stop at a number k, where k^2<=N but (k+1)^2>N. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def better_solution(num): \n", + " if num<0: \n", + " raise ValueError \n", + " if num==1: \n", + " return 1 \n", + " low=0 \n", + " high=1+(num/2) \n", + " \n", + " while low+1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " Fib(n=15000)\n", + "\n", + "\n", + "loops\n", + "recursion\n", + "generators\n", + "memoization\n", + "memoization as decorator\n", + "\n", + "\n", + "45\n", + "87\n", + "58\n", + "44\n", + "43\n", + "\n", + "\n", + "47\n", + "88\n", + "58\n", + "42\n", + "42\n", + "\n", + "\n", + "51\n", + "92\n", + "60\n", + "44\n", + "43\n", + "\n", + "\n", + "43\n", + "87\n", + "58\n", + "42\n", + "43\n", + "\n", + "\n", + "48\n", + "92\n", + "61\n", + "42\n", + "44\n", + "\n", + "\n", + "45\n", + "87\n", + "59\n", + "43\n", + "44\n", + "\n", + "\n", + "44\n", + "85\n", + "57\n", + "42\n", + "44\n", + "\n", + "\n", + "44\n", + "87\n", + "62\n", + "43\n", + "43\n", + "\n", + "\n", + "48\n", + "86\n", + "59\n", + "42\n", + "43\n", + "\n", + "\n", + "45\n", + "91\n", + "61\n", + "45\n", + "45\n", + "\n", + "\n", + "46\n", + "88.2\n", + "59.3\n", + "42.9\n", + "43.4 (Avg)\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/10-Mock Interviews/02-Large Search Engine Company /05-Phone-Screen/05-Phone Screen.ipynb b/10-Mock Interviews/02-Large Search Engine Company /05-Phone-Screen/05-Phone Screen.ipynb new file mode 100644 index 00000000..1cb58d63 --- /dev/null +++ b/10-Mock Interviews/02-Large Search Engine Company /05-Phone-Screen/05-Phone Screen.ipynb @@ -0,0 +1,80 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phone Screen\n", + "\n", + "**This phone screen will consist of a non-technical series of questions about you and the company, and then a second half of a simple technical question to be coded out**\n", + "___\n", + "## Non-Technical Questions\n", + "\n", + "**Answer the following questions (2-5 minute responses) technical answers not required, more interested in hearing about your reasoning**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Give me some quick background about you (go over your resume)\n", + "* Why do you want to work here?\n", + "* What's your favorite programming language and why?\n", + "* Where do you see yourself in 5 years?\n", + "* Do you have any questions about the company for me?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "## Technical Questions\n", + "\n", + "**Answer the following question in the *Markdown* cell below. It's important to note that the cell below does NOT have syntax highlighting, its common in a phone screen interview to be given a text editor hich doesn't have anything more than basic text support**\n", + "\n", + "1. Write a function that computes the Nth fibonacci number" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Job!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/01-On-Site-Quesion-1/On-Site Question 1 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/01-On-Site-Quesion-1/On-Site Question 1 - SOLUTION.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 1 .ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/01-On-Site-Quesion-1/On-Site Question 1 .ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 1 .ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/01-On-Site-Quesion-1/On-Site Question 1 .ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/02-On-Site-Quesion-2/On-Site Question 2 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/02-On-Site-Quesion-2/On-Site Question 2 - SOLUTION.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 2 .ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/02-On-Site-Quesion-2/On-Site Question 2 .ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 2 .ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/02-On-Site-Quesion-2/On-Site Question 2 .ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/03-On-Site-Quesion-3/On-Site Question 3 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/03-On-Site-Quesion-3/On-Site Question 3 - SOLUTION.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 3 .ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/03-On-Site-Quesion-3/On-Site Question 3 .ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 3 .ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/03-On-Site-Quesion-3/On-Site Question 3 .ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/04-Phone-Screen/Phone Screen - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/04-Phone-Screen/Phone Screen - SOLUTION.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /Phone Screen .ipynb b/10-Mock Interviews/03-Ride Share Start-Up Company/04-Phone-Screen/Phone Screen .ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /Phone Screen .ipynb rename to 10-Mock Interviews/03-Ride Share Start-Up Company/04-Phone-Screen/Phone Screen .ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/10-Mock Interviews/04-Social Network Company/01-On-Site-Question-1/On-Site Question 1 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb rename to 10-Mock Interviews/04-Social Network Company/01-On-Site-Question-1/On-Site Question 1 - SOLUTION.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 1.ipynb b/10-Mock Interviews/04-Social Network Company/01-On-Site-Question-1/On-Site Question 1.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 1.ipynb rename to 10-Mock Interviews/04-Social Network Company/01-On-Site-Question-1/On-Site Question 1.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/10-Mock Interviews/04-Social Network Company/02-On-Site-Question-2/On-Site Question 2 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb rename to 10-Mock Interviews/04-Social Network Company/02-On-Site-Question-2/On-Site Question 2 - SOLUTION.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 2.ipynb b/10-Mock Interviews/04-Social Network Company/02-On-Site-Question-2/On-Site Question 2.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 2.ipynb rename to 10-Mock Interviews/04-Social Network Company/02-On-Site-Question-2/On-Site Question 2.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb b/10-Mock Interviews/04-Social Network Company/03-On-Site-Question-3/On-Site Question 3 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb rename to 10-Mock Interviews/04-Social Network Company/03-On-Site-Question-3/On-Site Question 3 - SOLUTION.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 3.ipynb b/10-Mock Interviews/04-Social Network Company/03-On-Site-Question-3/On-Site Question 3.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 3.ipynb rename to 10-Mock Interviews/04-Social Network Company/03-On-Site-Question-3/On-Site Question 3.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb b/10-Mock Interviews/04-Social Network Company/04-Phone-Screen/Phone Screen - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb rename to 10-Mock Interviews/04-Social Network Company/04-Phone-Screen/Phone Screen - SOLUTION.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /Phone Screen .ipynb b/10-Mock Interviews/04-Social Network Company/04-Phone-Screen/Phone Screen .ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /Phone Screen .ipynb rename to 10-Mock Interviews/04-Social Network Company/04-Phone-Screen/Phone Screen .ipynb diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb b/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb deleted file mode 100644 index 4e532110..00000000 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb +++ /dev/null @@ -1,203 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O Notation\n", - "In this lecture we will go over how the syntax of Big-O Notation works and how we can describe algorithms using Big-O Notation!\n", - "\n", - "We previously discussed the functions below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# First function (Note the use of xrange since this is in Python 2)\n", - "def sum1(n):\n", - " '''\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " '''\n", - " final_sum = 0\n", - " for x in xrange(n+1): \n", - " final_sum += x\n", - " \n", - " return final_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def sum2(n):\n", - " \"\"\"\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " \"\"\"\n", - " return (n*(n+1))/2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to develop a notation to objectively compare the efficiency of these two algorithms. A good place to start would be to compare the number of assignments each algorithm makes.\n", - "\n", - "The original **sum1** function will create an assignment **n+1** times, we can see this from the range based function. This means it will assign the final_sum variable n+1 times. We can then say that for a problem of n size (in this case just a number n) this function will take 1+n steps.\n", - "\n", - "This **n** notation allows us to compare solutions and algorithms relative to the size of the problem, since sum1(10) and sum1(100000) would take very different times to run but be using the same algorithm. We can also note that as n grows very large, the **+1** won't have much effect. So let's begin discussing how to build a syntax for this notation.\n", - "________\n", - "\n", - "Now we will discuss how we can formalize this notation and idea.\n", - "\n", - "Big-O notation describes *how quickly runtime will grow relative to the input as the input get arbitrarily large*.\n", - "\n", - "Let's examine some of these points more closely:\n", - "\n", - "* Remember, we want to compare how quickly runtime will grows, not compare exact runtimes, since those can vary depending on hardware.\n", - "\n", - "* Since we want to compare for a variety of input sizes, we are only concerned with runtime grow *relative* to the input. This is why we use **n** for notation.\n", - "\n", - "* As n gets arbitrarily large we only worry about terms that will grow the fastest as n gets large, to this point, Big-O analysis is also known as **asymptotic analysis**\n", - "\n", - "\n", - "As for syntax sum1() can be said to be **O(n)** since its runtime grows linearly with the input size. In the next lecture we will go over more specific examples of various O() types and examples. To conclude this lecture we will show the potential for vast difference in runtimes of Big-O functions.\n", - "\n", - "## Runtimes of Common Big-O Functions\n", - "\n", - "Here is a table of common Big-O functions:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
Big-OName
1Constant
log(n)Logarithmic
nLinear
nlog(n)Log Linear
n^2Quadratic
n^3Cubic
2^nExponential
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's plot the runtime versus the Big-O to compare the runtimes. We'll use a simple [matplotlib](http://matplotlib.org/) for the plot below. (Don't be concerned with how to use matplotlib, that is irrelevant for this part)." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from math import log\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "plt.style.use('bmh')\n", - "\n", - "# Set up runtime comparisons\n", - "n = np.linspace(1,10,1000)\n", - "labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']\n", - "big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]\n", - "\n", - "# Plot setup\n", - "plt.figure(figsize=(12,10))\n", - "plt.ylim(0,50)\n", - "\n", - "for i in range(len(big_o)):\n", - " plt.plot(n,big_o[i],label = labels[i])\n", - "\n", - "\n", - "plt.legend(loc=0)\n", - "plt.ylabel('Relative Runtime')\n", - "plt.xlabel('n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how much of a difference a Big-O efficiency can make for the same n value against the projected runtime! Clearly we want to choose algorithms that stay away from any exponential, quadratic, or cubic behavior!\n", - "\n", - "In the next lecture we will learn how to properly denote Big-O and look at examples of various problems and calculate the Big-O of them!" - ] - } - ], - "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/Algorithm Analysis and Big O/Big O Notation.ipynb b/Algorithm Analysis and Big O/Big O Notation.ipynb deleted file mode 100644 index 4e532110..00000000 --- a/Algorithm Analysis and Big O/Big O Notation.ipynb +++ /dev/null @@ -1,203 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O Notation\n", - "In this lecture we will go over how the syntax of Big-O Notation works and how we can describe algorithms using Big-O Notation!\n", - "\n", - "We previously discussed the functions below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# First function (Note the use of xrange since this is in Python 2)\n", - "def sum1(n):\n", - " '''\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " '''\n", - " final_sum = 0\n", - " for x in xrange(n+1): \n", - " final_sum += x\n", - " \n", - " return final_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def sum2(n):\n", - " \"\"\"\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " \"\"\"\n", - " return (n*(n+1))/2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to develop a notation to objectively compare the efficiency of these two algorithms. A good place to start would be to compare the number of assignments each algorithm makes.\n", - "\n", - "The original **sum1** function will create an assignment **n+1** times, we can see this from the range based function. This means it will assign the final_sum variable n+1 times. We can then say that for a problem of n size (in this case just a number n) this function will take 1+n steps.\n", - "\n", - "This **n** notation allows us to compare solutions and algorithms relative to the size of the problem, since sum1(10) and sum1(100000) would take very different times to run but be using the same algorithm. We can also note that as n grows very large, the **+1** won't have much effect. So let's begin discussing how to build a syntax for this notation.\n", - "________\n", - "\n", - "Now we will discuss how we can formalize this notation and idea.\n", - "\n", - "Big-O notation describes *how quickly runtime will grow relative to the input as the input get arbitrarily large*.\n", - "\n", - "Let's examine some of these points more closely:\n", - "\n", - "* Remember, we want to compare how quickly runtime will grows, not compare exact runtimes, since those can vary depending on hardware.\n", - "\n", - "* Since we want to compare for a variety of input sizes, we are only concerned with runtime grow *relative* to the input. This is why we use **n** for notation.\n", - "\n", - "* As n gets arbitrarily large we only worry about terms that will grow the fastest as n gets large, to this point, Big-O analysis is also known as **asymptotic analysis**\n", - "\n", - "\n", - "As for syntax sum1() can be said to be **O(n)** since its runtime grows linearly with the input size. In the next lecture we will go over more specific examples of various O() types and examples. To conclude this lecture we will show the potential for vast difference in runtimes of Big-O functions.\n", - "\n", - "## Runtimes of Common Big-O Functions\n", - "\n", - "Here is a table of common Big-O functions:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
Big-OName
1Constant
log(n)Logarithmic
nLinear
nlog(n)Log Linear
n^2Quadratic
n^3Cubic
2^nExponential
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's plot the runtime versus the Big-O to compare the runtimes. We'll use a simple [matplotlib](http://matplotlib.org/) for the plot below. (Don't be concerned with how to use matplotlib, that is irrelevant for this part)." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from math import log\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "plt.style.use('bmh')\n", - "\n", - "# Set up runtime comparisons\n", - "n = np.linspace(1,10,1000)\n", - "labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']\n", - "big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]\n", - "\n", - "# Plot setup\n", - "plt.figure(figsize=(12,10))\n", - "plt.ylim(0,50)\n", - "\n", - "for i in range(len(big_o)):\n", - " plt.plot(n,big_o[i],label = labels[i])\n", - "\n", - "\n", - "plt.legend(loc=0)\n", - "plt.ylabel('Relative Runtime')\n", - "plt.xlabel('n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how much of a difference a Big-O efficiency can make for the same n value against the projected runtime! Clearly we want to choose algorithms that stay away from any exponential, quadratic, or cubic behavior!\n", - "\n", - "In the next lecture we will learn how to properly denote Big-O and look at examples of various problems and calculate the Big-O of them!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 0b216746..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,272 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "The naive solution is go through every element in the second array and check whether it appears in the first array. Note that there may be duplicate elements in the arrays so we should pay special attention to it. The complexity of this approach is O(N^2), since we would need two for loops.\n", - "\n", - "A more efficient solution is to sort the first array, so while checking whether an element in the first array appears in the second, we can do binary search (we'll learn about binary search in more detail in a future section). But we should still be careful about duplicate elements. The complexity is O(NlogN). \n", - "\n", - "If we don’t want to deal with the special case of duplicate numbers, we can sort both arrays and iterate over them simultaneously. Once two iterators have different values we can stop. The value of the first iterator is the missing element. This solution is also O(NlogN). Here is the solution for this approach:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " \n", - " # Sort the arrays\n", - " arr1.sort()\n", - " arr2.sort()\n", - " \n", - " # Compare elements in the sorted arrays\n", - " for num1, num2 in zip(arr1,arr2):\n", - " if num1!= num2:\n", - " return num1\n", - " \n", - " # Otherwise return last element\n", - " return arr1[-1]" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In most interviews, you would be expected to come up with a linear time solution. We can use a hashtable and store the number of times each element appears in the second array. Then for each element in the first array we decrement its counter. Once hit an element with zero count that’s the missing element. Here is this solution: " - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import collections\n", - "\n", - "def finder2(arr1, arr2): \n", - " \n", - " # Using default dict to avoid key errors\n", - " d=collections.defaultdict(int) \n", - " \n", - " # Add a count for every instance in Array 1\n", - " for num in arr2:\n", - " d[num]+=1 \n", - " \n", - " # Check if num not in dictionary\n", - " for num in arr1: \n", - " if d[num]==0: \n", - " return num \n", - " \n", - " # Otherwise, subtract a count\n", - " else: d[num]-=1 " - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder2(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One possible solution is computing the sum of all the numbers in arr1 and arr2, and subtracting arr2’s sum from array1’s sum. The difference is the missing number in arr2. However, this approach could be problematic if the arrays are too long, or the numbers are very large. Then overflow will occur while summing up the numbers.\n", - "\n", - "By performing a very clever trick, we can achieve linear time and constant space complexity without any problems. Here it is: initialize a variable to 0, then [XOR](https://en.wikipedia.org/wiki/Exclusive_or) every element in the first and second arrays with that variable. In the end, the value of the variable is the result, missing element in array2." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder3(arr1, arr2): \n", - " result=0 \n", - " \n", - " # Perform an XOR between the numbers in the arrays\n", - " for num in arr1+arr2: \n", - " result^=num \n", - " print result\n", - " \n", - " return result " - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n", - "0\n", - "7\n", - "0\n", - "5\n", - "2\n", - "5\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "finder3(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 153410ab..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,146 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "If the array is all positive, then the result is simply the sum of all numbers. The negative numbers in the array will cause us to need to begin checking sequences. \n", - "\n", - "The algorithm is, we start summing up the numbers and store in a current sum variable. After adding each element, we check whether the current sum is larger than maximum sum encountered so far. If it is, we update the maximum sum. As long as the current sum is positive, we keep adding the numbers. When the current sum becomes negative, we start with a new current sum. Because a negative current sum will only decrease the sum of a future sequence. Note that we don’t reset the current sum to 0 because the array can contain all negative integers. Then the result would be the largest negative number. \n", - "\n", - "Let's see the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def large_cont_sum(arr): \n", - " \n", - " # Check to see if array is length 0\n", - " if len(arr)==0: \n", - " return 0\n", - " \n", - " # Start the max and current sum at the first element\n", - " max_sum=current_sum=arr[0] \n", - " \n", - " # For every element in array\n", - " for num in arr[1:]: \n", - " \n", - " # Set current sum as the higher of the two\n", - " current_sum=max(current_sum+num, num)\n", - " \n", - " # Set max as the higher between the currentSum and the current max\n", - " max_sum=max(current_sum, max_sum) \n", - " \n", - " return max_sum " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb deleted file mode 100644 index c93f14c1..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,124 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "We'll show two possible solutions, one using a built-in data structure and a built in function, and another using a built-in data structure but using a look-up method to check if the characters are unique." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " return len(set(s)) == len(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char2(s):\n", - " chars = set()\n", - " for let in s:\n", - " # Check if in set\n", - " if let in chars:\n", - " return False\n", - " else:\n", - " #Add it to the set\n", - " chars.add(let)\n", - " return True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb deleted file mode 100644 index bff6a2f4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb +++ /dev/null @@ -1,330 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Solution\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "There are two ways of thinking about this problem, if two strings have the same frequency of letters/element (meaning each letter shows up the same number of times in both strings) then they are anagrams of eachother. On a similar vien of logic, if two strings are equal to each other once they are sorted, then they are also anagrams of each other.\n", - "\n", - "You would be able to implement this second solution pretty easily in Python:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram(s1,s2):\n", - " \n", - " # Remove spaces and lowercase letters\n", - " s1 = s1.replace(' ','').lower()\n", - " s2 = s2.replace(' ','').lower()\n", - " \n", - " # Return boolean for sorted match.\n", - " return sorted(s1) == sorted(s2)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the above sorting approach is simple, but is actually not optimal and in an interview setting you would probably be asked to implement a more manual solution involving just counting the number of letters in each string to test your ability to understand hash tables. Let's build out a fuller solution using counting and Python dictionaries:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram2(s1,s2):\n", - " \n", - " # Remove spaces and lowercase letters\n", - " s1 = s1.replace(' ','').lower()\n", - " s2 = s2.replace(' ','').lower()\n", - " \n", - " # Edge Case to check if same number of letters\n", - " if len(s1) != len(s2):\n", - " return False\n", - " \n", - " # Create counting dictionary (Note could use DefaultDict from Collections module)\n", - " count = {}\n", - " \n", - " \n", - " \n", - " # Fill dictionary for first string (add counts)\n", - " for letter in s1:\n", - " if letter in count:\n", - " count[letter] += 1\n", - " else:\n", - " count[letter] = 1\n", - " \n", - " # Fill dictionary for second string (subtract counts)\n", - " for letter in s2:\n", - " if letter in count:\n", - " count[letter] -= 1\n", - " else:\n", - " count[letter] = 1\n", - " \n", - " # Check that all counts are 0\n", - " for k in count:\n", - " if count[k] != 0:\n", - " return False\n", - "\n", - " # Otherwise they're anagrams\n", - " return True" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('dd','aa')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A quick note on the second solution, the use of defaultdict form the collections module would clean up this code quite a bit, and the final for loop could be built into the second for loop, but in the above implementation every step is very clear." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print \"ALL TEST CASES PASSED\"\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb deleted file mode 100644 index 2419f818..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb +++ /dev/null @@ -1,162 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES< CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "The O(N) algorithm uses the set data structure. We perform a linear pass from the beginning and for each element we check whether k-element is in the set of seen numbers. If it is, then we found a pair of sum k and add it to the output. If not, this element doesn’t belong to a pair yet, and we add it to the set of seen elements. \n", - "\n", - "The algorithm is really simple once we figure out using a set. The complexity is O(N) because we do a single linear scan of the array, and for each element we just check whether the corresponding number to form a pair is in the set or add the current element to the set. Insert and find operations of a set are both average O(1), so the algorithm is O(N) in total. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " \n", - " if len(arr)<2:\n", - " return\n", - " \n", - " # Sets for tracking\n", - " seen = set()\n", - " output = set()\n", - " \n", - " # For every number in array\n", - " for num in arr:\n", - " \n", - " # Set target difference\n", - " target = k-num\n", - " \n", - " # Add it to set if target hasn't been seen\n", - " if target not in seen:\n", - " seen.add(num)\n", - " \n", - " else:\n", - " # Add a tuple with the corresponding pair\n", - " output.add( (min(num,target), max(num,target)) )\n", - " \n", - " \n", - " # FOR TESTING\n", - " return len(output)\n", - " # Nice one-liner for printing output\n", - " #return '\\n'.join(map(str,list(output)))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb deleted file mode 100644 index 6a78183c..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb +++ /dev/null @@ -1,267 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "We could take advantage of Python's abilities and solve the problem with the use of **split()** and some slicing or use of **reversed**:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word1(s):\n", - " return \" \".join(reversed(s.split()))\n", - "\n", - "#Or\n", - "\n", - "def rev_word2(s):\n", - " return \" \".join(s.split()[::-1])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word1('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word2('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "While these are valid solutions, in an interview setting you'll have to work out the basic algorithm that is used. In this case what we want to do is loop over the text and extract words form the string ourselves. Then we can push the words to a \"stack\" and in the end opo them all to reverse. Let's see what this actually looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word3(s):\n", - " \"\"\"\n", - " Manually doing the splits on the spaces.\n", - " \"\"\"\n", - " \n", - " words = []\n", - " length = len(s)\n", - " spaces = [' ']\n", - " \n", - " # Index Tracker\n", - " i = 0\n", - " \n", - " # While index is less than length of string\n", - " while i < length:\n", - " \n", - " # If element isn't a space\n", - " if s[i] not in spaces:\n", - " \n", - " # The word starts at this index\n", - " word_start = i\n", - " \n", - " while i < length and s[i] not in spaces:\n", - " \n", - " # Get index where word ends\n", - " i += 1\n", - " # Append that word to the list\n", - " words.append(s[word_start:i])\n", - " # Add to index\n", - " i += 1\n", - " \n", - " # Join the reversed words\n", - " return \" \".join(reversed(words))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'you are how John Hello'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word3(' Hello John how are you ')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word3(' space before')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you want you can further develop this solution so its all manual, you can create your own reversal function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb deleted file mode 100644 index 629aafd8..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb +++ /dev/null @@ -1,168 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Since Python strings are immutable, we'll need to work off of a list of characters, and at the end convert that list back into a string with a **join** statement.\n", - "\n", - "The solution below should yield us with a Time and Space complexity of O(n). Let's take a look with careful attention to the explanatory comments:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def compress(s):\n", - " \"\"\"\n", - " This solution compresses without checking. Known as the RunLength Compression algorithm.\n", - " \"\"\"\n", - " \n", - " # Begin Run as empty string\n", - " r = \"\"\n", - " l = len(s)\n", - " \n", - " # Check for length 0\n", - " if l == 0:\n", - " return \"\"\n", - " \n", - " # Check for length 1\n", - " if l == 1:\n", - " return s + \"1\"\n", - " \n", - " #Intialize Values\n", - " last = s[0]\n", - " cnt = 1\n", - " i = 1\n", - " \n", - " while i < l:\n", - " \n", - " # Check to see if it is the same letter\n", - " if s[i] == s[i - 1]: \n", - " # Add a count if same as previous\n", - " cnt += 1\n", - " else:\n", - " # Otherwise store the previous data\n", - " r = r + s[i - 1] + str(cnt)\n", - " cnt = 1\n", - " \n", - " # Add to index count to terminate while loop\n", - " i += 1\n", - " \n", - " # Put everything back into run\n", - " r = r + s[i - 1] + str(cnt)\n", - " \n", - " return r" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb deleted file mode 100644 index fd6f0824..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb +++ /dev/null @@ -1,197 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Check\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram(s1,s2):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print \"ALL TEST CASES PASSED\"\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb deleted file mode 100644 index 50ee6bfa..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb deleted file mode 100644 index fe1e12d7..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb deleted file mode 100644 index a4220bb0..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def large_cont_sum(arr): \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb deleted file mode 100644 index e8c7d5f4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def compress(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb deleted file mode 100644 index 9659d2bf..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb deleted file mode 100644 index e6cf296a..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word(' space before')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb deleted file mode 100644 index 303ba52f..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,158 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Linked List - SOLUTION\n", - "\n", - "## Problem Statement\n", - "\n", - "Implement a Linked List by using a Node class object. Show how you would implement a Singly Linked List *and* a Doubly Linked List!\n", - "\n", - "## Solution\n", - "\n", - "Since this is asking the same thing as the implementation lectures, please refer to those video lectures and notes for a full explanation. The code from those lectures is displayed below:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Singly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class LinkedListNode(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = LinkedListNode(1)\n", - "b = LinkedListNode(2)\n", - "c = LinkedListNode(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a.nextnode = b\n", - "b.nextnode = c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Doubly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class DoublyLinkedListNode(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.next_node = None\n", - " self.prev_node = None" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = DoublyLinkedListNode(1)\n", - "b = DoublyLinkedListNode(2)\n", - "c = DoublyLinkedListNode(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Setting b after a\n", - "b.prev_node = a\n", - "a.next_node = b" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Setting c after a\n", - "b.next_node = c\n", - "c.prev_node = b" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 457e6e48..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,210 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Nth to Last Node - SOLUTION\n", - "\n", - "## Problem Statement\n", - "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node:\n", - "\n", - " def __init__(self, value):\n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "# This would return the node d with a value of 4, because its the 2nd to last node.\n", - "target_node = nth_to_last_node(2, a) " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target_node.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "One approach to this problem is this:\n", - "\n", - "Imagine you have a bunch of nodes and a \"block\" which is n-nodes wide. We could walk this \"block\" all the way down the list, and once the front of the block reached the end, then the other end of the block would be a the Nth node! \n", - "\n", - "So to implement this \"block\" we would just have two pointers a left and right pair of pointers. Let's mark out the steps we will need to take:\n", - "\n", - "* Walk one pointer **n** nodes from the head, this will be the right_point\n", - "* Put the other pointer at the head, this will be the left_point\n", - "* Walk/traverse the block (both pointers) towards the tail, one node at a time, keeping a distance **n** between them.\n", - "* Once the right_point has hit the tail, we know that the left point is at the target.\n", - "\n", - "Let's see the code for this!" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def nth_to_last_node(n, head):\n", - "\n", - " left_pointer = head\n", - " right_pointer = head\n", - "\n", - " # Set right pointer at n nodes away from head\n", - " for i in xrange(n-1):\n", - " \n", - " # Check for edge case of not having enough nodes!\n", - " if not right_pointer.nextnode:\n", - " raise LookupError('Error: n is larger than the linked list.')\n", - "\n", - " # Otherwise, we can set the block\n", - " right_pointer = right_pointer.nextnode\n", - "\n", - " # Move the block down the linked list\n", - " while right_pointer.nextnode:\n", - " left_pointer = left_pointer.nextnode\n", - " right_pointer = right_pointer.nextnode\n", - "\n", - " # Now return left pointer, its at the nth to last element!\n", - " return left_pointer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f0752ac6..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "To solve this problem we will have two markers traversing through the list. **marker1** and **marker2**. We will have both makers begin at the first node of the list and traverse through the linked list. However the second marker, marker2, will move two nodes ahead for every one node that marker1 moves.\n", - "\n", - "By this logic we can imagine that the markers are \"racing\" through the linked list, with marker2 moving faster. If the linked list has a cylce and is circularly connected we will have the analogy of a track, in this case the marker2 will eventually be \"lapping\" the marker1 and they will equal each other. \n", - "\n", - "If the linked list has no cycle, then marker2 should be able to continue on until the very end, never equaling the first marker.\n", - "\n", - "Let's see this logic coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "\n", - " # Begin both markers at the first node\n", - " marker1 = node\n", - " marker2 = node\n", - "\n", - " # Go until end of list\n", - " while marker2 != None and marker2.nextnode != None:\n", - " \n", - " # Note\n", - " marker1 = marker1.nextnode\n", - " marker2 = marker2.nextnode.nextnode\n", - "\n", - " # Check if the markers have matched\n", - " if marker2 == marker1:\n", - " return True\n", - "\n", - " # Case where marker ahead reaches the end of the list\n", - " return False" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb deleted file mode 100644 index 5ac84405..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb +++ /dev/null @@ -1,267 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Since we want to do this in place we want to make the funciton operate in O(1) space, meaning we don't want to create a new list, so we will simply use the current nodes! Time wise, we can perform the reversal in O(n) time.\n", - "\n", - "We can reverse the list by changing the next pointer of each node. Each node's next pointer should point to the previous node.\n", - "\n", - "In one pass from head to tail of our input list, we will point each node's next pointer to the previous element.\n", - "\n", - "Make sure to copy current.next_node into next_node **before** setting current.next_node to previous. Let's see this solution coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(head):\n", - " \n", - " # Set up current,previous, and next nodes\n", - " current = head\n", - " previous = None\n", - " nextnode = None\n", - "\n", - " # until we have gone through to the end of the list\n", - " while current:\n", - " \n", - " # Make sure to copy the current nodes next node to a variable next_node\n", - " # Before overwriting as the previous node for reversal\n", - " nextnode = current.nextnode\n", - "\n", - " # Reverse the pointer ot the next_node\n", - " current.nextnode = previous\n", - "\n", - " # Go one forward in the list\n", - " previous = current\n", - " current = nextnode\n", - "\n", - " return previous" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and maek sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Doubly Linked List.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Implement a Doubly Linked List.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Doubly Linked List.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Implement a Doubly Linked List.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Singly Linked List.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Implement a Singly Linked List.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Singly Linked List.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Implement a Singly Linked List.ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Nth to Last Node .ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Linked List Nth to Last Node .ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Nth to Last Node .ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Linked List Nth to Last Node .ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Reversal .ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Linked List Reversal .ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Reversal .ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Linked List Reversal .ipynb diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Singly Linked List Cycle Check.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Singly Linked List Cycle Check.ipynb similarity index 100% rename from Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Singly Linked List Cycle Check.ipynb rename to Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems/Singly Linked List Cycle Check.ipynb diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb deleted file mode 100644 index 2ac17359..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb +++ /dev/null @@ -1,232 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.**\n", - "\n", - "\n", - "For example, if you were given the list of stock prices:\n", - "\n", - "prices = [12,11,15,3,10]\n", - "\n", - "Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).\n", - "\n", - "## Requirements\n", - "\n", - "** Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination **\n", - "\n", - "** Also you can't \"short\" a stock, you must buy *before* you sell the stock. **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "Let's think about a few things before we start coding. One thing to think about right off the bat is that we can't just find the maximum price and the lowest price and then subtract the two, because the max could come before the min.\n", - "\n", - "The brute force method would be to try every possible pair of price combinations, but this would be O(N^2), pretty bad. Also since this is an interview setting you should probably already know that there is a smarter solution.\n", - "\n", - "In this case we will use a [greedy algorithm](https://en.wikipedia.org/wiki/Greedy_algorithm) approach. We will iterate through the list of stock prices while keeping track of our maximum profit.\n", - "\n", - "That means for every price we will keep track of the lowest price so far and then check if we can get a better profit than our current max.\n", - "\n", - "Let's see an implementation of this:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def profit(stock_prices):\n", - " \n", - " # Start minimum price marker at first price\n", - " min_stock_price = stock_prices[0]\n", - " \n", - " # Start off with a profit of zero\n", - " max_profit = 0\n", - " \n", - " for price in stock_prices:\n", - " \n", - " # Check to set the lowest stock price so far\n", - " min_stock_price = min(min_stock_price,price)\n", - " \n", - " # Check the current price against our minimum for a profit \n", - " # comparison against the max_profit\n", - " comparison_profit = price - min_stock_price\n", - " \n", - " # Compare against our max_profit so far\n", - " max_profit = max(max_profit,comparison_profit)\n", - " \n", - " return max_profit" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "39" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "profit([10,12,14,12,13,11,8,7,6,13,23,45,11,10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Currently we're finding the max profit in one pass O(n) and in constant space O(1). However, we still aren't thinking about any edge cases. For example, we need to address the following scenarios:\n", - "\n", - "* Stock price always goes down\n", - "* If there's less than two stock prices in the list.\n", - "\n", - "We can take care of the first scenario by returning a negative profit if the price decreases all day (that way we can know how much we lost). And the second issue can be solved with a quick **len()** check. Let's see the full solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def profit2(stock_prices):\n", - " \n", - " # Check length\n", - " if len(stock_prices) < 2:\n", - " raise Exception('Need at least two stock prices!')\n", - " \n", - " # Start minimum price marker at first price\n", - " min_stock_price = stock_prices[0]\n", - " \n", - " # Start off with an initial max profit\n", - " max_profit = stock_prices[1] - stock_prices[0]\n", - " \n", - " # Skip first index of 0\n", - " for price in stock_prices[1:]:\n", - " \n", - " \n", - " # NOTE THE REORDERING HERE DUE TO THE NEGATIVE PROFIT TRACKING\n", - " \n", - " # Check the current price against our minimum for a profit \n", - " # comparison against the max_profit\n", - " comparison_profit = price - min_stock_price\n", - " \n", - " # Compare against our max_profit so far\n", - " max_profit = max(max_profit,comparison_profit)\n", - " \n", - " # Check to set the lowest stock price so far\n", - " min_stock_price = min(min_stock_price,price)\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " return max_profit" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "Exception", - "evalue": "Need at least two stock prices!", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Exception Raised\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprofit2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprofit2\u001b[0;34m(stock_prices)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Check length\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstock_prices\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Need at least two stock prices!'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# Start minimum price marker at first price\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: Need at least two stock prices!" - ] - } - ], - "source": [ - "# Exception Raised\n", - "profit2([1])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "-1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "profit2([30,22,21,5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Now we can prepare for worst case scenarios. Its important to keep edge cases in mind, especially if you are able to solve the original question fairly quickly.\n", - "\n", - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb deleted file mode 100644 index f4f594ff..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb +++ /dev/null @@ -1,164 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, write a function that will return a list, in which for each index the element will be the product of all the integers except for the element at that index **\n", - "\n", - "**For example, an input of [1,2,3,4] would return [24,12,8,6] by performing [2×3×4,1×3×4,1×2×4,1×2×3] **\n", - "\n", - "## Requirements\n", - "\n", - "** You can not use division in your answer! Meaning you can't simply multiply all the numbers and then divide by eahc element for each index!**\n", - "\n", - "** Try to do this on a white board or with paper/pencil.**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "___\n", - "## Solution\n", - "\n", - "If you look at the list above with the multiplication you'll notice we are repeating multiplications, such as 2 times 3 or 3 times 4 for multiple entries in the new list. \n", - "\n", - "We'll want to take a greedy approach and keep track of these results for later re-use at other indices. We'll also need to think about what if a number is zero!\n", - "\n", - "In order to find the products of all the integers (except for the integer at that index) we will actually go through our list twice in a greedy fashion. \n", - "\n", - "On the first pass we will get the products of all the integers **before** each index, and then on the second pass we will go **backwards** to get the products of all the integers after each index.\n", - "\n", - "Then we just need to multiply all the products before and after each index in order to get the final product answer!\n", - "\n", - "Let's see this in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def index_prod(lst):\n", - " \n", - " # Create an empty output list\n", - " output = [None] * len(lst)\n", - " \n", - " # Set initial product and index for greedy run forward\n", - " product = 1\n", - " i = 0\n", - " \n", - " while i < len(lst):\n", - " \n", - " # Set index as cumulative product\n", - " output[i] = product\n", - " \n", - " # Cumulative product\n", - " product *= lst[i]\n", - " \n", - " # Move forward\n", - " i +=1\n", - " \n", - " \n", - " # Now for our Greedy run Backwards\n", - " product = 1\n", - " \n", - " # Start index at last (taking into account index 0)\n", - " i = len(lst) - 1\n", - " \n", - " # Until the beginning of the list\n", - " while i >=0:\n", - " \n", - " # Same operations as before, just backwards\n", - " output[i] *= product\n", - " product *= lst[i]\n", - " i -= 1\n", - " \n", - " return output " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[24, 12, 8, 6]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_prod([1,2,3,4])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[24, 0, 0, 0, 0]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_prod([0,1,2,3,4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Review the solution and make sure you understand it! It uses O(n) time and O(n) space complexity!\n", - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb deleted file mode 100644 index f3b22b3b..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb +++ /dev/null @@ -1,196 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "**Given two rectangles, determine if they overlap. The rectangles are defined as a Dictionary, for example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "r1 = {\n", - " \n", - " # x and y coordinates of the bottom-left corner of the rectangle\n", - " 'x': 2 , 'y': 4,\n", - " \n", - " # Width and Height of rectangle\n", - " 'w':5,'h':12}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "** If the rectangles do overlap, return the dictionary which describes the overlapping section**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Make sure the dictionary you output is in the same form as the input.**\n", - "\n", - "** Feel free to use an IDE for the code, but make sure you use paper/pencil or whiteboard to draw out your plan and logic**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "This is a problem where it helps a lot to draw out your thinking. There are a few things we will need to think about:\n", - "\n", - "* How can we determine an intersection?\n", - "* What if a rectangle is fully inside another rectangle?\n", - "* What if there is no intersection, but the rectangles share an edge?\n", - "\n", - "The key to solving this problem is to *break it up in to sub-problems*. We can split up the problem into an x-axis problem and a y-axis problem. \n", - "\n", - "We will create a function that can detect overlap in 1 dimension. Then we will split the rectangles into x and width, and y and height components. We can then determine that if there is overlap on both dimensions, then the rectangles themselves intersect!\n", - "\n", - "In order to understand the **calc_overlap** function, draw out two flat lines and follow along with the function and notice how it detects an overlap!\n", - "\n", - "Let's begin by creating a general function to detect overlap in a single dimension:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_overlap(coor1,dim1,coor2,dim2):\n", - " \"\"\"\n", - " Takes in 2 coordinates and their length in that dimension\n", - " \"\"\"\n", - " \n", - " # Find greater of the two coordinates\n", - " # (this is either the point to the most right\n", - " # or the higher point, depending on the dimension)\n", - " \n", - " # The greater point would be the start of the overlap\n", - " greater = max(coor1,coor2)\n", - " \n", - " # The lower point is the end of the overlap\n", - " lower = min(coor1+dim1,coor2+dim2)\n", - " \n", - " # Return a tuple of Nones if there is no overlap\n", - " \n", - " if greater >= lower:\n", - " return (None,None)\n", - " \n", - " # Otherwise, get the overlap length\n", - " overlap = lower-greater\n", - " \n", - " return (greater,overlap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's use this function to detect if the rectangles overlap!" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_rect_overlap(r1,r2):\n", - " \n", - " \n", - " x_overlap, w_overlap = calc_overlap(r1['x'],r1['w'],r2['x'],r2['w'])\n", - " \n", - " y_overlap, h_overlap = calc_overlap(r1['y'],r1['h'],r2['y'],r2['h'])\n", - " \n", - " # If either returned None tuples, then there is no overlap!\n", - " if not w_overlap or not h_overlap:\n", - " print 'There was no overlap!'\n", - " return None\n", - " \n", - " # Otherwise return the dictionary format of the overlapping rectangle\n", - " return { 'x':x_overlap,'y': y_overlap,'w':w_overlap,'h':h_overlap}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our solution is O(1) for both time and space! Let's see it in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'h': 11, 'w': 5, 'x': 2, 'y': 5}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r1 = {'x': 2 , 'y': 4,'w':5,'h':12}\n", - "r2 = {'x': 1 , 'y': 5,'w':7,'h':14}\n", - "calc_rect_overlap(r1,r2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make sure to review the answer and practice writing it out by hand!\n", - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb deleted file mode 100644 index 042f7a06..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb +++ /dev/null @@ -1,85 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "**A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.**\n", - "\n", - "**Show algorithmically how you would go about doing this in as few drops as possible**\n", - "## Requirements\n", - "\n", - "** Use paper/pencil or a whiteboard for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "** We've already seen this problem in the Riddles section, here is the answer from that section.(Alternatively just google \"2 eggs 100 floors\" for a plethora of explanations regarding this same solution **\n", - "\n", - "\n", - "Start from the 10th floor and go up to floors in multiples of 10.\n", - "\n", - "If first egg breaks, say at 20th floor then you can check all the floors between 11th and 19th with the second egg to see which floor it will not break.\n", - "\n", - "In this case, the worst-case number of drops is 19. If the threshold was 99th floor, then you would have to drop the first egg 10 times and the second egg 9 times in linear fashion.\n", - "\n", - "**Best solution:**\n", - "We need to minimize this worst-case number of drops. For that, we need to generalize the problem to have n floors. What would be the step value, for the first egg? Would it still be 10? Suppose we have 200 floors. Would the step value be still 10? \n", - "\n", - "The point to note here is that we are trying to minimize the worst-case number of drops which happens if the threshold is at the highest floors. So, our steps should be of some value which reduces the number of drops of the first egg.\n", - "\n", - "Let's assume we take some step value m initially. If every subsequent step is m-1,\n", - "then, \n", - "$$m+m−1+m−2+.....+1=n$$\n", - "\n", - "This is \n", - "\n", - "$$\\frac{m∗(m+1)}{2}=n$$\n", - "\n", - "If n =100, then m would be 13.65 which since we can't drop from a decimal of a floor, we actually use 14.\n", - "\n", - "So, the worst case scenario is now when the threshold is in the first 14 floors with number of drops being 14.\n", - "\n", - "Note that this is simply a binary search!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb deleted file mode 100644 index f9dd3787..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem\n", - "\n", - "**A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.**\n", - "\n", - "**Show algorithmically how you would go about doing this in as few drops as possible**\n", - "\n", - "## Requirements\n", - "\n", - "** Use paper/pencil or a whiteboard for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb deleted file mode 100644 index 301d05a0..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb +++ /dev/null @@ -1,56 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.**\n", - "\n", - "\n", - "For example, if you were given the list of stock prices:\n", - "\n", - "prices = [12,11,15,3,10]\n", - "\n", - "Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).\n", - "\n", - "## Requirements\n", - "\n", - "** Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination **\n", - "\n", - "** Also you can't \"short\" a stock, you must buy *before* you sell the stock. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb deleted file mode 100644 index b7d2c7e4..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3\n", - "\n", - "## Problem\n", - "\n", - "**Given two rectangles, determine if they overlap. The rectangles are defined as a Dictionary, for example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "r1 = {\n", - " \n", - " # x and y coordinates of the bottom-left corner of the rectangle\n", - " 'x': 2 , 'y': 4,\n", - " \n", - " # Width and Height of rectangle\n", - " 'w':5,'h':12}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "** If the rectangles do overlap, return the dictionary which describes the overlapping section**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Make sure the dictionary you output is in the same form as the input.**\n", - "\n", - "** Feel free to use an IDE for the code, but make sure you use paper/pencil or whiteboard to draw out your plan and logic**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb similarity index 98% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb index 6d44e71a..b3c51b99 100644 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb +++ b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb @@ -36,7 +36,7 @@ "\n", "We will define our range as a section of the 25 possible combinations of rolls. A good way to do this is by converting the two rolls into a unique outcome number in the range 1 through 25.\n", "\n", - "We will create this number by taking the rolls, then we take the first roll and after subtracting 1 from it we multiply it by 4. Now the first roll corresponds with a value of 1 - 20.\n", + "We will create this number by taking the rolls, then we take the first roll and after subtracting 1 from it we multiply it by 5. Now the first roll corresponds with a value of 0, 5, 10, 15 and 20.\n", "\n", "Then we take the second roll and add it to the result of the first manipulation. Giving us a range of 1-25.\n", "\n", diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/Phone Screen.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/Phone Screen.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/Phone Screen.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems - SOLUTIONS/Phone Screen.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 1 .ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 1 .ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 1 .ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 1 .ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 2 .ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 2 .ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 2 .ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 2 .ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 3 .ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 3 .ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 3 .ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 3 .ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 4 .ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 4 .ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 4 .ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/On-Site Question 4 .ipynb diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/Phone Screen.ipynb b/Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/Phone Screen.ipynb similarity index 100% rename from Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/Phone Screen.ipynb rename to Mock Interviews/Large Search Engine Company/Search Engine Company - Interview Problems/Phone Screen.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index a471b4b1..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, find the largest product you could make from 3 integers in the list **\n", - "\n", - "## Requirements\n", - "\n", - "** You can assume that the list will always have at least 3 integers **\n", - "\n", - "** Paper/pencil only, don't code this out until you've solved it as far as you can by hand. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "We can solve this problem in O(n) time with O(1) space, we should also be able to take into account negative numbers, so that a list like: [-5,-5,1,3] returns (-5)(-5)(3) = 75 as its answer.\n", - "\n", - "Hopefully you've begun to realize the similarity between this problem and the Amazon stock problem from the E-Commerce Company mock interview questions! You could brute force this problem by just simply trying every single combination of three digits, but this would require O(n^3) time!\n", - "\n", - "How about we use a greedy approach and keep track of some numbers. In the stock problem we kept track of max profit so far, in this problem we are actually going to keep track of several numbers:\n", - "\n", - "* The highest product of 3 numbers so far\n", - "* The highest product of 2 numbers so far\n", - "* The highest number so far\n", - "\n", - "Since we want to keep negative numbers in account, we will also keep track of the lowest product of two and the lowest number:\n", - "\n", - "* The lowest product of 2\n", - "* The lowest number\n", - "\n", - "Once we iterate through the list and reach the end we will have the highest posiible product with 3 numbers. At each iteration we will take the current highest product of 3 and compare it to the current integer multiplied by the highest and lowest products of 2.\n", - "\n", - "Let's see this coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(lst):\n", - " \n", - " # Start at index 2 (3rd element) and assign highest and lowest \n", - " # based off of first two elements\n", - " \n", - " # Highest Number so far\n", - " high = max(lst[0],lst[1])\n", - " \n", - " # Lowest number so far\n", - " low = min(lst[0],lst[1])\n", - " \n", - " # Initiate Highest and lowest products of two numbers\n", - " high_prod2 = lst[0]*lst[1]\n", - " low_prod2 = lst[0]*lst[1]\n", - " \n", - " # Initiate highest product of 3 numbers\n", - " high_prod3 = lst[0]*lst[1]*lst[2]\n", - " \n", - " # Iterate through list\n", - " for num in lst[2:]:\n", - " \n", - " # Compare possible highest product of 3 numbers\n", - " high_prod3 = max(high_prod3,num*high_prod2,num*low_prod2)\n", - " \n", - " \n", - " # Check for possible new highest products of 2 numbers\n", - " high_prod2 = max(high_prod2,num*high,num*low)\n", - " \n", - " # Check for possible new lowest products of 2 numbers\n", - " low_prod2 = min(low_prod2,num*high,num*low)\n", - " \n", - " # Check for new possible high\n", - " high = max(high,num)\n", - " \n", - " # Check for new possible low\n", - " low = min(low,num)\n", - " \n", - " return high_prod3" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "763092" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "l = [99,-82,82,40,75,-24,39, -82, 5, 30, -25, -94, 93, -23, 48, 50, 49,-81,41,63]\n", - "\n", - "solution(l)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Through the use of a greedy approach we have been able to complete the problem in O(n) time. Keep this sort of approach in mind when you have to iterate through a list and a brute force solution is on the order of an exponential!\n", - "\n", - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 0c613795..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Write a function that given a target amount of money and a list of possible coin denominations, returns the number of ways to make change for the target amount using the coin denominations**\n", - "\n", - "## Requirements\n", - "\n", - "** Write out your work on paper/pencil, then see if you can code up your solution **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "This is a classic interview problem, so classic that you've already seen a very similar problem in the recursion section! Make sure to review that problem first before reading our solution here!\n", - "\n", - "In this solution we will use a [bottom-up](https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design) algorithm.\n", - "\n", - "* As we iterate through each coin, we are adding the ways of making arr[i - coin] to arr[i]\n", - "* If we have 2 ways of making 4, and are now iterating on a coin of value 3, there should be 2 ways of making 7.\n", - "* We are essentially adding the coin we are iterating on to the number of ways of making arr[i]." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(n, coins):\n", - " \n", - " # Set up our array for trakcing results\n", - " arr = [1] + [0] * n\n", - " \n", - " for coin in coins:\n", - " for i in range(coin, n + 1):\n", - " arr[i] += arr[i - coin]\n", - " \n", - " if n == 0:\n", - " return 0\n", - " else:\n", - " return arr[n]\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "884" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(100, [1, 2, 3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution results in O((m)(n)) with m being the number of coins, where we iterate about n operations. This is O(n) space." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 238cc667..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a binary tree, check whether it’s a binary search tree or not. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Use paper/pencil, do not code this in an IDE until you've done it manually**\n", - "\n", - "** Do not use built-in Python libraries to do this, but do mention them if you know about them **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "The first solution that comes to mind is, at every node check whether its value is larger than or equal to its left child and smaller than or equal to its right child (assuming equals can appear at either left or right). However, this approach is erroneous because it doesn’t check whether a node violates any condition with its grandparent or any of its ancestors. \n", - "\n", - "So, we should keep track of the minimum and maximum values a node can take. And at each node we will check whether its value is between the min and max values it’s allowed to take. The root can take any value between negative infinity and positive infinity. At any node, its left child should be smaller than or equal than its own value, and similarly the right child should be larger than or equal to. So during recursion, we send the current value as the new max to our left child and send the min as it is without changing. And to the right child, we send the current value as the new min and send the max without changing. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "class Node: \n", - " def __init__(self, val=None): \n", - " self.left, self.right, self.val = None, None, val \n", - " \n", - "INFINITY = float(\"infinity\") \n", - "NEG_INFINITY = float(\"-infinity\") \n", - "\n", - "def isBST(tree, minVal=NEG_INFINITY, maxVal=INFINITY): \n", - " if tree is None:\n", - " return True \n", - " if not minVal <= tree.val <= maxVal: \n", - " return False \n", - " \n", - " return isBST(tree.left, minVal, tree.val) and isBST(tree.right, tree.val, maxVal) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There’s an equally good alternative solution. If a tree is a binary search tree, then traversing the tree inorder should lead to sorted order of the values in the tree. So, we can perform an inorder traversal and check whether the node values are sorted or not." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def isBST2(tree, lastNode=[NEG_INFINITY]): \n", - " \n", - " if tree is None: \n", - " return True \n", - " \n", - " if not isBST2(tree.left, lastNode):\n", - " return False \n", - " \n", - " if tree.val < lastNode[0]: \n", - " return False \n", - " \n", - " lastNode[0]=tree.val \n", - " \n", - " return isBST2(tree.right, lastNode) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is a common interview problem, its relatively simple, but not trivial and shows that someone has a knowledge of binary search trees and tree traversals.\n", - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb rename to Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb rename to Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb rename to Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb rename to Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 1 .ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 1 .ipynb new file mode 100644 index 00000000..ccfa72f7 --- /dev/null +++ b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 1 .ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 1 \n", + "\n", + "## Problem\n", + "\n", + "** Given a list of integers, find the largest product you could make from 3 integers in the list **\n", + "\n", + "## Requirements\n", + "\n", + "** You can assume that the list will always have at least 3 integers **\n", + "\n", + "** Paper/pencil only, don't code this out until you've solved it as far as you can by hand. **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 2 .ipynb similarity index 56% rename from Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb rename to Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 2 .ipynb index 03231384..cd47095c 100644 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb +++ b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 2 .ipynb @@ -8,15 +8,11 @@ "\n", "## Problem\n", "\n", - "** Given a list of integers, write a function that will return a list, in which for each index the element will be the product of all the integers except for the element at that index **\n", - "\n", - "**For example, an input of [1,2,3,4] would return [24,12,8,6] by performing [2×3×4,1×3×4,1×2×4,1×2×3] **\n", + "** Write a function that given a target amount of money and a list of possible coin denominations, returns the number of ways to make change for the target amount using the coin denominations**\n", "\n", "## Requirements\n", "\n", - "** You can not use division in your answer! Meaning you can't simply multiply all the numbers and then divide by eahc element for each index!**\n", - "\n", - "** Try to do this on a white board or with paper/pencil.**" + "** Write out your work on paper/pencil, then see if you can code up your solution **" ] }, { diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 3 .ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 3 .ipynb new file mode 100644 index 00000000..380ec415 --- /dev/null +++ b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/On-Site Question 3 .ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 3 \n", + "\n", + "## Problem\n", + "\n", + "** Given a binary tree, check whether it’s a binary search tree or not. **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Requirements\n", + "\n", + "** Use paper/pencil, do not code this in an IDE until you've done it manually**\n", + "\n", + "** Do not use built-in Python libraries to do this, but do mention them if you know about them **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/Phone Screen .ipynb similarity index 68% rename from Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb rename to Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/Phone Screen .ipynb index 662e8373..062944af 100644 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb +++ b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions/Phone Screen .ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Phone Screen - SOLUTION\n", + "# Phone Screen \n", "\n", "## Problem\n", "\n", @@ -19,13 +19,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Solution\n", - "\n", - "Hopefully this problem sounds familiar! We can use a binary search to search for an intger since the list is already sorted! This means we can find the item in [O(logn) time and O(1) space](http://bigocheatsheet.com/)!\n", - "\n", - "Revisit the lectures on Binary Search and its implementation to fully get the reasoning behind this solution and problem!\n", - "\n", - "# Good Job!" + "# Good Luck!" ] } ], diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f00525dd..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,138 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers and a target number, write a function that returns a boolean indicating if its possible to sum two integers from the list to reach the target number **\n", - "\n", - "## Requirements\n", - "\n", - "** Try pen/paper before coding out your solution **\n", - "\n", - "** You can not use an integer element twice. Optimize for time over space **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "For this problem we will take advantage of a **set** data structure. We will make a single pass through the list of integers, treating each element as the first integer of our possible sum.\n", - "\n", - "At each iteration we will check to see if there is a second integer which will allow us hit the target number, adn we will use a set to check if we've already seen it in our list.\n", - "\n", - "We will then update our seen set by adding the current number in the iteration to it.\n", - "\n", - "Let's see this coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(lst,target):\n", - " \n", - " # Create set to keep track of duplicates\n", - " seen = set()\n", - " \n", - " # We want to find if there is a num2 that sums with num to reach the target\n", - " \n", - " for num in lst:\n", - " \n", - " num2 = target - num\n", - " \n", - " if num2 in seen:\n", - " return True\n", - " \n", - " seen.add(num)\n", - " \n", - " # If we never find a pair match which creates the sum\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([1,3,5,1,7],4)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([1,3,5,1,7],14)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 7d049b8a..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,86 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of account ID numbers (integers) which contains duplicates , find the one unique integer. (the list is guaranteed to only have one unique (non-duplicated) integer **\n", - "\n", - "## Requirements\n", - "\n", - "** Do not use built-in Python functions or methods **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "This should feel very familiar to one of the problems we did in the array section of the course! We can use an [XOR](https://en.wikipedia.org/wiki/Exclusive_or) operation. The **exclusive or** operations will take two sets of bits and for each pair it will return a 1 value if **one but not both** of the bits is 1.\n", - "\n", - "In Python we can use the ^ symbol to perform an XOR.\n", - "\n", - "Now for our solution we can simply XOR all the integers in the list. We start with a unique id set to 0, then every time we XOR a new id from the list, it will change the bits. When we XOR with the same ID again, it will cancel out the earlier change.\n", - "\n", - "By the end, we wil be left with the ID that was unique and only appeared once!" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(id_list):\n", - " \n", - " # Initiate unique Id\n", - " unique_id = 0\n", - " \n", - " # XOR fo revery id in id list\n", - " for i in id_list:\n", - " \n", - " # XOR operation\n", - " unique_id ^= i\n", - " \n", - " return unique_id" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 62cbf2b9..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,116 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Create a function that takes in a list of unsorted prices (integers) and a maximum possible price value, and return a sorted list of prices**\n", - "\n", - "## Requirements\n", - "\n", - "** Your function should be able to perform this in less than O(nlogn) time. **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "We can actually solve this problem by using a [*counting sort*](https://en.wikipedia.org/wiki/Counting_sort). Basically a counting sort works well when you know the range of integer values you will have ahead of time.\n", - "\n", - "Read the wikipedia article linked above for a full break down, and an implementation is here below (using the prices situation described in the problem above)." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(unsorted_prices,max_price):\n", - " \n", - " # list of 0s at indices 0 to max_price\n", - " prices_to_counts = [0]* (max_price+1)\n", - " \n", - " # populate prices\n", - " for price in unsorted_prices:\n", - " prices_to_counts[price] +=1\n", - " \n", - " # populate final sorted prices\n", - " sorted_prices = []\n", - " \n", - " # For each price in prices_to_counts\n", - " for price,count in enumerate(prices_to_counts):\n", - " \n", - " # for the number of times the element occurs\n", - " for time in range(count):\n", - " \n", - " # add it to the sorted price list\n", - " sorted_prices.append(price)\n", - " \n", - " return sorted_prices" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 3, 4, 6, 7, 8, 9]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([4,6,2,7,3,8,9],9)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This was a great exercise in learning about a new sorting algorithm, make sure to read up on it and practice this problem again!\n", - "\n", - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb deleted file mode 100644 index fe61bd16..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,87 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem \n", - "\n", - "** Remove duplicate characters in a given string keeping only the first occurrences. For example, if the input is ‘tree traversal’ the output will be ‘tre avsl’. **\n", - "\n", - "## Requirements\n", - "\n", - "**Complete this problem on a text editor that does not have syntax highlighting, such as a goolge doc!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "We need a data structure to keep track of the characters we have seen so far, which can perform efficient find operation. If the input is guaranteed to be in standard ASCII form, we can just create a boolean array of size 128 and perform lookups by accessing the index of the character’s ASCII value in constant time. But if the string is Unicode then we would need a much larger array of size more than 100K, which will be a waste since most of it would generally be unused.\n", - "\n", - "Set data structure perfectly suits our purpose. It stores keys and provides constant time search for key existence. So, we’ll loop over the characters of the string, and at each iteration we’ll check whether we have seen the current character before by searching the set. If it’s in the set then it means we’ve seen it before, so we ignore it. Otherwise, we include it in the result and add it to the set to keep track for future reference. The code is easier to understand:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def removeDuplicates(string): \n", - " result=[] \n", - " seen=set() \n", - " \n", - " for char in string: \n", - " if char not in seen: \n", - " seen.add(char) \n", - " result.append(char)\n", - " \n", - " return ''.join(result) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The time complexity of the algorithm is O(N) where N is the number of characters in the input string, because set supports O(1) insert and find. This is an optimal solution to one of the most common string interview questions. \n", - "\n", - "This problem should have felt very similar to some other array questions you've been asked! Remember that many basic interview question ideas overlap, just their presentation is different!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb rename to Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb rename to Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb rename to Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb similarity index 100% rename from Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb rename to Mock Interviews/Social Network Company/Social Network Company - Interview Questions/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 1.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 1.ipynb new file mode 100644 index 00000000..a72a4672 --- /dev/null +++ b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 1.ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 1 \n", + "\n", + "## Problem\n", + "\n", + "** Given a list of integers and a target number, write a function that returns a boolean indicating if its possible to sum two integers from the list to reach the target number **\n", + "\n", + "## Requirements\n", + "\n", + "** Try pen/paper before coding out your solution **\n", + "\n", + "** You can not use an integer element twice. Optimize for time over space **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 2.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 2.ipynb new file mode 100644 index 00000000..e65f70c4 --- /dev/null +++ b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 2.ipynb @@ -0,0 +1,47 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 2 \n", + "\n", + "## Problem\n", + "\n", + "** Given a list of account ID numbers (integers) which contains duplicates , find the one unique integer. (the list is guaranteed to only have one unique (non-duplicated) integer **\n", + "\n", + "## Requirements\n", + "\n", + "** Do not use built-in Python functions or methods **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 3.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 3.ipynb new file mode 100644 index 00000000..139bd6c5 --- /dev/null +++ b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/On-Site Question 3.ipynb @@ -0,0 +1,47 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On-Site Question 3 \n", + "\n", + "## Problem\n", + "\n", + "** Create a function that takes in a list of unsorted prices (integers) and a maximum possible price value, and return a sorted list of prices**\n", + "\n", + "## Requirements\n", + "\n", + "** Your function should be able to perform this in less than O(nlogn) time. **" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/Phone Screen .ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/Phone Screen .ipynb new file mode 100644 index 00000000..d082e4e5 --- /dev/null +++ b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions/Phone Screen .ipynb @@ -0,0 +1,47 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Phone Screen \n", + "\n", + "## Problem \n", + "\n", + "** Remove duplicate characters in a given string keeping only the first occurrences. For example, if the input is ‘tree traversal’ the output will be ‘tre avsl’. **\n", + "\n", + "## Requirements\n", + "\n", + "**Complete this problem on a text editor that does not have syntax highlighting, such as a goolge doc!**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Good Luck!" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Practice.ipynb b/Practice.ipynb new file mode 100644 index 00000000..b2ecf2ed --- /dev/null +++ b/Practice.ipynb @@ -0,0 +1,1407 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'HELLO'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'hello'\n", + "s.upper()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hi\n" + ] + } + ], + "source": [ + "set1 = set()\n", + "print('hi')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('hello',)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import timeit\n", + "timeit\n", + "singleton = 'hello',\n", + "singleton" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "{'banana', 'apple', 'orange', 'pear'}\n" + ] + } + ], + "source": [ + "basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}\n", + "print(type(basket))\n", + "print(basket)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{' ', 't', 's', 'i', 'h', 'o', 'e', 'n', 'm', 'g'}\n" + ] + } + ], + "source": [ + "chars = {c for c in 'this is something'}\n", + "print(chars)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = 'A man, a plan, a canal: Panama'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "'return' outside function (, line 7)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m return False\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m 'return' outside function\n" + ] + } + ], + "source": [ + "s='ab'\n", + "s=s.casefold()\n", + "chars = list(filter(lambda c:c.isalpha(), s))\n", + "low, high=0, len(chars)-1\n", + "while(low>> a_string = 'amanaplanacanalpanama' * 10\n", + ">>> min(timeit.repeat(lambda: reverse_string_readable_answer(a_string)))\n", + "10.38789987564087\n", + ">>> min(timeit.repeat(lambda: reversed_string(a_string)))\n", + "0.6622700691223145\n", + ">>> min(timeit.repeat(lambda: reverse_a_string_slowly(a_string)))\n", + "25.756799936294556\n", + ">>> min(timeit.repeat(lambda: reverse_a_string_more_slowly(a_string)))\n", + "38.73570013046265" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "s = 'amanaplanacanalpanama'" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def reverse_simple(s):\n", + " return s[::-1]\n", + "def reverse_readable(s):\n", + " return ''.join(reversed(s))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.00010040099732577801" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import timeit\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9958420610055327" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.6800561340060085" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "timeit.timeit('\"amanaplanacanalpanama\"[::-1]', number=10000000)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9.636620013043284" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "timeit.timeit('\"\".join(reversed(\"amanaplanacanalpanama\"))', number=10000000)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/bin/Documents/Workspace/GitHub/Python-for-Algorithm-and-Interviews\r\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "!say 'hi'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "stmt is neither a string nor callable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtimeit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/timeit.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(stmt, setup, timer, number, globals)\u001b[0m\n\u001b[1;32m 231\u001b[0m number=default_number, globals=None):\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\"\"\"Convenience function to create Timer object and call timeit method.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 233\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mTimer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstmt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msetup\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mglobals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 234\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 235\u001b[0m def repeat(stmt=\"pass\", setup=\"pass\", timer=default_timer,\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/timeit.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, stmt, setup, timer, globals)\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0mstmt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'_stmt()'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"stmt is neither a string nor callable\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 131\u001b[0m \u001b[0msrc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtemplate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstmt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstmt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msetup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msetup\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minit\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msrc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msrc\u001b[0m \u001b[0;31m# Save for traceback display\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: stmt is neither a string nor callable" + ] + } + ], + "source": [ + "timeit.timeit(,number=1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 2,\n", + " 4,\n", + " 6,\n", + " 8,\n", + " 10,\n", + " 12,\n", + " 14,\n", + " 16,\n", + " 18,\n", + " 20,\n", + " 22,\n", + " 24,\n", + " 26,\n", + " 28,\n", + " 30,\n", + " 32,\n", + " 34,\n", + " 36,\n", + " 38,\n", + " 40,\n", + " 42,\n", + " 44,\n", + " 46,\n", + " 48,\n", + " 50,\n", + " 52,\n", + " 54,\n", + " 56,\n", + " 58,\n", + " 60,\n", + " 62,\n", + " 64,\n", + " 66,\n", + " 68,\n", + " 70,\n", + " 72,\n", + " 74,\n", + " 76,\n", + " 78,\n", + " 80,\n", + " 82,\n", + " 84,\n", + " 86,\n", + " 88,\n", + " 90,\n", + " 92,\n", + " 94,\n", + " 96,\n", + " 98,\n", + " 100,\n", + " 102,\n", + " 104,\n", + " 106,\n", + " 108,\n", + " 110,\n", + " 112,\n", + " 114,\n", + " 116,\n", + " 118,\n", + " 120,\n", + " 122,\n", + " 124,\n", + " 126,\n", + " 128,\n", + " 130,\n", + " 132,\n", + " 134,\n", + " 136,\n", + " 138,\n", + " 140,\n", + " 142,\n", + " 144,\n", + " 146,\n", + " 148,\n", + " 150,\n", + " 152,\n", + " 154,\n", + " 156,\n", + " 158,\n", + " 160,\n", + " 162,\n", + " 164,\n", + " 166,\n", + " 168,\n", + " 170,\n", + " 172,\n", + " 174,\n", + " 176,\n", + " 178,\n", + " 180,\n", + " 182,\n", + " 184,\n", + " 186,\n", + " 188,\n", + " 190,\n", + " 192,\n", + " 194,\n", + " 196,\n", + " 198,\n", + " 200,\n", + " 202,\n", + " 204,\n", + " 206,\n", + " 208,\n", + " 210,\n", + " 212,\n", + " 214,\n", + " 216,\n", + " 218,\n", + " 220,\n", + " 222,\n", + " 224,\n", + " 226,\n", + " 228,\n", + " 230,\n", + " 232,\n", + " 234,\n", + " 236,\n", + " 238,\n", + " 240,\n", + " 242,\n", + " 244,\n", + " 246,\n", + " 248,\n", + " 250,\n", + " 252,\n", + " 254,\n", + " 256,\n", + " 258,\n", + " 260,\n", + " 262,\n", + " 264,\n", + " 266,\n", + " 268,\n", + " 270,\n", + " 272,\n", + " 274,\n", + " 276,\n", + " 278,\n", + " 280,\n", + " 282,\n", + " 284,\n", + " 286,\n", + " 288,\n", + " 290,\n", + " 292,\n", + " 294,\n", + " 296,\n", + " 298,\n", + " 300,\n", + " 302,\n", + " 304,\n", + " 306,\n", + " 308,\n", + " 310,\n", + " 312,\n", + " 314,\n", + " 316,\n", + " 318,\n", + " 320,\n", + " 322,\n", + " 324,\n", + " 326,\n", + " 328,\n", + " 330,\n", + " 332,\n", + " 334,\n", + " 336,\n", + " 338,\n", + " 340,\n", + " 342,\n", + " 344,\n", + " 346,\n", + " 348,\n", + " 350,\n", + " 352,\n", + " 354,\n", + " 356,\n", + " 358,\n", + " 360,\n", + " 362,\n", + " 364,\n", + " 366,\n", + " 368,\n", + " 370,\n", + " 372,\n", + " 374,\n", + " 376,\n", + " 378,\n", + " 380,\n", + " 382,\n", + " 384,\n", + " 386,\n", + " 388,\n", + " 390,\n", + " 392,\n", + " 394,\n", + " 396,\n", + " 398,\n", + " 400,\n", + " 402,\n", + " 404,\n", + " 406,\n", + " 408,\n", + " 410,\n", + " 412,\n", + " 414,\n", + " 416,\n", + " 418,\n", + " 420,\n", + " 422,\n", + " 424,\n", + " 426,\n", + " 428,\n", + " 430,\n", + " 432,\n", + " 434,\n", + " 436,\n", + " 438,\n", + " 440,\n", + " 442,\n", + " 444,\n", + " 446,\n", + " 448,\n", + " 450,\n", + " 452,\n", + " 454,\n", + " 456,\n", + " 458,\n", + " 460,\n", + " 462,\n", + " 464,\n", + " 466,\n", + " 468,\n", + " 470,\n", + " 472,\n", + " 474,\n", + " 476,\n", + " 478,\n", + " 480,\n", + " 482,\n", + " 484,\n", + " 486,\n", + " 488,\n", + " 490,\n", + " 492,\n", + " 494,\n", + " 496,\n", + " 498,\n", + " 500,\n", + " 502,\n", + " 504,\n", + " 506,\n", + " 508,\n", + " 510,\n", + " 512,\n", + " 514,\n", + " 516,\n", + " 518,\n", + " 520,\n", + " 522,\n", + " 524,\n", + " 526,\n", + " 528,\n", + " 530,\n", + " 532,\n", + " 534,\n", + " 536,\n", + " 538,\n", + " 540,\n", + " 542,\n", + " 544,\n", + " 546,\n", + " 548,\n", + " 550,\n", + " 552,\n", + " 554,\n", + " 556,\n", + " 558,\n", + " 560,\n", + " 562,\n", + " 564,\n", + " 566,\n", + " 568,\n", + " 570,\n", + " 572,\n", + " 574,\n", + " 576,\n", + " 578,\n", + " 580,\n", + " 582,\n", + " 584,\n", + " 586,\n", + " 588,\n", + " 590,\n", + " 592,\n", + " 594,\n", + " 596,\n", + " 598,\n", + " 600,\n", + " 602,\n", + " 604,\n", + " 606,\n", + " 608,\n", + " 610,\n", + " 612,\n", + " 614,\n", + " 616,\n", + " 618,\n", + " 620,\n", + " 622,\n", + " 624,\n", + " 626,\n", + " 628,\n", + " 630,\n", + " 632,\n", + " 634,\n", + " 636,\n", + " 638,\n", + " 640,\n", + " 642,\n", + " 644,\n", + " 646,\n", + " 648,\n", + " 650,\n", + " 652,\n", + " 654,\n", + " 656,\n", + " 658,\n", + " 660,\n", + " 662,\n", + " 664,\n", + " 666,\n", + " 668,\n", + " 670,\n", + " 672,\n", + " 674,\n", + " 676,\n", + " 678,\n", + " 680,\n", + " 682,\n", + " 684,\n", + " 686,\n", + " 688,\n", + " 690,\n", + " 692,\n", + " 694,\n", + " 696,\n", + " 698,\n", + " 700,\n", + " 702,\n", + " 704,\n", + " 706,\n", + " 708,\n", + " 710,\n", + " 712,\n", + " 714,\n", + " 716,\n", + " 718,\n", + " 720,\n", + " 722,\n", + " 724,\n", + " 726,\n", + " 728,\n", + " 730,\n", + " 732,\n", + " 734,\n", + " 736,\n", + " 738,\n", + " 740,\n", + " 742,\n", + " 744,\n", + " 746,\n", + " 748,\n", + " 750,\n", + " 752,\n", + " 754,\n", + " 756,\n", + " 758,\n", + " 760,\n", + " 762,\n", + " 764,\n", + " 766,\n", + " 768,\n", + " 770,\n", + " 772,\n", + " 774,\n", + " 776,\n", + " 778,\n", + " 780,\n", + " 782,\n", + " 784,\n", + " 786,\n", + " 788,\n", + " 790,\n", + " 792,\n", + " 794,\n", + " 796,\n", + " 798,\n", + " 800,\n", + " 802,\n", + " 804,\n", + " 806,\n", + " 808,\n", + " 810,\n", + " 812,\n", + " 814,\n", + " 816,\n", + " 818,\n", + " 820,\n", + " 822,\n", + " 824,\n", + " 826,\n", + " 828,\n", + " 830,\n", + " 832,\n", + " 834,\n", + " 836,\n", + " 838,\n", + " 840,\n", + " 842,\n", + " 844,\n", + " 846,\n", + " 848,\n", + " 850,\n", + " 852,\n", + " 854,\n", + " 856,\n", + " 858,\n", + " 860,\n", + " 862,\n", + " 864,\n", + " 866,\n", + " 868,\n", + " 870,\n", + " 872,\n", + " 874,\n", + " 876,\n", + " 878,\n", + " 880,\n", + " 882,\n", + " 884,\n", + " 886,\n", + " 888,\n", + " 890,\n", + " 892,\n", + " 894,\n", + " 896,\n", + " 898,\n", + " 900,\n", + " 902,\n", + " 904,\n", + " 906,\n", + " 908,\n", + " 910,\n", + " 912,\n", + " 914,\n", + " 916,\n", + " 918,\n", + " 920,\n", + " 922,\n", + " 924,\n", + " 926,\n", + " 928,\n", + " 930,\n", + " 932,\n", + " 934,\n", + " 936,\n", + " 938,\n", + " 940,\n", + " 942,\n", + " 944,\n", + " 946,\n", + " 948,\n", + " 950,\n", + " 952,\n", + " 954,\n", + " 956,\n", + " 958,\n", + " 960,\n", + " 962,\n", + " 964,\n", + " 966,\n", + " 968,\n", + " 970,\n", + " 972,\n", + " 974,\n", + " 976,\n", + " 978,\n", + " 980,\n", + " 982,\n", + " 984,\n", + " 986,\n", + " 988,\n", + " 990,\n", + " 992,\n", + " 994,\n", + " 996,\n", + " 998,\n", + " 1000,\n", + " 1002,\n", + " 1004,\n", + " 1006,\n", + " 1008,\n", + " 1010,\n", + " 1012,\n", + " 1014,\n", + " 1016,\n", + " 1018,\n", + " 1020,\n", + " 1022,\n", + " 1024,\n", + " 1026,\n", + " 1028,\n", + " 1030,\n", + " 1032,\n", + " 1034,\n", + " 1036,\n", + " 1038,\n", + " 1040,\n", + " 1042,\n", + " 1044,\n", + " 1046,\n", + " 1048,\n", + " 1050,\n", + " 1052,\n", + " 1054,\n", + " 1056,\n", + " 1058,\n", + " 1060,\n", + " 1062,\n", + " 1064,\n", + " 1066,\n", + " 1068,\n", + " 1070,\n", + " 1072,\n", + " 1074,\n", + " 1076,\n", + " 1078,\n", + " 1080,\n", + " 1082,\n", + " 1084,\n", + " 1086,\n", + " 1088,\n", + " 1090,\n", + " 1092,\n", + " 1094,\n", + " 1096,\n", + " 1098,\n", + " 1100,\n", + " 1102,\n", + " 1104,\n", + " 1106,\n", + " 1108,\n", + " 1110,\n", + " 1112,\n", + " 1114,\n", + " 1116,\n", + " 1118,\n", + " 1120,\n", + " 1122,\n", + " 1124,\n", + " 1126,\n", + " 1128,\n", + " 1130,\n", + " 1132,\n", + " 1134,\n", + " 1136,\n", + " 1138,\n", + " 1140,\n", + " 1142,\n", + " 1144,\n", + " 1146,\n", + " 1148,\n", + " 1150,\n", + " 1152,\n", + " 1154,\n", + " 1156,\n", + " 1158,\n", + " 1160,\n", + " 1162,\n", + " 1164,\n", + " 1166,\n", + " 1168,\n", + " 1170,\n", + " 1172,\n", + " 1174,\n", + " 1176,\n", + " 1178,\n", + " 1180,\n", + " 1182,\n", + " 1184,\n", + " 1186,\n", + " 1188,\n", + " 1190,\n", + " 1192,\n", + " 1194,\n", + " 1196,\n", + " 1198,\n", + " 1200,\n", + " 1202,\n", + " 1204,\n", + " 1206,\n", + " 1208,\n", + " 1210,\n", + " 1212,\n", + " 1214,\n", + " 1216,\n", + " 1218,\n", + " 1220,\n", + " 1222,\n", + " 1224,\n", + " 1226,\n", + " 1228,\n", + " 1230,\n", + " 1232,\n", + " 1234,\n", + " 1236,\n", + " 1238,\n", + " 1240,\n", + " 1242,\n", + " 1244,\n", + " 1246,\n", + " 1248,\n", + " 1250,\n", + " 1252,\n", + " 1254,\n", + " 1256,\n", + " 1258,\n", + " 1260,\n", + " 1262,\n", + " 1264,\n", + " 1266,\n", + " 1268,\n", + " 1270,\n", + " 1272,\n", + " 1274,\n", + " 1276,\n", + " 1278,\n", + " 1280,\n", + " 1282,\n", + " 1284,\n", + " 1286,\n", + " 1288,\n", + " 1290,\n", + " 1292,\n", + " 1294,\n", + " 1296,\n", + " 1298,\n", + " 1300,\n", + " 1302,\n", + " 1304,\n", + " 1306,\n", + " 1308,\n", + " 1310,\n", + " 1312,\n", + " 1314,\n", + " 1316,\n", + " 1318,\n", + " 1320,\n", + " 1322,\n", + " 1324,\n", + " 1326,\n", + " 1328,\n", + " 1330,\n", + " 1332,\n", + " 1334,\n", + " 1336,\n", + " 1338,\n", + " 1340,\n", + " 1342,\n", + " 1344,\n", + " 1346,\n", + " 1348,\n", + " 1350,\n", + " 1352,\n", + " 1354,\n", + " 1356,\n", + " 1358,\n", + " 1360,\n", + " 1362,\n", + " 1364,\n", + " 1366,\n", + " 1368,\n", + " 1370,\n", + " 1372,\n", + " 1374,\n", + " 1376,\n", + " 1378,\n", + " 1380,\n", + " 1382,\n", + " 1384,\n", + " 1386,\n", + " 1388,\n", + " 1390,\n", + " 1392,\n", + " 1394,\n", + " 1396,\n", + " 1398,\n", + " 1400,\n", + " 1402,\n", + " 1404,\n", + " 1406,\n", + " 1408,\n", + " 1410,\n", + " 1412,\n", + " 1414,\n", + " 1416,\n", + " 1418,\n", + " 1420,\n", + " 1422,\n", + " 1424,\n", + " 1426,\n", + " 1428,\n", + " 1430,\n", + " 1432,\n", + " 1434,\n", + " 1436,\n", + " 1438,\n", + " 1440,\n", + " 1442,\n", + " 1444,\n", + " 1446,\n", + " 1448,\n", + " 1450,\n", + " 1452,\n", + " 1454,\n", + " 1456,\n", + " 1458,\n", + " 1460,\n", + " 1462,\n", + " 1464,\n", + " 1466,\n", + " 1468,\n", + " 1470,\n", + " 1472,\n", + " 1474,\n", + " 1476,\n", + " 1478,\n", + " 1480,\n", + " 1482,\n", + " 1484,\n", + " 1486,\n", + " 1488,\n", + " 1490,\n", + " 1492,\n", + " 1494,\n", + " 1496,\n", + " 1498,\n", + " 1500,\n", + " 1502,\n", + " 1504,\n", + " 1506,\n", + " 1508,\n", + " 1510,\n", + " 1512,\n", + " 1514,\n", + " 1516,\n", + " 1518,\n", + " 1520,\n", + " 1522,\n", + " 1524,\n", + " 1526,\n", + " 1528,\n", + " 1530,\n", + " 1532,\n", + " 1534,\n", + " 1536,\n", + " 1538,\n", + " 1540,\n", + " 1542,\n", + " 1544,\n", + " 1546,\n", + " 1548,\n", + " 1550,\n", + " 1552,\n", + " 1554,\n", + " 1556,\n", + " 1558,\n", + " 1560,\n", + " 1562,\n", + " 1564,\n", + " 1566,\n", + " 1568,\n", + " 1570,\n", + " 1572,\n", + " 1574,\n", + " 1576,\n", + " 1578,\n", + " 1580,\n", + " 1582,\n", + " 1584,\n", + " 1586,\n", + " 1588,\n", + " 1590,\n", + " 1592,\n", + " 1594,\n", + " 1596,\n", + " 1598,\n", + " 1600,\n", + " 1602,\n", + " 1604,\n", + " 1606,\n", + " 1608,\n", + " 1610,\n", + " 1612,\n", + " 1614,\n", + " 1616,\n", + " 1618,\n", + " 1620,\n", + " 1622,\n", + " 1624,\n", + " 1626,\n", + " 1628,\n", + " 1630,\n", + " 1632,\n", + " 1634,\n", + " 1636,\n", + " 1638,\n", + " 1640,\n", + " 1642,\n", + " 1644,\n", + " 1646,\n", + " 1648,\n", + " 1650,\n", + " 1652,\n", + " 1654,\n", + " 1656,\n", + " 1658,\n", + " 1660,\n", + " 1662,\n", + " 1664,\n", + " 1666,\n", + " 1668,\n", + " 1670,\n", + " 1672,\n", + " 1674,\n", + " 1676,\n", + " 1678,\n", + " 1680,\n", + " 1682,\n", + " 1684,\n", + " 1686,\n", + " 1688,\n", + " 1690,\n", + " 1692,\n", + " 1694,\n", + " 1696,\n", + " 1698,\n", + " 1700,\n", + " 1702,\n", + " 1704,\n", + " 1706,\n", + " 1708,\n", + " 1710,\n", + " 1712,\n", + " 1714,\n", + " 1716,\n", + " 1718,\n", + " 1720,\n", + " 1722,\n", + " 1724,\n", + " 1726,\n", + " 1728,\n", + " 1730,\n", + " 1732,\n", + " 1734,\n", + " 1736,\n", + " 1738,\n", + " 1740,\n", + " 1742,\n", + " 1744,\n", + " 1746,\n", + " 1748,\n", + " 1750,\n", + " 1752,\n", + " 1754,\n", + " 1756,\n", + " 1758,\n", + " 1760,\n", + " 1762,\n", + " 1764,\n", + " 1766,\n", + " 1768,\n", + " 1770,\n", + " 1772,\n", + " 1774,\n", + " 1776,\n", + " 1778,\n", + " 1780,\n", + " 1782,\n", + " 1784,\n", + " 1786,\n", + " 1788,\n", + " 1790,\n", + " 1792,\n", + " 1794,\n", + " 1796,\n", + " 1798,\n", + " 1800,\n", + " 1802,\n", + " 1804,\n", + " 1806,\n", + " 1808,\n", + " 1810,\n", + " 1812,\n", + " 1814,\n", + " 1816,\n", + " 1818,\n", + " 1820,\n", + " 1822,\n", + " 1824,\n", + " 1826,\n", + " 1828,\n", + " 1830,\n", + " 1832,\n", + " 1834,\n", + " 1836,\n", + " 1838,\n", + " 1840,\n", + " 1842,\n", + " 1844,\n", + " 1846,\n", + " 1848,\n", + " 1850,\n", + " 1852,\n", + " 1854,\n", + " 1856,\n", + " 1858,\n", + " 1860,\n", + " 1862,\n", + " 1864,\n", + " 1866,\n", + " 1868,\n", + " 1870,\n", + " 1872,\n", + " 1874,\n", + " 1876,\n", + " 1878,\n", + " 1880,\n", + " 1882,\n", + " 1884,\n", + " 1886,\n", + " 1888,\n", + " 1890,\n", + " 1892,\n", + " 1894,\n", + " 1896,\n", + " 1898,\n", + " 1900,\n", + " 1902,\n", + " 1904,\n", + " 1906,\n", + " 1908,\n", + " 1910,\n", + " 1912,\n", + " 1914,\n", + " 1916,\n", + " 1918,\n", + " 1920,\n", + " 1922,\n", + " 1924,\n", + " 1926,\n", + " 1928,\n", + " 1930,\n", + " 1932,\n", + " 1934,\n", + " 1936,\n", + " 1938,\n", + " 1940,\n", + " 1942,\n", + " 1944,\n", + " 1946,\n", + " 1948,\n", + " 1950,\n", + " 1952,\n", + " 1954,\n", + " 1956,\n", + " 1958,\n", + " 1960,\n", + " 1962,\n", + " 1964,\n", + " 1966,\n", + " 1968,\n", + " 1970,\n", + " 1972,\n", + " 1974,\n", + " 1976,\n", + " 1978,\n", + " 1980,\n", + " 1982,\n", + " 1984,\n", + " 1986,\n", + " 1988,\n", + " 1990,\n", + " 1992,\n", + " 1994,\n", + " 1996,\n", + " 1998]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import timeit\n", + "[2 * n for n in range(1000)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 1 - Reverse String - SOLUTION.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 1 - Reverse String - SOLUTION.ipynb deleted file mode 100644 index 3f683cab..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 1 - Reverse String - SOLUTION.ipynb +++ /dev/null @@ -1,146 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reverse a String\n", - "\n", - "This interview question requires you to reverse a string using recursion. Make sure to think of the base case here.\n", - "\n", - "Again, make sure you use *recursion* to accomplish this. **Do not slice (e.g. string[::-1]) or use iteration, there muse be a recursive call for the function.**\n", - "\n", - "____\n", - "\n", - "## Solution\n", - "\n", - "In order to reverse a string using recursion we need to consider what a base and recursive case would look like. Here we've set a base case to be when the length of the string we are passing through the function is length less than or equal to 1.\n", - "\n", - "During the recursive case we grab the first letter and add it on to the recursive call." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def reverse(s):\n", - " \n", - " # Base Case\n", - " if len(s) <= 1:\n", - " return s\n", - "\n", - " # Recursion\n", - " return reverse(s[1:]) + s[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'dlrow olleh'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse('hello world')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Test Your Solution\n", - "\n", - "Run the cell below to test your solution against the following cases:\n", - "\n", - " string = 'hello'\n", - " string = 'hello world'\n", - " string = '123456789'" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PASSED ALL TEST CASES!\n" - ] - } - ], - "source": [ - "'''\n", - "RUN THIS CELL TO TEST YOUR FUNCTION AGAINST SOME TEST CASES\n", - "'''\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestReverse(object):\n", - " \n", - " def test_rev(self,solution):\n", - " assert_equal(solution('hello'),'olleh')\n", - " assert_equal(solution('hello world'),'dlrow olleh')\n", - " assert_equal(solution('123456789'),'987654321')\n", - " \n", - " print 'PASSED ALL TEST CASES!'\n", - " \n", - "# Run Tests\n", - "test = TestReverse()\n", - "test.test_rev(reverse)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extra Notes\n", - "\n", - "The \"trick\" to this question was thinking about what a base case would look like when reversing a string recursively. It takes a lot of practice to be able to begin thinking like this, so don't worry if you're struggling! However it is important to fully understand the solution!\n", - "\n", - "**Good Job!**" - ] - } - ], - "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/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 2 - String Permutation- SOLUTION.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 2 - String Permutation- SOLUTION.ipynb deleted file mode 100644 index 31274b2b..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 2 - String Permutation- SOLUTION.ipynb +++ /dev/null @@ -1,175 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# String Permutation\n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string, write a function that uses recursion to output a list of all the possible permutations of that string.\n", - "\n", - "For example, given s='abc' the function should return ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']\n", - "\n", - "*Note: If a character is repeated, treat each occurence as distinct, for example an input of 'xxx' would return a list with 6 \"versions\" of 'xxx'*\n", - "\n", - "\n", - "## Fill Out Your Solution Below\n", - "\n", - "Let's think about what the steps we need to take here are:\n", - "\n", - "1. Iterate through the initial string – e.g., ‘abc’.\n", - "\n", - "* For each character in the initial string, set aside that character and get a list of all permutations of the string that’s left. So, for example, if the current iteration is on 'b', we’d want to find all the permutations of the string 'ac'.\n", - "\n", - "* Once you have the list from step 2, add each element from that list to the character from the initial string, and append the result to our list of final results. So if we’re on 'b' and we’ve gotten the list ['ac', 'ca'], we’d add 'b' to those, resulting in 'bac' and 'bca', each of which we’d add to our final results.\n", - "\n", - "* Return the list of final results.\n", - "\n", - "Let's go ahead and see this implemented:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def permute(s):\n", - " out = []\n", - " \n", - " # Base Case\n", - " if len(s) == 1:\n", - " out = [s]\n", - " \n", - " else:\n", - " # For every letter in string\n", - " for i, let in enumerate(s):\n", - " \n", - " # For every permutation resulting from Step 2 and 3 described above\n", - " for perm in permute(s[:i] + s[i+1:]):\n", - " \n", - " # Add it to output\n", - " out += [let + perm]\n", - "\n", - " return out" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['abc', 'acb', 'bac', 'bca', 'cab', 'cba']" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "permute('abc')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All test cases passed.\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION.\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPerm(object):\n", - " \n", - " def test(self,solution):\n", - " \n", - " assert_equal(sorted(solution('abc')),sorted(['abc', 'acb', 'bac', 'bca', 'cab', 'cba']))\n", - " assert_equal(sorted(solution('dog')),sorted(['dog', 'dgo', 'odg', 'ogd', 'gdo', 'god']) )\n", - " \n", - " print 'All test cases passed.'\n", - " \n", - "\n", - "\n", - "# Run Tests\n", - "t = TestPerm()\n", - "t.test(permute)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "# Conclusion\n", - "\n", - "There were two main takeaways from tackling this problem:\n", - "\n", - "* Every time we put a new letter in position i, we then had to find all the possible combinations at position i+1 – this was the recursive call that we made. How do we know when to save a string? When we are at a position i that is greater than the number of letters in the input string, then we know that we have found one valid permutation of the string and then we can add it to the list and return to changing letters at positions less than i. This was our base case – remember that we always must have a recursive case and a base case when using recursion!\n", - "\n", - "\n", - "* Another big part of this problem was figuring out which letters we can put in a given position. Using our sample string “abc”, lets say that we are going through all the permutations where the first letter is \"c”. Then, it should be clear that the letter in the 2nd and 3rd position can only be either “a” or “b”, because “a” is already used. As part of our algorithm, we have to know which letters can be used in a given position – because we can’t reuse the letters that were used in the earlier positions. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Good Job!" - ] - } - ], - "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/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 3 - Fibonacci Sequence - SOLUTION.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 3 - Fibonacci Sequence - SOLUTION.ipynb deleted file mode 100644 index 30914e73..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 3 - Fibonacci Sequence - SOLUTION.ipynb +++ /dev/null @@ -1,265 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Fibonnaci Sequence\n", - "\n", - "## Problem Statement\n", - "\n", - "Implement a [Fibonnaci Sequence](https://en.wikipedia.org/wiki/Fibonacci_number) in three different ways:\n", - "\n", - "* Recursively\n", - "* Dynamically (Using Memoization to store results)\n", - "* Iteratively\n", - "\n", - "Remember that a fibonacci sequence: 0,1,1,2,3,5,8,13,21,... starts off with a base case checking to see if n = 0 or 1, then it returns 1. \n", - "\n", - "Else it returns fib(n-1)+fib(n+2)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Recursively\n", - "\n", - "The recursive solution is exponential time Big-O , with O(2^n). However, its a very simple and basic implementation to consider:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def fib_rec(n):\n", - " \n", - " # Base Case\n", - " if n == 0 or n == 1:\n", - " return n\n", - " \n", - " # Recursion\n", - " else:\n", - " return fib_rec(n-1) + fib_rec(n-2)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fib_rec(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dynamically\n", - "\n", - "In the form it is implemented here, the cache is set beforehand and is based on the desired **n** number of the Fibonacci Sequence. Note how we check it the cache[n] != None, meaning we have a check to know wether or not to keep setting the cache (and more importantly keep cache of old results!)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate Cache information\n", - "n = 10\n", - "cache = [None] * (n + 1)\n", - "\n", - "\n", - "def fib_dyn(n):\n", - " \n", - " # Base Case\n", - " if n == 0 or n == 1:\n", - " return n\n", - " \n", - " # Check cache\n", - " if cache[n] != None:\n", - " return cache[n]\n", - " \n", - " # Keep setting cache\n", - " cache[n] = fib_dyn(n-1) + fib_dyn(n-2)\n", - " \n", - " return cache[n]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fib_dyn(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Iteratively\n", - "\n", - "In this solution we can take advantage of Python's tuple unpacking!" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def fib_iter(n):\n", - " \n", - " # Set starting point\n", - " a = 0\n", - " b = 1\n", - " \n", - " # Follow algorithm\n", - " for i in range(n):\n", - " \n", - " a, b = b, a + b\n", - " \n", - " return a" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "28657" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fib_iter(23)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Run the cell below to test your solutions, simply uncomment the solution functions you wish to test!" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Passed all tests.\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "UNCOMMENT THE CODE AT THE BOTTOM OF THIS CELL TO SELECT WHICH SOLUTIONS TO TEST.\n", - "THEN RUN THE CELL.\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFib(object):\n", - " \n", - " def test(self,solution):\n", - " assert_equal(solution(10),55)\n", - " assert_equal(solution(1),1)\n", - " assert_equal(solution(23),28657)\n", - " print 'Passed all tests.'\n", - "# UNCOMMENT FOR CORRESPONDING FUNCTION\n", - "t = TestFib()\n", - "\n", - "t.test(fib_rec)\n", - "#t.test(fib_dyn) # Note, will need to reset cache size for each test!\n", - "#t.test(fib_iter)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "Hopefully this interview question served as a good excercise in exploring recursion, dynamic programming, and iterative solutions for a single problem! Its good to work through all three because in an interview a common question may just begin with requesting a recursive solution and then checking to se if you can implement the other forms!" - ] - } - ], - "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/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 4 - Coin Change - SOLUTION.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 4 - Coin Change - SOLUTION.ipynb deleted file mode 100644 index a3ace666..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems - SOLUTIONS/Recursion Problem 4 - Coin Change - SOLUTION.ipynb +++ /dev/null @@ -1,308 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Coin Change Problem\n", - "\n", - "**Note: This problem has multiple solutions and is a classic problem in showing issues with basic recursion. There are better solutions involving memoization and simple iterative solutions.If you are having trouble with this problem (or it seems to be taking a long time to run in some cases) check out the Solution Notebook and fully read the conclusion link for a detailed description of the various ways to solve this problem!**\n", - "\n", - "\n", - "This problem is common enough that is actually has its own [Wikipedia Entry](https://en.wikipedia.org/wiki/Change-making_problem)! Let's check the problem statement again:\n", - "\n", - "This is a classic recursion problem: Given a target amount **n** and a list (array) of distinct coin values, what's the fewest coins needed to make the change amount. \n", - "\n", - "For example:\n", - "\n", - "If n = 10 and coins = [1,5,10]. Then there are 4 possible ways to make change:\n", - "\n", - "* 1+1+1+1+1+1+1+1+1+1\n", - "\n", - "* 5 + 1+1+1+1+1\n", - "\n", - "* 5+5\n", - "\n", - "* 10\n", - "\n", - "With 1 coin being the minimum amount.\n", - "\n", - " \n", - "## Solution\n", - "\n", - "This is a classic problem to show the value of dynamic programming. We'll show a basic recursive example and show why it's actually not the best way to solve this problem.\n", - "\n", - "Make sure to read the comments in the code below to fully understand the basic logic!" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rec_coin(target,coins):\n", - " '''\n", - " INPUT: Target change amount and list of coin values\n", - " OUTPUT: Minimum coins needed to make change\n", - " \n", - " Note, this solution is not optimized.\n", - " '''\n", - " \n", - " # Default to target value\n", - " min_coins = target\n", - " \n", - " # Check to see if we have a single coin match (BASE CASE)\n", - " if target in coins:\n", - " return 1\n", - " \n", - " else:\n", - " \n", - " # for every coin value that is <= than target\n", - " for i in [c for c in coins if c <= target]:\n", - " \n", - " # Recursive Call (add a count coin and subtract from the target) \n", - " num_coins = 1 + rec_coin(target-i,coins)\n", - " \n", - " # Reset Minimum if we have a new minimum\n", - " if num_coins < min_coins:\n", - " \n", - " min_coins = num_coins\n", - " \n", - " return min_coins" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see it in action." - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6\n" - ] - } - ], - "source": [ - "rec_coin(63,[1,5,10,25])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The problem with this approach is that it is very inefficient! It can take many, many recursive calls to finish this problem and its also inaccurate for non standard coin values (coin values that are not 1,5,10, etc.)\n", - "\n", - "We can see the problem with this approach in the figure below:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image(url='http://interactivepython.org/runestone/static/pythonds/_images/callTree.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each node here corresponds to a call to the **rec_coin** function. The label on the node indicated the amount of change for which we are now computng the number of coins for. Note how we are recalculating values we've already solved! For instance 15 is called 3 times. It would be much better if we could keep track of function calls we've already made.\n", - "_____\n", - "## Dynamic Programming Solution\n", - "\n", - "This is the key to reducing the work time for the function. The better solution is to remember past results, that way before computing a new minimum we can check to see if we already know a result.\n", - "\n", - "Let's implement this:" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def rec_coin_dynam(target,coins,known_results):\n", - " '''\n", - " INPUT: This funciton takes in a target amount and a list of possible coins to use.\n", - " It also takes a third parameter, known_results, indicating previously calculated results.\n", - " The known_results parameter shoud be started with [0] * (target+1)\n", - " \n", - " OUTPUT: Minimum number of coins needed to make the target.\n", - " '''\n", - " \n", - " # Default output to target\n", - " min_coins = target\n", - " \n", - " # Base Case\n", - " if target in coins:\n", - " known_results[target] = 1\n", - " return 1\n", - " \n", - " # Return a known result if it happens to be greater than 1\n", - " elif known_results[target] > 0:\n", - " return known_results[target]\n", - " \n", - " else:\n", - " # for every coin value that is <= than target\n", - " for i in [c for c in coins if c <= target]:\n", - " \n", - " # Recursive call, note how we include the known results!\n", - " num_coins = 1 + rec_coin_dynam(target-i,coins,known_results)\n", - " \n", - " # Reset Minimum if we have a new minimum\n", - " if num_coins < min_coins:\n", - " min_coins = num_coins\n", - " \n", - " # Reset the known result\n", - " known_results[target] = min_coins\n", - " \n", - " return min_coins" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test it!" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target = 74\n", - "coins = [1,5,10,25]\n", - "known_results = [0]*(target+1)\n", - "\n", - "rec_coin_dynam(target,coins,known_results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Run the cell below to test your function against some test cases. \n", - "\n", - "**Note that the TestCoins class only test functions with two parameter inputs, the list of coins and the target**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR FUNCTION.\n", - "NOTE: NON-DYNAMIC FUNCTIONS WILL TAKE A LONG TIME TO TEST. IF YOU BELIEVE YOU HAVE A SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCoins(object):\n", - " \n", - " def check(self,solution):\n", - " coins = [1,5,10,25]\n", - " assert_equal(solution(45,coins),3)\n", - " assert_equal(solution(23,coins),5)\n", - " assert_equal(solution(74,coins),8)\n", - "\n", - " print 'Passed all tests.'\n", - " \n", - "# Run Test\n", - "\n", - "test = TestCoins()\n", - "test.check(rec_coin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion and Extra Resources\n", - "\n", - "For homework, read the link below and also implement the non-recursive solution described in the link!\n", - "\n", - "For another great resource on a variation of this problem, check out this link:\n", - "[Dynamic Programming Coin Change Problem](http://interactivepython.org/runestone/static/pythonds/Recursion/DynamicProgramming.html)" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 2 - String Permutation-checkpoint.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 2 - String Permutation-checkpoint.ipynb deleted file mode 100644 index e2585c12..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 2 - String Permutation-checkpoint.ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# String Permutation\n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string, write a function that uses recursion to output a list of all the possible permutations of that string.\n", - "\n", - "For example, given s='abc' the function should return ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']\n", - "\n", - "*Note: If a character is repeated, treat each occurence as distinct, for example an input of 'xxx' would return a list with 6 \"versions\" of 'xxx'*\n", - "\n", - "\n", - "## Fill Out Your Solution Below\n", - "\n", - "Let's think about what the steps we need to take here are:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def permute(s):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['abc', 'acb', 'bac', 'bca', 'cab', 'cba']" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "permute('abc')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All test cases passed.\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION.\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPerm(object):\n", - " \n", - " def test(self,solution):\n", - " \n", - " assert_equal(sorted(solution('abc')),sorted(['abc', 'acb', 'bac', 'bca', 'cab', 'cba']))\n", - " assert_equal(sorted(solution('dog')),sorted(['dog', 'dgo', 'odg', 'ogd', 'gdo', 'god']) )\n", - " \n", - " print 'All test cases passed.'\n", - " \n", - "\n", - "\n", - "# Run Tests\n", - "t = TestPerm()\n", - "t.test(permute)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Luck!" - ] - } - ], - "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/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 4 - Coin Change-checkpoint.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 4 - Coin Change-checkpoint.ipynb deleted file mode 100644 index f8785dfb..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems/.ipynb_checkpoints/Recursion Problem 4 - Coin Change-checkpoint.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Coin Change Problem\n", - "\n", - "##### Note: This problem has multiple solutions and is a classic problem in showing issues with basic recursion. If you are having trouble with this problem (or it seems to be taking a long time to run in some cases) check out the Solution Notebook and fully read the conclusion link for a detailed description of the various ways to solve this problem!\n", - "\n", - "\n", - "This problem is common enough that is actually has its own [Wikipedia Entry](https://en.wikipedia.org/wiki/Change-making_problem)! \n", - "\n", - "____\n", - "## Problem Statement\n", - "Given a target amount **n** and a list (array) of distinct coin values, what's the fewest coins needed to make the change amount. \n", - "\n", - "For example:\n", - "\n", - "If n = 10 and coins = [1,5,10]. Then there are 4 possible ways to make change:\n", - "\n", - "* 1+1+1+1+1+1+1+1+1+1\n", - "\n", - "* 5 + 1+1+1+1+1\n", - "\n", - "* 5+5\n", - "\n", - "* 10\n", - "\n", - "With 1 coin being the minimum amount.\n", - "\n", - " \n", - "## Solution\n", - "\n", - "Implement your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rec_coin(target,coins):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rec_coin(10,[1,5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Run the cell below to test your function against some test cases. \n", - "\n", - "**Note that the TestCoins class only test functions with two parameter inputs, the list of coins and the target**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR FUNCTION.\n", - "NOTE: NON-DYNAMIC FUNCTIONS WILL TAKE A LONG TIME TO TEST. IF YOU BELIEVE YOU HAVE A SOLUTION \n", - " GO CHECK THE SOLUTION NOTEBOOK INSTEAD OF RUNNING THIS!\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCoins(object):\n", - " \n", - " def check(self,solution):\n", - " coins = [1,5,10,25]\n", - " assert_equal(solution(45,coins),3)\n", - " assert_equal(solution(23,coins),5)\n", - " assert_equal(solution(74,coins),8)\n", - " print 'Passed all tests.'\n", - "# Run Test\n", - "\n", - "test = TestCoins()\n", - "test.check(rec_coin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## EXTRA\n", - "\n", - "Good luck and remember to read the solution notebook for this once you've think you have a solution!" - ] - } - ], - "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/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 1 - Reverse String .ipynb b/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 1 - Reverse String .ipynb deleted file mode 100644 index 4d4308f6..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 1 - Reverse String .ipynb +++ /dev/null @@ -1,133 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reverse a String\n", - "\n", - "This interview question requires you to reverse a string using recursion. Make sure to think of the base case here.\n", - "\n", - "Again, make sure you use *recursion* to accomplish this. **Do not slice (e.g. string[::-1]) or use iteration, there must be a recursive call for the function.**\n", - "\n", - "____\n", - "\n", - "### Fill out your solution below" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def reverse(s):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'dlrow olleh'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse('hello world')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Test Your Solution\n", - "\n", - "Run the cell below to test your solution against the following cases:\n", - "\n", - " string = 'hello'\n", - " string = 'hello world'\n", - " string = '123456789'" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PASSED ALL TEST CASES!\n" - ] - } - ], - "source": [ - "'''\n", - "RUN THIS CELL TO TEST YOUR FUNCTION AGAINST SOME TEST CASES\n", - "'''\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestReverse(object):\n", - " \n", - " def test_rev(self,solution):\n", - " assert_equal(solution('hello'),'olleh')\n", - " assert_equal(solution('hello world'),'dlrow olleh')\n", - " assert_equal(solution('123456789'),'987654321')\n", - " \n", - " print 'PASSED ALL TEST CASES!'\n", - " \n", - "# Run Tests\n", - "test = TestReverse()\n", - "test.test_rev(reverse)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Good Luck!**" - ] - } - ], - "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/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 3 - Fibonacci Sequence.ipynb b/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 3 - Fibonacci Sequence.ipynb deleted file mode 100644 index e85c24d0..00000000 --- a/Recursion/Recursion Interview Problems/Recursion Problems/Recursion Problem 3 - Fibonacci Sequence.ipynb +++ /dev/null @@ -1,248 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Fibonnaci Sequence\n", - "\n", - "In this interview excercise we will begin to get a feel of having to solve a single problem multiple ways!\n", - "\n", - "## Problem Statement\n", - "\n", - "Implement a [Fibonnaci Sequence](https://en.wikipedia.org/wiki/Fibonacci_number) in three different ways:\n", - "\n", - "* Recursively\n", - "* Dynamically (Using Memoization to store results)\n", - "* Iteratively\n", - "___\n", - "#### Function Output\n", - "Your function will accept a number **n** and return the **nth** number of the fibonacci sequence\n", - "___\n", - "Remember that a fibonacci sequence: 0,1,1,2,3,5,8,13,21,... starts off with a base case checking to see if n = 0 or 1, then it returns 1. \n", - "\n", - "Else it returns fib(n-1)+fib(n+2).\n", - "\n", - "____\n", - "\n", - "## Fill Out Your Solutions Below" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Recursively\n", - "\n", - "Solve the problem using simple recursion." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def fib_rec(n):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fib_rec(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dynamically\n", - "\n", - "Implement the function using dynamic programming by using a cache to store results (memoization)." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate Cache information\n", - "n = 10\n", - "cache = [None] * (n + 1)\n", - "\n", - "\n", - "def fib_dyn(n):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fib_dyn(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Iteratively\n", - "\n", - "Implement the solution with simple iteration." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def fib_iter(n):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "28657" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fib_iter(23)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Run the cell below to test your solutions, simply uncomment the solution functions you wish to test!" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Passed all tests.\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "UNCOMMENT THE CODE AT THE BOTTOM OF THIS CELL TO SELECT WHICH SOLUTIONS TO TEST.\n", - "THEN RUN THE CELL.\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFib(object):\n", - " \n", - " def test(self,solution):\n", - " assert_equal(solution(10),55)\n", - " assert_equal(solution(1),1)\n", - " assert_equal(solution(23),28657)\n", - " print 'Passed all tests.'\n", - "# UNCOMMENT FOR CORRESPONDING FUNCTION\n", - "t = TestFib()\n", - "\n", - "t.test(fib_rec)\n", - "#t.test(fib_dyn) # Note, will need to reset cache size for each test!\n", - "#t.test(fib_iter)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "Hopefully this interview question served as a good excercise in exploring recursion, dynamic programming, and iterative solutions for a single problem! Its good to work through all three because in an interview a common question may just begin with requesting a recursive solution and then checking to se if you can implement the other forms!" - ] - } - ], - "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/Reflect Notes.ipynb b/Reflect Notes.ipynb new file mode 100644 index 00000000..9f226948 --- /dev/null +++ b/Reflect Notes.ipynb @@ -0,0 +1,47 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Array\n", + "- Python use reference when slide or extend an array. (Because python uses immutable value for integers and strings)\n", + "## Dynamic Array Implementation\n", + "- The array has an initial size and will expand twice when extending.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\" \".join()\n", + "reversed()\n", + "s.split()\n", + "len(set(s))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Coins and a Scale - SOLUTION-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Coins and a Scale - SOLUTION-checkpoint.ipynb deleted file mode 100644 index dd6ce0ad..00000000 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Coins and a Scale - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,39 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Coins and a Scale - SOLUTION\n", - "## Problem Statement\n", - "\n", - "You have eight coins and a two-pan scale. All the coins weigh the same, **except for one** which is heavier than all the others. The coins are otherwise indistinguishable. You may make no assumptions about how much heavier the heavy coin is. What is the minimum number of weighings needed to be certain of identifying the heavy coin?\n", - "\n", - "## Solution\n", - "\n", - "Begin by dividing the coins into two groups of three, which you put on the scale, and one group of two, which you leave off. If the two sides weigh the same, the heavy coin is in the group of two, and you can find it with one more weighing, for a total of two weighings. On the other hand, if either side of the scale is heavier, the heavy coin must be in that group of three. You can eliminate all the other coins, and place one coin from this group on either side of the scale, leaving the third coin aside. If one side is heavier, it contains the heavy coin; if neither side is heavier, the heavy coin is the one you didn’t place on the scale. This is also a total of two weighings, so you can always find the heavy coin in a group of eight using two weighings." - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Hallway Lockers -SOLUTION-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Hallway Lockers -SOLUTION-checkpoint.ipynb deleted file mode 100644 index 3e7b54f7..00000000 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Hallway Lockers -SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Hallway Lockers - SOLUTION\n", - "## Problem Statement\n", - "\n", - "You are in a hallway lined with 100 lockers. You start with one pass and open the lockers, so that the *opened* lockers are now with their doors opened out. You begin by closing **every second** locker. Then you go to close **every third** locker and **close it if it is open or open it if it’s closed** — we will refer to this as \"toggling\" the lockers. You continue toggling every nth locker on pass number n. After your hundredth pass of the hallway, in which you toggle only locker number 100, how many lockers are open?\n", - "\n", - "## Solution\n", - "\n", - "Obviously you can't just brute force and count out this problem, there are just too many passes, so we will need to think about this algorithmically.\n", - "\n", - "Let's begin solving this problem by choosing an arbitrary locker and see if we can detect a pattern. Let's choose locker 12, it has been toggled open on your first pass.\n", - "\n", - "To start off we know we won't have to toggle it on any pass greater than 12. So now we only have to think of the passes that occur on 2-11. We can actualy count these out:\n", - "\n", - "* On pass 2: 2,4,6,8,10,12\n", - "* On pass 3: 3,6,9,12\n", - "* On pass 4: 4,8,12\n", - "* On pass 5: 5,10 **No toggle on this pass**\n", - "* On pass 6: 6,12\n", - "* On pass 7: 7,14 **No toggle on this pass**\n", - "* ect...\n", - "\n", - "You'll notice the pattern that emerges, we only toggle the locker when the pass number is a factor of the locker number. We can begin to make the generalization that all lockers started open after the first pass and alternate between being open and closed. So lockers are closed after the second, fourth, sixth, and so on, times they are toggled — in other words, if a locker is toggled an even number of times, then it ends closed; otherwise, it ends open. You know that a locker is toggled once for every factor of the locker number, so you can say that a locker ends open only if it has an odd number of factors.\n", - "\n", - "**The task has now been reduced to finding how many numbers between 1 and 100 have an odd number of factors!**\n", - "____\n", - "\n", - "We can think about this in the following manner:\n", - "\n", - "If a number **i** is a factor of **n**, what does that mean? It means that **i** times some other number **j** is equal to n. Because multiplication is commutative (i × j = j × i), that means that j is a factor of n, too, so the number of factors is usually even because factors tend to come in pairs. If you can find the numbers that have unpaired factors, you will know which lockers will be open. Multiplication is a binary operation, so two numbers will always be involved, but what if they are both the same number (that is, i = j)? In that case, a single number would effectively form both halves of the pair, and there would be an odd number of factors. When this is the case, i × i = n. Therefore, n must be a perfect square. Try a perfect square to check this solution. For example,\n", - "for 16, the factors are 1, 2, 4, 8, 16; operations are open, close, open, close, open — as expected, it ends open.\n", - "\n", - "Based on this reasoning, you can conclude that only lockers with numbers that are perfect squares end up open. The perfect squares between 1 and 100 (inclusive) are 1, 4, 9, 16, 25, 36, 49, 64, 81, and 100. So 10 lockers would remain open." - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Jugs of Water - SOLUTION-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Jugs of Water - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 6bad4853..00000000 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Jugs of Water - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Jugs of Water - SOLUTION\n", - "## Problem Statement\n", - "\n", - "You have a five gallons jug and a three gallons jug, and an unlimited supply of water (but no measuring cups) How would you come up with exactly four gallons of water?\n", - "\n", - "## Solution\n", - "\n", - "This problem has a cameo in the movie Die Hard 3. The solution is below:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image(url='http://mindyourdecisions.com/blog/wp-content/uploads/2013/02/water-jug-riddle-1.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hopefully your interviews are not as stressful as this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import YouTubeVideo\n", - "YouTubeVideo('BVtQNK_ZUJg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Yippee Ki Yay" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Light Switches - SOLUTION-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Light Switches - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f06d5f7d..00000000 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/.ipynb_checkpoints/Light Switches - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Light Switches - SOLUTION\n", - "## Problem Statement\n", - "\n", - "You are in a hallway next to three light switches, all of which are off. Each switch activates a different *incandescent* light bulb in the room at the end of the hall. You cannot see the lights from where the switches are. Your task is to determine which light corresponds to each switch. However, you may go into the room with the lights only once.\n", - "\n", - "**Note: This is a \"trick\" question, so don't spend too much time on it. Although it is more on the \"fun\" side of brain teaser type questions.**\n", - "\n", - "## Solution\n", - "\n", - "This is a bit of a trick question and hopefully you don't get asked this type of question in an interview, since its not really math or logic based. The solution is to realize that you can leave an *incandescent* light bulb on for awhile until it heats up. \n", - "\n", - "So the solution is to turn on switch 1 and wait for 15 minutes until that corrresponding bulb is hot. Then turn it off and turn on switch 2 then head to the room. Then you know that:\n", - "\n", - "* The bulb which is hot corresponds to switch 1\n", - "* The bulb which is on corresponds to switch 2\n", - "* The bulb which is off corresponds to switch 3" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Egg Drop - SOLUTION.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Egg Drop - SOLUTION.ipynb deleted file mode 100644 index 3a39349e..00000000 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Egg Drop - SOLUTION.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Egg Drop - SOLUTION\n", - "This is probably the most common brain teaser riddle out of the group, so really try to think algorithmically about this problem before looking at the solution!\n", - "\n", - "## Problem Statement\n", - "\n", - "A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.\n", - "\n", - "Show algorithmically how you would go about doing this in as few drops as possible. (Your answer should be a number of the fewest drops needed for testing 2 eggs on 100 floors)\n", - "## Solution\n", - "\n", - "Start from the 10th floor and go up to floors in multiples of 10.\n", - "\n", - "If first egg breaks, say at 20th floor then you can check all the floors between 11th and 19th with the second egg to see which floor it will not break.\n", - "\n", - "In this case, the worst-case number of drops is 19. If the threshold was 99th floor, then you would have to drop the first egg 10 times and the second egg 9 times in linear fashion.\n", - "\n", - "**Best solution:**\n", - "We need to minimize this worst-case number of drops. For that, we need to generalize the problem to have n floors. What would be the step value, for the first egg? Would it still be 10? Suppose we have 200 floors. Would the step value be still 10? \n", - "\n", - "The point to note here is that we are trying to minimize the worst-case number of drops which happens if the threshold is at the highest floors. So, our steps should be of some value which reduces the number of drops of the first egg.\n", - "\n", - "Let's assume we take some step value m initially. If every subsequent step is m-1,\n", - "then, \n", - "$$m+m−1+m−2+.....+1=n$$\n", - "\n", - "This is \n", - "\n", - "$$\\frac{m∗(m+1)}{2}=n$$\n", - "\n", - "If n =100, then m would be 13.65 which since we can't drop from a decimal of a floor, we actually use 14.\n", - "\n", - "So, the worst case scenario is now when the threshold is in the first 14 floors with number of drops being 14.\n", - "\n", - "Note that this is simply a binary search!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "You can find plenty of other explanations by simply googling \"2 eggs 100 floors\"" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Jugs of Water - SOLUTION.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Jugs of Water - SOLUTION.ipynb deleted file mode 100644 index 6bad4853..00000000 --- a/Riddles/Riddle Interview Problems/Riddle Interview Problems - SOLUTIONS/Jugs of Water - SOLUTION.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Jugs of Water - SOLUTION\n", - "## Problem Statement\n", - "\n", - "You have a five gallons jug and a three gallons jug, and an unlimited supply of water (but no measuring cups) How would you come up with exactly four gallons of water?\n", - "\n", - "## Solution\n", - "\n", - "This problem has a cameo in the movie Die Hard 3. The solution is below:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image(url='http://mindyourdecisions.com/blog/wp-content/uploads/2013/02/water-jug-riddle-1.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hopefully your interviews are not as stressful as this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import YouTubeVideo\n", - "YouTubeVideo('BVtQNK_ZUJg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Yippee Ki Yay" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Bridge Crossing-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Bridge Crossing-checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Bridge Crossing-checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Bridge Crossing-checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Coins and a Scale -checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Coins and a Scale -checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Coins and a Scale -checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Coins and a Scale -checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Egg Drop -checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Egg Drop -checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Egg Drop -checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Egg Drop -checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Hallway Lockers-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Hallway Lockers-checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Hallway Lockers-checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Hallway Lockers-checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Jugs of Water -checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Jugs of Water -checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Jugs of Water -checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Jugs of Water -checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Light Switches -checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Light Switches -checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Light Switches -checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Light Switches -checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Ropes Burning-checkpoint.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Ropes Burning-checkpoint.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /.ipynb_checkpoints/Ropes Burning-checkpoint.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/.ipynb_checkpoints/Ropes Burning-checkpoint.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Bridge Crossing.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Bridge Crossing.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Bridge Crossing.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Bridge Crossing.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Coins and a Scale .ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Coins and a Scale .ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Coins and a Scale .ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Coins and a Scale .ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Egg Drop .ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Egg Drop .ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Egg Drop .ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Egg Drop .ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Hallway Lockers.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Hallway Lockers.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Hallway Lockers.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Hallway Lockers.ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Jugs of Water .ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Jugs of Water .ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Jugs of Water .ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Jugs of Water .ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Light Switches .ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Light Switches .ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Light Switches .ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Light Switches .ipynb diff --git a/Riddles/Riddle Interview Problems/Riddle Interview Problems /Ropes Burning.ipynb b/Riddles/Riddle Interview Problems/Riddle Interview Problems/Ropes Burning.ipynb similarity index 100% rename from Riddles/Riddle Interview Problems/Riddle Interview Problems /Ropes Burning.ipynb rename to Riddles/Riddle Interview Problems/Riddle Interview Problems/Ropes Burning.ipynb diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb deleted file mode 100644 index 413f2635..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deques Overview\n", - "\n", - "A deque, also known as a double-ended queue, is an ordered collection of items similar to the queue. It has two ends, a front and a rear, and the items remain positioned in the collection. What makes a deque different is the unrestrictive nature of adding and removing items. New items can be added at either the front or the rear. Likewise, existing items can be removed from either end. In a sense, this hybrid linear structure provides all the capabilities of stacks and queues in a single data structure. \n", - "\n", - "It is important to note that even though the deque can assume many of the characteristics of stacks and queues, it does not require the LIFO and FIFO orderings that are enforced by those data structures. It is up to you to make consistent use of the addition and removal operations.\n", - "\n", - "Let's see an Image to visualize the Deque Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image('http://www.codeproject.com/KB/recipes/669131/deque.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we can both add and remove from the front and the back of the Deque. In the next lecture, we will implement our own Deque class!" - ] - } - ], - "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/Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb deleted file mode 100644 index be7a713a..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Queues Overview\n", - "\n", - "In this lecture we will get an overview of what a Queue is, in the next lecture we will implement our own Queue class." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "A **queue** is an ordered collection of items where the addition of new items happens at one end, called the “rear,” and the removal of existing items occurs at the other end, commonly called the “front.” As an element enters the queue it starts at the rear and makes its way toward the front, waiting until that time when it is the next element to be removed.\n", - "\n", - "The most recently added item in the queue must wait at the end of the collection. The item that has been in the collection the longest is at the front. This ordering principle is sometimes called **FIFO, first-in first-out**. It is also known as “first-come first-served.”\n", - "\n", - "The simplest example of a queue is the typical line that we all participate in from time to time. We wait in a line for a movie, we wait in the check-out line at a grocery store, and we wait in the cafeteria line. The first person in that line is also the first person to get serviced/helped. \n", - "\n", - "Let's see a diagram which shows this and compares it to the Stack Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url = 'https://netmatze.files.wordpress.com/2014/08/queue.png'\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we have two terms here, **Enqueue** and **Dequeue**. The enqueue term describes when we add a new item to the rear of the queue. The dequeue term describes removing the front item from the queue.\n", - "\n", - "Let's take a look at how pop and push methods would work with a Queue (versus that of a Stack):" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP\nERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e\nHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCADwApUDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7Looo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigArwfw9ow1waxqOo694tadvEGrwgQ+J9QgjRI9QuI40WOOdUVVRFUAADAr3iv\nGvh//wAgvVv+xk1v/wBOl1WlJJvU5cXJxgmn1D/hD7D/AKDfjP8A8K/VP/kij/hD7D/oN+M//Cv1\nT/5IroqK35Y9jzva1P5mcb4g8NNZaTNcaTL411W9GBDbDxtqMIYk4yztcYVR1JAJwDhWOAcH4Q6L\nea34HhvvEfiDxVLqgvbyC4Nv4t1RYgY7mWMBP34O0BQATyQMnnNeoVzHwx0q/wBG8LPZalB5FwdS\n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\nDNgcgEYUnj23wzrNj4i8O6br2mOz2Wo2sd1bsy4Yo6hlyOxwarlet+m5HMna3Xb+v63NCiiikMKK\nKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigAooooAKKKKACiiigAooooA82/aQ8Eat46+Gctj4dkjTXtOu4dT0vzGCq08LZ\nC5PAyCwBOBkjJAzXmfir9qjTNK8LQ+bp6aD4zs5Yzqvh3xBaXkMjRiPc6wSRROoZyVEbSYGDuYAY\nz9K0UtVdJ6PX5/0tR3Ts300/r9D5R+C2tJ8WfF3xR8T39xZ6T4l1bRm0XTvDss/+lW1uIuXYMqlg\nXKHIGAc5xkVyEfxO0WL9kG/+FS6frD+M9OsZ7XUdN+wyKbJEnLPPK5GxUUYGM7txC45zX2l/Zmm/\n2v8A2x/Z9p/aXkfZvtnkr53k7t3l78btm7nbnGeat0TSlBwWiat919fnd39Rxk1JSe6d/wAtPwVj\n5I+MvhK1vvAHwc8a6/4YvvE3hLRNDji16ysnkE0cElrGRONjKdqFSzHI6DJwcir4U0r9m/W/iB4d\n0/4SfDq98V34vY5ry+S+1K2t9JiQ7vPkaY4Y5HypjDEYyCQD9g0Valabku7f367+vo/Pa2co3jby\nt/S9D5d8JeO9F+D/AMcfihpPjODVYbrxDqMWpaHHbWEk7akHD7YoggOXLMEGcLuBBIIrlfAXhPXP\nHX7IHxB0bTLCRdYbxVdXS2LN87PG0DtDx1bAYD1OK+zKKzcbxs97Jfc00/wV+/331U7SbWzd/vvf\n82fDv/GKj+H1gsvhjrt545I8j/hExNqi3f2oEq0RbcUGCCSRkgfw7vlr7G+H+lxaL4H0XSoNHXRU\ntrKJBpy3TXItTtGYvNbl9pyNx64zW5RWnNo/P7v69b/55KNmvL7woooqSgooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigDifjh49Pw0+HF94vXSP7XNrJDGLX7T5G/zJFT7+1sY3Z6Vxy/EX46so\nYfs65BGR/wAVrZf/ABFRftu7v+GdNc2Y3fabPGemftEdSQ/8NS+Sm3/hTW3aMZ/tLNTB35r9Hb8E\n/wBRz05bdV+p6r4VvdW1Hw9ZXuu6L/YmpzRBrnT/ALUtx9nb+75ifK/1FadfNn7TOla3rnif4KaP\nqt+NP1a81KWG/udIdkEbNFEJjAz/ADKMb9pPI4PWubl+EfhjTP2m1+F+jT6tpngjV/Dq6rqmjW+o\nziO8eOR4wjuXL7SQCfmz1HArS15eraXbRc33W9SW1GKu+if3u35+h9b0V8//ALLVlH4Y+JHxW8A6\nTLcL4d0XUraTTbSWVpBbecjs6qzc44XqSeMkkkk+dfs9fBHw38SPhXq+q+J7zUpbwapew6M8V1Ii\naUQ+TLGikKzs/LFs5CoOMVF1bmW3LzfLT/MpqzcXupcv5/5H0n8ZfHtv8NvAdz4puNOl1ERTRQR2\n8cgj3vI4QZYg4HOScH6V2VfFPxHmT4h/sZeHfFvixH1HxDo+ojT4715XDMDciJ2IDYdmREyzAnOT\nwTmvTvjP4W0P4USfDPxp4ZsPsGkeFNVOn3UYkeTy7G8LLIxZyWIVmJGSeXqktbP+a33pW/Nfe+2p\nLa6WqTfzTaf5f1fT6IorxLwuP+E1/au8Ra8wEmm+CNLj0mzPO03dx+8mdfcJlD9RXttJaxUu/wDn\np96s/mJ/E12/y1+56fIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPO/2i/A+sfEX\n4T6l4U0K4sLe/uZYJI5L13WIeXKrnJRWPRT2rnEX9qZEVR/wpnAGB/yEq9nopJWv56/p+g2728jy\nDXvAnxA8Va18MvEHiS58MRan4a1K4utWTT3nEEiONqCAOpYnaBncV5zita88BaxN+0jZfElbmwGk\nQeHG0poS7/aDKZmfcF27duGHO7Oe1ek0VV9vJt/euV/gS4338vwd/wAzzX4Z+AdY8M/Ff4ieLL+5\nsJLHxNcWstlHA7mWMRIyt5gKgA5YYwW/CvBf2ePDvxivfhbq0Pw/8S+GrTR9Y1W9iuhqsMxubBw+\nxpLYxgqxZcHD8AqMdSa+xKw/BPhLw/4L0VtG8M6f9gsWnkuDF50kn7xzlmy7E8ntnFKMY25Xty2/\nFb/JFyk23JbuV/wf+Z5n4y+CBm/Zug+FPhXU4Ybmy8mW3ur1SEmmWbzXZ9oJUMxboDjI64rX+I2n\napqn7OHiSy+KE+hw6gdJuXvZtL8z7JGybniZPM+ckbYzg9WzjtXqNcn8Qfhx4K8fyaY/jDQotWOl\nytLaCSWRVRm25yqsA4O1cq2QcdKmonUUk/tb/ldfhp5BTag4v+X/AIe339fM479kTwxd+HPglpdz\nqplfVtdd9XvnlOXZ5sbCc858sR5z3zXrtIoCqFUAADAA7Uta1Jc8mzKnHlikFFFFQWf/2Q==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "url2 = 'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\n", - "Image(url2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "You should now have a basic understanding of Queues and the FIFO principal for them. In the next lecture we will implement our own Queue class!" - ] - } - ], - "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/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb deleted file mode 100644 index 8089314d..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stacks Overview\n", - "\n", - "**Please see the lecture video for the full Overview on Stacks!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "\n", - "A stack is an ordered collection of items where the addition of new items and the removal of existing items always takes place at the same end. This end is commonly referred to as the “top.” The end opposite the top is known as the “base.” \n", - "\n", - "The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest. The most recently added item is the one that is in position to be removed first. \n", - "\n", - "**This ordering principle is sometimes called LIFO, last-in first-out.** It provides an ordering based on length of time in the collection. Newer items are near the top, while older items are near the base.\n", - "\n", - "For example, consider the figure below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url ='https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png'\n", - "\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the first items \"pushed\" to the stack begin at the base, and as items are \"popped\" out. Stacks are fundamentally important, as they can be used to reverse the order of items. The order of insertion is the reverse of the order of removal.\n", - "\n", - "Considering this reversal property, you can perhaps think of examples of stacks that occur as you use your computer. For example, every web browser has a Back button. As you navigate from web page to web page, those pages are placed on a stack (actually it is the URLs that are going on the stack). The current page that you are viewing is on the top and the first page you looked at is at the base. If you click on the Back button, you begin to move in reverse order through the pages.\n", - "\n", - "In the next lecture we will implement our own Stack class!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extra Resources:\n", - "[Wikipedia Page on Stacks](http://bit.ly/1OJybGQ)" - ] - } - ], - "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/Stacks, Queues and Deques/Deques Overview.ipynb b/Stacks, Queues and Deques/Deques Overview.ipynb deleted file mode 100644 index 413f2635..00000000 --- a/Stacks, Queues and Deques/Deques Overview.ipynb +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deques Overview\n", - "\n", - "A deque, also known as a double-ended queue, is an ordered collection of items similar to the queue. It has two ends, a front and a rear, and the items remain positioned in the collection. What makes a deque different is the unrestrictive nature of adding and removing items. New items can be added at either the front or the rear. Likewise, existing items can be removed from either end. In a sense, this hybrid linear structure provides all the capabilities of stacks and queues in a single data structure. \n", - "\n", - "It is important to note that even though the deque can assume many of the characteristics of stacks and queues, it does not require the LIFO and FIFO orderings that are enforced by those data structures. It is up to you to make consistent use of the addition and removal operations.\n", - "\n", - "Let's see an Image to visualize the Deque Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image('http://www.codeproject.com/KB/recipes/669131/deque.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we can both add and remove from the front and the back of the Deque. In the next lecture, we will implement our own Deque class!" - ] - } - ], - "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/Stacks, Queues and Deques/Queues Overview.ipynb b/Stacks, Queues and Deques/Queues Overview.ipynb deleted file mode 100644 index be7a713a..00000000 --- a/Stacks, Queues and Deques/Queues Overview.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Queues Overview\n", - "\n", - "In this lecture we will get an overview of what a Queue is, in the next lecture we will implement our own Queue class." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "A **queue** is an ordered collection of items where the addition of new items happens at one end, called the “rear,” and the removal of existing items occurs at the other end, commonly called the “front.” As an element enters the queue it starts at the rear and makes its way toward the front, waiting until that time when it is the next element to be removed.\n", - "\n", - "The most recently added item in the queue must wait at the end of the collection. The item that has been in the collection the longest is at the front. This ordering principle is sometimes called **FIFO, first-in first-out**. It is also known as “first-come first-served.”\n", - "\n", - "The simplest example of a queue is the typical line that we all participate in from time to time. We wait in a line for a movie, we wait in the check-out line at a grocery store, and we wait in the cafeteria line. The first person in that line is also the first person to get serviced/helped. \n", - "\n", - "Let's see a diagram which shows this and compares it to the Stack Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url = 'https://netmatze.files.wordpress.com/2014/08/queue.png'\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we have two terms here, **Enqueue** and **Dequeue**. The enqueue term describes when we add a new item to the rear of the queue. The dequeue term describes removing the front item from the queue.\n", - "\n", - "Let's take a look at how pop and push methods would work with a Queue (versus that of a Stack):" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP\nERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e\nHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCADwApUDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7Looo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigArwfw9ow1waxqOo694tadvEGrwgQ+J9QgjRI9QuI40WOOdUVVRFUAADAr3iv\nGvh//wAgvVv+xk1v/wBOl1WlJJvU5cXJxgmn1D/hD7D/AKDfjP8A8K/VP/kij/hD7D/oN+M//Cv1\nT/5IroqK35Y9jzva1P5mcb4g8NNZaTNcaTL411W9GBDbDxtqMIYk4yztcYVR1JAJwDhWOAcH4Q6L\nea34HhvvEfiDxVLqgvbyC4Nv4t1RYgY7mWMBP34O0BQATyQMnnNeoVzHwx0q/wBG8LPZalB5FwdS\n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\nDNgcgEYUnj23wzrNj4i8O6br2mOz2Wo2sd1bsy4Yo6hlyOxwarlet+m5HMna3Xb+v63NCiiikMKK\nKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigAooooAKKKKACiiigAooooA82/aQ8Eat46+Gctj4dkjTXtOu4dT0vzGCq08LZ\nC5PAyCwBOBkjJAzXmfir9qjTNK8LQ+bp6aD4zs5Yzqvh3xBaXkMjRiPc6wSRROoZyVEbSYGDuYAY\nz9K0UtVdJ6PX5/0tR3Ts300/r9D5R+C2tJ8WfF3xR8T39xZ6T4l1bRm0XTvDss/+lW1uIuXYMqlg\nXKHIGAc5xkVyEfxO0WL9kG/+FS6frD+M9OsZ7XUdN+wyKbJEnLPPK5GxUUYGM7txC45zX2l/Zmm/\n2v8A2x/Z9p/aXkfZvtnkr53k7t3l78btm7nbnGeat0TSlBwWiat919fnd39Rxk1JSe6d/wAtPwVj\n5I+MvhK1vvAHwc8a6/4YvvE3hLRNDji16ysnkE0cElrGRONjKdqFSzHI6DJwcir4U0r9m/W/iB4d\n0/4SfDq98V34vY5ry+S+1K2t9JiQ7vPkaY4Y5HypjDEYyCQD9g0Valabku7f367+vo/Pa2co3jby\nt/S9D5d8JeO9F+D/AMcfihpPjODVYbrxDqMWpaHHbWEk7akHD7YoggOXLMEGcLuBBIIrlfAXhPXP\nHX7IHxB0bTLCRdYbxVdXS2LN87PG0DtDx1bAYD1OK+zKKzcbxs97Jfc00/wV+/331U7SbWzd/vvf\n82fDv/GKj+H1gsvhjrt545I8j/hExNqi3f2oEq0RbcUGCCSRkgfw7vlr7G+H+lxaL4H0XSoNHXRU\ntrKJBpy3TXItTtGYvNbl9pyNx64zW5RWnNo/P7v69b/55KNmvL7woooqSgooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigDifjh49Pw0+HF94vXSP7XNrJDGLX7T5G/zJFT7+1sY3Z6Vxy/EX46so\nYfs65BGR/wAVrZf/ABFRftu7v+GdNc2Y3fabPGemftEdSQ/8NS+Sm3/hTW3aMZ/tLNTB35r9Hb8E\n/wBRz05bdV+p6r4VvdW1Hw9ZXuu6L/YmpzRBrnT/ALUtx9nb+75ifK/1FadfNn7TOla3rnif4KaP\nqt+NP1a81KWG/udIdkEbNFEJjAz/ADKMb9pPI4PWubl+EfhjTP2m1+F+jT6tpngjV/Dq6rqmjW+o\nziO8eOR4wjuXL7SQCfmz1HArS15eraXbRc33W9SW1GKu+if3u35+h9b0V8//ALLVlH4Y+JHxW8A6\nTLcL4d0XUraTTbSWVpBbecjs6qzc44XqSeMkkkk+dfs9fBHw38SPhXq+q+J7zUpbwapew6M8V1Ii\naUQ+TLGikKzs/LFs5CoOMVF1bmW3LzfLT/MpqzcXupcv5/5H0n8ZfHtv8NvAdz4puNOl1ERTRQR2\n8cgj3vI4QZYg4HOScH6V2VfFPxHmT4h/sZeHfFvixH1HxDo+ojT4715XDMDciJ2IDYdmREyzAnOT\nwTmvTvjP4W0P4USfDPxp4ZsPsGkeFNVOn3UYkeTy7G8LLIxZyWIVmJGSeXqktbP+a33pW/Nfe+2p\nLa6WqTfzTaf5f1fT6IorxLwuP+E1/au8Ra8wEmm+CNLj0mzPO03dx+8mdfcJlD9RXttJaxUu/wDn\np96s/mJ/E12/y1+56fIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPO/2i/A+sfEX\n4T6l4U0K4sLe/uZYJI5L13WIeXKrnJRWPRT2rnEX9qZEVR/wpnAGB/yEq9nopJWv56/p+g2728jy\nDXvAnxA8Va18MvEHiS58MRan4a1K4utWTT3nEEiONqCAOpYnaBncV5zita88BaxN+0jZfElbmwGk\nQeHG0poS7/aDKZmfcF27duGHO7Oe1ek0VV9vJt/euV/gS4338vwd/wAzzX4Z+AdY8M/Ff4ieLL+5\nsJLHxNcWstlHA7mWMRIyt5gKgA5YYwW/CvBf2ePDvxivfhbq0Pw/8S+GrTR9Y1W9iuhqsMxubBw+\nxpLYxgqxZcHD8AqMdSa+xKw/BPhLw/4L0VtG8M6f9gsWnkuDF50kn7xzlmy7E8ntnFKMY25Xty2/\nFb/JFyk23JbuV/wf+Z5n4y+CBm/Zug+FPhXU4Ybmy8mW3ur1SEmmWbzXZ9oJUMxboDjI64rX+I2n\napqn7OHiSy+KE+hw6gdJuXvZtL8z7JGybniZPM+ckbYzg9WzjtXqNcn8Qfhx4K8fyaY/jDQotWOl\nytLaCSWRVRm25yqsA4O1cq2QcdKmonUUk/tb/ldfhp5BTag4v+X/AIe339fM479kTwxd+HPglpdz\nqplfVtdd9XvnlOXZ5sbCc858sR5z3zXrtIoCqFUAADAA7Uta1Jc8mzKnHlikFFFFQWf/2Q==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "url2 = 'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\n", - "Image(url2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "You should now have a basic understanding of Queues and the FIFO principal for them. In the next lecture we will implement our own Queue class!" - ] - } - ], - "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/Stacks, Queues and Deques/Stacks Overview.ipynb b/Stacks, Queues and Deques/Stacks Overview.ipynb deleted file mode 100644 index 8089314d..00000000 --- a/Stacks, Queues and Deques/Stacks Overview.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stacks Overview\n", - "\n", - "**Please see the lecture video for the full Overview on Stacks!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "\n", - "A stack is an ordered collection of items where the addition of new items and the removal of existing items always takes place at the same end. This end is commonly referred to as the “top.” The end opposite the top is known as the “base.” \n", - "\n", - "The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest. The most recently added item is the one that is in position to be removed first. \n", - "\n", - "**This ordering principle is sometimes called LIFO, last-in first-out.** It provides an ordering based on length of time in the collection. Newer items are near the top, while older items are near the base.\n", - "\n", - "For example, consider the figure below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url ='https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png'\n", - "\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the first items \"pushed\" to the stack begin at the base, and as items are \"popped\" out. Stacks are fundamentally important, as they can be used to reverse the order of items. The order of insertion is the reverse of the order of removal.\n", - "\n", - "Considering this reversal property, you can perhaps think of examples of stacks that occur as you use your computer. For example, every web browser has a Back button. As you navigate from web page to web page, those pages are placed on a stack (actually it is the URLs that are going on the stack). The current page that you are viewing is on the top and the first page you looked at is at the base. If you click on the Back button, you begin to move in reverse order through the pages.\n", - "\n", - "In the next lecture we will implement our own Stack class!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extra Resources:\n", - "[Wikipedia Page on Stacks](http://bit.ly/1OJybGQ)" - ] - } - ], - "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/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb deleted file mode 100644 index af87180e..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb +++ /dev/null @@ -1,65 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque - SOLUTION\n", - "\n", - "**Please refer to the Implementation of Deque lecture for a full explanation. The code from that lecture is below:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def addFront(self, item):\n", - " self.items.append(item)\n", - "\n", - " def addRear(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def removeFront(self):\n", - " return self.items.pop()\n", - "\n", - " def removeRear(self):\n", - " return self.items.pop(0)\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "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/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb deleted file mode 100644 index a400bb3d..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb +++ /dev/null @@ -1,59 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - SOLUTION\n", - "\n", - "**Please refer to the Implementation of Queue lecture for a full explanation. The code from that lecture is below:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def enqueue(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "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/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb deleted file mode 100644 index cb9fd690..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack -SOLUTION\n", - "\n", - "**Please refer to the lecture on implementation for a full explanation. Here is the code from that lecture:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Stack(object):\n", - " \n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def push(self, item):\n", - " self.items.append(item)\n", - "\n", - " def pop(self):\n", - " return self.items.pop()\n", - "\n", - " def peek(self):\n", - " return self.items[len(self.items)-1]\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "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/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Balanced Parentheses Check .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Balanced Parentheses Check .ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Balanced Parentheses Check .ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Balanced Parentheses Check .ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Deque .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Deque .ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Deque .ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Deque .ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue -Using Two Stacks .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Queue -Using Two Stacks .ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue -Using Two Stacks .ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Queue -Using Two Stacks .ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Queue.ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue.ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Queue.ipynb diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Stack .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Stack .ipynb similarity index 100% rename from Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Stack .ipynb rename to Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions/Implement a Stack .ipynb diff --git a/Trees/Trees Interview Problems - SOLUTIONS/Binary Search Tree Check - SOLUTION.ipynb b/Trees/Trees Interview Problems - SOLUTIONS/Binary Search Tree Check - SOLUTION.ipynb deleted file mode 100644 index 1ac09210..00000000 --- a/Trees/Trees Interview Problems - SOLUTIONS/Binary Search Tree Check - SOLUTION.ipynb +++ /dev/null @@ -1,155 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Binary Search Tree Check - SOLUTION\n", - "\n", - "## Problem Statement\n", - "\n", - "Given a binary tree, check whether it’s a binary search tree or not.\n", - "\n", - "** Again, no solution cell, just worry about your code making sense logically. Hint: Think about tree traversals. **\n", - "\n", - "## Solution\n", - "\n", - "Here is a simple solution- If a tree is a binary search tree, then traversing the tree inorder should lead to sorted order of the values in the tree. So, we can perform an inorder traversal and check whether the node values are sorted or not. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "tree_vals = []\n", - "\n", - "def inorder(tree):\n", - " if tree != None:\n", - " inorder(tree.getLeftChild())\n", - " tree_vals.append(tree.getRootVal())\n", - " inorder(tree.getRightChild())\n", - " \n", - "def sort_check(tree_vals):\n", - " return tree_vals == sorted(tree_vals)\n", - "\n", - "inorder(tree)\n", - "sort_check(tree_vals)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another classic solution is to keep track of the minimum and maximum values a node can take. And at each node we will check whether its value is between the min and max values it’s allowed to take. The root can take any value between negative infinity and positive infinity. At any node, its left child should be smaller than or equal than its own value, and similarly the right child should be larger than or equal to. So during recursion, we send the current value as the new max to our left child and send the min as it is without changing. And to the right child, we send the current value as the new min and send the max without changing." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "False\n" - ] - } - ], - "source": [ - "class Node:\n", - " def __init__(self, k, val):\n", - " self.key = k\n", - " self.value = val\n", - " self.left = None\n", - " self.right = None\n", - "\n", - "def tree_max(node):\n", - " if not node:\n", - " return float(\"-inf\")\n", - " maxleft = tree_max(node.left)\n", - " maxright = tree_max(node.right)\n", - " return max(node.key, maxleft, maxright)\n", - "\n", - "def tree_min(node):\n", - " if not node:\n", - " return float(\"inf\")\n", - " minleft = tree_min(node.left)\n", - " minright = tree_min(node.right)\n", - " return min(node.key, minleft, minright)\n", - "\n", - "def verify(node):\n", - " if not node:\n", - " return True\n", - " if (tree_max(node.left) <= node.key <= tree_min(node.right) and\n", - " verify(node.left) and verify(node.right)):\n", - " return True\n", - " else:\n", - " return False\n", - "\n", - "root= Node(10, \"Hello\")\n", - "root.left = Node(5, \"Five\")\n", - "root.right= Node(30, \"Thirty\")\n", - "\n", - "print(verify(root)) # prints True, since this tree is valid\n", - "\n", - "root = Node(10, \"Ten\")\n", - "root.right = Node(20, \"Twenty\")\n", - "root.left = Node(5, \"Five\")\n", - "root.left.right = Node(15, \"Fifteen\")\n", - "\n", - "print(verify(root)) # prints False, since 15 is to the left of 10" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is a classic interview problem, so feel free to just Google search \"Validate BST\" for more information on this problem!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Trees/Trees Interview Problems/bst1.png b/Trees/Trees Interview Problems/bst1.png deleted file mode 100644 index f4a93b03..00000000 Binary files a/Trees/Trees Interview Problems/bst1.png and /dev/null differ diff --git a/Trees/Trees Interview Problems/bst_trim.png b/Trees/Trees Interview Problems/bst_trim.png deleted file mode 100644 index 095025c9..00000000 Binary files a/Trees/Trees Interview Problems/bst_trim.png and /dev/null differ diff --git a/Trees/Trees Interview Problems/tree_print.png b/Trees/Trees Interview Problems/tree_print.png deleted file mode 100644 index dfbdb2b7..00000000 Binary files a/Trees/Trees Interview Problems/tree_print.png and /dev/null differ