[
  {
    "path": ".classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"Java/Introduction\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Big O\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 01. Arrays and Strings\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 02. Linked Lists\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 03. Stacks and Queues\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 04. Trees and Graphs\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 05. Bit Manipulation\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 06. Math and Logic Puzzles\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 07. Object-Oriented Design\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 08. Recursion and Dynamic Programming\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 09. Scalability and Memory Limits\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 10. Sorting and Searching\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 13. Java\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 16. Moderate\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 15. Threads and Locks\"/>\n\t<classpathentry kind=\"src\" path=\"Java/Ch 17. Hard\"/>\n\t<classpathentry kind=\"src\" path=\"Java/CtCILibrary\"/>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER\"/>\n\t<classpathentry kind=\"output\" path=\"bin\"/>\n</classpath>\n"
  },
  {
    "path": ".gitignore",
    "content": "bin/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"php\"]\n\tpath = php\n\turl = https://github.com/careercup/CtCI-6th-Edition-php.git\n[submodule \"cpp\"]\n\tpath = cpp\n\turl = https://github.com/careercup/CtCI-6th-Edition-cpp.git\n[submodule \"Clojure\"]\n\tpath = Clojure\n\turl = https://github.com/careercup/CtCI-6th-Edition-Clojure.git\n[submodule \"Groovy\"]\n\tpath = Groovy\n\turl = https://github.com/careercup/CtCI-6th-Edition-Groovy.git\n[submodule \"Python\"]\n\tpath = Python\n\turl = https://github.com/careercup/CtCI-6th-Edition-Python.git\n[submodule \"Swift\"]\n\tpath = Swift\n\turl = https://github.com/careercup/CtCI-6th-Edition-Swift.git\n[submodule \"Haskell\"]\n\tpath = Haskell\n\turl = https://github.com/careercup/CtCI-6th-Edition-Haskell.git\n[submodule \"JavaScript\"]\n\tpath = JavaScript\n\turl = https://github.com/careercup/CtCI-6th-Edition-JavaScript.git\n[submodule \"JavaScript-ES2015\"]\n\tpath = JavaScript-ES2015\n\turl = https://github.com/careercup/CtCI-6th-Edition-JavaScript-ES2015.git\n[submodule \"Go\"]\n\tpath = Go\n\turl = https://github.com/careercup/CtCI-6th-Edition-Go.git\n[submodule \"CtCI-6th-Edition-CSharp\"]\n\tpath = CSharp\n\turl = https://github.com/careercup/CtCI-6th-Edition-CSharp.git\n[submodule \"c\"]\n\tpath = c\n\turl = https://github.com/careercup/CtCI-6th-Edition-C.git\n[submodule \"Objective-C\"]\n\tpath = Objective-C\n\turl = https://github.com/careercup/CtCI-6th-Edition-Objective-C.git\n[submodule \"Julia\"]\n\tpath = Julia\n\turl = https://github.com/careercup/CtCI-6th-Edition-Julia.git\n[submodule \"Ruby\"]\n\tpath = Ruby\n\turl = https://github.com/careercup/CtCI-6th-Edition-Ruby.git\n[submodule \"Kotlin\"]\n\tpath = Kotlin\n\turl = https://github.com/careercup/CtCI-6th-Edition-Kotlin.git\n"
  },
  {
    "path": ".project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>CtCIv6</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "Java/Big O/Example_16/Example.java",
    "content": "package Example_16;\n\npublic class Example {\n\n\tpublic static int powersOf2(int n) {\n\t\tif (n < 1) {\n\t\t\treturn 0;\n\t\t} else if (n == 1) {\n\t\t\tSystem.out.println(1);\n\t\t\treturn 1;\n\t\t} else {\n\t\t\tint prev = powersOf2(n / 2);\n\t\t\tint curr = prev * 2;\n\t\t\tSystem.out.println(curr);\n\t\t\treturn curr;\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tpowersOf2(4);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Big O/QVI_11_Print_Sorted_Strings/Question.java",
    "content": "package QVI_11_Print_Sorted_Strings;\n\n\npublic class Question {\n\n\tpublic static int numChars = 26;\n\t\n\tpublic static void printSortedStrings(int remaining) {\n\t\tprintSortedStrings(remaining, \"\");\n\t}\n\t\n\tpublic static void printSortedStrings(int remaining, String prefix) {\n\t\tif (remaining == 0) {\n\t\t\tif (isInOrder(prefix)) {\n\t\t\t\tSystem.out.println(prefix);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (int i = 0; i < numChars; i++) {\n\t\t\t\tchar c = ithLetter(i);\n\t\t\t\tprintSortedStrings(remaining - 1, prefix + c);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static boolean isInOrder(String s) {\n\t\tboolean isInOrder = true;\n\t\tfor (int i = 1; i < s.length(); i++) {\n\t\t\tint prev = ithLetter(s.charAt(i - 1));\n\t\t\tint curr = ithLetter(s.charAt(i));\n\t\t\tif (prev > curr) {\n\t\t\t\tisInOrder = false;\n\t\t\t}\n\t\t}\n\t\treturn isInOrder;\n\t}\n\t\n\tpublic static char ithLetter(int i) {\n\t\treturn (char) (((int) 'a') + i);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tprintSortedStrings(5);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_01_Is_Unique/QuestionA.java",
    "content": "package Q1_01_Is_Unique;\r\n\r\npublic class QuestionA {\r\n\tpublic static boolean isUniqueChars(String str) {\r\n\t\tif (str.length() > 128) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tboolean[] char_set = new boolean[128];\r\n\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\tint val = str.charAt(i);\r\n\t\t\tif (char_set[val]) return false;\r\n\t\t\tchar_set[val] = true;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] words = {\"abcde\", \"hello\", \"apple\", \"kite\", \"padle\"};\r\n\t\tfor (String word : words) {\r\n\t\t\tSystem.out.println(word + \": \" + isUniqueChars(word));\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_01_Is_Unique/QuestionB.java",
    "content": "package Q1_01_Is_Unique;\r\n\r\npublic class QuestionB {\r\n\r\n\t/* Assumes only letters a through z. */\r\n\tpublic static boolean isUniqueChars(String str) {\r\n\t\tif (str.length() > 26) { // Only 26 characters\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint checker = 0;\r\n\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\tint val = str.charAt(i) - 'a';\r\n\t\t\tif ((checker & (1 << val)) > 0) return false;\r\n\t\t\tchecker |= (1 << val);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] words = {\"abcde\", \"hello\", \"apple\", \"kite\", \"padle\"};\r\n\t\tfor (String word : words) {\r\n\t\t\tSystem.out.println(word + \": \" + isUniqueChars(word));\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_01_Is_Unique/Tester.java",
    "content": "package Q1_01_Is_Unique;\n\npublic class Tester {\n\t\n\tpublic static void main(String[] args) {\n\t\tString[] words = {\"abcde\", \"hello\", \"apple\", \"kite\", \"padle\"};\n\t\tfor (String word : words) {\n\t\t\tboolean wordA =  QuestionA.isUniqueChars(word);\n\t\t\tboolean wordB =  QuestionB.isUniqueChars(word);\n\t\t\tif (wordA == wordB) {\n\t\t\t\tSystem.out.println(word + \": \" + wordA);\n\t\t\t} else {\n\t\t\t\tSystem.out.println(word + \": \" + wordA + \" vs \" + wordB);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_02_Check_Permutation/QuestionA.java",
    "content": "package Q1_02_Check_Permutation;\r\n\r\npublic class QuestionA {\t\r\n\tpublic static String sort(String s) {\r\n\t\tchar[] content = s.toCharArray();\r\n\t\tjava.util.Arrays.sort(content);\r\n\t\treturn new String(content);\r\n\t}\r\n\t\r\n\tpublic static boolean permutation(String s, String t) {\r\n\t\treturn sort(s).equals(sort(t));\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[][] pairs = {{\"apple\", \"papel\"}, {\"carrot\", \"tarroc\"}, {\"hello\", \"llloh\"}};\r\n\t\tfor (String[] pair : pairs) {\r\n\t\t\tString word1 = pair[0];\r\n\t\t\tString word2 = pair[1];\r\n\t\t\tboolean anagram = permutation(word1, word2);\r\n\t\t\tSystem.out.println(word1 + \", \" + word2 + \": \" + anagram);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_02_Check_Permutation/QuestionB.java",
    "content": "package Q1_02_Check_Permutation;\r\n\r\npublic class QuestionB {\t\r\n\tpublic static boolean permutation(String s, String t) {\r\n\t\tif (s.length() != t.length()) return false; // Permutations must be same length\r\n\t\t\r\n\t\tint[] letters = new int[128]; // Assumption: ASCII\r\n\t\tfor (int i = 0; i < s.length(); i++) {\r\n\t\t\tletters[s.charAt(i)]++;\r\n\t\t}\r\n\t\t  \r\n\t\tfor (int i = 0; i < t.length(); i++) {\r\n\t\t\tletters[t.charAt(i)]--;\r\n\t\t    if (letters[t.charAt(i)] < 0) {\r\n\t\t    \treturn false;\r\n\t\t    }\r\n\t\t}\r\n\t\t  \r\n\t\treturn true; // letters array has no negative values, and therefore no positive values either\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[][] pairs = {{\"apple\", \"papel\"}, {\"carrot\", \"tarroc\"}, {\"hello\", \"llloh\"}};\r\n\t\tfor (String[] pair : pairs) {\r\n\t\t\tString word1 = pair[0];\r\n\t\t\tString word2 = pair[1];\r\n\t\t\tboolean anagram = permutation(word1, word2);\r\n\t\t\tSystem.out.println(word1 + \", \" + word2 + \": \" + anagram);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_03_URLify/Question.java",
    "content": "package Q1_03_URLify;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\t// Assume string has sufficient free space at the end\r\n\tpublic static void replaceSpaces(char[] str, int trueLength) {\r\n\t\tint spaceCount = 0, index, i = 0;\r\n\t\tfor (i = 0; i < trueLength; i++) {\r\n\t\t\tif (str[i] == ' ') {\r\n\t\t\t\tspaceCount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tindex = trueLength + spaceCount * 2;\r\n\t\tif (trueLength < str.length) str[trueLength] = '\\0';\r\n\t\tfor (i = trueLength - 1; i >= 0; i--) {\r\n\t\t\tif (str[i] == ' ') {\r\n\t\t\t\tstr[index - 1] = '0';\r\n\t\t\t\tstr[index - 2] = '2';\r\n\t\t\t\tstr[index - 3] = '%';\r\n\t\t\t\tindex = index - 3;\r\n\t\t\t} else {\r\n\t\t\t\tstr[index - 1] = str[i];\r\n\t\t\t\tindex--;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int findLastCharacter(char[] str) {\r\n\t\tfor (int i = str.length - 1; i >= 0; i--) {\r\n\t\t\tif (str[i] != ' ') {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString str = \"Mr John Smith    \";\r\n\t\tchar[] arr = str.toCharArray();\r\n\t\tint trueLength = findLastCharacter(arr) + 1;\r\n\t\treplaceSpaces(arr, trueLength);\t\r\n\t\tSystem.out.println(\"\\\"\" + AssortedMethods.charArrayToString(arr) + \"\\\"\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_04_Palindrome_Permutation/Common.java",
    "content": "package Q1_04_Palindrome_Permutation;\n\npublic class Common {\n\n\tpublic static int getCharNumber(Character c) {\n\t\tint a = Character.getNumericValue('a');\n\t\tint z = Character.getNumericValue('z');\n\t\t\n\t\tint val = Character.getNumericValue(c);\n\t\tif (a <= val && val <= z) {\n\t\t\treturn val - a;\n\t\t}\n\t\treturn -1;\n\t}\n\t\n\tpublic static int[] buildCharFrequencyTable(String phrase) {\n\t\tint[] table = new int[Character.getNumericValue('z') - Character.getNumericValue('a') + 1];\n\t\tfor (char c : phrase.toCharArray()) {\n\t\t\tint x = getCharNumber(c);\n\t\t\tif (x != -1) {\n\t\t\t\ttable[x]++;\n\t\t\t}\n\t\t}\n\t\treturn table;\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_04_Palindrome_Permutation/QuestionA.java",
    "content": "package Q1_04_Palindrome_Permutation;\n\npublic class QuestionA {\t\n\tpublic static boolean checkMaxOneOdd(int[] table) {\n\t\tboolean foundOdd = false;\n\t\tfor (int count : table) {\n\t\t\tif (count % 2 == 1) {\n\t\t\t\tif (foundOdd) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfoundOdd = true;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean isPermutationOfPalindrome(String phrase) {\n\t\tint[] table = Common.buildCharFrequencyTable(phrase);\n\t\treturn checkMaxOneOdd(table);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString pali = \"Rats live on no evil star\";\n\t\tSystem.out.println(isPermutationOfPalindrome(pali));\n\t}\n\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_04_Palindrome_Permutation/QuestionB.java",
    "content": "package Q1_04_Palindrome_Permutation;\n\npublic class QuestionB {\t\n\n\tpublic static boolean isPermutationOfPalindrome(String phrase) {\n\t\tint countOdd = 0;\n\t\tint[] table = new int[Character.getNumericValue('z') - Character.getNumericValue('a') + 1];\n\t\tfor (char c : phrase.toCharArray()) {\n\t\t\tint x = Common.getCharNumber(c);\n\t\t\tif (x != -1) {\n\t\t\t\ttable[x]++;\n\n\t\t\t\tif (table[x] % 2 == 1) {\n\t\t\t\t\tcountOdd++;\n\t\t\t\t} else {\n\t\t\t\t\tcountOdd--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn countOdd <= 1;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString pali = \"Ratzs live on no evil starz\";\n\t\tSystem.out.println(isPermutationOfPalindrome(pali));\n\t\tString pali2 = \"Zeus was deified, saw Suez\";\n\t\tSystem.out.println(isPermutationOfPalindrome(pali2));\n\t}\n\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_04_Palindrome_Permutation/QuestionC.java",
    "content": "package Q1_04_Palindrome_Permutation;\n\npublic class QuestionC {\n\t/* Toggle the ith bit in the integer. */\n\tpublic static int toggle(int bitVector, int index) {\n\t\tif (index < 0) return bitVector;\n\t\t\n\t\tint mask = 1 << index;\n\t\tif ((bitVector & mask) == 0) {\n\t\t\tbitVector |= mask;\n\t\t} else {\n\t\t\tbitVector &= ~mask;\n\t\t}\n\t\treturn bitVector;\n\t}\n\t\n\t/* Create bit vector for string. For each letter with value i,\n\t * toggle the ith bit. */\n\tpublic static int createBitVector(String phrase) {\n\t\tint bitVector = 0;\n\t\tfor (char c : phrase.toCharArray()) {\n\t\t\tint x = Common.getCharNumber(c);\n\t\t\tbitVector = toggle(bitVector, x);\n\t\t}\n\t\treturn bitVector;\n\t}\n\t\n\t/* Check that at most one bit is set by subtracting one from the \n\t * integer and ANDing it with the original integer. */\n\tpublic static boolean checkAtMostOneBitSet(int bitVector) {\n\t\treturn (bitVector & (bitVector - 1)) == 0;\n\t}\n\t\n\tpublic static boolean isPermutationOfPalindrome(String phrase) {\n\t\tint bitVector = createBitVector(phrase);\n\t\treturn checkAtMostOneBitSet(bitVector);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString pali = \"Rats live on no evil star\";\n\t\tSystem.out.println(isPermutationOfPalindrome(pali));\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_04_Palindrome_Permutation/Tester.java",
    "content": "package Q1_04_Palindrome_Permutation;\n\npublic class Tester {\n\n\t\n\tpublic static void main(String[] args) {\n\t\tString[] strings = {\"Rats live on no evil star\",\n\t\t\t\t\t\t\t\"A man, a plan, a canal, panama\",\n\t\t\t\t\t\t\t\"Lleve\",\n\t\t\t\t\t\t\t\"Tacotac\",\n\t\t\t\t\t\t\t\"asda\"};\n\t\tfor (String s : strings) {\n\t\t\tboolean a = QuestionA.isPermutationOfPalindrome(s);\n\t\t\tboolean b = QuestionB.isPermutationOfPalindrome(s);\n\t\t\tboolean c = QuestionC.isPermutationOfPalindrome(s);\n\t\t\tSystem.out.println(s);\n\t\t\tif (a == b && b == c) {\n\t\t\t\tSystem.out.println(\"Agree: \" + a);\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"Disagree: \" + a + \", \" + b + \", \" + c);\n\t\t\t}\n\t\t\tSystem.out.println();\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_05_One_Away/QuestionA.java",
    "content": "package Q1_05_One_Away;\n\npublic class QuestionA {\n\n\tpublic static boolean oneEditReplace(String s1, String s2) {\n\t\tboolean foundDifference = false;\n\t\tfor (int i = 0; i < s1.length(); i++) {\n\t\t\tif (s1.charAt(i) != s2.charAt(i)) {\n\t\t\t\tif (foundDifference) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfoundDifference = true;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t/* Check if you can insert a character into s1 to make s2. */\n\tpublic static boolean oneEditInsert(String s1, String s2) {\n\t\tint index1 = 0;\n\t\tint index2 = 0;\n\t\twhile (index2 < s2.length() && index1 < s1.length()) {\n\t\t\tif (s1.charAt(index1) != s2.charAt(index2)) {\n\t\t\t\tif (index1 != index2) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\t\t\n\t\t\t\tindex2++;\n\t\t\t} else {\n\t\t\t\tindex1++;\n\t\t\t\tindex2++;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\t\n\t\n\tpublic static boolean oneEditAway(String first, String second) {\n\t\tif (first.length() == second.length()) {\n\t\t\treturn oneEditReplace(first, second);\n\t\t} else if (first.length() + 1 == second.length()) {\n\t\t\treturn oneEditInsert(first, second);\n\t\t} else if (first.length() - 1 == second.length()) {\n\t\t\treturn oneEditInsert(second, first);\n\t\t} \n\t\treturn false;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString a = \"pse\";\n\t\tString b = \"pale\";\n\t\tboolean isOneEdit = oneEditAway(a, b);\n\t\tSystem.out.println(a + \", \" + b + \": \" + isOneEdit);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_05_One_Away/QuestionB.java",
    "content": "package Q1_05_One_Away;\n\npublic class QuestionB {\t\npublic static boolean oneEditAway(String first, String second) {\n\t\t/* Length checks. */\n\t\tif (Math.abs(first.length() - second.length()) > 1) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t/* Get shorter and longer string.*/\n\t\tString s1 = first.length() < second.length() ? first : second;\n\t\tString s2 = first.length() < second.length() ? second : first;\n\n\t\tint index1 = 0;\n\t\tint index2 = 0;\n\t\tboolean foundDifference = false;\n\t\twhile (index2 < s2.length() && index1 < s1.length()) {\n\t\t\tif (s1.charAt(index1) != s2.charAt(index2)) {\n\t\t\t\t/* Ensure that this is the first difference found.*/\n\t\t\t\tif (foundDifference) return false;\n\t\t\t\tfoundDifference = true;\n\t\t\t\tif (s1.length() == s2.length()) { // On replace, move shorter pointer\n\t\t\t\t\tindex1++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tindex1++; // If matching, move shorter pointer \n\t\t\t}\n\t\t\tindex2++; // Always move pointer for longer string \n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\t\n\tpublic static void main(String[] args) {\n\t\tString a = \"palee\";\n\t\tString b = \"pale\";\n\t\tboolean isOneEdit1 = oneEditAway(a, b);\n\t\tSystem.out.println(a + \", \" + b + \": \" + isOneEdit1);\n\n\t\tString c = \"pale\";\n\t\tString d = \"pkle\";\n\t\tboolean isOneEdit2 = oneEditAway(c, d);\n\t\tSystem.out.println(c + \", \" + d + \": \" + isOneEdit2);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_05_One_Away/Tester.java",
    "content": "package Q1_05_One_Away;\n\npublic class Tester {\n\t\n\tpublic static void test(String a, String b, boolean expected) {\n\t\tboolean resultA = QuestionA.oneEditAway(a, b);\n\t\tboolean resultB = QuestionB.oneEditAway(a, b);\t\t\n\t\t\n\t\tif (resultA == expected && resultB == expected) {\n\t\t\tSystem.out.println(a + \", \" + b + \": success\");\n\t\t} else {\n\t\t\tSystem.out.println(a + \", \" + b + \": error\");\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"a\", \"b\", \"true\"}, \n\t\t\t\t{\"\", \"d\", \"true\"},\n\t\t\t\t{\"d\", \"de\", \"true\"},\n\t\t\t\t{\"pale\", \"pse\", \"false\"},\n\t\t\t\t{\"acdsfdsfadsf\", \"acdsgdsfadsf\", \"true\"},\n\t\t\t\t{\"acdsfdsfadsf\", \"acdsfdfadsf\", \"true\"},\n\t\t\t\t{\"acdsfdsfadsf\", \"acdsfdsfads\", \"true\"},\n\t\t\t\t{\"acdsfdsfadsf\", \"cdsfdsfadsf\", \"true\"},\n\t\t\t\t{\"adfdsfadsf\", \"acdfdsfdsf\", \"false\"},\n\t\t\t\t{\"adfdsfadsf\", \"bdfdsfadsg\", \"false\"},\n\t\t\t\t{\"adfdsfadsf\", \"affdsfads\", \"false\"},\n\t\t\t\t{\"pale\", \"pkle\", \"true\"},\n\t\t\t\t{\"pkle\", \"pable\", \"false\"}};\n\t\tfor (int i = 0; i < tests.length; i++) {\n\t\t\tString[] test = tests[i];\n\t\t\tString a = test[0];\n\t\t\tString b = test[1];\n\t\t\tboolean expected = test[2].equals(\"true\");\n\t\t\t\n\t\t\ttest(a, b, expected);\n\t\t\ttest(b, a, expected);\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_06_String_Compression/QuestionA.java",
    "content": "package Q1_06_String_Compression;\r\n\r\npublic class QuestionA {\t\r\n\tpublic static String compressBad(String str) {\r\n\t\tString compressedString = \"\";\r\n\t\tint countConsecutive = 0;\r\n\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\tcountConsecutive++;\r\n\t\t\t\r\n\t\t\t/* If next character is different than current, append this char to result.*/\r\n\t\t\tif (i + 1 >= str.length() || str.charAt(i) != str.charAt(i + 1)) {\r\n\t\t\t\tcompressedString += \"\" + str.charAt(i) + countConsecutive;\r\n\t\t\t\tcountConsecutive = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn compressedString.length() < str.length() ? compressedString : str;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString str = \"aa\";\r\n\t\tSystem.out.println(str);\r\n\t\tSystem.out.println(compressBad(str));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_06_String_Compression/QuestionB.java",
    "content": "package Q1_06_String_Compression;\r\n\r\npublic class QuestionB {\t\r\n\tpublic static String compress(String str) {\r\n\t\tStringBuilder compressed = new StringBuilder();\r\n\t\tint countConsecutive = 0;\r\n\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\tcountConsecutive++;\r\n\t\t\t\r\n\t\t\t/* If next character is different than current, append this char to result.*/\r\n\t\t\tif (i + 1 >= str.length() || str.charAt(i) != str.charAt(i + 1)) {\r\n\t\t\t\tcompressed.append(str.charAt(i));\r\n\t\t\t\tcompressed.append(countConsecutive);\r\n\t\t\t\tcountConsecutive = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn compressed.length() < str.length() ? compressed.toString() : str;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString str = \"aa\";\r\n\t\tSystem.out.println(str);\r\n\t\tSystem.out.println(compress(str));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_06_String_Compression/QuestionC.java",
    "content": "package Q1_06_String_Compression;\r\n\r\npublic class QuestionC {\t\r\n\tpublic static String compress(String str) {\r\n\t\tint finalLength = countCompression(str);\r\n\t\tif (finalLength >= str.length()) return str;\r\n\t\t\r\n\t\tStringBuffer compressed = new StringBuffer(finalLength); // initialize capacity\r\n\t\tint countConsecutive = 0;\r\n\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\tcountConsecutive++;\r\n\t\t\t\r\n\t\t\t/* If next character is different than current, append this char to result.*/\r\n\t\t\tif (i + 1 >= str.length() || str.charAt(i) != str.charAt(i + 1)) {\r\n\t\t\t\tcompressed.append(str.charAt(i));\r\n\t\t\t\tcompressed.append(countConsecutive);\r\n\t\t\t\tcountConsecutive = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn compressed.toString();\r\n\t}\r\n\t\r\n\tpublic static int countCompression(String str) {\r\n\t\tint compressedLength = 0;\r\n\t\tint countConsecutive = 0;\r\n\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\tcountConsecutive++;\r\n\t\t\t\r\n\t\t\t/* If next character is different than current, append this char to result.*/\r\n\t\t\tif (i + 1 >= str.length() || str.charAt(i) != str.charAt(i + 1)) {\r\n\t\t\t\tcompressedLength += 1 + String.valueOf(countConsecutive).length();\r\n\t\t\t\tcountConsecutive = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn compressedLength;\r\n\t}\t\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString str = \"aa\";\r\n\t\tSystem.out.println(str);\r\n\t\tSystem.out.println(compress(str));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_06_String_Compression/Tester.java",
    "content": "package Q1_06_String_Compression;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tString str = \"aaaaabbbbaaaabbddc\";\n\t\tSystem.out.println(str);\n\t\tSystem.out.println(QuestionA.compressBad(str));\n\t\tSystem.out.println(QuestionB.compress(str));\n\t\tSystem.out.println(QuestionC.compress(str));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_07_Rotate_Matrix/Question.java",
    "content": "package Q1_07_Rotate_Matrix;\r\n\r\nimport CtCILibrary.*;\r\n\r\npublic class Question {\r\n\r\n\tpublic static boolean rotate(int[][] matrix) {\r\n\t\tif (matrix.length == 0 || matrix.length != matrix[0].length) return false; // Not a square\r\n\t\tint n = matrix.length;\r\n\t\t\r\n\t\tfor (int layer = 0; layer < n / 2; layer++) {\r\n\t\t\tint first = layer;\r\n\t\t\tint last = n - 1 - layer;\r\n\t\t\tfor(int i = first; i < last; i++) {\r\n\t\t\t\tint offset = i - first;\r\n\t\t\t\tint top = matrix[first][i]; // save top\r\n\r\n\t\t\t\t// left -> top\r\n\t\t\t\tmatrix[first][i] = matrix[last-offset][first]; \t\t\t\r\n\r\n\t\t\t\t// bottom -> left\r\n\t\t\t\tmatrix[last-offset][first] = matrix[last][last - offset]; \r\n\r\n\t\t\t\t// right -> bottom\r\n\t\t\t\tmatrix[last][last - offset] = matrix[i][last]; \r\n\r\n\t\t\t\t// top -> right\r\n\t\t\t\tmatrix[i][last] = top; // right <- saved top\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(3, 3, 0, 9);\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\trotate(matrix);\r\n\t\tSystem.out.println();\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_08_Zero_Matrix/QuestionA.java",
    "content": "package Q1_08_Zero_Matrix;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\tpublic static void nullifyRow(int[][] matrix, int row) {\r\n\t\tfor (int j = 0; j < matrix[0].length; j++) {\r\n\t\t\tmatrix[row][j] = 0;\r\n\t\t}\t\t\r\n\t}\r\n\r\n\tpublic static void nullifyColumn(int[][] matrix, int col) {\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tmatrix[i][col] = 0;\r\n\t\t}\t\t\r\n\t}\t\t\t\r\n\t\r\n\tpublic static void setZeros(int[][] matrix) {\r\n\t\tboolean[] row = new boolean[matrix.length];\t\r\n\t\tboolean[] column = new boolean[matrix[0].length];\r\n\r\n\t\t// Store the row and column index with value 0\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 0; j < matrix[0].length;j++) {\r\n\t\t\t\tif (matrix[i][j] == 0) {\r\n\t\t\t\t\trow[i] = true; \r\n\t\t\t\t\tcolumn[j] = true;\r\n\t\t \t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Nullify rows\r\n\t\tfor (int i = 0; i < row.length; i++) {\r\n\t\t\tif (row[i]) {\r\n\t\t\t\tnullifyRow(matrix, i);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Nullify columns\r\n\t\tfor (int j = 0; j < column.length; j++) {\r\n\t\t\tif (column[j]) {\r\n\t\t\t\tnullifyColumn(matrix, j);\r\n\t\t\t}\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static boolean matricesAreEqual(int[][] m1, int[][] m2) {\r\n\t\tif (m1.length != m2.length || m1[0].length != m2[0].length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\tfor (int k = 0; k < m1.length; k++) {\r\n\t\t\tfor (int j = 0; j < m1[0].length; j++) {\r\n\t\t\t\tif (m1[k][j] != m2[k][j]) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static int[][] cloneMatrix(int[][] matrix) {\r\n\t\tint[][] c = new int[matrix.length][matrix[0].length];\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 0; j < matrix[0].length; j++) {\r\n\t\t\t\tc[i][j] = matrix[i][j];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn c;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint nrows = 10;\r\n\t\tint ncols = 15;\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(nrows, ncols, -10, 10);\t\t\r\n\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\t\r\n\t\tsetZeros(matrix);\r\n\t\t\r\n\t\tSystem.out.println();\r\n\t\t\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_08_Zero_Matrix/QuestionB.java",
    "content": "package Q1_08_Zero_Matrix;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\tpublic static void nullifyRow(int[][] matrix, int row) {\r\n\t\tfor (int j = 0; j < matrix[0].length; j++) {\r\n\t\t\tmatrix[row][j] = 0;\r\n\t\t}\t\t\r\n\t}\r\n\r\n\tpublic static void nullifyColumn(int[][] matrix, int col) {\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tmatrix[i][col] = 0;\r\n\t\t}\t\t\r\n\t}\t\t\r\n\t\r\n\tpublic static void setZeros(int[][] matrix) {\r\n\t\tboolean rowHasZero = false;\r\n\t\tboolean colHasZero = false;\t\t\r\n\t\t\r\n\t\t// Check if first row has a zero\r\n\t\tfor (int j = 0; j < matrix[0].length; j++) {\r\n\t\t\tif (matrix[0][j] == 0) {\r\n\t\t\t\trowHasZero = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\t\r\n\t\t// Check if first column has a zero\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tif (matrix[i][0] == 0) {\r\n\t\t\t\tcolHasZero = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\t\r\n\t\t// Check for zeros in the rest of the array\r\n\t\tfor (int i = 1; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 1; j < matrix[0].length;j++) {\r\n\t\t\t\tif (matrix[i][j] == 0) {\r\n\t\t\t\t\tmatrix[i][0] = 0;\r\n\t\t\t\t\tmatrix[0][j] = 0;\r\n\t\t \t\t}\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\t\r\n\t\t// Nullify rows based on values in first column\r\n\t\tfor (int i = 1; i < matrix.length; i++) {\r\n\t\t\tif (matrix[i][0] == 0) {\r\n\t\t\t\tnullifyRow(matrix, i);\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\t\r\n\t\t// Nullify columns based on values in first row\r\n\t\tfor (int j = 1; j < matrix[0].length; j++) {\r\n\t\t\tif (matrix[0][j] == 0) {\r\n\t\t\t\tnullifyColumn(matrix, j);\r\n\t\t\t}\r\n\t\t}\t\r\n\t\t\r\n\t\t// Nullify first row\r\n\t\tif (rowHasZero) {\r\n\t\t\tnullifyRow(matrix, 0);\r\n\t\t}\r\n\t\t\r\n\t\t// Nullify first column\r\n\t\tif (colHasZero) {\r\n\t\t\tnullifyColumn(matrix, 0);\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static boolean matricesAreEqual(int[][] m1, int[][] m2) {\r\n\t\tif (m1.length != m2.length || m1[0].length != m2[0].length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\tfor (int k = 0; k < m1.length; k++) {\r\n\t\t\tfor (int j = 0; j < m1[0].length; j++) {\r\n\t\t\t\tif (m1[k][j] != m2[k][j]) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static int[][] cloneMatrix(int[][] matrix) {\r\n\t\tint[][] c = new int[matrix.length][matrix[0].length];\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 0; j < matrix[0].length; j++) {\r\n\t\t\t\tc[i][j] = matrix[i][j];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn c;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint nrows = 10;\r\n\t\tint ncols = 15;\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(nrows, ncols, -10, 10);\t\t\r\n\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\t\r\n\t\tsetZeros(matrix);\r\n\t\t\r\n\t\tSystem.out.println();\r\n\t\t\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_08_Zero_Matrix/Tester.java",
    "content": "package Q1_08_Zero_Matrix;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Tester {\r\n\tpublic static boolean matricesAreEqual(int[][] m1, int[][] m2) {\r\n\t\tif (m1.length != m2.length || m1[0].length != m2[0].length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\tfor (int k = 0; k < m1.length; k++) {\r\n\t\t\tfor (int j = 0; j < m1[0].length; j++) {\r\n\t\t\t\tif (m1[k][j] != m2[k][j]) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static int[][] cloneMatrix(int[][] matrix) {\r\n\t\tint[][] c = new int[matrix.length][matrix[0].length];\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 0; j < matrix[0].length; j++) {\r\n\t\t\t\tc[i][j] = matrix[i][j];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn c;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint nrows = 10;\r\n\t\tint ncols = 15;\r\n\t\tint[][] matrix1 = AssortedMethods.randomMatrix(nrows, ncols, -10, 10);\t\t\r\n\t\tint[][] matrix2 = cloneMatrix(matrix1);\r\n\r\n\t\tAssortedMethods.printMatrix(matrix1);\r\n\t\t\r\n\t\tQuestionA.setZeros(matrix1);\r\n\t\tQuestionB.setZeros(matrix2);\r\n\t\t\r\n\t\tSystem.out.println();\r\n\t\t\r\n\t\tAssortedMethods.printMatrix(matrix1);\r\n\t\tSystem.out.println();\r\n\t\tAssortedMethods.printMatrix(matrix2);\r\n\t\t\r\n\t\tif (matricesAreEqual(matrix1, matrix2)) {\r\n\t\t\tSystem.out.println(\"Equal\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"Not Equal\");\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 01. Arrays and Strings/Q1_09_String_Rotation/Question.java",
    "content": "package Q1_09_String_Rotation;\r\n\r\npublic class Question {\r\n\tpublic static boolean isSubstring(String big, String small) {\r\n\t\tif (big.indexOf(small) >= 0) {\r\n\t\t\treturn true;\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static boolean isRotation(String s1, String s2) {\r\n\t    int len = s1.length();\r\n\t    /* check that s1 and s2 are equal length and not empty */\r\n\t    if (len == s2.length() && len > 0) { \r\n\t    \t/* concatenate s1 and s1 within new buffer */\r\n\t    \tString s1s1 = s1 + s1;\r\n\t    \treturn isSubstring(s1s1, s2);\r\n\t    }\r\n\t    return false;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[][] pairs = {{\"apple\", \"pleap\"}, {\"waterbottle\", \"erbottlewat\"}, {\"camera\", \"macera\"}};\r\n\t\tfor (String[] pair : pairs) {\r\n\t\t\tString word1 = pair[0];\r\n\t\t\tString word2 = pair[1];\r\n\t\t\tboolean is_rotation = isRotation(word1, word2);\r\n\t\t\tSystem.out.println(word1 + \", \" + word2 + \": \" + is_rotation);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_01_Remove_Dups/QuestionA.java",
    "content": "package Q2_01_Remove_Dups;\r\n\r\nimport java.util.HashSet;\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionA {\r\n\tpublic static void deleteDups(LinkedListNode n) {\r\n\t\tHashSet<Integer> set = new HashSet<Integer>();\r\n\t\tLinkedListNode previous = null;\r\n\t\twhile (n != null) {\r\n\t\t\tif (set.contains(n.data)) {\r\n\t\t\t\tprevious.next = n.next;\r\n\t\t\t} else {\r\n\t\t\t\tset.add(n.data);\r\n\t\t\t\tprevious = n;\r\n\t\t\t}\r\n\t\t\tn = n.next;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\t\r\n\t\tLinkedListNode first = new LinkedListNode(0, null, null); //AssortedMethods.randomLinkedList(1000, 0, 2);\r\n\t\tLinkedListNode head = first;\r\n\t\tLinkedListNode second = first;\r\n\t\tfor (int i = 1; i < 8; i++) {\r\n\t\t\tsecond = new LinkedListNode(i % 2, null, null);\r\n\t\t\tfirst.setNext(second);\r\n\t\t\tsecond.setPrevious(first);\r\n\t\t\tfirst = second;\r\n\t\t}\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tdeleteDups(head);\r\n\t\tSystem.out.println(head.printForward());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_01_Remove_Dups/QuestionB.java",
    "content": "package Q2_01_Remove_Dups;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionB {\r\n\tpublic static void deleteDups(LinkedListNode head) {\r\n\t\tLinkedListNode current = head;\r\n\t\twhile (current != null) {\r\n\t\t\t/* Remove all future nodes that have the same value */\r\n\t\t\tLinkedListNode runner = current;\r\n\t\t\twhile (runner.next != null) { \r\n\t\t\t\tif (runner.next.data == current.data) {\r\n\t\t\t\t\trunner.next = runner.next.next;\r\n\t\t\t\t} else {\r\n\t\t\t\t\trunner = runner.next;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcurrent = current.next;\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\t\r\n\t\tLinkedListNode first = new LinkedListNode(0, null, null); //AssortedMethods.randomLinkedList(1000, 0, 2);\r\n\t\tLinkedListNode head = first;\r\n\t\tLinkedListNode second = first;\r\n\t\tfor (int i = 1; i < 8; i++) {\r\n\t\t\tsecond = new LinkedListNode(i % 2, null, null);\r\n\t\t\tfirst.setNext(second);\r\n\t\t\tsecond.setPrevious(first);\r\n\t\t\tfirst = second;\r\n\t\t}\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tdeleteDups(head);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_01_Remove_Dups/QuestionC.java",
    "content": "package Q2_01_Remove_Dups;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionC {\r\n\tpublic static void deleteDups(LinkedListNode head) {\r\n\t\tif (head == null) return;\r\n\t\tLinkedListNode previous = head;\r\n\t\tLinkedListNode current = previous.next;\r\n\t\twhile (current != null) {\r\n\t\t\t// Look backwards for dups, and remove any that you see.\r\n\t\t\tLinkedListNode runner = head;\r\n\t\t\twhile (runner != current) { \r\n\t\t\t\tif (runner.data == current.data) {\r\n\t\t\t\t\tLinkedListNode tmp = current.next;\r\n\t\t\t\t\tprevious.next = tmp;\r\n\t\t\t\t\tcurrent = tmp;\r\n\t\t\t\t\t/* We know we can't have more than one dup preceding\r\n\t\t\t\t\t * our element since it would have been removed \r\n\t\t\t\t\t * earlier. */\r\n\t\t\t\t    break;\r\n\t\t\t\t}\r\n\t\t\t\trunner = runner.next;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/* If runner == current, then we didn't find any duplicate \r\n\t\t\t * elements in the previous for loop.  We then need to \r\n\t\t\t * increment current.  \r\n\t\t\t * If runner != current, then we must have hit the �break� \r\n\t\t\t * condition, in which case we found a dup and current has\r\n\t\t\t * already been incremented.*/\r\n\t\t\tif (runner == current) {\r\n\t\t\t\tprevious = current;\r\n\t\t        current = current.next;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\t\r\n\t\tLinkedListNode first = new LinkedListNode(0, null, null); //AssortedMethods.randomLinkedList(1000, 0, 2);\r\n\t\tLinkedListNode head = first;\r\n\t\tLinkedListNode second = first;\r\n\t\tfor (int i = 1; i < 8; i++) {\r\n\t\t\tsecond = new LinkedListNode(i % 2, null, null);\r\n\t\t\tfirst.setNext(second);\r\n\t\t\tsecond.setPrevious(first);\r\n\t\t\tfirst = second;\r\n\t\t}\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tdeleteDups(head);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_01_Remove_Dups/Tester.java",
    "content": "package Q2_01_Remove_Dups;\n\nimport CtCILibrary.LinkedListNode;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tLinkedListNode first = new LinkedListNode(0, null, null); //AssortedMethods.randomLinkedList(1000, 0, 2);\n\t\tLinkedListNode head = first;\n\t\tLinkedListNode second = first;\n\t\tfor (int i = 1; i < 8; i++) {\n\t\t\tsecond = new LinkedListNode(i % 2, null, null);\n\t\t\tfirst.setNext(second);\n\t\t\tsecond.setPrevious(first);\n\t\t\tfirst = second;\n\t\t}\n\t\tSystem.out.println(head.printForward());\n\n\t\tLinkedListNode cloneA = head.clone();\n\t\tLinkedListNode cloneB = head.clone();\n\t\tLinkedListNode cloneC = head.clone();\n\t\tQuestionA.deleteDups(cloneA);\n\t\tQuestionA.deleteDups(cloneB);\n\t\tQuestionA.deleteDups(cloneC);\n\t\t\n\t\tSystem.out.println(cloneA.printForward());\n\t\tSystem.out.println(cloneB.printForward());\n\t\tSystem.out.println(cloneC.printForward());\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_02_Return_Kth_To_Last/QuestionA.java",
    "content": "package Q2_02_Return_Kth_To_Last;\r\n\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static int printKthToLast(LinkedListNode head, int k) {\r\n\t\tif (head == null) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tint index = printKthToLast(head.next, k) + 1;\r\n\t\tif (index == k) {\r\n\t\t\tSystem.out.println(k + \"th to last node is \" + head.data);\r\n\t\t}\r\n\t\treturn index;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {0, 1, 2, 3, 4, 5, 6};\r\n\t\tLinkedListNode head = AssortedMethods.createLinkedListFromArray(array);\r\n\t\tfor (int i = 0; i <= array.length + 1; i++) {\r\n\t\t\tprintKthToLast(head, i);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_02_Return_Kth_To_Last/QuestionB.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nstruct node {\n\tnode * next;\n\tint data;\n};\n\nnode* nthToLast(node* head, int k, int& i) {\n\tif (head == NULL) {\n\t\treturn NULL;\n\t}\n\tnode * nd = nthToLast(head->next, k, i);\n\ti = i + 1;\n\tif (i == k) {\n\t\treturn head;\n\t}\n\treturn nd;\n}\n\nnode* nthToLast(node* head, int k) {\n\tint i = 0;\n\treturn nthToLast(head, k, i);\n}\n\nnode* createList(int count) {\n\tnode* head = new node();\n\thead->data = 0;\n\tnode* last = head;\n\tfor (int i = 1; i < count; i++) {\n\t\tnode* n = new node();\n\t\tn->data = i;\n\t\tlast->next = n;\n\t\tlast = n;\n\t}\n\treturn head;\n}\n\nvoid printList(node* head) {\n\twhile (head != NULL) {\n\t\tprintf(\"%d\", head->data);\n\t\thead = head->next;\n\t}\n}\n\nint main() {\n\tint count = 5;\n\tnode* head = createList(count);\n\tprintList(head);\n\tprintf(\"\\n\");\n\tfor (int k = 0; k <= count; k++) {\n\t\tnode* n = nthToLast(head, k);\n\t\tif (n != NULL) {\n\t\t\tint data = n->data;\n\t\t\tprintf(\"%d: \", k);\n\t\t\tprintf(\"%d\", n->data);\n\t\t\tprintf(\"\\n\");\n\t\t}\n\t}\n\treturn 0;\n}"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_02_Return_Kth_To_Last/QuestionC.java",
    "content": "package Q2_02_Return_Kth_To_Last;\r\n\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionC {\r\n\tpublic static class Index {\r\n\t\tpublic int value = 0;\r\n\t}\t\r\n\t\r\n\tpublic static LinkedListNode kthToLast(LinkedListNode head, int k) {\r\n\t\tIndex idx = new Index();\r\n\t\treturn kthToLast(head, k, idx);\r\n\t}\r\n\t\r\n\tpublic static LinkedListNode kthToLast(LinkedListNode head, int k, Index idx) {\r\n\t\tif (head == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tLinkedListNode node = kthToLast(head.next, k, idx);\r\n\t\tidx.value = idx.value + 1;\r\n\t\tif (idx.value == k) {\r\n\t\t\treturn head;\r\n\t\t} \r\n\t\treturn node;\r\n\t}\t\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {0, 1, 2, 3, 4, 5, 6};\r\n\t\tLinkedListNode head = AssortedMethods.createLinkedListFromArray(array);\r\n\t\tfor (int i = 0; i <= array.length + 1; i++) {\r\n\t\t\tLinkedListNode node = kthToLast(head, i);\r\n\t\t\tString nodeValue = node == null ? \"null\" : \"\" + node.data;\r\n\t\t\tSystem.out.println(i + \": \" + nodeValue);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_02_Return_Kth_To_Last/QuestionD.java",
    "content": "package Q2_02_Return_Kth_To_Last;\r\n\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionD {\r\n\t\r\n\tpublic static LinkedListNode nthToLast(LinkedListNode head, int k) {\r\n\t\tLinkedListNode p1 = head;\r\n\t\tLinkedListNode p2 = head;\r\n\t\t\r\n\t\t/* Move p1 k nodes into the list.*/\r\n\t\tfor (int i = 0; i < k; i++) {\r\n\t\t\tif (p1 == null) return null; // Out of bounds\r\n\t\t\tp1 = p1.next;\r\n\t\t}\r\n\t\t\r\n\t\t/* Move them at the same pace. When p1 hits the end, \r\n\t\t * p2 will be at the right element. */\r\n\t\twhile (p1 != null) {\r\n\t\t\tp1 = p1.next;\r\n\t\t\tp2 = p2.next;\r\n\t  \t}\r\n\t  \treturn p2;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {0, 1, 2, 3};\r\n\t\tLinkedListNode head = AssortedMethods.createLinkedListFromArray(array);\r\n\t\tfor (int i = 0; i <= array.length + 1; i++) {\r\n\t\t\tLinkedListNode node = nthToLast(head, i);\r\n\t\t\tString nodeValue = node == null ? \"null\" : \"\" + node.data;\r\n\t\t\tSystem.out.println(i + \": \" + nodeValue);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_02_Return_Kth_To_Last/Tester.java",
    "content": "package Q2_02_Return_Kth_To_Last;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\n\t\n\tpublic static void main(String[] args) {\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_03_Delete_Middle_Node/Question.java",
    "content": "package Q2_03_Delete_Middle_Node;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class Question {\r\n\r\n\tpublic static boolean deleteNode(LinkedListNode n) {\r\n\t\tif (n == null || n.next == null) {\r\n\t\t\treturn false; // Failure\r\n\t\t} \r\n\t\tLinkedListNode next = n.next; \r\n\t\tn.data = next.data; \r\n\t\tn.next = next.next; \r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tLinkedListNode head = AssortedMethods.randomLinkedList(10, 0, 10);\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tdeleteNode(head.next.next.next.next); // delete node 4\r\n\t\tSystem.out.println(head.printForward());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_04_Partition/Question.java",
    "content": "package Q2_04_Partition;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class Question {\r\n\r\n\tpublic static LinkedListNode partition(LinkedListNode node, int x) {\r\n\t\tLinkedListNode beforeStart = null;\r\n\t\tLinkedListNode beforeEnd = null;\r\n\t\tLinkedListNode afterStart = null;\r\n\t\tLinkedListNode afterEnd = null;\r\n\t\t\r\n\t\t/* Partition list */\r\n\t\twhile (node != null) {\r\n\t\t\tLinkedListNode next = node.next;\r\n\t\t\tnode.next = null;\r\n\t\t\tif (node.data < x) {\r\n\t\t\t\tif (beforeStart == null) {\r\n\t\t\t\t\tbeforeStart = node;\r\n\t\t\t\t\tbeforeEnd = beforeStart;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbeforeEnd.next = node;\r\n\t\t\t\t\tbeforeEnd = node;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (afterStart == null) {\r\n\t\t\t\t\tafterStart = node;\r\n\t\t\t\t\tafterEnd = afterStart;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tafterEnd.next = node;\r\n\t\t\t\t\tafterEnd = node;\r\n\t\t\t\t}\r\n\t\t\t}\t\r\n\t\t\tnode = next;\r\n\t\t}\r\n\t\t\r\n\t\t/* Merge before list and after list */\r\n\t\tif (beforeStart == null) {\r\n\t\t\treturn afterStart;\r\n\t\t}\r\n\t\t\r\n\t\tbeforeEnd.next = afterStart;\r\n\t\treturn beforeStart;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\t/* Create linked list */\r\n\t\tint[] vals = {33,9,2,3,10,10389,838,874578,5};\r\n\t\tLinkedListNode head = new LinkedListNode(vals[0], null, null);\r\n\t\tLinkedListNode current = head;\r\n\t\tfor (int i = 1; i < vals.length; i++) {\r\n\t\t\tcurrent = new LinkedListNode(vals[i], null, current);\r\n\t\t}\r\n\t\tSystem.out.println(head.printForward());\r\n\t\t\r\n\t\t/* Partition */\r\n\t\tLinkedListNode h = partition(head, 3);\r\n\t\t\r\n\t\t/* Print Result */\r\n\t\tSystem.out.println(h.printForward());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_04_Partition/QuestionB.java",
    "content": "package Q2_04_Partition;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static LinkedListNode partition(LinkedListNode node, int x) {\r\n\t\tLinkedListNode beforeStart = null;\r\n\t\tLinkedListNode afterStart = null;\r\n\t\t\r\n\t\t/* Partition list */\r\n\t\twhile (node != null) {\r\n\t\t\tLinkedListNode next = node.next;\r\n\t\t\tif (node.data < x) {\r\n\t\t\t\t/* Insert node into start of before list */\r\n\t\t\t\tnode.next = beforeStart;\r\n\t\t\t\tbeforeStart = node;\t\r\n\t\t\t} else {\r\n\t\t\t\t/* Insert node into front of after list */\r\n\t\t\t\tnode.next = afterStart;\r\n\t\t\t\tafterStart = node;\r\n\t\t\t}\t\r\n\t\t\tnode = next;\r\n\t\t}\r\n\t\t\r\n\t\t/* Merge before list and after list */\r\n\t\tif (beforeStart == null) {\r\n\t\t\treturn afterStart;\r\n\t\t}\r\n\t\t\r\n\t\tLinkedListNode head = beforeStart;\r\n\t\twhile (beforeStart.next != null) {\r\n\t\t\tbeforeStart = beforeStart.next;\r\n\t\t}\r\n\t\tbeforeStart.next = afterStart;\r\n\t\treturn head;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint length = 20;\r\n\t\tLinkedListNode[] nodes = new LinkedListNode[length];\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tnodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tif (i < length - 1) {\r\n\t\t\t\tnodes[i].setNext(nodes[i + 1]);\r\n\t\t\t}\r\n\t\t\tif (i > 0) {\r\n\t\t\t\tnodes[i].setPrevious(nodes[i - 1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tLinkedListNode head = nodes[0];\r\n\t\tSystem.out.println(head.printForward());\r\n\t\t\r\n\t\tLinkedListNode h = partition(head, 7);\r\n\t\tSystem.out.println(h.printForward());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_04_Partition/QuestionC.java",
    "content": "package Q2_04_Partition;\n\nimport CtCILibrary.LinkedListNode;\n\npublic class QuestionC {\n\n\tpublic static LinkedListNode partition(LinkedListNode node, int x) {\n\t\tLinkedListNode head = node;\n\t\tLinkedListNode tail = node;\n\t\t\n\t\t/* Partition list */\n\t\twhile (node != null) {\n\t\t\tLinkedListNode next = node.next;\n\t\t\tif (node.data < x) {\n\t\t\t\t/* Insert node at head. */\n\t\t\t\tnode.next = head;\n\t\t\t\thead = node;\n\t\t\t} else {\n\t\t\t\t/* Insert node at tail. */\n\t\t\t\ttail.next = node;\n\t\t\t\ttail = node;\n\t\t\t}\t\n\t\t\tnode = next;\n\t\t}\n\t\ttail.next = null;\n\t\t\n\t\treturn head;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint length = 20;\n\t\tLinkedListNode[] nodes = new LinkedListNode[length];\n\t\tfor (int i = 0; i < length; i++) {\n\t\t\tnodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < length; i++) {\n\t\t\tif (i < length - 1) {\n\t\t\t\tnodes[i].setNext(nodes[i + 1]);\n\t\t\t}\n\t\t\tif (i > 0) {\n\t\t\t\tnodes[i].setPrevious(nodes[i - 1]);\n\t\t\t}\n\t\t}\n\t\t\n\t\tLinkedListNode head = nodes[0];\n\t\tSystem.out.println(head.printForward());\n\t\t\n\t\tLinkedListNode h = partition(head, 8);\n\t\tSystem.out.println(h.printForward());\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_04_Partition/Tester.java",
    "content": "package Q2_04_Partition;\n\nimport CtCILibrary.LinkedListNode;\n\npublic class Tester {\n\t\n\tpublic static LinkedListNode createLinkedList() {\n\t\t/* Create linked list */\n\t\tint[] vals = {3, 5, 8, 5, 10, 2, 1};\n\t\tLinkedListNode head = new LinkedListNode(vals[0], null, null);\n\t\tLinkedListNode current = head;\n\t\tfor (int i = 1; i < vals.length; i++) {\n\t\t\tcurrent = new LinkedListNode(vals[i], null, current);\n\t\t}\n\t\treturn head;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(createLinkedList().printForward());\n\t\t\n\t\t/* Partition */\n\t\tLinkedListNode hA = Question.partition(createLinkedList(), 5);\n\t\tLinkedListNode hB = QuestionB.partition(createLinkedList(), 5);\n\t\tLinkedListNode hC = QuestionC.partition(createLinkedList(), 5);\n\t\t\n\t\t/* Print Result */\n\t\tSystem.out.println(hA.printForward());\n\t\tSystem.out.println(hB.printForward());\n\t\tSystem.out.println(hC.printForward());\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_05_Sum_Lists/PartialSum.java",
    "content": "package Q2_05_Sum_Lists;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class PartialSum {\r\n\tpublic LinkedListNode sum = null;\r\n\tpublic int carry = 0;\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_05_Sum_Lists/QuestionA.java",
    "content": "package Q2_05_Sum_Lists;\r\n\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionA {\r\n\tprivate static LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2) {\r\n\t\treturn addLists(l1, l2, 0);\r\n\t}\r\n\t\r\n\tprivate static LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry) {\r\n\t\tif (l1 == null && l2 == null && carry == 0) {\r\n             return null;\r\n\t\t}\r\n\t\t\r\n\t\tLinkedListNode result = new LinkedListNode();\r\n\t\tint value = carry;\r\n\t\tif (l1 != null) {\r\n\t\t\tvalue += l1.data;\r\n\t\t}\r\n\t\tif (l2 != null) {\r\n\t\t\tvalue += l2.data;\r\n\t\t}\r\n\t\tresult.data = value % 10;\r\n\t\tif (l1 != null || l2 != null) {\r\n\t\t\tLinkedListNode more = addLists(l1 == null ? null : l1.next, \r\n\t\t\t\t\t\t\t\t\t\t   l2 == null ? null : l2.next, \r\n\t\t\t\t\t\t\t\t\t\t   value >= 10 ? 1 : 0);\r\n\t\t\tresult.setNext(more);\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static int linkedListToInt(LinkedListNode node) {\r\n\t\tint value = 0;\r\n\t\tif (node.next != null) {\r\n\t\t\tvalue = 10 * linkedListToInt(node.next);\r\n\t\t}\r\n\t\treturn value + node.data;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tLinkedListNode lA1 = new LinkedListNode(9, null, null);\r\n\t\tLinkedListNode lA2 = new LinkedListNode(9, null, lA1);\r\n\t\tLinkedListNode lA3 = new LinkedListNode(9, null, lA2);\r\n\t\t\r\n\t\tLinkedListNode lB1 = new LinkedListNode(1, null, null);\r\n\t\tLinkedListNode lB2 = new LinkedListNode(0, null, lB1);\r\n\t\tLinkedListNode lB3 = new LinkedListNode(0, null, lB2);\t\r\n\t\t\r\n\t\tLinkedListNode list3 = addLists(lA1, lB1);\r\n\t\t\r\n\t\tSystem.out.println(\"  \" + lA1.printForward());\t\t\r\n\t\tSystem.out.println(\"+ \" + lB1.printForward());\t\t\t\r\n\t\tSystem.out.println(\"= \" + list3.printForward());\t\r\n\t\t\r\n\t\tint l1 = linkedListToInt(lA1);\r\n\t\tint l2 = linkedListToInt(lB1);\r\n\t\tint l3 = linkedListToInt(list3);\r\n\t\t\r\n\t\tSystem.out.print(l1 + \" + \" + l2 + \" = \" + l3 + \"\\n\");\r\n\t\tSystem.out.print(l1 + \" + \" + l2 + \" = \" + (l1 + l2));\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_05_Sum_Lists/QuestionB.java",
    "content": "package Q2_05_Sum_Lists;\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionB {\r\n\tprivate static int length(LinkedListNode l) {\r\n\t\tif (l == null) {\r\n\t\t\treturn 0;\r\n\t\t} else {\r\n\t\t\treturn 1 + length(l.next);\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate static PartialSum addListsHelper(LinkedListNode l1, LinkedListNode l2) {\r\n\t\tif (l1 == null && l2 == null) {\r\n\t\t\tPartialSum sum = new PartialSum();\r\n\t\t\treturn sum;\r\n\t\t}\r\n\t\tPartialSum sum = addListsHelper(l1.next, l2.next);\r\n\t\tint val = sum.carry + l1.data + l2.data;\r\n\t\tLinkedListNode full_result = insertBefore(sum.sum, val % 10);\r\n\t\tsum.sum = full_result;\r\n\t\tsum.carry = val / 10;\r\n\t\treturn sum;\r\n\t}\r\n\t\r\n\tprivate static LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2) {\r\n\t\tint len1 = length(l1);\r\n\t\tint len2 = length(l2);\r\n\t\tif (len1 < len2) {\r\n\t\t\tl1 = padList(l1, len2 - len1);\r\n\t\t} else {\r\n\t\t\tl2 = padList(l2, len1 - len2);\r\n\t\t}\r\n\t\tPartialSum sum = addListsHelper(l1, l2);\r\n\t\tif (sum.carry == 0) {\r\n\t\t\treturn sum.sum;\r\n\t\t} else {\r\n\t\t\tLinkedListNode result = insertBefore(sum.sum, sum.carry);\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tprivate static LinkedListNode padList(LinkedListNode l, int padding) {\r\n\t\tLinkedListNode head = l;\r\n\t\tfor (int i = 0; i < padding; i++) {\r\n\t\t\thead = insertBefore(head, 0);\r\n\t\t}\r\n\t\treturn head;\r\n\t}\r\n\t\r\n\tprivate static LinkedListNode insertBefore(LinkedListNode list, int data) {\r\n\t\tLinkedListNode node = new LinkedListNode(data);\r\n\t\tif (list != null) {\r\n\t\t\tnode.next = list;\r\n\t\t}\r\n\t\treturn node;\r\n\t}\r\n\t\r\n\tpublic static int linkedListToInt(LinkedListNode node) {\r\n\t\tint value = 0;\r\n\t\twhile (node != null) {\r\n\t\t\tvalue = value * 10 + node.data;\r\n\t\t\tnode = node.next;\r\n\t\t}\r\n\t\treturn value;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tLinkedListNode lA1 = new LinkedListNode(3, null, null);\r\n\t\tLinkedListNode lA2 = new LinkedListNode(1, null, lA1);\r\n\t\t\r\n\t\tLinkedListNode lB1 = new LinkedListNode(5, null, null);\r\n\t\tLinkedListNode lB2 = new LinkedListNode(9, null, lB1);\r\n\t\tLinkedListNode lB3 = new LinkedListNode(1, null, lB2);\t\r\n\t\t\r\n\t\tLinkedListNode list3 = addLists(lA1, lB1);\r\n\t\t\r\n\t\tSystem.out.println(\"  \" + lA1.printForward());\t\t\r\n\t\tSystem.out.println(\"+ \" + lB1.printForward());\t\t\t\r\n\t\tSystem.out.println(\"= \" + list3.printForward());\t\r\n\t\t\r\n\t\tint l1 = linkedListToInt(lA1);\r\n\t\tint l2 = linkedListToInt(lB1);\r\n\t\tint l3 = linkedListToInt(list3);\r\n\t\t\r\n\t\tSystem.out.print(l1 + \" + \" + l2 + \" = \" + l3 + \"\\n\");\r\n\t\tSystem.out.print(l1 + \" + \" + l2 + \" = \" + (l1 + l2));\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_06_Palindrome/QuestionA.java",
    "content": "package Q2_06_Palindrome;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionA {\r\n\tpublic static boolean isPalindrome(LinkedListNode head) {\r\n\t\tLinkedListNode reversed = reverseAndClone(head);\r\n\t\treturn isEqual(head, reversed);\r\n\t}\r\n\t\t\r\n\tpublic static LinkedListNode reverseAndClone(LinkedListNode node) {\r\n\t\tLinkedListNode head = null;\r\n\t\twhile (node != null) {\r\n\t\t\tLinkedListNode n = new LinkedListNode(node.data); // Clone\r\n\t\t\tn.next = head;\r\n\t\t\thead = n;\r\n\t\t\tnode = node.next;\r\n\t\t}\r\n\t\treturn head;\r\n\t}\t\r\n\t\t\r\n\tpublic static boolean isEqual(LinkedListNode one, LinkedListNode two) {\r\n\t\twhile (one != null && two != null) {\r\n\t\t\tif (one.data != two.data) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tone = one.next;\r\n\t\t\ttwo = two.next;\r\n\t\t}\r\n\t\treturn one == null && two == null;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint length = 9;\r\n\t\tLinkedListNode[] nodes = new LinkedListNode[length];\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tnodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tif (i < length - 1) {\r\n\t\t\t\tnodes[i].setNext(nodes[i + 1]);\r\n\t\t\t}\r\n\t\t\tif (i > 0) {\r\n\t\t\t\tnodes[i].setPrevious(nodes[i - 1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// nodes[length - 2].data = 9; // Uncomment to ruin palindrome\r\n\t\t\r\n\t\tLinkedListNode head = nodes[0];\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tSystem.out.println(isPalindrome(head));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_06_Palindrome/QuestionB.java",
    "content": "package Q2_06_Palindrome;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\nimport java.util.Stack;\r\n\r\npublic class QuestionB {\r\n\tpublic static boolean isPalindrome(LinkedListNode head) {\r\n\t\tLinkedListNode fast = head;\r\n\t\tLinkedListNode slow = head;\r\n\t\t\r\n\t\tStack<Integer> stack = new Stack<Integer>();\r\n\t\t\r\n\t\twhile (fast != null && fast.next != null) {\r\n\t\t\tstack.push(slow.data);\r\n\t\t\tslow = slow.next;\r\n\t\t\tfast = fast.next.next;\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t/* Has odd number of elements, so skip the middle */\r\n\t\tif (fast != null) { \r\n\t\t\tslow = slow.next;\r\n\t\t}\r\n\t\t\r\n\t\twhile (slow != null) {\r\n\t\t\tint top = stack.pop().intValue();\r\n\t\t\tif (top != slow.data) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tslow = slow.next;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint length = 9;\r\n\t\tLinkedListNode[] nodes = new LinkedListNode[length];\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tnodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tif (i < length - 1) {\r\n\t\t\t\tnodes[i].setNext(nodes[i + 1]);\r\n\t\t\t}\r\n\t\t\tif (i > 0) {\r\n\t\t\t\tnodes[i].setPrevious(nodes[i - 1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//nodes[length - 2].data = 9; // Uncomment to ruin palindrome\r\n\t\t\r\n\t\tLinkedListNode head = nodes[0];\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tSystem.out.println(isPalindrome(head));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_06_Palindrome/QuestionC.java",
    "content": "package Q2_06_Palindrome;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class QuestionC {\r\n\tpublic static class Result {\r\n\t\tpublic LinkedListNode node;\r\n\t\tpublic boolean result;\r\n\t\tpublic Result(LinkedListNode n, boolean res) {\r\n\t\t\tnode = n;\r\n\t\t\tresult = res;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static Result isPalindromeRecurse(LinkedListNode head, int length) {\r\n\t\tif (head == null || length <= 0) { // Even number of nodes\r\n\t\t\treturn new Result(head, true);\r\n\t\t} else if (length == 1) { // Odd number of nodes\r\n\t\t\treturn new Result(head.next, true);\r\n\t\t} \r\n\t\t\r\n\t\t/* Recurse on sublist. */\r\n\t\tResult res = isPalindromeRecurse(head.next, length - 2);\r\n\t\t\r\n\t\t/* If child calls are not a palindrome, pass back up \r\n\t\t * a failure. */\r\n\t\tif (!res.result || res.node == null) {\r\n\t\t\treturn res;\r\n\t\t} \r\n\t\t\r\n\t\t/* Check if matches corresponding node on other side. */\r\n\t\tres.result = (head.data == res.node.data); \r\n\t\t\r\n\t\t/* Return corresponding node. */\r\n\t\tres.node = res.node.next;\r\n\t\t\r\n\t\treturn res;\r\n\t}\r\n\t\r\n\tpublic static int lengthOfList(LinkedListNode n) {\r\n\t\tint size = 0;\r\n\t\twhile (n != null) {\r\n\t\t\tsize++;\r\n\t\t\tn = n.next;\r\n\t\t}\r\n\t\treturn size;\r\n\t}\r\n\t\r\n\tpublic static boolean isPalindrome(LinkedListNode head) {\r\n\t\tint length = lengthOfList(head);\r\n\t\tResult p = isPalindromeRecurse(head, length);\r\n\t\treturn p.result;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint length = 9;\r\n\t\tLinkedListNode[] nodes = new LinkedListNode[length];\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tnodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tif (i < length - 1) {\r\n\t\t\t\tnodes[i].setNext(nodes[i + 1]);\r\n\t\t\t}\r\n\t\t\tif (i > 0) {\r\n\t\t\t\tnodes[i].setPrevious(nodes[i - 1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t//nodes[length - 2].data = 9; // Uncomment to ruin palindrome\r\n\t\t\r\n\t\tLinkedListNode head = nodes[0];\r\n\t\tSystem.out.println(head.printForward());\r\n\t\tSystem.out.println(isPalindrome(head));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_06_Palindrome/Tester.java",
    "content": "package Q2_06_Palindrome;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class Tester {\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint max = 11;\r\n\t\tfor (int length = 1; length < max; length++) {\r\n\t\t\tLinkedListNode[] nodes = new LinkedListNode[length];\r\n\t\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\t\tnodes[i] = new LinkedListNode(i >= length / 2 ? length - i - 1 : i, null, null);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\t\tif (i < length - 1) {\r\n\t\t\t\t\tnodes[i].setNext(nodes[i + 1]);\r\n\t\t\t\t}\r\n\t\t\t\tif (i > 0) {\r\n\t\t\t\t\tnodes[i].setPrevious(nodes[i - 1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (int i = -1; i < length; i++) {\r\n\t\t\t\tif (i >= 0) {\r\n\t\t\t\t\tnodes[i].data++; // Ruin palindrome\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tLinkedListNode head = nodes[0];\r\n\t\t\t\tSystem.out.println(head.printForward());\r\n\t\t\t\tboolean resultA = QuestionA.isPalindrome(head);\r\n\t\t\t\tboolean resultB = QuestionB.isPalindrome(head);\r\n\t\t\t\tboolean resultC = QuestionC.isPalindrome(head);\r\n\t\t\t\tSystem.out.println(\"A: \" + resultA);\r\n\t\t\t\tSystem.out.println(\"B: \" + resultB);\r\n\t\t\t\tSystem.out.println(\"C: \" + resultC);\r\n\t\t\t\tif (resultA != resultB || resultB != resultC) {\r\n\t\t\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\t\t\tlength = max;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (i >= 0) {\r\n\t\t\t\t\tnodes[i].data--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_07_Intersection/Question.java",
    "content": "package Q2_07_Intersection;\n\nimport CtCILibrary.AssortedMethods;\nimport CtCILibrary.LinkedListNode;\n\npublic class Question {\n\n\tpublic static class Result {\n\t\tpublic LinkedListNode tail;\n\t\tpublic int size;\n\t\tpublic Result(LinkedListNode tail, int size) {\n\t\t\tthis.tail = tail;\n\t\t\tthis.size = size;\n\t\t}\n\t}\n\t\n\tpublic static Result getTailAndSize(LinkedListNode list) {\n\t\tif (list == null) return null;\n\t\t\n\t\tint size = 1;\n\t\tLinkedListNode current = list;\n\t\twhile (current.next != null) {\n\t\t\tsize++;\n\t\t\tcurrent = current.next;\n\t\t}\n\t\treturn new Result(current, size);\n\t}\n\t\n\tpublic static LinkedListNode getKthNode(LinkedListNode head, int k) {\n\t\tLinkedListNode current = head;\n\t\twhile (k > 0 && current != null) {\n\t\t\tcurrent = current.next;\n\t\t\tk--;\n\t\t}\n\t\treturn current;\n\t}\n\t\n\tpublic static LinkedListNode findIntersection(LinkedListNode list1, LinkedListNode list2) {\n\t\tif (list1 == null || list2 == null) return null;\n\t\t\n\t\t/* Get tail and sizes. */\n\t\tResult result1 = getTailAndSize(list1);\n\t\tResult result2 = getTailAndSize(list2);\n\t\t\n\t\t/* If different tail nodes, then there's no intersection. */\n\t\tif (result1.tail != result2.tail) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t/* Set pointers to the start of each linked list. */\n\t\tLinkedListNode shorter = result1.size < result2.size ? list1 : list2;\n\t\tLinkedListNode longer = result1.size < result2.size ? list2 : list1;\n\t\t\n\t\t/* Advance the pointer for the longer linked list by the difference in lengths. */\n\t\tlonger = getKthNode(longer, Math.abs(result1.size - result2.size));\n\t\t\n\t\t/* Move both pointers until you have a collision. */\n\t\twhile (shorter != longer) {\n\t\t\tshorter = shorter.next;\n\t\t\tlonger = longer.next;\n\t\t}\n\t\t\n\t\t/* Return either one. */\n\t\treturn longer; \n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\t/* Create linked list */\n\t\tint[] vals = {-1, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8};\n\t\tLinkedListNode list1 = AssortedMethods.createLinkedListFromArray(vals);\n\t\t\n\t\tint[] vals2 = {12, 14, 15};\n\t\tLinkedListNode list2 = AssortedMethods.createLinkedListFromArray(vals2);\n\t\t\n\t\tlist2.next.next = list1.next.next.next.next;\n\t\t\n\t\tSystem.out.println(list1.printForward());\n\t\tSystem.out.println(list2.printForward());\n\t\t\n\t\t\n\t\tLinkedListNode intersection = findIntersection(list1, list2);\n\t\t\n\t\tSystem.out.println(intersection.printForward());\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 02. Linked Lists/Q2_08_Loop_Detection/Question.java",
    "content": "package Q2_08_Loop_Detection;\r\n\r\nimport CtCILibrary.LinkedListNode;\r\n\r\npublic class Question {\r\n\r\n\tpublic static LinkedListNode FindBeginning(LinkedListNode head) {\r\n\t\tLinkedListNode slow = head;\r\n\t\tLinkedListNode fast = head; \r\n\t\t\r\n\t\t// Find meeting point\r\n\t\twhile (fast != null && fast.next != null) { \r\n\t\t\tslow = slow.next; \r\n\t\t\tfast = fast.next.next;\r\n\t\t\tif (slow == fast) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Error check - there is no meeting point, and therefore no loop\r\n\t\tif (fast == null || fast.next == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t/* Move slow to Head. Keep fast at Meeting Point. Each are k steps\r\n\t\t/* from the Loop Start. If they move at the same pace, they must\r\n\t\t * meet at Loop Start. */\r\n\t\tslow = head; \r\n\t\twhile (slow != fast) { \r\n\t\t\tslow = slow.next; \r\n\t\t\tfast = fast.next; \r\n\t\t}\r\n\t\t\r\n\t\t// Both now point to the start of the loop.\r\n\t\treturn fast;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint list_length = 100;\r\n\t\tint k = 10;\r\n\t\t\r\n\t\t// Create linked list\r\n\t\tLinkedListNode[] nodes = new LinkedListNode[list_length];\r\n\t\tfor (int i = 0; i < list_length; i++) {\r\n\t\t\tnodes[i] = new LinkedListNode(i, null, i > 0 ? nodes[i - 1] : null);\r\n\t\t}\r\n\t\t\r\n\t\t// Create loop;\r\n\t\tnodes[list_length - 1].next = nodes[list_length - k];\r\n\t\t\r\n\t\tLinkedListNode loop = FindBeginning(nodes[0]);\r\n\t\tif (loop == null) {\r\n\t\t\tSystem.out.println(\"No Cycle.\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(loop.data);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Introduction/MyQueue.java",
    "content": "package Introduction;\n\nimport java.util.NoSuchElementException;\n\npublic class MyQueue<T> {\n\tprivate static class QueueNode<T> {\n\t\tprivate T data;\n\t\tprivate QueueNode<T> next;\n\t\t\n\t\tpublic QueueNode(T data) {\n\t\t\tthis.data = data;\n\t\t}\n\t}\n\t\n\tprivate QueueNode<T> first;\n\tprivate QueueNode<T> last;\n\n\tpublic void add(T item) { \n\t\tQueueNode<T> t = new QueueNode<T>(item);\n\t\tif (last != null) {\n\t\t\tlast.next = t;\n\t\t}\n\t\tlast = t;\n\t\tif (first == null) {\n\t\t\tfirst = last;\n\t\t}\n\t} \n\n\tpublic T remove() {\n\t\tif (first == null) throw new NoSuchElementException();\n\t\tT data = first.data;\n\t\tfirst = first.next;\n\t\tif (first == null) {\n\t\t\tlast = null;\n\t\t}\n\t\treturn data;\n\t}\n\t\n\tpublic T peek() {\n\t\tif (first == null) throw new NoSuchElementException();\n\t\treturn first.data;\n\t}\n\t\n\tpublic boolean isEmpty() {\n\t\treturn first == null;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Introduction/MyStack.java",
    "content": "package Introduction;\n\nimport java.util.EmptyStackException;\n\npublic class MyStack<T> {\n\tprivate static class StackNode<T> {\n\t\tprivate T data;\n\t\tprivate StackNode<T> next;\n\t\t\n\t\tpublic StackNode(T data) {\n\t\t\tthis.data = data;\n\t\t}\n\t\t\n\t\tpublic T getData() {\n\t\t\treturn data;\n\t\t}\n\t}\n\t\n\tprivate StackNode<T> top;\n\n\tpublic T pop() {\n\t\tif (top == null) throw new EmptyStackException();\n\t\tT item = top.getData();\n\t\ttop = top.next;\n\t\treturn item;\n\t}\n\n\tpublic void push(T item) { \n\t\tStackNode<T> t = new StackNode<T>(item);\n\t\tt.next = top;\n\t\ttop = t;\n\t} \n\n\tpublic T peek() {\n\t\tif (top == null) throw new EmptyStackException();\n\t\treturn top.data;\n\t}\n\t\n\tpublic boolean isEmpty() {\n\t\treturn top == null;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Introduction/QueueTester.java",
    "content": "package Introduction;\n\nimport java.util.LinkedList;\nimport java.util.NoSuchElementException;\nimport java.util.Queue;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QueueTester {\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = AssortedMethods.randomArray(100, -100, 100);\n\t\tMyQueue<Integer> queue1 = new MyQueue<Integer>();\t\t\n\t\tQueue<Integer> queue2 = new LinkedList<Integer>();\n\t\t\n\t\tfor (int a : array) {\n\t\t\tif (a < 0) {\n\t\t\t\tint top1, top2;\n\t\t\t\ttry {\n\t\t\t\t\ttop1 = queue1.remove();\n\t\t\t\t} catch (NoSuchElementException ex) {\n\t\t\t\t\ttop1 = Integer.MIN_VALUE;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\ttop2 = queue2.remove();\n\t\t\t\t} catch (NoSuchElementException ex) {\n\t\t\t\t\ttop2 = Integer.MIN_VALUE;\n\t\t\t\t}\n\t\t\t\tif (top1 != top2) {\n\t\t\t\t\tSystem.out.println(\"ERROR: mismatching tails\");\n\t\t\t\t} else {\n\t\t\t\t\tSystem.out.println(\"SUCCESS: matching tails: \" + top1);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tqueue1.add(a);\n\t\t\t\tqueue2.add(a);\n\t\t\t}\n\t\t}\n\t\t\n\t\twhile (!queue1.isEmpty() || !queue2.isEmpty()) {\n\t\t\tint top1, top2;\n\t\t\ttry {\n\t\t\t\ttop1 = queue1.remove();\n\t\t\t} catch (NoSuchElementException ex) {\n\t\t\t\ttop1 = Integer.MIN_VALUE;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\ttop2 = queue2.remove();\n\t\t\t} catch (NoSuchElementException ex) {\n\t\t\t\ttop2 = Integer.MIN_VALUE;\n\t\t\t}\n\t\t\tif (top1 != top2) {\n\t\t\t\tSystem.out.println(\"ERROR: mismatching tails\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"SUCCESS: matching tails: \" + top1);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Introduction/StackTester.java",
    "content": "package Introduction;\n\nimport java.util.EmptyStackException;\nimport java.util.Stack;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class StackTester {\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = AssortedMethods.randomArray(100, -100, 100);\n\t\tMyStack<Integer> stack1 = new MyStack<Integer>();\t\t\n\t\tStack<Integer> stack2 = new Stack<Integer>();\n\t\t\n\t\tfor (int a : array) {\n\t\t\tif (a < 0) {\n\t\t\t\tint top1, top2;\n\t\t\t\ttry {\n\t\t\t\t\ttop1 = stack1.pop();\n\t\t\t\t} catch (EmptyStackException ex) {\n\t\t\t\t\ttop1 = Integer.MIN_VALUE;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\ttop2 = stack2.pop();\n\t\t\t\t} catch (EmptyStackException ex) {\n\t\t\t\t\ttop2 = Integer.MIN_VALUE;\n\t\t\t\t}\n\t\t\t\tif (top1 != top2) {\n\t\t\t\t\tSystem.out.println(\"ERROR: mismatching tops\");\n\t\t\t\t} else {\n\t\t\t\t\tSystem.out.println(\"SUCCESS: matching tops: \" + top1);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstack1.push(a);\n\t\t\t\tstack2.push(a);\n\t\t\t}\n\t\t}\n\t\t\n\t\twhile (!stack1.isEmpty() || !stack2.isEmpty()) {\n\t\t\tint top1, top2;\n\t\t\ttry {\n\t\t\t\ttop1 = stack1.pop();\n\t\t\t} catch (EmptyStackException ex) {\n\t\t\t\ttop1 = Integer.MIN_VALUE;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\ttop2 = stack2.pop();\n\t\t\t} catch (EmptyStackException ex) {\n\t\t\t\ttop2 = Integer.MIN_VALUE;\n\t\t\t}\n\t\t\tif (top1 != top2) {\n\t\t\t\tSystem.out.println(\"ERROR: mismatching tops\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"SUCCESS: matching tops: \" + top1);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_01_Three_in_One/FixedMultiStack.java",
    "content": "package Q3_01_Three_in_One;\r\n\r\nimport java.util.EmptyStackException;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class FixedMultiStack {\r\n\tprivate int numberOfStacks = 3;\r\n\tprivate int stackCapacity;\r\n\tprivate int[] values;\r\n\tprivate int[] sizes;\r\n\t\r\n\tpublic FixedMultiStack(int stackSize) {\r\n\t\tstackCapacity = stackSize;\r\n\t\tvalues = new int[stackSize * numberOfStacks];\r\n\t\tsizes = new int[numberOfStacks];\r\n\t}\r\n\r\n\t/* Push value onto stack. */\r\n\tpublic void push(int stackNum, int value) throws FullStackException {\r\n\t\t/* Check that we have space for the next element */\r\n\t\tif (isFull(stackNum)) { \r\n\t\t\tthrow new FullStackException();\r\n\t\t}\r\n\t\t\r\n\t\t/* Increment stack pointer and then update top value. */\t\t\r\n\t\tsizes[stackNum]++;\r\n\t\tvalues[indexOfTop(stackNum)] = value;\t\r\n\t}\r\n\r\n\t/* Pop item from top stack. */\r\n\tpublic int pop(int stackNum) {\r\n\t\tif (isEmpty(stackNum)) {\r\n\t\t\tthrow new EmptyStackException();\r\n\t\t}\r\n\t\t\r\n\t\tint topIndex = indexOfTop(stackNum);\r\n\t\tint value = values[topIndex]; // Get top\r\n\t\tvalues[topIndex] = 0; // Clear \r\n\t\tsizes[stackNum]--; // Shrink\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/* Return top element. */\r\n\tpublic int peek(int stackNum) {\r\n\t\tif (isEmpty(stackNum)) {\r\n\t\t\tthrow new EmptyStackException();\r\n\t\t}\t\t\r\n\t\treturn values[indexOfTop(stackNum)];\r\n\t}\r\n\r\n\t/* Return if stack is empty. */\r\n\tpublic boolean isEmpty(int stackNum) {\r\n\t\treturn sizes[stackNum] == 0;\r\n\t}\r\n\t\r\n\t/* Return if stack is full. */\r\n\tpublic boolean isFull(int stackNum) {\r\n\t\treturn sizes[stackNum] == stackCapacity;\r\n\t}\r\n\t\r\n\t/* Returns index of the top of the stack. */\r\n\tprivate int indexOfTop(int stackNum) {\r\n\t\tint offset = stackNum * stackCapacity;\r\n\t\tint size = sizes[stackNum];\r\n\t\treturn offset + size - 1;\r\n\t}\t\r\n\t\r\n\tpublic int[] getValues() {\r\n\t\treturn values;\r\n\t}\r\n\t\r\n\tpublic int[] getStackValues(int stackNum) {\r\n\t\tint[] items = new int[sizes[stackNum]];\r\n\t\tfor (int i = 0; i < items.length; i++) {\r\n\t\t\titems[i] = values[stackNum * stackCapacity + i];\r\n\t\t}\r\n\t\treturn items;\r\n\t}\r\n\t\r\n\tpublic String stackToString(int stackNum) {\r\n\t\tint[] items = getStackValues(stackNum);\r\n\t\treturn stackNum + \": \" + AssortedMethods.arrayToString(items);\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_01_Three_in_One/FullStackException.java",
    "content": "package Q3_01_Three_in_One;\n\npublic class FullStackException extends Exception {\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic FullStackException(){\n        super();\n    }\n\n    public FullStackException(String message){\n        super(message);\n    }\n}\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_01_Three_in_One/MultiStack.java",
    "content": "package Q3_01_Three_in_One;\n\nimport java.util.EmptyStackException;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class MultiStack {\n\t/* StackInfo is a simple class that holds a set of data about \n\t * each stack. It does not hold the actual items in the stack. \n\t * We could have done this with just a bunch of individual \n\t * variables, but that’s messy and doesn’t gain us much. */\n\tprivate class StackInfo {\n\t\tpublic int start, size, capacity;\n\t\tpublic StackInfo(int start, int capacity) {\n\t\t\tthis.start = start;\n\t\t\tthis.capacity = capacity;\n\t\t}\n\t\t\n\t\t/* Check if an index on the full array is within the stack\n\t\t * boundaries. The stack can wrap around to the start of \n\t\t * the array. */\n\t\tpublic boolean isWithinStackCapacity(int index) {\n\t\t\t/* If outside of bounds of array, return false. */\n\t\t\tif (index < 0 || index >= values.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t/* If index wraps around, adjust it. */\n\t\t\tint contiguousIndex = index < start ? index + values.length : index;\n\t\t\tint end = start + capacity;\n\t\t\treturn start <= contiguousIndex && contiguousIndex < end;\n\t\t}\n\t\t\n\t\tpublic int lastCapacityIndex() {\n\t\t\treturn adjustIndex(start + capacity - 1);\n\t\t}\n\t\t\n\t\tpublic int lastElementIndex() {\n\t\t\treturn adjustIndex(start + size - 1);\n\t\t}\t\t\n\t\t\n\t\tpublic boolean isFull() {\n\t\t\treturn size == capacity;\n\t\t}\n\t\t\n\t\tpublic boolean isEmpty() {\n\t\t\treturn size == 0;\n\t\t}\n\t}\n\t\n\tprivate StackInfo[] info;\n\tprivate int[] values;\n\t\n\tpublic MultiStack(int numberOfStacks, int defaultSize) {\n\t\t/* Create metadata for all the stacks. */\n\t\tinfo = new StackInfo[numberOfStacks];\n\t\tfor (int i = 0; i < numberOfStacks; i++) {\n\t\t\tinfo[i] = new StackInfo(defaultSize * i, defaultSize);\n\t\t}\n\t\tvalues = new int[numberOfStacks * defaultSize];\n\t}\t\n\t\n\t/* Returns the number of items actually present in stack. */\n\tpublic int numberOfElements() {\n\t\tint size = 0;\n\t\tfor (StackInfo sd : info) {\n\t\t\tsize += sd.size;\n\t\t}\n\t\treturn size;\n\t}\n\t\n\t/* Returns true is all the stacks are full. */\n\tpublic boolean allStacksAreFull() {\n\t\treturn numberOfElements() == values.length;\n\t}\n\t\n\t/* Adjust index to be within the range of 0 -> length - 1. */\n\tprivate int adjustIndex(int index) {\n\t\t/* Java's mod operator can return neg values. For example,\n\t\t * (-11 % 5) will return -1, not 4. We actually want the \n\t\t * value to be 4 (since we're wrapping around the index). \n\t\t */\n\t\tint max = values.length;\n\t\treturn ((index % max) + max) % max;\n\t}\n\t\n\t/* Get index after this index, adjusted for wrap around. */\n\tprivate int nextIndex(int index) {\n\t\treturn adjustIndex(index + 1);\n\t}\n\t\n\t/* Get index before this index, adjusted for wrap around. */\n\tprivate int previousIndex(int index) {\n\t\treturn adjustIndex(index - 1);\n\t}\n\t\n\t/* Shift items in stack over by one element. If we have \n\t * available capacity, then we'll end up shrinking the stack \n\t * by one element. If we don't have available capacity, then\n\t * we'll need to shift the next stack over too. */\n\tprivate void shift(int stackNum) {\n\t\tSystem.out.println(\"/// Shifting \" + stackNum);\n\t\tStackInfo stack = info[stackNum];\n\t\t\n\t\t/* If this stack is at its full capacity, then you need\n\t\t * to move the next stack over by one element. This stack\n\t\t * can now claim the freed index. */\n\t\tif (stack.size >= stack.capacity) {\n\t\t\tint nextStack = (stackNum + 1) % info.length;\n\t\t\tshift(nextStack); \n\t\t\tstack.capacity++; // claim index that next stack lost\n\t\t}\n\t\t\n\t\t/* Shift all elements in stack over by one. */\n\t\tint index = stack.lastCapacityIndex();\n\t\twhile (stack.isWithinStackCapacity(index)) {\n\t\t\tvalues[index] = values[previousIndex(index)];\n\t\t\tindex = previousIndex(index);\n\t\t}\n\t\t\n\t\t/* Adjust stack data. */\n\t\tvalues[stack.start] = 0; // Clear item\n\t\tstack.start = nextIndex(stack.start); // move start\n\t\tstack.capacity--; // Shrink capacity\n\t}\n\t\n\t/* Expand stack by shifting over other stacks */\n\tprivate void expand(int stackNum) {\n\t\tSystem.out.println(\"/// Expanding stack \" + stackNum);\n\t\t\n\t\tshift((stackNum + 1) % info.length);\n\t\tinfo[stackNum].capacity++;\n\t}\n\n\t/* Push value onto stack num, shifting/expanding stacks as \n\t * necessary. Throws exception if all stacks are full. */\n\tpublic void push(int stackNum, int value) throws FullStackException {\n\t\tSystem.out.println(\"/// Pushing stack \" + stackNum + \": \" + value);\n\t\tif (allStacksAreFull()) {\n\t\t\tthrow new FullStackException();\n\t\t}\n\t\t\n\t\t/* If this stack is full, expand it. */\n\t\tStackInfo stack = info[stackNum];\n\t\tif (stack.isFull()) {\n\t\t\texpand(stackNum);\n\t\t}\n\t\t\n\t\t/* Find the index of the top element in the array + 1, \n\t\t * and increment the stack pointer */\t\n\t\tstack.size++;\t\n\t\tvalues[stack.lastElementIndex()] = value;\t\n\t}\n\n\t/* Remove value from stack. */\n\tpublic int pop(int stackNum) throws Exception {\n\t\tSystem.out.println(\"/// Popping stack \" + stackNum);\n\t\tStackInfo stack = info[stackNum];\t\t\n\t\tif (stack.isEmpty()) {\n\t\t\tthrow new EmptyStackException();\n\t\t}\n\n\t\t/* Remove last element. */\n\t\tint value = values[stack.lastElementIndex()];\n\t\tvalues[stack.lastElementIndex()] = 0; // Clear item\n\t\tstack.size--; // Shrink size\n\t\treturn value;\n\t}\n\n\t/* Get top element of stack.*/\n\tpublic int peek(int stackNum) {\n\t\tStackInfo stack = info[stackNum];\t\t\t\n\t\treturn values[stack.lastElementIndex()];\n\t}\n\t\n\tpublic int[] getValues() {\n\t\treturn values;\n\t}\n\t\n\tpublic int[] getStackValues(int stackNum) {\n\t\tStackInfo stack = info[stackNum];\n\t\tint[] items = new int[stack.size];\n\t\tfor (int i = 0; i < items.length; i++) {\n\t\t\titems[i] = values[adjustIndex(stack.start + i)];\n\t\t}\n\t\treturn items;\n\t}\n\t\n\tpublic String stackToString(int stackNum) {\n\t\tint[] items = getStackValues(stackNum);\n\t\treturn stackNum + \": \" + AssortedMethods.arrayToString(items);\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_01_Three_in_One/QuestionA.java",
    "content": "package Q3_01_Three_in_One;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\tpublic static void printStacks(FixedMultiStack stacks) {\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(stacks.getValues()));\r\n\t}\r\n\t\r\n\tpublic static void main(String [] args) throws Exception  {\r\n\t\tFixedMultiStack stacks = new FixedMultiStack(4);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(0, 10);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(1, 20);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 30);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(1, 21);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(0, 11);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(0, 12);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.pop(0);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(2, 31);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(0, 13);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(1, 22);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(2, 31);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 32);\r\n\t\tprintStacks(stacks);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_01_Three_in_One/QuestionB.java",
    "content": "package Q3_01_Three_in_One;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\tpublic static void printStacks(MultiStack stacks) {\r\n\t\t//System.out.println(stacks.stackToString(0));\r\n\t\t//System.out.println(stacks.stackToString(1));\r\n\t\t//System.out.println(stacks.stackToString(2));\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(stacks.getValues()));\r\n\t}\r\n\t\r\n\tpublic static void main(String [] args) throws Exception  {\t\r\n\t\tMultiStack stacks = new MultiStack(3, 4);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(0, 10);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(1, 20);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 30);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(1, 21);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(0, 11);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(0, 12);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.pop(0);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(2, 31);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(0, 13);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(1, 22);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.push(2, 31);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 32);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 33);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 34);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tstacks.pop(1);\r\n\t\tprintStacks(stacks);\r\n\t\tstacks.push(2, 35);\r\n\t\tprintStacks(stacks);\r\n\t\t\r\n\t\tSystem.out.println(\"Final Stack: \" + AssortedMethods.arrayToString(stacks.getValues()));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_02_Stack_Min/NodeWithMin.java",
    "content": "package Q3_02_Stack_Min;\r\n\r\nclass NodeWithMin {\r\n    public int value;\r\n    public int min;\r\n    public NodeWithMin(int v, int min){\r\n        value = v;\r\n        this.min = min;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_02_Stack_Min/Question.java",
    "content": "package Q3_02_Stack_Min;\r\n\r\npublic class Question {\r\n\tpublic static void main(String[] args) {\r\n\t\tStackWithMin stack = new StackWithMin();\r\n\t\tStackWithMin2 stack2 = new StackWithMin2();\r\n\t\tint[] array = {2, 1, 3, 1};\r\n\t\tfor (int value : array) {\r\n\t\t\tstack.push(value);\r\n\t\t\tstack2.push(value);\r\n\t\t\tSystem.out.print(value + \", \");\r\n\t\t}\r\n\t\tSystem.out.println('\\n');\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tSystem.out.println(\"Popped \" + stack.pop().value + \", \" + stack2.pop());\r\n\t\t\tSystem.out.println(\"New min is \" + stack.min() + \", \" + stack2.min());\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_02_Stack_Min/StackWithMin.java",
    "content": "package Q3_02_Stack_Min;\r\n\r\nimport java.util.Stack;\r\n\r\npublic class StackWithMin extends Stack<NodeWithMin> {\r\n    public void push(int value) {\r\n        int newMin = Math.min(value, min());\r\n        super.push(new NodeWithMin(value, newMin));\r\n    }\r\n    \r\n    public int min() {\r\n    \tif (this.isEmpty()) {\r\n    \t\treturn Integer.MAX_VALUE;\r\n    \t} else {\r\n    \t\treturn peek().min;\r\n    \t}\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_02_Stack_Min/StackWithMin2.java",
    "content": "package Q3_02_Stack_Min;\r\n\r\nimport java.util.Stack;\r\n\r\npublic class StackWithMin2 extends Stack<Integer> {\r\n\tStack<Integer> s2;\r\n\t\r\n\tpublic StackWithMin2() {\r\n\t\ts2 = new Stack<Integer>();\t\t\r\n\t}\r\n\t\r\n\tpublic void push(int value){\r\n\t\tif (value <= min()) {\r\n\t\t\ts2.push(value);\r\n\t\t}\r\n\t\tsuper.push(value);\r\n\t}\r\n\t\r\n\tpublic Integer pop() {\r\n\t\tint value = super.pop();\r\n\t\tif (value == min()) {\r\n\t\t\ts2.pop();\t\t\t\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\t\r\n\tpublic int min() {\r\n\t\tif (s2.isEmpty()) {\r\n\t\t\treturn Integer.MAX_VALUE;\r\n\t\t} else {\r\n\t\t\treturn s2.peek();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_03_Stack_of_Plates/Node.java",
    "content": "package Q3_03_Stack_of_Plates;\r\n\r\npublic class Node {\r\n\tpublic Node above;\r\n\tpublic Node below;\r\n\tpublic int value;\r\n\tpublic Node(int value) {\r\n\t\tthis.value = value;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_03_Stack_of_Plates/Question.java",
    "content": "package Q3_03_Stack_of_Plates;\r\n\r\npublic class Question {\r\n\tpublic static void main(String[] args) {\r\n\t\tint capacity_per_substack = 5;\r\n\t\tSetOfStacks set = new SetOfStacks(capacity_per_substack);\r\n\t\tfor (int i = 0; i < 34; i++) {\r\n\t\t\tset.push(i);\r\n\t\t}\r\n\t\tfor (int i = 0; i < 35; i++) {\r\n\t\t\tSystem.out.println(\"Popped \" + set.pop());\r\n\t\t}\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_03_Stack_of_Plates/SetOfStacks.java",
    "content": "package Q3_03_Stack_of_Plates;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.EmptyStackException;\r\n\r\npublic class SetOfStacks {\r\n\tArrayList<Stack> stacks = new ArrayList<Stack>();\r\n\tpublic int capacity;\r\n\t\r\n\tpublic SetOfStacks(int capacity) { \r\n\t\tthis.capacity = capacity; \r\n\t}\r\n\t\r\n\tpublic Stack getLastStack() {\r\n\t\tif (stacks.size() == 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn stacks.get(stacks.size() - 1);\r\n\t}\r\n\t\r\n\tpublic void push(int v) {\r\n\t\tStack last = getLastStack();\r\n\t\tif (last != null && !last.isFull()) { // add to last\r\n\t\t\tlast.push(v);\r\n\t\t} else { // must create new stack\r\n\t\t\tStack stack = new Stack(capacity);\r\n\t\t\tstack.push(v);\r\n\t\t\tstacks.add(stack);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int pop() {\r\n\t\tStack last = getLastStack();\r\n\t\tif (last == null) throw new EmptyStackException();\r\n\t\tint v = last.pop();\r\n\t\tif (last.size == 0) {\r\n\t\t\tstacks.remove(stacks.size() - 1);\r\n\t\t}\r\n\t\treturn v;\r\n\t}\r\n\t\r\n\tpublic int popAt(int index) {\r\n\t\treturn leftShift(index, true);\r\n\t}\r\n\t\r\n\tpublic int leftShift(int index, boolean removeTop) {\r\n\t\tStack stack = stacks.get(index);\r\n\t\tint removed_item;\r\n\t\tif (removeTop) removed_item = stack.pop();\r\n\t\telse removed_item = stack.removeBottom();\r\n\t\tif (stack.isEmpty()) {\r\n\t\t\tstacks.remove(index);\r\n\t\t} else if (stacks.size() > index + 1) {\r\n\t\t\tint v = leftShift(index + 1, false);\r\n\t\t\tstack.push(v);\r\n\t\t}\r\n\t\treturn removed_item;\r\n\t}\r\n\t\r\n\tpublic boolean isEmpty() {\r\n\t\tStack last = getLastStack();\r\n\t\treturn last == null || last.isEmpty();\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_03_Stack_of_Plates/Stack.java",
    "content": "package Q3_03_Stack_of_Plates;\r\n\r\nimport java.util.EmptyStackException;\r\n\r\npublic class Stack {\r\n\tprivate int capacity;\r\n\tpublic Node top;\r\n\tpublic Node bottom;\r\n\tpublic int size = 0;\r\n\t\r\n\tpublic Stack(int capacity) { \r\n\t\tthis.capacity = capacity; \r\n\t}\r\n\t\r\n\tpublic boolean isFull() { \r\n\t\treturn capacity == size; \r\n\t}\r\n\t\r\n\tpublic void join(Node above, Node below) {\r\n\t\tif (below != null) below.above = above;\r\n\t\tif (above != null) above.below = below;\r\n\t}\r\n\t\r\n\tpublic boolean push(int v) {\r\n\t\tif (size >= capacity) return false;\r\n\t\tsize++;\r\n\t\tNode n = new Node(v);\r\n\t\tif (size == 1) bottom = n;\r\n\t\tjoin(n, top);\r\n\t\ttop = n;\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic int pop() {\r\n\t\tif (top == null) throw new EmptyStackException();\r\n\t\tNode t = top;\r\n\t\ttop = top.below;\r\n\t\tsize--;\r\n\t\treturn t.value;\r\n\t}\r\n\t\r\n\tpublic boolean isEmpty() { \r\n\t\treturn size == 0; \r\n\t}\r\n\t\r\n\tpublic int removeBottom() {\r\n\t\tNode b = bottom;\r\n\t\tbottom = bottom.above;\r\n\t\tif (bottom != null) bottom.below = null;\r\n\t\tsize--;\r\n\t\treturn b.value;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_04_Queue_via_Stacks/MyQueue.java",
    "content": "package Q3_04_Queue_via_Stacks;\r\n\r\nimport java.util.Stack;\r\n\r\npublic class MyQueue<T> {\r\n\tStack<T> stackNewest, stackOldest;\r\n\t\r\n\tpublic MyQueue() {\r\n\t\tstackNewest = new Stack<T>();\r\n\t\tstackOldest = new Stack<T>();\r\n\t}\r\n\t\r\n\tpublic int size() {\r\n\t\treturn stackNewest.size() + stackOldest.size();\r\n\t}\r\n\t\r\n\tpublic void add(T value) {\r\n\t\t// Push onto stack1\r\n\t\tstackNewest.push(value);\r\n\t}\r\n\t\r\n\t/* Move elements from stackNewest into stackOldest. This is usually done so that we can\r\n\t * do operations on stackOldest.\r\n\t */\r\n\tprivate void shiftStacks() {\r\n\t\tif (stackOldest.isEmpty()) { \r\n\t\t\twhile (!stackNewest.isEmpty()) {\r\n\t\t\t\tstackOldest.push(stackNewest.pop());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic T peek() {\r\n\t\tshiftStacks();\r\n\t\treturn stackOldest.peek(); // retrieve the oldest item.\r\n\t}\r\n\t\r\n\tpublic T remove() {\r\n\t\tshiftStacks();\r\n\t\treturn stackOldest.pop(); // pop the oldest item.\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_04_Queue_via_Stacks/Question.java",
    "content": "package Q3_04_Queue_via_Stacks;\r\n\r\nimport java.util.LinkedList;\r\nimport java.util.Queue;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\tpublic static void main(String[] args) {\r\n\t\tMyQueue<Integer> my_queue = new MyQueue<Integer>();\t\r\n\t\t\r\n\t\t// Let's test our code against a \"real\" queue\r\n\t\tQueue<Integer> test_queue = new LinkedList<Integer>();\r\n\t\t\r\n\t\tfor (int i = 0; i < 100; i++) {\r\n\t\t\tint choice = AssortedMethods.randomIntInRange(0, 10);\r\n\t\t\tif (choice <= 5) { // enqueue\r\n\t\t\t\tint element = AssortedMethods.randomIntInRange(1, 10);\r\n\t\t\t\ttest_queue.add(element);\r\n\t\t\t\tmy_queue.add(element);\r\n\t\t\t\tSystem.out.println(\"Enqueued \" + element);\r\n\t\t\t} else if (test_queue.size() > 0) {\r\n\t\t\t\tint top1 = test_queue.remove();\r\n\t\t\t\tint top2 = my_queue.remove();\r\n\t\t\t\tif (top1 != top2) { // Check for error\r\n\t\t\t\t\tSystem.out.println(\"******* FAILURE - DIFFERENT TOPS: \" + top1 + \", \" + top2);\r\n\t\t\t\t} \r\n\t\t\t\tSystem.out.println(\"Dequeued \" + top1);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (test_queue.size() == my_queue.size()) {\r\n\t\t\t\tif (test_queue.size() > 0 && test_queue.peek() != my_queue.peek()) {\r\n\t\t\t\t\tSystem.out.println(\"******* FAILURE - DIFFERENT TOPS: \" + test_queue.peek() + \", \" + my_queue.peek() + \" ******\");\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tSystem.out.println(\"******* FAILURE - DIFFERENT SIZES ******\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_05_Sort_Stack/Question.java",
    "content": "package Q3_05_Sort_Stack;\r\n\r\nimport java.util.Stack;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\tpublic static Stack<Integer> mergesort(Stack<Integer> inStack) {\r\n\t\tif (inStack.size() <= 1) {\r\n\t\t\treturn inStack;\r\n\t\t}\r\n\r\n\t\tStack<Integer> left = new Stack<Integer>();\r\n\t\tStack<Integer> right = new Stack<Integer>();\r\n\t\tint count = 0;\r\n\t\twhile (inStack.size() != 0) {\r\n\t\t\tcount++;\r\n\t\t\tif (count % 2 == 0) {\r\n\t\t\t\tleft.push(inStack.pop());\r\n\t\t\t} else {\r\n\t\t\t\tright.push(inStack.pop());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tleft = mergesort(left);\r\n\t\tright = mergesort(right);\r\n\r\n\t\twhile (left.size() > 0 || right.size() > 0) {\r\n\t\t\tif (left.size() == 0) {\r\n\t\t\t\tinStack.push(right.pop());\r\n\t\t\t} else if (right.size() == 0) {\r\n\t\t\t\tinStack.push(left.pop());\r\n\t\t\t} else if (right.peek().compareTo(left.peek()) <= 0) {\r\n\t\t\t\tinStack.push(left.pop());\r\n\t\t\t} else {\r\n\t\t\t\tinStack.push(right.pop());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tStack<Integer> reverseStack = new Stack<Integer>();\r\n\t\twhile (inStack.size() > 0) {\r\n\t\t\treverseStack.push(inStack.pop());\r\n\t\t}\r\n\r\n\t\treturn reverseStack;\r\n\t}\r\n\t\r\n\tpublic static void sort(Stack<Integer> s) {\r\n\t\tStack<Integer> r = new Stack<Integer>();\r\n\t\twhile(!s.isEmpty()) {\r\n\t\t\t/* Insert each element in s in sorted order into r. */\r\n\t\t\tint tmp = s.pop();\r\n\t\t\twhile(!r.isEmpty() && r.peek() > tmp) {\r\n\t\t\t\ts.push(r.pop());\r\n\t\t\t}\r\n\t\t\tr.push(tmp);\r\n\t\t}\r\n\t\t\r\n\t\t/* Copy the elements back. */\r\n\t\twhile (!r.isEmpty()) {\r\n\t\t\ts.push(r.pop());\r\n\t\t}\r\n\t}\r\n\t\t\r\n\tpublic static void main(String [] args) {\r\n\t\tStack<Integer> s = new Stack<Integer>();\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint r = AssortedMethods.randomIntInRange(0,  1000);\r\n\t\t\ts.push(r);\r\n\t\t}\r\n\t\t\r\n\t\tsort(s);\r\n\t\t\r\n\t\twhile(!s.isEmpty()) {\r\n\t\t\tSystem.out.println(s.pop());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_06_Animal_Shelter/Animal.java",
    "content": "package Q3_06_Animal_Shelter;\r\n\r\npublic abstract class Animal {\r\n\tprivate int order; \r\n\tprotected String name;\r\n\tpublic Animal(String n) {\r\n\t\tname = n;\r\n\t}\r\n\t\r\n\tpublic abstract String name();\r\n\t\r\n\tpublic void setOrder(int ord) {\r\n\t\torder = ord;\r\n\t}\r\n\t\r\n\tpublic int getOrder() {\r\n\t\treturn order;\r\n\t}\r\n\t\r\n\tpublic boolean isOlderThan(Animal a) {\r\n\t\treturn this.order < a.getOrder();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_06_Animal_Shelter/AnimalQueue.java",
    "content": "package Q3_06_Animal_Shelter;\r\n\r\nimport java.util.LinkedList;\r\n\r\npublic class AnimalQueue {\r\n\tLinkedList<Dog> dogs = new LinkedList<Dog>();\r\n\tLinkedList<Cat> cats = new LinkedList<Cat>();\r\n\tprivate int order = 0;\r\n\t\r\n\tpublic void enqueue(Animal a) {\r\n\t\ta.setOrder(order);\r\n\t\torder++;\r\n\t\tif (a instanceof Dog) {\r\n\t\t\tdogs.addLast((Dog) a);\r\n\t\t} else if (a instanceof Cat) {\r\n\t\t\tcats.addLast((Cat)a);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Animal dequeueAny() {\r\n\t\tif (dogs.size() == 0) {\r\n\t\t\treturn dequeueCats();\r\n\t\t} else if (cats.size() == 0) {\r\n\t\t\treturn dequeueDogs();\r\n\t\t}\r\n\t\tDog dog = dogs.peek();\r\n\t\tCat cat = cats.peek();\r\n\t\tif (dog.isOlderThan(cat)) {\r\n\t\t\treturn dogs.poll();\r\n\t\t} else {\r\n\t\t\treturn cats.poll();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Animal peek() {\r\n\t\tif (dogs.size() == 0) {\r\n\t\t\treturn cats.peek();\r\n\t\t} else if (cats.size() == 0) {\r\n\t\t\treturn dogs.peek();\r\n\t\t}\r\n\t\tDog dog = dogs.peek();\r\n\t\tCat cat = cats.peek();\r\n\t\tif (dog.isOlderThan(cat)) {\r\n\t\t\treturn dog;\r\n\t\t} else {\r\n\t\t\treturn cat;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int size() {\r\n\t\treturn dogs.size() + cats.size();\r\n\t}\r\n\t\r\n\tpublic Dog dequeueDogs() {\r\n\t\treturn dogs.poll();\r\n\t}\r\n\t\r\n\tpublic Dog peekDogs() {\r\n\t\treturn dogs.peek();\r\n\t}\r\n\t\r\n\tpublic Cat dequeueCats() {\r\n\t\treturn cats.poll();\r\n\t}\r\n\t\r\n\tpublic Cat peekCats() {\r\n\t\treturn cats.peek();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_06_Animal_Shelter/Cat.java",
    "content": "package Q3_06_Animal_Shelter;\r\n\r\npublic class Cat extends Animal {\r\n\tpublic Cat(String n) {\r\n\t\tsuper(n);\r\n\t}\r\n\t\r\n\tpublic String name() {\r\n\t\treturn \"Cat: \" + name;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_06_Animal_Shelter/Dog.java",
    "content": "package Q3_06_Animal_Shelter;\r\n\r\npublic class Dog extends Animal {\r\n\tpublic Dog(String n) {\r\n\t\tsuper(n);\r\n\t}\r\n\t\r\n\tpublic String name() {\r\n\t\treturn \"Dog: \" + name;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 03. Stacks and Queues/Q3_06_Animal_Shelter/Question.java",
    "content": "package Q3_06_Animal_Shelter;\r\n\r\npublic class Question {\r\n\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tAnimalQueue animals = new AnimalQueue();\r\n\t\tanimals.enqueue(new Cat(\"Callie\"));\r\n\t\tanimals.enqueue(new Cat(\"Kiki\"));\r\n\t\tanimals.enqueue(new Dog(\"Fido\"));\r\n\t\tanimals.enqueue(new Dog(\"Dora\"));\r\n\t\tanimals.enqueue(new Cat(\"Kari\"));\r\n\t\tanimals.enqueue(new Dog(\"Dexter\"));\r\n\t\tanimals.enqueue(new Dog(\"Dobo\"));\r\n\t\tanimals.enqueue(new Cat(\"Copa\"));\r\n\t\t\r\n\t\tSystem.out.println(animals.dequeueAny().name());\t\r\n\t\tSystem.out.println(animals.dequeueAny().name());\t\r\n\t\tSystem.out.println(animals.dequeueAny().name());\t\r\n\t\t\r\n\t\tanimals.enqueue(new Dog(\"Dapa\"));\r\n\t\tanimals.enqueue(new Cat(\"Kilo\"));\r\n\t\t\r\n\t\twhile (animals.size() != 0) {\r\n\t\t\tSystem.out.println(animals.dequeueAny().name());\t\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Introduction/Traversals.java",
    "content": "package Introduction;\n\nimport CtCILibrary.TreeNode;\n\npublic class Traversals {\n\tpublic static void visit(TreeNode node) {\n\t\tif (node != null) {\n\t\t\tSystem.out.println(node.data);\n\t\t}\n\t}\n\t\n\tpublic static void inOrderTraversal(TreeNode node) {\n\t\tif (node != null) {\n\t\t\tinOrderTraversal(node.left);\n\t\t\tvisit(node);\n\t\t\tinOrderTraversal(node.right);\n\t\t}\n\t}\n\t\n\tpublic static void preOrderTraversal(TreeNode node) {\n\t\tif (node != null) {\n\t\t\tvisit(node);\n\t\t\tinOrderTraversal(node.left);\n\t\t\tinOrderTraversal(node.right);\n\t\t}\n\t}\n\t\n\tpublic static void postOrderTraversal(TreeNode node) {\n\t\tif (node != null) {\n\t\t\tinOrderTraversal(node.left);\n\t\t\tinOrderTraversal(node.right);\n\t\t\tvisit(node);\n\t\t}\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\n\t\t\n\t\t// We needed this code for other files, so check out the code in the library\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\n\t\tinOrderTraversal(root);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_01_Route_Between_Nodes/Graph.java",
    "content": "package Q4_01_Route_Between_Nodes;\r\n\r\npublic class Graph {\r\n\tpublic static int MAX_VERTICES = 6;\r\n\tprivate Node vertices[];\r\n\tpublic int count;\r\n\tpublic Graph() {\r\n\t\tvertices = new Node[MAX_VERTICES];\r\n\t\tcount = 0;\r\n    }\r\n\t\r\n    public void addNode(Node x) {\r\n\t\tif (count < vertices.length) {\r\n\t\t\tvertices[count] = x;\r\n\t\t\tcount++;\r\n\t\t} else {\r\n\t\t\tSystem.out.print(\"Graph full\");\r\n\t\t}\r\n    }\r\n    \r\n    public Node[] getNodes() {\r\n        return vertices;\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_01_Route_Between_Nodes/Node.java",
    "content": "package Q4_01_Route_Between_Nodes;\r\n\r\nclass Node {\r\n    private Node adjacent[];\r\n    public int adjacentCount;\r\n    private String vertex;\r\n    public Question.State state;\r\n    public Node(String vertex, int adjacentLength) {\r\n        this.vertex = vertex;                \r\n        adjacentCount = 0;        \r\n        adjacent = new Node[adjacentLength];\r\n    }\r\n    \r\n    public void addAdjacent(Node x) {\r\n        if (adjacentCount < adjacent.length) {\r\n            this.adjacent[adjacentCount] = x;\r\n            adjacentCount++;\r\n        } else {\r\n            System.out.print(\"No more adjacent can be added\");\r\n        }\r\n    }\r\n    public Node[] getAdjacent() {\r\n        return adjacent;\r\n    }\r\n    public String getVertex() {\r\n        return vertex;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_01_Route_Between_Nodes/Question.java",
    "content": "package Q4_01_Route_Between_Nodes;\r\n\r\nimport java.util.LinkedList;\r\n\r\npublic class Question {\r\n\tpublic enum State {\r\n\t\tUnvisited, Visited, Visiting;\r\n\t} \r\n\r\n\tpublic static void main(String a[])\r\n\t{\r\n\t\tGraph g = createNewGraph();\r\n\t\tNode[] n = g.getNodes();\r\n\t\tNode start = n[3];\r\n\t\tNode end = n[5];\r\n\t\tSystem.out.println(search(g, start, end));\r\n\t}\r\n\t\r\n\tpublic static Graph createNewGraph()\r\n\t{\r\n\t\tGraph g = new Graph();        \r\n\t\tNode[] temp = new Node[6];\r\n\r\n\t\ttemp[0] = new Node(\"a\", 3);\r\n\t\ttemp[1] = new Node(\"b\", 0);\r\n\t\ttemp[2] = new Node(\"c\", 0);\r\n\t\ttemp[3] = new Node(\"d\", 1);\r\n\t\ttemp[4] = new Node(\"e\", 1);\r\n\t\ttemp[5] = new Node(\"f\", 0);\r\n\r\n\t\ttemp[0].addAdjacent(temp[1]);\r\n\t\ttemp[0].addAdjacent(temp[2]);\r\n\t\ttemp[0].addAdjacent(temp[3]);\r\n\t\ttemp[3].addAdjacent(temp[4]);\r\n\t\ttemp[4].addAdjacent(temp[5]);\r\n\t\tfor (int i = 0; i < 6; i++) {\r\n\t\t\tg.addNode(temp[i]);\r\n\t\t}\r\n\t\treturn g;\r\n\t}\r\n\r\n    public static boolean search(Graph g,Node start,Node end) {  \r\n        LinkedList<Node> q = new LinkedList<Node>();\r\n        for (Node u : g.getNodes()) {\r\n            u.state = State.Unvisited;\r\n        }\r\n        start.state = State.Visiting;\r\n        q.add(start);\r\n        Node u;\r\n        while(!q.isEmpty()) {\r\n            u = q.removeFirst();\r\n            if (u != null) {\r\n\t            for (Node v : u.getAdjacent()) {\r\n\t                if (v.state == State.Unvisited) {\r\n\t                    if (v == end) {\r\n\t                        return true;\r\n\t                    } else {\r\n\t                        v.state = State.Visiting;\r\n\t                        q.add(v);\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\t            u.state = State.Visited;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_02_Minimal_Tree/Question.java",
    "content": "package Q4_02_Minimal_Tree;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class Question {\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\t\r\n\t\t// We needed this code for other files, so check out the code in the library\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tSystem.out.println(\"Root? \" + root.data);\r\n\t\tSystem.out.println(\"Created BST? \" + root.isBST());\r\n\t\tSystem.out.println(\"Height: \" + root.height());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_03_List_of_Depths/QuestionBFS.java",
    "content": "package Q4_03_List_of_Depths;\r\n\r\nimport CtCILibrary.*;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Iterator;\r\nimport java.util.LinkedList;\r\n\r\npublic class QuestionBFS {\r\n\r\n\tpublic static ArrayList<LinkedList<TreeNode>> createLevelLinkedList(TreeNode root) {\r\n\t\tArrayList<LinkedList<TreeNode>> result = new ArrayList<LinkedList<TreeNode>>();\r\n\t\t\r\n\t\t/* \"Visit\" the root */\r\n\t\tLinkedList<TreeNode> current = new LinkedList<TreeNode>();\r\n\t\tif (root != null) {\r\n\t\t\tcurrent.add(root);\r\n\t\t}\r\n\t\t\r\n\t\twhile (current.size() > 0) {\r\n\t\t\tresult.add(current); // Add previous level\r\n\t\t\tLinkedList<TreeNode> parents = current; // Go to next level\r\n\t\t\tcurrent = new LinkedList<TreeNode>(); \r\n\t\t\tfor (TreeNode parent : parents) {\r\n\t\t\t\t/* Visit the children */\r\n\t\t\t\tif (parent.left != null) {\r\n\t\t\t\t\tcurrent.add(parent.left);\r\n\t\t\t\t}\r\n\t\t\t\tif (parent.right != null) {\r\n\t\t\t\t\tcurrent.add(parent.right);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static void printResult(ArrayList<LinkedList<TreeNode>> result){\r\n\t\tint depth = 0;\r\n\t\tfor(LinkedList<TreeNode> entry : result) {\r\n\t\t\tIterator<TreeNode> i = entry.listIterator();\r\n\t\t\tSystem.out.print(\"Link list at depth \" + depth + \":\");\r\n\t\t\twhile(i.hasNext()){\r\n\t\t\t\tSystem.out.print(\" \" + ((TreeNode)i.next()).data);\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t\tdepth++;\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] nodes_flattened = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = AssortedMethods.createTreeFromArray(nodes_flattened);\r\n\t\tArrayList<LinkedList<TreeNode>> list = createLevelLinkedList(root);\r\n\t\tprintResult(list);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_03_List_of_Depths/QuestionDFS.java",
    "content": "package Q4_03_List_of_Depths;\r\n\r\nimport CtCILibrary.*;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Iterator;\r\nimport java.util.LinkedList;\r\n\r\npublic class QuestionDFS {\r\n\r\n\tpublic static void createLevelLinkedList(TreeNode root, ArrayList<LinkedList<TreeNode>> lists, int level) {\r\n\t\tif (root == null) return;\r\n\t\tLinkedList<TreeNode> list = null;\r\n\t\tif (lists.size() == level) { // Level not contained in list\r\n\t\t\tlist = new LinkedList<TreeNode>();\r\n\t\t\t/* Levels are always traversed in order. So, if this is the first time we've visited level i,\r\n\t\t\t * we must have seen levels 0 through i - 1. We can therefore safely add the level at the end. */\r\n\t\t\tlists.add(list);  \r\n\t\t} else {\r\n\t\t\tlist = lists.get(level);\r\n\t\t}\r\n\t\tlist.add(root);\r\n\t\tcreateLevelLinkedList(root.left, lists, level + 1);\r\n\t\tcreateLevelLinkedList(root.right, lists, level + 1);\r\n\t}\r\n\t\r\n\tpublic static ArrayList<LinkedList<TreeNode>> createLevelLinkedList(TreeNode root) {\r\n\t\tArrayList<LinkedList<TreeNode>> lists = new ArrayList<LinkedList<TreeNode>>();\r\n\t\tcreateLevelLinkedList(root, lists, 0);\r\n\t\treturn lists;\r\n\t}\t\r\n\t\r\n\tpublic static void printResult(ArrayList<LinkedList<TreeNode>> result){\r\n\t\tint depth = 0;\r\n\t\tfor(LinkedList<TreeNode> entry : result) {\r\n\t\t\tIterator<TreeNode> i = entry.listIterator();\r\n\t\t\tSystem.out.print(\"Link list at depth \" + depth + \":\");\r\n\t\t\twhile(i.hasNext()){\r\n\t\t\t\tSystem.out.print(\" \" + ((TreeNode)i.next()).data);\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t\tdepth++;\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] nodes_flattened = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = AssortedMethods.createTreeFromArray(nodes_flattened);\r\n\t\tArrayList<LinkedList<TreeNode>> list = createLevelLinkedList(root);\r\n\t\tprintResult(list);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_04_Check_Balanced/QuestionBrute.java",
    "content": "package Q4_04_Check_Balanced;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionBrute {\r\n\t\r\n\tpublic static int getHeight(TreeNode root) {\r\n\t\tif (root == null) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\treturn Math.max(getHeight(root.left), getHeight(root.right)) + 1;\r\n\t}\r\n\t\t\r\n\tpublic static boolean isBalanced(TreeNode root) {\r\n\t\tif (root == null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tint heightDiff = getHeight(root.left) - getHeight(root.right);\r\n\t\tif (Math.abs(heightDiff) > 1) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn isBalanced(root.left) && isBalanced(root.right);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\t// Create balanced tree\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tSystem.out.println(\"Root? \" + root.data);\r\n\t\tSystem.out.println(\"Is balanced? \" + isBalanced(root));\r\n\t\t\r\n\t\t// Could be balanced, actually, but it's very unlikely...\r\n\t\tTreeNode unbalanced = new TreeNode(10);\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tunbalanced.insertInOrder(AssortedMethods.randomIntInRange(0, 100));\r\n\t\t}\r\n\t\tSystem.out.println(\"Root? \" + unbalanced.data);\r\n\t\tSystem.out.println(\"Is balanced? \" + isBalanced(unbalanced));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_04_Check_Balanced/QuestionImproved.java",
    "content": "package Q4_04_Check_Balanced;\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionImproved {\r\n\t\t\r\n\tpublic static int checkHeight(TreeNode root) {\r\n\t\tif (root == null) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tint leftHeight = checkHeight(root.left);\r\n\t\tif (leftHeight == Integer.MIN_VALUE) return Integer.MIN_VALUE; // Propagate error up\r\n\t\t\r\n\t\tint rightHeight = checkHeight(root.right);\r\n\t\tif (rightHeight == Integer.MIN_VALUE) return Integer.MIN_VALUE; // Propagate error up\r\n\t\t\r\n\t\tint heightDiff = leftHeight - rightHeight;\r\n\t\tif (Math.abs(heightDiff) > 1) {\r\n\t\t\treturn Integer.MIN_VALUE; // Found error -> pass it back\r\n\t\t} else {\r\n\t\t\treturn Math.max(leftHeight, rightHeight) + 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static boolean isBalanced(TreeNode root) {\r\n\t\treturn checkHeight(root) != Integer.MIN_VALUE;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\t// Create balanced tree\r\n\t\tint[] array = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\r\n\t\t\r\n\t\tSystem.out.println(\"Is balanced? \" + isBalanced(root));\r\n\t\t\r\n\t\troot.insertInOrder(4); // Add 4 to make it unbalanced\r\n\r\n\t\tSystem.out.println(\"Is balanced? \" + isBalanced(root));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_05_Validate_BST/IntWrapper.java",
    "content": "package Q4_05_Validate_BST;\r\n\r\npublic class IntWrapper {\r\n\tpublic IntWrapper(int m) {\r\n\t\tdata = m;\r\n\t}\r\n\tpublic int data;\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_05_Validate_BST/Question.java",
    "content": "package Q4_05_Validate_BST;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class Question {\r\n\tpublic static Integer lastPrinted = null;\r\n\r\n\tpublic static boolean checkBST(TreeNode node) {\r\n\t\treturn checkBST(node, true);\r\n\t}\r\n\r\n\t// Allow \"equal\" value only for left child. This validates the BST property.\r\n\tpublic static boolean checkBST(TreeNode n, boolean isLeft) {\r\n\t\tif (n == null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\t// Check / recurse left\r\n\t\tif (!checkBST(n.left, true)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\t// Check current\r\n\t\tif (lastPrinted != null) {\r\n\t\t\tif (isLeft) {\r\n\t\t\t\t// left child \"is allowed\" be equal to parent.\r\n\t\t\t\tif (n.data < lastPrinted) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// Right child \"is not allowed\" be equal to parent.\r\n\t\t\t\tif (n.data <= lastPrinted) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tlastPrinted = n.data;\r\n\t\t\r\n\t\t// Check / recurse right\r\n\t\tif (!checkBST(n.right, false)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {Integer.MIN_VALUE, Integer.MAX_VALUE - 2, Integer.MAX_VALUE - 1, Integer.MAX_VALUE};\r\n\t\tTreeNode node = TreeNode.createMinimalBST(array);\r\n\t\t//node.left.data = 5;\r\n\t\t//node.left.right.data = 3;\r\n\t\tSystem.out.println(checkBST(node));\r\n\r\n\t\ttest();\r\n\t}\r\n\r\n\tpublic static void test() {\r\n\t\tTreeNode node;\r\n\t\tboolean condition;\r\n\t\tSystem.out.println(\"test cases for equals condition.\");\r\n\r\n\t\t/* Expect true: for left child: node.data <= last_printed.\r\n   2\r\n  / \\\r\n /   \\\r\n 2   3\r\n      \\\r\n      4\r\n\t\t*/\r\n\t\tint[] array2 = {1, 2, 3, 4};\r\n\t\tnode = TreeNode.createMinimalBST(array2);\r\n\t\tnode.left.data = 2;\r\n\t\tnode.print();\r\n\t\tlastPrinted = null;\r\n\t\tcondition = checkBST(node);\r\n\t\tSystem.out.println(\"should be true: \" + condition);\r\n\r\n\t\t/* Expect false: for right child: node.data <= last_printed.\r\n   2\r\n  / \\\r\n /   \\\r\n 1   2\r\n      \\\r\n      4\r\n\t\t */\r\n\t\tint[] array3 = {1, 2, 3, 4};\r\n\t\tnode = TreeNode.createMinimalBST(array3);\r\n\t\tnode.right.data = 2;\r\n\t\tnode.print();\r\n\t\tlastPrinted = null;\r\n\t\tcondition = checkBST(node);\r\n\t\tSystem.out.println(\"should be false: \" + condition);\r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_05_Validate_BST/QuestionB.java",
    "content": "package Q4_05_Validate_BST;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionB {\r\n\tpublic static boolean checkBST(TreeNode n, Integer min, Integer max) {\r\n\t\tif (n == null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif ((min != null && n.data <= min) || (max != null && n.data > max)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!checkBST(n.left, min, n.data) ||\r\n\t\t\t!checkBST(n.right, n.data, max)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\t\r\n\tpublic static boolean checkBST(TreeNode n) {\r\n\t\treturn checkBST(n, null, null);\r\n\t}\r\n\t\r\n\tpublic static boolean checkBSTAlternate(TreeNode n) {\r\n\t\treturn checkBSTAlternate(n, new IntWrapper(0), new IntWrapper(0));\r\n\t}\t\t\r\n\r\n\tpublic static boolean checkBSTAlternate(TreeNode n, IntWrapper min, IntWrapper max) {\r\n\t\t/* An alternate, less clean approach. This is not provided in the book, but is used to test the other method. */\r\n\t\tif (n.left == null) {\r\n\t\t\tmin.data = n.data;\r\n\t\t} else {\r\n\t\t\tIntWrapper leftMin = new IntWrapper(0);\r\n\t\t\tIntWrapper leftMax = new IntWrapper(0);\r\n\t\t\tif (!checkBSTAlternate(n.left, leftMin, leftMax)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (leftMax.data > n.data) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tmin.data = leftMin.data;\r\n\t\t}\r\n\t\tif (n.right == null) {\r\n\t\t\tmax.data = n.data;\r\n\t\t} else {\r\n\t\t\tIntWrapper rightMin = new IntWrapper(0);\r\n\t\t\tIntWrapper rightMax = new IntWrapper(0);\r\n\t\t\tif (!checkBSTAlternate(n.right, rightMin, rightMax)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (rightMin.data <= n.data) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tmax.data = rightMax.data;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/* Create a tree that may or may not be a BST */\r\n\tpublic static TreeNode createTestTree() {\r\n\t\t/* Create a random BST */\r\n\t\tTreeNode head = AssortedMethods.randomBST(10, -10, 10); \r\n\t\t\r\n\t\t/* Insert an element into the BST and potentially ruin the BST property */\r\n\t\tTreeNode node = head;\r\n\t\tdo {\r\n\t\t\tint n = AssortedMethods.randomIntInRange(-10, 10);\r\n\t\t\tint rand = AssortedMethods.randomIntInRange(0, 5);\r\n\t\t\tif (rand == 0) {\r\n\t\t\t\tnode.data = n;\r\n\t\t\t} else if (rand == 1) {\r\n\t\t\t\tnode = node.left;\r\n\t\t\t} else if (rand == 2) {\r\n\t\t\t\tnode = node.right;\r\n\t\t\t} else if (rand == 3 || rand == 4) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} while (node != null);\t\r\n\t\t\r\n\t\treturn head;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\t/* Simple test -- create one */\r\n\t\tint[] array = {Integer.MIN_VALUE, 3, 5, 6, 10, 13, 15, Integer.MAX_VALUE};\r\n\t\tTreeNode node = TreeNode.createMinimalBST(array);\r\n\t\t//node.left.data = 6; // \"ruin\" the BST property by changing one of the elements\r\n\t\tnode.print();\r\n\t\tboolean isBst = checkBST(node);\r\n\t\tSystem.out.println(isBst);\r\n\t\t\r\n\t\t/* More elaborate test -- creates 100 trees (some BST, some not) and compares the outputs of various methods. */\r\n\t\t/*for (int i = 0; i < 100; i++) {\r\n\t\t\tTreeNode head = createTestTree();\r\n\t\t\t\r\n\t\t\t// Compare results \r\n\t\t\tboolean isBst1 = checkBST(head);\r\n\t\t\tboolean isBst2 = checkBSTAlternate(head);\r\n\t\t\t\r\n\t\t\tif (isBst1 != isBst2) {\r\n\t\t\t\tSystem.out.println(\"*********************** ERROR *******************\");\r\n\t\t\t\thead.print();\r\n\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\tSystem.out.println(isBst1 + \" | \" + isBst2);\r\n\t\t\t\thead.print();\r\n\t\t\t}\r\n\t\t}*/\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_06_Successor/Question.java",
    "content": "package Q4_06_Successor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class Question {\r\n\r\n\tpublic static TreeNode inorderSucc(TreeNode n) { \r\n\t\tif (n == null) return null;\r\n\t\t\r\n\t\t// Found right children -> return left most node of right subtree\r\n\t\tif (n.parent == null || n.right != null) { \r\n\t\t\treturn leftMostChild(n.right); \r\n\t\t} else { \r\n\t\t\tTreeNode q = n;\r\n\t\t\tTreeNode x = q.parent;\r\n\t\t\t// Go up until we're on left instead of right\r\n\t\t\twhile (x != null && x.left != q) {\r\n\t\t\t\tq = x;\r\n\t\t\t\tx = x.parent;\r\n\t\t\t}\r\n\t\t\treturn x;\r\n\t\t}  \r\n\t} \r\n\t\t\r\n\tpublic static TreeNode leftMostChild(TreeNode n) {\r\n\t\tif (n == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\twhile (n.left != null) {\r\n\t\t\tn = n.left; \r\n\t\t}\r\n\t\treturn n; \r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tTreeNode node = root.find(array[i]);\r\n\t\t\tTreeNode next = inorderSucc(node);\r\n\t\t\tif (next != null) {\r\n\t\t\t\tSystem.out.println(node.data + \"->\" + next.data);\r\n\t\t\t} else {\r\n\t\t\t\tSystem.out.println(node.data + \"->\" + null);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_07_Build_Order/DFS/Graph.java",
    "content": "package Q4_07_Build_Order.DFS;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class Graph {\n\tprivate ArrayList<Project> nodes = new ArrayList<Project>();\n\tprivate HashMap<String, Project> map = new HashMap<String, Project>();\n\t\n\tpublic Project getOrCreateNode(String name) {\n\t\tif (!map.containsKey(name)) {\n\t\t\tProject node = new Project(name);\n\t\t\tnodes.add(node);\n\t\t\tmap.put(name, node);\n\t\t}\n\t\t\n\t\treturn map.get(name);\n\t}\n\t\n\tpublic void addEdge(String startName, String endName) {\n\t\tProject start = getOrCreateNode(startName);\n\t\tProject end = getOrCreateNode(endName);\n\t\tstart.addNeighbor(end);\n\t}\n\t\n\tpublic ArrayList<Project> getNodes() {\n\t\treturn nodes;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_07_Build_Order/DFS/Project.java",
    "content": "package Q4_07_Build_Order.DFS;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class Project {\n\tpublic enum State {COMPLETE, PARTIAL, BLANK};\n\tprivate ArrayList<Project> children = new ArrayList<Project>();\n\tprivate HashMap<String, Project> map = new HashMap<String, Project>();\n\tprivate String name;\n\tprivate State state = State.BLANK;\n\t\n\tpublic Project(String n) {\n\t\tname = n;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic void addNeighbor(Project node) {\n\t\tif (!map.containsKey(node.getName())) {\n\t\t\tchildren.add(node);\n\t\t\tmap.put(node.getName(), node);\n\t\t}\n\t}\n\t\n\tpublic State getState() { \n\t\treturn state;\n\t}\n\t\n\tpublic void setState(State st) {\n\t\tstate = st;\n\t}\n\t\n\tpublic ArrayList<Project> getChildren() {\n\t\treturn children;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_07_Build_Order/DFS/Question.java",
    "content": "package Q4_07_Build_Order.DFS;\n\nimport java.util.ArrayList;\nimport java.util.Stack;\n\npublic class Question {\n\n\t/* Build the graph, adding the edge (a, b) if b is dependent on a. \n\t * Assumes a pair is listed in “build order” (which is the reverse \n\t * of dependency order). The pair (a, b) in dependencies indicates\n\t * that b depends on a and a must be built before a. */\n\tpublic static Graph buildGraph(String[] projects, String[][] dependencies) {\n\t\tGraph graph = new Graph();\n\t\t\n\t\tfor (String[] dependency : dependencies) {\n\t\t\tString first = dependency[0];\n\t\t\tString second = dependency[1];\n\t\t\tgraph.addEdge(first, second);\n\t\t}\n\t\t\n\t\treturn graph;\n\t}\n\t\n\tpublic static boolean doDFS(Project project, Stack<Project> stack) {\n\t\tif (project.getState() == Project.State.PARTIAL) {\n\t\t\treturn false; // Cycle\n\t\t}\n\t\t\n\t\tif (project.getState() == Project.State.BLANK) {\n\t\t\tproject.setState(Project.State.PARTIAL);\n\t\t\tArrayList<Project> children = project.getChildren();\n\t\t\tfor (Project child : children) {\n\t\t\t\tif (!doDFS(child, stack)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tproject.setState(Project.State.COMPLETE);\n\t\t\tstack.push(project);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static Stack<Project> orderProjects(ArrayList<Project> projects) {\n\t\tStack<Project> stack = new Stack<Project>();\n\t\tfor (Project project : projects) {\n\t\t\tif (project.getState() == Project.State.BLANK) {\n\t\t\t\tif (!doDFS(project, stack)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn stack;\n\t}\n\t\n\tpublic static String[] convertToStringList(Stack<Project> projects) {\n\t\tString[] buildOrder = new String[projects.size()];\n\t\tfor (int i = 0; i < buildOrder.length; i++) {\n\t\t\tbuildOrder[i] = projects.pop().getName();\n\t\t}\n\t\treturn buildOrder;\n\t}\n\t\n\tpublic static Stack<Project> findBuildOrder(String[] projects, String[][] dependencies) {\n\t\tGraph graph = buildGraph(projects, dependencies);\n\t\treturn orderProjects(graph.getNodes());\n\t}\n\t\n\tpublic static String[] buildOrderWrapper(String[] projects, String[][] dependencies) {\n\t\tStack<Project> buildOrder = findBuildOrder(projects, dependencies);\n\t\tif (buildOrder == null) return null;\n\t\tString[] buildOrderString = convertToStringList(buildOrder);\n\t\treturn buildOrderString;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[] projects = {\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\"};\n\t\tString[][] dependencies = {\n\t\t\t\t{\"a\", \"b\"},\n\t\t\t\t{\"b\", \"c\"},\n\t\t\t\t{\"a\", \"c\"},\n\t\t\t\t{\"d\", \"e\"},\n\t\t\t\t{\"b\", \"d\"},\n\t\t\t\t{\"e\", \"f\"},\n\t\t\t\t{\"a\", \"f\"},\n\t\t\t\t{\"h\", \"i\"},\n\t\t\t\t{\"h\", \"j\"},\n\t\t\t\t{\"i\", \"j\"},\n\t\t\t\t{\"g\", \"j\"}};\n\t\tString[] buildOrder = buildOrderWrapper(projects, dependencies);\n\t\tif (buildOrder == null) {\n\t\t\tSystem.out.println(\"Circular Dependency.\");\n\t\t} else {\n\t\t\tfor (String s : buildOrder) {\n\t\t\t\tSystem.out.println(s);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_07_Build_Order/EdgeRemoval/Graph.java",
    "content": "package Q4_07_Build_Order.EdgeRemoval;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class Graph {\n\tprivate ArrayList<Project> nodes = new ArrayList<Project>();\n\tprivate HashMap<String, Project> map = new HashMap<String, Project>();\n\t\n\tpublic Project getOrCreateNode(String name) {\n\t\tif (!map.containsKey(name)) {\n\t\t\tProject node = new Project(name);\n\t\t\tnodes.add(node);\n\t\t\tmap.put(name, node);\n\t\t}\n\t\t\n\t\treturn map.get(name);\n\t}\n\t\n\tpublic void addEdge(String startName, String endName) {\n\t\tProject start = getOrCreateNode(startName);\n\t\tProject end = getOrCreateNode(endName);\n\t\tstart.addNeighbor(end);\n\t}\n\t\n\tpublic ArrayList<Project> getNodes() {\n\t\treturn nodes;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_07_Build_Order/EdgeRemoval/Project.java",
    "content": "package Q4_07_Build_Order.EdgeRemoval;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class Project {\n\tprivate ArrayList<Project> children = new ArrayList<Project>();\n\tprivate HashMap<String, Project> map = new HashMap<String, Project>();\n\tprivate String name;\n\tprivate int dependencies = 0;\n\t\n\tpublic Project(String n) {\n\t\tname = n;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic void addNeighbor(Project node) {\n\t\tif (!map.containsKey(node.getName())) {\n\t\t\tchildren.add(node);\n\t\t\tmap.put(node.getName(), node);\n\t\t\tnode.incrementDependencies();\n\t\t}\n\t}\n\t\n\tpublic void incrementDependencies() {\n\t\tdependencies++;\n\t}\n\t\n\tpublic ArrayList<Project> getChildren() {\n\t\treturn children;\n\t}\n\t\n\tpublic void decrementDependencies() {\n\t\tdependencies--;\n\t}\n\t\n\tpublic int getNumberDependencies() {\n\t\treturn dependencies;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_07_Build_Order/EdgeRemoval/Question.java",
    "content": "package Q4_07_Build_Order.EdgeRemoval;\n\nimport java.util.ArrayList;\n\npublic class Question {\n\n\t/* Build the graph, adding the edge (a, b) if b is dependent on a. \n\t * Assumes a pair is listed in “build order”. The pair (a, b) in \n\t * dependencies indicates that b depends on a and a must be built\n\t * before b. */\n\tpublic static Graph buildGraph(String[] projects, String[][] dependencies) {\n\t\tGraph graph = new Graph();\n\t\tfor (String project : projects) {\n\t\t\tgraph.getOrCreateNode(project);\n\t\t}\n\t\t\n\t\tfor (String[] dependency : dependencies) {\n\t\t\tString first = dependency[0];\n\t\t\tString second = dependency[1];\n\t\t\tgraph.addEdge(first, second);\n\t\t}\n\t\t\n\t\treturn graph;\n\t}\n\t\n\t/* A helper function to insert projects with zero dependencies \n\t * into the order array, starting at index offset. */\n\tpublic static int addNonDependent(Project[] order, ArrayList<Project> projects, int offset) {\n\t\tfor (Project project : projects) {\n\t\t\tif (project.getNumberDependencies() == 0) {\n\t\t\t\torder[offset] = project;\n\t\t\t\toffset++;\n\t\t\t}\n\t\t}\n\t\treturn offset;\n\t}\n\t\n\tpublic static Project[] orderProjects(ArrayList<Project> projects) {\n\t\tProject[] order = new Project[projects.size()];\n\t\t\n\t\t/* Add “roots” to the build order first.*/\n\t\tint endOfList = addNonDependent(order, projects, 0);\n\t\t\n\t\tint toBeProcessed = 0;\n\t\twhile (toBeProcessed < order.length) {\n\t\t\tProject current = order[toBeProcessed];\n\t\t\t\n\t\t\t/* We have a circular dependency since there are no remaining\n\t\t\t * projects with zero dependencies. */ \n\t\t\tif (current == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove myself as a dependency. */\n\t\t\tArrayList<Project> children = current.getChildren();\n\t\t\tfor (Project child : children) {\n\t\t\t\tchild.decrementDependencies();\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\t/* Add children that have no one depending on them. */\n\t\t\tendOfList = addNonDependent(order, children, endOfList);\n\t\t\t\n\t\t\ttoBeProcessed++;\n\t\t}\n\t\t\n\t\treturn order;\n\t}\n\t\n\tpublic static String[] convertToStringList(Project[] projects) {\n\t\tString[] buildOrder = new String[projects.length];\n\t\tfor (int i = 0; i < projects.length; i++) {\n\t\t\tbuildOrder[i] = projects[i].getName();\n\t\t}\n\t\treturn buildOrder;\n\t}\n\t\n\tpublic static Project[] findBuildOrder(String[] projects, String[][] dependencies) {\n\t\tGraph graph = buildGraph(projects, dependencies);\n\t\treturn orderProjects(graph.getNodes());\n\t}\n\t\n\t\n\tpublic static String[] buildOrderWrapper(String[] projects, String[][] dependencies) {\n\t\tProject[] buildOrder = findBuildOrder(projects, dependencies);\n\t\tif (buildOrder == null) return null;\n\t\tString[] buildOrderString = convertToStringList(buildOrder);\n\t\treturn buildOrderString;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[] projects = {\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\"};\n\t\tString[][] dependencies = {\n\t\t\t\t{\"a\", \"b\"},\n\t\t\t\t{\"b\", \"c\"},\n\t\t\t\t{\"a\", \"c\"},\n\t\t\t\t{\"a\", \"c\"},\n\t\t\t\t{\"d\", \"e\"},\n\t\t\t\t{\"b\", \"d\"},\n\t\t\t\t{\"e\", \"f\"},\n\t\t\t\t{\"a\", \"f\"},\n\t\t\t\t{\"h\", \"i\"},\n\t\t\t\t{\"h\", \"j\"},\n\t\t\t\t{\"i\", \"j\"},\n\t\t\t\t{\"g\", \"j\"}};\n\t\tString[] buildOrder = buildOrderWrapper(projects, dependencies);\n\t\tif (buildOrder == null) {\n\t\t\tSystem.out.println(\"Circular Dependency.\");\n\t\t} else {\n\t\t\tfor (String s : buildOrder) {\n\t\t\t\tSystem.out.println(s);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/Question.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class Question {\r\n\tstatic int TWO_NODES_FOUND = 2;\r\n\tstatic int ONE_NODE_FOUND = 1;\r\n\tstatic int NO_NODES_FOUND = 0;\r\n\t\t\r\n\t// Checks how many 'special' nodes are located under this root\r\n\tpublic static int covers(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tint ret = NO_NODES_FOUND;\r\n\t\tif (root == null) return ret;\r\n\t\tif (root == p || root == q) ret += 1;\r\n\t\tret += covers(root.left, p, q);\r\n\t\tif(ret == TWO_NODES_FOUND) // Found p and q \r\n\t\t\treturn ret;\r\n\t\treturn ret + covers(root.right, p, q);\r\n\t}\r\n\t\t\r\n\tpublic static TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif (q == p && (root.left == q || root.right == q)) return root;\r\n\t\tint nodesFromLeft = covers(root.left, p, q); // Check left side\r\n\t\tif (nodesFromLeft == TWO_NODES_FOUND) {\r\n\t\t\tif(root.left == p || root.left == q) return root.left;\r\n\t\t\telse return commonAncestor(root.left, p, q);\r\n\t\t} else if (nodesFromLeft == ONE_NODE_FOUND) {\r\n\t\t\tif (root == p) return p;\r\n\t\t\telse if (root == q) return q;\r\n\t\t}\r\n\r\n\t\tint nodesFromRight = covers(root.right, p, q); // Check right side\r\n\t\tif(nodesFromRight == TWO_NODES_FOUND) {\r\n\t\t\tif(root.right == p || root.right == q) return root.right;\r\n\t\t\telse return commonAncestor(root.right, p, q);\r\n\t\t} else if (nodesFromRight == ONE_NODE_FOUND) {\r\n\t\t\tif (root == p) return p;\r\n\t\t\telse if (root == q) return q;\r\n\t\t}\r\n\t\tif (nodesFromLeft == ONE_NODE_FOUND && \r\n\t\t\tnodesFromRight == ONE_NODE_FOUND) return root;\r\n\t\telse return null;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(1);\r\n\t\tTreeNode n7 = root.find(7);\r\n\t\tTreeNode ancestor = commonAncestor(root, n3, n7);\r\n\t\tSystem.out.println(ancestor.data);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionA.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionA {\r\n\tpublic static TreeNode commonAncestor(TreeNode p, TreeNode q) {\r\n\t\tif (p == q) return p;\r\n\t\t\r\n\t\tTreeNode ancestor = p;\r\n\t\twhile (ancestor != null) {\r\n\t\t\tif (isOnPath(ancestor, q)) {\r\n\t\t\t\treturn ancestor;\r\n\t\t\t}\r\n\t\t\tancestor = ancestor.parent;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic static boolean isOnPath(TreeNode ancestor, TreeNode node) {\r\n\t\twhile (node != ancestor && node != null) {\r\n\t\t\tnode = node.parent;\r\n\t\t}\r\n\t\treturn node == ancestor;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(8);\r\n\t\tTreeNode n7 = root.find(8);\r\n\t\tTreeNode ancestor = commonAncestor(n3, n7);\r\n\t\tSystem.out.println(ancestor.data);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionB.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionB {\r\n\tpublic static TreeNode commonAncestor(TreeNode p, TreeNode q) {\r\n\t\tint delta = depth(p) - depth(q); // get difference in depths\r\n\t\tTreeNode first = delta > 0 ? q : p; // get shallower node\r\n\t\tTreeNode second = delta > 0 ? p : q; // get deeper node\r\n\t\tsecond = goUpBy(second, Math.abs(delta)); // move shallower node to depth of deeper\r\n\t\twhile (first != second && first != null && second != null) {\r\n\t\t\tfirst = first.parent;\r\n\t\t\tsecond = second.parent;\r\n\t\t}\r\n\t\treturn first == null || second == null ? null : first;\r\n\t}\r\n\t\r\n\tpublic static TreeNode goUpBy(TreeNode node, int delta) {\r\n\t\twhile (delta > 0 && node != null) {\r\n\t\t\tnode = node.parent;\r\n\t\t\tdelta--;\r\n\t\t}\r\n\t\treturn node;\r\n\t}\r\n\t\r\n\tpublic static int depth(TreeNode node) {\r\n\t\tint depth = 0;\r\n\t\twhile (node != null) {\r\n\t\t\tnode = node.parent;\r\n\t\t\tdepth++;\r\n\t\t}\r\n\t\treturn depth;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(3);\r\n\t\tTreeNode n7 = root.find(7);\r\n\t\tTreeNode ancestor = commonAncestor(n3, n7);\r\n\t\tSystem.out.println(ancestor.data);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionC.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionC {\r\n\t\r\n\tpublic static TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif (!covers(root, p) || !covers(root, q)) {\r\n\t\t\treturn null;\r\n\t\t} else if (covers(p, q)) {\r\n\t\t\treturn p;\r\n\t\t} else if (covers(q, p)) {\r\n\t\t\treturn q;\r\n\t\t}\r\n\t\t\r\n\t\tTreeNode sibling = getSibling(p);\r\n\t\tTreeNode parent = p.parent;\r\n\t\twhile (!covers(sibling, q)) {\r\n\t\t\tsibling = getSibling(parent);\r\n\t\t\tparent = parent.parent;\r\n\t\t}\r\n\t\treturn parent;\r\n\t}\r\n\t\r\n\tpublic static boolean covers(TreeNode root, TreeNode p) { \r\n\t\tif (root == null) return false;\r\n\t\tif (root == p) return true;\r\n\t\treturn covers(root.left, p) || covers(root.right, p); \r\n\t}\r\n\t\r\n\tpublic static TreeNode getSibling(TreeNode node) {\r\n\t\tif (node == null || node.parent == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tTreeNode parent = node.parent;\r\n\t\treturn parent.left == node ? parent.right : parent.left;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(1);\r\n\t\tTreeNode n7 = root.find(7);\r\n\t\tTreeNode ancestor = commonAncestor(root, n3, n7);\r\n\t\tSystem.out.println(ancestor.data);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionD.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionD {\r\n\t\r\n\tpublic static TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif (!covers(root, p) || !covers(root, q)) { // Error check - one node is not in tree\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn ancestorHelper(root, p, q);\r\n\t}\r\n\t\r\n\tpublic static TreeNode ancestorHelper(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif (root == null || root == p || root == q) {\r\n\t\t\treturn root;\r\n\t\t}\r\n\t\t\r\n\t\tboolean pIsOnLeft = covers(root.left, p);\r\n\t\tboolean qIsOnLeft = covers(root.left, q);\r\n\t\tif (pIsOnLeft != qIsOnLeft) { // Nodes are on different side\r\n\t\t\treturn root;\r\n\t\t}\r\n\t\tTreeNode childSide = pIsOnLeft ? root.left : root.right;\r\n\t\treturn ancestorHelper(childSide, p, q);\r\n\t}\t\r\n\t\r\n\tpublic static boolean covers(TreeNode root, TreeNode p) { \r\n\t\tif (root == null) return false;\r\n\t\tif (root == p) return true;\r\n\t\treturn covers(root.left, p) || covers(root.right, p); \r\n\t}\r\n\t\t\r\n\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(1);\r\n\t\tTreeNode n7 = root.find(7);\r\n\t\tTreeNode ancestor = commonAncestor(root, n3, n7);\r\n\t\tSystem.out.println(ancestor.data);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionE.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionE {\r\n\tpublic static class Result {\r\n\t\tpublic TreeNode node;\r\n\t\tpublic boolean isAncestor;\r\n\t\tpublic Result(TreeNode n, boolean isAnc) {\r\n\t\t\tnode = n;\r\n\t\t\tisAncestor = isAnc;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static Result commonAncestorHelper(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif (root == null) {\r\n\t\t\treturn new Result(null, false);\r\n\t\t}\r\n\t\tif (root == p && root == q) {\r\n\t\t\treturn new Result(root, true);\r\n\t\t}\r\n\t\t\r\n\t\tResult rx = commonAncestorHelper(root.left, p, q);\r\n\t\tif (rx.isAncestor) { // Found common ancestor\r\n\t\t\treturn rx;\r\n\t\t}\r\n\t\t\r\n\t\tResult ry = commonAncestorHelper(root.right, p, q);\r\n\t\tif (ry.isAncestor) { // Found common ancestor\r\n\t\t\treturn ry;\r\n\t\t}\r\n\t\t\r\n\t\tif (rx.node != null && ry.node != null) {\r\n\t\t\treturn new Result(root, true); // This is the common ancestor\r\n\t\t} else if (root == p || root == q) {\r\n\t\t\t/* If we�re currently at p or q, and we also found one of those\r\n\t\t\t * nodes in a subtree, then this is truly an ancestor and the\r\n\t\t\t * flag should be true. */\r\n\t\t\tboolean isAncestor = rx.node != null || ry.node != null;\r\n\t\t\treturn new Result(root, isAncestor);\r\n\t\t} else {\r\n\t\t\treturn new Result(rx.node != null ? rx.node : ry.node, false);\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tResult r = commonAncestorHelper(root, p, q);\r\n\t\tif (r.isAncestor) {\r\n\t\t\treturn r.node;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(10);\r\n\t\tTreeNode n7 = root.find(6);\r\n\t\tTreeNode ancestor = commonAncestor(root, n3, n7);\r\n\t\tif (ancestor != null) {\r\n\t\t\tSystem.out.println(ancestor.data);\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"null\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionEBad.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionEBad {\r\n\tpublic static TreeNode commonAncestorBad(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif (root == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (root == p && root == q) {\r\n\t\t\treturn root;\r\n\t\t}\r\n\t\t\r\n\t\tTreeNode x = commonAncestorBad(root.left, p, q);\r\n\t\tif (x != null && x != p && x != q) { // Found common ancestor\r\n\t\t\treturn x;\r\n\t\t}\r\n\t\t\r\n\t\tTreeNode y = commonAncestorBad(root.right, p, q);\r\n\t\tif (y != null && y != p && y != q) {\r\n\t\t\treturn y;\r\n\t\t}\r\n\t\t\r\n\t\tif (x != null && y != null) {\r\n\t\t\treturn root; // This is the common ancestor\r\n\t\t} else if (root == p || root == q) {\r\n\t\t\treturn root;\r\n\t\t} else {\r\n\t\t\treturn x == null ? y : x;\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\r\n\t\tTreeNode n3 = root.find(9);\r\n\t\tTreeNode n7 = new TreeNode(6);//root.find(10);\r\n\t\tTreeNode ancestor = commonAncestorBad(root, n3, n7);\r\n\t\tif (ancestor != null) {\r\n\t\t\tSystem.out.println(ancestor.data);\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"null\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/QuestionF.java",
    "content": "package Q4_08_First_Common_Ancestor;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionF {\r\n\t\r\n\tpublic static TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {\r\n\t\tif ((p == null) || (q == null)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tTreeNode ap = p.parent;\r\n\t\twhile (ap != null) {\r\n\t\t\tTreeNode aq = q.parent;\r\n\t\t\twhile (aq != null) { \r\n\t\t\t\tif (aq == ap) {\r\n\t\t\t\t\treturn aq;\r\n\t\t\t\t}\r\n\t\t\t\taq = aq.parent;\r\n\t\t\t}\r\n\t\t\tap = ap.parent;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {5, 3, 6, 1, 9, 11};\r\n\t\tTreeNode root = new TreeNode(20);\r\n\t\tfor (int a : array) {\r\n\t\t\troot.insertInOrder(a);\r\n\t\t}\r\n\t\tTreeNode n1 = root.find(1);\r\n\t\tTreeNode n9 = root.find(9);\r\n\t\tTreeNode ancestor = commonAncestor(root, n1, n9);\r\n\t\tSystem.out.println(ancestor.data);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_08_First_Common_Ancestor/Tester.java",
    "content": "package Q4_08_First_Common_Ancestor;\n\nimport java.util.ArrayList;\n\nimport CtCILibrary.TreeNode;\n\npublic class Tester {\n\tpublic static String resultToString(String s, TreeNode x, TreeNode y, TreeNode anc) {\n\t\ts += \": \";\n\t\ts += (x == null ? \"null\" : x.data);\n\t\ts += \" & \";\n\t\ts += (y == null ? \"null\" : y.data);\n\t\ts += \" -> \";\n\t\ts += (anc == null ? \"null\" : anc.data);\n\t\treturn s;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\n\t\tTreeNode root = TreeNode.createMinimalBST(array);\n\t\t\n\t\tArrayList<TreeNode> nodes = new ArrayList<TreeNode>();\n\t\tfor (int a : array) {\n\t\t\tnodes.add(root.find(a));\n\t\t}\n\t\tnodes.add(new TreeNode(11));\n\t\t\n\t\tfor (TreeNode x : nodes) {\n\t\t\tfor (TreeNode y : nodes) {\n\t\t\t\tTreeNode r1 = QuestionA.commonAncestor(x, y);\n\t\t\t\tTreeNode r2 = QuestionB.commonAncestor(x, y);\n\t\t\t\tTreeNode r3 = QuestionC.commonAncestor(root, x, y);\n\t\t\t\tTreeNode r4 = QuestionD.commonAncestor(root, x, y);\n\t\t\t\tTreeNode r5 = QuestionE.commonAncestor(root, x, y);\n\t\t\t\t\n\t\t\t\tString s1 = resultToString(\"A\", x, y, r1);\n\t\t\t\tString s2 = resultToString(\"B\", x, y, r2);\n\t\t\t\tString s3 = resultToString(\"C\", x, y, r3);\n\t\t\t\tString s4 = resultToString(\"D\", x, y, r4);\n\t\t\t\tString s5 = resultToString(\"D\", x, y, r5);\n\t\t\t\t\n\t\t\t\tif (r1 == r2 && r2 == r3 && r3 == r4 && r4 == r5) {\n\t\t\t\t\tSystem.out.println(\"SUCCESS: \" + s1);\n\t\t\t\t} else {\n\t\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t\t\tSystem.out.println(s1);\n\t\t\t\t\tSystem.out.println(s2);\n\t\t\t\t\tSystem.out.println(s3);\n\t\t\t\t\tSystem.out.println(s4);\n\t\t\t\t\tSystem.out.println(s5);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_09_BST_Sequences/Question.java",
    "content": "package Q4_09_BST_Sequences;\n\nimport java.util.ArrayList;\nimport java.util.LinkedList;\n\nimport CtCILibrary.TreeNode;\n\npublic class Question {\n\t\n\tpublic static void weaveLists(LinkedList<Integer> first, LinkedList<Integer> second, ArrayList<LinkedList<Integer>> results, LinkedList<Integer> prefix) {\n\t\t/* One list is empty. Add the remainder to [a cloned] prefix and\n\t\t * store result. */\n\t\tif (first.size() == 0 || second.size() == 0) {\n\t\t\tLinkedList<Integer> result = (LinkedList<Integer>) prefix.clone();\n\t\t\tresult.addAll(first);\n\t\t\tresult.addAll(second);\n\t\t\tresults.add(result);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Recurse with head of first added to the prefix. Removing the\n\t\t * head will damage first, so we’ll need to put it back where we\n\t\t * found it afterwards. */\n\t\tint headFirst = first.removeFirst();\n\t\tprefix.addLast(headFirst);\n\t\tweaveLists(first, second, results, prefix);\n\t\tprefix.removeLast();\n\t\tfirst.addFirst(headFirst);\n\t\t\n\t\t/* Do the same thing with second, damaging and then restoring\n\t\t * the list.*/\n\t\tint headSecond = second.removeFirst();\n\t\tprefix.addLast(headSecond);\n\t\tweaveLists(first, second, results, prefix);\n\t\tprefix.removeLast();\t\n\t\tsecond.addFirst(headSecond);\n\t}\n\t\n\tpublic static ArrayList<LinkedList<Integer>> allSequences(TreeNode node) {\n\t\tArrayList<LinkedList<Integer>> result = new ArrayList<LinkedList<Integer>>();\n\t\t\n\t\tif (node == null) {\n\t\t\tresult.add(new LinkedList<Integer>());\n\t\t\treturn result;\n\t\t} \n\t\t\n\t\tLinkedList<Integer> prefix = new LinkedList<Integer>();\n\t\tprefix.add(node.data);\n\t\t\n\t\t/* Recurse on left and right subtrees. */\n\t\tArrayList<LinkedList<Integer>> leftSeq = allSequences(node.left);\n\t\tArrayList<LinkedList<Integer>> rightSeq = allSequences(node.right);\n\t\t\n\t\t/* Weave together each list from the left and right sides. */\n\t\tfor (LinkedList<Integer> left : leftSeq) {\n\t\t\tfor (LinkedList<Integer> right : rightSeq) {\n\t\t\t\tArrayList<LinkedList<Integer>> weaved = new ArrayList<LinkedList<Integer>>();\n\t\t\t\tweaveLists(left, right, weaved, prefix);\n\t\t\t\tresult.addAll(weaved);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tTreeNode node = new TreeNode(100);\n\t\tint[] array = {100, 50, 20, 75, 150, 120, 170};\n\t\tfor (int a : array) {\n\t\t\tnode.insertInOrder(a);\n\t\t}\n\t\tArrayList<LinkedList<Integer>> allSeq = allSequences(node);\n\t\tfor (LinkedList<Integer> list : allSeq) {\n\t\t\tSystem.out.println(list);\n\t\t}\n\t\tSystem.out.println(allSeq.size());\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_10_Check_Subtree/QuestionA.java",
    "content": "package Q4_10_Check_Subtree;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionA {\r\n\t\r\n\tpublic static boolean containsTree(TreeNode t1, TreeNode t2) {\r\n\t\tStringBuilder string1 = new StringBuilder();\r\n\t\tStringBuilder string2 = new StringBuilder();\r\n\t\t\r\n\t\tgetOrderString(t1, string1);\r\n\t\tgetOrderString(t2, string2);\r\n\t\t\r\n\t\treturn string1.indexOf(string2.toString()) != -1;\r\n\t}\r\n\t\r\n\tpublic static void getOrderString(TreeNode node, StringBuilder sb) {\r\n\t\tif (node == null) {\r\n\t\t\tsb.append(\"X\");             // Add null indicator\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsb.append(node.data);           // Add root \r\n\t\tgetOrderString(node.left, sb);  // Add left\r\n\t\tgetOrderString(node.right, sb); // Add right\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// t2 is a subtree of t1\r\n\t\tint[] array1 = {1, 2, 1, 3, 1, 1, 5};\r\n\t\tint[] array2 = {2, 3, 1};\r\n\t\t\r\n\t\tTreeNode t1 = AssortedMethods.createTreeFromArray(array1);\r\n\t\tTreeNode t2 = AssortedMethods.createTreeFromArray(array2);\r\n\r\n\t\tif (containsTree(t1, t2)) {\r\n\t\t\tSystem.out.println(\"t2 is a subtree of t1\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"t2 is not a subtree of t1\");\r\n\t\t}\r\n\r\n\t\t// t4 is not a subtree of t3\r\n\t\tint[] array3 = {1, 2, 3};\r\n\t\tTreeNode t3 = AssortedMethods.createTreeFromArray(array1);\r\n\t\tTreeNode t4 = AssortedMethods.createTreeFromArray(array3);\r\n\r\n\t\tif (containsTree(t3, t4)) {\r\n\t\t\tSystem.out.println(\"t4 is a subtree of t3\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"t4 is not a subtree of t3\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_10_Check_Subtree/QuestionB.java",
    "content": "package Q4_10_Check_Subtree;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static boolean containsTree(TreeNode t1, TreeNode t2) {\r\n\t\tif (t2 == null) {\r\n\t\t\treturn true; // The empty tree is a subtree of every tree.\r\n\t\t}\r\n\t\treturn subTree(t1, t2);\r\n\t}\r\n\t\r\n\t/* Checks if the binary tree rooted at r1 contains the binary tree \r\n\t * rooted at r2 as a subtree somewhere within it.\r\n\t */\r\n\tpublic static boolean subTree(TreeNode r1, TreeNode r2) {\r\n\t\tif (r1 == null) {\r\n\t\t\treturn false; // big tree empty & subtree still not found.\r\n\t\t} else if (r1.data == r2.data && matchTree(r1,r2)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn subTree(r1.left, r2) || subTree(r1.right, r2); \r\n\t}\r\n\r\n\t/* Checks if the binary tree rooted at r1 contains the \r\n\t * binary tree rooted at r2 as a subtree starting at r1.\r\n\t */\r\n\tpublic static boolean matchTree(TreeNode r1, TreeNode r2) {\r\n\t\tif (r1 == null && r2 == null) {\r\n\t\t\treturn true; // nothing left in the subtree\r\n\t\t} else if (r1 == null || r2 == null) { \r\n\t\t\treturn false; // exactly one tree is empty, therefore trees don't match\r\n\t\t} else if (r1.data != r2.data) {  \r\n\t\t\treturn false;  // data doesn't match\r\n\t\t} else {\r\n\t\t\treturn matchTree(r1.left, r2.left) && matchTree(r1.right, r2.right);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t// t2 is a subtree of t1\r\n\t\tint[] array1 = {1, 2, 1, 3, 1, 1, 5};\r\n\t\tint[] array2 = {2, 3, 1};\r\n\t\t\r\n\t\tTreeNode t1 = AssortedMethods.createTreeFromArray(array1);\r\n\t\tTreeNode t2 = AssortedMethods.createTreeFromArray(array2);\r\n\r\n\t\tif (containsTree(t1, t2)) {\r\n\t\t\tSystem.out.println(\"t2 is a subtree of t1\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"t2 is not a subtree of t1\");\r\n\t\t}\r\n\r\n\t\t// t4 is not a subtree of t3\r\n\t\tint[] array3 = {1, 2, 3};\r\n\t\tTreeNode t3 = AssortedMethods.createTreeFromArray(array1);\r\n\t\tTreeNode t4 = AssortedMethods.createTreeFromArray(array3);\r\n\r\n\t\tif (containsTree(t3, t4)) {\r\n\t\t\tSystem.out.println(\"t4 is a subtree of t3\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"t4 is not a subtree of t3\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_11_Random_Node/Question.java",
    "content": "package Q4_11_Random_Node;\n\npublic class Question {\n\n\tpublic static void main(String[] args) {\n\t\tint[] counts = new int[10];\n\t\tfor (int i = 0; i < 1000000; i++) {\n\t\t\tTree tree = new Tree();\n\t\t\tint[] array = {1, 0, 6, 2, 3, 9, 4, 5, 8, 7};\n\t\t\tfor (int x : array) {\n\t\t\t\ttree.insertInOrder(x);\n\t\t\t}\n\t\t\tint d = tree.getRandomNode().data;\n\t\t\tcounts[d]++;\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < counts.length; i++) {\n\t\t\tSystem.out.println(i + \": \" + counts[i]);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_11_Random_Node/Tree.java",
    "content": "package Q4_11_Random_Node;\n\nimport java.util.Random;\n\npublic class Tree {\n\tTreeNode root = null;\n\t\n\tpublic void insertInOrder(int value) {\n\t\tif (root == null) {\n\t\t\troot = new TreeNode(value);\n\t\t} else {\n\t\t\troot.insertInOrder(value);\n\t\t}\n\t}\n\t\n\tpublic int size() {\n\t\treturn root == null ? 0 : root.size();\n\t}\n\t\n\tpublic TreeNode getRandomNode() {\n\t\tif (root == null) return null;\n\t\t\n\t\tRandom random = new Random();\n\t\tint i = random.nextInt(size());\n\t\treturn root.getIthNode(i);\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_11_Random_Node/TreeNode.java",
    "content": "package Q4_11_Random_Node;\r\n\r\nimport java.util.Random;\r\n\r\n/* One node of a binary tree. The data element stored is a single \r\n * character.\r\n */\r\npublic class TreeNode {\r\n\tpublic int data;      \r\n\tpublic TreeNode left;    \r\n\tpublic TreeNode right; \r\n\tprivate int size = 0;\r\n\r\n\tpublic TreeNode(int d) {\r\n\t\tdata = d;\r\n\t\tsize = 1;\r\n\t}\r\n\t\r\n\tpublic void insertInOrder(int d) {\r\n\t\tif (d <= data) {\r\n\t\t\tif (left == null) {\r\n\t\t\t\tleft = new TreeNode(d);\r\n\t\t\t} else {\r\n\t\t\t\tleft.insertInOrder(d);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (right == null) {\r\n\t\t\t\tright = new TreeNode(d);\r\n\t\t\t} else {\r\n\t\t\t\tright.insertInOrder(d);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsize++;\r\n\t}\r\n\t\r\n\tpublic int size() {\r\n\t\treturn size;\r\n\t}\r\n\t\r\n\tpublic TreeNode find(int d) {\r\n\t\tif (d == data) {\r\n\t\t\treturn this;\r\n\t\t} else if (d <= data) {\r\n\t\t\treturn left != null ? left.find(d) : null;\r\n\t\t} else if (d > data) {\r\n\t\t\treturn right != null ? right.find(d) : null;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic TreeNode getRandomNode() {\r\n\t\tint leftSize = left == null ? 0 : left.size();\r\n\t\tRandom random = new Random();\r\n\t\tint index = random.nextInt(size);\r\n\t\tif (index < leftSize) {\r\n\t\t\treturn left.getRandomNode();\r\n\t\t} else if (index == leftSize) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\treturn right.getRandomNode();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic TreeNode getIthNode(int i) {\r\n\t\tint leftSize = left == null ? 0 : left.size();\r\n\t\tif (i < leftSize) {\r\n\t\t\treturn left.getIthNode(i);\r\n\t\t} else if (i == leftSize) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\treturn right.getIthNode(i - (leftSize + 1));\r\n\t\t}\r\n\t}\r\n} \r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_12_Paths_with_Sum/QuestionA.java",
    "content": "package Q4_12_Paths_with_Sum;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionA {\r\n\t\r\n\tpublic static int countPathsWithSum(TreeNode root, int targetSum) {\r\n\t\tif (root == null) return 0;\r\n\t\t\r\n\t\t/* Count paths with sum starting from the root. */\r\n\t\tint pathsFromRoot = countPathsWithSumFromNode(root, targetSum, 0);\r\n\t\t\r\n\t\t/* Try the nodes on the left and right. */\r\n\t\tint pathsOnLeft = countPathsWithSum(root.left, targetSum);\r\n\t\tint pathsOnRight = countPathsWithSum(root.right, targetSum);\r\n\t\t\r\n\t\treturn pathsFromRoot + pathsOnLeft + pathsOnRight;\r\n\t}\r\n\t\r\n\t/* Returns the number of paths with this sum starting from this node. */\r\n\tpublic static int countPathsWithSumFromNode(TreeNode node, int targetSum, int currentSum) {\r\n\t\tif (node == null) return 0;\r\n\t\r\n\t\tcurrentSum += node.data;\r\n\t\t\r\n\t\tint totalPaths = 0;\r\n\t\tif (currentSum == targetSum) { // Found a path from the root\r\n\t\t\ttotalPaths++;\r\n\t\t}\r\n\t\t\r\n\t\ttotalPaths += countPathsWithSumFromNode(node.left, targetSum, currentSum); // Go left\r\n\t\ttotalPaths += countPathsWithSumFromNode(node.right, targetSum, currentSum); // Go right\r\n\t\t\r\n\t\treturn totalPaths;\r\n\t}\t\r\n\r\n\tpublic static void main(String [] args) {\r\n\t\t/*\r\n\t\tTreeNode root = new TreeNode(5);\r\n\t\troot.left = new TreeNode(3);\t\t\r\n\t\troot.right = new TreeNode(1);\r\n\t\troot.left.left = new TreeNode(-8);\r\n\t\troot.left.right = new TreeNode(8);\r\n\t\troot.right.left = new TreeNode(2);\r\n\t\troot.right.right = new TreeNode(6);\t\r\n\t\tSystem.out.println(countPathsWithSum(root, 0));*/\r\n\t\t\r\n\t\t/*TreeNode root = new TreeNode(-7);\r\n\t\troot.left = new TreeNode(-7);\r\n\t\troot.left.right = new TreeNode(1);\r\n\t\troot.left.right.left = new TreeNode(2);\r\n\t\troot.right = new TreeNode(7);\r\n\t\troot.right.left = new TreeNode(3);\r\n\t\troot.right.right = new TreeNode(20);\r\n\t\troot.right.right.left = new TreeNode(0);\r\n\t\troot.right.right.left.left = new TreeNode(-3);\r\n\t\troot.right.right.left.left.right = new TreeNode(2);\r\n\t\troot.right.right.left.left.right.left = new TreeNode(1);\r\n\t\tSystem.out.println(countPathsWithSum(root, -14));*/\r\n\t\t\r\n\t\tTreeNode root = new TreeNode(0);\r\n\t\troot.left = new TreeNode(0);\r\n\t\troot.right = new TreeNode(0);\r\n\t\troot.right.left = new TreeNode(0);\r\n\t\troot.right.left.right = new TreeNode(0);\r\n\t\troot.right.right = new TreeNode(0);\r\n\t\tSystem.out.println(countPathsWithSum(root, 0));\r\n\t\tSystem.out.println(countPathsWithSum(root, 4));\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_12_Paths_with_Sum/QuestionB.java",
    "content": "package Q4_12_Paths_with_Sum;\r\nimport java.util.HashMap;\r\n\r\nimport CtCILibrary.TreeNode;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static int countPathsWithSum(TreeNode root, int targetSum) {\r\n\t\treturn countPathsWithSum(root, targetSum, 0, new HashMap<Integer, Integer>());\r\n\t}\r\n\t\r\n\tpublic static int countPathsWithSum(TreeNode node, int targetSum, int runningSum, HashMap<Integer, Integer> pathCount) {\r\n\t\tif (node == null) return 0; // Base case\r\n\t\t\r\n\t\trunningSum += node.data;\r\n\t\t\r\n\t\t/* Count paths with sum ending at the current node. */\r\n\t\tint sum = runningSum - targetSum;\r\n\t\tint totalPaths = pathCount.getOrDefault(sum, 0);\r\n\t\t\r\n\t\t/* If runningSum equals targetSum, then one additional path starts at root. Add in this path.*/\r\n\t\tif (runningSum == targetSum) {\r\n\t\t\ttotalPaths++;\r\n\t\t}\r\n\r\n\t\t/* Add runningSum to pathCounts. */\r\n\t\tincrementHashTable(pathCount, runningSum, 1);\r\n\t\t\r\n\t\t/* Count paths with sum on the left and right. */\r\n\t\ttotalPaths += countPathsWithSum(node.left, targetSum, runningSum, pathCount);\r\n\t\ttotalPaths += countPathsWithSum(node.right, targetSum, runningSum, pathCount);\r\n\t\t\r\n\t\tincrementHashTable(pathCount, runningSum, -1); // Remove runningSum\r\n\t\treturn totalPaths;\r\n\t}\r\n\t\r\n\tpublic static void incrementHashTable(HashMap<Integer, Integer> hashTable, int key, int delta) {\r\n\t\tint newCount = hashTable.getOrDefault(key, 0) + delta;\r\n\t\tif (newCount == 0) { // Remove when zero to reduce space usage\r\n\t\t\thashTable.remove(key);\r\n\t\t} else {\r\n\t\t\thashTable.put(key, newCount);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void main(String [] args) {\r\n\t\t/*\r\n\t\tTreeNode root = new TreeNode(5);\r\n\t\troot.left = new TreeNode(3);\t\t\r\n\t\troot.right = new TreeNode(1);\r\n\t\troot.left.left = new TreeNode(-8);\r\n\t\troot.left.right = new TreeNode(8);\r\n\t\troot.right.left = new TreeNode(2);\r\n\t\troot.right.right = new TreeNode(6);\t\r\n\t\troot.right.left.left = new TreeNode(0);\t\r\n\t\tSystem.out.println(countPathsWithSum(root, 0));\r\n\t\t*/\r\n\t\t\r\n\t\t/*TreeNode root = new TreeNode(-7);\r\n\t\troot.left = new TreeNode(-7);\r\n\t\troot.left.right = new TreeNode(1);\r\n\t\troot.left.right.left = new TreeNode(2);\r\n\t\troot.right = new TreeNode(7);\r\n\t\troot.right.left = new TreeNode(3);\r\n\t\troot.right.right = new TreeNode(20);\r\n\t\troot.right.right.left = new TreeNode(0);\r\n\t\troot.right.right.left.left = new TreeNode(-3);\r\n\t\troot.right.right.left.left.right = new TreeNode(2);\r\n\t\troot.right.right.left.left.right.left = new TreeNode(1);\r\n\t\tSystem.out.println(countPathsWithSum(root, 0));*/\r\n\t\t\r\n\t\tTreeNode root = new TreeNode(0);\r\n\t\troot.left = new TreeNode(0);\r\n\t\troot.right = new TreeNode(0);\r\n\t\troot.right.left = new TreeNode(0);\r\n\t\troot.right.left.right = new TreeNode(0);\r\n\t\troot.right.right = new TreeNode(0);\r\n\t\tSystem.out.println(countPathsWithSum(root, 0));\r\n\t\tSystem.out.println(countPathsWithSum(root, 4));\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 04. Trees and Graphs/Q4_12_Paths_with_Sum/Tester.java",
    "content": "package Q4_12_Paths_with_Sum;\n\nimport CtCILibrary.AssortedMethods;\nimport CtCILibrary.TreeNode;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tboolean isWorking = true;\n\t\twhile (isWorking) {\n\t\t\tint min = -20;\n\t\t\tint max = 20;\n\t\t\tint size = 20;\n\t\t\tTreeNode root = AssortedMethods.randomBST(size, min, max);\n\t\t\n\t\t\tfor (int targetSum = Math.min(-1, min * size - 10); targetSum <= Math.max(100, max * size + 10); targetSum++) {\n\t\t\t\tint answerA = QuestionA.countPathsWithSum(root, targetSum);\n\t\t\t\tint answerB = QuestionB.countPathsWithSum(root, targetSum);\n\t\t\t\tif (answerA > 0 || answerB > 0) {\n\t\t\t\t\tSystem.out.println(targetSum + \": \" + answerA + \", \" + answerB + \" | \" + (answerA == answerB));\n\t\t\t\t}\n\t\t\t\tif (answerA != answerB) {\n\t\t\t\t\tisWorking = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_01_Insertion/Question.java",
    "content": "package Q5_01_Insertion;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\tpublic static int updateBits(int n, int m, int i, int j) {\r\n\t\t// Validation\r\n\t\tif (i > j || i < 0 || j >= 32) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\t/* Create a mask to clear bits i through j in n\r\n\t\t/* EXAMPLE: i = 2, j = 4. Result should be 11100011.\r\n\t\t * (Using 8 bits for this example.  This is obviously not actually 8 bits.)\r\n\t\t */\r\n\t\tint allOnes = ~0; // allOnes = 11111111\r\n\t\t\r\n\t\tint left = j < 31 ? (allOnes << (j + 1)) : 0; // 1s until position j, then 0s. left = 11100000\t\r\n\t  \tint right = ((1 << i) - 1); // 1s after position i.  right = 00000011\r\n\t\tint mask = left | right; // All 1s, except for 0s between i and j. mask = 11100011\r\n\r\n\t\t/* Clear i through j, then put m in there */\r\n\t\tint n_cleared = n & mask; // Clear bits j through i.\r\n\t\tint m_shifted = m << i; // Move m into correct position.\r\n\t\t\r\n\t\t/* OR them, and we're done! */\r\n\t\treturn n_cleared | m_shifted; \r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = ~23423;\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(a));\r\n\t\tint b = 5;\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(b));\t\t\r\n\t\tint c = updateBits(a, b, 29, 31);\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(c));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_02_Binary_to_String/Question.java",
    "content": "package Q5_02_Binary_to_String;\r\n\r\npublic class Question {\r\n\tpublic static String printBinary(double num) {\r\n\t\tif (num >= 1 || num <= 0) {\r\n\t\t\treturn \"ERROR\";\r\n\t\t}\r\n\t\r\n\t\tStringBuilder binary = new StringBuilder();\r\n\t\tbinary.append(\".\");\r\n\t\twhile (num > 0) {\r\n\t\t\t/* Setting a limit on length: 32 characters */\r\n\t\t\tif (binary.length() > 32) {\r\n\t\t\t\treturn \"ERROR\";\r\n\t\t\t}\r\n\t\t\tdouble r = num * 2;\r\n\t\t\tif (r >= 1) {\r\n\t\t\t\tbinary.append(1);\r\n\t\t\t\tnum = r - 1;\r\n\t\t\t} else {\r\n\t\t\t\tbinary.append(0);\r\n\t\t\t\tnum = r;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn binary.toString();\r\n\t}\r\n\t\r\n\tpublic static String printBinary2(double num) {\r\n\t\tif (num >= 1 || num <= 0) {\r\n\t\t\treturn \"ERROR\";\r\n\t\t}\r\n\t\r\n\t\tStringBuilder binary = new StringBuilder();\r\n\t\tdouble frac = 0.5;\r\n\t\tbinary.append(\".\");\r\n\t\twhile (num > 0) {\r\n\t\t\t/* Setting a limit on length: 32 characters */\r\n\t\t\tif (binary.length() >= 32) {\r\n\t\t\t\treturn \"ERROR\";\r\n\t\t\t}\r\n\t\t\tif (num >= frac) {\r\n\t\t\t\tbinary.append(1);\r\n\t\t\t\tnum -= frac;\r\n\t\t\t} else {\r\n\t\t\t\tbinary.append(0);\r\n\t\t\t}\r\n\t\t\tfrac /= 2;\r\n\t\t}\r\n\t\treturn binary.toString();\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString bs = printBinary(.125);\r\n\t\tSystem.out.println(bs);\r\n\t\t\r\n\t\tfor (int i = 0; i < 1000; i++) {\r\n\t\t\tdouble num = i / 1000.0;\r\n\t\t\tString binary = printBinary(num);\r\n\t\t\tString binary2 = printBinary2(num);\r\n\t\t\tif (!binary.equals(\"ERROR\") || !binary2.equals(\"ERROR\")) {\r\n\t\t\t\tSystem.out.println(num + \" : \" + binary + \" \" + binary2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_03_Flip_Bit_to_Win/QuestionA.java",
    "content": "package Q5_03_Flip_Bit_to_Win;\n\npublic class QuestionA {\n\t\n\tpublic static int SEQUENCE_LENGTH = 32;\n\t\n\tpublic static boolean getBit(int num, int i) {\n\t\treturn ((num & (1 << i)) != 0);\n\t}\t\n\t\n\tpublic static int longestSequence(int n) {\n\t\tint maxSeq = 0;\n\t\t\n\t\tfor (int i = 0; i < SEQUENCE_LENGTH; i++) {\n\t\t\tmaxSeq = Math.max(maxSeq,  longestSequenceOf1s(n, i));\n\t\t}\n\t\t\n\t\treturn maxSeq;\n\t}\n\t\n\tpublic static int longestSequenceOf1s(int n, int indexToIgnore) {\n\t\tint max = 0;\n\t\tint counter = 0;\n\t\tfor (int i = 0; i < SEQUENCE_LENGTH; i++) {\n\t\t\tif (i == indexToIgnore || getBit(n, i)) {\n\t\t\t\tcounter++;\n\t\t\t\tmax = Math.max(counter, max);\n\t\t\t} else {\n\t\t\t\tcounter = 0;\n\t\t\t}\n\t\t}\n\t\treturn max;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint original_number = Integer.MAX_VALUE;\n\t\tint new_number = longestSequence(original_number);\n\t\t\t\n\t\tSystem.out.println(Integer.toBinaryString(original_number));\n\t\tSystem.out.println(new_number);\t\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_03_Flip_Bit_to_Win/QuestionB.java",
    "content": "package Q5_03_Flip_Bit_to_Win;\n\nimport java.util.ArrayList;\n\npublic class QuestionB {\n\t\n\tpublic static int longestSequence(int n) {\n\t\tif (n == -1) return Integer.BYTES * 8;\n\t\tArrayList<Integer> sequences = getAlternatingSequences(n);\n\t\treturn findLongestSequence(sequences);\n\t}\t\n\t\n\t/* Return a list of the sizes of the sequences. The sequence starts \n\t * off with the number of 0s (which might be 0) and then alternates\n\t * with the counts of each value.*/\n\tpublic static ArrayList<Integer> getAlternatingSequences(int n) {\n\t\tArrayList<Integer> sequences = new ArrayList<Integer>();\n\t\t\n\t\tint searchingFor = 0;\n\t\tint counter = 0;\n\t\t\n\t\tfor (int i = 0; i < Integer.BYTES * 8; i++) {\n\t\t\tif ((n & 1) != searchingFor) {\n\t\t\t\tsequences.add(counter);\n\t\t\t\tsearchingFor = n & 1; // Flip 1 to 0 or 0 to 1\n\t\t\t\tcounter = 0;\t\n\t\t\t}\n\t\t\tcounter++;\n\t\t\tn >>>= 1;\n\t\t}\n\t\tsequences.add(counter);\n\t\t\n\t\treturn sequences;\n\t}\n\t\n\tpublic static int findLongestSequence(ArrayList<Integer> seq) {\n\t\tint maxSeq = 1;\n\t\t\n\t\tfor (int i = 0; i < seq.size(); i += 2) {\n\t\t\tint zerosSeq = seq.get(i);\n\t\t\tint onesSeqPrev = i - 1 >= 0 ? seq.get(i - 1) : 0;\n\t\t\tint onesSeqNext = i + 1 < seq.size() ? seq.get(i + 1) : 0;\n\t\t\t\n\t\t\tint thisSeq = 0;\n\t\t\tif (zerosSeq == 1) { // Can merge\n\t\t\t\tthisSeq = onesSeqNext + 1 + onesSeqPrev; \n\t\t\t} else if (zerosSeq > 1) { // Just add a one to either side\n\t\t\t\tthisSeq = 1 + Math.max(onesSeqPrev, onesSeqNext);\n\t\t\t} else if (zerosSeq == 0) { // No zero, but take either side\n\t\t\t\tthisSeq = Math.max(onesSeqPrev, onesSeqNext);\n\t\t\t}\n\t\t\tmaxSeq = Math.max(thisSeq, maxSeq);\n\t\t}\n\t\t\n\t\treturn maxSeq;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint original_number = 1775;\n\t\tint new_number = longestSequence(original_number);\n\t\t\t\n\t\tSystem.out.println(Integer.toBinaryString(original_number));\n\t\tSystem.out.println(new_number);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_03_Flip_Bit_to_Win/QuestionC.java",
    "content": "package Q5_03_Flip_Bit_to_Win;\n\npublic class QuestionC {\n\n\tpublic static int SEQUENCE_LENGTH = 32;\n\t\n\t/* Given set of three sequences ordered as {0s, then 1s, then 0s}, \n\t * find max sequence that can be formed. */\n\tpublic static int getMaxSequence(int[] sequences) { /* 1s, then 0s, then [old] ones */\n\t\tif (sequences[1] == 1) { // a single 0 -> merge sequences\n\t\t\treturn sequences[0] + sequences[2] + 1; \n\t\t} else if (sequences[1] == 0) { // no 0s -> take one side\n\t\t\treturn Math.max(sequences[0], sequences[2]); \n\t\t} else {  // many 0s -> take side, add 1 (flip a bit)\n\t\t\treturn Math.max(sequences[0], sequences[2]) + 1;\n\t\t}\n\t}\n\t\n\tpublic static void shift(int[] sequences) {\n\t\tsequences[2] = sequences[1];\n\t\tsequences[1] = sequences[0];\n\t\tsequences[0] = 0;\n\t}\n\t\n\tpublic static int longestSequence(int n) {\n\t\tint searchingFor = 0;\n\t\tint[] sequences = {0, 0, 0}; // Counts of last 3 sequences\n\t\tint maxSequence = 1;\n\t\t\n\t\tfor (int i = 0; i < SEQUENCE_LENGTH; i++) {\n\t\t\tif ((n & 1) != searchingFor) {\n\t\t\t\tif (searchingFor == 1) { // End of 1s + 0s + 1s sequence\n\t\t\t\t\tmaxSequence = Math.max(maxSequence, getMaxSequence(sequences));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsearchingFor = n & 1; // Flip 1 to 0 or 0 to 1\n\t\t\t\tshift(sequences); // Shift sequences\n\t\t\t}\n\t\t\tsequences[0]++;\n\t\t\tn >>>= 1;\n\t\t}\n\t\t\n\t\t/* Check final set of sequences */\n\t\tif (searchingFor == 0) {\n\t\t\tshift(sequences);\t\t\n\t\t}\n\t\tint finalSequence = getMaxSequence(sequences);\n\t\tmaxSequence = Math.max(finalSequence, maxSequence);\t\t\n\t\t\n\t\treturn maxSequence;\n\t}\t\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint original_number = Integer.MAX_VALUE;\n\t\tint new_number = longestSequence(original_number);\n\t\t\t\n\t\tSystem.out.println(Integer.toBinaryString(original_number));\n\t\tSystem.out.println(new_number);\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_03_Flip_Bit_to_Win/QuestionD.java",
    "content": "package Q5_03_Flip_Bit_to_Win;\n\npublic class QuestionD {\n\n\tpublic static int flipBit(int a) {\n\t\t/* If all 1s, this is already the longest sequence. */\n\t\tif (~a == 0) return Integer.BYTES * 8;\n\t\t\n\t\tint currentLength = 0;\n\t\tint previousLength = 0;\n\t\tint maxLength = 1; // We can always have a sequence of at least one 1\n\t\twhile (a != 0) {\n\t\t\tif ((a & 1) == 1) {\n\t\t\t\tcurrentLength++;\n\t\t\t} else if ((a & 1) == 0) {\n\t\t\t\t/* Update to 0 (if next bit is 0) or currentLength (if next bit is 1). */\n\t\t\t\tpreviousLength = (a & 2) == 0 ? 0 : currentLength;\n\t\t\t\tcurrentLength = 0;\n\t\t\t}\n\t\t\tmaxLength = Math.max(previousLength + currentLength + 1, maxLength);\n\t\t\ta >>>= 1;\n\t\t}\n\t\treturn maxLength;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[][] cases = {{-1, 32}, {Integer.MAX_VALUE, 32}, {-10, 31}, {0, 1}, \n\t\t\t\t{1, 2}, {15, 5}, {1775, 8}};\n\t\tfor (int[] c : cases) {\n\t\t\tint x = flipBit(c[0]);\n\t\t\tboolean r = (c[1] == x);\n\t\t\tSystem.out.println(c[0] + \": \" + x + \", \" + c[1] + \" \" + r);\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_03_Flip_Bit_to_Win/Tester.java",
    "content": "package Q5_03_Flip_Bit_to_Win;\n\npublic class Tester {\n\t\n\tpublic static boolean checkRange(int start, int range) {\n\t\tfor (int i = 0; i < range; i++) {\n\t\t\tint value = start + i;\n\t\t\tint seqA = QuestionA.longestSequence(value);\n\t\t\tint seqB = QuestionB.longestSequence(value);\n\t\t\tint seqC = QuestionC.longestSequence(value);\n\t\t\tint seqD = QuestionC.longestSequence(value);\n\t\t\t\n\t\t\tif (seqA != seqB || seqB != seqC || seqC != seqD) {\n\t\t\t\tSystem.out.println(\"FAILURE on value \" + value);\n\t\t\t\tString xs = Integer.toBinaryString(value);\n\t\t\t\tSystem.out.println(xs);\n\t\t\t\tSystem.out.println(\"A: \" + seqA);\n\t\t\t\tSystem.out.println(\"B: \" + seqB);\n\t\t\t\tSystem.out.println(\"C: \" + seqC);\n\t\t\t\tSystem.out.println(\"D: \" + seqD);\n\t\t\t\treturn false;\n\t\t\t} \n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[][] ranges = {{Integer.MIN_VALUE, 1000}, {Integer.MAX_VALUE - 2333, 5333},\n\t\t\t\t{-10000, 20000}};\n\t\tfor (int[] range : ranges) {\n\t\t\tif (!checkRange(range[0], range[1])) {\n\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t} else {\n\t\t\t\tint end = range[0] + range[1];\n\t\t\t\tSystem.out.println(\"SUCCESS: \" + range[0] + \" -> \" + end);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_04_Next_Number/QuestionA.java",
    "content": "package Q5_04_Next_Number;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static int countOnes(int i) {\r\n\t\tint count = 0;\r\n\t\twhile (i > 0) {\r\n\t\t\tif ((i & 1) == 1) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t\ti = i >> 1;\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int countZeros(int i) {\r\n\t\treturn 32 - countOnes(i);\r\n\t}\t\r\n\t\r\n\tpublic static boolean hasValidNext(int i) {\r\n\t\tif (i == 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint count = 0;\r\n\t\twhile ((i & 1) == 0) {\r\n\t\t\ti >>= 1;\r\n\t\t\tcount++;\r\n\t\t}\r\n\t\twhile ((i & 1) == 1) {\r\n\t\t\ti >>= 1;\r\n\t\t\tcount++;\r\n\t\t}\t\t\r\n\t\tif (count == 31) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\t\r\n\t}\r\n\t\r\n\tpublic static boolean hasValidPrev(int i) {\r\n\t\twhile ((i & 1) == 1) {\r\n\t\t\ti >>= 1;\r\n\t\t}\r\n\t\tif (i == 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\t\t\r\n\t}\r\n\r\n\tpublic static int getNextSlow(int i) {\r\n\t\tif (!hasValidNext(i)) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tint num_ones = countOnes(i);\r\n\t\ti++;\r\n\t\twhile (countOnes(i) != num_ones) {\r\n\t\t\ti++;\r\n\t\t}\r\n\t\treturn i;\r\n\t}\r\n\r\n\tpublic static int getPrevSlow(int i) {\r\n\t\tif (!hasValidPrev(i)) {\r\n\t\t\treturn -1;\r\n\t\t}\t\t\r\n\t\tint num_ones = countOnes(i);\r\n\t\ti--;\r\n\t\twhile (countOnes(i) != num_ones) {\r\n\t\t\ti--;\r\n\t\t}\r\n\t\treturn i;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint i = 13948;\r\n\t\tint p1 = getPrevSlow(i);\r\n\t\tint n1 = getNextSlow(i);\r\n\t\tTester.binPrint(p1);\r\n\t\tTester.binPrint(n1);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_04_Next_Number/QuestionB.java",
    "content": "package Q5_04_Next_Number;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static int getNext(int n) {\r\n\t\tint c = n;\r\n\t\tint c0 = 0;\r\n\t\tint c1 = 0;\r\n\t\twhile (((c & 1) == 0) && (c != 0)) {\r\n\t\t\tc0++;\r\n\t\t\tc >>= 1;\r\n\t\t}\r\n\t\t\r\n\t\twhile ((c & 1) == 1) {\r\n\t\t\tc1++;\r\n\t\t\tc >>= 1;\r\n\t\t}\r\n\t\t\r\n\t\t/* If c is 0, then n is a sequence of 1s followed by a sequence of 0s. This is already the biggest\r\n\t\t * number with c1 ones. Return error.\r\n\t\t */\r\n\t\tif (c0 + c1 == 31 || c0 + c1 == 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\tint pos = c0 + c1; // position of right-most non-trailing zero (where the right most bit is bit 0)\r\n\t\t\r\n\t\t/* Flip the right-most non-trailing zero (which will be at position pos) */\r\n\t\tn |= (1 << pos); // Flip right-most non-trailing zero\r\n\t\t\t\t\r\n\t\t/* Clear all bits to the right of pos.\r\n\t\t * Example with pos = 5 \r\n\t\t * (1) Shift 1 over by 5 to create 0..0100000           [ mask = 1 << pos ]\r\n\t\t * (2) Subtract 1 to get 0..0011111                     [ mask = mask - 1 ]\r\n\t\t * (3) Flip all the bits by using '~' to get 1..1100000 [ mask = ~mask    ]\r\n\t\t * (4) AND with n\r\n\t\t */\r\n\t\tn &= ~((1 << pos) - 1); // Clear all bits to the right of pos\r\n\t\t\r\n\t\t/* Put (ones-1) 1s on the right by doing the following:\r\n\t\t * (1) Shift 1 over by (ones-1) spots. If ones = 3, this gets you 0..0100\r\n\t\t * (2) Subtract one from that to get 0..0011\r\n\t\t * (3) OR with n\r\n\t\t */\r\n\t\tn |= (1 << (c1 - 1)) - 1;\r\n\t\t\r\n\t\treturn n;\r\n\t}\r\n\t\r\n\tpublic static int getPrev(int n) {\r\n\t\tint temp = n;\r\n\t\tint c0 = 0;\r\n\t\tint c1 = 0;\r\n\t\twhile ((temp & 1) == 1) {\r\n\t\t\tc1++;\r\n\t\t\ttemp >>= 1;\r\n\t\t}\r\n\t\t\r\n\t\t/* If temp is 0, then the number is a sequence of 0s followed by a sequence of 1s. This is already\r\n\t\t * the smallest number with c1 ones. Return -1 for an error.\r\n\t\t */\r\n\t\tif (temp == 0) { \r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\twhile (((temp & 1) == 0) && (temp != 0)) {\r\n\t\t\tc0++;\r\n\t\t\ttemp >>= 1;\r\n\t\t}\r\n\r\n\t\tint p = c0 + c1; // position of right-most non-trailing one (where the right most bit is bit 0)\r\n\r\n\t\t/* Flip right-most non-trailing one. \r\n\t\t * Example: n = 00011100011.\r\n\t\t * c1 = 2\r\n\t\t * c0 = 3\r\n\t\t * pos = 5\r\n\t\t * \r\n\t\t * Build up a mask as follows:\r\n\t\t * (1) ~0 will be a sequence of 1s\r\n\t\t * (2) shifting left by p + 1 will give you 11.111000000 (six 0s) \r\n\t\t * (3) ANDing with n will clear the last 6 bits\r\n\t\t * n is now 00011000000\r\n\t\t */\r\n\t\tn &= ((~0) << (p + 1)); // clears from bit p onwards (to the right)\r\n\t\t\r\n\t\t/* Create a sequence of (c1+1) 1s as follows\r\n\t\t * (1) Shift 1 to the left (c1+1) times. If c1 is 2, this will give you 0..001000\r\n\t\t * (2) Subtract one from that. This will give you 0..00111\r\n\t\t */\r\n\t\tint mask = (1 << (c1 + 1)) - 1; // Sequence of (c1+1) ones\r\n\t\t\r\n\t\t/* Move the ones to be right up next to bit p \r\n\t\t * Since this is a sequence of (c1+1) ones, and p = c1 + c0, we just need to\r\n\t\t * shift this over by (c0-1) spots.\r\n\t\t * If c0 = 3 and c1 = 2, then this will look like 00...0011100\r\n\t\t * \r\n\t\t * Then, finally, we OR this with n.\r\n\t\t */\r\n\t\tn |= mask << (c0 - 1);  \r\n\t\t\r\n\t\treturn n;\t\t\r\n\t}\t\r\n\t\r\n\tpublic static void binPrint(int i) {\r\n\t\tSystem.out.println(i + \": \" + Integer.toBinaryString(i));\t\t\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint i = 13948;\r\n\t\tint p1 = getPrev(i);\r\n\t\tint n1 = getNext(i);\r\n\t\tTester.binPrint(p1);\r\n\t\tTester.binPrint(n1);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_04_Next_Number/QuestionC.java",
    "content": "package Q5_04_Next_Number;\r\n\r\npublic class QuestionC {\r\n\tpublic static int getNextArith(int n) {\r\n\t\tint c = n;\r\n\t\tint c0 = 0;\r\n\t\tint c1 = 0;\r\n\t\twhile (((c & 1) == 0) && (c != 0)) {\r\n\t\t\tc0++;\r\n\t\t\tc >>= 1;\r\n\t\t}\r\n\t\t\r\n\t\twhile ((c & 1) == 1) {\r\n\t\t\tc1++;\r\n\t\t\tc >>= 1;\r\n\t\t}\r\n\t\t\r\n\t\t/* If c is 0, then n is a sequence of 1s followed by a sequence of 0s. This is already the biggest\r\n\t\t * number with c1 ones. Return error.\r\n\t\t */\r\n\t\tif (c0 + c1 == 31 || c0 + c1 == 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\t/* Arithmetically:\r\n\t\t * 2^c0 = 1 << c0\r\n\t\t * 2^(c1-1) = 1 << (c0 - 1)\r\n\t\t * next = n + 2^c0 + 2^(c1-1) - 1;\r\n\t\t */\r\n\t\t\r\n\t\treturn n + (1 << c0) + (1 << (c1 - 1)) - 1;\r\n\t}\r\n\t\r\n\tpublic static int getPrevArith(int n) {\r\n\t\tint temp = n;\r\n\t\tint c0 = 0;\r\n\t\tint c1 = 0;\r\n\t\twhile (((temp & 1) == 1) && (temp != 0)) {\r\n\t\t\tc1++;\r\n\t\t\ttemp >>= 1;\r\n\t\t}\r\n\t\t\r\n\t\t/* If temp is 0, then the number is a sequence of 0s followed by a sequence of 1s. This is already\r\n\t\t * the smallest number with c1 ones. Return -1 for an error.\r\n\t\t */\r\n\t\tif (temp == 0) { \r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\twhile ((temp & 1) == 0 && (temp != 0)) {\r\n\t\t\tc0++;\r\n\t\t\ttemp >>= 1;\r\n\t\t}\r\n\r\n\t\t/* Arithmetic:\r\n\t\t * 2^c1 = 1 << c1\r\n\t\t * 2^(c0 - 1) = 1 << (c0 - 1)\r\n\t\t */\r\n\t\treturn n - (1 << c1) - (1 << (c0 - 1)) + 1;\t\t\r\n\t}\t\r\n\t\r\n\tpublic static void binPrint(int i) {\r\n\t\tSystem.out.println(i + \": \" + Integer.toBinaryString(i));\t\t\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint i = 13948;\r\n\t\tint p1 = getPrevArith(i);\r\n\t\tint n1 = getNextArith(i);\r\n\t\tTester.binPrint(p1);\r\n\t\tTester.binPrint(n1);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_04_Next_Number/Tester.java",
    "content": "package Q5_04_Next_Number;\r\n\r\npublic class Tester {\r\n\tpublic static void binPrint(int i) {\r\n\t\tSystem.out.println(i + \": \" + Integer.toBinaryString(i));\t\t\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 200; i++) {\r\n\t\t\tint p1 = QuestionA.getPrevSlow(i);\r\n\t\t\tint p2 = QuestionB.getPrev(i);\r\n\t\t\tint p3 = QuestionC.getPrevArith(i);\r\n\t\t\t\r\n\t\t\tint n1 = QuestionA.getNextSlow(i);\r\n\t\t\tint n2 = QuestionB.getNext(i);\r\n\t\t\tint n3 = QuestionC.getNextArith(i);\r\n\t\t\t\r\n\t\t\tif (p1 != p2 || p2 != p3 || n1 != n2 || n2 != n3) {\r\n\t\t\t\tbinPrint(i);\r\n\t\t\t\tbinPrint(p1);\r\n\t\t\t\tbinPrint(p2);\r\n\t\t\t\tbinPrint(p3);\r\n\t\t\t\tbinPrint(n1);\r\n\t\t\t\tbinPrint(n2);\r\n\t\t\t\tbinPrint(n3);\r\n\t\t\t\tSystem.out.println(\"\");\r\n\t\t\t\tbreak;\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\tSystem.out.println(\"Done!\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_06_Conversion/QuestionA.java",
    "content": "package Q5_06_Conversion;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\tpublic static int bitSwapRequired(int a, int b) {\r\n\t\tint count = 0;\r\n\t\tint c = a ^ b;\r\n\t\twhile (c != 0) {\r\n\t\t\tcount += c & 1; // Increment count if c ends with a 1\r\n\t\t\tc >>>= 1; // Shift right by 1\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = -23432;\r\n\t\tint b = 512132;\r\n\t\tSystem.out.println(a + \": \" + AssortedMethods.toFullBinaryString(a));\r\n\t\tSystem.out.println(b + \": \" + AssortedMethods.toFullBinaryString(b));\r\n\t\tSystem.out.println(\"Required number of bits: \" + bitSwapRequired(a, b));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_06_Conversion/QuestionB.java",
    "content": "package Q5_06_Conversion;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\tpublic static int bitSwapRequired(int a, int b){\r\n\t\tint count = 0;\r\n\t\tint c = a ^ b;\r\n\r\n\t\tSystem.out.println(\"****\");\r\n\t\tSystem.out.println(c + \": \" + AssortedMethods.toFullBinaryString(c));\r\n\t\twhile (c != 0) {\r\n\t\t\tSystem.out.println(\"c - 1: \" + c + \": \" + AssortedMethods.toFullBinaryString(c - 1));\r\n\t\t\tc = c & (c-1);\r\n\t\t\tSystem.out.println(\"c: \" + c + \": \" + AssortedMethods.toFullBinaryString(c));\r\n\t\t\tcount++;\r\n\t\t\tSystem.out.println(\"****\");\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = -23432;\r\n\t\tint b = 512132;\r\n\t\tSystem.out.println(a + \": \" + AssortedMethods.toFullBinaryString(a));\r\n\t\tSystem.out.println(b + \": \" + AssortedMethods.toFullBinaryString(b));\r\n\t\tSystem.out.println(\"Required number of bits: \" + bitSwapRequired(a, b));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_06_Conversion/Tester.java",
    "content": "package Q5_06_Conversion;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Tester {\r\n\tpublic static int bitSwapRequired(int a, int b) {\r\n\t\tint count = 0;\r\n\t\tfor (int c = a ^ b; c != 0; c = c >>> 1) { \r\n\t\t\tcount += c & 1;\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int bitSwapRequired2(int a, int b){\r\n\t\tint count = 0;\r\n\t\tfor (int c = a ^ b; c != 0; c = c & (c-1)) {\r\n\t\t\tcount++;\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = -23432;\r\n\t\tint b = 512132;\r\n\t\tSystem.out.println(a + \": \" + AssortedMethods.toFullBinaryString(a));\r\n\t\tSystem.out.println(b + \": \" + AssortedMethods.toFullBinaryString(b));\r\n\t\tint nbits = QuestionA.bitSwapRequired(a, b);\r\n\t\tint nbits2 = QuestionB.bitSwapRequired(a, b);\r\n\t\tSystem.out.println(\"Required number of bits: \" + nbits + \" \" + nbits2);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_07_Pairwise_Swap/Question.java",
    "content": "package Q5_07_Pairwise_Swap;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\tpublic static int swapOddEvenBits(int x) { \r\n\t\treturn ( ((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1) ); \r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = 234321;\r\n\t\tSystem.out.println(a + \": \" + AssortedMethods.toFullBinaryString(a));\r\n\t\tint b = swapOddEvenBits(a);\r\n\t\tSystem.out.println(b + \": \" + AssortedMethods.toFullBinaryString(b));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Q5_08_Draw_Line/Question.java",
    "content": "package Q5_08_Draw_Line;\r\n\r\npublic class Question {\r\n\tpublic static int computeByteNum(int width, int x, int y) {\r\n\t\treturn (width * y + x) / 8;\r\n\t}\r\n\t\r\n\tpublic static void drawLine(byte[] screen, int width, int x1, int x2, int y) {\r\n\t\tint start_offset = x1 % 8;\r\n\t\tint first_full_byte = x1 / 8;\r\n\t\tif (start_offset != 0) {\r\n\t\t\tfirst_full_byte++;\r\n\t\t}\r\n\t\t\r\n\t\tint end_offset = x2 % 8;\r\n\t\tint last_full_byte = x2 / 8;\r\n\t\tif (end_offset != 7) {\r\n\t\t\tlast_full_byte--;\r\n\t\t}\r\n\t\t\r\n\t\t// Set full bytes\r\n\t\tfor (int b = first_full_byte; b <= last_full_byte; b++) {\r\n\t\t\tscreen[(width / 8) * y + b] = (byte) 0xFF;\r\n\t\t}\r\n\t\t\r\n\t\tbyte start_mask = (byte) (0xFF >> start_offset);\r\n\t\tbyte end_mask = (byte) ~(0xFF >> (end_offset + 1));\r\n\t\t\r\n\t\t// Set start and end of line\r\n\t\tif ((x1 / 8) == (x2 / 8)) { // If x1 and x2 are in the same byte\r\n\t\t\tbyte mask = (byte) (start_mask & end_mask);\r\n\t\t\tscreen[(width / 8) * y + (x1 / 8)] |= mask;\r\n\t\t} else {\r\n\t\t\tif (start_offset != 0) {\r\n\t\t\t\tint byte_number = (width / 8) * y + first_full_byte - 1;\r\n\t\t\t\tscreen[byte_number] |= start_mask;\r\n\t\t\t}\r\n\t\t\tif (end_offset != 7) {\r\n\t\t\t\tint byte_number = (width / 8) * y + last_full_byte + 1;\r\n\t\t\t\tscreen[byte_number] |= end_mask;\r\n\t\t\t} \r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void printByte(byte b) {\r\n\t\tfor (int i = 7; i >= 0; i--) {\r\n\t\t\tchar c = ((b >> i) & 1) == 1 ? '1' : '_';\r\n\t\t\tSystem.out.print(c);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void printScreen(byte[] screen, int width) {\r\n\t\tint height = screen.length * 8 / width;\r\n\t\tfor (int r = 0; r < height; r++) {\r\n\t\t\tfor (int c = 0; c < width; c+=8) {\r\n\t\t\t\tbyte b = screen[computeByteNum(width, c, r)];\r\n\t\t\t\tprintByte(b);\r\n\t\t\t}\r\n\t\t\tSystem.out.println(\"\");\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint width = 8 * 1;\r\n\t\tint height = 1;\r\n\t\tfor (int r = 0; r < height; r++) {\r\n\t\t\tfor (int c1 = 0; c1 < width; c1++) {\r\n\t\t\t\tfor (int c2 = c1; c2 < width; c2++) {\r\n\t\t\t\t\tbyte[] screen = new byte[width * height / 8];\r\n\r\n\t\t\t\t\tSystem.out.println(\"row: \" + r + \": \" + c1 + \" -> \" + c2);\r\n\t\t\t\t\tdrawLine(screen, width, c1, c2, r);\r\n\t\t\t\t\tprintScreen(screen, width);\r\n\t\t\t\t\tSystem.out.println(\"\\n\\n\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Sample_Code/RightShifts.java",
    "content": "package Sample_Code;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class RightShifts {\n\tpublic static int repeatedArithmeticShift(int x, int count) {\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\tx >>= 1; // Arithmetic shift by 1\n\t\t}\n\t\treturn x;\n\t}\n\t\n\tpublic static int repeatedLogicalShift(int x, int count) {\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\tx >>>= 1; // Logical shift by 1\n\t\t}\n\t\treturn x;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 8; i >= -8; i--) {\n\t\t\tSystem.out.println(AssortedMethods.toFullBinaryString(i) + \": \" + i);\n\t\t}\n\t\t\n\t\tint x = -93242;\n\t\tint resultArithmetic = repeatedArithmeticShift(x, 40);\n\t\tint resultLogical = repeatedLogicalShift(x, 40);\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(resultArithmetic) + \": \" + resultArithmetic);\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(resultLogical) + \": \" + resultLogical);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 05. Bit Manipulation/Sample_Code/Sample_Code.java",
    "content": "package Sample_Code;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Sample_Code {\r\n\r\n\tpublic static boolean getBit(int num, int i) {\r\n\t\treturn ((num & (1 << i)) != 0);\r\n\t}\r\n\t\r\n\tpublic static int setBit(int num, int i) {\r\n\t\treturn num | (1 << i);\r\n\t}\r\n\t\r\n\tpublic static int clearBit(int num, int i) {\r\n\t\tint mask = ~(1 << i);\r\n\t\treturn num & mask;\r\n\t}\r\n\t\r\n\tpublic static int updateBit(int num, int i, boolean bitIs1) {\r\n\t\tint value = bitIs1 ? 1 : 0;\r\n\t\tint mask = ~(1 << i);\r\n\t\treturn (num & mask) | (value << i);\r\n\t}\r\n\t\r\n\tpublic static int clearBitsMSBthroughI(int num, int i) {\r\n\t\tint mask = (1 << i) - 1;\r\n\t\treturn num & mask;\r\n\t}\r\n\t\r\n\tpublic static int clearBitsIthrough0(int num, int i) {\r\n\t\tint mask = (-1 << (i+1));\r\n\t\treturn num & mask;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\t\r\n\t\tint number = 59;\r\n\t\tSystem.out.println(\"Testing with number: \" + number);\r\n\t\t\r\n\t\t// Get Bit\r\n\t\tSystem.out.println(\"Get Bit\");\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(number));\r\n\t\tfor (int i = 31; i >= 0; i--) {\r\n\t\t\tint res = getBit(number, i) ? 1 : 0;\r\n\t\t\tSystem.out.print(res);\r\n\t\t}\r\n\t\t\r\n\t\t// Update Bit\r\n\t\tSystem.out.println(\"\\n\\nUpdate Bit\");\t\t\r\n\t\tint num1 = 1578; // arbitrary number\r\n\t\tfor (int i = 31; i >= 0; i--) {\r\n\t\t\tnum1 = updateBit(num1, i, getBit(number, i));\r\n\t\t}\t\r\n\t\tSystem.out.println(num1);\r\n\t\t\r\n\t\t// Set and Clear Bit\r\n\t\tSystem.out.println(\"\\nSet and Clear Bit\");\t\t\r\n\t\tint num2 = 1578; // arbitrary number\r\n\t\tfor (int i = 31; i >= 0; i--) {\r\n\t\t\tif (getBit(number, i)) {\r\n\t\t\t\tnum2 = setBit(num2, i);\r\n\t\t\t} else {\r\n\t\t\t\tnum2 = clearBit(num2, i);\r\n\t\t\t}\r\n\t\t}\t\r\n\t\tSystem.out.println(num2);\r\n\t\r\n\t\t// Clear Bits MSB through i\r\n\t\tnumber = 13242352;\r\n\t\tint clearMSBThrough = 4;\r\n\t\tSystem.out.println(\"\\nClear bits MSB through \" + clearMSBThrough);\t\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(number));\r\n\t\tint num3 = clearBitsMSBthroughI(number, clearMSBThrough);\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(num3));\r\n\t\t\r\n\t\t// Clear Bits i through 0\r\n\t\tint clearToLSB = 2;\r\n\t\tSystem.out.println(\"\\nClear bits \" + clearToLSB + \" through 0\");\t\r\n\t\tnumber = -1;\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(number));\r\n\t\tint num4 = clearBitsIthrough0(number, clearToLSB);\r\n\t\tSystem.out.println(AssortedMethods.toFullBinaryString(num4));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Introduction/PrimeNumbers.java",
    "content": "package Introduction;\r\n\r\npublic class PrimeNumbers {\r\n\r\n\tpublic static boolean primeNaive(int n) {\r\n\t\tfor (int i = 2; i < n; i++) {\r\n\t\t\tif (n % i == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static boolean primeSlightlyBetter(int n) {\r\n\t\tint sqrt = (int) Math.sqrt(n);\r\n\t\tfor (int i = 2; i <= sqrt; i++) {\r\n\t\t\tif (n % i == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 2; i < 100; i++) {\r\n\t\t\tif (primeSlightlyBetter(i)) {\r\n\t\t\t\tSystem.out.println(i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Introduction/SieveOfEratosthenes.java",
    "content": "package Introduction;\r\n\r\npublic class SieveOfEratosthenes {\r\n\t\r\n\tpublic static void crossOff(boolean[] flags, int prime) {\r\n\t\t/* Cross off remaining multiples of prime. We can start with\r\n\t\t * (prime*prime), because if we have a k * prime, where k < prime,\r\n\t\t * this value would have already been crossed off in a prior\r\n\t\t * iteration. */\t\t\r\n\t\tfor (int i = prime * prime; i < flags.length; i += prime) {\r\n\t\t\tflags[i] = false;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int getNextPrime(boolean[] flags, int prime) {\r\n\t\tint next = prime + 1;\r\n\t\twhile (next < flags.length && !flags[next]) {\r\n\t\t\tnext++;\r\n\t\t}\r\n\t\treturn next;\t\r\n\t}\r\n\t\r\n\tpublic static void init(boolean[] flags) {\r\n\t\tflags[0] = false;\r\n\t\tflags[1] = false;\r\n\t\tfor (int i = 2; i < flags.length; i++) {\r\n\t\t\tflags[i] = true;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int[] prune(boolean[] flags, int count) {\r\n\t\tint[] primes = new int[count];\r\n\t\tint index = 0;\r\n\t\tfor (int i = 0; i < flags.length; i++) {\r\n\t\t\tif (flags[i]) {\r\n\t\t\t\tprimes[index] = i;\r\n\t\t\t\tindex++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn primes;\r\n\t}\r\n\t\r\n\tpublic static boolean[] sieveOfEratosthenes(int max) {\r\n        boolean[] flags = new boolean[max + 1];\r\n        \r\n\t\tinit(flags);\r\n        int prime = 2;\r\n        \r\n        while (prime <= Math.sqrt(max)) {       \t\r\n    \t\t/* Cross off remaining multiples of prime */   \r\n    \t\tcrossOff(flags, prime); \r\n\r\n    \t\t/* Find next value which is true */\r\n    \t\tprime = getNextPrime(flags, prime);\r\n        }\r\n        \r\n        return flags; //prune(flags, count);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tboolean[] primes = sieveOfEratosthenes(4);\r\n\t\tfor (int i = 0; i < primes.length; i++) {\r\n\t\t\tif (primes[i]) {\r\n\t\t\t\tSystem.out.println(i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_05_Egg_Drop/Question.java",
    "content": "package Q6_05_Egg_Drop;\n\npublic class Question {\n\tpublic static int breakingPoint = 89;\n\tpublic static int countDrops = 0;\n\n\n\tpublic static boolean willBreak(int floor) {\n\t\tcountDrops++;\n\t\treturn floor >= breakingPoint;\n\t}\n\n\n\tpublic static int findBreakingPoint(int floors) {\n\t\tint interval = 14;\n\t\tint previousFloor = 0;\n\t\tint egg1 = interval;\n\t\t\n\t\t/* Drop egg1 at decreasing intervals. */\n\t\twhile (!willBreak(egg1) && egg1 <= floors) {\n\t\t\tinterval -= 1;\n\t\t\tpreviousFloor = egg1;\n\t\t\tegg1 += interval;\n\t\t}\n\t\t\n\t\t/* Drop egg2 at 1 unit increments. */\n\t\tint egg2 = previousFloor + 1;\n\t\twhile (egg2 < egg1 && egg2 <= floors && !willBreak(egg2)) {\n\t\t\tegg2 += 1;\n\t\t}\n\t\t\n\t\t/* If it didn’t break, return -1. */\n\t\treturn egg2 > floors ? -1 : egg2;\n\t}\n\n\n\tpublic static void main(String[] args) {\n\t\tint max = 0;\n\t\tfor (int i = 1; i <= 100; i++) {\n\t\t\tcountDrops = 0;\n\t\t\tbreakingPoint = i;\n\t\t\tint bp = findBreakingPoint(100);\n\t\t\t\n\t\t\tif (bp == breakingPoint) {\n\t\t\t\tSystem.out.println(\"SUCCESS: \" + i + \" -> \" + bp + \" -> \" + countDrops);\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"ERROR: \" + i + \" -> \" + bp + \" vs \" + breakingPoint);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmax = countDrops > max ? countDrops : max;\n\t\t}\n\t\tSystem.out.println(max);\n\t}\n}\n\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_07_The_Apocalypse/Question.java",
    "content": "package Q6_07_The_Apocalypse;\n\nimport java.util.Random;\n\npublic class Question {\n\tpublic static int[] runOneFamily() {\n\t\tRandom random = new Random();\n\t\tint boys = 0;\n\t\tint girls = 0;\n\t\twhile (girls == 0) { // until we have a girl\n\t\t\tif (random.nextBoolean()) { // girl\n\t\t\t\tgirls += 1;\n\t\t\t} else { // boy\n\t\t\t\tboys += 1;\n\t\t\t}\n\t\t}\n\t\tint[] genders = {girls, boys};\n\t\treturn genders;\n\t}\n\t\n\tpublic static double runNFamilies(int n) {\n\t\tint boys = 0;\n\t\tint girls = 0;\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tint[] genders = runOneFamily();\n\t\t\tgirls += genders[0];\n\t\t\tboys += genders[1];\n\t\t}\n\t\treturn girls / (double) (boys + girls); \n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tdouble ratio = runNFamilies(10000000);\n\t\tSystem.out.println(ratio);\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_10_Test_Strips/Bottle.java",
    "content": "package Q6_10_Test_Strips;\n\npublic class Bottle {\n\tprivate boolean poisoned = false;\n\tprivate int id;\n\t\n\tpublic Bottle(int id) {\n\t\tthis.id = id;\n\t}\n\t\n\tpublic int getId() {\n\t\treturn id;\n\t}\n\t\n\tpublic void setAsPoisoned() {\n\t\tpoisoned = true;\n\t}\n\t\n\tpublic boolean isPoisoned() {\n\t\treturn poisoned;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_10_Test_Strips/QuestionA.java",
    "content": "package Q6_10_Test_Strips;\n\nimport java.util.ArrayList;\nimport java.util.Random;\n\npublic class QuestionA {\n\tpublic static int findPoisonedBottle(ArrayList<Bottle> bottles, ArrayList<TestStrip> strips) {\n\t\tint today = 0;\n\t\t\n\t\twhile (bottles.size() > 1 && strips.size() > 0) {\n\t\t\t/* Run tests. */\n\t\t\trunTestSet(bottles, strips, today);\n\t\t\t\n\t\t\t/* Wait for results. */\n\t\t\ttoday += TestStrip.DAYS_FOR_RESULT;\n\t\t\t\n\t\t\t/* Check results. */\n\t\t\tfor (TestStrip strip : strips) {\n\t\t\t\tif (strip.isPositiveOnDay(today)) {\n\t\t\t\t\tbottles = strip.getLastWeeksBottles(today);\n\t\t\t\t\tstrips.remove(strip);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\tif (bottles.size() == 1) {\n\t\t\tSystem.out.println(\"Suspected bottle is \" + bottles.get(0).getId() + \" on day \" + today);\n\t\t\treturn bottles.get(0).getId();\n\t\t}\n\t\treturn -1;\t\n\t}\t\n\t\n\tpublic static void runTestSet(ArrayList<Bottle> bottles, ArrayList<TestStrip> strips, int day) {\n\t\tint index = 0;\n\t\tfor (Bottle bottle : bottles) {\n\t\t\tTestStrip strip = strips.get(index);\n\t\t\tstrip.addDropOnDay(day, bottle);\n\t\t\tindex = (index + 1) % strips.size();\n\t\t}\n\t}\n\t\n\tpublic static ArrayList<Bottle> createBottles(int nBottles, int poisoned) {\n\t\tArrayList<Bottle> bottles = new ArrayList<Bottle>();\n\t\tfor (int i = 0; i < nBottles; i++) {\n\t\t\tbottles.add(new Bottle(i));\n\t\t}\n\t\t\n\t\tif (poisoned == -1) {\n\t\t\tRandom random = new Random();\n\t\t\tpoisoned = random.nextInt(nBottles);\n\t\t}\n\t\tbottles.get(poisoned).setAsPoisoned();\n\t\t\n\t\tSystem.out.println(\"Added poison to bottle \" + poisoned);\n\t\t\n\t\treturn bottles;\n\t}\n\t\n\tpublic static ArrayList<TestStrip> createTestStrips(int nTestStrips) {\n\t\tArrayList<TestStrip> testStrips = new ArrayList<TestStrip>();\n\t\tfor (int i = 0; i < nTestStrips; i++) {\n\t\t\ttestStrips.add(new TestStrip(i));\n\t\t}\n\t\treturn testStrips;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint nBottles = 1000;\n\t\tint nTestStrips = 10;\n\t\tfor (int poisoned = 0; poisoned < nBottles; poisoned++) {\n\t\t\tArrayList<Bottle> bottles = createBottles(nBottles, poisoned);\n\t\t\tArrayList<TestStrip> testStrips = createTestStrips(nTestStrips);\n\t\t\tint poisonedId = findPoisonedBottle(bottles, testStrips);\n\t\t\tSystem.out.println(\"Suspected Bottle: \" + poisonedId);\n\t\t\tif (poisonedId != poisoned) {\n\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_10_Test_Strips/QuestionB.java",
    "content": "package Q6_10_Test_Strips;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.Random;\n\npublic class QuestionB {\n\tpublic static ArrayList<Bottle> createBottles(int nBottles, int poisoned) {\n\t\tArrayList<Bottle> bottles = new ArrayList<Bottle>();\n\t\tfor (int i = 0; i < nBottles; i++) {\n\t\t\tbottles.add(new Bottle(i));\n\t\t}\n\t\t\n\t\tif (poisoned == -1) {\n\t\t\tRandom random = new Random();\n\t\t\tpoisoned = random.nextInt(nBottles);\n\t\t}\n\t\tbottles.get(poisoned).setAsPoisoned();\n\t\t\n\t\tSystem.out.println(\"Added poison to bottle \" + poisoned);\n\t\t\n\t\treturn bottles;\n\t}\n\n\tpublic static int findPoisonedBottle(ArrayList<Bottle> bottles, ArrayList<TestStrip> strips) {\n\t\tif (bottles.size() > 1000 || strips.size() < 10) return -1;\n\t\t\n\t\tint tests = 4; // three digits, plus one extra\n\t\tint nTestStrips = strips.size();\n\t\t\n\t\t/* Run tests. */\n\t\tfor (int day = 0; day < tests; day++) {\n\t\t\trunTestSet(bottles, strips, day);\n\t\t}\n\t\t\n\t\t/* Get results. */\n\t\tHashSet<Integer> previousResults = new HashSet<Integer>();\n\t\tint[] digits = new int[tests];\n\t\tfor (int day = 0; day < tests; day++) {\n\t\t\tint resultDay = day + TestStrip.DAYS_FOR_RESULT;\n\t\t\tdigits[day] = getPositiveOnDay(strips, resultDay, previousResults);\n\t\t\tpreviousResults.add(digits[day]);\n\t\t}\n\t\t\n\t\t/* If day 1's results matched day 0's, update the digit. */\n\t\tif (digits[1] == -1) {\n\t\t\tdigits[1] = digits[0];\n\t\t}\n\t\t\n\t\t/* If day 2 matched day 0 or day 1, check day 3. Day 3 is\n\t\t * the same as day 2, but incremented by 1. */\n\t\tif (digits[2] == -1) { \n\t\t\tif (digits[3] == -1) { /* Day 3 didn't give new result */\n\t\t\t\t/* Digit 2 equals digit 0 or digit 1. But, digit 2, when incremented also matches \n\t\t\t\t * digit 0 or digit 1. This means that digit 0 incremented matches digit 1, or the\n\t\t\t\t * other way around. */\n\t\t\t\tdigits[2] = ((digits[0] + 1) % nTestStrips) == digits[1] ? digits[0] : digits[1];  \n\t\t\t} else {\n\t\t\t\tdigits[2] = (digits[3] - 1 + nTestStrips) % nTestStrips;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn digits[0] * 100 + digits[1] * 10 + digits[2];\n\t}\n\t\n\t/* Run set of tests for this day. */\n\tpublic static void runTestSet(ArrayList<Bottle> bottles, ArrayList<TestStrip> strips, int day) {\n\t\tif (day > 3) return; // only works for 3 days (digits) + one extra\n\n\t\tfor (Bottle bottle : bottles) {\n\t\t\tint index = getTestStripIndexForDay(bottle, day, strips.size());\n\t\t\tTestStrip testStrip = strips.get(index);\n\t\t\ttestStrip.addDropOnDay(day, bottle);\n\t\t}\n\t}\n\t\n\t/* Get test strip index that should be used on this bottle on this day. */ \n\tpublic static int getTestStripIndexForDay(Bottle bottle, int day, int nTestStrips) {\n\t\tint id = bottle.getId();\n\t\tswitch (day) {\n\t\t\tcase 0: return id /100;\n\t\t\tcase 1: return (id % 100) / 10;\n\t\t\tcase 2: return id % 10;\n\t\t\tcase 3: return (id % 10 + 1) % nTestStrips;\n\t\t\tdefault: return -1;\n\t\t}\n\t}\t\n\t\n\t/* Get results that are positive for a particular day, excluding prior results. */\n\tpublic static int getPositiveOnDay(ArrayList<TestStrip> testStrips, int day, HashSet<Integer> previousResults) {\n\t\tfor (TestStrip testStrip : testStrips) {\n\t\t\tint id = testStrip.getId();\n\t\t\tif (testStrip.isPositiveOnDay(day) && !previousResults.contains(id)) {\n\t\t\t\treturn testStrip.getId();\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\t\n\t\n\tpublic static ArrayList<TestStrip> createTestStrips(int nTestStrips) {\n\t\tArrayList<TestStrip> testStrips = new ArrayList<TestStrip>();\n\t\tfor (int i = 0; i < nTestStrips; i++) {\n\t\t\ttestStrips.add(new TestStrip(i));\n\t\t}\n\t\treturn testStrips;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint nBottles = 1000;\n\t\tint nTestStrips = 10;\n\t\tfor (int poisoned = 0; poisoned < nBottles; poisoned++) {\n\t\t\tArrayList<Bottle> bottles = createBottles(nBottles, poisoned);\n\t\t\tArrayList<TestStrip> testStrips = createTestStrips(nTestStrips);\n\t\t\tint poisonedId = findPoisonedBottle(bottles, testStrips);\n\t\t\tSystem.out.println(\"Suspected Bottle: \" + poisonedId);\n\t\t\tif (poisonedId != poisoned) {\n\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_10_Test_Strips/QuestionC.java",
    "content": "package Q6_10_Test_Strips;\n\nimport java.util.ArrayList;\nimport java.util.Random;\n\npublic class QuestionC {\n\tpublic static ArrayList<Bottle> createBottles(int nBottles, int poisoned) {\n\t\tArrayList<Bottle> bottles = new ArrayList<Bottle>();\n\t\tfor (int i = 0; i < nBottles; i++) {\n\t\t\tbottles.add(new Bottle(i));\n\t\t}\n\t\t\n\t\tif (poisoned == -1) {\n\t\t\tRandom random = new Random();\n\t\t\tpoisoned = random.nextInt(nBottles);\n\t\t}\n\t\tbottles.get(poisoned).setAsPoisoned();\n\t\t\n\t\tSystem.out.println(\"Added poison to bottle \" + poisoned);\n\t\t\n\t\treturn bottles;\n\t}\n\t\n\tpublic static int findPoisonedBottle(ArrayList<Bottle> bottles, ArrayList<TestStrip> strips) {\n\t\trunTests(bottles, strips);\n\t\tArrayList<Integer> positive = getPositiveOnDay(strips, 7);\n\t\treturn setBits(positive);\n\t}\t\n\t\n\t/* Add bottles to test strips */\n\tpublic static void runTests(ArrayList<Bottle> bottles, ArrayList<TestStrip> testStrips) {\n\t\tfor (Bottle bottle : bottles) {\n\t\t\tint id = bottle.getId();\n\t\t\tint bitIndex = 0;\n\t\t\twhile (id > 0) {\n\t\t\t\tif ((id & 1) == 1) {\n\t\t\t\t\ttestStrips.get(bitIndex).addDropOnDay(0, bottle);\n\t\t\t\t}\n\t\t\t\tbitIndex++;\n\t\t\t\tid >>= 1;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* Get test strips that are positive on a particular day. */\n\tpublic static ArrayList<Integer> getPositiveOnDay(ArrayList<TestStrip> testStrips, int day) {\n\t\tArrayList<Integer> positive = new ArrayList<Integer>();\n\t\tfor (TestStrip testStrip : testStrips) {\n\t\t\tint id = testStrip.getId();\n\t\t\tif (testStrip.isPositiveOnDay(day)) {\n\t\t\t\tpositive.add(id);\n\t\t\t}\n\t\t}\n\t\treturn positive;\n\t}\n\t\n\t/* Create number by setting bits with indices specified in positive. */\n\tpublic static int setBits(ArrayList<Integer> positive) {\n\t\tint id = 0;\n\t\tfor (Integer bitIndex : positive) {\n\t\t\tid |= 1 << bitIndex;\n\t\t}\n\t\treturn id;\n\t}\n\t\n\tpublic static ArrayList<TestStrip> createTestStrips(int nTestStrips) {\n\t\tArrayList<TestStrip> testStrips = new ArrayList<TestStrip>();\n\t\tfor (int i = 0; i < nTestStrips; i++) {\n\t\t\ttestStrips.add(new TestStrip(i));\n\t\t}\n\t\treturn testStrips;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint nBottles = 1000;\n\t\tint nTestStrips = 10;\n\t\tfor (int poisoned = 0; poisoned < nBottles; poisoned++) {\n\t\t\tArrayList<Bottle> bottles = createBottles(nBottles, poisoned);\n\t\t\tArrayList<TestStrip> testStrips = createTestStrips(nTestStrips);\n\t\t\tint poisonedId = findPoisonedBottle(bottles, testStrips);\n\t\t\tSystem.out.println(\"Suspected Bottle: \" + poisonedId);\n\t\t\tif (poisonedId != poisoned) {\n\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 06. Math and Logic Puzzles/Q6_10_Test_Strips/TestStrip.java",
    "content": "package Q6_10_Test_Strips;\n\nimport java.util.ArrayList;\n\npublic class TestStrip {\n\tpublic static int DAYS_FOR_RESULT = 7; \n\tprivate ArrayList<ArrayList<Bottle>> dropsByDay = new ArrayList<ArrayList<Bottle>>();\n\tprivate int id;\n\t\n\tpublic TestStrip(int id) {\n\t\tthis.id = id;\n\t}\n\t\n\tpublic int getId() {\n\t\treturn id;\n\t}\n\t\n\t/* Resize list of days/drops to be large enough. */\n\tprivate void sizeDropsForDay(int day) {\n\t\twhile (dropsByDay.size() <= day) {\n\t\t\tdropsByDay.add(new ArrayList<Bottle>());\n\t\t}\n\t}\n\t\n\t/* Add drop from bottle on specific day. */\n\tpublic void addDropOnDay(int day, Bottle bottle) {\n\t\tsizeDropsForDay(day);\n\t\tArrayList<Bottle> drops = dropsByDay.get(day);\n\t\tdrops.add(bottle);\n\t}\n\t\n\t/* Checks if any of the bottles in the set are poisoned. */\n\tprivate boolean hasPoison(ArrayList<Bottle> bottles) {\n\t\tfor (Bottle b : bottles) {\n\t\t\tif (b.isPoisoned()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/* Gets bottles that were used in the test DAYS_FOR_RESULT days ago. */ \n\tpublic ArrayList<Bottle> getLastWeeksBottles(int day) {\n\t\tif (day < DAYS_FOR_RESULT) {\n\t\t\treturn null;\n\t\t}\n\t\treturn dropsByDay.get(day - DAYS_FOR_RESULT);\n\t}\n\t\n\t/* Checks if the test strip has had any poisoned bottles since before DAYS_FOR_RESULT */\n\tpublic boolean isPositiveOnDay(int day) {\n\t\tint testDay = day - DAYS_FOR_RESULT;\n\t\tif (testDay < 0 || testDay >= dropsByDay.size()) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (int d = 0; d <= testDay; d++) {\n\t\t\tArrayList<Bottle> bottles = dropsByDay.get(d);\n\t\t\tif (hasPoison(bottles)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/BlackJackCard.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\npublic class BlackJackCard extends Card {\r\n\tpublic BlackJackCard(int c, Suit s) {\r\n\t\tsuper(c, s);\r\n\t}\r\n\t\r\n\tpublic int value() {\r\n\t\tif (isAce()) { // Ace\r\n\t\t\treturn 1; \r\n\t\t} else if (isFaceCard()) { // Face card\r\n\t\t\treturn 10;\r\n\t\t} else { // Number card\r\n\t\t\treturn faceValue;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int minValue() {\r\n\t\tif (isAce()) { // Ace\r\n\t\t\treturn 1; \r\n\t\t} else {\r\n\t\t\treturn value();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int maxValue() {\r\n\t\tif (isAce()) { // Ace\r\n\t\t\treturn 11; \r\n\t\t} else {\r\n\t\t\treturn value();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic boolean isAce() { \r\n\t\treturn faceValue == 1;\r\n\t} \r\n\t\r\n\tpublic boolean isFaceCard() {\r\n\t\treturn faceValue >= 11 && faceValue <= 13;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/BlackJackGameAutomator.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class BlackJackGameAutomator {\r\n\tprivate Deck<BlackJackCard> deck;\r\n\tprivate BlackJackHand[] hands;\r\n\tprivate static final int HIT_UNTIL = 16;\r\n\t\r\n\tpublic BlackJackGameAutomator(int numPlayers) {\r\n\t\thands = new BlackJackHand[numPlayers];\r\n\t\tfor (int i = 0; i < numPlayers; i++) {\r\n\t\t\thands[i] = new BlackJackHand();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic boolean dealInitial() {\r\n\t\tfor (BlackJackHand hand : hands) {\r\n\t\t\tBlackJackCard card1 = deck.dealCard();\r\n\t\t\tBlackJackCard card2 = deck.dealCard();\r\n\t\t\tif (card1 == null || card2 == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\thand.addCard(card1);\r\n\t\t\thand.addCard(card2);\t\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic ArrayList<Integer> getBlackJacks() {\r\n\t\tArrayList<Integer> winners = new ArrayList<Integer>();\r\n\t\tfor (int i = 0; i < hands.length; i++) {\r\n\t\t\tif (hands[i].isBlackJack()) {\r\n\t\t\t\twinners.add(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn winners;\r\n\t}\r\n\t\r\n\tpublic boolean playHand(int i) {\r\n\t\tBlackJackHand hand = hands[i];\r\n\t\treturn playHand(hand);\r\n\t}\r\n\t\r\n\tpublic boolean playHand(BlackJackHand hand) {\r\n\t\twhile (hand.score() < HIT_UNTIL) {\r\n\t\t\tBlackJackCard card = deck.dealCard();\r\n\t\t\tif (card == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\thand.addCard(card);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\t\r\n\t\r\n\tpublic boolean playAllHands() {\r\n\t\tfor (BlackJackHand hand : hands) {\r\n\t\t\tif (!playHand(hand)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic ArrayList<Integer> getWinners() {\r\n\t\tArrayList<Integer> winners = new ArrayList<Integer>();\r\n\t\tint winningScore = 0;\r\n\t\tfor (int i = 0; i < hands.length; i++) {\r\n\t\t\tBlackJackHand hand = hands[i];\r\n\t\t\tif (!hand.busted()) {\r\n\t\t\t\tif (hand.score() > winningScore) {\r\n\t\t\t\t\twinningScore = hand.score();\r\n\t\t\t\t\twinners.clear();\r\n\t\t\t\t\twinners.add(i);\r\n\t\t\t\t} else if (hand.score() == winningScore) {\r\n\t\t\t\t\twinners.add(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn winners;\r\n\t}\r\n\t\r\n\tpublic void initializeDeck() {\r\n\t\tArrayList<BlackJackCard> cards = new ArrayList<BlackJackCard>();\r\n\t\tfor (int i = 1; i <= 13; i++) {\r\n\t\t\tfor (int j = 0; j <= 3; j++) {\r\n\t\t\t\tSuit suit = Suit.getSuitFromValue(j);\r\n\t\t\t\tBlackJackCard card = new BlackJackCard(i, suit);\r\n\t\t\t\tcards.add(card);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tdeck = new Deck<BlackJackCard>();\r\n\t\tdeck.setDeckOfCards(cards);\r\n\t\tdeck.shuffle();\t\r\n\t}\r\n\t\r\n\tpublic void printHandsAndScore() {\r\n\t\tfor (int i = 0; i < hands.length; i++) {\r\n\t\t\tSystem.out.print(\"Hand \" + i + \" (\" + hands[i].score() + \"): \");\r\n\t\t\thands[i].print();\r\n\t\t\tSystem.out.println(\"\");\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/BlackJackHand.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class BlackJackHand extends Hand<BlackJackCard> {\r\n\tpublic BlackJackHand() {\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic int score() {\r\n\t\tArrayList<Integer> scores = possibleScores();\r\n\t\tint maxUnder = Integer.MIN_VALUE;\r\n\t\tint minOver = Integer.MAX_VALUE;\r\n\t\tfor (int score : scores) {\r\n\t\t\tif (score > 21 && score < minOver) {\r\n\t\t\t\tminOver = score;\r\n\t\t\t} else if (score <= 21 && score > maxUnder) {\r\n\t\t\t\tmaxUnder = score;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn maxUnder == Integer.MIN_VALUE ? minOver : maxUnder;\r\n\t}\r\n\t\r\n\tprivate ArrayList<Integer> possibleScores() {\r\n\t\tArrayList<Integer> scores = new ArrayList<Integer>();\r\n\t\tif (cards.size() == 0) {\r\n\t\t\treturn scores;\r\n\t\t}\r\n\t\tfor (BlackJackCard card : cards) {\r\n\t\t\taddCardToScoreList(card, scores);\r\n\t\t}\r\n\t\treturn scores;\r\n\t}\r\n\t\r\n\tprivate void addCardToScoreList(BlackJackCard card, ArrayList<Integer> scores) {\r\n\t\tif (scores.size() == 0) {\r\n\t\t\tscores.add(0);\r\n\t\t} \r\n\t\tint length = scores.size();\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tint score = scores.get(i);\r\n\t\t\tscores.set(i, score + card.minValue());\r\n\t\t\tif (card.minValue() != card.maxValue()) {\r\n\t\t\t\tscores.add(score + card.maxValue());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic boolean busted() {\r\n\t\treturn score() > 21;\r\n\t}\r\n\t\r\n\tpublic boolean is21() {\r\n\t\treturn score() == 21;\r\n\t}\r\n\t\r\n\tpublic boolean isBlackJack() {\r\n\t\tif (cards.size() != 2) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tBlackJackCard first = cards.get(0);\r\n\t\tBlackJackCard second = cards.get(1);\r\n\t\treturn (first.isAce() && second.isFaceCard()) || (second.isAce() && first.isFaceCard());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/Card.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\npublic abstract class Card {\r\n\tprivate boolean available = true;\r\n\t\r\n\t/* number or face that's on card - a number 2 through 10, \r\n\t * or 11 for Jack, 12 for Queen, 13 for King, or 1 for Ace \r\n\t */\r\n\tprotected int faceValue;\r\n\tprotected Suit suit;\r\n\r\n\tpublic Card(int c, Suit s) {\r\n\t\tfaceValue = c;\r\n\t\tsuit = s;\r\n\t}\r\n\t\r\n\tpublic abstract int value();\r\n\t\r\n\tpublic Suit suit() { \r\n\t\treturn suit; \r\n\t}\r\n\t\r\n\t/* returns whether or not the card is available to be given out to someone */\r\n\tpublic boolean isAvailable() {\r\n\t\treturn available;\r\n\t}\r\n\t\r\n\tpublic void markUnavailable() {\r\n\t\tavailable = false;\r\n\t}\r\n\t\r\n\tpublic void markAvailable() {\r\n\t\tavailable = true;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tString[] faceValues = {\"A\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"J\", \"Q\", \"K\"};\r\n\t\tSystem.out.print(faceValues[faceValue - 1]);\r\n\t\tswitch (suit) {\r\n\t\tcase Club:\r\n\t\t\tSystem.out.print(\"c\");\r\n\t\t\tbreak;\r\n\t\tcase Heart:\r\n\t\t\tSystem.out.print(\"h\");\r\n\t\t\tbreak;\r\n\t\tcase Diamond:\r\n\t\t\tSystem.out.print(\"d\");\r\n\t\t\tbreak;\r\n\t\tcase Spade:\r\n\t\t\tSystem.out.print(\"s\");\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tSystem.out.print(\" \");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/Deck.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Deck <T extends Card> {\r\n\tprivate ArrayList<T> cards;\r\n\tprivate int dealtIndex = 0; // marks first undealt card\r\n\t\r\n\tpublic Deck() {\r\n\t}\r\n\t\r\n\tpublic void setDeckOfCards(ArrayList<T> deckOfCards) {\r\n\t\tcards = deckOfCards;\r\n\t}\r\n\t\r\n\tpublic void shuffle() {\r\n\t\tfor (int i = 0; i < cards.size(); i++) {\r\n\t\t\tint j = AssortedMethods.randomIntInRange(i, cards.size() - i - 1);\r\n\t\t\tT card1 = cards.get(i);\r\n\t\t\tT card2 = cards.get(j);\r\n\t\t\tcards.set(i, card2);\r\n\t\t\tcards.set(j, card1);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int remainingCards() {\r\n\t\treturn cards.size() - dealtIndex;\r\n\t}\r\n\t\r\n\tpublic T[] dealHand(int number) {\r\n\t\tif (remainingCards() < number) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tT[] hand = (T[]) new Card[number];\r\n\t\tint count = 0;\r\n\t\twhile (count < number) {\r\n\t\t\tT card = dealCard();\r\n\t\t\tif (card != null) {\r\n\t\t\t\thand[count] = card;\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn hand;\r\n\t}\r\n\t\r\n\tpublic T dealCard() {\r\n\t\tif (remainingCards() == 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tT card = cards.get(dealtIndex);\r\n\t\tcard.markUnavailable();\r\n\t\tdealtIndex++;\r\n\t\t\r\n\t\treturn card;\t\t\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tfor (Card card : cards) {\r\n\t\t\tcard.print();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/Hand.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Hand <T extends Card> {\r\n\tprotected ArrayList<T> cards = new ArrayList<T>();\r\n\t\r\n\tpublic int score() {\r\n\t\tint score = 0;\r\n\t\tfor (T card : cards) {\r\n\t\t\tscore += card.value();\r\n\t\t}\r\n\t\treturn score;\r\n\t}\r\n\t\r\n\tpublic void addCard(T card) {\r\n\t\tcards.add(card);\r\n\t}\t\r\n\t\r\n\tpublic void print() {\r\n\t\tfor (Card card : cards) {\r\n\t\t\tcard.print();\r\n\t\t}\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/Question.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Question {\r\n\r\n\t\r\n\tpublic static void main(String[] args) {\t\r\n\t\tint numHands = 5;\r\n\t\t\r\n\t\tBlackJackGameAutomator automator = new BlackJackGameAutomator(numHands);\r\n\t\tautomator.initializeDeck();\r\n\t\tboolean success = automator.dealInitial();\r\n\t\t\tif (!success) {\r\n\t\t\t\tSystem.out.println(\"Error. Out of cards.\");\r\n\t\t\t} else {\r\n\t\t\tSystem.out.println(\"-- Initial --\");\r\n\t\t\tautomator.printHandsAndScore();\r\n\t\t\tArrayList<Integer> blackjacks = automator.getBlackJacks();\r\n\t\t\tif (blackjacks.size() > 0) {\r\n\t\t\t\tSystem.out.print(\"Blackjack at \");\r\n\t\t\t\tfor (int i : blackjacks) {\r\n\t\t\t\t\tSystem.out.print(i + \", \");\r\n\t\t\t\t}\r\n\t\t\t\tSystem.out.println(\"\");\r\n\t\t\t} else {\r\n\t\t\t\tsuccess = automator.playAllHands();\r\n\t\t\t\tif (!success) {\r\n\t\t\t\t\tSystem.out.println(\"Error. Out of cards.\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSystem.out.println(\"\\n-- Completed Game --\");\r\n\t\t\t\t\tautomator.printHandsAndScore();\r\n\t\t\t\t\tArrayList<Integer> winners = automator.getWinners();\r\n\t\t\t\t\tif (winners.size() > 0) {\r\n\t\t\t\t\t\tSystem.out.print(\"Winners: \");\r\n\t\t\t\t\t\tfor (int i : winners) {\r\n\t\t\t\t\t\t\tSystem.out.print(i + \", \");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tSystem.out.println(\"\");\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tSystem.out.println(\"Draw. All players have busted.\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_01_Deck_of_Cards/Suit.java",
    "content": "package Q7_01_Deck_of_Cards;\r\n\r\npublic enum Suit { \r\n\tClub (0),\r\n\tDiamond (1),\r\n\tHeart (2),\r\n\tSpade (3);\r\n\t\r\n\tprivate int value;\r\n\tprivate Suit(int v) {\r\n\t\tvalue = v;\r\n\t}\r\n\t\r\n\tpublic int getValue() {\r\n\t\treturn value;\r\n\t}\r\n\t\r\n\tpublic static Suit getSuitFromValue(int value) {\r\n\t\tswitch (value) {\r\n\t\tcase 0:\r\n\t\t\treturn Suit.Club;\r\n\t\tcase 1:\r\n\t\t\treturn Suit.Diamond;\r\n\t\tcase 2:\r\n\t\t\treturn Suit.Heart;\r\n\t\tcase 3: \r\n\t\t\treturn Suit.Spade;\r\n\t\tdefault:\r\n\t\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Call.java",
    "content": "package Q7_02_Call_Center;\r\n\r\n/* Represents a call from a user. Calls have a minimum rank and are assigned to the\r\n * first employee who can handle that call.\r\n */\r\npublic class Call {\r\n\t/* Minimal rank of employee who can handle this call. */\r\n\tprivate Rank rank;\r\n\r\n\t/* Person who is calling. */\r\n\tprivate Caller caller;\r\n\r\n\t/* Employee who is handling call. */\r\n\tprivate Employee handler;\r\n\r\n\tpublic Call(Caller c) {\r\n\t\trank = Rank.Responder;\r\n\t\tcaller = c;\r\n\t}\r\n\r\n\t/* Set employee who is handling call. */\r\n\tpublic void setHandler(Employee e) {\r\n\t\thandler = e;\r\n\t}\r\n\r\n\t/* Play recorded message to the customer. */\r\n\tpublic void reply(String message) {\r\n\t\tSystem.out.println(message);\r\n\t}\r\n\r\n\tpublic Rank getRank() {\r\n\t\treturn rank;\r\n\t}\r\n\r\n\tpublic void setRank(Rank r) {\r\n\t\trank = r;\r\n\t}\r\n\r\n\tpublic Rank incrementRank() {\r\n\t\tif (rank == Rank.Responder) {\r\n\t\t\trank = Rank.Manager;\r\n\t\t} else if (rank == Rank.Manager) {\r\n\t\t\trank = Rank.Director;\r\n\t\t}\r\n\t\treturn rank;\r\n\t}\r\n\r\n\t/* Disconnect call. */\r\n\tpublic void disconnect() {\r\n\t\treply(\"Thank you for calling\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/CallHandler.java",
    "content": "package Q7_02_Call_Center;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\n/* CallHandler represents the body of the program,\r\n * and all calls are funneled first through it. \r\n */\r\npublic class CallHandler {\t\r\n\t/* We have 3 levels of employees: respondents, managers, directors. */\r\n    private final int LEVELS = 3; \r\n    \r\n    /* Initialize with 10 respondents, 4 managers, and 2 directors. */\r\n    private final int NUM_RESPONDENTS = 10;\r\n    private final int NUM_MANAGERS = 4;\r\n    private final int NUM_DIRECTORS = 2;\r\n\r\n    /* List of employees, by level.\r\n     * employeeLevels[0] = respondents\r\n     * employeeLevels[1] = managers\r\n     * employeeLevels[2] = directors\r\n     */\r\n    List<List<Employee>> employeeLevels;\r\n\r\n\t/* queues for each call�s rank */\r\n    List<List<Call>> callQueues; \r\n\r\n    public CallHandler() {\r\n    \temployeeLevels = new ArrayList<List<Employee>>(LEVELS);\r\n    \tcallQueues = new ArrayList<List<Call>>(LEVELS); \r\n    \t\r\n        // Create respondents.\r\n        ArrayList<Employee> respondents = new ArrayList<Employee>(NUM_RESPONDENTS);\r\n        for (int k = 0; k < NUM_RESPONDENTS - 1; k++) {\r\n            respondents.add(new Respondent(this));\r\n        }\r\n        employeeLevels.add(respondents);\r\n\r\n        // Create managers.\r\n        ArrayList<Employee> managers = new ArrayList<Employee>(NUM_MANAGERS);\r\n        managers.add(new Manager(this));\r\n        employeeLevels.add(managers);\r\n\r\n        // Create directors.\r\n        ArrayList<Employee> directors = new ArrayList<Employee>(NUM_DIRECTORS);\r\n        directors.add(new Director(this));\r\n        employeeLevels.add(directors);\r\n    }\r\n    \r\n    /* Gets the first available employee who can handle this call. */\r\n    public Employee getHandlerForCall(Call call) {\r\n        for (int level = call.getRank().getValue(); level < LEVELS - 1; level++) {\r\n            List<Employee> employeeLevel = employeeLevels.get(level);\r\n            for (Employee emp : employeeLevel) {\r\n                if (emp.isFree()) {\r\n                    return emp;\r\n                }\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n    /* Routes the call to an available employee, or saves in a queue if no employee available. */\r\n    public void dispatchCall(Caller caller) {\r\n    \tCall call = new Call(caller);\r\n    \tdispatchCall(call);\r\n    }\r\n    \r\n    /* Routes the call to an available employee, or saves in a queue if no employee available. */\r\n    public void dispatchCall(Call call) {\r\n    \t/* Try to route the call to an employee with minimal rank. */\r\n        Employee emp = getHandlerForCall(call);\r\n        if (emp != null) {\r\n        \temp.receiveCall(call);\r\n        \tcall.setHandler(emp);\r\n        } else {\r\n\t        /* Place the call into corresponding call queue according to its rank. */\r\n\t        call.reply(\"Please wait for free employee to reply\");\r\n\t        callQueues.get(call.getRank().getValue()).add(call);\r\n        }\r\n    }    \r\n\r\n    /* An employee got free. Look for a waiting call that he/she can serve. Return true\r\n     * if we were able to assign a call, false otherwise. */\r\n    public boolean assignCall(Employee emp) {\r\n        /* Check the queues, starting from the highest rank this employee can serve. */\r\n        for (int rank = emp.getRank().getValue(); rank >= 0; rank--) {\r\n            List<Call> que = callQueues.get(rank);\r\n            \r\n            /* Remove the first call, if any */\r\n            if (que.size() > 0) {\r\n\t            Call call = que.remove(0); \r\n\t            if (call != null) {\r\n\t                emp.receiveCall(call);\r\n\t                return true;\r\n\t            }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Caller.java",
    "content": "package Q7_02_Call_Center;\r\n\r\npublic class Caller {\r\n\tprivate String name;\r\n\tprivate int userId;\r\n\tpublic Caller(int id, String nm) {\r\n\t\tname = nm;\r\n\t\tuserId = id;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Director.java",
    "content": "package Q7_02_Call_Center;\r\n\r\nclass Director extends Employee {\r\n    public Director(CallHandler callHandler) {\r\n    \tsuper(callHandler);\r\n    \trank = Rank.Director;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Employee.java",
    "content": "package Q7_02_Call_Center;\r\n\r\n/* Employee is a super class for the Director, Manager, and Respondent classes. It is implemented as an\r\n * abstract class, since there should be no reason to instantiated an Employee type directly.\r\n */\r\nabstract class Employee {\r\n\tprivate Call currentCall = null;\r\n\tprotected Rank rank;\r\n\tprivate CallHandler callHandler;\r\n\r\n\tpublic Employee(CallHandler handler) {\r\n\t\tcallHandler = handler;\r\n\t}\r\n\r\n\t/* Start the conversation */\r\n\tpublic void receiveCall(Call call) {\r\n\t\tcurrentCall = call;\r\n\t}\r\n\r\n\t/* the issue is resolved, finish the call */\r\n\tpublic void callCompleted() {\r\n\t\tif (currentCall != null) {\r\n\t\t\t/* Disconnect the call. */\r\n\t\t\tcurrentCall.disconnect();\r\n\r\n\t\t\t/* Free the employee */\r\n\t\t\tcurrentCall = null;\r\n\t\t}\r\n\r\n\t\t/* Check if there is a call waiting in queue */\r\n\t\tassignNewCall();\r\n\t}\r\n\r\n\t/*\r\n\t * The issue has not been resolved. Escalate the call, and assign a new call\r\n\t * to the employee.\r\n\t */\r\n\tpublic void escalateAndReassign() {\r\n\t\tif (currentCall != null) {\r\n\t\t\t/* escalate call */\r\n\t\t\tcurrentCall.incrementRank();\r\n\t\t\tcallHandler.dispatchCall(currentCall);\r\n\r\n\t\t\t/* free the employee */\r\n\t\t\tcurrentCall = null;\r\n\t\t}\r\n\r\n\t\t/* assign a new call */\r\n\t\tassignNewCall();\r\n\t}\r\n\r\n\t/* Assign a new call to an employee, if the employee is free. */\r\n\tpublic boolean assignNewCall() {\r\n\t\tif (!isFree()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn callHandler.assignCall(this);\r\n\t}\r\n\r\n\t/* Returns whether or not the employee is free. */\r\n\tpublic boolean isFree() {\r\n\t\treturn currentCall == null;\r\n\t}\r\n\r\n\tpublic Rank getRank() {\r\n\t\treturn rank;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Manager.java",
    "content": "package Q7_02_Call_Center;\r\n\r\nclass Manager extends Employee {\r\n    public Manager(CallHandler callHandler) {\r\n    \tsuper(callHandler);\r\n    \trank = Rank.Manager;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Rank.java",
    "content": "package Q7_02_Call_Center;\r\n\r\npublic enum Rank {\r\n\tResponder (0),\r\n\tManager (1),\r\n\tDirector (2);\r\n\t\r\n\tprivate int value;\r\n\t\r\n\tprivate Rank(int v) {\r\n\t\tvalue = v;\r\n\t}\r\n\t\r\n\tpublic int getValue() {\r\n\t\treturn value;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Respondent.java",
    "content": "package Q7_02_Call_Center;\r\n\r\nclass Respondent extends Employee {\r\n    public Respondent(CallHandler callHandler) {\r\n    \tsuper(callHandler);\r\n    \trank = Rank.Responder;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_02_Call_Center/Test.java",
    "content": "package Q7_02_Call_Center;\r\n\r\npublic class Test {\r\n\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tCallHandler ch = new CallHandler();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/CD.java",
    "content": "package Q7_03_Jukebox;\r\n\r\npublic class CD {\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/CDPlayer.java",
    "content": "package Q7_03_Jukebox;\r\n\r\npublic class CDPlayer {\r\n\tprivate Playlist p;\r\n\tprivate CD c;\r\n\t\r\n\tpublic Playlist getPlaylist() { return p; }\r\n\tpublic void setPlaylist(Playlist p) { this.p = p; }\r\n\tpublic CD getCD() { return c; }\r\n\tpublic void setCD(CD c) { this.c = c; }\r\n\t\r\n\tpublic CDPlayer(Playlist p) { this.p = p; }\r\n\tpublic CDPlayer(CD c, Playlist p) { \r\n\t\tthis.p = p;\r\n\t\tthis.c = c;\r\n\t}\r\n\r\n\tpublic CDPlayer(CD c){ this.c = c; }\r\n\tpublic void playSong(Song s) {  }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/JukeBox.java",
    "content": "package Q7_03_Jukebox;\r\n\r\nimport java.util.Set;\r\n\r\npublic class JukeBox {\r\n\tprivate CDPlayer cdPlayer;\r\n\tprivate User user;\r\n\tprivate Set<CD> cdCollection;\r\n\tprivate SongSelector ts;\r\n\t\r\n\tpublic JukeBox(CDPlayer cdPlayer, User user, Set<CD> cdCollection,\r\n\t\t\t\t   SongSelector ts) {\r\n\t\tsuper();\r\n\t\tthis.cdPlayer = cdPlayer;\r\n\t\tthis.user = user;\r\n\t\tthis.cdCollection = cdCollection;\r\n\t\tthis.ts = ts;\r\n\t}\r\n\t\r\n\tpublic Song getCurrentSong() { return ts.getCurrentSong();\t}\r\n\tpublic void setUser(User u) { this.user = u;\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/Playlist.java",
    "content": "package Q7_03_Jukebox;\r\n\r\nimport java.util.Queue;\r\n\r\npublic class Playlist {\r\n\tprivate Song song;\r\n\tprivate Queue<Song> queue;\r\n\tpublic Playlist(Song song, Queue<Song> queue) {\r\n\t\tsuper();\r\n\t\tthis.song = song;\r\n\t\tthis.queue = queue;\r\n\t}\r\n\t\r\n\tpublic Song getNextSongToPlay(){ return queue.peek(); }\r\n\tpublic void queueUpSong(Song s){ queue.add(s); }\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/Song.java",
    "content": "package Q7_03_Jukebox;\r\n\r\npublic class Song {\r\n\tprivate String songName;\r\n\tpublic String toString() { return songName; }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/SongSelector.java",
    "content": "package Q7_03_Jukebox;\r\n\r\n\r\npublic class SongSelector {\r\n\tprivate Song currentSong;\r\n\tpublic SongSelector(Song s) { currentSong=s; }\r\n\tpublic void setSong(Song s) { currentSong = s;\t}\r\n\tpublic Song getCurrentSong() { return currentSong;\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_03_Jukebox/User.java",
    "content": "package Q7_03_Jukebox;\r\n\r\npublic class User {\r\n\tprivate String name;\r\n\tpublic String getName() { return name; }\r\n\tpublic void setName(String name) {\tthis.name = name; }\r\n\tpublic long getID() { return ID; }\r\n\tpublic void setID(long iD) { ID = iD; }\r\n\tprivate long ID;\r\n\tpublic User(String name, long iD) {\r\n\t\tthis.name = name;\r\n\t\tID = iD;\r\n\t}\r\n\tpublic User getUser() { return this; }\r\n\tpublic static User addUser(String name, long iD){\r\n\t\treturn new User(name, iD);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/Bus.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\npublic class Bus extends Vehicle {\r\n\tpublic Bus() {\r\n\t\tspotsNeeded = 5;\r\n\t\tsize = VehicleSize.Large;\r\n\t}\r\n\t\r\n\tpublic boolean canFitInSpot(ParkingSpot spot) {\r\n\t\treturn spot.getSize() == VehicleSize.Large;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tSystem.out.print(\"B\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/Car.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\npublic class Car extends Vehicle {\r\n\tpublic Car() {\r\n\t\tspotsNeeded = 1;\r\n\t\tsize = VehicleSize.Compact;\r\n\t}\r\n\t\r\n\tpublic boolean canFitInSpot(ParkingSpot spot) {\r\n\t\treturn spot.getSize() == VehicleSize.Large || spot.getSize() == VehicleSize.Compact;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tSystem.out.print(\"C\");\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/Level.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\n/* Represents a level in a parking garage */\r\npublic class Level {\r\n\tprivate int floor;\r\n\tprivate ParkingSpot[] spots;\r\n\tprivate int availableSpots = 0; // number of free spots\r\n\tprivate static final int SPOTS_PER_ROW = 10;\r\n\t\r\n\tpublic Level(int flr, int numberSpots) {\r\n\t\tfloor = flr;\r\n\t\tspots = new ParkingSpot[numberSpots];\r\n\t\tint largeSpots = numberSpots / 4;\r\n\t\tint bikeSpots = numberSpots / 4;\r\n\t\tint compactSpots = numberSpots - largeSpots - bikeSpots;\r\n\t\tfor (int i = 0; i < numberSpots; i++) {\r\n\t\t\tVehicleSize sz = VehicleSize.Motorcycle;\r\n\t\t\tif (i < largeSpots) {\r\n\t\t\t\tsz = VehicleSize.Large;\r\n\t\t\t} else if (i < largeSpots + compactSpots) {\r\n\t\t\t\tsz = VehicleSize.Compact;\r\n\t\t\t}\r\n\t\t\tint row = i / SPOTS_PER_ROW;\r\n\t\t\tspots[i] = new ParkingSpot(this, row, i, sz);\r\n\t\t}\r\n\t\tavailableSpots = numberSpots;\r\n\t}\r\n\t\r\n\tpublic int availableSpots() {\r\n\t\treturn availableSpots;\r\n\t}\r\n\t\r\n\t/* Try to find a place to park this vehicle. Return false if failed. */\r\n\tpublic boolean parkVehicle(Vehicle vehicle) {\r\n\t\tif (availableSpots() < vehicle.getSpotsNeeded()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tint spotNumber = findAvailableSpots(vehicle);\r\n\t\tif (spotNumber < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn parkStartingAtSpot(spotNumber, vehicle);\r\n\t}\r\n\t\r\n\t/* Park a vehicle starting at the spot spotNumber, and continuing until vehicle.spotsNeeded. */\r\n\tprivate boolean parkStartingAtSpot(int spotNumber, Vehicle vehicle) {\r\n\t\tvehicle.clearSpots();\r\n\t\tboolean success = true;\r\n\t\tfor (int i = spotNumber; i < spotNumber + vehicle.spotsNeeded; i++) {\r\n\t\t\t success &= spots[i].park(vehicle);\r\n\t\t}\r\n\t\tavailableSpots -= vehicle.spotsNeeded;\r\n\t\treturn success;\r\n\t}\r\n\t\r\n\t/* find a spot to park this vehicle. Return index of spot, or -1 on failure. */\r\n\tprivate int findAvailableSpots(Vehicle vehicle) {\r\n\t\tint spotsNeeded = vehicle.getSpotsNeeded();\r\n\t\tint lastRow = -1;\r\n\t\tint spotsFound = 0;\r\n\t\tfor (int i = 0; i < spots.length; i++) {\r\n\t\t\tParkingSpot spot = spots[i];\r\n\t\t\tif (lastRow != spot.getRow()) {\r\n\t\t\t\tspotsFound = 0;\r\n\t\t\t\tlastRow = spot.getRow();\r\n\t\t\t}\r\n\t\t\tif (spot.canFitVehicle(vehicle)) {\r\n\t\t\t\tspotsFound++;\r\n\t\t\t} else {\r\n\t\t\t\tspotsFound = 0;\r\n\t\t\t}\r\n\t\t\tif (spotsFound == spotsNeeded) {\r\n\t\t\t\treturn i - (spotsNeeded - 1);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tint lastRow = -1;\r\n\t\tfor (int i = 0; i < spots.length; i++) {\r\n\t\t\tParkingSpot spot = spots[i];\r\n\t\t\tif (spot.getRow() != lastRow) {\r\n\t\t\t\tSystem.out.print(\"  \");\r\n\t\t\t\tlastRow = spot.getRow();\r\n\t\t\t}\r\n\t\t\tspot.print();\r\n\t\t}\r\n\t}\r\n\t\r\n\t/* When a car was removed from the spot, increment availableSpots */\r\n\tpublic void spotFreed() {\r\n\t\tavailableSpots++;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/Motorcycle.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\npublic class Motorcycle extends Vehicle {\r\n\tpublic Motorcycle() {\r\n\t\tspotsNeeded = 1;\r\n\t\tsize = VehicleSize.Motorcycle;\r\n\t}\r\n\t\r\n\tpublic boolean canFitInSpot(ParkingSpot spot) {\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tSystem.out.print(\"M\");\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/ParkingLot.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\npublic class ParkingLot {\r\n\tprivate Level[] levels;\r\n\tprivate final int NUM_LEVELS = 5;\r\n\t\r\n\tpublic ParkingLot() {\r\n\t\tlevels = new Level[NUM_LEVELS];\r\n\t\tfor (int i = 0; i < NUM_LEVELS; i++) {\r\n\t\t\tlevels[i] = new Level(i, 30);\r\n\t\t}\r\n\t}\r\n\t\r\n\t/* Park the vehicle in a spot (or multiple spots). Return false if failed. */\r\n\tpublic boolean parkVehicle(Vehicle vehicle) {\r\n\t\tfor (int i = 0; i < levels.length; i++) {\r\n\t\t\tif (levels[i].parkVehicle(vehicle)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tfor (int i = 0; i < levels.length; i++) {\r\n\t\t\tSystem.out.print(\"Level\" + i + \": \");\r\n\t\t\tlevels[i].print();\r\n\t\t\tSystem.out.println(\"\");\r\n\t\t}\r\n\t\tSystem.out.println(\"\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/ParkingSpot.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\npublic class ParkingSpot {\r\n\tprivate Vehicle vehicle;\r\n\tprivate VehicleSize spotSize;\r\n\tprivate int row;\r\n\tprivate int spotNumber;\r\n\tprivate Level level;\r\n\t\r\n\tpublic ParkingSpot(Level lvl, int r, int n, VehicleSize sz) {\r\n\t\tlevel = lvl;\r\n\t\trow = r;\r\n\t\tspotNumber = n;\r\n\t\tspotSize = sz;\r\n\t}\r\n\t\r\n\tpublic boolean isAvailable() {\r\n\t\treturn vehicle == null;\r\n\t}\r\n\t\r\n\t/* Checks if the spot is big enough for the vehicle (and is available). This compares\r\n\t * the SIZE only. It does not check if it has enough spots. */\r\n\tpublic boolean canFitVehicle(Vehicle vehicle) {\r\n\t\treturn isAvailable() && vehicle.canFitInSpot(this);\r\n\t}\r\n\t\r\n\t/* Park vehicle in this spot. */\r\n\tpublic boolean park(Vehicle v) {\r\n\t\tif (!canFitVehicle(v)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvehicle = v;\r\n\t\tvehicle.parkInSpot(this);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic int getRow() {\r\n\t\treturn row;\r\n\t}\r\n\t\r\n\tpublic int getSpotNumber() {\r\n\t\treturn spotNumber;\r\n\t}\r\n\t\r\n\tpublic VehicleSize getSize() {\r\n\t\treturn spotSize;\r\n\t}\r\n\t\r\n\t/* Remove vehicle from spot, and notify level that a new spot is available */\r\n\tpublic void removeVehicle() {\r\n\t\tlevel.spotFreed();\r\n\t\tvehicle = null;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tif (vehicle == null) {\r\n\t\t\tif (spotSize == VehicleSize.Compact) {\r\n\t\t\t\tSystem.out.print(\"c\");\r\n\t\t\t} else if (spotSize == VehicleSize.Large) {\r\n\t\t\t\tSystem.out.print(\"l\");\r\n\t\t\t} else if (spotSize == VehicleSize.Motorcycle) {\r\n\t\t\t\tSystem.out.print(\"m\");\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvehicle.print();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/Question.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tParkingLot lot = new ParkingLot();\r\n\t\t\r\n\t\tVehicle v = null;\r\n\t\twhile (v == null || lot.parkVehicle(v)) {\r\n\t\t\tlot.print();\r\n\t\t\tint r = AssortedMethods.randomIntInRange(0, 10);\r\n\t\t\tif (r < 2) {\r\n\t\t\t\tv = new Bus();\r\n\t\t\t} else if (r < 4) {\r\n\t\t\t\tv = new Motorcycle();\r\n\t\t\t} else {\r\n\t\t\t\tv = new Car();\r\n\t\t\t}\r\n\t\t\tSystem.out.print(\"\\nParking a \");\r\n\t\t\tv.print();\r\n\t\t\tSystem.out.println(\"\");\r\n\t\t}\r\n\t\tSystem.out.println(\"Parking Failed. Final state: \");\r\n\t\tlot.print();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/Vehicle.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic abstract class Vehicle {\r\n\tprotected ArrayList<ParkingSpot> parkingSpots = new ArrayList<ParkingSpot>();\r\n\tprotected String licensePlate;\r\n\tprotected int spotsNeeded;\r\n\tprotected VehicleSize size;\r\n\t\r\n\tpublic int getSpotsNeeded() {\r\n\t\treturn spotsNeeded;\r\n\t}\r\n\t\r\n\tpublic VehicleSize getSize() {\r\n\t\treturn size;\r\n\t}\r\n\r\n\t/* Park vehicle in this spot (among others, potentially) */\r\n\tpublic void parkInSpot(ParkingSpot spot) {\r\n\t\tparkingSpots.add(spot);\r\n\t}\r\n\t\r\n\t/* Remove car from spot, and notify spot that it's gone */\r\n\tpublic void clearSpots() {\r\n\t\tfor (int i = 0; i < parkingSpots.size(); i++) {\r\n\t\t\tparkingSpots.get(i).removeVehicle();\r\n\t\t}\r\n\t\tparkingSpots.clear();\r\n\t}\r\n\t\r\n\tpublic abstract boolean canFitInSpot(ParkingSpot spot);\r\n\tpublic abstract void print();\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_04_Parking_Lot/VehicleSize.java",
    "content": "package Q7_04_Parking_Lot;\r\n\r\npublic enum VehicleSize {\r\n\tMotorcycle, \r\n\tCompact, \r\n\tLarge,\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_05_Online_Book_Reader/Book.java",
    "content": "package Q7_05_Online_Book_Reader;\r\n\r\npublic class Book {\r\n\tprivate int bookId;\r\n\tprivate String details;\t\r\n\t\r\n\tpublic Book(int id, String det) {\r\n\t\tbookId = id;\r\n\t\tdetails = det;\r\n\t}\r\n\t\r\n\tpublic void update() { } \r\n\t\r\n\tpublic int getID() { \r\n\t\treturn bookId; \r\n\t}\r\n\t\r\n\tpublic void setID(int id) { \r\n\t\tbookId = id;\r\n\t}\r\n\t\r\n\tpublic String getDetails() { \r\n\t\treturn details;\r\n\t}\r\n\t\r\n\tpublic void setDetails(String details) { \r\n\t\tthis.details = details; \r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_05_Online_Book_Reader/Display.java",
    "content": "package Q7_05_Online_Book_Reader;\r\n\r\npublic class Display {\r\n\tprivate Book activeBook;\r\n\tprivate User activeUser;\r\n\tprivate int pageNumber = 0;\r\n\t\r\n\tpublic void displayUser(User user) {\r\n\t\tactiveUser = user;\r\n\t\trefreshUsername();\r\n\t}\r\n\t\r\n\tpublic void displayBook(Book book) {\r\n\t\tpageNumber = 0;\r\n\t\tactiveBook = book;\r\n\t\t\r\n\t\trefreshTitle();\r\n\t\trefreshDetails();\r\n\t\trefreshPage();\r\n\t}\r\n\t\r\n\tpublic void refreshUsername() {\r\n\t\t/* updates username display */\r\n\t}\r\n\t\r\n\tpublic void refreshTitle() {\r\n\t\t/* updates title display */\r\n\t}\r\n\t\r\n\tpublic void refreshDetails() {\r\n\t\t/* updates details display */\r\n\t}\r\n\t\r\n\tpublic void refreshPage() {\r\n\t\t/* updated page display */\r\n\t}\r\n\t\r\n\tpublic void turnPageForward() {\r\n\t\tpageNumber++;\r\n\t\trefreshPage();\r\n\t}\r\n\t\r\n\tpublic void turnPageBackward() {\r\n\t\tpageNumber--;\r\n\t\trefreshPage();\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_05_Online_Book_Reader/Library.java",
    "content": "package Q7_05_Online_Book_Reader;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class Library {\r\n\r\n\tprivate HashMap<Integer, Book> books;\r\n\t\r\n\tpublic Book addBook(int id, String details) {\r\n\t\tif (books.containsKey(id)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tBook book = new Book(id, details);\r\n\t\tbooks.put(id, book);\r\n\t\treturn book;\r\n\t}\r\n\t\r\n\tpublic boolean remove(Book b){\r\n\t\treturn remove(b.getID());\r\n\t}\r\n\t\r\n\tpublic boolean remove(int id) {\r\n\t\tif (!books.containsKey(id)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tbooks.remove(id);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic Book find(int id){\r\n\t\treturn books.get(id);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_05_Online_Book_Reader/OnlineReaderSystem.java",
    "content": "package Q7_05_Online_Book_Reader;\r\n\r\npublic class OnlineReaderSystem {\r\n\tprivate Library library;\r\n\tprivate UserManager userManager;\r\n\tprivate Display display;\r\n\t\r\n\tprivate Book activeBook;\r\n\tprivate User activeUser;\r\n\t\r\n\tpublic OnlineReaderSystem() {\r\n\t\tuserManager = new UserManager();\r\n\t\tlibrary = new Library();\r\n\t\tdisplay = new Display();\r\n\t}\r\n\t\r\n\tpublic Library getLibrary() {\r\n\t\treturn library;\r\n\t}\r\n\t\r\n\tpublic UserManager getUserManager() {\r\n\t\treturn userManager;\r\n\t}\r\n\t\r\n\tpublic Display getDisplay() {\r\n\t\treturn display;\r\n\t}\r\n\t\r\n\tpublic Book getActiveBook() {\r\n\t\treturn activeBook;\r\n\t}\r\n\t\r\n\tpublic void setActiveBook(Book book) {\r\n\t\tdisplay.displayBook(book);\r\n\t\tactiveBook = book;\r\n\t}\r\n\t\r\n\tpublic User getActiveUser() {\r\n\t\treturn activeUser;\r\n\t}\r\n\t\r\n\tpublic void setActiveUser(User user) {\r\n\t\tactiveUser = user;\r\n\t\tdisplay.displayUser(user);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_05_Online_Book_Reader/User.java",
    "content": "package Q7_05_Online_Book_Reader;\r\n\r\npublic class User {\r\n\tprivate int userId;\r\n\tprivate String details;\r\n\tprivate int accountType;\r\n\t\r\n\tpublic void renewMembership() {  }\r\n\r\n\tpublic User(int id, String details, int accountType) {\r\n\t\tuserId = id;\r\n\t\tthis.details = details;\r\n\t\tthis.accountType = accountType;\r\n\t}\r\n\t\r\n\t/* getters and setters */\r\n\tpublic int getID() { return userId; }\r\n\tpublic void setID(int id) { userId = id; }\r\n\tpublic String getDetails() { return details; }\r\n\tpublic void setDetails(String details) { this.details = details; }\r\n\tpublic int getAccountType() { return accountType; }\r\n\tpublic void setAccountType(int accountType) { \r\n\t\tthis.accountType = accountType;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_05_Online_Book_Reader/UserManager.java",
    "content": "package Q7_05_Online_Book_Reader;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class UserManager {\r\n\tprivate HashMap<Integer, User> users;\r\n\t\r\n\tpublic User addUser(int id, String details, int accountType) {\r\n\t\tif (users.containsKey(id)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tUser user = new User(id, details, accountType);\r\n\t\tusers.put(id, user);\r\n\t\treturn user;\r\n\t}\r\n\t\r\n\tpublic boolean remove(User u) {\r\n\t\treturn remove(u.getID());\r\n\t}\r\n\t\r\n\tpublic boolean remove(int id) {\r\n\t\tif (!users.containsKey(id)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tusers.remove(id);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic User find(int id){\r\n\t\treturn users.get(id);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_06_Jigsaw/Edge.java",
    "content": "package Q7_06_Jigsaw;\n\npublic class Edge {\t\n\tprivate Shape shape;\n\tprivate String code; // used to mock how pieces would fit together.\n\tprivate Piece parentPiece;\n\t\n\tpublic Edge(Shape shape, String code) {\n\t\tthis.shape = shape;\n\t\tthis.code = code;\n\t}\n\t\n\tprivate String getCode() {\n\t\treturn code;\n\t}\n\t\n\tpublic Edge _createMatchingEdge() {\n\t\tif (shape == Shape.FLAT) return null;\n\t\treturn new Edge(shape.getOpposite(), getCode());\n\t}\n\n\t/* Check if this edge fits into the other one. */\n\tpublic boolean fitsWith(Edge edge) { \n\t\treturn edge.getCode().equals(getCode());\n\t}\n\t\n\t/* Set parent piece. */\n\tpublic void setParentPiece(Piece parentPiece) {\n\t\tthis.parentPiece = parentPiece;\n\t}\n\t\n\t/* Get the parent piece. */\n\tpublic Piece getParentPiece() {\n\t\treturn parentPiece;\n\t}\n\t\n\t/* Return the shape of the edge. */\n\tpublic Shape getShape() {\n\t\treturn shape;\n\t}\n\t\n\tpublic String toString() {\n\t\treturn code;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_06_Jigsaw/Orientation.java",
    "content": "package Q7_06_Jigsaw;\n\npublic enum Orientation {\n\tLEFT, TOP, RIGHT, BOTTOM; // Should stay in this order \n\t\n\tpublic Orientation getOpposite() {\n\t\tswitch (this) {\n\t\t\tcase LEFT: return RIGHT;\n\t\t\tcase RIGHT: return LEFT;\n\t\t\tcase TOP: return BOTTOM;\n\t\t\tcase BOTTOM: return TOP;\n\t\t\tdefault: return null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_06_Jigsaw/Piece.java",
    "content": "package Q7_06_Jigsaw;\n\nimport java.util.HashMap;\nimport java.util.Map.Entry;\n\npublic class Piece {\n\tprivate final static int NUMBER_OF_EDGES = 4;\n\tprivate HashMap<Orientation, Edge> edges = new HashMap<Orientation, Edge>();\n\t\n\tpublic Piece(Edge[] edgeList) {\t\t\n\t\tOrientation[] orientations = Orientation.values();\n\t\tfor (int i = 0; i < edgeList.length; i++) {\n\t\t\tEdge edge = edgeList[i];\n\t\t\tedge.setParentPiece(this);\t\n\t\t\tedges.put(orientations[i], edge);\n\t\t}\n\t}\n\t\n\t/* Set this edge in the appropriate orientation, rotating the piece as necessary. */\n\tpublic void setEdgeAsOrientation(Edge edge, Orientation orientation) {\n\t\tOrientation currentOrientation = getOrientation(edge);\n\t\trotateEdgesBy(orientation.ordinal() - currentOrientation.ordinal());\n\t}\n\t\n\t/* Return the current orientation of the edge. */\n\tprivate Orientation getOrientation(Edge edge) {\n\t\tfor (Entry<Orientation, Edge> entry : edges.entrySet()) {\n\t\t\tif (entry.getValue() == edge) {\n\t\t\t\treturn entry.getKey();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t/* Rotate edges by \"numberRotations\". */\n\tpublic void rotateEdgesBy(int numberRotations) {\n\t\tOrientation[] orientations = Orientation.values();\n\t\tHashMap<Orientation, Edge> rotated = new HashMap<Orientation, Edge>();\n\t\t\n\t\tnumberRotations = numberRotations % NUMBER_OF_EDGES;\n\t\tif (numberRotations < 0) numberRotations += NUMBER_OF_EDGES;\n\t\t\n\t\tfor (int i = 0; i < orientations.length; i++) {\n\t\t\tOrientation oldOrientation = orientations[(i - numberRotations + NUMBER_OF_EDGES) % NUMBER_OF_EDGES];\n\t\t\tOrientation newOrientation = orientations[i];\n\t\t\trotated.put(newOrientation, edges.get(oldOrientation));\n\t\t}\t\t\n\t\tedges = rotated;\n\t}\n\t\n\t/* Check if this piece is a corner piece. */\n\tpublic boolean isCorner() {\n\t\tOrientation[] orientations = Orientation.values();\n\t\tfor (int i = 0; i < orientations.length; i++) {\n\t\t\tShape current = edges.get(orientations[i]).getShape();\n\t\t\tShape next = edges.get(orientations[(i + 1) % NUMBER_OF_EDGES]).getShape();\n\t\t\tif (current == Shape.FLAT && next == Shape.FLAT) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/* Check if this piece has a border edge. */\n\tpublic boolean isBorder() {\n\t\tOrientation[] orientations = Orientation.values();\n\t\tfor (int i = 0; i < orientations.length; i++) {\n\t\t\tif (edges.get(orientations[i]).getShape() == Shape.FLAT) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/* Get edge at this orientation. */\n\tpublic Edge getEdgeWithOrientation(Orientation orientation) {\n\t\treturn edges.get(orientation);\n\t}\t\n\t\n\t/* Return the edge that matches targetEdge. Returns null if there is no match. */\n\tpublic Edge getMatchingEdge(Edge targetEdge) {\n\t\tfor (Edge e : edges.values()) {\n\t\t\tif (targetEdge.fitsWith(e)) {\n\t\t\t\treturn e;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tOrientation[] orientations = Orientation.values();\n\t\tfor (Orientation o : orientations) {\n\t\t\tsb.append(edges.get(o).toString() + \",\");\n\t\t}\n\t\treturn \"[\" + sb.toString() + \"]\";\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_06_Jigsaw/Puzzle.java",
    "content": "package Q7_06_Jigsaw;\n\nimport java.util.LinkedList;\n\npublic class Puzzle {\n\tprivate LinkedList<Piece> pieces; /* Remaining pieces left to put away. */ \n\tprivate Piece[][] solution;\n\tprivate int size;\n\t\n\tpublic Puzzle(int size, LinkedList<Piece> pieces) {\n\t\tthis.pieces = pieces;\n\t\tthis.size = size;\n\t}\n\t\n\t/* Group pieces into border pieces (including corners) and inside pieces. */\n\tpublic void groupPieces(LinkedList<Piece> cornerPieces, LinkedList<Piece> borderPieces, LinkedList<Piece> insidePieces) {\n\t\tfor (Piece p : pieces) {\n\t\t\tif (p.isCorner()) {\n\t\t\t\tcornerPieces.add(p);\n\t\t\t} else if (p.isBorder()) {\n\t\t\t\tborderPieces.add(p);\n\t\t\t} else {\n\t\t\t\tinsidePieces.add(p);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* Orient this corner piece so that its flat edges are on the top and left. */ \n\tpublic void orientTopLeftCorner(Piece piece) {\n\t\tif (!piece.isCorner()) return;\n\t\t\n\t\tOrientation[] orientations = Orientation.values();\n\t\tfor (int i = 0; i < orientations.length; i++) {\n\t\t\tEdge current = piece.getEdgeWithOrientation(orientations[i]);\n\t\t\tEdge next = piece.getEdgeWithOrientation(orientations[(i + 1) % orientations.length]);\n\t\t\tif (current.getShape() == Shape.FLAT && next.getShape() == Shape.FLAT) {\n\t\t\t\tpiece.setEdgeAsOrientation(current, Orientation.LEFT);\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t}\n\t}\n\t\n\t/* Bounds check. Check if this index is on a border (0 or size - 1) */\n\tpublic boolean isBorderIndex(int location) {\n\t\treturn location == 0 || location == size - 1;\n\t}\n\t\n\t/* Given a list of pieces, check if any have an edge that matches this piece. Return the edge*/\n\tprivate Edge getMatchingEdge(Edge targetEdge, LinkedList<Piece> pieces) {\n\t\tfor (Piece piece : pieces) {\n\t\t\tEdge matchingEdge = piece.getMatchingEdge(targetEdge);\n\t\t\tif (matchingEdge != null) {\n\t\t\t\treturn matchingEdge;\n\t\t\t}\n\t\t}\t\n\t\treturn null;\n\t}\n\t\n\t/* Put the edge/piece into the solution, turn it appropriately, and remove from list. */ \n\tprivate void setEdgeInSolution(LinkedList<Piece> pieces, Edge edge, int row, int column, Orientation orientation) {\n\t\tPiece piece = edge.getParentPiece();\n\t\tpiece.setEdgeAsOrientation(edge, orientation);\n\t\tpieces.remove(piece);\n\t\tsolution[row][column] = piece;\n\t}\n\t\n\t/* Return the list where a piece with this index would be found. */\n\tprivate LinkedList<Piece> getPieceListToSearch(LinkedList<Piece> cornerPieces, LinkedList<Piece> borderPieces, LinkedList<Piece> insidePieces, int row, int column) {\n\t\tif (isBorderIndex(row) && isBorderIndex(column)) {\n\t\t\treturn cornerPieces;\n\t\t} else if (isBorderIndex(row) || isBorderIndex(column)) {\n\t\t\treturn borderPieces;\n\t\t} else {\n\t\t\treturn insidePieces;\n\t\t}\n\t}\n\t\n\t/* Find the matching piece within piecesToSearch and insert it at row, column. */\n\tprivate boolean fitNextEdge(LinkedList<Piece> piecesToSearch, int row, int column) {\n\t\tif (row == 0 && column == 0) {\n\t\t\tPiece p = piecesToSearch.remove();\n\t\t\torientTopLeftCorner(p);\n\t\t\tsolution[0][0] = p;\n\t\t} else {\n\t\t\t/* Get the right edge and list to match. */\n\t\t\tPiece pieceToMatch = column == 0 ? solution[row - 1][0] : solution[row][column - 1];\n\t\t\tOrientation orientationToMatch = column == 0 ? Orientation.BOTTOM : Orientation.RIGHT;\n\t\t\tEdge edgeToMatch = pieceToMatch.getEdgeWithOrientation(orientationToMatch);\n\t\t\t\n\t\t\t/* Get matching edge. */\n\t\t\tEdge edge = getMatchingEdge(edgeToMatch, piecesToSearch);\n\t\t\tif (edge == null) return false; // Can't solve\n\t\t\t\n\t\t\tOrientation orientation = orientationToMatch.getOpposite();\n\t\t\tsetEdgeInSolution(piecesToSearch, edge, row, column, orientation);\t\t\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic boolean solve() {\n\t\t/* Group pieces. */\n\t\tLinkedList<Piece> cornerPieces = new LinkedList<Piece>();\n\t\tLinkedList<Piece> borderPieces = new LinkedList<Piece>();\n\t\tLinkedList<Piece> insidePieces = new LinkedList<Piece>();\n\t\tgroupPieces(cornerPieces, borderPieces, insidePieces);\n\t\t\n\t\t/* Walk through puzzle, finding the piece that joins the previous one. */\n\t\tsolution = new Piece[size][size];\t\n\t\tfor (int row = 0; row < size; row++) {\n\t\t\tfor (int column = 0; column < size; column++) {\n\t\t\t\tLinkedList<Piece> piecesToSearch = getPieceListToSearch(cornerPieces, borderPieces, insidePieces, row, column);\n\t\t\t\tif (!fitNextEdge(piecesToSearch, row, column)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\t\n\t\n\tpublic Piece[][] getCurrentSolution() {\n\t\treturn solution;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_06_Jigsaw/Question.java",
    "content": "package Q7_06_Jigsaw;\n\nimport java.util.LinkedList;\nimport java.util.Random;\n\npublic class Question {\n\n\t\n\tpublic static Edge createRandomEdge(String code) {\n\t\tRandom random = new Random();\n\t\tShape type = Shape.INNER;\n\t\tif (random.nextBoolean()) {\n\t\t\ttype = Shape.OUTER;\n\t\t}\n\t\treturn new Edge(type, code);\n\t}\t\n\t\n\tpublic static Edge[] createEdges(Piece[][] puzzle, int column, int row) {\n\t\tString key = column + \":\" + row + \":\";\n\t\t/* Get left edge */\n\t\tEdge left = column == 0 ? new Edge(Shape.FLAT, key + \"h|e\") : puzzle[row][column - 1].getEdgeWithOrientation(Orientation.RIGHT)._createMatchingEdge();\n\t\t\n\t\t/* Get top edge */\n\t\tEdge top = row == 0 ? new Edge(Shape.FLAT, key + \"v|e\") : puzzle[row - 1][column].getEdgeWithOrientation(Orientation.BOTTOM)._createMatchingEdge();\n\t\t\n\t\t/* Get right edge */\n\t\tEdge right = column == puzzle[row].length - 1 ? new Edge(Shape.FLAT, key + \"h|e\") : createRandomEdge(key + \"h\");\n\t\t\n\t\t/* Get bottom edge */\n\t\tEdge bottom = row == puzzle.length - 1 ? new Edge(Shape.FLAT, key + \"v|e\") : createRandomEdge(key + \"v\");\n\t\t\n\t\tEdge[] edges = {left, top, right, bottom};\n\t\treturn edges;\n\t}\n\t\n\tpublic static LinkedList<Piece> initializePuzzle(int size) {\n\t\t/* Create completed puzzle. */\n\t\tPiece[][] puzzle = new Piece[size][size];\n\t\tfor (int row = 0; row < size; row++) {\n\t\t\tfor (int column = 0; column < size; column++) {\n\t\t\t\tEdge[] edges = createEdges(puzzle, column, row);\n\t\t\t\tpuzzle[row][column] = new Piece(edges);\n\t\t\t}\n\t\t}\n\n\t\t/* Shuffle and rotate pieces. */\n\t\tLinkedList<Piece> pieces = new LinkedList<Piece>();\n\t\tRandom r = new Random();\n\t\tfor (int row = 0; row < size; row++) {\n\t\t\tfor (int column = 0; column < size; column++) {\n\t\t\t\tint rotations = r.nextInt(4);\n\t\t\t\tPiece piece = puzzle[row][column];\n\t\t\t\tpiece.rotateEdgesBy(rotations);\n\t\t\t\tint index = pieces.size() == 0 ? 0 : r.nextInt(pieces.size());\n\t\t\t\tpieces.add(index, piece);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn pieces;\n\t}\t\n\t\n\tpublic static String solutionToString(Piece[][] solution) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (int h = 0; h < solution.length; h++) {\n\t\t\tfor (int w = 0; w < solution[h].length; w++) {\n\t\t\t\tPiece p = solution[h][w];\n\t\t\t\tif (p == null) {\n\t\t\t\t\tsb.append(\"null\");\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsb.append(p.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t\tsb.append(\"\\n\");\n\t\t}\n\t\treturn sb.toString();\n\t}\t\n\t\n\t/* Used for testing. Check if puzzle is solved. */\t\n\tpublic static boolean validate(Piece[][] solution) {\n\t\tif (solution == null) return false;\n\t\tfor (int r = 0; r < solution.length; r++) {\n\t\t\tfor (int c = 0; c < solution[r].length; c++) {\n\t\t\t\tPiece piece = solution[r][c];\n\t\t\t\tif (piece == null) return false;\n\t\t\t\tif (c > 0) { /* match left */\n\t\t\t\t\tPiece left = solution[r][c-1];\n\t\t\t\t\tif (!left.getEdgeWithOrientation(Orientation.RIGHT).fitsWith(piece.getEdgeWithOrientation(Orientation.LEFT))) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (c < solution[r].length - 1) { /* match right */\n\t\t\t\t\tPiece right = solution[r][c+1];\n\t\t\t\t\tif (!right.getEdgeWithOrientation(Orientation.LEFT).fitsWith(piece.getEdgeWithOrientation(Orientation.RIGHT))) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif (r > 0) { /* match top */\n\t\t\t\t\tPiece top = solution[r-1][c];\n\t\t\t\t\tif (!top.getEdgeWithOrientation(Orientation.BOTTOM).fitsWith(piece.getEdgeWithOrientation(Orientation.TOP))) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (r < solution.length - 1) { /* match bottom */\n\t\t\t\t\tPiece bottom = solution[r+1][c];\n\t\t\t\t\tif (!bottom.getEdgeWithOrientation(Orientation.TOP).fitsWith(piece.getEdgeWithOrientation(Orientation.BOTTOM))) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean testSize(int size) {\n\t\tLinkedList<Piece> pieces = initializePuzzle(size);\n\t\tPuzzle puzzle = new Puzzle(size, pieces);\n\t\tpuzzle.solve();\n\t\tPiece[][] solution = puzzle.getCurrentSolution();\n\t\tSystem.out.println(solutionToString(solution));\n\t\tboolean result = validate(solution);\n\t\tSystem.out.println(result);\n\t\treturn result;\n\t}\n\t\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int size = 1; size < 10; size++) {\n\t\t\tif (!testSize(size)) {\n\t\t\t\tSystem.out.println(\"ERROR: \" + size);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_06_Jigsaw/Shape.java",
    "content": "package Q7_06_Jigsaw;\n\npublic enum Shape {\n\tINNER, OUTER, FLAT;\n\t\t\n\tpublic Shape getOpposite() {\t\t\n\t\tswitch (this) {\n\t\t\tcase INNER: return OUTER;\n\t\t\tcase OUTER: return INNER;\n\t\t\tdefault: return null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/AddRequest.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\nimport java.util.Date;\r\n\r\npublic class AddRequest {\r\n\tprivate User fromUser;\r\n\tprivate User toUser;\r\n\tprivate Date date;\r\n\tRequestStatus status;\r\n\t\r\n\tpublic AddRequest(User from, User to, Date date) {\r\n\t\tfromUser = from;\r\n\t\ttoUser = to;\r\n\t\tthis.date = date;\r\n\t\tstatus = RequestStatus.Unread;\r\n\t}\r\n\t\r\n\tpublic RequestStatus getStatus() {\r\n\t\treturn status;\r\n\t}\r\n\t\r\n\tpublic User getFromUser() {\r\n\t\treturn fromUser;\r\n\t}\r\n\t\r\n\tpublic User getToUser() {\r\n\t\treturn toUser;\r\n\t}\r\n\t\r\n\tpublic Date getDate() {\r\n\t\treturn date;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/Conversation.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic abstract class Conversation {\r\n\tprotected ArrayList<User> participants = new ArrayList<User>();\r\n\tprotected int id;\r\n\tprotected ArrayList<Message> messages = new ArrayList<Message>();\r\n\t\r\n\tpublic ArrayList<Message> getMessages() {\r\n\t\treturn messages;\r\n\t}\r\n\t\r\n\tpublic boolean addMessage(Message m) {\r\n\t\tmessages.add(m);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic int getId() {\r\n\t\treturn id;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/GroupChat.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\npublic class GroupChat extends Conversation {\r\n\tpublic void removeParticipant(User user) {\r\n\t\tparticipants.remove(user);\r\n\t}\r\n\t\r\n\tpublic void addParticipant(User user) {\r\n\t\tparticipants.add(user);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/Message.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Message {\r\n\tprivate String content;\r\n\tprivate Date date;\r\n\tpublic Message(String content, Date date) {\r\n\t\tthis.content = content;\r\n\t\tthis.date = date;\r\n\t}\r\n\t\r\n\tpublic String getContent() {\r\n\t\treturn content;\r\n\t}\r\n\t\r\n\tpublic Date getDate() {\r\n\t\treturn date;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/PrivateChat.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\npublic class PrivateChat extends Conversation {\r\n\tpublic PrivateChat(User user1, User user2) {\r\n\t\tparticipants.add(user1);\r\n\t\tparticipants.add(user2);\r\n\t}\r\n\t\r\n\tpublic User getOtherParticipant(User primary) {\r\n\t\tif (participants.get(0) == primary) {\r\n\t\t\treturn participants.get(1);\r\n\t\t} else if (participants.get(1) == primary) {\r\n\t\t\treturn participants.get(0);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/RequestStatus.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\npublic enum RequestStatus {\r\n\tUnread, Read, Accepted, Rejected\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/System.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\npublic class System {\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/User.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.HashMap;\r\n\r\npublic class User {\r\n\tprivate int id;\r\n\tprivate UserStatus status = null;\r\n\tprivate HashMap<Integer, PrivateChat> privateChats = new HashMap<Integer, PrivateChat>();\r\n\tprivate ArrayList<GroupChat> groupChats = new ArrayList<GroupChat>();\r\n\tprivate HashMap<Integer, AddRequest> receivedAddRequests = new HashMap<Integer, AddRequest>();\r\n\tprivate HashMap<Integer, AddRequest> sentAddRequests = new HashMap<Integer, AddRequest>();\r\n\t\r\n\tprivate HashMap<Integer, User> contacts = new HashMap<Integer, User>();\r\n\tprivate String accountName;\r\n\tprivate String fullName;\r\n\t\r\n\tpublic User(int id, String accountName, String fullName) {\r\n\t\tthis.accountName = accountName;\r\n\t\tthis.fullName = fullName;\r\n\t\tthis.id = id;\r\n\t}\r\n\t\r\n\tpublic boolean sendMessageToUser(User toUser, String content) {\r\n\t\tPrivateChat chat = privateChats.get(toUser.getId());\r\n\t\tif (chat == null) {\r\n\t\t\tchat = new PrivateChat(this, toUser);\r\n\t\t\tprivateChats.put(toUser.getId(), chat);\r\n\t\t}\r\n\t\tMessage message = new Message(content, new Date());\r\n\t\treturn chat.addMessage(message);\r\n\t}\r\n\t\r\n\tpublic boolean sendMessageToGroupChat(int groupId, String content) {\r\n\t\tGroupChat chat = groupChats.get(groupId);\r\n\t\tif (chat != null) {\r\n\t\t\tMessage message = new Message(content, new Date());\r\n\t\t\treturn chat.addMessage(message);\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic void setStatus(UserStatus status) {\r\n\t\tthis.status = status;\r\n\t}\r\n\t\r\n\tpublic UserStatus getStatus() {\r\n\t\treturn status;\r\n\t}\r\n\t\r\n\tpublic boolean addContact(User user) {\r\n\t\tif (contacts.containsKey(user.getId())) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\tcontacts.put(user.getId(), user);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void receivedAddRequest(AddRequest req) {\r\n\t\tint senderId = req.getFromUser().getId();\r\n\t\tif (!receivedAddRequests.containsKey(senderId)) {\r\n\t\t\treceivedAddRequests.put(senderId, req);\r\n\t\t}\t\t\r\n\t}\r\n\t\r\n\tpublic void sentAddRequest(AddRequest req) {\r\n\t\tint receiverId = req.getFromUser().getId();\r\n\t\tif (!sentAddRequests.containsKey(receiverId)) {\r\n\t\t\tsentAddRequests.put(receiverId, req);\r\n\t\t}\t\t\r\n\t}\r\n\t\r\n\tpublic void removeAddRequest(AddRequest req) {\r\n\t\tif (req.getToUser() == this) {\r\n\t\t\treceivedAddRequests.remove(req);\r\n\t\t} else if (req.getFromUser() == this) {\r\n\t\t\tsentAddRequests.remove(req);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void requestAddUser(String accountName) {\r\n\t\tUserManager.getInstance().addUser(this, accountName);\r\n\t}\r\n\t\r\n\tpublic void addConversation(PrivateChat conversation) {\r\n\t\tUser otherUser = conversation.getOtherParticipant(this);\r\n\t\tprivateChats.put(otherUser.getId(), conversation);\r\n\t}\r\n\r\n\tpublic void addConversation(GroupChat conversation) {\r\n\t\tgroupChats.add(conversation);\r\n\t}\t\r\n\t\r\n\tpublic int getId() {\r\n\t\treturn id;\r\n\t}\r\n\t\r\n\tpublic String getAccountName() {\r\n\t\treturn accountName;\r\n\t}\r\n\t\r\n\tpublic String getFullName() {\r\n\t\treturn fullName;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/UserManager.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\nimport java.util.Date;\r\nimport java.util.HashMap;\r\n\r\n/* UserManager serves as the central place for the core user actions. */\r\npublic class UserManager {\r\n\tprivate static UserManager instance;\r\n\tprivate HashMap<Integer, User> usersById = new HashMap<Integer, User>();\r\n\tprivate HashMap<String, User> usersByAccountName = new HashMap<String, User>();\r\n\tprivate HashMap<Integer, User> onlineUsers = new HashMap<Integer, User>();\r\n\t\r\n\tpublic static UserManager getInstance() {\r\n\t\tif (instance == null) {\r\n\t\t\tinstance = new UserManager();\r\n\t\t}\r\n\t\treturn instance;\r\n\t}\r\n\t\r\n\tpublic void addUser(User fromUser, String toAccountName) {\r\n\t\tUser toUser = usersByAccountName.get(toAccountName);\r\n\t\tAddRequest req = new AddRequest(fromUser, toUser, new Date());\r\n\t\ttoUser.receivedAddRequest(req);\r\n\t\tfromUser.sentAddRequest(req);\r\n\t}\r\n\t\r\n\tpublic void approveAddRequest(AddRequest req) {\r\n\t\treq.status = RequestStatus.Accepted;\r\n\t\tUser from = req.getFromUser();\r\n\t\tUser to = req.getToUser();\r\n\t\tfrom.addContact(to);\r\n\t\tto.addContact(from);\r\n\t}\r\n\t\r\n\tpublic void rejectAddRequest(AddRequest req) {\r\n\t\treq.status = RequestStatus.Rejected;\r\n\t\tUser from = req.getFromUser();\r\n\t\tUser to = req.getToUser();\r\n\t\tfrom.removeAddRequest(req);\r\n\t\tto.removeAddRequest(req);\t\t\r\n\t}\r\n\t\r\n\tpublic void userSignedOn(String accountName) {\r\n\t\tUser user = usersByAccountName.get(accountName);\r\n\t\tif (user != null) {\r\n\t\t\tuser.setStatus(new UserStatus(UserStatusType.Available, \"\"));\t\t\t\r\n\t\t\tonlineUsers.put(user.getId(), user);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void userSignedOff(String accountName) {\r\n\t\tUser user = usersByAccountName.get(accountName);\r\n\t\tif (user != null) {\r\n\t\t\tuser.setStatus(new UserStatus(UserStatusType.Offline, \"\"));\r\n\t\t\tonlineUsers.remove(user.getId());\r\n\t\t}\r\n\t}\t\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/UserStatus.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\npublic class UserStatus {\r\n\t private String message;\r\n\t private UserStatusType type;\r\n\t public UserStatus(UserStatusType type, String message) {\r\n\t\t this.type = type;\r\n\t\t this.message = message;\r\n\t }\r\n\t \r\n\t public UserStatusType getStatusType() {\r\n\t\t return type;\r\n\t }\r\n\t \r\n\t public String getMessage() {\r\n\t\t return message;\r\n\t }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_07_Chat_Server/UserStatusType.java",
    "content": "package Q7_07_Chat_Server;\r\n\r\npublic enum UserStatusType {\r\n\tOffline, Away, Idle, Available, Busy\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Automator.java",
    "content": "package Q7_08_Othello;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\n/* A helper class to automate this game. This is just used for testing purposes. */\r\npublic class Automator {\r\n\tprivate Player[] players;\r\n\tprivate Player lastPlayer = null;\r\n\tpublic ArrayList<Location> remainingMoves = new ArrayList<Location>();\r\n\tprivate static Automator instance;\r\n\t\r\n\tprivate Automator() {\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tfor (int j = 0; j < 10; j++) {\r\n\t\t\t\tLocation loc = new Location(i, j);\r\n\t\t\t\tremainingMoves.add(loc);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static Automator getInstance() {\r\n\t\tif (instance == null) {\r\n\t\t\tinstance = new Automator();\r\n\t\t}\r\n\t\treturn instance;\r\n\t}\r\n\t\r\n\tpublic void initialize(Player[] ps) {\r\n\t\tplayers = ps;\r\n\t\tlastPlayer = players[1];\r\n\t}\r\n\t\r\n\tpublic void shuffle() {\r\n\t\tfor (int i = 0; i < remainingMoves.size(); i++) {\r\n\t\t\tint t = AssortedMethods.randomIntInRange(i, remainingMoves.size() - 1);\r\n\t\t\tLocation other = remainingMoves.get(t);\r\n\t\t\tLocation current = remainingMoves.get(i);\r\n\t\t\tremainingMoves.set(t, current);\r\n\t\t\tremainingMoves.set(i, other);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void removeLocation(int r, int c) {\r\n\t\tfor (int i = 0; i < remainingMoves.size(); i++) {\r\n\t\t\tLocation loc = remainingMoves.get(i);\r\n\t\t\tif (loc.isSameAs(r, c)) {\r\n\t\t\t\tremainingMoves.remove(i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Location getLocation(int index) {\r\n\t\treturn remainingMoves.get(index);\r\n\t}\r\n\t\r\n\tpublic boolean playRandom() {\r\n\t\tBoard board = Game.getInstance().getBoard();\r\n\t\tshuffle();\r\n\t\tlastPlayer = lastPlayer == players[0] ? players[1] : players[0];\r\n\t\tString color = lastPlayer.getColor().toString();\r\n\t\tfor (int i = 0; i < remainingMoves.size(); i++) {\r\n\t\t\tLocation loc = remainingMoves.get(i);\r\n\t\t\tboolean success = lastPlayer.playPiece(loc.getRow(), loc.getColumn());\r\n\t\t\t\r\n\t\t\tif (success) {\r\n\t\t\t\tSystem.out.println(\"Success: \" + color + \" move at (\" + loc.getRow() + \", \" + loc.getColumn() + \")\");\r\n\t\t\t\tboard.printBoard();\r\n\t\t\t\tprintScores();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tSystem.out.println(\"Game over. No moves found for \" + color);\r\n\t\treturn false;\r\n\t}\t\r\n\t\r\n\tpublic boolean isOver() {\r\n\t\tif (players[0].getScore() == 0 || players[1].getScore() == 0) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic void printScores() {\r\n\t\tSystem.out.println(\"Score: \" + players[0].getColor().toString() + \": \" + players[0].getScore() + \", \" + players[1].getColor().toString() + \": \" + players[1].getScore());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Board.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic class Board {\r\n\tprivate int blackCount = 0;\r\n\tprivate int whiteCount = 0;\r\n\tprivate Piece[][] board;\r\n\t\r\n\tpublic Board(int rows, int columns) {\r\n\t\tboard = new Piece[rows][columns];\r\n\t}\r\n\t\r\n\tpublic void initialize() {\r\n\t\t/* initial board has a grid like the following in the center:\r\n\t\t *     WB\r\n\t\t *     BW\r\n\t\t */\r\n\t\tint middleRow = board.length / 2;\r\n\t\tint middleColumn = board[middleRow].length / 2;\r\n\t\tboard[middleRow][middleColumn] = new Piece(Color.White);\r\n\t\tboard[middleRow + 1][middleColumn] = new Piece(Color.Black);\r\n\t\tboard[middleRow + 1][middleColumn + 1] = new Piece(Color.White);\r\n\t\tboard[middleRow][middleColumn + 1] = new Piece(Color.Black);\r\n\t\tblackCount = 2;\r\n\t\twhiteCount = 2;\r\n\t}\r\n\t\r\n\tpublic boolean placeColor(int row, int column, Color color) {\r\n\t\tif (board[row][column] != null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\t/* attempt to flip each of the four directions */\r\n\t\tint[] results = new int[4];\r\n\t\tresults[0] = flipSection(row - 1, column, color, Direction.up);\r\n\t\tresults[1] = flipSection(row + 1, column, color, Direction.down);\r\n\t\tresults[2] = flipSection(row, column + 1, color, Direction.right);\r\n\t\tresults[3] = flipSection(row, column - 1, color, Direction.left);\r\n\t\t\r\n\t\t/* compute how many pieces were flipped */\r\n\t\tint flipped = 0;\r\n\t\tfor (int result : results) {\r\n\t\t\tif (result > 0) {\r\n\t\t\t\tflipped += result;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* if nothing was flipped, then it's an invalid move */\r\n\t\tif (flipped < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\t/* flip the piece, and update the score */\r\n\t\tboard[row][column] = new Piece(color);\r\n\t\tupdateScore(color, flipped + 1);\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tprivate int flipSection(int row, int column, Color color, Direction d) {\r\n\t\t/* Compute the delta for the row and the column. At all times, only the row or the column\r\n\t\t * will have a delta, since we're only moving in one direction at a time.\r\n\t\t */\r\n\t\tint r = 0;\r\n\t\tint c = 0;\r\n\t\tswitch (d) {\r\n\t\tcase up:\r\n\t\t\tr = -1;\r\n\t\t\tbreak;\r\n\t\tcase down:\r\n\t\t\tr = 1;\r\n\t\t\tbreak;\r\n\t\tcase left:\r\n\t\t\tc = -1;\r\n\t\t\tbreak;\r\n\t\tcase right:\r\n\t\t\tc = 1;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t\r\n\t\t/* If out of bounds, or nothing to flip, return an error (-1) */\r\n\t\tif (row < 0 || row >= board.length || column < 0 || column >= board[row].length || board[row][column] == null) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\t/* Found same color - return nothing flipped */\r\n\t\tif (board[row][column].getColor() == color) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\t/* Recursively flip the remainder of the row. If -1 is returned, then we know we hit the boundary\r\n\t\t * of the row (or a null piece) before we found our own color, so there's nothing to flip. Return\r\n\t\t * the error code.\r\n\t\t */\r\n\t\tint flipped = flipSection(row + r, column + c, color, d);\r\n\t\tif (flipped < 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\t/* flip our own color */\r\n\t\tboard[row][column].flip();\r\n\t\treturn flipped + 1;\r\n\t}\r\n\t\r\n\tpublic int getScoreForColor(Color c) {\r\n\t\tif (c == Color.Black) {\r\n\t\t\treturn blackCount;\r\n\t\t} else {\r\n\t\t\treturn whiteCount;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void updateScore(Color newColor, int newPieces) {\r\n\t\t/* If we added x pieces of a color, then we actually removed x - 1 pieces of the other\r\n\t\t * color. The -1 is because one of the new pieces was the just-placed one.\r\n\t\t */\r\n\t\tif (newColor == Color.Black) {\r\n\t\t\twhiteCount -= newPieces - 1;\r\n\t\t\tblackCount += newPieces;\r\n\t\t} else {\r\n\t\t\tblackCount -= newPieces - 1;\t\t\t\r\n\t\t\twhiteCount += newPieces;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void printBoard() {\r\n\t\tfor (int r = 0; r < board.length; r++) {\r\n\t\t\tfor (int c = 0; c < board[r].length; c++) {\r\n\t\t\t\tif (board[r][c] == null) {\r\n\t\t\t\t\tSystem.out.print(\"_\");\r\n\t\t\t\t} else if (board[r][c].getColor() == Color.White) {\r\n\t\t\t\t\tSystem.out.print(\"W\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSystem.out.print(\"B\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Color.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic enum Color {\r\n\tWhite, Black\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Direction.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic enum Direction {\r\n\tleft, right, up, down\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Game.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic class Game {\r\n\tprivate Player[] players;\r\n\tprivate static Game instance;\r\n\tprivate Board board;\r\n\tprivate final int ROWS = 10;\r\n\tprivate final int COLUMNS = 10;\r\n\t\r\n\tprivate Game() {\r\n\t\tboard = new Board(ROWS, COLUMNS);\r\n\t\tplayers = new Player[2];\r\n\t\tplayers[0] = new Player(Color.Black);\r\n\t\tplayers[1] = new Player(Color.White);\r\n\t\tAutomator.getInstance().initialize(players); // used for testing\r\n\t}\r\n\t\r\n\tpublic static Game getInstance() {\r\n\t\tif (instance == null) {\r\n\t\t\tinstance = new Game();\r\n\t\t}\r\n\t\treturn instance;\r\n\t}\r\n\t\r\n\tpublic Board getBoard() {\r\n\t\treturn board;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Location.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic class Location {\r\n\tprivate int row;\r\n\tprivate int column;\r\n\tpublic Location(int r, int c) {\r\n\t\trow = r;\r\n\t\tcolumn = c;\r\n\t}\r\n\t\r\n\tpublic boolean isSameAs(int r, int c) {\r\n\t\treturn row == r && column == c;\r\n\t}\r\n\t\r\n\tpublic int getRow() {\r\n\t\treturn row;\r\n\t}\r\n\t\r\n\tpublic int getColumn() {\r\n\t\treturn column;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Piece.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic class Piece {\r\n\tprivate Color color;\r\n\t\r\n\tpublic Piece(Color c) {\r\n\t\tcolor = c;\r\n\t}\r\n\t\r\n\tpublic void flip() {\r\n\t\tif (color == Color.Black) {\r\n\t\t\tcolor = Color.White;\r\n\t\t} else {\r\n\t\t\tcolor = Color.Black;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic Color getColor() {\r\n\t\treturn color;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Player.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic class Player {\r\n\tprivate Color color;\r\n\tpublic Player(Color c) {\r\n\t\tcolor = c;\r\n\t}\r\n\t\r\n\tpublic int getScore() {\r\n\t\treturn Game.getInstance().getBoard().getScoreForColor(color);\r\n\t}\r\n\t\r\n\tpublic boolean playPiece(int row, int column) {\r\n\t\treturn Game.getInstance().getBoard().placeColor(row, column, color);\r\n\t}\r\n\t\r\n\tpublic Color getColor() {\r\n\t\treturn color;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_08_Othello/Question.java",
    "content": "package Q7_08_Othello;\r\n\r\npublic class Question {\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tGame game = Game.getInstance();\r\n\t\tgame.getBoard().initialize();\r\n\t\tgame.getBoard().printBoard();\r\n\t\tAutomator automator = Automator.getInstance();\r\n\t\twhile (!automator.isOver() && automator.playRandom()) {\r\n\t\t}\r\n\t\tautomator.printScores();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_09_Circular_Array/CircularArray.java",
    "content": "package Q7_09_Circular_Array;\r\n\r\nimport java.util.Iterator;\r\n\r\npublic class CircularArray<T> implements Iterable<T> {\r\n\tprivate T[] items;\r\n\tprivate int head = 0;\r\n\t\r\n\tpublic CircularArray(int size) {\r\n\t\titems = (T[]) new Object[size];\r\n\t}\r\n\t\r\n\tprivate int convert(int index) {\r\n\t\tif (index < 0) {\r\n\t\t\tindex += items.length;\r\n\t\t}\r\n\t\treturn (head + index) % items.length;\r\n\t}\r\n\t\r\n\tpublic void rotate(int shiftRight) {\r\n\t\thead = convert(shiftRight);\r\n\t}\r\n\t\r\n\tpublic T get(int i) {\r\n\t\tif (i < 0 || i >= items.length) {\r\n\t\t\tthrow new java.lang.IndexOutOfBoundsException(\"Index \" + i + \" is out of bounds\");\r\n\t\t}\r\n\t\treturn items[convert(i)];\r\n\t}\r\n\t\r\n\tpublic void set(int i, T item) {\r\n\t\titems[convert(i)] = item;\r\n\t}\r\n\t\r\n\tpublic Iterator<T> iterator() {\r\n\t\treturn new CircularArrayIterator();\r\n\t}\r\n\t\r\n\tprivate class CircularArrayIterator implements Iterator<T> {\r\n\t\tprivate int _current = -1;\r\n\t\t\r\n\t\tpublic CircularArrayIterator() { }\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic boolean hasNext() {\r\n\t\t\treturn _current < items.length - 1;\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic T next() {\r\n\t\t\t_current++;\r\n\t\t\treturn (T) items[convert(_current)];\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic void remove() {\r\n\t\t\tthrow new UnsupportedOperationException(\"Remove is not supported by CircularArray\");\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_09_Circular_Array/Question.java",
    "content": "package Q7_09_Circular_Array;\r\n\r\npublic class Question {\r\n\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tint size = 10;\r\n\t\tCircularArray<String> array = new CircularArray<String>(size);\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tarray.set(i, String.valueOf(i));\r\n\t\t}\r\n\t\t\r\n\t\tarray.rotate(3);\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tSystem.out.println(array.get(i));\r\n\t\t}\r\n\t\t\r\n\t\tSystem.out.println(\"\");\r\n\t\t\r\n\t\tarray.rotate(2);\r\n\t\tfor (String s : array) {\r\n\t\t\tSystem.out.println(s);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_10_Minesweeper/Board.java",
    "content": "package Q7_10_Minesweeper;\n\nimport java.util.LinkedList;\nimport java.util.Queue;\nimport java.util.Random;\n\nimport Q7_10_Minesweeper.Game.GameState;\n\npublic class Board {\n\tprivate int nRows;\n\tprivate int nColumns;\n\tprivate int nBombs = 0;\n\tprivate Cell[][] cells; \n\tprivate Cell[] bombs;\n\tprivate int numUnexposedRemaining;\n\t\n\t\n\tpublic Board(int r, int c, int b) {\n\t\tnRows = r;\n\t\tnColumns = c;\n\t\tnBombs = b;\n\t\t\n\t\tinitializeBoard();\n\t\tshuffleBoard();\n\t\tsetNumberedCells();\n\t\t\n\t\tnumUnexposedRemaining = nRows * nColumns - nBombs;\n\t}\n\t\n\tprivate void initializeBoard() {\n\t\tcells = new Cell[nRows][nColumns];\n\t\tbombs = new Cell[nBombs];\n\t\tfor (int r = 0; r < nRows; r++) {\n\t\t\tfor (int c = 0; c < nColumns; c++) {\n\t\t\t\tcells[r][c] = new Cell(r, c);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < nBombs; i++) {\n\t\t\tint r = i / nColumns;\n\t\t\tint c = (i - r * nColumns) % nColumns;\n\t\t\tbombs[i] = cells[r][c];\n\t\t\tbombs[i].setBomb(true);\n\t\t}\n\t}\n\t\n\tprivate void shuffleBoard() {\n\t\tint nCells = nRows * nColumns;\n\t\tRandom random = new Random();\n\t\tfor (int index1 = 0; index1 < nCells; index1++) {\n\t\t\tint index2 = index1 + random.nextInt(nCells - index1);\n\t\t\tif (index1 != index2) {\n\t\t\t\t/* Get cell at index1. */\n\t\t\t\tint row1 = index1 / nColumns;\n\t\t\t\tint column1 = (index1 - row1 * nColumns) % nColumns;\n\t\t\t\tCell cell1 = cells[row1][column1];\n\t\t\t\t\n\t\t\t\t/* Get cell at index2. */\n\t\t\t\tint row2 = index2 / nColumns;\n\t\t\t\tint column2 = (index2 - row2 * nColumns) % nColumns;\n\t\t\t\tCell cell2 = cells[row2][column2];\n\t\t\t\t\n\t\t\t\t/* Swap. */\n\t\t\t\tcells[row1][column1] = cell2;\n\t\t\t\tcell2.setRowAndColumn(row1, column1);\n\t\t\t\tcells[row2][column2] = cell1;\n\t\t\t\tcell1.setRowAndColumn(row2, column2);\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate boolean inBounds(int row, int column) {\n\t\treturn row >= 0 && row < nRows && column >= 0 && column < nColumns;\n\t}\n\t\n\t/* Set the cells around the bombs to the right number. Although \n\t * the bombs have been shuffled, the reference in the bombs array\n\t * is still to same object. */\n\tprivate void setNumberedCells() {\n\t\tint[][] deltas = { // Offsets of 8 surrounding cells\n\t\t\t\t{-1, -1}, {-1, 0}, {-1, 1},\n\t\t\t\t{ 0, -1},          { 0, 1},\n\t\t\t\t{ 1, -1}, { 1, 0}, { 1, 1}\n\t\t};\n\t\tfor (Cell bomb : bombs) {\n\t\t\tint row = bomb.getRow();\n\t\t\tint col = bomb.getColumn();\n\t\t\tfor (int[] delta : deltas) {\n\t\t\t\tint r = row + delta[0];\n\t\t\t\tint c = col + delta[1];\n\t\t\t\tif (inBounds(r, c)) {\n\t\t\t\t\tcells[r][c].incrementNumber();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic void printBoard(boolean showUnderside) {\n\t\tSystem.out.println();\n\t\tSystem.out.print(\"   \");\n\t\tfor (int i = 0; i < nColumns; i++) {\n\t\t\tSystem.out.print(i + \" \");\n\t\t}\n\t\tSystem.out.println();\n\t\tfor (int i = 0; i < nColumns; i++) {\n\t\t\tSystem.out.print(\"--\");\n\t\t}\t\t\n\t\tSystem.out.println();\n\t\tfor (int r = 0; r < nRows; r++) {\n\t\t\tSystem.out.print(r + \"| \");\n\t\t\tfor (int c = 0; c < nColumns; c++) {\n\t\t\t\tif (showUnderside) {\n\t\t\t\t\tSystem.out.print(cells[r][c].getUndersideState());\n\t\t\t\t} else {\n\t\t\t\t\tSystem.out.print(cells[r][c].getSurfaceState());\n\t\t\t\t}\n\t\t\t}\n\t\t\tSystem.out.println();\n\t\t}\n\t}\n\t\n\tprivate boolean flipCell(Cell cell) {\n\t\tif (!cell.isExposed() && !cell.isGuess()) {\n\t\t\tcell.flip();\n\t\t\tnumUnexposedRemaining--;\n\t\t\treturn true;\n\t\t} \n\t\treturn false;\n\t}\n\t\n\tpublic void expandBlank(Cell cell) {\n\t\tint[][] deltas = {\n\t\t\t\t{-1, -1}, {-1, 0}, {-1, 1},\n\t\t\t\t{ 0, -1},          { 0, 1},\n\t\t\t\t{ 1, -1}, { 1, 0}, { 1, 1}\n\t\t};\t\t\n\t\t\n\t\tQueue<Cell> toExplore = new LinkedList<Cell>();\n\t\ttoExplore.add(cell);\n\t\t\n\t\twhile (!toExplore.isEmpty()) {\n\t\t\tCell current = toExplore.remove();\n\t\t\t\n\t\t\tfor (int[] delta : deltas) {\n\t\t\t\tint r = current.getRow() + delta[0];\n\t\t\t\tint c = current.getColumn() + delta[1];\n\t\t\t\t\n\t\t\t\tif (inBounds(r, c)) {\n\t\t\t\t\tCell neighbor = cells[r][c];\n\t\t\t\t\tif (flipCell(neighbor) && neighbor.isBlank()) {\n\t\t\t\t\t\ttoExplore.add(neighbor);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\t\n\tpublic UserPlayResult playFlip(UserPlay play) {\n\t\tCell cell = getCellAtLocation(play);\n\t\tif (cell == null) {\n\t\t\treturn new UserPlayResult(false, GameState.RUNNING);\n\t\t}\n\t\t\n\t\tif (play.isGuess()) {\n\t\t\tboolean guessResult = cell.toggleGuess();\n\t\t\treturn new UserPlayResult(guessResult, GameState.RUNNING);\n\t\t}\n\t\t\n\t\tboolean result = flipCell(cell);\n\t\t\n\t\tif (cell.isBomb()) {\n\t\t\treturn new UserPlayResult(result, GameState.LOST);\n\t\t}\n\t\t\n\t\tif (cell.isBlank()) {\n\t\t\texpandBlank(cell);\n\t\t}\n\t\t\n\t\tif (numUnexposedRemaining == 0) {\n\t\t\treturn new UserPlayResult(result, GameState.WON);\n\t\t} \n\t\t\n\t\treturn new UserPlayResult(result, GameState.RUNNING);\n\t}\n\t\n\tpublic Cell getCellAtLocation(UserPlay play) {\n\t\tint row = play.getRow();\n\t\tint col = play.getColumn();\n\t\tif (!inBounds(row, col)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn cells[row][col];\t\t\n\t}\n\t\n\tpublic int getNumRemaining() {\n\t\treturn numUnexposedRemaining;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_10_Minesweeper/Cell.java",
    "content": "package Q7_10_Minesweeper;\n\npublic class Cell {\n\tprivate int row;\n\tprivate int column;\n\tprivate boolean isBomb;\n\tprivate int number;\n\tprivate boolean isExposed = false;\n\tprivate boolean isGuess = false;\n\t\n\tpublic Cell(int r, int c) {\n\t\tisBomb = false;\n\t\tnumber = 0;\n\t\trow = r;\n\t\tcolumn = c;\n\t}\n\t\n\tpublic void setRowAndColumn(int r, int c) {\n\t\trow = r;\n\t\tcolumn = c;\n\t}\n\t\n\tpublic void setBomb(boolean bomb) {\n\t\tisBomb = bomb;\n\t\tnumber = -1;\n\t}\n\t\n\tpublic void incrementNumber() {\n\t\tnumber++;\n\t}\n\t\n\tpublic int getRow() {\n\t\treturn row;\n\t}\n\t\n\tpublic int getColumn() {\n\t\treturn column;\n\t}\n\t\n\tpublic boolean isBomb() {\n\t\treturn isBomb;\n\t}\n\t\n\tpublic boolean isBlank() {\n\t\treturn number == 0;\n\t}\n\t\n\tpublic boolean isExposed() {\n\t\treturn isExposed;\n\t}\n\t\n\tpublic boolean flip() {\n\t\tisExposed = true;\n\t\treturn !isBomb;\n\t}\n\t\n\tpublic boolean toggleGuess() {\n\t\tif (!isExposed) {\n\t\t\tisGuess = !isGuess;\n\t\t}\n\t\treturn isGuess;\n\t}\n\t\n\tpublic boolean isGuess() {\n\t\treturn isGuess;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn getUndersideState();\n\t}\n\t\n\tpublic String getSurfaceState() {\n\t\tif (isExposed) {\n\t\t\treturn getUndersideState();\n\t\t} else if (isGuess) {\n\t\t\treturn \"B \";\n\t\t} else {\n\t\t\treturn \"? \";\n\t\t}\n\t}\n\t\n\tpublic String getUndersideState() {\n\t\tif (isBomb) {\n\t\t\treturn \"* \";\n\t\t} else if (number > 0) {\n\t\t\treturn Integer.toString(number) + \" \";\n\t\t} else {\n\t\t\treturn \"  \";\n\t\t}\t\t\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_10_Minesweeper/Game.java",
    "content": "package Q7_10_Minesweeper;\n\nimport java.util.Scanner;\n\npublic class Game {\n\tpublic enum GameState {\n\t\tWON, LOST, RUNNING\n\t}\n\t\n\tprivate Board board;\n\tprivate int rows;\n\tprivate int columns;\n\tprivate int bombs;\n\tprivate GameState state;\n\t\n\tpublic Game(int r, int c, int b) {\n\t\trows = r;\n\t\tcolumns = c;\n\t\tbombs = b;\n\t\tstate = GameState.RUNNING;\n\t}\t\n\t\n\tpublic boolean initialize() {\n\t\tif (board == null) {\n\t\t\tboard = new Board(rows, columns, bombs);\t\n\t\t\tboard.printBoard(true);\n\t\t\treturn true;\n\t\t} else {\n\t\t\tSystem.out.println(\"Game has already been initialized.\");\n\t\t\treturn false;\n\t\t}\n\t}\t\n\t\n\tpublic boolean start() {\n\t\tif (board == null) {\n\t\t\tinitialize();\n\t\t}\n\t\treturn playGame();\n\t}\n\t\n\tpublic void printGameState() {\n\t\tif (state == GameState.LOST) {\n\t\t\tboard.printBoard(true);\n\t\t\tSystem.out.println(\"FAIL\");\n\t\t} else if (state == GameState.WON) {\n\t\t\tboard.printBoard(true);\n\t\t\tSystem.out.println(\"WIN\");\n\t\t} else {\n\t\t\tSystem.out.println(\"Number remaining: \" + board.getNumRemaining());\t\t\t\n\t\t\tboard.printBoard(false);\t\n\t\t}\n\t}\n\t\n\tprivate boolean playGame() {\n\t\tScanner scanner = new Scanner(System.in);\n\t\tprintGameState();\n\t\t\n\t\twhile (state == GameState.RUNNING) {\n\t\t\tString input = scanner.nextLine();\n\t\t\tif (input.equals(\"exit\")) {\n\t\t\t\tscanner.close();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tUserPlay play = UserPlay.fromString(input);\n\t\t\tif (play == null) { \n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tUserPlayResult result = board.playFlip(play);\n\t\t\tif (result.successfulMove()) {\n\t\t\t\tstate = result.getResultingState();\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"Could not flip cell (\" + play.getRow() + \",\" + play.getColumn() + \").\");\n\t\t\t} \n\t\t\tprintGameState();\n\t\t}\t\n\t\tscanner.close();\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_10_Minesweeper/Question.java",
    "content": "package Q7_10_Minesweeper;\n\npublic class Question {\t\n\tpublic static void main(String[] args) {\n\t\tGame game = new Game(7, 7, 3);\n\t\tgame.initialize();\n\t\tgame.start();\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_10_Minesweeper/UserPlay.java",
    "content": "package Q7_10_Minesweeper;\n\npublic class UserPlay {\n\tprivate int row;\n\tprivate int column;\n\tprivate boolean isGuess;\n\t\n\tprivate UserPlay(int r, int c, boolean guess) {\n\t\tsetRow(r);\n\t\tsetColumn(c);\n\t\tisGuess = guess;\n\t}\n\t\n\tpublic static UserPlay fromString(String input) {\n\t\tboolean isGuess = false;\n\t\t\n\t\tif (input.length() > 0 && input.charAt(0) == 'B') {\n\t\t\tisGuess = true;\n\t\t\tinput = input.substring(1);\n\t\t}\n\t\t\n\t\tif (!input.matches(\"\\\\d* \\\\d+\")) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tString[] parts = input.split(\" \");\n\t\ttry {\n\t\t\tint r = Integer.parseInt(parts[0]);\n\t\t\tint c = Integer.parseInt(parts[1]);\n\t\t\treturn new UserPlay(r, c, isGuess);\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic boolean isGuess() {\n\t\treturn isGuess;\n\t}\n\t\n\tpublic boolean isMove() {\n\t\treturn !isMove();\n\t}\n\n\tpublic int getColumn() {\n\t\treturn column;\n\t}\n\n\tpublic void setColumn(int column) {\n\t\tthis.column = column;\n\t}\n\n\tpublic int getRow() {\n\t\treturn row;\n\t}\n\n\tpublic void setRow(int row) {\n\t\tthis.row = row;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_10_Minesweeper/UserPlayResult.java",
    "content": "package Q7_10_Minesweeper;\n\npublic class UserPlayResult {\n\tprivate boolean successful;\n\tprivate Game.GameState resultingState;\n\tpublic UserPlayResult(boolean success, Game.GameState state) {\n\t\tsuccessful = success;\n\t\tresultingState = state;\n\t}\n\t\n\tpublic boolean successfulMove() {\n\t\treturn successful;\n\t}\n\t\n\tpublic Game.GameState getResultingState() {\n\t\treturn resultingState;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_11_File_System/Directory.java",
    "content": "package Q7_11_File_System;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Directory extends Entry {\r\n\tprotected ArrayList<Entry> contents;\r\n\t\r\n\tpublic Directory(String n, Directory p) {\r\n\t\tsuper(n, p);\r\n\t\tcontents = new ArrayList<Entry>();\r\n\t}\r\n\t\r\n\tprotected ArrayList<Entry> getContents() {\r\n\t\treturn contents;\r\n\t}\r\n\t\r\n\tpublic int size() {\r\n\t\tint size = 0;\r\n\t\tfor (Entry e : contents) {\r\n\t\t\tsize += e.size();\r\n\t\t}\r\n\t\treturn size;\r\n\t}\r\n\t\r\n\tpublic int numberOfFiles() {\r\n\t\tint count = 0;\r\n\t\tfor (Entry e : contents) {\r\n\t\t\tif (e instanceof Directory) {\r\n\t\t\t\tcount++; // Directory counts as a file\r\n\t\t\t\tDirectory d = (Directory) e;\r\n\t\t\t\tcount += d.numberOfFiles();\r\n\t\t\t} else if (e instanceof File) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic boolean deleteEntry(Entry entry) {\r\n\t\treturn contents.remove(entry);\r\n\t}\r\n\t\r\n\tpublic void addEntry(Entry entry) {\r\n\t\tcontents.add(entry);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_11_File_System/Entry.java",
    "content": "package Q7_11_File_System;\r\n\r\npublic abstract class Entry {\r\n\tprotected Directory parent;\r\n\tprotected long created;\r\n\tprotected long lastUpdated;\r\n\tprotected long lastAccessed;\r\n\tprotected String name;\r\n\t\r\n\tpublic Entry(String n, Directory p) {\r\n\t\tname = n;\r\n\t\tparent = p;\r\n\t\tcreated = System.currentTimeMillis();\r\n\t}\r\n\t\r\n\tpublic boolean delete() {\r\n\t\tif (parent == null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn parent.deleteEntry(this);\r\n\t}\r\n\t\r\n\tpublic abstract int size();\r\n\t\r\n\tpublic String getFullPath() {\r\n\t\tif (parent == null) {\r\n\t\t\treturn name;\r\n\t\t} else {\r\n\t\t\treturn parent.getFullPath() + \"/\" + name;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic long getCreationTime() {\r\n\t\treturn created;\r\n\t}\r\n\t\r\n\tpublic long getLastUpdatedTime() {\r\n\t\treturn lastUpdated;\r\n\t}\r\n\t\r\n\tpublic long getLastAccessedTime() {\r\n\t\treturn lastAccessed;\r\n\t}\r\n\t\r\n\tpublic void changeName(String n) {\r\n\t\tname = n;\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_11_File_System/File.java",
    "content": "package Q7_11_File_System;\r\n\r\npublic class File extends Entry {\r\n\tprivate String content;\r\n\tprivate int size;\r\n\t\r\n\tpublic File(String n, Directory p, int sz) {\r\n\t\tsuper(n, p);\r\n\t\tsize = sz;\r\n\t}\r\n\t\r\n\tpublic int size() {\r\n\t\treturn size;\r\n\t}\r\n\t\r\n\tpublic String getContents() {\r\n\t\treturn content;\r\n\t}\r\n\t\r\n\tpublic void setContents(String c) {\r\n\t\tcontent = c;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_11_File_System/Question.java",
    "content": "package Q7_11_File_System;\r\n\r\npublic class Question {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tDirectory root = new Directory(\"Food\", null);\r\n\t\tFile taco = new File(\"Taco\", root, 4);\r\n\t\tFile hamburger = new File(\"Hamburger\", root, 9);\r\n\t\troot.addEntry(taco);\r\n\t\troot.addEntry(hamburger);\r\n\t\t\r\n\t\t\tDirectory healthy = new Directory(\"Healthy\", root);\r\n\t\t\r\n\t\t\t\tDirectory fruits = new Directory(\"Fruits\", healthy);\r\n\t\t\t\t\tFile apple = new File(\"Apple\", fruits, 5);\r\n\t\t\t\t\tFile banana = new File(\"Banana\", fruits, 6);\r\n\t\t\t\tfruits.addEntry(apple);\r\n\t\t\t\tfruits.addEntry(banana);\r\n\t\t\t\t\r\n\t\t\thealthy.addEntry(fruits);\r\n\t\t\t\t\r\n\t\t\t\tDirectory veggies = new Directory(\"Veggies\", healthy);\r\n\t\t\t\t\tFile carrot = new File(\"Carrot\", veggies, 6);\r\n\t\t\t\t\tFile lettuce = new File(\"Lettuce\", veggies, 7);\r\n\t\t\t\t\tFile peas = new File(\"Peas\", veggies, 4);\r\n\t\t\t\tveggies.addEntry(carrot);\r\n\t\t\t\tveggies.addEntry(lettuce);\r\n\t\t\t\tveggies.addEntry(peas);\r\n\t\t\t\r\n\t\t\thealthy.addEntry(veggies);\r\n\t\t\t\r\n\t\troot.addEntry(healthy);\r\n\t\t\r\n\t\tSystem.out.println(root.numberOfFiles());\r\n\t\tSystem.out.println(veggies.getFullPath());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_12_Hash_Table/Dummy.java",
    "content": "package Q7_12_Hash_Table;\r\n\r\npublic class Dummy {\r\n\tprivate String name;\r\n\tprivate int age;\r\n\tpublic Dummy(String n, int a) {\r\n\t\tname = n;\r\n\t\tage = a;\r\n\t}\r\n\t\r\n\t@Override \r\n\tpublic String toString() {\r\n\t\treturn \"(\" + name + \", \" + age + \")\";\r\n\t}\r\n\t\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_12_Hash_Table/Hasher.java",
    "content": "package Q7_12_Hash_Table;\n\nimport java.util.ArrayList;\n\npublic class Hasher<K, V> {\n\tprivate static class LinkedListNode<K, V> {\n\t\tpublic LinkedListNode<K, V> next;\n\t\tpublic LinkedListNode<K, V> prev;\n\t\tpublic K key;\n\t\tpublic V value;\n\t\tpublic LinkedListNode(K k, V v) {\n\t\t\tkey = k;\n\t\t\tvalue = v;\n\t\t}\n\t\t\n\t\tpublic String printForward() {\n\t\t\tString data = \"(\" + key + \",\" + value + \")\";\n\t\t\tif (next != null) {\n\t\t\t\treturn data + \"->\" + next.printForward();\n\t\t\t} else {\n\t\t\t\treturn data;\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\tprivate ArrayList<LinkedListNode<K, V>> arr;\n\tpublic Hasher(int capacity) {\n\t\t/* Create list of linked lists. */\n\t\tarr = new ArrayList<LinkedListNode<K, V>>();\n\t\tarr.ensureCapacity(capacity);\n\t\tfor (int i = 0; i < capacity; i++) {\n\t\t\tarr.add(null);\n\t\t}\n\t}\n\t\n\t/* Insert key and value into hash table. */\n\tpublic V put(K key, V value) {\n\t\tLinkedListNode<K, V> node = getNodeForKey(key);\n\t\tif (node != null) {\n\t\t\tV oldValue = node.value;\n\t\t\tnode.value = value; // just update the value.\n\t\t\treturn oldValue;\n\t\t}\n\t\t\n\t\tnode = new LinkedListNode<K, V>(key, value);\n\t\tint index = getIndexForKey(key);\n\t\tif (arr.get(index) != null) {\n\t\t\tnode.next = arr.get(index);\n\t\t\tnode.next.prev = node;\n\t\t}\n\t\tarr.set(index, node);\n\t\treturn null;\n\t}\n\t\n\t/* Remove node for key. */\n\tpublic V remove(K key) {\n\t\tLinkedListNode<K, V> node = getNodeForKey(key);\n\t\tif (node == null) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tif (node.prev != null) {\n\t\t\tnode.prev.next = node.next;\n\t\t} else {\n\t\t\t/* Removing head - update. */\n\t\t\tint hashKey = getIndexForKey(key);\n\t\t\tarr.set(hashKey, node.next);\n\t\t}\n\t\t\n\t\tif (node.next != null) {\n\t\t\tnode.next.prev = node.prev;\n\t\t}\n\t\treturn node.value;\n\t}\n\t\n\t/* Get value for key. */\n\tpublic V get(K key) {\n\t\tif (key == null) return null;\n\t\tLinkedListNode<K, V> node = getNodeForKey(key);\n\t\treturn node == null ? null : node.value;\n\t}\n\t\n\t/* Get linked list node associated with a given key. */\n\tprivate LinkedListNode<K, V> getNodeForKey(K key) {\n\t\tint index = getIndexForKey(key);\n\t\tLinkedListNode<K, V> current = arr.get(index);\n\t\twhile (current != null) {\n\t\t\tif (current.key == key) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\tcurrent = current.next;\n\t\t}\n\t\treturn null;\t\t\n\t}\n\t\n\t/* Really stupid function to map a key to an index. */\n\tpublic int getIndexForKey(K key) {\n\t\treturn Math.abs(key.hashCode() % arr.size());\n\t}\n\t\n\tpublic void printTable() {\n\t\tfor (int i = 0; i < arr.size(); i++) {\n\t\t\tString s = arr.get(i) == null ? \"\" : arr.get(i).printForward();\n\t\t\tSystem.out.println(i + \": \" + s);\n\t\t}\n\t}\n}"
  },
  {
    "path": "Java/Ch 07. Object-Oriented Design/Q7_12_Hash_Table/Question.java",
    "content": "package Q7_12_Hash_Table;\n\npublic class Question {\n\n\t/**\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\tDummy bob = new Dummy(\"Bob\", 20);\n\t\tDummy jim = new Dummy(\"Jim\", 25);\n\t\tDummy alex = new Dummy(\"Alex\", 30);\n\t\tDummy tim = new Dummy(\"Tim\", 35);\n\t\tDummy maxwell = new Dummy(\"Maxwell\", 40);\n\t\tDummy john = new Dummy(\"John\", 45);\n\t\tDummy julie = new Dummy(\"Julie\", 50);\n\t\tDummy christy = new Dummy(\"Christy\", 55);\n\t\tDummy tim2 = new Dummy(\"Tim\", 100); // This should replace the first \"tim\"\n\t\t\n\t\tDummy[] dummies = {bob, jim, alex, tim, maxwell, john, julie, christy, tim2};\n\t\t\n\t\t/* Test: Insert Elements. */\n\t\tHasher<String, Dummy> hash = new Hasher<String, Dummy>(3);\n\t\tfor (Dummy d : dummies) {\n\t\t\tSystem.out.println(hash.put(d.getName(), d));\n\t\t}\n\t\t\n\t\thash.printTable();\n\t\t\n\t\t/* Test: Recall */\n\t\tfor (Dummy d : dummies) {\n\t\t\tString name = d.getName();\n\t\t\tDummy dummy = hash.get(name);\n\t\t\tif (dummy == null) {\n\t\t\t\tSystem.out.println(\"Dummy named \" + name + \": null\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"Dummy named \" + name + \": \" + dummy.toString());\n\t\t\t}\n\t\t\tDummy d2 = hash.remove(name);\n\t\t\tif (d2 == null) {\n\t\t\t\tSystem.out.println(\"Dummy removed named \" + name + \": \" + \"null\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"Dummy removed named \" + name + \": \" + d2.toString());\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Introduction/FibonacciA.java",
    "content": "package Introduction;\r\n\r\npublic class FibonacciA {\r\n\tpublic static int fibonacci(int i) {\r\n\t\tif (i == 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (i == 1) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\treturn fibonacci(i - 1) + fibonacci(i - 2);\r\n\t}\r\n\t\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tint max = 35; // WARNING: If you make this above 40ish, your computer may serious slow down.\r\n\t\tint trials = 10; // Run code multiple times to compute average time.\r\n\t\tdouble[] times = new double[max]; // Store times\r\n\t\t\r\n\t\t\r\n\t\tfor (int j = 0; j < trials; j++) { // Run this 10 times to compute\r\n\t\t\tfor (int i = 0; i < max; i++) {\r\n\t\t\t\tlong start = System.currentTimeMillis();\r\n\t\t\t\tfibonacci(i);\r\n\t\t\t\tlong end = System.currentTimeMillis();\r\n\t\t\t\tlong time = end - start;\r\n\t\t\t\ttimes[i] += time; \r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (int j = 0; j < max; j++) {\r\n\t\t\tSystem.out.println(j + \": \" + times[j] / trials + \"ms\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Introduction/FibonacciB.java",
    "content": "package Introduction;\r\n\r\npublic class FibonacciB {\r\n\tpublic static int fibonacci(int n) {\r\n\t\treturn fibonacci(n, new int[n + 1]);\r\n\t}\r\n\t\r\n\tpublic static int fibonacci(int i, int[] memo) {\r\n\t\tif (i == 0) return 0;\r\n\t\telse if (i == 1) return 1;\r\n\t\t\r\n\t\tif (memo[i] == 0) {\r\n\t\t\tmemo[i] = fibonacci(i - 1, memo) + fibonacci(i - 2, memo);\r\n\t\t}\r\n\t\treturn memo[i];\r\n\t}\r\n\t\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tint max = 100; // Make this as big as you want! (Though you'll exceed the bounds of a long around 46)\r\n\t\tint trials = 10; // Run code multiple times to compute average time.\r\n\t\tdouble[] times = new double[max]; // Store times\r\n\t\t\r\n\t\tfor (int j = 0; j < trials; j++) { // Run this 10 times to compute\r\n\t\t\tfor (int i = 0; i < max; i++) {\r\n\t\t\t\tlong start = System.currentTimeMillis();\r\n\t\t\t\tSystem.out.println(fibonacci(i));\r\n\t\t\t\tlong end = System.currentTimeMillis();\r\n\t\t\t\tlong time = end - start;\r\n\t\t\t\ttimes[i] += time; \r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (int j = 0; j < max; j++) {\r\n\t\t\t//System.out.println(j + \": \" + times[j] / trials + \"ms\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Introduction/FibonacciC.java",
    "content": "package Introduction;\r\n\r\npublic class FibonacciC {\r\n\t\r\n\tpublic static int fibonacci(int n) {\r\n\t\tif (n == 0) return 0;\r\n\t\telse if (n == 1) return 1;\r\n\t\t\r\n\t\tint[] memo = new int[n];\r\n\t\tmemo[0] = 0;\r\n\t\tmemo[1] = 1;\r\n\t\tfor (int i = 2; i < n; i++) {\r\n\t\t\tmemo[i] = memo[i - 1] + memo[i - 2];\r\n\t\t}\r\n\t\treturn memo[n - 1] + memo[n - 2];\r\n\t}\r\n\t\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tint max = 100; // Make this as big as you want! (Though you'll exceed the bounds of a long around 46)\r\n\t\tint trials = 10; // Run code multiple times to compute average time.\r\n\t\tdouble[] times = new double[max]; // Store times\r\n\t\t\r\n\t\tfor (int j = 0; j < trials; j++) { // Run this 10 times to compute\r\n\t\t\tfor (int i = 0; i < max; i++) {\r\n\t\t\t\tlong start = System.currentTimeMillis();\r\n\t\t\t\tSystem.out.println(fibonacci(i));\r\n\t\t\t\tlong end = System.currentTimeMillis();\r\n\t\t\t\tlong time = end - start;\r\n\t\t\t\ttimes[i] += time; \r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (int j = 0; j < max; j++) {\r\n\t\t\t//System.out.println(j + \": \" + times[j] / trials + \"ms\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Introduction/FibonacciD.java",
    "content": "package Introduction;\r\n\r\npublic class FibonacciD {\r\n\tpublic static int fibonacci(int n) {\r\n\t\tif (n == 0) return 0;\r\n\t\tint a = 0;\r\n\t\tint b = 1;\r\n\t\tfor (int i = 2; i < n; i++) {\r\n\t\t\tint c = a + b;\r\n\t\t\ta = b;\r\n\t\t\tb = c;\r\n\t\t}\r\n\t\treturn a + b;\r\n\t}\r\n\t\r\n\t/**\r\n\t * @param args\r\n\t */\r\n\tpublic static void main(String[] args) {\r\n\t\tint max = 100; // Make this as big as you want! (Though you'll exceed the bounds of a long around 46)\r\n\t\tint trials = 10; // Run code multiple times to compute average time.\r\n\t\tdouble[] times = new double[max]; // Store times\r\n\t\t\r\n\t\tfor (int j = 0; j < trials; j++) { // Run this 10 times to compute\r\n\t\t\tfor (int i = 0; i < max; i++) {\r\n\t\t\t\tlong start = System.currentTimeMillis();\r\n\t\t\t\tSystem.out.println(fibonacci(i));\r\n\t\t\t\tlong end = System.currentTimeMillis();\r\n\t\t\t\tlong time = end - start;\r\n\t\t\t\ttimes[i] += time; \r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (int j = 0; j < max; j++) {\r\n\t\t\t//System.out.println(j + \": \" + times[j] / trials + \"ms\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_01_Triple_Step/QuestionA.java",
    "content": "package Q8_01_Triple_Step;\r\n\r\npublic class QuestionA {\r\n\t\r\n\tpublic static int countWays(int n) {\r\n\t\tif (n < 0) {\r\n\t\t\treturn 0;\r\n\t\t} else if (n == 0) {\r\n\t\t\treturn 1;\r\n\t\t} else {\r\n\t\t\treturn countWays(n - 1) + countWays(n - 2) + countWays(n - 3);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint n = 20;\r\n\t\tint ways = countWays(n);\r\n\t\tSystem.out.println(ways);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_01_Triple_Step/QuestionB.java",
    "content": "package Q8_01_Triple_Step;\r\n\r\nimport java.util.Arrays;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static int countWays(int n) {\r\n\t\tint[] map = new int[n + 1];\r\n\t\tArrays.fill(map, -1);\r\n\t\treturn countWays(n, map);\r\n\t}\r\n\t\r\n\tpublic static int countWays(int n, int[] memo) {\r\n\t\tif (n < 0) {\r\n\t\t\treturn 0;\r\n\t\t} else if (n == 0) {\r\n\t\t\treturn 1;\r\n\t\t} else if (memo[n] > -1) {\r\n\t\t\treturn memo[n];\r\n\t\t} else {\r\n\t\t\tmemo[n] = countWays(n - 1, memo) + countWays(n - 2, memo) + countWays(n - 3, memo);\r\n\t\t\treturn memo[n];\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint n = 50;\r\n\t\tint ways = countWays(n);\r\n\t\tSystem.out.println(ways);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_01_Triple_Step/Tester.java",
    "content": "package Q8_01_Triple_Step;\r\n\r\npublic class Tester {\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 30; i++) {\r\n\t\t\tint c1 = QuestionB.countWays(i);\r\n\t\t\tint c2 = QuestionA.countWays(i);\t\t\r\n\t\t\tSystem.out.println(i + \": \" + c1 + \" \" + c2);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_02_Robot_in_a_Grid/Point.java",
    "content": "package Q8_02_Robot_in_a_Grid;\n\npublic class Point {\n\tpublic int row, column;\n\tpublic Point(int row, int column) {\n\t\tthis.row = row;\n\t\tthis.column = column;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn \"(\" + row + \", \" + column + \")\";\n\t}\n\t\n\t@Override\n\t public int hashCode() {\n        return this.toString().hashCode();\n    }\n\t\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif ((o instanceof Point) && (((Point) o).row == this.row) && (((Point) o).column == this.column)) {\n            return true;\n        } else {\n            return false;\n        }\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_02_Robot_in_a_Grid/QuestionA.java",
    "content": "package Q8_02_Robot_in_a_Grid;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\t\r\n\tpublic static ArrayList<Point> getPath(boolean[][] maze) {\r\n\t\tif (maze == null || maze.length == 0) return null;\r\n\t\tArrayList<Point> path = new ArrayList<Point>();\r\n\t\tif (getPath(maze, maze.length - 1, maze[0].length - 1, path)) {\r\n\t\t\treturn path;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\t\r\n\t\r\n\tpublic static boolean getPath(boolean[][] maze, int row, int col, ArrayList<Point> path) {\r\n\t\t// If out of bounds or not available, return.\r\n\t\tif (col < 0 || row < 0 || !maze[row][col]) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\tboolean isAtOrigin = (row == 0) && (col == 0);\r\n\t\t\r\n\t\t// If there's a path from the start to my current location, add my location.\r\n\t\tif (isAtOrigin || getPath(maze, row, col - 1, path) || getPath(maze, row - 1, col, path)) { \r\n\t\t\tPoint p = new Point(row, col);\r\n\t\t\tpath.add(p);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint size = 5;\r\n\t\tboolean[][] maze = AssortedMethods.randomBooleanMatrix(size, size, 70);\r\n\t\t\r\n\t\tAssortedMethods.printMatrix(maze);\r\n\t\t\r\n\t\tArrayList<Point> path = getPath(maze);\r\n\t\tif (path != null) {\r\n\t\t\tSystem.out.println(path.toString());\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"No path found.\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_02_Robot_in_a_Grid/QuestionB.java",
    "content": "package Q8_02_Robot_in_a_Grid;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.HashSet;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\tpublic static ArrayList<Point> getPath(boolean[][] maze) {\r\n\t\tif (maze == null || maze.length == 0) return null;\r\n\t\tArrayList<Point> path = new ArrayList<Point>();\r\n\t\tHashSet<Point> failedPoints = new HashSet<Point>();\r\n\t\tif (getPath(maze, maze.length - 1, maze[0].length - 1, path, failedPoints)) {\r\n\t\t\treturn path;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic static boolean getPath(boolean[][] maze, int row, int col, ArrayList<Point> path, HashSet<Point> failedPoints) {\r\n\t\t/* If out of bounds or not available, return.*/\r\n\t\tif (col < 0 || row < 0 || !maze[row][col]) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\tPoint p = new Point(row, col);\r\n\t\t\r\n\t\t/* If we've already visited this cell, return. */\r\n\t\tif (failedPoints.contains(p)) { \r\n\t\t\treturn false;\r\n\t\t}\t\r\n\t\t\r\n\t\tboolean isAtOrigin = (row == 0) && (col == 0);\r\n\t\t\r\n\t\t/* If there's a path from the start to my current location, add my location.*/\r\n\t\tif (isAtOrigin || getPath(maze, row, col - 1, path, failedPoints) || getPath(maze, row - 1, col, path, failedPoints)) {\r\n\t\t\tpath.add(p);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\tfailedPoints.add(p); // Cache result\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint size = 20;\r\n\t\tboolean[][] maze = AssortedMethods.randomBooleanMatrix(size, size, 60);\r\n\t\t\r\n\t\tAssortedMethods.printMatrix(maze);\r\n\t\t\r\n\t\tArrayList<Point> path = getPath(maze);\r\n\t\tif (path != null) {\r\n\t\t\tSystem.out.println(path.toString());\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"No path found.\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_02_Robot_in_a_Grid/Tester.java",
    "content": "package Q8_02_Robot_in_a_Grid;\n\nimport java.util.ArrayList;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\tpublic static void main(String[] args) {\n\t\tint size = 5;\n\t\tboolean[][] maze = AssortedMethods.randomBooleanMatrix(size, size, 70);\n\t\t\n\t\tAssortedMethods.printMatrix(maze);\n\t\t\n\t\tArrayList<Point> pathA = QuestionA.getPath(maze);\n\t\tArrayList<Point> pathB = QuestionB.getPath(maze);\n\t\tif (pathA != null) {\n\t\t\tSystem.out.println(pathA.toString());\n\t\t} else {\n\t\t\tSystem.out.println(\"No path found.\");\n\t\t}\n\t\t\n\t\tif (pathB != null) {\n\t\t\tSystem.out.println(pathB.toString());\n\t\t} else {\n\t\t\tSystem.out.println(\"No path found.\");\n\t\t}\t\t\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_03_Magic_Index/Question.java",
    "content": "package Q8_03_Magic_Index;\r\n\r\nimport java.util.Arrays;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\tpublic static int magicSlow(int[] array) {\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tif (array[i] == i) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\tpublic static int magicFast(int[] array, int start, int end) {\r\n\t\tif (end < start) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tint mid = (start + end) / 2;\r\n\t\tif (array[mid] == mid) {\r\n\t\t\treturn mid;\r\n\t\t} else if (array[mid] > mid){\r\n\t\t\treturn magicFast(array, start, mid - 1);\r\n\t\t} else {\r\n\t\t\treturn magicFast(array, mid + 1, end);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int magicFast(int[] array) {\r\n\t\treturn magicFast(array, 0, array.length - 1);\r\n\t}\r\n\t\r\n\t/* Creates an array that is distinct and sorted */\r\n\tpublic static int[] getDistinctSortedArray(int size) {\r\n\t\tint[] array = AssortedMethods.randomArray(size, -1 * size, size);\r\n\t\tArrays.sort(array);\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i] == array[i-1]) {\r\n\t\t\t\tarray[i]++;\r\n\t\t\t} else if (array[i] < array[i - 1]) {\r\n\t\t\t\tarray[i] = array[i-1] + 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn array;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 1000; i++) {\r\n\t\t\tint size = AssortedMethods.randomIntInRange(5, 20);\r\n\t\t\tint[] array = getDistinctSortedArray(size);\r\n\t\t\tint v2 = magicFast(array);\r\n\t\t\tif (v2 == -1 && magicSlow(array) != -1) {\r\n\t\t\t\tint v1 = magicSlow(array);\r\n\t\t\t\tSystem.out.println(\"Incorrect value: index = -1, actual = \" + v1 + \" \" + i);\r\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t\t\t\tbreak;\r\n\t\t\t} else if (v2 > -1 && array[v2] != v2) {\r\n\t\t\t\tSystem.out.println(\"Incorrect values: index= \" + v2 + \", value \" + array[v2]);\r\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_03_Magic_Index/QuestionB.java",
    "content": "package Q8_03_Magic_Index;\r\n\r\nimport java.util.Arrays;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static int magicSlow(int[] array) {\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tif (array[i] == i) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\tpublic static int magicFast(int[] array, int start, int end) {\r\n\t\tif (end < start) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tint midIndex = (start + end) / 2;\r\n\t\tint midValue = array[midIndex];\r\n\t\tif (midValue == midIndex) {\r\n\t\t\treturn midIndex;\r\n\t\t}\r\n\t\t/* Search left */\r\n\t\tint leftIndex = Math.min(midIndex - 1, midValue);\r\n\t\tint left = magicFast(array, start, leftIndex);\r\n\t\tif (left >= 0) {\r\n\t\t\treturn left;\r\n\t\t}\r\n\t\t\r\n\t\t/* Search right */\r\n\t\tint rightIndex = Math.max(midIndex + 1, midValue);\r\n\t\tint right = magicFast(array, rightIndex, end);\r\n\t\t\r\n\t\treturn right;\r\n\t}\r\n\t\r\n\tpublic static int magicFast(int[] array) {\r\n\t\treturn magicFast(array, 0, array.length - 1);\r\n\t}\r\n\t\r\n\t/* Creates an array that is sorted */\r\n\tpublic static int[] getSortedArray(int size) {\r\n\t\tint[] array = AssortedMethods.randomArray(size, -1 * size, size);\r\n\t\tArrays.sort(array);\r\n\t\treturn array;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 1000; i++) {\r\n\t\t\tint size = AssortedMethods.randomIntInRange(5, 20);\r\n\t\t\tint[] array = getSortedArray(size);\r\n\t\t\tint v2 = magicFast(array);\r\n\t\t\tif (v2 == -1 && magicSlow(array) != -1) {\r\n\t\t\t\tint v1 = magicSlow(array);\r\n\t\t\t\tSystem.out.println(\"Incorrect value: index = -1, actual = \" + v1 + \" \" + i);\r\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t\t\t\tbreak;\r\n\t\t\t} else if (v2 > -1 && array[v2] != v2) {\r\n\t\t\t\tSystem.out.println(\"Incorrect values: index= \" + v2 + \", value \" + array[v2]);\r\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_04_Power_Set/QuestionA.java",
    "content": "package Q8_04_Power_Set;\r\n\r\nimport java.util.*;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> set, int index) {\r\n\t\tArrayList<ArrayList<Integer>> allsubsets;\r\n\t\tif (set.size() == index) { // Base case - add empty set\r\n\t\t\tallsubsets = new ArrayList<ArrayList<Integer>>();\r\n\t\t\tallsubsets.add(new ArrayList<Integer>()); \r\n\t\t} else {\r\n\t\t\tallsubsets = getSubsets(set, index + 1);\r\n\t\t\tint item = set.get(index);\r\n\t\t\tArrayList<ArrayList<Integer>> moresubsets = new ArrayList<ArrayList<Integer>>();\r\n\t\t\tfor (ArrayList<Integer> subset : allsubsets) {\r\n\t\t\t\tArrayList<Integer> newsubset = new ArrayList<Integer>();\r\n\t\t\t\tnewsubset.addAll(subset); \r\n\t\t\t\tnewsubset.add(item);\r\n\t\t\t\tmoresubsets.add(newsubset);\r\n\t\t\t}\r\n\t\t\tallsubsets.addAll(moresubsets);\r\n\t\t}\r\n\t\treturn allsubsets;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<Integer> list = new ArrayList<Integer>();\r\n\t\tfor (int i = 0; i < 3; i++) {\r\n\t\t\tlist.add(i);\r\n\t\t}\r\n\t\tArrayList<ArrayList<Integer>> subsets = getSubsets(list, 0);\r\n\t\tSystem.out.println(subsets.toString());\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_04_Power_Set/QuestionB.java",
    "content": "package Q8_04_Power_Set;\r\n\r\nimport java.util.*;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static ArrayList<Integer> convertIntToSet(int x, ArrayList<Integer> set) {\r\n\t\tArrayList<Integer> subset = new ArrayList<Integer>(); \r\n\t\tint index = 0;\r\n\t\tfor (int k = x; k > 0; k >>= 1) {\r\n\t\t\tif ((k & 1) == 1) {\r\n\t\t\t\tsubset.add(set.get(index));\r\n\t\t\t}\r\n\t\t\tindex++;\r\n\t\t}\r\n\t\treturn subset;\r\n\t}\r\n\t\r\n\tpublic static ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> set) {\r\n\t\tArrayList<ArrayList<Integer>> allsubsets = new ArrayList<ArrayList<Integer>>();\r\n\t\tint max = 1 << set.size(); /* Compute 2^n */ \r\n\t\tfor (int k = 0; k < max; k++) {\r\n\t\t\tArrayList<Integer> subset = convertIntToSet(k, set);\r\n\t\t\tallsubsets.add(subset);\r\n\t\t}\r\n\t\treturn allsubsets;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<Integer> list = new ArrayList<Integer>();\r\n\t\tfor (int i = 0; i < 3; i++) {\r\n\t\t\tlist.add(i);\r\n\t\t}\r\n\t\t\r\n\t\tArrayList<ArrayList<Integer>> subsets2 = getSubsets(list);\r\n\t\tSystem.out.println(subsets2.toString());\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_05_Recursive_Multiply/QuestionA.java",
    "content": "package Q8_05_Recursive_Multiply;\n\npublic class QuestionA {\n\n\tpublic static int counter = 0;\n\t\n\tpublic static int sum(int x, int y) {\n\t\tcounter++;\n\t\treturn x + y;\n\t}\t\n\t\n\tpublic static int minProductHelper(int smaller, int bigger) {\n\t\tif (smaller == 0) { // 0 x bigger = 0\n\t\t\treturn 0;\n\t\t} else if (smaller == 1) { // 1 x bigger = bigger\n\t\t\treturn bigger;\n\t\t}\n\t\t\n\t\t/* Compute half. If uneven, compute other half. If even,\n\t\t * double it. */\n\t\tint s = smaller >> 1; // Divide by 2\n\t\tint side1 = minProductHelper(s, bigger);\n\t\tint side2 = side1;\n\t\tif (smaller % 2 == 1) {\n\t\t\tcounter++;\n\t\t\tside2 = minProductHelper(smaller - s, bigger);\n\t\t}\n\t\tcounter++;\n\t\treturn side1 + side2;\n\t}\t\n\t\n\tpublic static int minProduct(int a, int b) {\n\t\tint bigger = a < b ? b : a;\n\t\tint smaller = a < b ? a : b;\n\t\treturn minProductHelper(smaller, bigger);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint a = 13494;\n\t\tint b = 22323;\n\t\tint product = a * b;\n\t\tint minProduct = minProduct(a, b);\n\t\tif (product == minProduct) {\n\t\t\tSystem.out.println(\"Success: \" + a + \" * \" + b + \" = \" + product);\n\t\t} else {\n\t\t\tSystem.out.println(\"Failure: \" + a + \" * \" + b + \" = \" + product + \" instead of \" + minProduct);\n\t\t}\n\t\tSystem.out.println(\"Adds: \" + counter);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_05_Recursive_Multiply/QuestionB.java",
    "content": "package Q8_05_Recursive_Multiply;\n\npublic class QuestionB {\n\n\tpublic static int counter = 0;\n\t\n\tpublic static int sum(int x, int y) {\n\t\tcounter += 1;\n\t\treturn x + y;\n\t}\n\t\n\tpublic static int minProduct(int smaller, int bigger, int[] memo) {\n\t\tif (smaller == 0) {\n\t\t\treturn 0;\n\t\t} else if (smaller == 1) {\n\t\t\treturn bigger;\n\t\t} else if (memo[smaller] > 0) {\n\t\t\treturn memo[smaller];\n\t\t}\n\t\t\t\n\t\t/* Compute half. If uneven, compute other half. If even,\n\t\t * double it. */\n\t\tint s = smaller >> 1; // Divide by 2\n\t\tint side1 = minProduct(s, bigger, memo); // Compute half\n\t\tint side2 = side1;\n\t\tif (smaller % 2 == 1) {\n\t\t\tcounter++;\n\t\t\tside2 = minProduct(smaller - s, bigger, memo);\n\t\t}\n\t\t\n\t\t/* Sum and cache.*/\n\t\tcounter++;\n\t\tmemo[smaller] = side1 + side2; \n\t\treturn memo[smaller];\n\t}\n\t\n\tpublic static int minProduct(int a, int b) {\n\t\tint bigger = a < b ? b : a;\n\t\tint smaller = a < b ? a : b;\n\t\t\n\t\tint memo[] = new int[sum(smaller, 1)];\n\t\treturn minProduct(smaller, bigger, memo);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint a = 13494;\n\t\tint b = 22323;\n\t\tint product = a * b;\n\t\tint minProduct = minProduct(a, b);\n\t\tif (product == minProduct) {\n\t\t\tSystem.out.println(\"Success: \" + a + \" * \" + b + \" = \" + product);\n\t\t} else {\n\t\t\tSystem.out.println(\"Failure: \" + a + \" * \" + b + \" = \" + product + \" instead of \" + minProduct);\n\t\t}\n\t\tSystem.out.println(\"Adds: \" + counter);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_05_Recursive_Multiply/QuestionC.java",
    "content": "package Q8_05_Recursive_Multiply;\n\npublic class QuestionC {\n\n\tpublic static int counter = 0;\n\t\n\tpublic static int minProductHelper(int smaller, int bigger) {\n\t\tif (smaller == 0) {\n\t\t\treturn 0;\n\t\t} else if (smaller == 1) {\n\t\t\treturn bigger;\n\t\t} \n\t\t\n\t\tint s = smaller >> 1;\n\t\tint halfProd = minProductHelper(s, bigger);\n\t\t\n\t\tif (smaller % 2 == 0) {\n\t\t\tcounter++;\n\t\t\treturn halfProd + halfProd;\n\t\t} else {\n\t\t\tcounter+=2;\n\t\t\treturn halfProd + halfProd + bigger;\n\t\t}\n\t}\n\n\t\n\tpublic static int minProduct(int a, int b) {\n\t\tint bigger = a < b ? b : a;\n\t\tint smaller = a < b ? a : b;\n\t\t\n\t\treturn minProductHelper(smaller, bigger);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint a = 13494;\n\t\tint b = 22323;\n\t\tint product = a * b;\n\t\tint minProduct = minProduct(a, b);\n\t\tif (product == minProduct) {\n\t\t\tSystem.out.println(\"Success: \" + a + \" * \" + b + \" = \" + product);\n\t\t} else {\n\t\t\tSystem.out.println(\"Failure: \" + a + \" * \" + b + \" = \" + product + \" instead of \" + minProduct);\n\t\t}\n\t\tSystem.out.println(\"Adds: \" + counter);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_05_Recursive_Multiply/QuestionD.java",
    "content": "package Q8_05_Recursive_Multiply;\n\npublic class QuestionD {\n\tpublic static int counter = 0;\n\t\n\t/* This is an algorithm called the peasant algorithm. \n\t * https://en.wikipedia.org/wiki/Multiplication_algorithm#Peasant_or_binary_multiplication \n\t */\n\tpublic static int minProduct(int a, int b) {\n\t\tif (a < b) return minProduct(b, a);\n\t\tint value = 0;\n\t\twhile (a > 0) {\n\t\t\tcounter++;\n\t\t\tif ((a % 10) % 2 == 1) {\n\t\t\t\tvalue += b;\n\t\t\t}\n\t\t\ta >>= 1;\n\t\t\tb <<= 1;\n\t\t}\t\n\t\treturn value;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 100; i++) {\n\t\t\tfor (int j = 0; j < 100; j++) {\n\t\t\t\tint prod1 = minProduct(i, j);\n\t\t\t\tint prod2 = i * j;\n\t\t\t\tif (prod1 != prod2) {\n\t\t\t\t\tSystem.out.println(\"ERROR: \" + i + \" * \" + j + \" = \" + prod2 + \", not \" + prod1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_05_Recursive_Multiply/Tester.java",
    "content": "package Q8_05_Recursive_Multiply;\n\npublic class Tester {\n\n\t/**\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\tint max = 1000;\n\t\tint counterA = 0, counterB = 0, counterC = 0, counterD = 0;\n\t\t\n\t\tfor (int a = 0; a < max; a++) {\n\t\t\tfor (int b = 0; b < max; b++) {\n\t\t\t\tint prodA = QuestionA.minProduct(a, b);\n\t\t\t\tint prodB = QuestionB.minProduct(a, b);\n\t\t\t\tint prodC = QuestionC.minProduct(a, b);\n\t\t\t\tint prodD = QuestionD.minProduct(a, b);\n\t\t\t\t\n\t\t\t\tint product = a * b;\n\t\t\t\t\n\t\t\t\tcounterA += QuestionA.counter;\n\t\t\t\tcounterB += QuestionB.counter;\n\t\t\t\tcounterC += QuestionC.counter;\n\t\t\t\tcounterD += QuestionD.counter;\n\n\t\t\t\tQuestionA.counter = 0;\n\t\t\t\tQuestionB.counter = 0;\n\t\t\t\tQuestionC.counter = 0;\n\t\t\t\tQuestionD.counter = 0;\n\t\t\t\t\n\t\t\t\tif (prodA != product || prodB != product || prodC != product || prodD != product) {\n\t\t\t\t\tSystem.out.println(\"Failure: \" + a + \" * \" + b + \" = \" + product + \" instead of (\" + prodA + \", \" + prodB + \", \" + prodC + \", \" + prodD + \")\");\n\t\t\t\t\tbreak;\n\t\t\t\t} \n\t\t\t}\n\t\t}\n\n\t\tSystem.out.println();\n\t\tSystem.out.println(\"A: \" + counterA);\n\t\tSystem.out.println(\"B: \" + counterB);\n\t\tSystem.out.println(\"C: \" + counterC);\n\t\tSystem.out.println(\"D: \" + counterD);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_06_Towers_of_Hanoi/Question.java",
    "content": "package Q8_06_Towers_of_Hanoi;\r\n\r\npublic class Question {\r\n\tpublic static void main(String[] args) {\r\n\t\tTower source = new Tower();\r\n\t\tTower destination = new Tower();\r\n\t\tTower buffer = new Tower();\r\n\t\t\r\n\t\tsource.name = \"s\";\r\n\t\tdestination.name = \"d\";\r\n\t\tbuffer.name = \"b\";\r\n\t\t\r\n\t\t/* Load up tower */\r\n\t\tint numberOfDisks = 5;\r\n\t\tfor (int disk = numberOfDisks - 1; disk >= 0; disk--) {\r\n\t\t\tsource.add(disk);\r\n\t\t}\r\n\t\t\r\n\t\tsource.print();\r\n\t\tsource.moveDisks(numberOfDisks, destination, buffer);\r\n\t\tdestination.print();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_06_Towers_of_Hanoi/Tower.java",
    "content": "package Q8_06_Towers_of_Hanoi;\r\n\r\nimport java.util.Stack;\r\n\r\npublic class Tower {\r\n\tprivate Stack<Integer> disks = new Stack<Integer>();\r\n\tpublic String name;\r\n\t\r\n\tpublic void add(int d) {\r\n\t\tif (!disks.isEmpty() && disks.peek() <= d) {\r\n\t\t\tSystem.out.println(\"Error placing disk \" + d);\r\n\t\t} else {\r\n\t\t\tdisks.push(d);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void moveTopTo(Tower t) {\r\n\t\tint top = disks.pop();\r\n\t\tt.add(top);\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tSystem.out.println(\"Contents of Tower \" + name + \": \" + disks.toString());\r\n\t}\r\n\t\r\n    public void moveDisks(int quantity, Tower destination, Tower buffer){\r\n    \tif (quantity <= 0) return;\r\n    \t\r\n\t\tmoveDisks(quantity - 1, buffer, destination);\r\n\t\tSystem.out.println(\"Move \" + disks.peek() + \" from \" + this.name + \" to \" + destination.name);\r\n\t\tmoveTopTo(destination);\r\n\t\tbuffer.moveDisks(quantity - 1, destination, this);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_07_Permutations_Without_Dups/QuestionA.java",
    "content": "package Q8_07_Permutations_Without_Dups;\r\n\r\nimport java.util.*;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static ArrayList<String> getPerms(String str) {\r\n\t\tif (str == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tArrayList<String> permutations = new ArrayList<String>();\r\n\t\tif (str.length() == 0) { // base case\r\n\t\t\tpermutations.add(\"\");\r\n\t\t\treturn permutations;\r\n\t\t}\r\n\t            \r\n\t\tchar first = str.charAt(0); // get the first character\r\n\t\tString remainder = str.substring(1); // remove the first character\r\n\t\tArrayList<String> words = getPerms(remainder);\r\n\t\tfor (String word : words) {\r\n\t\t\tfor (int j = 0; j <= word.length(); j++) {\r\n\t\t\t\tString s = insertCharAt(word, first, j);\r\n\t\t\t\tpermutations.add(s);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn permutations;\r\n\t}\r\n\t\r\n\tpublic static String insertCharAt(String word, char c, int i) {\r\n\t\tString start = word.substring(0, i);\r\n\t\tString end = word.substring(i);\r\n\t\treturn start + c + end;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<String> list = getPerms(\"abcde\");\r\n\t\tSystem.out.println(\"There are \" + list.size() + \" permutations.\");\r\n\t\tfor (String s : list) {\r\n\t\t\tSystem.out.println(s);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_07_Permutations_Without_Dups/QuestionB.java",
    "content": "package Q8_07_Permutations_Without_Dups;\r\n\r\nimport java.util.*;\r\n\r\npublic class QuestionB {\r\n\tpublic static ArrayList<String> getPerms(String remainder) {\r\n\t\tint len = remainder.length();\r\n\t\tArrayList<String> result = new ArrayList<String>();\r\n\t\t\r\n\t\t/* Base case. */\r\n\t\tif (len == 0) {\r\n\t\t\tresult.add(\"\"); // Be sure to return empty string!\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tfor (int i = 0; i < len; i++) {\r\n\t\t\t/* Remove char i and find permutations of remaining characters.*/\r\n\t\t\tString before = remainder.substring(0, i);\r\n\t\t\tString after = remainder.substring(i + 1, len);\r\n\t\t\tArrayList<String> partials = getPerms(before + after);\r\n\t\t\t\r\n\t\t\t/* Prepend char i to each permutation.*/\r\n\t\t\tfor (String s : partials) {\r\n\t\t\t\tresult.add(remainder.charAt(i) + s);\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<String> list = getPerms(\"abc\");\r\n\t\tSystem.out.println(\"There are \" + list.size() + \" permutations.\");\r\n\t\tfor (String s : list) {\r\n\t\t\tSystem.out.println(s);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_07_Permutations_Without_Dups/QuestionC.java",
    "content": "package Q8_07_Permutations_Without_Dups;\r\n\r\nimport java.util.*;\r\n\r\npublic class QuestionC {\r\n\r\n\tpublic static void getPerms(String prefix, String remainder, ArrayList<String> result) {\r\n\t\tif (remainder.length() == 0) {\r\n\t\t\tresult.add(prefix);\r\n\t\t}\r\n\t\tint len = remainder.length();\r\n\t\tfor (int i = 0; i < len; i++) {\r\n\t\t\tString before = remainder.substring(0, i);\r\n\t\t\tString after = remainder.substring(i + 1, len);\r\n\t\t\tchar c = remainder.charAt(i);\r\n\t\t\tgetPerms(prefix + c, before + after, result);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static ArrayList<String> getPerms(String str) {\r\n\t\tArrayList<String> result = new ArrayList<String>();\r\n\t\tgetPerms(\"\", str, result);\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<String> list = getPerms(\"abc\");\r\n\t\tSystem.out.println(\"There are \" + list.size() + \" permutations.\");\r\n\t\tfor (String s : list) {\r\n\t\t\tSystem.out.println(s);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_08_Permutations_With_Dups/Question.java",
    "content": "package Q8_08_Permutations_With_Dups;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class Question {\t\n\tpublic static HashMap<Character, Integer> buildFreqTable(String s) {\n\t\tHashMap<Character, Integer> map = new HashMap<Character, Integer>();\n\t\tfor (char c : s.toCharArray()) {\n\t\t\tif (!map.containsKey(c)) {\n\t\t\t\tmap.put(c, 0);\n\t\t\t}\n\t\t\tmap.put(c, map.get(c) + 1);\n\t\t}\n\t\treturn map;\n\t}\n\t\n\tpublic static void printPerms(HashMap<Character, Integer> map, String prefix, int remaining, ArrayList<String> result) {\n\t\tif (remaining == 0) {\n\t\t\tresult.add(prefix);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (Character c : map.keySet()) {\n\t\t\tint count = map.get(c);\n\t\t\tif (count > 0) {\n\t\t\t\tmap.put(c,  count - 1);\n\t\t\t\tprintPerms(map, prefix + c, remaining - 1, result);\n\t\t\t\tmap.put(c,  count);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static ArrayList<String> printPerms(String s) {\n\t\tArrayList<String> result = new ArrayList<String>();\n\t\tHashMap<Character, Integer> map = buildFreqTable(s);\n\t\tprintPerms(map, \"\", s.length(), result);\n\t\treturn result;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString s = \"aabbccc\";\n\t\tArrayList<String> result = printPerms(s);\n\t\tSystem.out.println(\"Count: \" + result.size());\n\t\tfor (String r : result) {\n\t\t\tSystem.out.println(r);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_09_Parens/QuestionA.java",
    "content": "package Q8_09_Parens;\r\n\r\nimport java.util.HashSet;\r\nimport java.util.Set;\r\n\r\npublic class QuestionA {\r\n\tpublic static String insertInside(String str, int leftIndex) {\r\n\t\tString left = str.substring(0, leftIndex + 1);\r\n\t\tString right = str.substring(leftIndex + 1, str.length());\r\n\t\treturn left + \"()\" + right;\r\n\t}\r\n\t\r\n\tpublic static Set<String> generateParens(int remaining) {\r\n\t\tSet<String> set = new HashSet<String>();\r\n\t\tif (remaining == 0) {\r\n\t\t\tset.add(\"\");\r\n\t\t} else {\r\n\t\t\tSet<String> prev = generateParens(remaining - 1); \r\n\t\t\tfor (String str : prev) {\r\n\t\t\t\tfor (int i = 0; i < str.length(); i++) {\r\n\t\t\t\t\tif (str.charAt(i) == '(') {\r\n\t\t\t\t\t\tString s = insertInside(str, i);\r\n\t\t\t\t\t\t/* Add s to set if it is not already in there. Note: \t\r\n\t\t\t\t\t\t * HashSet automatically checks for duplicates before\r\n\t\t\t\t\t\t * adding, so an explicit check is not necessary. */\r\n\t\t\t\t\t\tset.add(s);\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tset.add(\"()\" + str);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn set;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tSet<String> list = generateParens(4);\r\n\t\tfor (String s : list) {\r\n\t\t\tSystem.out.println(s);\r\n\t\t}\r\n\t\tSystem.out.println(list.size());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_09_Parens/QuestionB.java",
    "content": "package Q8_09_Parens;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static void addParen(ArrayList<String> list, int leftRem, int rightRem, char[] str, int index) {\r\n\t\tif (leftRem < 0 || rightRem < leftRem) return; // invalid state\r\n\t\t\r\n\t\tif (leftRem == 0 && rightRem == 0) { /* all out of left and right parentheses */\r\n\t\t\tlist.add(String.copyValueOf(str));\r\n\t\t} else {\r\n\t\t\tstr[index] = '('; // Add left and recurse\r\n\t\t\taddParen(list, leftRem - 1, rightRem, str, index + 1);\r\n\t\t\t\r\n\t\t\tstr[index] = ')'; // Add right and recurse\r\n\t\t\taddParen(list, leftRem, rightRem - 1, str, index + 1);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static ArrayList<String> generateParens(int count) {\r\n\t\tchar[] str = new char[count*2];\r\n\t\tArrayList<String> list = new ArrayList<String>();\r\n\t\taddParen(list, count, count, str, 0);\r\n\t\treturn list;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<String> list = generateParens(6);\r\n\t\tfor (String s : list) {\r\n\t\t\tSystem.out.println(s);\r\n\t\t}\r\n\t\tSystem.out.println(list.size());\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_10_Paint_Fill/Question.java",
    "content": "package Q8_10_Paint_Fill;\r\n\r\npublic class Question {\r\n\r\n\tpublic enum Color {\r\n\t\tBlack, White, Red, Yellow, Green\r\n\t}\r\n\t\r\n\tpublic static String PrintColor(Color c) {\r\n\t\tswitch(c) {\r\n\t\tcase Black:\r\n\t\t\treturn \"B\";\r\n\t\tcase White:\r\n\t\t\treturn \"W\";\r\n\t\tcase Red:\r\n\t\t\treturn \"R\";\r\n\t\tcase Yellow:\r\n\t\t\treturn \"Y\";\r\n\t\tcase Green:\r\n\t\t\treturn \"G\";\r\n\t\t}\r\n\t\treturn \"X\";\r\n\t}\r\n\t\r\n\tpublic static void PrintScreen(Color[][] screen) {\r\n\t\tfor (int r = 0; r < screen.length; r++) {\r\n\t\t\tfor (int c = 0; c < screen[0].length; c++) {\r\n\t\t\t\tSystem.out.print(PrintColor(screen[r][c]));\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int randomInt(int n) {\r\n\t\treturn (int) (Math.random() * n);\r\n\t}\r\n\t\r\n\tpublic static boolean PaintFill(Color[][] screen, int r, int c, Color ocolor, Color ncolor) {\r\n\t\tif (r < 0 || r >= screen.length || c < 0 || c >= screen[0].length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (screen[r][c] == ocolor) {\r\n\t\t\tscreen[r][c] = ncolor;\r\n\t\t\tPaintFill(screen, r - 1, c, ocolor, ncolor); // up\r\n\t\t\tPaintFill(screen, r + 1, c, ocolor, ncolor); // down\r\n\t\t\tPaintFill(screen, r, c - 1, ocolor, ncolor); // left\r\n\t\t\tPaintFill(screen, r, c + 1, ocolor, ncolor); // right\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static boolean PaintFill(Color[][] screen, int r, int c, Color ncolor) {\r\n\t\tif (screen[r][c] == ncolor) return false;\r\n\t\treturn PaintFill(screen, r, c, screen[r][c], ncolor);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 10;\r\n\t\tColor[][] screen = new Color[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tscreen[i][j] = Color.Black;\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\tfor (int i = 0; i < 100; i++) {\r\n\t\t\tscreen[randomInt(N)][randomInt(N)] = Color.Green;\r\n\t\t}\r\n\t\tPrintScreen(screen);\r\n\t\tPaintFill(screen, 2, 2, Color.White);\r\n\t\tSystem.out.println();\r\n\t\tPrintScreen(screen);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_11_Coins/Question.java",
    "content": "package Q8_11_Coins;\r\n\r\npublic class Question {\t\r\n\tpublic static int makeChangeHelper(int total, int[] denoms, int index) {\r\n\t\tint coin = denoms[index];\r\n\t\tif (index == denoms.length - 1) { // One denom left, either you can do it or not\r\n\t\t\tint remaining = total % coin; \r\n\t\t\treturn remaining == 0 ? 1 : 0;\r\n\t\t}\r\n\t\tint ways = 0;\r\n\t\t/* Try 1 coin, then 2 coins, 3 three, ... (recursing each time on rest). */\r\n\t\tfor (int amount = 0; amount <= total; amount += coin) { \r\n\t\t\tways += makeChangeHelper(total - amount, denoms, index + 1); // go to next denom\r\n\t\t}\r\n\t\treturn ways;\r\n\t}\r\n\t\r\n\tpublic static int makeChange(int amount, int[] denoms) {\r\n\t\treturn makeChangeHelper(amount, denoms, 0);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] denoms = {25, 10, 5, 1};\r\n\t\tint ways = makeChange(10, denoms);\r\n\t\tSystem.out.println(ways);\r\n\t}\r\n\r\n}"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_11_Coins/QuestionB.java",
    "content": "package Q8_11_Coins;\n\npublic class QuestionB {\n\n\tpublic static int makeChange(int n, int[] denoms) {\n\t\tint[][] map = new int[n + 1][denoms.length];\n\t\treturn makeChangeHelper(n, denoms, 0, map);\n\t}\n\t\n\tpublic static int makeChangeHelper(int total, int[] denoms, int index, int[][] map) {\n\t\t/* Check cache for prior result. */\n\t\tif (map[total][index] > 0) { // retrieve value\n\t\t\treturn map[total][index];\n\t\t}\n\t\t\n\t\tint coin = denoms[index];\n\t\tif (index == denoms.length - 1) {\n\t\t\tint remaining = total % coin; \n\t\t\treturn remaining == 0 ? 1 : 0;\n\t\t}\n\t\tint numberOfWays = 0;\n\t\t/* Try 1 coin, then 2 coins, 3 three, ... (recursing each time on rest). */\n\t\tfor (int amount = 0; amount <= total; amount += coin) { \n\t\t\tnumberOfWays += makeChangeHelper(total - amount, denoms, index + 1, map); // go to next denom\n\t\t}\n\t\t\n\t\t/* Update cache with current result. */\n\t\tmap[total][index] = numberOfWays;\n\t\t\n\t\treturn numberOfWays;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] denoms = {25, 10, 5, 1};\n\t\tint ways = makeChange(10, denoms);\n\t\tSystem.out.println(ways);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_11_Coins/Tester.java",
    "content": "package Q8_11_Coins;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 200; i++) {\n\t\t\tint[] denoms = {25, 10, 5, 1};\n\t\t\tint waysA = Question.makeChange(i, denoms);\n\t\t\tint waysB = QuestionB.makeChange(i, denoms);\n\t\t\tif (waysA != waysB) {\n\t\t\t\tSystem.out.println(\"Error: \" + i + \" : \" + waysA + \", \" + waysB);\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_12_Eight_Queens/Question.java",
    "content": "package Q8_12_Eight_Queens;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Question {\r\n\tpublic static int GRID_SIZE = 8;\r\n\t\r\n\t/* Check if (row1, column1) is a valid spot for a queen by checking if there\r\n\t * is a queen in the same column or diagonal. We don't need to check it for queens\r\n\t * in the same row because the calling placeQueen only attempts to place one queen at\r\n\t * a time. We know this row is empty. \r\n\t */\r\n\tpublic static boolean checkValid(Integer[] columns, int row1, int column1) {\r\n\t\tfor (int row2 = 0; row2 < row1; row2++) {\r\n\t\t\tint column2 = columns[row2];\r\n\t\t\t/* Check if (row2, column2) invalidates (row1, column1) as a queen spot. */\r\n\t\t\t\r\n\t\t\t/* Check if rows have a queen in the same column */\r\n\t\t\tif (column1 == column2) { \r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/* Check diagonals: if the distance between the columns equals the distance\r\n\t\t\t * between the rows, then they’re in the same diagonal. */\r\n\t\t\tint columnDistance = Math.abs(column2 - column1); \r\n\t\t\tint rowDistance = row1 - row2; // row1 > row2, so no need to use absolute value\r\n\t\t    if (columnDistance == rowDistance) {\r\n\t\t    \treturn false;\r\n\t\t    }\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void placeQueens(int row, Integer[] columns, ArrayList<Integer[]> results) {\r\n\t\tif (row == GRID_SIZE) { // Found valid placement\r\n\t\t\tresults.add(columns.clone()); \r\n\t\t} else {\r\n\t\t\tfor (int col = 0; col < GRID_SIZE; col++) {\t\t\t\r\n\t\t\t\tif (checkValid(columns, row, col)) {\r\n\t\t\t\t\tcolumns[row] = col;\t// Place queen\r\n\t\t\t\t\tplaceQueens(row + 1, columns, results);\t\r\n\t\t\t\t}\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void clear(Integer[] columns) {\r\n\t\tfor (int i = 0; i < GRID_SIZE; i++) {\r\n\t\t\tcolumns[i] = -1;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void printBoard(Integer[] columns) {\r\n        drawLine();\r\n        for(int i = 0; i < GRID_SIZE; i++){\r\n\t\t\tSystem.out.print(\"|\");\r\n\t\t\tfor (int j = 0; j < GRID_SIZE; j++){\r\n\t\t\t    if (columns[i] == j) {\r\n\t\t\t    \tSystem.out.print(\"Q|\");\r\n\t\t\t    } else {\r\n\t\t\t    \tSystem.out.print(\" |\");\r\n\t\t\t    }\r\n\t\t\t}\r\n            System.out.print(\"\\n\");\r\n            drawLine();\r\n\t\t}\r\n\t\tSystem.out.println(\"\");\r\n\t}\r\n\r\n    private static void drawLine() {\r\n        StringBuilder line = new StringBuilder();\r\n        for (int i=0;i<GRID_SIZE*2+1;i++)\r\n            line.append('-');\r\n        System.out.println(line.toString());\r\n    }\r\n\r\n\r\n\t\r\n\tpublic static void printBoards(ArrayList<Integer[]> boards) {\r\n\t\tfor (int i = 0; i < boards.size(); i++) {\r\n\t\t\tInteger[] board = boards.get(i);\r\n\t\t\tprintBoard(board);\r\n\t\t}\r\n\t}\r\n\t   \r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<Integer[]> results = new ArrayList<Integer[]>();\r\n\t\tInteger[] columns = new Integer[GRID_SIZE];\r\n\t\tclear(columns);\r\n\t\tplaceQueens(0, columns, results);\r\n\t\tprintBoards(results);\r\n\t\tSystem.out.println(results.size());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_13_Stack_of_Boxes/Box.java",
    "content": "package Q8_13_Stack_of_Boxes;\r\n\r\npublic class Box {\r\n\tpublic int width;\r\n\tpublic int height;\r\n\tpublic int depth;\r\n\tpublic Box(int w, int h, int d) {\r\n\t\twidth = w;\r\n\t\theight = h;\r\n\t\tdepth = d;\r\n\t}\r\n\t\r\n\tpublic boolean canBeUnder(Box b) {\r\n\t\tif (width > b.width && height > b.height && depth > b.depth) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic boolean canBeAbove(Box b) {\r\n\t\tif (b == null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif (width < b.width && height < b.height && depth < b.depth) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\t\t\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"Box(\" + width + \",\" + height + \",\" + depth + \")\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_13_Stack_of_Boxes/BoxComparator.java",
    "content": "package Q8_13_Stack_of_Boxes;\n\nimport java.util.Comparator;\n\npublic class BoxComparator implements Comparator<Box> {\n\t@Override\n\tpublic int compare(Box x, Box y){\n\t\treturn y.height - x.height;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_13_Stack_of_Boxes/QuestionA.java",
    "content": "package Q8_13_Stack_of_Boxes;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Collections;\r\n\r\npublic class QuestionA {\t\r\n\tpublic static int createStack(ArrayList<Box> boxes) {\r\n\t\tCollections.sort(boxes, new BoxComparator());\r\n\t\tint maxHeight = 0;\r\n\t\tfor (int i = 0; i < boxes.size(); i++) {\r\n\t\t\tint height = createStack(boxes, i);\r\n\t\t\tmaxHeight = Math.max(maxHeight, height);\r\n\t\t}\r\n\t\treturn maxHeight;\r\n\t}\r\n\t\r\n\tpublic static int createStack(ArrayList<Box> boxes, int bottomIndex) {\r\n\t\tBox bottom = boxes.get(bottomIndex);\r\n\t\tint maxHeight = 0;\r\n\t\tfor (int i = bottomIndex + 1; i < boxes.size(); i++) {\r\n\t\t\tif (boxes.get(i).canBeAbove(bottom)) {\r\n\t\t\t\tint height = createStack(boxes, i);\r\n\t\t\t\tmaxHeight = Math.max(height, maxHeight);\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\tmaxHeight += bottom.height;\r\n\t\treturn maxHeight;\r\n\t}\r\n\t\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tBox[] boxList = { new Box(6, 4, 4), new Box(8, 6, 2), new Box(5, 3, 3), new Box(7, 8, 3), new Box(4, 2, 2), new Box(9, 7, 3)};\r\n\t\tArrayList<Box> boxes = new ArrayList<Box>();\r\n\t\tfor (Box b : boxList) {\r\n\t\t\tboxes.add(b);\r\n\t\t}\r\n\t\t\r\n\t\tint height = createStack(boxes);\r\n\t\tSystem.out.println(height);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_13_Stack_of_Boxes/QuestionB.java",
    "content": "package Q8_13_Stack_of_Boxes;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Collections;\r\n\r\npublic class QuestionB {\t\r\n\tpublic static int createStack(ArrayList<Box> boxes) {\r\n\t\tCollections.sort(boxes, new BoxComparator());\r\n\t\tint maxHeight = 0;\r\n\t\tint[] stackMap = new int[boxes.size()];\r\n\t\tfor (int i = 0; i < boxes.size(); i++) {\r\n\t\t\tint height = createStack(boxes, i, stackMap);\r\n\t\t\tmaxHeight = Math.max(maxHeight, height);\r\n\t\t}\r\n\t\treturn maxHeight;\r\n\t}\r\n\t\r\n\tpublic static int createStack(ArrayList<Box> boxes, int bottomIndex, int[] stackMap) {\r\n\t\tif (bottomIndex < boxes.size() && stackMap[bottomIndex] > 0) {\r\n\t\t\treturn stackMap[bottomIndex];\r\n\t\t}\r\n\t\t\r\n\t\tBox bottom = boxes.get(bottomIndex);\r\n\t\tint maxHeight = 0;\r\n\t\tfor (int i = bottomIndex + 1; i < boxes.size(); i++) {\r\n\t\t\tif (boxes.get(i).canBeAbove(bottom)) {\r\n\t\t\t\tint height = createStack(boxes, i, stackMap);\r\n\t\t\t\tmaxHeight = Math.max(height, maxHeight);\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\tmaxHeight += bottom.height;\r\n\t\tstackMap[bottomIndex] = maxHeight;\r\n\t\treturn maxHeight;\r\n\t}\r\n\t\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tBox[] boxList = { new Box(6, 4, 4), new Box(8, 6, 2), new Box(5, 3, 3), new Box(7, 8, 3), new Box(4, 2, 2), new Box(9, 7, 3)};\r\n\t\tArrayList<Box> boxes = new ArrayList<Box>();\r\n\t\tfor (Box b : boxList) {\r\n\t\t\tboxes.add(b);\r\n\t\t}\r\n\t\t\r\n\t\tint height = createStack(boxes);\r\n\t\tSystem.out.println(height);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_13_Stack_of_Boxes/QuestionC.java",
    "content": "package Q8_13_Stack_of_Boxes;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Collections;\r\n\r\npublic class QuestionC {\t\r\n\tpublic static int createStack(ArrayList<Box> boxes) {\r\n\t\tCollections.sort(boxes, new BoxComparator());\r\n\t\tint[] stackMap = new int[boxes.size()];\r\n\t\treturn createStack(boxes, null, 0, stackMap);\r\n\t}\r\n\t\r\n\tpublic static int createStack(ArrayList<Box> boxes, Box bottom, int offset, int[] stackMap) {\r\n\t\tif (offset >= boxes.size()) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\t/* height with this bottom */\r\n\t\tBox newBottom = boxes.get(offset);\r\n\t\tint heightWithBottom = 0;\r\n\t\tif (bottom == null || newBottom.canBeAbove(bottom)) {\r\n\t\t\tif (stackMap[offset] == 0) {\r\n\t\t\t\tstackMap[offset] = createStack(boxes, newBottom, offset + 1, stackMap);\r\n\t\t\t\tstackMap[offset] += newBottom.height;\r\n\t\t\t}\r\n\t\t\theightWithBottom = stackMap[offset];\r\n\t\t}\r\n\t\t\r\n\t\t/* without this bottom */\r\n\t\tint heightWithoutBottom = createStack(boxes, bottom, offset + 1, stackMap);\r\n\t\t\r\n\t\treturn Math.max(heightWithBottom, heightWithoutBottom);\r\n\t}\r\n\t\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tBox[] boxList = { new Box(6, 4, 4), new Box(8, 6, 2), new Box(5, 3, 3), new Box(7, 8, 3), new Box(4, 2, 2), new Box(9, 7, 3)};\r\n\t\tArrayList<Box> boxes = new ArrayList<Box>();\r\n\t\tfor (Box b : boxList) {\r\n\t\t\tboxes.add(b);\r\n\t\t}\r\n\t\t\r\n\t\tint height = createStack(boxes);\r\n\t\tSystem.out.println(height);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_13_Stack_of_Boxes/Tester.java",
    "content": "package Q8_13_Stack_of_Boxes;\n\nimport java.util.ArrayList;\nimport java.util.Random;\n\npublic class Tester {\n\n\tpublic static Box createRandomBox() {\n\t\tRandom r = new Random();\n\t\treturn new Box(r.nextInt(100), r.nextInt(100), r.nextInt(100));\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tArrayList<Box> boxes1 = new ArrayList<Box>();\n\t\tArrayList<Box> boxes2 = new ArrayList<Box>();\n\t\tArrayList<Box> boxes3 = new ArrayList<Box>();\n\t\tfor (int i = 0; i < 200; i++) {\n\t\t\tBox b = createRandomBox();\n\t\t\tboxes1.add(b);\n\t\t\tboxes2.add(b);\n\t\t\tboxes3.add(b);\n\t\t}\n\t\t\n\t\tint height1 = QuestionA.createStack(boxes1);\n\t\tint height2 = QuestionB.createStack(boxes2);\n\t\tint height3 = QuestionB.createStack(boxes3);\n\t\tSystem.out.println(height1 + \", \" + height2 + \", \" + height3);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_14_Boolean_Evaluation/Others.java",
    "content": "package Q8_14_Boolean_Evaluation;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class Others {\r\n\tpublic enum Term {\r\n\t\tTrue,\r\n\t\tFalse,\r\n\t\tAnd,\r\n\t\tOr,\r\n\t\tXor,\r\n\t\tLeftParen,\r\n\t\tRightParen\r\n\t};\t\r\n\t\r\n\tpublic static String reduce(String expression, int start, int end) {\r\n\t\tif (start == end) {\r\n\t\t\tif (expression.charAt(start) == '1') {\r\n\t\t\t\treturn \"1\";\r\n\t\t\t} else if (expression.charAt(start) == '0') {\r\n\t\t\t\treturn \"0\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tint count = 0;\r\n\t\tint i = 0;\r\n\t\tString[] reduced = new String[3];\r\n\t\tint index = 0;\r\n\t\tint left = start;\r\n\t\tint right = start;\r\n\t\tfor (i = start; i <= end; i++) {\r\n\t\t\tif (expression.charAt(i) == '(') {\r\n\t\t\t\tif (count == 0) {\r\n\t\t\t\t\tleft = i + 1;\r\n\t\t\t\t}\r\n\t\t\t\tcount++;\r\n\t\t\t} else if (expression.charAt(i) == ')') {\r\n\t\t\t\tcount--;\r\n\t\t\t\tif (count == 0) {\r\n\t\t\t\t\tright = i - 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (count == 0) {\r\n\t\t\t\treduced[index] = reduce(expression, left, right);\r\n\t\t\t\tif (index == 0) {\r\n\t\t\t\t\treduced[index + 1] = Character.toString(expression.charAt(i + 1));\r\n\t\t\t\t\ti += 1;\r\n\t\t\t\t\tleft = i + 1;\r\n\t\t\t\t\tright = i + 1;\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\tindex += 2;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (reduced[1].equals(\"&\")) {\r\n\t\t\tif (reduced[0].equals(\"1\") && reduced[2].equals(\"1\")) {\r\n\t\t\t\treturn \"1\";\r\n\t\t\t}\r\n\t\t\treturn \"0\";\r\n\t\t} else if (reduced[1].equals(\"|\")) {\r\n\t\t\tif (reduced[0].equals(\"1\") || reduced[2].equals(\"1\")) {\r\n\t\t\t\treturn \"1\";\r\n\t\t\t}\r\n\t\t\treturn \"0\";\r\n\t\t} else if (reduced[1].equals(\"^\")) {\r\n\t\t\tif (reduced[0].equals(\"1\") && reduced[2].equals(\"0\")) {\r\n\t\t\t\treturn \"1\";\r\n\t\t\t} else if (reduced[0].equals(\"0\") && reduced[2].equals(\"1\")) {\r\n\t\t\t\treturn \"1\";\r\n\t\t\t}\r\n\t\t\treturn \"0\";\r\n\t\t}\r\n\t\treturn \"0\";\r\n\t}\t\r\n\t\r\n\tpublic static boolean evaluate(String expression, int start, int end) {\r\n\t\tString result = reduce(expression, start, end);\r\n\t\tif (result == \"0\") {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static boolean isOperator(char c) {\r\n\t\tswitch (c) {\r\n\t\tcase '&':\r\n\t\tcase '|':\r\n\t\tcase '^':\r\n\t\t\treturn true;\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static String insertParensAround(String expression, int ind) {\r\n\t\tint left = 0;\r\n\t\tint right = 0;\r\n\t\tint index = 0;\r\n\t\tint count = 0;\r\n\t\tfor (int i = 0; i < expression.length(); i++) {\r\n\t\t\tif (isOperator(expression.charAt(i))) {\r\n\t\t\t\tif (count == ind) {\r\n\t\t\t\t\tindex = i;\r\n\t\t\t\t}\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tcount = 0;\r\n\t\tfor (int i = index - 1; i >= 0; i--) {\r\n\t\t\tif (expression.charAt(i) == ')') {\r\n\t\t\t\tcount++;\r\n\t\t\t} else if (expression.charAt(i) == '(') {\r\n\t\t\t\tcount--;\r\n\t\t\t}\r\n\t\t\tif (count == 0) {\r\n\t\t\t\tleft = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tcount = 0;\r\n\t\tfor (int i = index + 1; i <= expression.length(); i++) {\r\n\t\t\tif (expression.charAt(i) == '(') {\r\n\t\t\t\tcount++;\r\n\t\t\t} else if (expression.charAt(i) == ')') {\r\n\t\t\t\tcount--;\r\n\t\t\t}\r\n\t\t\tif (count == 0) {\r\n\t\t\t\tright = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (left == 0 && right == expression.length() - 1) {\r\n\t\t\treturn expression;\r\n\t\t}\r\n\t\tString newexpression = expression.substring(0, left) + '(' + expression.substring(left, right + 1) + ')' + expression.substring(right + 1);\r\n\t\treturn newexpression;\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic static int bruteForce(String expression, HashMap<String, Boolean> completed, boolean result, boolean[] flags) {\r\n\t\tint count = 0;\r\n\t\tboolean isDone = true;\r\n\t\tif (completed.containsKey(expression)) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < flags.length; i++) {\r\n\t\t\tif (!flags[i]) {\r\n\t\t\t\tflags[i] = true;\r\n\t\t\t\tString newexpression = insertParensAround(expression, i);\r\n\t\t\t\tisDone = false;\r\n\t\t\t\tcount += bruteForce(newexpression, completed, result, flags);\r\n\t\t\t\tflags[i] = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isDone) {\r\n\t\t\tif (evaluate(expression, 0, expression.length() - 1) == result) {\r\n\t\t\t\t//System.out.println(expression + \" = \" + result);\r\n\t\t\t\treturn 1;\r\n\t\t\t} else {\r\n\t\t\t\t//System.out.println(expression + \" = \" + !result);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\tcompleted.put(expression, true);\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int countR(String exp, boolean result, int start, int end) {\r\n\t\tif (start == end) {\r\n\t\t\tif (exp.charAt(start) == '1' && result) {\r\n\t\t\t\treturn 1;\r\n\t\t\t} else if (exp.charAt(start) == '0' && !result) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tint c = 0;\r\n\t\tif (result) {\r\n\t\t\tfor (int i = start + 1; i <= end; i += 2) {\r\n\t\t\t\tchar op = exp.charAt(i);\r\n\t\t\t\tif (op == '&') {\r\n\t\t\t\t\tc += countR(exp, true, start, i - 1) * countR(exp, true, i + 1, end); \r\n\t\t\t\t} else if (op == '|') {\r\n\t\t\t\t\tc += countR(exp, true, start, i - 1) * countR(exp, false, i + 1, end);\r\n\t\t\t\t\tc += countR(exp, false, start, i - 1) * countR(exp, true, i + 1, end);\r\n\t\t\t\t\tc += countR(exp, true, start, i - 1) * countR(exp, true, i + 1, end);\r\n\t\t\t\t} else if (op == '^') {\r\n\t\t\t\t\tc += countR(exp, true, start, i - 1) * countR(exp, false, i + 1, end);\r\n\t\t\t\t\tc += countR(exp, false, start, i - 1) * countR(exp, true, i + 1, end);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (int i = start + 1; i <= end; i += 2) {\r\n\t\t\t\tchar op = exp.charAt(i);\r\n\t\t\t\tif (op == '&') {\r\n\t\t\t\t\tc += countR(exp, false, start, i - 1) * countR(exp, true, i + 1, end);\r\n\t\t\t\t\tc += countR(exp, true, start, i - 1) * countR(exp, false, i + 1, end); \r\n\t\t\t\t\tc += countR(exp, false, start, i - 1) * countR(exp, false, i + 1, end);\r\n\t\t\t\t} else if (op == '|') {\r\n\t\t\t\t\tc += countR(exp, false, start, i - 1) * countR(exp, false, i + 1, end);\r\n\t\t\t\t} else if (op == '^') {\r\n\t\t\t\t\tc += countR(exp, true, start, i - 1) * countR(exp, true, i + 1, end);\r\n\t\t\t\t\tc += countR(exp, false, start, i - 1) * countR(exp, false, i + 1, end);\r\n\t\t\t\t}\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\treturn c;\r\n\t}\t\r\n\t\r\n\tpublic static int countDP(String exp, boolean result, int start, int end, HashMap<String, Integer> cache) {\r\n\t\tString key = \"\" + result + start + end;\r\n\t\tif (cache.containsKey(key)) {\r\n\t\t\treturn cache.get(key);\r\n\t\t}\r\n\t\tif (start == end) {\r\n\t\t\tif (exp.charAt(start) == '1' && result == true) {\r\n\t\t\t\treturn 1;\r\n\t\t\t} else if (exp.charAt(start) == '0' && result == false) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tint count = 0;\r\n\t\tif (result) {\r\n\t\t\tfor (int i = start + 1; i <= end; i += 2) {\r\n\t\t\t\tchar op = exp.charAt(i);\r\n\t\t\t\tif (op == '&') {\r\n\t\t\t\t\tcount += countDP(exp, true, start, i - 1, cache) * countDP(exp, true, i + 1, end, cache); \r\n\t\t\t\t} else if (op == '|') {\r\n\t\t\t\t\tcount += countDP(exp, true, start, i - 1, cache) * countDP(exp, false, i + 1, end, cache);\r\n\t\t\t\t\tcount += countDP(exp, false, start, i - 1, cache) * countDP(exp, true, i + 1, end, cache);\r\n\t\t\t\t\tcount += countDP(exp, true, start, i - 1, cache) * countDP(exp, true, i + 1, end, cache);\r\n\t\t\t\t} else if (op == '^') {\r\n\t\t\t\t\tcount += countDP(exp, true, start, i - 1, cache) * countDP(exp, false, i + 1, end, cache);\r\n\t\t\t\t\tcount += countDP(exp, false, start, i - 1, cache) * countDP(exp, true, i + 1, end, cache);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (int i = start + 1; i <= end; i += 2) {\r\n\t\t\t\tchar op = exp.charAt(i);\r\n\t\t\t\tif (op == '&') {\r\n\t\t\t\t\tcount += countDP(exp, false, start, i - 1, cache) * countDP(exp, true, i + 1, end, cache);\r\n\t\t\t\t\tcount += countDP(exp, true, start, i - 1, cache) * countDP(exp, false, i + 1, end, cache); \r\n\t\t\t\t\tcount += countDP(exp, false, start, i - 1, cache) * countDP(exp, false, i + 1, end, cache);\r\n\t\t\t\t} else if (op == '|') {\r\n\t\t\t\t\tcount += countDP(exp, false, start, i - 1, cache) * countDP(exp, false, i + 1, end, cache);\r\n\t\t\t\t} else if (op == '^') {\r\n\t\t\t\t\tcount += countDP(exp, true, start, i - 1, cache) * countDP(exp, true, i + 1, end, cache);\r\n\t\t\t\t\tcount += countDP(exp, false, start, i - 1, cache) * countDP(exp, false, i + 1, end, cache);\r\n\t\t\t\t}\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\tcache.put(key, count);\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int total(int n) {\r\n\t\t// Function to return (2n) ! / ((n+1)! * n!)\r\n\t\t\r\n\t\t// To keep the numbers small, we divide by i when possible to do evenly. If not,\r\n\t\t// we store up the remainder and divide when possible.\r\n\t\tlong num = 1;\r\n\t\tlong rem = 1;\r\n\t\tfor (int i = 2; i <= n; i++) {\r\n\t\t\tnum *= (n + i);\r\n\t\t\trem *= i;\r\n\t\t\tif (num % rem == 0) { \r\n\t\t\t\tnum /= rem;\r\n\t\t\t\trem = 1;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\treturn (int)num;\r\n\t}\r\n\t\r\n\tpublic static int countDPEff(String exp, boolean result, int start, int end, HashMap<String, Integer> cache) {\r\n\t\tString key = \"\" + start + end;\r\n\t\tint count = 0;\r\n\t\tif (!cache.containsKey(key)) {\r\n\t\t\tif (start == end) {\r\n\t\t\t\tif (exp.charAt(start) == '1') {\r\n\t\t\t\t\tcount = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcount = 0;\r\n\t\t\t\t}\r\n\t\t\t}\t\r\n\t\t\t\r\n\t\t\tfor (int i = start + 1; i <= end; i += 2) {\r\n\t\t\t\tchar op = exp.charAt(i);\r\n\t\t\t\tif (op == '&') {\r\n\t\t\t\t\tcount += countDPEff(exp, true, start, i - 1, cache) * countDPEff(exp, true, i + 1, end, cache); \r\n\t\t\t\t} else if (op == '|') {\r\n\t\t\t\t\tint left_ops = (i - 1 - start) / 2; // parens on left\r\n\t\t\t\t\tint right_ops = (end - i - 1) / 2;  // parens on right\r\n\t\t\t\t\tint total_ways = total(left_ops) * total(right_ops);\r\n\t\t\t\t\tint total_false = countDPEff(exp, false, start, i - 1, cache) * countDPEff(exp, false, i + 1, end, cache);\r\n\t\t\t\t\tcount += total_ways - total_false;\r\n\t\t\t\t} else if (op == '^') {\r\n\t\t\t\t\tcount += countDPEff(exp, true, start, i - 1, cache) * countDPEff(exp, false, i + 1, end, cache);\r\n\t\t\t\t\tcount += countDPEff(exp, false, start, i - 1, cache) * countDPEff(exp, true, i + 1, end, cache);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcache.put(key, count);\r\n\t\t} else {\r\n\t\t\tcount = cache.get(key);\r\n\t\t}\r\n\t\tif (result) {\r\n\t\t\treturn count;\r\n\t\t} else {\r\n\t\t\tint num_ops = (end - start) / 2;\r\n\t\t\treturn total(num_ops) - count;\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString terms = \"0^0|1&1^1|0|1\";\r\n\t\tboolean result = true;\r\n\t\t\r\n\t\tbruteForce(terms, new HashMap<String, Boolean>(), result, new boolean[(terms.length() - 1) / 2]);\r\n\t\tSystem.out.println(countR(terms, result, 0, terms.length() - 1));\r\n\t\tSystem.out.println(countDP(terms, result, 0, terms.length() - 1, new HashMap<String, Integer>()));\r\n\t\tSystem.out.println(countDPEff(terms, result, 0, terms.length() - 1, new HashMap<String, Integer>()));\r\n\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_14_Boolean_Evaluation/QuestionA.java",
    "content": "package Q8_14_Boolean_Evaluation;\r\n\r\npublic class QuestionA {\r\n\tpublic static int count = 0;\r\n\tpublic static boolean stringToBool(String c) {\r\n\t\treturn c.equals(\"1\") ? true : false;\r\n\t}\r\n\t\r\n\tpublic static int countEval(String s, boolean result) {\r\n\t\tcount++;\r\n\t\tif (s.length() == 0) return 0;\r\n\t\tif (s.length() == 1) return stringToBool(s) == result ? 1 : 0;\r\n\r\n\t\tint ways = 0;\r\n\t\t\r\n\t\tfor (int i = 1; i < s.length(); i += 2) {\r\n\t\t\tchar c = s.charAt(i);\r\n\t\t\tString left = s.substring(0, i);\r\n\t\t\tString right = s.substring(i + 1, s.length());\r\n\t\t\tint leftTrue = countEval(left, true);\r\n\t\t\tint leftFalse = countEval(left, false);\r\n\t\t\tint rightTrue = countEval(right, true);\r\n\t\t\tint rightFalse = countEval(right, false);\r\n\t\t\tint total = (leftTrue + leftFalse) * (rightTrue + rightFalse);\r\n\t\t\t\r\n\t\t\tint totalTrue = 0;\r\n\t\t\tif (c == '^') { // required: one true and one false\r\n\t\t\t\ttotalTrue = leftTrue * rightFalse + leftFalse * rightTrue;\r\n\t\t\t} else if (c == '&') { // required: both true\r\n\t\t\t\ttotalTrue = leftTrue * rightTrue;\r\n\t\t\t} else if (c == '|') { // required: anything but both false\r\n\t\t\t\ttotalTrue = leftTrue * rightTrue + leftFalse * rightTrue + leftTrue * rightFalse;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint subWays = result ? totalTrue : total - totalTrue;\r\n\t\t\tways += subWays;\r\n\t\t}\r\n\t\t\r\n\t\treturn ways;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString expression = \"0^0|1&1^1|0|1\";\r\n\t\tboolean result = true;\r\n\t\t\r\n\t\tSystem.out.println(countEval(expression, result));\r\n\t\tSystem.out.println(count);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_14_Boolean_Evaluation/QuestionB.java",
    "content": "package Q8_14_Boolean_Evaluation;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static int count = 0;\r\n\tpublic static boolean stringToBool(String c) {\r\n\t\treturn c.equals(\"1\") ? true : false;\r\n\t}\r\n\t\r\n\tpublic static int countEval(String s, boolean result, HashMap<String, Integer> memo) {\r\n\t\tcount++;\r\n\t\tif (s.length() == 0) return 0;\r\n\t\tif (s.length() == 1) return stringToBool(s) == result ? 1 : 0;\r\n\t\tif (memo.containsKey(result + s)) return memo.get(result + s);\r\n\r\n\t\tint ways = 0;\r\n\t\t\r\n\t\tfor (int i = 1; i < s.length(); i += 2) {\r\n\t\t\tchar c = s.charAt(i);\r\n\t\t\tString left = s.substring(0, i);\r\n\t\t\tString right = s.substring(i + 1, s.length());\r\n\t\t\tint leftTrue = countEval(left, true, memo);\r\n\t\t\tint leftFalse = countEval(left, false, memo);\r\n\t\t\tint rightTrue = countEval(right, true, memo);\r\n\t\t\tint rightFalse = countEval(right, false, memo);\r\n\t\t\tint total = (leftTrue + leftFalse) * (rightTrue + rightFalse);\r\n\t\t\t\r\n\t\t\tint totalTrue = 0;\r\n\t\t\tif (c == '^') {\r\n\t\t\t\ttotalTrue = leftTrue * rightFalse + leftFalse * rightTrue;\r\n\t\t\t} else if (c == '&') {\r\n\t\t\t\ttotalTrue = leftTrue * rightTrue;\r\n\t\t\t} else if (c == '|') {\r\n\t\t\t\ttotalTrue = leftTrue * rightTrue + leftFalse * rightTrue + leftTrue * rightFalse;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint subWays = result ? totalTrue : total - totalTrue;\r\n\t\t\tways += subWays;\r\n\t\t}\r\n\t\t\r\n\t\tmemo.put(result + s, ways);\r\n\t\treturn ways;\r\n\t}\r\n\t\r\n\tpublic static int countEval(String s, boolean result) {\r\n\t\treturn countEval(s, result, new HashMap<String, Integer>());\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString expression = \"0^0|1&1^1|0|1\";\r\n\t\tboolean result = true;\r\n\t\t\r\n\t\tSystem.out.println(countEval(expression, result));\r\n\t\tSystem.out.println(count);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_14_Boolean_Evaluation/QuestionC.java",
    "content": "package Q8_14_Boolean_Evaluation;\r\n\r\npublic class QuestionC {\r\n\tpublic static int count = 0;\r\n\tpublic static boolean stringToBool(String c) {\r\n\t\treturn c.equals(\"1\") ? true : false;\r\n\t}\r\n\t\r\n\tpublic static int countEval(String s, boolean result) {\r\n\t\tcount++;\r\n\t\tif (s.length() == 0) return 0;\r\n\t\tif (s.length() == 1) return stringToBool(s) == result ? 1 : 0;\r\n\r\n\t\tint ways = 0;\r\n\t\t\r\n\t\tfor (int i = 1; i < s.length(); i += 2) {\r\n\t\t\tchar c = s.charAt(i);\r\n\t\t\tString left = s.substring(0, i);\r\n\t\t\tString right = s.substring(i + 1, s.length());\r\n\t\t\t\r\n\t\t\tint subWays = 0;\r\n\t\t\tif (c == '^') { // required: one true and one false\r\n\t\t\t\tif (result) {\r\n\t\t\t\t\tint leftTrue = countEval(left, true);\r\n\t\t\t\t\tint leftFalse = countEval(left, false);\r\n\t\t\t\t\tint rightTrue = countEval(right, true);\r\n\t\t\t\t\tint rightFalse = countEval(right, false);\r\n\t\t\t\t\tsubWays = leftTrue * rightFalse + leftFalse * rightTrue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tint leftTrue = countEval(left, true);\r\n\t\t\t\t\tint leftFalse = countEval(left, false);\r\n\t\t\t\t\tint rightTrue = countEval(right, true);\r\n\t\t\t\t\tint rightFalse = countEval(right, false);\r\n\t\t\t\t\tsubWays = leftTrue * rightTrue + leftFalse * rightFalse;\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t} else if (c == '&') { // required: both true\r\n\t\t\t\tif (result) {\r\n\t\t\t\t\tint leftTrue = countEval(left, true);\r\n\t\t\t\t\tint rightTrue = countEval(right, true);\r\n\t\t\t\t\tsubWays = leftTrue * rightTrue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tint leftTrue = countEval(left, true);\r\n\t\t\t\t\tint leftFalse = countEval(left, false);\r\n\t\t\t\t\tint rightTrue = countEval(right, true);\r\n\t\t\t\t\tint rightFalse = countEval(right, false);\r\n\t\t\t\t\tsubWays = leftTrue * rightFalse + leftFalse * rightTrue + leftFalse * rightFalse;\t\t\t\t\r\n\t\t\t\t}\t\t\t\t\r\n\t\t\t} else if (c == '|') { // required: anything but both false\r\n\t\t\t\tif (result) {\r\n\t\t\t\t\tint leftTrue = countEval(left, true);\r\n\t\t\t\t\tint leftFalse = countEval(left, false);\r\n\t\t\t\t\tint rightTrue = countEval(right, true);\r\n\t\t\t\t\tint rightFalse = countEval(right, false);\r\n\t\t\t\t\tsubWays = leftTrue * rightFalse + leftFalse * rightTrue + leftTrue * rightTrue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tint leftFalse = countEval(left, false);\r\n\t\t\t\t\tint rightFalse = countEval(right, false);\r\n\t\t\t\t\tsubWays = leftFalse * rightFalse;\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tways += subWays;\r\n\t\t}\r\n\t\t\r\n\t\treturn ways;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\t\t\r\n\t\tString expression = \"0&0&0&1^1|0\";\r\n\t\tboolean result = true;\r\n\t\t\r\n\t\tSystem.out.println(countEval(expression, result));\r\n\t\tSystem.out.println(count);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 08. Recursion and Dynamic Programming/Q8_14_Boolean_Evaluation/Tester.java",
    "content": "package Q8_14_Boolean_Evaluation;\n\nimport java.util.HashMap;\nimport java.util.Map.Entry;\nimport java.util.Random;\n\npublic class Tester {\n\t\n\tpublic static boolean allEqual(HashMap<String, Integer> map) {\n\t\tint val = 0;\n\t\tfor (Entry<String, Integer> e : map.entrySet()) {\n\t\t\tif (val != 0 && val != e.getValue()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tval = e.getValue();\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static char getRandomOperator() {\n\t\tRandom rand = new Random();\n\t\tint r = rand.nextInt(3);\n\t\tchar[] ops = {'^', '&', '|'};\n\t\treturn ops[r];\n\t}\n\t\n\tpublic static String getRandomExpression() {\n\t\tRandom rand = new Random();\n\t\tint len = rand.nextInt(10) * 2 + 1;\n\t\tString s = \"\";\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tchar next = '1';\n\t\t\tif (i % 2 == 0) {\n\t\t\t\tnext = rand.nextBoolean() ? '1' : '0';\n\t\t\t} else {\n\t\t\t\tnext = getRandomOperator();\n\t\t\t}\n\t\t\ts += next;\n\t\t}\n\t\treturn s;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 50; i++) {\n\t\t\t//String terms = \"0^0|1&1^1|0|1\";\n\t\t\tString terms = getRandomExpression();\n\t\t\tboolean result = true;\n\t\t\t\n\t\t\tint oBF = Others.bruteForce(terms, new HashMap<String, Boolean>(), result, new boolean[(terms.length() - 1) / 2]);\n\t\t\tint oR = Others.countR(terms, result, 0, terms.length() - 1);\n\t\t\tint oDP = Others.countDP(terms, result, 0, terms.length() - 1, new HashMap<String, Integer>());\n\t\t\tint oDPEFF = Others.countDPEff(terms, result, 0, terms.length() - 1, new HashMap<String, Integer>());\n\t\t\t\n\t\t\tint a = QuestionA.countEval(terms, result);\n\t\t\tint b = QuestionB.countEval(terms, result);\n\t\t\t\n\t\t\tHashMap<String, Integer> results = new HashMap<String, Integer>();\n\t\t\tresults.put(\"oBF\", oBF);\n\t\t\tresults.put(\"oR\", oR);\n\t\t\tresults.put(\"oDP\", oDP);\n\t\t\tresults.put(\"oDPEFF\", oDPEFF);\n\t\t\tresults.put(\"a\", a);\n\t\t\tresults.put(\"b\", b);\n\t\t\t\n\t\t\tif (allEqual(results)) {\n\t\t\t\tSystem.out.println(\"Success: \" + terms + \"->\" + b);\n\t\t\t\tSystem.out.println(results.toString());\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"Failure: \" + terms);\n\t\t\t\tSystem.out.println(results.toString());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/BFSData.java",
    "content": "package Q9_02_Social_Network;\n\nimport java.util.HashMap;\nimport java.util.LinkedList;\nimport java.util.Queue;\n\npublic class BFSData {\n\tpublic Queue<PathNode> toVisit = new LinkedList<PathNode>();\n\tpublic HashMap<Integer, PathNode> visited = new HashMap<Integer, PathNode>();\n\n\tpublic BFSData(Person root) {\n\t\tPathNode sourcePath = new PathNode(root, null);\n\t\ttoVisit.add(sourcePath);\n\t\tvisited.put(root.getID(), sourcePath);\t\n\t}\n\t\n\tpublic boolean isFinished() {\n\t\treturn toVisit.isEmpty();\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/Machine.java",
    "content": "package Q9_02_Social_Network;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class Machine {\r\n\tpublic HashMap<Integer, Person> persons = new HashMap<Integer, Person>();\r\n\tpublic int machineID;\r\n\t\r\n\tpublic Person getPersonWithID(int personID) {\r\n\t\treturn persons.get(personID);\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/PathNode.java",
    "content": "package Q9_02_Social_Network;\n\nimport java.util.LinkedList;\n\npublic class PathNode {\n\tprivate Person person = null;\n\tprivate PathNode previousNode = null;\n\tpublic PathNode(Person p, PathNode previous) {\n\t\tperson = p;\n\t\tpreviousNode = previous;\n\t}\n\t\n\tpublic Person getPerson() {\n\t\treturn person;\n\t}\n\t\n\tpublic LinkedList<Person> collapse(boolean startsWithRoot) {\n\t\tLinkedList<Person> path = new LinkedList<Person>();\n\t\tPathNode node = this;\n\t\twhile (node != null) {\n\t\t\tif (startsWithRoot) {\n\t\t\t\tpath.addLast(node.person);\n\t\t\t} else {\n\t\t\t\tpath.addFirst(node.person);\n\t\t\t}\n\t\t\tnode = node.previousNode;\n\t\t}\n\t\treturn path;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/Person.java",
    "content": "package Q9_02_Social_Network;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Person {\r\n\tprivate ArrayList<Integer> friends = new ArrayList<Integer>();\r\n\tprivate int personID;\r\n\tprivate String info;\r\n\t\r\n\tpublic String getInfo() { return info; }\r\n\tpublic void setInfo(String info) {\r\n\t\tthis.info = info;\r\n\t}\r\n\r\n\tpublic ArrayList<Integer> getFriends() {\r\n\t\treturn friends;\r\n\t}\r\n\t\r\n\tpublic int getID() { return personID; }\r\n\tpublic void addFriend(int id) { friends.add(id); }\r\n\t\r\n\tpublic Person(int id) {\r\n\t\tthis.personID = id;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/QuestionA.java",
    "content": "package Q9_02_Social_Network;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.Queue;\n\npublic class QuestionA {\n\tpublic static LinkedList<Person> findPathBFS(HashMap<Integer, Person> people, int source, int destination) {\n\t\tQueue<PathNode> toVisit = new LinkedList<PathNode>();\n\t\tHashSet<Integer> visited = new HashSet<Integer>();\n\t\ttoVisit.add(new PathNode(people.get(source), null));\n\t\tvisited.add(source);\n\t\twhile (!toVisit.isEmpty()) {\n\t\t\tPathNode node = toVisit.poll();\n\t\t\tPerson person = node.getPerson();\n\t\t\tif (person.getID() == destination) {\n\t\t\t\treturn node.collapse(false);\n\t\t\t}\n\t\t\t\n\t\t\t/* Search friends. */\n\t\t\tArrayList<Integer> friends = person.getFriends();\n\t\t\tfor (int friendId : friends) {\n\t\t\t\tif (!visited.contains(friendId)) {\n\t\t\t\t\tvisited.add(friendId);\n\t\t\t\t\tPerson friend = people.get(friendId);\n\t\t\t\t\ttoVisit.add(new PathNode(friend, node));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint nPeople = 11;\n\t\tHashMap<Integer, Person> people = new HashMap<Integer, Person>();\n\t\tfor (int i = 0; i < nPeople; i++) {\n\t\t\tPerson p = new Person(i);\n\t\t\tpeople.put(i, p);\n\t\t}\n\t\t\n\t\tint[][] edges = {{1, 4}, {1, 2}, {1, 3}, {3, 2}, {4, 6}, {3, 7}, {6, 9}, {9, 10}, {5, 10}, {2, 5}, {3, 7}};\n\t\t\n\t\tfor (int[] edge : edges) {\n\t\t\tPerson source = people.get(edge[0]);\n\t\t\tsource.addFriend(edge[1]);\n\t\t\t\n\t\t\tPerson destination = people.get(edge[1]);\n\t\t\tdestination.addFriend(edge[0]);\n\t\t}\n\t\t\n\t\tint i = 1;\n\t\tint j = 10;\n\t\tLinkedList<Person> path1 = findPathBFS(people, i, j);\n\t\tTester.printPeople(path1);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/QuestionB.java",
    "content": "package Q9_02_Social_Network;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.Queue;\n\npublic class QuestionB {\n\n\tpublic static LinkedList<Person> mergePaths(BFSData bfs1, BFSData bfs2, int connection) {\n\t\tPathNode end1 = bfs1.visited.get(connection); // end1 -> source\n\t\tPathNode end2 = bfs2.visited.get(connection); // end2 -> dest\n\t\tLinkedList<Person> pathOne = end1.collapse(false); // forward: source -> connection\n\t\tLinkedList<Person> pathTwo = end2.collapse(true); // reverse: connection -> dest\n\t\tpathTwo.removeFirst(); // remove connection\n\t\tpathOne.addAll(pathTwo); // add second path\n\t\treturn pathOne;\n\t}\n\t\n\t/* Search one level and return collision, if any. */\n\tpublic static Person searchLevel(HashMap<Integer, Person> people, BFSData primary, BFSData secondary) {\n\t\t/* We only want to search one level at a time. Count how many nodes are currently in the primary's\n\t\t * level and only do that many nodes. We'll continue to add nodes to the end. */\n\t\tint count = primary.toVisit.size(); \n\t\tfor (int i = 0; i < count; i++) {\n\t\t\t/* Pull out first node. */\n\t\t\tPathNode pathNode = primary.toVisit.poll();\n\t\t\tint personId = pathNode.getPerson().getID();\n\t\t\t\n\t\t\t/* Check if it's already been visited. */\n\t\t\tif (secondary.visited.containsKey(personId)) {\n\t\t\t\treturn pathNode.getPerson();\n\t\t\t}\t\t\t\t\n\t\t\t\n\t\t\t/* Add friends to queue. */\n\t\t\tPerson person = pathNode.getPerson();\n\t\t\tArrayList<Integer> friends = person.getFriends();\n\t\t\tfor (int friendId : friends) {\n\t\t\t\tif (!primary.visited.containsKey(friendId)) {\n\t\t\t\t\tPerson friend = people.get(friendId);\n\t\t\t\t\tPathNode next = new PathNode(friend, pathNode);\n\t\t\t\t\tprimary.visited.put(friendId, next);\n\t\t\t\t\tprimary.toVisit.add(next);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static LinkedList<Person> findPathBiBFS(HashMap<Integer, Person> people, int source, int destination) {\n\t\tBFSData sourceData = new BFSData(people.get(source));\n\t\tBFSData destData = new BFSData(people.get(destination));\n\t\t\n\t\twhile (!sourceData.isFinished() && !destData.isFinished()) {\n\t\t\t/* Search out from source. */\n\t\t\tPerson collision = searchLevel(people, sourceData, destData);\n\t\t\tif (collision != null) {\n\t\t\t\treturn mergePaths(sourceData, destData, collision.getID());\n\t\t\t}\n\t\t\t\n\t\t\t/* Search out from destination. */\n\t\t\tcollision = searchLevel(people, destData, sourceData);\n\t\t\tif (collision != null) {\n\t\t\t\treturn mergePaths(sourceData, destData, collision.getID());\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint nPeople = 11;\n\t\tHashMap<Integer, Person> people = new HashMap<Integer, Person>();\n\t\tfor (int i = 0; i < nPeople; i++) {\n\t\t\tPerson p = new Person(i);\n\t\t\tpeople.put(i, p);\n\t\t}\n\t\t\n\t\tint[][] edges = {{1, 4}, {1, 2}, {1, 3}, {3, 2}, {4, 6}, {3, 7}, {6, 9}, {9, 10}, {5, 10}, {2, 5}, {3, 7}};\n\t\t\n\t\tfor (int[] edge : edges) {\n\t\t\tPerson source = people.get(edge[0]);\n\t\t\tsource.addFriend(edge[1]);\n\t\t\t\n\t\t\tPerson destination = people.get(edge[1]);\n\t\t\tdestination.addFriend(edge[0]);\n\t\t}\n\t\t\n\t\tint i = 1;\n\t\tint j = 10;\n\t\tLinkedList<Person> path1 = findPathBiBFS(people, i, j);\n\t\tTester.printPeople(path1);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/Server.java",
    "content": "package Q9_02_Social_Network;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class Server {\r\n\tHashMap<Integer, Machine> machines = new HashMap<Integer, Machine>();\r\n\tHashMap<Integer, Integer> personToMachineMap = new HashMap<Integer, Integer>();\r\n\t\r\n\tpublic Machine getMachineWithId(int machineID) {\r\n\t\treturn machines.get(machineID);\r\n\t}\r\n\t\r\n\tpublic int getMachineIDForUser(int personID) {\r\n\t\tInteger machineID = personToMachineMap.get(personID);\r\n\t\treturn machineID == null ? -1 : machineID;\r\n\t}\r\n\t\r\n\tpublic Person getPersonWithID(int personID) {\r\n\t\tInteger machineID = personToMachineMap.get(personID);\r\n\t\tif (machineID == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tMachine machine = getMachineWithId(machineID);\r\n\t\tif (machine == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn machine.getPersonWithID(personID);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_02_Social_Network/Tester.java",
    "content": "package Q9_02_Social_Network;\n\nimport java.util.HashMap;\nimport java.util.LinkedList;\n\npublic class Tester {\n\n\tpublic static void printPeople(LinkedList<Person> path) {\n\t\tif (path == null) {\n\t\t\tSystem.out.println(\"No path\");\n\t\t} else {\n\t\t\tfor (Person p : path) {\n\t\t\t\tSystem.out.println(p.getID());\n\t\t\t}\n\t\t}\t\t\n\t}\n\t\n\tpublic static boolean isEqual(LinkedList<Person> path1, LinkedList<Person> path2, boolean reverse) {\n\t\tif (path1 == null || path2 == null) {\n\t\t\treturn path1 == null && path2 == null;\n\t\t}\n\t\tif (path1.size() != path2.size()) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < path1.size(); i++) {\n\t\t\tint other = reverse ? path2.size() - i - 1 : i;\n\t\t\tif (path1.get(i) != path2.get(other)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean isEquivalent(LinkedList<Person> path1, LinkedList<Person> path2) {\n\t\tboolean f1 = isEqual(path1, path2, false);\n\t\tboolean f2 = isEqual(path1, path2, true);\n\t\treturn f1 || f2;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint nPeople = 11;\n\t\tHashMap<Integer, Person> people = new HashMap<Integer, Person>();\n\t\tfor (int i = 0; i < nPeople; i++) {\n\t\t\tPerson p = new Person(i);\n\t\t\tpeople.put(i, p);\n\t\t}\n\t\t\n\t\tint[][] edges = {{1, 4}, {1, 2}, {1, 3}, {3, 2}, {4, 6}, {3, 7}, {6, 9}, {9, 10}, {5, 10}, {2, 5}, {3, 7}};\n\t\t//int[][] edges = {{1, 4}, {1, 2}, {4, 6}, {6, 9}, {9, 10}, {5, 10}, {2, 5}};\n\t\t//int[][] edges = {{1, 2}, {1, 4}, {2, 3}, {3, 4}, {4, 6}, {5, 6}, {4, 5}}; \n\t\tfor (int[] edge : edges) {\n\t\t\tPerson source = people.get(edge[0]);\n\t\t\tsource.addFriend(edge[1]);\n\t\t\t\n\t\t\tPerson destination = people.get(edge[1]);\n\t\t\tdestination.addFriend(edge[0]);\n\t\t}\n\t\t\n\t\t/*int i = 1;\n\t\tint j = 10;\n\t\tLinkedList<Person> path1 = findPathBFS(people, i, j);\n\t\tLinkedList<Person> path2 = findPathBiBFS(people, i, j);\n\t\tSystem.out.println(\"Path 1\");\n\t\tprintPeople(path1);\n\t\tSystem.out.println(\"Path 2\");\n\t\tprintPeople(path2);*/\n\t\t\n\t\t\n\t\tfor (int i = 0; i < nPeople; i++) {\n\t\t\tfor (int j = 0; j < nPeople; j++) {\n\t\t\t\tLinkedList<Person> path1 = QuestionA.findPathBFS(people, i, j);\n\t\t\t\tLinkedList<Person> path2 = QuestionB.findPathBiBFS(people, i, j);\n\t\t\t\tif (!isEquivalent(path1, path2)) {\n\t\t\t\t\tSystem.out.println(\"Not equal: \" + i + \" to \" + j);\n\t\t\t\t\tSystem.out.println(\"Path 1\");\n\t\t\t\t\tprintPeople(path1);\n\t\t\t\t\tSystem.out.println(\"Path 2\");\n\t\t\t\t\tprintPeople(path2);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tSystem.out.println(\"Is equal: \" + i + \" to \" + j);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_05_Cache/Cache.java",
    "content": "package Q9_05_Cache;\r\n\r\nimport java.util.HashMap;\r\n\r\npublic class Cache {\r\n\tpublic static int MAX_SIZE = 10;\r\n\tpublic Node head;\r\n\tpublic Node tail;\r\n\tpublic HashMap<String, Node> map;\r\n\tpublic int size = 0;\r\n\t\r\n\tpublic Cache() {\r\n\t\tmap = new HashMap<String, Node>();\r\n\t}\r\n\t\r\n\tpublic void moveToFront(Node node) {\r\n\t\tif (node == head) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tremoveFromLinkedList(node);\r\n\t\tnode.next = head;\r\n\t\tif (head != null) {\r\n\t\t\thead.prev = node;\r\n\t\t}\r\n\t\thead = node;\r\n\t\tsize++;\r\n\t\t\r\n\t\tif (tail == null) {\r\n\t\t\ttail = node;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void moveToFront(String query) {\r\n\t\tNode node = map.get(query);\r\n\t\tmoveToFront(node);\r\n\t}\t\r\n\t\r\n\tpublic void removeFromLinkedList(Node node) {\r\n\t\tif (node == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\tif (node.next != null || node.prev != null) {\r\n\t\t\tsize--;\r\n\t\t}\r\n\t\t\r\n\t\tNode prev = node.prev;\r\n\t\tif (prev != null) {\r\n\t\t\tprev.next = node.next;\r\n\t\t} \r\n\t\t\r\n\t\tNode next = node.next;\r\n\t\tif (next != null) {\r\n\t\t\tnext.prev = prev;\r\n\t\t}\r\n\t\t\r\n\t\tif (node == head) {\r\n\t\t\thead = next;\r\n\t\t}\r\n\t\t\r\n\t\tif (node == tail) {\r\n\t\t\ttail = prev;\r\n\t\t}\r\n\t\t\r\n\t\tnode.next = null;\r\n\t\tnode.prev = null;\r\n\t}\r\n\t\r\n\tpublic String[] getResults(String query) {\r\n\t\tif (map.containsKey(query)) {\r\n\t\t\tNode node = map.get(query);\r\n\t\t\tmoveToFront(node);\r\n\t\t\treturn node.results;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic void insertResults(String query, String[] results) {\r\n\t\tif (map.containsKey(query)) {\r\n\t\t\tNode node = map.get(query);\r\n\t\t\tnode.results = results;\r\n\t\t\tmoveToFront(node);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\tNode node = new Node(query, results);\r\n\t\tmoveToFront(node);\r\n\t\tmap.put(query, node);\r\n\t\t\r\n\t\tif (size > MAX_SIZE) {\r\n\t\t\tmap.remove(tail.query);\r\n\t\t\tremoveFromLinkedList(tail);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_05_Cache/Node.java",
    "content": "package Q9_05_Cache;\r\n\r\npublic class Node {\r\n\tpublic Node prev;\r\n\tpublic Node next;\r\n\tpublic String[] results;\r\n\tpublic String query;\r\n\r\n\tpublic Node(String q, String[] res) {\r\n\t\tresults = res;\r\n\t\tquery = q;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 09. Scalability and Memory Limits/Q9_05_Cache/Question.java",
    "content": "package Q9_05_Cache;\r\n\r\npublic class Question {\r\n\t\r\n\tpublic static String[] generateResults(int i) {\r\n\t\tString[] results =  {\"resultA\" + i, \"resultB\" + i, \"resultC\" + i};\r\n\t\treturn results;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tCache cache = new Cache();\r\n\t\tfor (int i = 0; i < 20; i++) {\r\n\t\t\tString query = \"query\" + i;\r\n\t\t\tcache.insertResults(query, generateResults(i));\r\n\t\t\tif (i == 9 || i == 16 || i == 19) {\r\n\t\t\t\tcache.getResults(\"query\" + 2);\r\n\t\t\t\tcache.getResults(\"query\" + 6);\r\n\t\t\t\tcache.getResults(\"query\" + 9);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < 30; i++) {\r\n\t\t\tString query = \"query\" + i;\r\n\t\t\tString[] results = cache.getResults(query);\r\n\t\t\tSystem.out.print(query + \": \");\r\n\t\t\tif (results == null) {\r\n\t\t\t\tSystem.out.print(\"null\");\r\n\t\t\t} else {\r\n\t\t\t\tfor (String s : results) {\r\n\t\t\t\t\tSystem.out.print(s + \", \");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tSystem.out.println(\"\");\r\n\t\t}\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Introduction/BinarySearch.java",
    "content": "package Introduction;\r\n\r\npublic class BinarySearch {\r\n\r\n\tpublic static int binarySearch(int[] a, int x) {\r\n\t\tint low = 0;\r\n\t\tint high = a.length - 1;\r\n\t\tint mid;\r\n\t\t\r\n\t\twhile (low <= high) {\r\n\t\t\tmid = low + (high - low) / 2;\r\n\t\t\tif (a[mid] < x) {\r\n\t\t\t\tlow = mid + 1;\r\n\t\t\t} else if (a[mid] > x) {\r\n\t\t\t\thigh = mid - 1;\r\n\t\t\t} else {\r\n\t\t\t\treturn mid;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\tpublic static int binarySearchRecursive(int[] a, int x, int low, int high) {\r\n\t\tif (low > high) return -1; // Error\r\n\t\t\r\n\t\tint mid = (low + high) / 2;\r\n\t\tif (a[mid] < x) {\r\n\t\t\treturn binarySearchRecursive(a, x, mid + 1, high);\r\n\t\t} else if (a[mid] > x) {\r\n\t\t\treturn binarySearchRecursive(a, x, low, mid - 1);\r\n\t\t} else {\r\n\t\t\treturn mid;\r\n\t\t}\r\n\t}\r\n\t\r\n\t// Recursive algorithm to return the closest element\r\n\tpublic static int binarySearchRecursiveClosest(int[] a, int x, int low, int high) {\r\n\t\tif (low > high) { // high is on the left side now\r\n\t\t\tif (high < 0) return low;\r\n\t\t\tif (low >= a.length) return high;\r\n\t\t\tif (x - a[high] < a[low] - x) {\r\n\t\t\t\treturn high;\r\n\t\t\t} \r\n\t\t\treturn low;\r\n\t\t}\r\n\t\t\r\n\t\tint mid = (low + high) / 2;\r\n\t\tif (a[mid] < x) {\r\n\t\t\treturn binarySearchRecursiveClosest(a, x, mid + 1, high);\r\n\t\t} else if (a[mid] > x) {\r\n\t\t\treturn binarySearchRecursiveClosest(a, x, low, mid - 1);\r\n\t\t} else {\r\n\t\t\treturn mid;\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {3, 6, 9, 12, 15, 18};\r\n\t\tfor (int i = 0; i < 20; i++) {\r\n\t\t\tint loc = binarySearch(array, i);\r\n\t\t\tint loc2 = binarySearchRecursive(array, i, 0, array.length - 1);\r\n\t\t\tint loc3 = binarySearchRecursiveClosest(array, i, 0, array.length - 1);\r\n\t\t\tSystem.out.println(i + \": \" + loc + \" \" + loc2 + \" \" + loc3);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Introduction/MergeSort.java",
    "content": "package Introduction;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class MergeSort {\t\r\n\tpublic static void mergesort(int[] array) {\r\n\t\tint[] helper = new int[array.length];\r\n\t\tmergesort(array, helper, 0, array.length - 1);\r\n\t}\r\n\r\n\tpublic static void mergesort(int[] array, int[] helper, int low, int high) {\r\n\t\tif (low < high) {\r\n\t\t\tint middle = low + (high - low) / 2;\r\n\t\t\tmergesort(array, helper, low, middle); // Sort left half\r\n\t\t\tmergesort(array, helper, middle+1, high); // Sort right half\r\n\t\t\tmerge(array, helper, low, middle, high); // Merge them\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void merge(int[] array, int[] helper, int low, int middle, int high) {\r\n\t\t/* Copy both halves into a helper array */\r\n\t\tfor (int i = low; i <= high; i++) {\r\n\t\t\thelper[i] = array[i];\r\n\t\t}\r\n\r\n\t\tint helperLeft = low;\r\n\t\tint helperRight = middle + 1;\r\n\t\tint current = low;\r\n\r\n\t\t/* Iterate through helper array. Compare the left and right\r\n\t\t * half, copying back the smaller element from the two halves\r\n\t\t * into the original array. */\r\n\t\twhile (helperLeft <= middle && helperRight <= high) {\r\n\t\t\tif (helper[helperLeft] <= helper[helperRight]) {\r\n\t\t\t\tarray[current] = helper[helperLeft];\r\n\t\t\t\thelperLeft++;\r\n\t\t\t} else { // If right element is smaller than left element\r\n\t\t\t\tarray[current] = helper[helperRight];\r\n\t\t\t\thelperRight++;\r\n\t\t\t}\r\n\t\t\tcurrent++;\r\n\t\t}\r\n\r\n\t\t/* Copy the rest of the left side of the array into the\r\n\t\t * target array */\r\n\t\tint remaining = middle - helperLeft;\r\n\t\tfor (int i = 0; i <= remaining; i++) {\r\n\t\t\tarray[current + i] = helper[helperLeft + i];\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint size = 20;\r\n\t\tint[] array = AssortedMethods.randomArray(size, 0, size - 1);\r\n\t\tint[] validate = new int[size];\r\n\t\tAssortedMethods.printIntArray(array);\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tvalidate[array[i]]++;\r\n\t\t}\r\n\t\tmergesort(array);\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tvalidate[array[i]]--;\r\n\t\t}\t\t\r\n\t\tAssortedMethods.printIntArray(array);\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tif (validate[i] != 0 || (i < (size-1) && array[i] > array[i+1])) {\r\n\t\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Introduction/Quicksort.java",
    "content": "package Introduction;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Quicksort {\r\n\tpublic static void swap(int[] array, int i, int j) {\r\n\t\tint tmp = array[i];\r\n\t\tarray[i] = array[j];\r\n\t\tarray[j] = tmp;\r\n\t}\r\n\t\r\n\tpublic static int partition(int[] arr, int left, int right) {\r\n\t\tint pivot = arr[left + (right - left) / 2]; // Pick a pivot point. Can be an element\t\t\r\n\t\t\r\n\t\twhile (left <= right) { // Until we've gone through the whole array\r\n\t\t\t// Find element on left that should be on right\r\n\t\t\twhile (arr[left] < pivot) { \r\n\t\t\t\tleft++;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Find element on right that should be on left\r\n\t\t\twhile (arr[right] > pivot) {\r\n\t\t\t\tright--;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Swap elements, and move left and right indices\r\n\t\t\tif (left <= right) {\r\n\t\t\t\tswap(arr, left, right);\r\n\t\t\t\tleft++;\r\n\t\t\t\tright--;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn left; \r\n\t}\r\n\t\r\n\tpublic static void quickSort(int[] arr, int left, int right) {\r\n\t\tint index = partition(arr, left, right); \r\n\t\tif (left < index - 1) { // Sort left half\r\n\t\t\tquickSort(arr, left, index - 1);\r\n\t\t}\r\n\t\tif (index < right) { // Sort right half\r\n\t\t\tquickSort(arr, index, right);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] arr = AssortedMethods.randomArray(20, 0, 6);\r\n\t\tAssortedMethods.printIntArray(arr);\t\r\n\t\tquickSort(arr, 0, arr.length - 1);\r\n\t\tAssortedMethods.printIntArray(arr);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_01_Sorted_Merge/Question.java",
    "content": "package Q10_01_Sorted_Merge;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\r\n\t/** Merges array\r\n\t * @param a first array\r\n\t * @param b second array\r\n\t * @param countA number of \"real\" elements in a\r\n\t * @param countB number of \"real\" elements in b\r\n\t */\r\n\tpublic static void merge(int[] a, int[] b, int countA, int countB) {\r\n\t\tint indexMerged = countB + countA - 1; /* Index of last location of merged array */\r\n\t\tint indexA = countA - 1; /* Index of last element in array b */\r\n\t\tint indexB = countB - 1; /* Index of last element in array a */\r\n\t\r\n\t\t/* Merge a and b, starting from the last element in each */\r\n\t\twhile (indexB >= 0) {\r\n\t\t\tif (indexA >= 0 && a[indexA] > b[indexB]) { /* end of A is bigger than end of B */\r\n\t\t\t\ta[indexMerged] = a[indexA]; // copy element\r\n\t\t\t\tindexA--; \r\n\t\t\t} else {\r\n\t\t\t\ta[indexMerged] = b[indexB]; // copy element\r\n\t\t\t\tindexB--;\r\n\t\t\t}\r\n\t\t\tindexMerged--; // move indices\t\t\t\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] a = {2, 3, 4, 5, 6, 8, 10, 100, 0, 0, 0, 0, 0, 0};\r\n\t\tint[] b = {1, 4, 7, 6, 7, 7};\r\n\t\tmerge(a, b, 8, 6);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(a));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_02_Group_Anagrams/AnagramComparator.java",
    "content": "package Q10_02_Group_Anagrams;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.Comparator;\r\n\r\npublic class AnagramComparator implements Comparator<String> {\r\n\tprivate String sortChars(String s) {\r\n\t\tchar[] content = s.toCharArray();\r\n\t\tArrays.sort(content);\r\n\t\treturn new String(content);\r\n\t}\r\n\t\r\n    public int compare(String s1, String s2) {\r\n    \treturn sortChars(s1).compareTo(sortChars(s2));\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_02_Group_Anagrams/Question.java",
    "content": "package Q10_02_Group_Anagrams;\r\n\r\nimport java.util.Arrays;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] array = {\"apple\", \"banana\", \"carrot\", \"ele\", \"duck\", \"papel\", \"tarroc\", \"cudk\", \"eel\", \"lee\"};\r\n\t\tSystem.out.println(AssortedMethods.stringArrayToString(array));\r\n\t\tArrays.sort(array, new AnagramComparator());\r\n\t\tSystem.out.println(AssortedMethods.stringArrayToString(array));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_02_Group_Anagrams/QuestionB.java",
    "content": "package Q10_02_Group_Anagrams;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionB {\r\n\tpublic static void sort(String[] array) {\r\n\t\tHashMapList<String, String> mapList = new HashMapList<String, String>();\r\n\t\t\r\n\t\t/* Group words by anagram */\r\n\t\tfor (String s : array) {\r\n\t\t\tString key = sortChars(s); \r\n\t\t\tmapList.put(key, s);\r\n\t\t}\r\n\t\t\r\n\t\t/* Convert hash table to array */\r\n\t\tint index = 0;\r\n\t\tfor (String key : mapList.keySet()) {\r\n\t\t\tArrayList<String> list = mapList.get(key);\r\n\t\t\tfor (String t : list) {\r\n\t\t\t\tarray[index] = t;\r\n\t\t\t\tindex++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static String sortChars(String s) {\r\n\t\tchar[] content = s.toCharArray();\r\n\t\tArrays.sort(content);\r\n\t\treturn new String(content);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] array = {\"apple\", \"banana\", \"carrot\", \"ele\", \"duck\", \"papel\", \"tarroc\", \"cudk\", \"eel\", \"lee\"};\r\n\t\tsort(array);\r\n\t\tSystem.out.println(AssortedMethods.stringArrayToString(array));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_03_Search_in_Rotated_Array/Question.java",
    "content": "package Q10_03_Search_in_Rotated_Array;\r\n\r\npublic class Question {\r\n\t\r\n\tpublic static int search(int a[], int x) {\r\n\t\treturn search(a, 0, a.length - 1, x);\r\n\t}\r\n\r\n\t\r\n\tpublic static int search(int a[], int left, int right, int x) {\r\n\t\tint mid = (left + right) / 2;\r\n\t\tif (x == a[mid]) { // Found element\r\n\t\t\treturn mid;\r\n\t\t}\r\n\t\tif (right < left) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\t/* While there may be an inflection point due to the rotation, either the left or \r\n\t\t * right half must be normally ordered.  We can look at the normally ordered half\r\n\t\t * to make a determination as to which half we should search. \r\n\t\t */\r\n\t\tif (a[left] < a[mid]) { // Left is normally ordered.\r\n\t\t\tif (x >= a[left] && x < a[mid]) { \r\n\t\t\t\treturn search(a, left, mid - 1, x);\r\n\t\t\t} else {\r\n\t\t\t\treturn search(a, mid + 1, right, x);\r\n\t\t\t}\r\n\t\t} else if (a[mid] < a[right]) { // Right is normally ordered.\r\n\t\t\tif (x > a[mid] && x <= a[right]) {\r\n\t\t\t\treturn search(a, mid + 1, right, x);\r\n\t\t\t} else {\r\n\t\t\t\treturn search(a, left, mid - 1, x);\r\n\t\t\t}\t\t\t\t\r\n\t\t} else if (a[left] == a[mid]) { // Left is either all repeats OR loops around (with the right half being all dups)\r\n\t\t\tif (a[mid] != a[right]) { // If right half is different, search there\r\n\t\t\t\treturn search(a, mid + 1, right, x);\r\n\t\t\t} else { // Else, we have to search both halves\r\n\t\t\t\tint result = search(a, left, mid - 1, x); \r\n\t\t\t\tif (result == -1) {\r\n\t\t\t\t\treturn search(a, mid + 1, right, x); \r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] a = { 2, 3, 1, 2, 2, 2, 2, 2 , 2 , 2 };\r\n\r\n\t\tSystem.out.println(search(a, 2));\r\n\t\tSystem.out.println(search(a, 3));\r\n\t\tSystem.out.println(search(a, 4));\r\n\t\tSystem.out.println(search(a, 1));\r\n\t\tSystem.out.println(search(a, 8));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_04_Sorted_Search_No_Size/Arrayish/Listy.java",
    "content": "package Q10_04_Sorted_Search_No_Size.Arrayish;\n\npublic class Listy {\n\tint[] array;\n\t\n\tpublic Listy(int[] arr) {\n\t\tarray = arr.clone();\n\t}\n\t\n\tpublic int elementAt(int index) {\n\t\tif (index >= array.length) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn array[index];\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_04_Sorted_Search_No_Size/Arrayish/Question.java",
    "content": "package Q10_04_Sorted_Search_No_Size.Arrayish;\n\npublic class Question {\n\n\tpublic static int binarySearch(Listy list, int value, int low, int high) {\n\t\tint mid;\n\t\t\n\t\twhile (low <= high) {\n\t\t\tmid = (low + high) / 2;\n\t\t\tint middle = list.elementAt(mid);\n\t\t\tif (middle > value || middle == -1) {\n\t\t\t\thigh = mid - 1;\n\t\t\t} else if (middle < value) {\n\t\t\t\tlow = mid + 1;\n\t\t\t} else {\n\t\t\t\treturn mid;\n\t\t\t}\n\t\t}\n\t\treturn -1;\t\t\n\t}\n\t\n\tpublic static int search(Listy list, int value) {\n\t\tint index = 1;\n\t\twhile (list.elementAt(index) != -1 && list.elementAt(index) < value) {\n\t\t\tindex *= 2;\n\t\t}\n\t\treturn binarySearch(list, value, index / 2, index);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 16, 18};\n\t\tListy list = new Listy(array);\n\t\tfor (int a : array) {\n\t\t\tSystem.out.println(search(list, a));\n\t\t}\n\t\tSystem.out.println(search(list, 15));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_05_Sparse_Search/QuestionA.java",
    "content": "package Q10_05_Sparse_Search;\r\n\r\npublic class QuestionA {\r\n\tpublic static int search(String[] strings, String str, int first, int last) {\r\n\t\tif (first > last) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\t/* Move mid to the middle */\r\n\t\tint mid = (last + first) / 2;\r\n\t\t\r\n\t\t/* If mid is empty, find closest non-empty string. */\r\n\t\tif (strings[mid].isEmpty()) { \r\n\t\t\tint left = mid - 1;\r\n\t\t\tint right = mid + 1;\r\n\t\t\twhile (true) {\r\n\t\t\t\tif (left < first && right > last) {\r\n\t\t\t\t\treturn -1;\r\n\t\t\t\t} else if (right <= last && !strings[right].isEmpty()) {\r\n\t\t\t\t\tmid = right;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (left >= first && !strings[left].isEmpty()) {\r\n\t\t\t\t\tmid = left;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tright++;\r\n\t\t\t\tleft--;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\t\r\n\t\t/* Check for string, and recurse if necessary */\r\n\t\tif (str.equals(strings[mid])) { // Found it!\r\n\t\t\treturn mid;\r\n\t\t} else if (strings[mid].compareTo(str) < 0) { // Search right\r\n\t\t\treturn search(strings, str, mid + 1, last);\r\n\t\t} else { // Search left\r\n\t\t\treturn search(strings, str, first, mid - 1);\r\n\t\t}\r\n\t}\t\r\n\t\t\r\n\tpublic static int search(String[] strings, String str) {\r\n\t\tif (strings == null || str == null || str.isEmpty()) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\treturn search(strings, str, 0, strings.length - 1);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n        String[] stringList = {\"apple\", \"\", \"\", \"banana\", \"\", \"\", \"\", \"carrot\", \"duck\", \"\", \"\", \"eel\", \"\", \"flower\"};\r\n        System.out.println(search(stringList, \"ac\"));\r\n        \r\n\t\t//for (String s : stringList) {\r\n\t\t//\tString cloned = new String(s);\r\n        //\tSystem.out.println(\"<\" + cloned + \"> \" + \" appears at location \" + search(stringList, cloned));\r\n\t\t//}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_05_Sparse_Search/QuestionB.java",
    "content": "package Q10_05_Sparse_Search;\r\n\r\npublic class QuestionB {\r\n\tpublic static int searchI(String[] strings, String str, int first, int last) {\r\n\t\twhile (first <= last) {\r\n\t\t\t/* Move mid to the middle */\r\n\t\t\tint mid = (last + first) / 2;\r\n\t\t\t\r\n\t\t\t/* If mid is empty, find closest non-empty string */\r\n\t\t\tif (strings[mid].isEmpty()) { \r\n\t\t\t\tint left = mid - 1;\r\n\t\t\t\tint right = mid + 1;\r\n\t\t\t\twhile (true) {\r\n\t\t\t\t\tif (left < first && right > last) {\r\n\t\t\t\t\t\treturn -1;\r\n\t\t\t\t\t} else if (right <= last && !strings[right].isEmpty()) {\r\n\t\t\t\t\t\tmid = right;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t} else if (left >= first && !strings[left].isEmpty()) {\r\n\t\t\t\t\t\tmid = left;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tright++;\r\n\t\t\t\t\tleft--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tint res = strings[mid].compareTo(str);\r\n\t\t\tif (res == 0) { // Found it!\r\n\t\t\t\treturn mid;\r\n\t\t\t} else if (res < 0) { // Search right\r\n\t\t\t\tfirst = mid + 1;\r\n\t\t\t} else { // Search left\r\n\t\t\t\tlast = mid - 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\t\r\n\t\r\n\tpublic static int searchR(String[] strings, String str, int first, int last) {\r\n\t\tif (first > last) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\t\r\n\t\t/* Move mid to the middle */\r\n\t\tint mid = (last + first) / 2;\r\n\t\t\r\n\t\t/* If mid is empty, find closest non-empty string. */\r\n\t\tif (strings[mid].isEmpty()) { \r\n\t\t\tint left = mid - 1;\r\n\t\t\tint right = mid + 1;\r\n\t\t\twhile (true) {\r\n\t\t\t\tif (left < first && right > last) {\r\n\t\t\t\t\treturn -1;\r\n\t\t\t\t} else if (right <= last && !strings[right].isEmpty()) {\r\n\t\t\t\t\tmid = right;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (left >= first && !strings[left].isEmpty()) {\r\n\t\t\t\t\tmid = left;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tright++;\r\n\t\t\t\tleft--;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\t\r\n\t\t/* Check for string, and recurse if necessary */\r\n\t\tif (str.equals(strings[mid])) { // Found it!\r\n\t\t\treturn mid;\r\n\t\t} else if (strings[mid].compareTo(str) < 0) { // Search right\r\n\t\t\treturn searchR(strings, str, mid + 1, last);\r\n\t\t} else { // Search left\r\n\t\t\treturn searchR(strings, str, first, mid - 1);\r\n\t\t}\r\n\t}\t\r\n\t\t\r\n\tpublic static int search(String[] strings, String str) {\r\n\t\tif (strings == null || str == null || str.isEmpty()) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\treturn searchR(strings, str, 0, strings.length - 1);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n        String[] stringList = {\"apple\", \"\", \"\", \"banana\", \"\", \"\", \"\", \"carrot\", \"duck\", \"\", \"\", \"eel\", \"\", \"flower\"};\r\n        System.out.println(search(stringList, \"ac\"));\r\n        \r\n\t\t//for (String s : stringList) {\r\n\t\t//\tString cloned = new String(s);\r\n        //\tSystem.out.println(\"<\" + cloned + \"> \" + \" appears at location \" + search(stringList, cloned));\r\n\t\t//}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_07_Missing_Int/QuestionA.java",
    "content": "package Q10_07_Missing_Int;\r\n\r\nimport java.io.FileNotFoundException;\r\nimport java.io.FileReader;\r\nimport java.io.IOException;\r\nimport java.util.Scanner;\r\n\r\npublic class QuestionA {\r\n\tpublic static long numberOfInts = ((long) Integer.MAX_VALUE) + 1;\r\n\tpublic static byte[] bitfield = new byte [(int) (numberOfInts / 8)];\r\n\t\r\n\tpublic static void findOpenNumber() throws FileNotFoundException {\r\n\t\tScanner in = new Scanner(new FileReader(\"Ch 10. Sorting and Searching/Q10_07_Missing_Int/input.txt\"));\r\n\t\twhile (in.hasNextInt()) {\r\n\t\t\tint n = in.nextInt ();\r\n\t\t\t/* Finds the corresponding number in the bitfield by using\r\n\t\t\t * the OR operator to set the nth bit of a byte \r\n\t\t\t * (e.g., 10 would correspond to bit 2 of index 1 in\r\n\t\t\t * the byte array). */\r\n\t\t\tbitfield [n / 8] |= 1 << (n % 8);\r\n\t\t}\r\n\r\n\t\tfor (int i = 0; i < bitfield.length; i++) {\r\n\t\t\tfor (int j = 0; j < 8; j++) {\r\n\t\t\t\t/* Retrieves the individual bits of each byte. When 0 bit\r\n\t\t\t\t * is found, finds the corresponding value. */\r\n\t\t\t\tif ((bitfield[i] & (1 << j)) == 0) {\r\n\t\t\t\t\tSystem.out.println (i * 8 + j);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t}\r\n\r\n\tpublic static void main(String[] args)  throws IOException {\r\n\t\tfindOpenNumber();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_07_Missing_Int/QuestionB.java",
    "content": "package Q10_07_Missing_Int;\r\n\r\nimport java.io.*;\r\nimport java.util.*;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static int findOpenNumber(String filename) throws FileNotFoundException {\r\n\t\tint rangeSize = (1 << 20); // 2^20 bits (2^17 bytes)\r\n\t\t\r\n\t\t/* Get count of number of values within each block. */\r\n\t\tint[] blocks = getCountPerBlock(filename, rangeSize);\r\n\t\t\r\n\t\t/* Find a block with a missing value. */\r\n\t\tint blockIndex = findBlockWithMissing(blocks, rangeSize);\r\n\t\tif (blockIndex < 0) return -1;\r\n\t\t\r\n\t\t/* Create bit vector for items within this range. */\r\n\t\tbyte[] bitVector = getBitVectorForRange(filename, blockIndex, rangeSize);\r\n\t\t\r\n\t\t/* Find a zero in the bit vector */\r\n\t\tint offset = findZero(bitVector);\r\n\t\tif (offset < 0) return -1;\r\n\t\t\r\n\t\t/* Compute missing value. */\r\n\t\treturn blockIndex * rangeSize + offset;\r\n\t}\r\n\t\r\n\t/* Get count of items within each range. */\r\n\tpublic static int[] getCountPerBlock(String filename, int rangeSize) throws FileNotFoundException {\r\n\t\tint arraySize = Integer.MAX_VALUE / rangeSize + 1;\r\n\t\tint[] blocks = new int[arraySize];\r\n\t\t\r\n\t\tScanner in = new Scanner (new FileReader(filename));\r\n\t\twhile (in.hasNextInt()) {\r\n\t\t    int value = in.nextInt();\r\n\t\t    blocks[value / rangeSize]++;\r\n\t\t}\r\n\t\tin.close();\r\n\t\treturn blocks;\r\n\t}\r\n\t\r\n\t/* Find a block whose count is low. */\r\n\tpublic static int findBlockWithMissing(int[] blocks, int rangeSize) {\r\n\t\tfor (int i = 0; i < blocks.length; i++) {\r\n\t\t\tif (blocks[i] < rangeSize){\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\t/* Create a bit vector for the values within a specific range. */\r\n\tpublic static byte[] getBitVectorForRange(String filename, int blockIndex, int rangeSize) throws FileNotFoundException {\r\n\t\tint startRange = blockIndex * rangeSize;\r\n\t\tint endRange = startRange + rangeSize;\r\n\t\tbyte[] bitVector = new byte[rangeSize/Byte.SIZE];\r\n\t\t\r\n\t\tScanner in = new Scanner(new FileReader(filename));\r\n\t\twhile (in.hasNextInt()) {\r\n\t\t\tint value = in.nextInt();\r\n\t\t\t/* If the number is inside the block that's missing \r\n\t\t\t * numbers, we record it */\r\n\t\t\tif (startRange <= value && value < endRange) {\r\n\t\t\t\tint offset = value - startRange;\r\n\t\t\t\tint mask = (1 << (offset % Byte.SIZE));\r\n\t\t\t\tbitVector[offset / Byte.SIZE] |= mask;\r\n\t\t\t}\r\n\t\t}\r\n\t\tin.close();\r\n\t\treturn bitVector;\r\n\t}\r\n\t\r\n\t/* Find bit index that is 0 within byte. */\r\n\tpublic static int findZero(byte b) {\r\n\t\tfor (int i = 0; i < Byte.SIZE; i++) {\r\n\t\t\tint mask = 1 << i;\r\n\t\t\tif ((b & mask) == 0) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\t/* Find a zero within the bit vector and return the index. */\r\n\tpublic static int findZero(byte[] bitVector) {\r\n\t\tfor (int i = 0; i < bitVector.length; i++) {\r\n\t\t\tif (bitVector[i] != ~0) { // If not all 1s\r\n\t\t\t\tint bitIndex = findZero(bitVector[i]);\r\n\t\t\t\treturn i * Byte.SIZE + bitIndex;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\treturn -1;\r\n\t}\r\n\t\t\r\n\tpublic static void generateFile(String filename, int max, int missing) throws FileNotFoundException {\r\n\t\tPrintWriter writer = new PrintWriter(filename);\r\n\r\n\t\tfor (int i = 0; i < max && i >= 0; i++) {\r\n\t\t\tif (i != missing) {\r\n\t\t\t\twriter.println(i);\r\n\t\t\t}\r\n\t\t\tif (i % 10000 == 0) {\r\n\t\t\t\tSystem.out.println(\"Now at location: \" + i);\r\n\t\t\t}\r\n\t\t}\r\n\t\twriter.flush();\r\n\t\twriter.close();\t\t\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) throws FileNotFoundException {\r\n\t\tString filename = \"Ch 10. Scalability and Memory Limits/Q10_04_Missing_Int/input.txt\";\r\n\t\tint max = 10000000;\r\n\t\tint missing = 1234325;\r\n\t\tSystem.out.println(\"Generating file...\");\r\n\t\tgenerateFile(filename, max, missing);\r\n\t\tSystem.out.println(\"Generated file from 0 to \" + max + \" with \" + missing + \" missing.\");\r\n\t\tSystem.out.println(\"Searching for missing number...\");\r\n\t\tSystem.out.println(\"Missing value: \" + findOpenNumber(filename));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_08_Find_Duplicates/BitSet.java",
    "content": "package Q10_08_Find_Duplicates;\r\n\r\nclass BitSet {\r\n\tint[] bitset;\r\n\t\r\n\tpublic BitSet(int size) {\r\n\t\tbitset = new int[(size >> 5) + 1]; // divide by 32\r\n\t}\r\n\r\n\tboolean get(int pos) {\r\n\t\tint wordNumber = (pos >> 5); // divide by 32\r\n\t\tint bitNumber = (pos & 0x1F); // mod 32\r\n\t\treturn (bitset[wordNumber] & (1 << bitNumber)) != 0;\r\n\t}\r\n\t\r\n\tvoid set(int pos) {\r\n\t\tint wordNumber = (pos >> 5); // divide by 32\r\n\t\tint bitNumber = (pos & 0x1F); // mod 32\r\n\t\tbitset[wordNumber] |= 1 << bitNumber;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_08_Find_Duplicates/Question.java",
    "content": "package Q10_08_Find_Duplicates;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\tpublic static void checkDuplicates(int[] array) {\r\n\t\tBitSet bs = new BitSet(32000);\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tint num = array[i];\r\n\t\t\tint num0 = num - 1; // bitset starts at 0, numbers start at 1\r\n\t\t\tif (bs.get(num0)) { \r\n\t\t\t\tSystem.out.println(num);\r\n\t\t\t} else {\r\n\t\t\t\tbs.set(num0);\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = AssortedMethods.randomArray(30, 1, 30);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t\tcheckDuplicates(array);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_09_Sorted_Matrix_Search/Coordinate.java",
    "content": "package Q10_09_Sorted_Matrix_Search;\r\n\r\npublic class Coordinate implements Cloneable {\r\n\tpublic int row;\r\n\tpublic int column;\r\n\tpublic Coordinate(int r, int c) {\r\n\t\trow = r;\r\n\t\tcolumn = c;\r\n\t}\r\n\t\r\n\tpublic boolean inbounds(int[][] matrix) {\r\n\t\treturn \trow >= 0 &&\r\n\t\t\t\tcolumn >= 0 &&\r\n\t\t\t\trow < matrix.length &&\r\n\t\t\t\tcolumn < matrix[0].length;\r\n\t}\r\n\t\r\n\tpublic boolean isBefore(Coordinate p) {\r\n\t\treturn row <= p.row && column <= p.column;\r\n\t}\r\n\t\r\n\tpublic Object clone() { \r\n\t\treturn new Coordinate(row, column);\r\n\t}\r\n\t\r\n\tpublic void moveDownRight() {\r\n\t\trow++;\r\n\t\tcolumn++;\r\n\t}\r\n\t\r\n\tpublic void setToAverage(Coordinate min, Coordinate max) {\r\n\t\trow = (min.row + max.row) / 2;\r\n\t\tcolumn = (min.column + max.column) / 2;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_09_Sorted_Matrix_Search/QuestionA.java",
    "content": "package Q10_09_Sorted_Matrix_Search;\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static boolean findElement(int[][] matrix, int elem) {\r\n\t\tint row = 0;\r\n\t\tint col = matrix[0].length - 1; \r\n\t\twhile (row < matrix.length && col >= 0) {\r\n\t\t\tif (matrix[row][col] == elem) {\r\n\t\t\t\treturn true;\r\n\t\t\t} else if (matrix[row][col] > elem) {\r\n\t\t\t\tcol--;\r\n\t\t\t} else {\r\n\t\t\t\trow++; \r\n\t\t\t}\r\n\t\t} \r\n\t\treturn false; \r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint M = 10;\r\n\t\tint N = 5;\r\n\t\tint[][] matrix = new int[M][N];\r\n\t\tfor (int i = 0; i < M; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tmatrix[i][j] = 10 * i + j;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\t\r\n\t\tfor (int i = 0; i < M; i++) {\r\n\t\t\tfor (int j = 0; j < M; j++) {\r\n\t\t\t\tint v = 10 * i + j;\r\n\t\t\t\tSystem.out.println(v + \": \" + findElement(matrix, v));\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_09_Sorted_Matrix_Search/QuestionB.java",
    "content": "package Q10_09_Sorted_Matrix_Search;\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static Coordinate partitionAndSearch(int[][] matrix, Coordinate origin, Coordinate dest, Coordinate pivot, int x) {\r\n\t\tCoordinate lowerLeftOrigin = new Coordinate(pivot.row, origin.column);\r\n\t\tCoordinate lowerLeftDest = new Coordinate(dest.row, pivot.column - 1);\r\n\t\tCoordinate upperRightOrigin = new Coordinate(origin.row, pivot.column);\r\n\t\tCoordinate upperRightDest = new Coordinate(pivot.row - 1, dest.column);\r\n\t\t\r\n\t\tCoordinate lowerLeft = findElement(matrix, lowerLeftOrigin, lowerLeftDest, x);\r\n\t\tif (lowerLeft == null) {\r\n\t\t\treturn findElement(matrix, upperRightOrigin, upperRightDest, x);\r\n\t\t}\r\n\t\treturn lowerLeft;\r\n\t}\r\n\t\r\n\tpublic static Coordinate findElement(int[][] matrix, Coordinate origin, Coordinate dest, int x) {\r\n\t\tif (!origin.inbounds(matrix) || !dest.inbounds(matrix)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (matrix[origin.row][origin.column] == x) {\r\n\t\t\treturn origin;\r\n\t\t} else if (!origin.isBefore(dest)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\t/* Set start to start of diagonal and end to the end of the diagonal. Since\r\n\t\t * the grid may not be square, the end of the diagonal may not equal dest.\r\n\t\t */\r\n\t\tCoordinate start = (Coordinate) origin.clone();\r\n\t\tint diagDist = Math.min(dest.row - origin.row, dest.column - origin.column);\r\n\t\tCoordinate end = new Coordinate(start.row + diagDist, start.column + diagDist);\r\n\t\tCoordinate p = new Coordinate(0, 0);\r\n\t\t\r\n\t\t/* Do binary search on the diagonal, looking for the first element greater than x */\r\n\t\twhile (start.isBefore(end)) {\r\n\t\t\tp.setToAverage(start, end);\r\n\t\t\tif (x > matrix[p.row][p.column]) {\r\n\t\t\t\tstart.row = p.row + 1;\r\n\t\t\t\tstart.column = p.column + 1;\r\n\t\t\t} else {\r\n\t\t\t\tend.row = p.row - 1;\r\n\t\t\t\tend.column = p.column - 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Split the grid into quadrants. Search the bottom left and the top right. */ \r\n\t\treturn partitionAndSearch(matrix, origin, dest, start, x);\r\n\t}\r\n\t\r\n\tpublic static Coordinate findElement(int[][] matrix, int x) {\r\n\t\tCoordinate origin = new Coordinate(0, 0);\r\n\t\tCoordinate dest = new Coordinate(matrix.length - 1, matrix[0].length - 1);\r\n\t\treturn findElement(matrix, origin, dest, x);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = {{15, 30,  50,  70,  73}, \r\n\t\t\t\t \t \t  {35, 40, 100, 102, 120},\r\n\t\t\t\t \t \t  {36, 42, 105, 110, 125},\r\n\t\t\t\t \t \t  {46, 51, 106, 111, 130},\r\n\t\t\t\t \t \t  {48, 55, 109, 140, 150}};\r\n\t\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\tint m = matrix.length;\r\n\t\tint n = matrix[0].length;\r\n\t\t\r\n\t\tint count = 0;\r\n\t\tint littleOverTheMax = matrix[m - 1][n - 1] + 10;\r\n\t\tfor (int i = 0; i < littleOverTheMax; i++) {\r\n\t\t\tCoordinate c = findElement(matrix, i);\r\n\t\t\tif (c != null) {\r\n\t\t\t\tSystem.out.println(i + \": (\" + c.row + \", \" + c.column + \")\");\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tSystem.out.println(\"Found \" + count + \" unique elements.\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_10_Rank_from_Stream/IntComparable.java",
    "content": "package Q10_10_Rank_from_Stream;\r\n\r\nimport java.util.Comparator;\r\n\r\npublic class IntComparable implements Comparator<Integer>{\r\n\t \r\n\t@Override\r\n\tpublic int compare(Integer o1, Integer o2) {\r\n\t\treturn o1.compareTo(o2);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_10_Rank_from_Stream/Question.java",
    "content": "package Q10_10_Rank_from_Stream;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\tprivate static RankNode root = null;\r\n\t\r\n\tpublic static void track(int number) {\r\n\t\tif (root == null) {\r\n\t\t\troot = new RankNode(number);\r\n\t\t} else {\r\n\t\t\troot.insert(number);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int getRankOfNumber(int number) {\r\n\t\treturn root.getRank(number);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint size = 100;\r\n\t\tint[] list = AssortedMethods.randomArray(size, -100, 100);\r\n\t\tfor (int i = 0; i < list.length; i++) {\r\n\t\t\ttrack(list[i]);\r\n\t\t}\r\n\t\t\r\n\t\tint[] tracker = new int[size];\r\n\t\tfor (int i = 0; i < list.length; i++) {\r\n\t\t\tint v = list[i];\r\n\t\t\tint rank1 = root.getRank(list[i]);\r\n\t\t\ttracker[rank1] = v;\t\t\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < tracker.length - 1; i++) {\r\n\t\t\tif (tracker[i] != 0 && tracker[i + 1] != 0) {\r\n\t\t\t\tif (tracker[i] > tracker[i + 1]) {\r\n\t\t\t\t\tSystem.out.println(\"ERROR at \" + i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tSystem.out.println(\"Array: \" + AssortedMethods.arrayToString(list));\r\n\t\tSystem.out.println(\"Ranks: \" + AssortedMethods.arrayToString(tracker));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_10_Rank_from_Stream/RankNode.java",
    "content": "package Q10_10_Rank_from_Stream;\r\n\r\npublic class RankNode {\r\n\tpublic int left_size = 0;\r\n\tpublic RankNode left;\r\n\tpublic RankNode right;\r\n\tpublic int data = 0;\r\n\tpublic RankNode(int d) {\r\n\t\tdata = d;\r\n\t}\r\n\t\r\n\tpublic void insert(int d) {\r\n\t\tif (d <= data) {\r\n\t\t\tif (left != null) {\r\n\t\t\t\tleft.insert(d);\r\n\t\t\t} else {\r\n\t\t\t\tleft = new RankNode(d);\r\n\t\t\t}\r\n\t\t\tleft_size++;\r\n\t\t} else {\r\n\t\t\tif (right != null) {\r\n\t\t\t\tright.insert(d);\r\n\t\t\t} else {\r\n\t\t\t\tright = new RankNode(d);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int getRank(int d) {\r\n\t\tif (d == data) {\r\n\t\t\treturn left_size;\r\n\t\t} else if (d < data) {\r\n\t\t\tif (left == null) {\r\n\t\t\t\treturn -1;\r\n\t\t\t} else {\r\n\t\t\t\treturn left.getRank(d);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tint right_rank = right == null ? -1 : right.getRank(d);\r\n\t\t\tif (right_rank == -1) {\r\n\t\t\t\treturn -1;\r\n\t\t\t} else {\r\n\t\t\t\treturn left_size + 1 + right_rank;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_11_Peaks_and_Valleys/QuestionA.java",
    "content": "package Q10_11_Peaks_and_Valleys;\n\nimport java.util.Arrays;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionA {\n\tpublic static void sortValleyPeak(int[] array) {\n\t\tArrays.sort(array);\n\t\tfor (int i = 1; i < array.length; i += 2) {\n\t\t\tswap(array, i - 1, i);\n\t\t}\n\t}\n\t\n\tpublic static void swap(int[] array, int left, int right) {\n\t\tint temp = array[left];\n\t\tarray[left] = array[right];\n\t\tarray[right] = temp;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = {48, 40, 31, 62, 28, 21, 64, 40, 23, 17};\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tsortValleyPeak(array);\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tSystem.out.println(Tester.confirmValleyPeak(array));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_11_Peaks_and_Valleys/QuestionB.java",
    "content": "package Q10_11_Peaks_and_Valleys;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionB {\n\tpublic static void swap(int[] array, int left, int right) {\n\t\tint temp = array[left];\n\t\tarray[left] = array[right];\n\t\tarray[right] = temp;\n\t}\n\t\n\tpublic static void sortValleyPeak(int[] array) {\n\t\tfor (int i = 1; i < array.length; i += 2) {\n\t\t\tint biggestIndex = maxIndex(array, i - 1, i, i + 1);\n\t\t\tif (i != biggestIndex) {\n\t\t\t\tswap(array, i, biggestIndex);\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\tpublic static int maxIndex(int[] array, int a, int b, int c) {\n\t\tint len = array.length;\n\t\tint aValue = a >= 0 && a < len ? array[a] : Integer.MIN_VALUE; \n\t\tint bValue = b >= 0 && b < len ? array[b] : Integer.MIN_VALUE; \n\t\tint cValue = c >= 0 && c < len ? array[c] : Integer.MIN_VALUE; \n\t\t\n\t\tint max = Math.max(aValue, Math.max(bValue, cValue));\n\t\t\n\t\tif (aValue == max) {\n\t\t\treturn a;\n\t\t} else if (bValue == max) {\n\t\t \treturn b;\n\t\t} else {\n\t\t\treturn c;\n\t\t}\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = {48, 40, 31, 62, 28, 21, 64, 40, 23, 17};\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tsortValleyPeak(array);\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tSystem.out.println(Tester.confirmValleyPeak(array));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_11_Peaks_and_Valleys/QuestionC.java",
    "content": "package Q10_11_Peaks_and_Valleys;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionC {\n\tpublic static void swap(int[] array, int left, int right) {\n\t\tint temp = array[left];\n\t\tarray[left] = array[right];\n\t\tarray[right] = temp;\n\t}\n\t\n\tpublic static void sortValleyPeak(int[] array) {\n\t\tfor (int i = 1; i < array.length; i += 2) {\n\t\t\tif (array[i - 1] < array[i]) {\n\t\t\t\tswap(array, i - 1, i);\n\t\t\t} \n\t\t\tif (i + 1 < array.length && array[i + 1] < array[i]) {\n\t\t\t\tswap(array, i + 1, i);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = {5, 3, 1, 2, 3};\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tsortValleyPeak(array);\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tSystem.out.println(Tester.confirmValleyPeak(array));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 10. Sorting and Searching/Q10_11_Peaks_and_Valleys/Tester.java",
    "content": "package Q10_11_Peaks_and_Valleys;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\tpublic static boolean confirmValleyPeak(int[] array) {\n\t\tfor (int i = 1; i < array.length - 1; i++) {\n\t\t\tint prev = array[i - 1];\n\t\t\tint curr = array[i];\n\t\t\tint next = array[i + 1];\n\t\t\tif (prev <= curr && curr >= next) {\n\t\t\t\tcontinue;\n\t\t\t} else if (prev >= curr && curr <= next) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 100; i++) {\n\t\t\tint[] originalArray = AssortedMethods.randomArray(10, 0, 100);\n\t\t\tint[] arrayA = originalArray.clone();\n\t\t\tint[] arrayB = originalArray.clone();\n\t\t\tint[] arrayC = originalArray.clone();\n\t\t\t//System.out.println(AssortedMethods.arrayToString(array));\n\t\t\tQuestionA.sortValleyPeak(arrayA);\n\t\t\tQuestionB.sortValleyPeak(arrayB);\n\t\t\tQuestionC.sortValleyPeak(arrayC);\n\t\t\tif (!confirmValleyPeak(arrayA) || !confirmValleyPeak(arrayB) || !confirmValleyPeak(arrayC)) {\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(originalArray));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(arrayA));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(arrayB));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(arrayC));\n\t\t\t\tSystem.out.println(confirmValleyPeak(arrayA));\n\t\t\t\tSystem.out.println(confirmValleyPeak(arrayB));\n\t\t\t\tSystem.out.println(confirmValleyPeak(arrayC));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/Ambiguous.java",
    "content": "package Introduction;\r\n\r\npublic class Ambiguous extends Shape {\r\n\tprivate double area = 10;\r\n\t\r\n\tpublic double computeArea() {\r\n\t\treturn area;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/Circle.java",
    "content": "package Introduction;\r\n\r\npublic class Circle extends Shape {\r\n\tprivate double rad = 5;\r\n\tpublic void printMe() {\r\n\t\tSystem.out.println(\"I am a circle.\");\r\n\t}\r\n\t\r\n\tpublic double computeArea() {\r\n\t\treturn rad * rad * 3.15;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/Introduction.java",
    "content": "package Introduction;\r\n\r\npublic class Introduction {\r\n\tpublic static String lem() {\r\n\t\tSystem.out.println(\"lem\");\r\n\t\treturn \"return from lem\";\r\n\t}\r\n\t\r\n\tpublic static String foo() {\r\n\t\tint x = 0;\r\n\t\tint y = 5;\r\n\t\ttry\r\n\t\t{\r\n\t\t\tSystem.out.println(\"start try\");\r\n\t\t\tint b = y / x;\r\n\t\t\tSystem.out.println(\"end try\");\r\n\t\t\treturn \"returned from try\";\r\n\t\t} catch (Exception ex) {\r\n\t\t\tSystem.out.println(\"catch\");\r\n\t\t\treturn lem() + \" | returned from catch\";\r\n\t\t} finally {\r\n\t\t\tSystem.out.println(\"finally\");\t\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void bar() {\r\n\t\tSystem.out.println(\"start bar\");\r\n\t\tString v = foo();\r\n\t\tSystem.out.println(v);\r\n\t\tSystem.out.println(\"end bar\");\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tbar();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/IntroductionCollections.java",
    "content": "package Introduction;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.Iterator;\r\nimport java.util.LinkedList;\r\nimport java.util.Vector;\r\n\r\npublic class IntroductionCollections {\r\n\tpublic static void main(String[] args) {\r\n\t\t// ArrayList\r\n\t\tArrayList<String> myArr = new ArrayList<String>();\r\n\t\tmyArr.add(\"one\");\r\n\t\tmyArr.add(\"two\");\r\n\t\tSystem.out.println(myArr.get(0));\r\n\t\t\r\n\t\t// Vector\r\n\t\tVector<String> myVect = new Vector<String>();\r\n\t\tmyVect.add(\"one\");\r\n\t\tmyVect.add(\"two\");\r\n\t\tSystem.out.println(myVect.get(0));\r\n\t\t\r\n\t\t// Linked List\r\n\t\tLinkedList<String> myLinkedList = new LinkedList<String>();\r\n\t\tmyLinkedList.add(\"two\");\r\n\t\tmyLinkedList.addFirst(\"one\");\r\n\t\tIterator<String> iter = myLinkedList.iterator();\r\n\t\twhile (iter.hasNext()) {\r\n\t\t\tSystem.out.println(iter.next());\r\n\t\t}\r\n\t\t\r\n\t\t// Hash Map\r\n\t\tHashMap<String, String> map = new HashMap<String, String>();\r\n\t\tmap.put(\"one\", \"uno\");\r\n\t\tmap.put(\"two\", \"dos\");\r\n\t\tSystem.out.println(map.get(\"one\"));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/IntroductionOverriding.java",
    "content": "package Introduction;\r\n\r\npublic class IntroductionOverriding {\r\n\r\n\tpublic static void printArea(Circle c) {\r\n\t\tSystem.out.println(\"The circle is \" + c.computeArea());\r\n\t}\r\n\t\r\n\tpublic static void printArea(Square s) {\r\n\t\tSystem.out.println(\"The square is \" + s.computeArea());\r\n\t}\t\r\n\t\r\n\tpublic static void printArea(Ambiguous s) {\r\n\t\tSystem.out.println(\"The ambiguous is undefined\");\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tShape[] shapes = new Shape[2];\r\n\t\tCircle circle = new Circle();\r\n\t\tAmbiguous ambiguous = new Ambiguous();\r\n\t\t\r\n\t\tshapes[0] = circle;\r\n\t\tshapes[1] = ambiguous;\r\n\t\t\r\n\t\tfor (Shape s : shapes) {\r\n\t\t\ts.printMe();\r\n\t\t\tSystem.out.println(s.computeArea());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/Shape.java",
    "content": "package Introduction;\r\n\r\npublic abstract class Shape {\r\n\tpublic void printMe() {\r\n\t\tSystem.out.println(\"I am a shape.\");\r\n\t}\r\n\t\r\n\tpublic abstract double computeArea();\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Introduction/Square.java",
    "content": "package Introduction;\r\n\r\npublic class Square extends Shape {\r\n\tprivate double len = 5;\r\n\tpublic void printMe() {\r\n\t\tSystem.out.println(\"I am a square.\");\r\n\t}\r\n\t\r\n\tpublic double computeArea() {\r\n\t\treturn len * len;\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_01_Private_Constructor/Question.java",
    "content": "package Q13_01_Private_Constructor;\n\npublic class Question {\n\tprivate Question() {\n\t\tSystem.out.println(\"Q\");\n\t}\n\t\n    static class A {\n        private A() {\n        }\n    }\n\n    static class B extends A {\n    \tpublic B() {\n    \t}\n    }\n    \n\tpublic static void main(String[] args) {\n\t\tnew B();\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_05_TreeMap_HashMap_LinkedHashMap/Question.java",
    "content": "package Q13_05_TreeMap_HashMap_LinkedHashMap;\n\nimport java.util.AbstractMap;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.TreeMap;\n\npublic class Question {\n\tpublic static void insertAndPrint(AbstractMap<Integer, String> map) {\n\t\tint[] array = {1, -1, 0};\n\t\tfor (int x : array) {\n\t\t\tmap.put(x, Integer.toString(x));\n\t\t}\n\t\t\n\t\tfor (int k : map.keySet()) {\n\t\t\tSystem.out.print(k + \", \");\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tTreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();\n\t\tHashMap<Integer, String> hashMap = new HashMap<Integer, String>();\n\t\tLinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();\n\t\t\n\t\tSystem.out.println(\"\\nHashMap - Arbitrary Order:\");\n\t\tinsertAndPrint(hashMap);\n\t\t\n\t\tSystem.out.println(\"\\nLinkedHashMap - Insertion Order:\");\n\t\tinsertAndPrint(linkedHashMap);\n\n\t\tSystem.out.println(\"\\nTreeMap - Natural Order:\");\n\t\tinsertAndPrint(treeMap);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_06_Object_Reflection/Question.java",
    "content": "package Q13_06_Object_Reflection;\r\n\r\nimport java.lang.reflect.*;\r\n\r\npublic class Question {\r\n\tpublic static void main(String args[]) {\r\n\t\ttry {\r\n\t\t\t/* Parameters */\r\n\t\t\tObject[] doubleArgs = new Object[] { 4.2, 3.9 };\r\n\t\t\t\r\n\t\t\t/* Get class */\r\n\t\t\tClass rectangleDefinition = Class.forName(\"Question14_5.Rectangle\");\r\n\t\t\t\r\n\t\t\t/* Equivalent: Rectangle rectangle = new Rectangle(4.2, 3.9); */\r\n\t\t\tClass[] doubleArgsClass = new Class[] {double.class, double.class};\r\n\t\t\tConstructor doubleArgsConstructor = rectangleDefinition.getConstructor(doubleArgsClass);\r\n\t\t\tRectangle rectangle = (Rectangle) doubleArgsConstructor.newInstance(doubleArgs);\r\n\t\t\t\r\n\t\t\t/* Equivalent: Double area = rectangle.area(); */\r\n\t\t\tMethod m = rectangleDefinition.getDeclaredMethod(\"area\");\r\n\t\t\tDouble area = (Double) m.invoke(rectangle);\r\n\t\t\t\r\n\t\t\tSystem.out.println(area);\r\n\t\t} catch (ClassNotFoundException e) {\r\n\t\t\tSystem.out.println(e);\r\n\t\t} catch (NoSuchMethodException e) {\r\n\t\t\tSystem.out.println(e);\r\n\t\t} catch (IllegalArgumentException e) {\r\n\t\t\tSystem.out.println(e);\r\n\t\t} catch (IllegalAccessException e) {\r\n\t\t\tSystem.out.println(e);\r\n\t\t} catch (InvocationTargetException e) {\r\n\t\t\tSystem.out.println(e);\r\n\t\t} catch (InstantiationException e) {\r\n\t\t\t// TODO Auto-generated catch block\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_06_Object_Reflection/Rectangle.java",
    "content": "package Q13_06_Object_Reflection;\r\n\r\npublic class Rectangle {\r\n\tprivate double width;\r\n\tprivate double height;\r\n\tpublic Rectangle(double w, double h) {\r\n\t\twidth = w;\r\n\t\theight = h;\r\n\t}\r\n\t\r\n\tpublic double area() {\r\n\t\treturn width * height;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_07_Lambda_Expressions/Country.java",
    "content": "package Q13_07_Lambda_Expressions;\n\npublic class Country {\n\tprivate String name;\n\tprivate int size;\n\tprivate String continent;\n\tpublic Country(String n, String c, int sz) {\n\t\tname = n;\n\t\tsize = sz;\n\t\tcontinent = c;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic String getContinent() {\n\t\treturn continent;\n\t}\n\t\n\tpublic int getPopulation() {\n\t\treturn size;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_07_Lambda_Expressions/QuestionA.java",
    "content": "package Q13_07_Lambda_Expressions;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class QuestionA {\n\t\n\tpublic static int getPopulation(List<Country> countries, String continent) {\n \t\tint sum = 0;\n \t\tfor (Country c : countries) {\n \t\t\tif (c.getContinent().equals(continent)) {\n \t\t\t\tsum += c.getPopulation();\n \t\t\t}\n \t\t}\n \t\treturn sum;\n\t}\n\t\n \tpublic static void main(String... args) {\t\t\n \t\tArrayList<Country> countries = new ArrayList<Country>();\n \t\tcountries.add(new Country(\"United States\", \"North America\", 1));\n \t\tcountries.add(new Country(\"Canada\", \"North America\", 5));\n \t\tcountries.add(new Country(\"India\", \"Asia\", 9));\n \t\t\n \t\tSystem.out.println(getPopulation(countries, \"Asia\"));\n \t}\n\n}"
  },
  {
    "path": "Java/Ch 13. Java/Q13_07_Lambda_Expressions/QuestionB.java",
    "content": "package Q13_07_Lambda_Expressions;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Stream;\n\npublic class QuestionB {\n\tpublic static int getPopulation(List<Country> countries, String continent) {\n \t\tStream<Country> sublist = countries.stream().filter( country -> {\n \t\t\treturn country.getContinent().equals(continent);\n \t\t});\n \t\t\n \t\tStream<Integer> populations = sublist.map(c -> c.getPopulation());\n \t\tint population = populations.reduce(0, (a, b) -> a + b);\n \t\treturn population;\n\t}\t\n\t\n \tpublic static void main(String... args) {\t\t\n \t\tArrayList<Country> countries = new ArrayList<Country>();\n \t\tcountries.add(new Country(\"United States\", \"North America\", 5));\n \t\tcountries.add(new Country(\"Canada\", \"North America\", 10));\n \t\tcountries.add(new Country(\"India\", \"Asia\", 30));\n \t\tSystem.out.println(getPopulation(countries, \"North America\"));\n \t}\n\n}"
  },
  {
    "path": "Java/Ch 13. Java/Q13_07_Lambda_Expressions/QuestionC.java",
    "content": "package Q13_07_Lambda_Expressions;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Stream;\n\npublic class QuestionC {\n\tpublic static int getPopulation(List<Country> countries, String continent) {\n \t\tStream<Integer> populations = countries.stream().map(c -> \n \t\t\tc.getContinent().equals(continent) ? c.getPopulation() : 0);\n \t\treturn populations.reduce(0, (a, b) -> a + b);\n\t}\t\n\t\n \tpublic static void main(String... args) {\t\t\n \t\tArrayList<Country> countries = new ArrayList<Country>();\n \t\tcountries.add(new Country(\"United States\", \"North America\", 5));\n \t\tcountries.add(new Country(\"Canada\", \"North America\", 10));\n \t\tcountries.add(new Country(\"India\", \"Asia\", 30));\n \t\tSystem.out.println(getPopulation(countries, \"North America\"));\n \t}\n\n}"
  },
  {
    "path": "Java/Ch 13. Java/Q13_07_Lambda_Expressions/Tester.java",
    "content": "package Q13_07_Lambda_Expressions;\n\nimport java.util.ArrayList;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n \t\tArrayList<Country> countries = new ArrayList<Country>();\n \t\tcountries.add(new Country(\"United States\", \"North America\", 5));\n \t\tcountries.add(new Country(\"Canada\", \"North America\", 10));\n \t\tcountries.add(new Country(\"India\", \"Asia\", 30));\n \t\t\n \t\tString continent = \"North America\";\n \t\tint popA = QuestionA.getPopulation(countries, continent);\n \t\tint popB = QuestionB.getPopulation(countries, continent);\n \t\tint popC = QuestionC.getPopulation(countries, continent);\n \t\t\n \t\tif (popA == popB && popB == popC) {\n \t\t\tSystem.out.println(\"Population: \" + popA);\n \t\t} else {\n \t\t\tSystem.out.println(\"Mismatch: \" + popA + \", \" + popB + \", \" + popC);\n \t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 13. Java/Q13_08_Lambda_Random/QuestionA.java",
    "content": "package Q13_08_Lambda_Random;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\n\npublic class QuestionA {\n\t\n\tpublic static List<Integer> getRandomSubset(List<Integer> list) {\n\t\tList<Integer> subset = new ArrayList<Integer>();\n\t\tRandom random = new Random();\n\t\tfor (int item : list) {\n\t\t\tif (random.nextBoolean()) {\n\t\t\t\tsubset.add(item);\n\t\t\t}\n\t\t}\n\t\treturn subset;\n\t}\n\t\n \tpublic static void main(String... args) {\t\n \t\tList<Integer> list = new ArrayList<Integer>();\n \t\tlist.add(1);\n \t\tlist.add(2);\n \t\tlist.add(3);\n \t\tlist.add(4);\n \t\tList<Integer> subset = getRandomSubset(list);\n \t\tSystem.out.println(subset.toString());\n \t}\n\n}"
  },
  {
    "path": "Java/Ch 13. Java/Q13_08_Lambda_Random/QuestionB.java",
    "content": "package Q13_08_Lambda_Random;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\nimport java.util.stream.Collectors;\n\npublic class QuestionB {\t\n\tpublic static List<Integer> getRandomSubset(List<Integer> list) {\n\t\tRandom random = new Random();\n\t\tList<Integer> subset = list.stream().filter( k -> {\n\t\t\treturn random.nextBoolean(); /* Flip coin. */\n\t\t}).collect(Collectors.toList());\n\t\treturn subset;\n\t}\n\t\n \tpublic static void main(String... args) {\t\n \t\tList<Integer> list = new ArrayList<Integer>();\n \t\tlist.add(1);\n \t\tlist.add(2);\n \t\tlist.add(3);\n \t\tlist.add(4);\n \t\tList<Integer> subset = getRandomSubset(list);\n \t\tSystem.out.println(subset.toString());\n \t}\n\n}"
  },
  {
    "path": "Java/Ch 13. Java/Q13_08_Lambda_Random/QuestionC.java",
    "content": "package Q13_08_Lambda_Random;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\nimport java.util.function.Predicate;\nimport java.util.stream.Collectors;\n\npublic class QuestionC {\n\tpublic static Random random = new Random();\n\tpublic static Predicate<Object> flipCoin = o -> {\n\t\treturn random.nextBoolean();\n\t};\n\t\n\tpublic static List<Integer> getRandomSubset(List<Integer> list) {\n \t\tList<Integer> subset = list.stream().filter(flipCoin).\n \t\t\tcollect(Collectors.toList());\n \t\treturn subset;\n\t}\n\t\n \tpublic static void main(String... args) {\t\n \t\tList<Integer> list = new ArrayList<Integer>();\n \t\tlist.add(1);\n \t\tlist.add(2);\n \t\tlist.add(3);\n \t\tlist.add(4);\n \t\tList<Integer> subset = getRandomSubset(list);\n \t\tSystem.out.println(subset.toString());\n \t}\n\n}"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionA/ExampleA.java",
    "content": "package IntroductionA;\r\n\r\npublic class ExampleA {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tRunnableThreadExample instance = new RunnableThreadExample();\r\n\t\tThread thread = new Thread(instance);\r\n\t\tthread.start();\r\n\t\t\r\n\t\t/* waits until earlier thread counts to 5 (slowly) */\r\n\t\twhile (instance.count != 5) {\t\t\r\n\t\t\ttry {\r\n\t\t\t\tThread.sleep(250);\r\n\t\t\t} catch (InterruptedException exc) {\r\n\t\t\t\texc.printStackTrace();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tSystem.out.println(\"Program Terminating.\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionA/RunnableThreadExample.java",
    "content": "package IntroductionA;\r\n\r\npublic class RunnableThreadExample implements Runnable {\r\n\tpublic int count = 0;\r\n\r\n\tpublic void run() {\r\n\t\tSystem.out.println(\"RunnableThread starting.\");\r\n\t\ttry {\r\n\t\t\twhile (count < 5) {\r\n\t\t\t\tThread.sleep(500);\r\n\t\t\t\tSystem.out.println(\"RunnableThread count: \" + count);\r\n\t\t\t\tcount++;\r\n\t\t\t} \r\n\t\t} catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"RunnableThread interrupted.\");\r\n\t\t}\r\n\t\tSystem.out.println(\"RunnableThread terminating.\");\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionB/ExampleB.java",
    "content": "package IntroductionB;\r\n\r\npublic class ExampleB {\r\n\tpublic static void main(String args[]) {\r\n\t\tThreadExample instance = new ThreadExample();\r\n\t\tinstance.start();\r\n\t\t\r\n\t\twhile (instance.count != 5) {\t\t\r\n\t\t\ttry {\r\n\t\t\t\tThread.sleep(250);\r\n\t\t\t} catch (InterruptedException exc) {\r\n\t\t\t\texc.printStackTrace();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionB/ThreadExample.java",
    "content": "package IntroductionB;\r\n\r\npublic class ThreadExample extends Thread {\r\n\tint count = 0;\r\n\t\r\n\tpublic void run() {\r\n\t\tSystem.out.println(\"Thread starting.\");\r\n\t\ttry {\r\n\t\t\twhile (count < 5) {\r\n\t\t\t\tThread.sleep(500);\r\n\t\t\t\tSystem.out.println(\"In Thread, count is \" + count);\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t} catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Thread interrupted.\");\r\n\t\t}\r\n\t\tSystem.out.println(\"Thread terminating.\");\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionLocks/Intro.java",
    "content": "package IntroductionLocks;\r\n\r\npublic class Intro {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tNoLockATM noLockATM = new NoLockATM();\r\n\t\tLockedATM lockedATM = new LockedATM();\r\n\t\tMyClass thread1 = new MyClass(noLockATM, lockedATM);\r\n\t\tMyClass thread2 = new MyClass(noLockATM, lockedATM);\r\n\t\t\r\n\t\tthread1.start();\r\n\t\tthread2.start();\r\n\t\t\r\n\t\ttry {\r\n\t\t\tThread.sleep(1000);\r\n\t\t} catch (InterruptedException e) {\r\n\t\t\t// TODO Auto-generated catch block\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\tthread1.waitUntilDone();\r\n\t\tthread2.waitUntilDone();\r\n\t\t\r\n\t\tSystem.out.println(\"NoLock ATM: \" + noLockATM.getBalance());\r\n\t\tSystem.out.println(\"Locked ATM: \" + lockedATM.getBalance());\r\n\t\tint v = thread1.delta + thread2.delta + 100;\r\n\t\tSystem.out.println(\"Should Be: \" + v);\r\n\t\tSystem.out.println(\"Program terminating.\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionLocks/LockedATM.java",
    "content": "package IntroductionLocks;\r\n\r\nimport java.util.concurrent.locks.Lock;\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\npublic class LockedATM {\r\n\tprivate Lock lock;\r\n\tprivate int balance = 100;\r\n\t\r\n\tpublic LockedATM() {\r\n\t\tlock = new ReentrantLock();\r\n\t}\r\n\t\r\n\tpublic int withdraw(int value) {\r\n\t\tlock.lock();\r\n\t\tint temp = balance;\r\n\t\ttry {\r\n\t\t\tThread.sleep(100);\r\n\t\t\ttemp = temp - value;\r\n\t\t\tThread.sleep(100);\r\n\t\t\tbalance = temp;\r\n\t\t} catch (InterruptedException e) {\t\t}\r\n\t\tlock.unlock();\r\n\t\treturn temp;\r\n\t}\r\n\t\r\n\tpublic int deposit(int value) {\r\n\t\tlock.lock();\r\n\t\tint temp = balance;\r\n\t\ttry {\r\n\t\t\tThread.sleep(100);\r\n\t\t\ttemp = temp + value;\r\n\t\t\tThread.sleep(100);\r\n\t\t\tbalance = temp;\r\n\t\t} catch (InterruptedException e) {\t\t}\r\n\t\tlock.unlock();\r\n\t\treturn temp;\r\n\t} \r\n\t\r\n\tpublic int getBalance() {\r\n\t\treturn balance;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionLocks/MyClass.java",
    "content": "package IntroductionLocks;\r\n\r\nimport java.util.concurrent.locks.Lock;\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class MyClass extends Thread  {\r\n\tprivate NoLockATM noLockATM;\r\n\tprivate LockedATM lockedATM;\r\n\tpublic int delta = 0;\r\n\t\r\n\tprivate Lock completionLock;\r\n\t\r\n\tpublic MyClass(NoLockATM atm1, LockedATM atm2) {\r\n\t\tnoLockATM = atm1;\r\n\t\tlockedATM = atm2;\r\n\t\tcompletionLock = new ReentrantLock();\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\tcompletionLock.lock();\r\n\t\tint[] operations = AssortedMethods.randomArray(20, -50, 50);\r\n\t\tfor (int op : operations) {\r\n\t\t\tdelta += op;\r\n\t\t\tif (op < 0) {\r\n\t\t\t\tint val = op * -1;\r\n\t\t\t\tnoLockATM.withdraw(val);\r\n\t\t\t\tlockedATM.withdraw(val);\r\n\t\t\t} else {\r\n\t\t\t\tnoLockATM.deposit(op);\r\n\t\t\t\tlockedATM.deposit(op);\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\tcompletionLock.unlock();\r\n\t}\r\n\t\r\n\tpublic void waitUntilDone() {\r\n\t\tcompletionLock.lock();\r\n\t\tcompletionLock.unlock();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionLocks/NoLockATM.java",
    "content": "package IntroductionLocks;\r\n\r\npublic class NoLockATM {\r\n\tprivate int balance = 100;\r\n\t\r\n\tpublic NoLockATM() {\r\n\t}\r\n\t\r\n\tpublic int withdraw(int value) {\r\n\t\tint temp = balance;\r\n\t\ttry {\r\n\t\t\tThread.sleep(300);\r\n\t\t\ttemp = temp - value;\r\n\t\t\tThread.sleep(300);\r\n\t\t\tbalance = temp;\r\n\t\t} catch (InterruptedException e) {\t\t}\r\n\t\treturn temp;\r\n\t}\r\n\t\r\n\tpublic int deposit(int value) {\r\n\t\tint temp = balance;\r\n\t\ttry {\r\n\t\t\tThread.sleep(300);\r\n\t\t\ttemp = temp + value;\r\n\t\t\tThread.sleep(300);\r\n\t\t\tbalance = temp;\r\n\t\t} catch (InterruptedException e) {\t\t}\r\n\t\treturn temp;\r\n\t} \r\n\t\r\n\tpublic int getBalance() {\r\n\t\treturn balance;\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionSynchronization/Intro.java",
    "content": "package IntroductionSynchronization;\r\n\r\npublic class Intro {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\ttry {\r\n\t\t\tMyObject obj1 = new MyObject();\r\n\t\t\tMyObject obj2 = new MyObject();\r\n\t\t\tMyClass thread1 = new MyClass(obj1, \"1\");\r\n\t\t\tMyClass thread2 = new MyClass(obj2, \"2\");\r\n\t\t\t\r\n\t\t\tthread1.start();\r\n\t\t\tthread2.start();\r\n\t\t\t\r\n\t\t\tThread.sleep(3000 * 3);\r\n\t\t}  catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Program Interrupted.\");\r\n\t\t}\r\n\t\tSystem.out.println(\"Program terminating.\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionSynchronization/MyClass.java",
    "content": "package IntroductionSynchronization;\r\n\r\npublic class MyClass extends Thread  {\r\n\tprivate String name;\r\n\tprivate MyObject myObj;\r\n\t\r\n\tpublic MyClass(MyObject obj, String n) {\r\n\t\tname = n;\r\n\t\tmyObj = obj;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\tif (name.equals(\"1\")) {\r\n\t\t\tMyObject.foo(name);\r\n\t\t} else if (name.equals(\"2\")) {\r\n\t\t\tMyObject.bar(name);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionSynchronization/MyObject.java",
    "content": "package IntroductionSynchronization;\r\n\r\npublic class MyObject {\r\n\tpublic static synchronized void foo(String name) {\r\n\t\ttry {\r\n\t\t\tSystem.out.println(\"Thread \" + name + \".foo(): starting\");\r\n\t\t\tThread.sleep(3000);\r\n\t\t\tSystem.out.println(\"Thread \" + name + \".foo(): ending\");\r\n\t\t} catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Thread \" + name + \": interrupted.\");\r\n\t\t}\r\n\t} \r\n\t\r\n\tpublic static synchronized void bar(String name) {\r\n\t\ttry {\r\n\t\t\tSystem.out.println(\"Thread \" + name + \".bar(): starting\");\r\n\t\t\tThread.sleep(3000);\r\n\t\t\tSystem.out.println(\"Thread \" + name + \".bar(): ending\");\r\n\t\t} catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Thread \" + name + \": interrupted.\");\r\n\t\t}\r\n\t} \t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionSynchronizedBlocks/Intro.java",
    "content": "package IntroductionSynchronizedBlocks;\r\n\r\npublic class Intro {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\ttry {\r\n\t\t\tMyObject obj1 = new MyObject();\r\n\t\t\tMyObject obj2 = new MyObject();\r\n\t\t\t\r\n\t\t\tMyClass thread1 = new MyClass(obj1, \"1\");\r\n\t\t\tMyClass thread2 = new MyClass(obj1, \"2\");\r\n\t\t\t\r\n\t\t\tthread1.start();\r\n\t\t\tthread2.start();\r\n\t\t\t\r\n\t\t\tThread.sleep(3000 * 3);\r\n\t\t}  catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Program Interrupted.\");\r\n\t\t}\r\n\t\tSystem.out.println(\"Program terminating.\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionSynchronizedBlocks/MyClass.java",
    "content": "package IntroductionSynchronizedBlocks;\r\n\r\npublic class MyClass extends Thread  {\r\n\tprivate String name;\r\n\tprivate MyObject myObj;\r\n\t\r\n\tpublic MyClass(MyObject obj, String n) {\r\n\t\tname = n;\r\n\t\tmyObj = obj;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\tmyObj.foo(name);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionSynchronizedBlocks/MyObject.java",
    "content": "package IntroductionSynchronizedBlocks;\r\n\r\npublic class MyObject {\r\n\tpublic void foo(String name) {\r\n\t\tsynchronized(this) {\r\n\t\t\ttry {\r\n\t\t\t\tSystem.out.println(\"Thread \" + name + \".foo(): starting\");\r\n\t\t\t\tThread.sleep(3000);\r\n\t\t\t\tSystem.out.println(\"Thread \" + name + \".foo(): ending\");\r\n\t\t\t} catch (InterruptedException exc) {\r\n\t\t\t\tSystem.out.println(\"Thread \" + name + \": interrupted.\");\r\n\t\t\t}\r\n\t\t}\r\n\t} \t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionWaitNotify/Intro.java",
    "content": "package IntroductionWaitNotify;\r\n\r\npublic class Intro {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\ttry {\r\n\t\t\tMyObject obj1 = new MyObject();\r\n\t\t\tMyObject obj2 = new MyObject();\r\n\t\t\tMyClass thread1 = new MyClass(obj1, \"1\");\r\n\t\t\tMyClass thread2 = new MyClass(obj1, \"2\");\r\n\t\t\t\r\n\t\t\tthread1.start();\r\n\t\t\tthread2.start();\r\n\t\t\t\r\n\t\t\tThread.sleep(3000 * 3);\r\n\t\t}  catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Program Interrupted.\");\r\n\t\t}\r\n\t\tSystem.out.println(\"Program terminating.\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionWaitNotify/MyClass.java",
    "content": "package IntroductionWaitNotify;\r\n\r\npublic class MyClass extends Thread  {\r\n\tprivate String name;\r\n\tprivate MyObject myObj;\r\n\t\r\n\tpublic MyClass(MyObject obj, String n) {\r\n\t\tname = n;\r\n\t\tmyObj = obj;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\ttry {\r\n\t\t\tmyObj.wait(1000);\r\n\t\t\tmyObj.foo(name);\r\n\t\t\tmyObj.notify();\t\t\t\r\n\t\t} catch (InterruptedException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/IntroductionWaitNotify/MyObject.java",
    "content": "package IntroductionWaitNotify;\r\n\r\npublic class MyObject {\r\n\tpublic void foo(String name) {\r\n\t\ttry {\r\n\t\t\tSystem.out.println(\"Thread \" + name + \".foo(): starting\");\r\n\t\t\tThread.sleep(3000);\r\n\t\t\tSystem.out.println(\"Thread \" + name + \".foo(): ending\");\r\n\t\t} catch (InterruptedException exc) {\r\n\t\t\tSystem.out.println(\"Thread \" + name + \": interrupted.\");\r\n\t\t}\r\n\t} \t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_03_Dining_Philosophers/QuestionA/Chopstick.java",
    "content": "package Q15_03_Dining_Philosophers.QuestionA;\r\n\r\nimport java.util.concurrent.locks.Lock;\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\npublic class Chopstick {\r\n\tprivate Lock lock;\r\n\t\r\n\tpublic Chopstick() {\r\n\t\tlock = new ReentrantLock();\r\n\t}\r\n\r\n\tpublic boolean pickUp() {\r\n\t\treturn lock.tryLock();\r\n\t}\r\n\t\r\n\tpublic void putDown() {\r\n\t\tlock.unlock();\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_03_Dining_Philosophers/QuestionA/Philosopher.java",
    "content": "package Q15_03_Dining_Philosophers.QuestionA;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Philosopher extends Thread {\r\n\tprivate final int maxPause = 100;\r\n\tprivate int bites = 10;\r\n\t\r\n\tprivate Chopstick left;\r\n\tprivate Chopstick right;\r\n\tprivate int index;\r\n\tpublic Philosopher(int i, Chopstick left, Chopstick right) {\r\n\t\tindex = i;\r\n\t\tthis.left = left;\r\n\t\tthis.right = right;\r\n\t}\r\n\t\r\n\tpublic void eat() {\r\n\t\tSystem.out.println(\"Philosopher \" + index + \": start eating\");\r\n\t\tif (pickUp()) {\r\n\t\t\tchew();\r\n\t\t\tputDown();\r\n\t\t\tSystem.out.println(\"Philosopher \" + index + \": done eating\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"Philosopher \" + index + \": gave up on eating\");\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic boolean pickUp() {\r\n\t\tpause();\r\n\t\tif (!left.pickUp()) {\r\n\t\t\treturn false;\r\n\t\t} \r\n\t\tpause();\r\n\t\tif (!right.pickUp()) {\r\n\t\t\tleft.putDown();\r\n\t\t\treturn false;\r\n\t\t} \r\n\t\tpause();\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic void chew() {\r\n\t\tSystem.out.println(\"Philosopher \" + index + \": eating\");\r\n\t\tpause();\r\n\t}\r\n\t\r\n\tpublic void pause() {\r\n\t\ttry {\r\n\t\t\tint pause = AssortedMethods.randomIntInRange(0, maxPause);\r\n\t\t\tThread.sleep(pause);\r\n\t\t} catch (InterruptedException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void putDown() {\r\n\t\tright.putDown();\r\n\t\tleft.putDown();\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\tfor (int i = 0; i < bites; i++) {\r\n\t\t\teat();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_03_Dining_Philosophers/QuestionA/Question.java",
    "content": "package Q15_03_Dining_Philosophers.QuestionA;\r\n\r\npublic class Question {\r\n\tpublic static int size = 3;\r\n\t\r\n\tpublic static int leftOf(int i) {\r\n\t\treturn i;\r\n\t}\r\n\t\r\n\tpublic static int rightOf(int i) {\r\n\t\treturn (i + 1) % size;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\t\t\r\n\t\tChopstick[] chopsticks = new Chopstick[size + 1];\r\n\t\tfor (int i = 0; i < size + 1; i++) {\r\n\t\t\tchopsticks[i] = new Chopstick();\r\n\t\t}\r\n\t\t\r\n\t\tPhilosopher[] philosophers = new Philosopher[size];\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tChopstick left = chopsticks[leftOf(i)];\r\n\t\t\tChopstick right = chopsticks[rightOf(i)];\r\n\t\t\tphilosophers[i] = new Philosopher(i, left, right);\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tphilosophers[i].start();\r\n\t\t}\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_03_Dining_Philosophers/QuestionB/Chopstick.java",
    "content": "package Q15_03_Dining_Philosophers.QuestionB;\r\n\r\nimport java.util.concurrent.locks.Lock;\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\npublic class Chopstick {\r\n\tprivate Lock lock;\r\n\tprivate int number;\r\n\t\r\n\tpublic Chopstick(int n) {\r\n\t\tlock = new ReentrantLock();\r\n\t\tthis.number = n;\r\n\t}\r\n\r\n\tpublic void pickUp() {\r\n\t\tlock.lock();\r\n\t}\r\n\t\r\n\tpublic void putDown() {\r\n\t\tlock.unlock();\t\r\n\t}\r\n\t\r\n\tpublic int getNumber() {\r\n\t\treturn number;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_03_Dining_Philosophers/QuestionB/Philosopher.java",
    "content": "package Q15_03_Dining_Philosophers.QuestionB;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Philosopher extends Thread {\r\n\tprivate final int maxPause = 100;\r\n\tprivate int bites = 10;\r\n\t\r\n\tprivate Chopstick lower;\r\n\tprivate Chopstick higher;\r\n\tprivate int index;\r\n\tpublic Philosopher(int i, Chopstick left, Chopstick right) {\r\n\t\tindex = i;\r\n\t\tif (left.getNumber() < right.getNumber()) {\r\n\t\t\tthis.lower = left;\r\n\t\t\tthis.higher = right;\r\n\t\t} else {\r\n\t\t\tthis.lower = right;\r\n\t\t\tthis.higher = left;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void eat() {\r\n\t\tSystem.out.println(\"Philosopher \" + index + \": start eating\");\r\n\t\tpickUp();\r\n\t\tchew();\r\n\t\tputDown();\r\n\t\tSystem.out.println(\"Philosopher \" + index + \": done eating\");\r\n\t}\r\n\t\r\n\tpublic void pickUp() {\r\n\t\tpause();\r\n\t\tlower.pickUp();\r\n\t\tpause();\r\n\t\thigher.pickUp();\r\n\t\tpause();\r\n\t}\r\n\t\r\n\tpublic void chew() {\r\n\t\tSystem.out.println(\"Philosopher \" + index + \": eating\");\r\n\t\tpause();\r\n\t}\r\n\t\r\n\tpublic void pause() {\r\n\t\ttry {\r\n\t\t\tint pause = AssortedMethods.randomIntInRange(0, maxPause);\r\n\t\t\tThread.sleep(pause);\r\n\t\t} catch (InterruptedException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void putDown() {\r\n\t\thigher.putDown();\r\n\t\tlower.putDown();\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\tfor (int i = 0; i < bites; i++) {\r\n\t\t\teat();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_03_Dining_Philosophers/QuestionB/Question.java",
    "content": "package Q15_03_Dining_Philosophers.QuestionB;\r\n\r\npublic class Question {\r\n\tpublic static int size = 3;\r\n\t\r\n\tpublic static int leftOf(int i) {\r\n\t\treturn i;\r\n\t}\r\n\t\r\n\tpublic static int rightOf(int i) {\r\n\t\treturn (i + 1) % size;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\t\t\r\n\t\tChopstick[] chopsticks = new Chopstick[size + 1];\r\n\t\tfor (int i = 0; i < size + 1; i++) {\r\n\t\t\tchopsticks[i] = new Chopstick(i);\r\n\t\t}\r\n\t\t\r\n\t\tPhilosopher[] philosophers = new Philosopher[size];\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tChopstick left = chopsticks[leftOf(i)];\r\n\t\t\tChopstick right = chopsticks[rightOf(i)];\r\n\t\t\tphilosophers[i] = new Philosopher(i, left, right);\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tphilosophers[i].start();\r\n\t\t}\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_04_Deadlock_Free_Class/LockFactory.java",
    "content": "package Q15_04_Deadlock_Free_Class;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.LinkedList;\r\nimport java.util.concurrent.locks.Lock;\r\n\r\npublic class LockFactory {\r\n\tprivate static LockFactory instance;\r\n\t\r\n\tprivate int numberOfLocks = 5; /* default */\r\n\tprivate LockNode[] locks;\r\n\t\r\n\t/* Maps from a process or owner to the order that the owner claimed it would call the locks in */\r\n\tprivate HashMap<Integer, LinkedList<LockNode>> lockOrder;\r\n\t\r\n\tprivate LockFactory(int count) {\r\n\t\tnumberOfLocks = count;\r\n\t\tlocks = new LockNode[numberOfLocks];\r\n\t\tlockOrder = new HashMap<Integer, LinkedList<LockNode>>();\r\n\t\tfor (int i = 0; i < numberOfLocks; i++) {\r\n\t\t\tlocks[i] = new LockNode(i, count);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static LockFactory getInstance() {\r\n\t\treturn instance;\r\n\t}\r\n\t\r\n\tpublic static LockFactory initialize(int count) {\r\n\t\tif (instance == null) {\r\n\t\t\tinstance = new LockFactory(count);\r\n\t\t}\r\n\t\treturn instance;\r\n\t}\r\n\t\r\n\tpublic boolean hasCycle(HashMap<Integer, Boolean> touchedNodes, int[] resourcesInOrder) {\r\n\t\t/* check for a cycle */\r\n\t\tfor (int resource : resourcesInOrder) {\r\n\t\t\tif (touchedNodes.get(resource) == false) {\r\n\t\t\t\tLockNode n = locks[resource];\r\n\t\t\t\tif (n.hasCycle(touchedNodes)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/* To prevent deadlocks, force the processes to declare upfront what order they will\r\n\t * need the locks in. Verify that this order does not create a deadlock (a cycle in a directed graph)\r\n\t */\r\n\tpublic boolean declare(int ownerId, int[] resourcesInOrder) {\r\n\t\tHashMap<Integer, Boolean> touchedNodes = new HashMap<Integer, Boolean>();\r\n\t\t\r\n\t\t/* add nodes to graph */\r\n\t\tint index = 1;\r\n\t\ttouchedNodes.put(resourcesInOrder[0], false);\r\n\t\tfor (index = 1; index < resourcesInOrder.length; index++) {\r\n\t\t\tLockNode prev = locks[resourcesInOrder[index - 1]];\r\n\t\t\tLockNode curr = locks[resourcesInOrder[index]];\r\n\t\t\tprev.joinTo(curr);\r\n\t\t\ttouchedNodes.put(resourcesInOrder[index], false);\r\n\t\t}\r\n\t\t\r\n\t\t/* if we created a cycle, destroy this resource list and return false */\r\n\t\tif (hasCycle(touchedNodes, resourcesInOrder)) {\r\n\t\t\tfor (int j = 1; j < resourcesInOrder.length; j++) {\r\n\t\t\t\tLockNode p = locks[resourcesInOrder[j - 1]];\r\n\t\t\t\tLockNode c = locks[resourcesInOrder[j]];\r\n\t\t\t\tp.remove(c);\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\t/* No cycles detected. Save the order that was declared, so that we can verify that the\r\n\t\t * process is really calling the locks in the order it said it would. */\r\n\t\tLinkedList<LockNode> list = new LinkedList<LockNode>();\r\n\t\tfor (int i = 0; i < resourcesInOrder.length; i++) {\r\n\t\t\tLockNode resource = locks[resourcesInOrder[i]];\r\n\t\t\tlist.add(resource);\r\n\t\t}\r\n\t\tlockOrder.put(ownerId, list);\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t/* Get the lock, verifying first that the process is really calling the locks in the order\r\n\t * it said it would. */\r\n\tpublic Lock getLock(int ownerId, int resourceID) {\r\n\t\tLinkedList<LockNode> list = lockOrder.get(ownerId);\r\n\t\tif (list == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tLockNode head = list.getFirst();\r\n\t\tif (head.getId() == resourceID) {\r\n\t\t\tlist.removeFirst();\r\n\t\t\treturn head.getLock();\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_04_Deadlock_Free_Class/LockNode.java",
    "content": "package Q15_04_Deadlock_Free_Class;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.concurrent.locks.Lock;\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\npublic class LockNode {\r\n\tpublic enum VisitState {\r\n\t\tFRESH, VISITING, VISITED\r\n\t};\r\n\t\r\n\tprivate ArrayList<LockNode> children;\r\n\tprivate int lockId;\r\n\tprivate Lock lock;\r\n\tprivate int maxLocks;\r\n\t\r\n\tpublic LockNode(int id, int max) {\r\n\t\tlockId = id;\r\n\t\tchildren = new ArrayList<LockNode>();\r\n\t\tmaxLocks = max;\r\n\t}\r\n\t\r\n\t/* Join \"this\" to \"node\", checking to make sure that it doesn't create a cycle */\r\n\tpublic void joinTo(LockNode node) {\r\n\t\tchildren.add(node);\r\n\t}\r\n\t\r\n\tpublic void remove(LockNode node) {\r\n\t\tchildren.remove(node);\r\n\t}\r\n\t\r\n\t/* Check for a cycle by doing a depth-first-search. */\t\r\n\tpublic boolean hasCycle(HashMap<Integer, Boolean> touchedNodes) {\r\n\t\tVisitState[] visited = new VisitState[maxLocks];\r\n\t\tfor (int i = 0; i < maxLocks; i++) {\r\n\t\t\tvisited[i] = VisitState.FRESH;\r\n\t\t}\r\n\t\treturn hasCycle(visited, touchedNodes);\r\n\t}\r\n\t\r\n\tprivate boolean hasCycle(VisitState[] visited, HashMap<Integer, Boolean> touchedNodes) {\r\n\t\tif (touchedNodes.containsKey(lockId)) {\r\n\t\t\ttouchedNodes.put(lockId, true); \r\n\t\t}\r\n\t\t\r\n\t\tif (visited[lockId] == VisitState.VISITING) {\r\n\t\t\treturn true;\r\n\t\t} else if (visited[lockId] == VisitState.FRESH) {\r\n\t\t\tvisited[lockId] = VisitState.VISITING;\r\n\t\t\tfor (LockNode n : children) {\r\n\t\t\t\tif (n.hasCycle(visited, touchedNodes)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvisited[lockId] = VisitState.VISITED;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic Lock getLock() {\r\n\t\tif (lock == null) {\r\n\t\t\tlock = new ReentrantLock();\r\n\t\t}\r\n\t\treturn lock;\r\n\t}\r\n\t\r\n\tpublic int getId() {\r\n\t\treturn lockId;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_04_Deadlock_Free_Class/Question.java",
    "content": "package Q15_04_Deadlock_Free_Class;\r\n\r\npublic class Question {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] res1 = {1, 2, 3, 4};\r\n\t\tint[] res2 = {1, 5, 4, 1};\r\n\t\tint[] res3 = {1, 4, 5};\r\n\t\t\r\n\t\tLockFactory.initialize(10);\r\n\t\t\r\n\t\tLockFactory lf = LockFactory.getInstance();\r\n\t\tSystem.out.println(lf.declare(1, res1));\r\n\t\tSystem.out.println(lf.declare(2, res2));\r\n\t\tSystem.out.println(lf.declare(3, res3));\t\r\n\t\t\r\n\t\tSystem.out.println(lf.getLock(1, 1));\r\n\t\tSystem.out.println(lf.getLock(1, 2));\r\n\t\tSystem.out.println(lf.getLock(2, 4));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_05_Call_In_Order/Foo.java",
    "content": "package Q15_05_Call_In_Order;\r\n\r\nimport java.util.concurrent.Semaphore;\r\n\r\npublic class Foo {\r\n\tpublic int pauseTime = 1000;\r\n\tpublic Semaphore sem1;\r\n\tpublic Semaphore sem2;\r\n\t\r\n\tpublic Foo() {\t\r\n\t\ttry {\r\n\t\t\tsem1 = new Semaphore(1);\r\n\t\t\tsem2 = new Semaphore(1);\r\n\t\t\t\r\n\t\t\tsem1.acquire();\r\n\t\t\tsem2.acquire();\r\n\t\t} catch (InterruptedException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void first() {\r\n\t\ttry {\r\n\t\t\tSystem.out.println(\"Started Executing 1\");\r\n\t\t\tThread.sleep(pauseTime);\r\n\t\t\tSystem.out.println(\"Finished Executing 1\");\r\n\t\t\tsem1.release();\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void second() {\r\n\t\ttry {\r\n\t\t\tsem1.acquire();\r\n\t\t\tsem1.release();\r\n\t\t\tSystem.out.println(\"Started Executing 2\");\r\n\t\t\tThread.sleep(pauseTime);\r\n\t\t\tSystem.out.println(\"Finished Executing 2\");\r\n\t\t\tsem2.release();\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic void third() {\r\n\t\ttry {\r\n\t\t\tsem2.acquire();\r\n\t\t\tsem2.release();\r\n\t\t\tSystem.out.println(\"Started Executing 3\");\r\n\t\t\tThread.sleep(pauseTime);\r\n\t\t\tSystem.out.println(\"Finished Executing 3\");\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\t\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_05_Call_In_Order/FooBad.java",
    "content": "package Q15_05_Call_In_Order;\r\n\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\npublic class FooBad {\r\n\tpublic int pauseTime = 1000;\r\n\tpublic ReentrantLock lock1;\r\n\tpublic ReentrantLock lock2;\r\n\t\r\n\tpublic FooBad() {\t\r\n\t\ttry {\r\n\t\t\tlock1 = new ReentrantLock();\r\n\t\t\tlock2 = new ReentrantLock();\r\n\t\t\t\r\n\t\t\tlock1.lock();\r\n\t\t\tlock2.lock();\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void first() {\r\n\t\ttry {\r\n\t\t\tSystem.out.println(\"Started Executing 1\");\r\n\t\t\tThread.sleep(pauseTime);\r\n\t\t\tSystem.out.println(\"Finished Executing 1\");\r\n\t\t\tlock1.unlock();\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void second() {\r\n\t\ttry {\r\n\t\t\tlock1.lock();\r\n\t\t\tlock1.unlock();\r\n\t\t\tSystem.out.println(\"Started Executing 2\");\r\n\t\t\tThread.sleep(pauseTime);\r\n\t\t\tSystem.out.println(\"Finished Executing 2\");\r\n\t\t\tlock2.unlock();\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic void third() {\r\n\t\ttry {\r\n\t\t\tlock2.lock();\r\n\t\t\tlock2.unlock();\r\n\t\t\tSystem.out.println(\"Started Executing 3\");\r\n\t\t\tThread.sleep(pauseTime);\r\n\t\t\tSystem.out.println(\"Finished Executing 3\");\r\n\t\t} catch (Exception ex) {\r\n\t\t\tex.printStackTrace();\r\n\t\t}\r\n\t}\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_05_Call_In_Order/MyThread.java",
    "content": "package Q15_05_Call_In_Order;\r\n\r\npublic class MyThread extends Thread {\r\n\tprivate String method;\r\n\tprivate FooBad foo;\r\n\t\r\n\tpublic MyThread(FooBad foo, String method) {\r\n\t\tthis.method = method;\r\n\t\tthis.foo = foo;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\tif (method == \"first\") {\r\n\t\t\tfoo.first();\r\n\t\t} else if (method == \"second\") {\r\n\t\t\tfoo.second();\r\n\t\t} else if (method == \"third\") {\r\n\t\t\tfoo.third();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_05_Call_In_Order/Question.java",
    "content": "package Q15_05_Call_In_Order;\r\n\r\npublic class Question {\r\n\tpublic static void main(String[] args) {\r\n\t\tFooBad foo = new FooBad();\r\n\t\t\r\n\t\tMyThread thread1 = new MyThread(foo, \"first\");\r\n\t\tMyThread thread2 = new MyThread(foo, \"second\");\r\n\t\tMyThread thread3 = new MyThread(foo, \"third\");\r\n\t\t\r\n\t\tthread3.start();\r\n\t\tthread2.start();\r\n\t\tthread1.start();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_06_Synchronized_Methods/Foo.java",
    "content": "package Q15_06_Synchronized_Methods;\n\npublic class Foo {\n\tprivate String name;\n\t\n\tpublic Foo(String nm) {\n\t\tname = nm;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic void pause() {\n\t\ttry {\n\t\t\tThread.sleep(1000 * 3);\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\t\n\t\n\tpublic synchronized void methodA(String threadName) {\n\t\tSystem.out.println(\"thread \" + threadName + \" starting: \" + name + \".methodA()\");\n\t\tpause();\n\t\tSystem.out.println(\"thread \" + threadName + \" ending: \" + name + \".methodA()\");\n\t}\n\t\n\tpublic void methodB(String threadName) {\n\t\tSystem.out.println(\"thread \" + threadName + \" starting: \" + name + \".methodB()\");\n\t\tpause();\n\t\tSystem.out.println(\"thread \" + threadName + \" ending: \" + name + \".methodB()\");\n\t}\t\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_06_Synchronized_Methods/MyThread.java",
    "content": "package Q15_06_Synchronized_Methods;\n\npublic class MyThread extends Thread {\n\tprivate Foo foo;\n\tpublic String name;\n\tpublic String firstMethod;\n\tpublic MyThread(Foo f, String nm, String fM) {\n\t\tfoo = f;\n\t\tname = nm;\n\t\tfirstMethod = fM;\n\t}\n\t\n\tpublic void run() {\n\t\tif (firstMethod.equals(\"A\")) {\n\t\t\tfoo.methodA(name);\n\t\t} else {\n\t\t\tfoo.methodB(name);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_06_Synchronized_Methods/Question.java",
    "content": "package Q15_06_Synchronized_Methods;\n\npublic class Question {\n\n\t/**\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\t/* Part 1 Demo -- same instance */\n\t\tSystem.out.println(\"Part 1 Demo with same instance.\");\n\t\tFoo fooA = new Foo(\"ObjectOne\");\n\t\tMyThread thread1a = new MyThread(fooA, \"Dog\", \"A\");\n\t\tMyThread thread2a = new MyThread(fooA, \"Cat\", \"A\");\n\t\tthread1a.start();\n\t\tthread2a.start();\n\t\twhile (thread1a.isAlive() || thread2a.isAlive()) { };\n\t\tSystem.out.println(\"\\n\\n\");\n\t\t\n\t\t/* Part 1 Demo -- difference instances */\n\t\tSystem.out.println(\"Part 1 Demo with different instances.\");\n\t\tFoo fooB1 = new Foo(\"ObjectOne\");\n\t\tFoo fooB2 = new Foo(\"ObjectTwo\");\n\t\tMyThread thread1b = new MyThread(fooB1, \"Dog\", \"A\");\n\t\tMyThread thread2b = new MyThread(fooB2, \"Cat\", \"A\");\n\t\tthread1b.start();\n\t\tthread2b.start();\n\t\twhile (thread1b.isAlive() || thread2b.isAlive()) { };\n\t\tSystem.out.println(\"\\n\\n\");\n\t\t\n\t\t/* Part 2 Demo */\n\t\tSystem.out.println(\"Part 2 Demo.\");\n\t\tFoo fooC = new Foo(\"ObjectOne\");\n\t\tMyThread thread1c = new MyThread(fooC, \"Dog\", \"A\");\n\t\tMyThread thread2c = new MyThread(fooC, \"Cat\", \"B\");\n\t\tthread1c.start();\n\t\tthread2c.start();\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_07_FizzBuzz/FBThread.java",
    "content": "package Q15_07_FizzBuzz;\n\nimport java.util.function.Function;\nimport java.util.function.Predicate;\n\npublic class FBThread extends Thread {\n\tprivate static Object lock = new Object();\n\tprotected static int current = 1;\n\tprivate int max;\n\tprivate Predicate<Integer> validate;\n\tprivate Function<Integer, String> printer;\n\tint x = 1;\n\t\n\tpublic FBThread(Predicate<Integer> validate, Function<Integer, String> printer, int max) {\n\t\tthis.validate = validate;\n\t\tthis.printer = printer;\n\t\tthis.max = max;\n\t}\n\t\n\tpublic void run() {\n\t\twhile (true) {\n\t\t\tsynchronized (lock) {\n\t\t\t\tif (current > max) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (validate.test(current)) {\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tSystem.out.println(printer.apply(current));\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_07_FizzBuzz/FizzBuzzThread.java",
    "content": "package Q15_07_FizzBuzz;\n\npublic class FizzBuzzThread extends Thread {\n\tprivate static Object lock = new Object();\n\tprotected static int current = 1;\n\tprivate int max;\n\tprivate boolean div3, div5;\n\tprivate String toPrint;\n\t\n\tpublic FizzBuzzThread(boolean div3, boolean div5, int max, String toPrint) {\n\t\tthis.div3 = div3;\n\t\tthis.div5 = div5;\n\t\tthis.max = max;\n\t\tthis.toPrint = toPrint;\n\t}\n\t\n\tpublic void print() {\n\t\tSystem.out.println(toPrint);\n\t}\n\t\n\tpublic void run() {\n\t\twhile (true) {\n\t\t\tsynchronized (lock) {\n\t\t\t\tif (current > max) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ((current % 3 == 0) == div3 && (current % 5 == 0) == div5) {\n\t\t\t\t\tprint();\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_07_FizzBuzz/NumberThread.java",
    "content": "package Q15_07_FizzBuzz;\n\npublic class NumberThread extends FizzBuzzThread {\n\tpublic NumberThread(boolean div3, boolean div5, int max) {\n\t\tsuper(div3, div5, max, null);\n\t}\n\n\tpublic void print() {\n\t\tSystem.out.println(current);\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_07_FizzBuzz/QuestionA.java",
    "content": "package Q15_07_FizzBuzz;\n\npublic class QuestionA {\n\n\tpublic static void fizzbuzz(int n) {\n\t\tfor (int i = 1; i <= n; i++) {\n\t\t\tif (i % 3 == 0 && i % 5 == 0) {\n\t\t\t\tSystem.out.println(\"FizzBuzz\");\n\t\t\t} else if (i % 3 == 0) {\n\t\t\t\tSystem.out.println(\"Fizz\");\n\t\t\t} else if (i % 5 == 0) {\n\t\t\t\tSystem.out.println(\"Buzz\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(i);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tfizzbuzz(100);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_07_FizzBuzz/QuestionB.java",
    "content": "package Q15_07_FizzBuzz;\n\npublic class QuestionB {\n\n\tpublic static void main(String[] args) {\n\t\tint n = 100;\n\t\tThread[] threads = {new FizzBuzzThread(true, true, n, \"FizzBuzz\"), \n\t\t\t\t\t\t\tnew FizzBuzzThread(true, false, n, \"Fizz\"), \n\t\t\t\t\t\t\tnew FizzBuzzThread(false, true, n, \"Buzz\"),\n\t\t\t\t\t\t\tnew NumberThread(false, false, n)};\n\t\tfor (Thread thread : threads) {\n\t\t\tthread.start();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 15. Threads and Locks/Q15_07_FizzBuzz/QuestionC.java",
    "content": "package Q15_07_FizzBuzz;\n\npublic class QuestionC {\n\n\tpublic static void main(String[] args) {\n\t\tint n = 100;\n\t\tThread[] threads = {new FBThread(i -> i % 3 == 0 && i % 5 == 0, i -> \"FizzBuzz\", n), \n\t\t\t\t\t\t\tnew FBThread(i -> i % 3 == 0 && i % 5 != 0, i -> \"Fizz\", n),\n\t\t\t\t\t\t\tnew FBThread(i -> i % 3 != 0 && i % 5 == 0, i -> \"Buzz\", n),\n\t\t\t\t\t\t\tnew FBThread(i -> i % 3 != 0 && i % 5 != 0, i -> Integer.toString(i), n)};\n\t\tfor (Thread thread : threads) {\n\t\t\tthread.start();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_01_Number_Swapper/Question.java",
    "content": "package Q16_01_Number_Swapper;\r\n\r\npublic class Question {\r\n\r\n\tpublic static void swap(int a, int b) {\r\n\t\t// Example for a = 9, b = 4\r\n\t\ta = a - b; // a = 9 - 4 = 5\r\n\t\tb = a + b; // b = 5 + 4 = 9\r\n\t\ta = b - a; // a = 9 - 5\r\n\t\t\r\n\t\tSystem.out.println(\"a: \" + a);\r\n\t\tSystem.out.println(\"b: \" + b);\r\n\t}\r\n\t\r\n\tpublic static void swap_opt(int a, int b) {\r\n\t\ta = a^b; \r\n\t\tb = a^b; \r\n\t\ta = a^b; \r\n\t\t\r\n\t\tSystem.out.println(\"a: \" + a);\r\n\t\tSystem.out.println(\"b: \" + b);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = 1672;\r\n\t\tint b = 9332;\r\n\t\t\r\n\t\tSystem.out.println(\"a: \" + a);\r\n\t\tSystem.out.println(\"b: \" + b);\r\n\t\t\r\n\t\tswap(a, b);\r\n\t\tswap_opt(a, b);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_02_Word_Frequencies/QuestionA.java",
    "content": "package Q16_02_Word_Frequencies;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\tpublic static int getFrequency(String[] book, String word) {\r\n\t\tword = word.trim().toLowerCase();\r\n\t\tint count = 0;\r\n\t\tfor (String w : book) {\r\n\t\t\tif (w.trim().toLowerCase().equals(word)) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] wordlist = AssortedMethods.getLongTextBlobAsStringList();\r\n\t\t\r\n\t\tString[] words = {\"the\", \"Lara\", \"and\", \"outcropping\", \"career\", \"it\"};\r\n\t\tfor (String word : words) {\r\n\t\t\tSystem.out.println(word + \": \" + getFrequency(wordlist, word));\r\n\t\t}\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_02_Word_Frequencies/QuestionB.java",
    "content": "package Q16_02_Word_Frequencies;\r\n\r\nimport java.util.*;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\tpublic static HashMap<String, Integer> setupDictionary(String[] book) {\r\n\t\tHashMap<String, Integer> table = new HashMap<String, Integer>();\r\n\t\tfor (String word : book) {\r\n\t\t\tword = word.toLowerCase();\r\n\t\t\tif (word.trim() != \"\") {\r\n\t\t\t\tif (!table.containsKey(word)) {\r\n\t\t\t\t\ttable.put(word, 0);\r\n\t\t\t\t}\r\n\t\t\t\ttable.put(word, table.get(word) + 1);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn table;\r\n\t}\r\n\tpublic static int getFrequency(HashMap<String, Integer> table, String word) {\r\n\t\tif (table == null || word == null) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tword = word.toLowerCase();\r\n\t\tif (table.containsKey(word)) {\r\n\t\t\treturn table.get(word);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] wordlist = AssortedMethods.getLongTextBlobAsStringList();\r\n\t\tHashMap<String, Integer> dictionary = setupDictionary(wordlist);\r\n\t\t\r\n\t\tString[] words = {\"the\", \"Lara\", \"and\", \"outcropping\", \"career\", \"it\"};\r\n\t\tfor (String word : words) {\r\n\t\t\tSystem.out.println(word + \": \" + getFrequency(dictionary, word));\r\n\t\t}\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_03_Intersection/Line.java",
    "content": "package Q16_03_Intersection;\r\n\r\n\r\npublic class Line {\r\n\tpublic double slope, yintercept;\r\n\tpublic Point start, end;\r\n\t\r\n\tpublic Line(Point start, Point end) {\r\n\t\tthis.start = start;\r\n\t\tthis.end = end;\r\n\t\tif (start.x == end.x) {\r\n\t\t\tslope = Double.POSITIVE_INFINITY;\r\n\t\t\tyintercept = Double.POSITIVE_INFINITY;\r\n\t\t} else {\r\n\t\t\tslope = (end.y - start.y) / (end.x - start.x); \r\n\t\t\tyintercept = end.y - slope * end.x;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic boolean isVertical() {\r\n\t\treturn slope == Double.POSITIVE_INFINITY;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Line [slope=\" + slope + \", yintercept=\" + yintercept + \", start=\" + start + \", end=\" + end + \"]\";\r\n\t}\r\n\r\n\tpublic double getYFromX(double x) {\r\n\t\tif (isVertical()) {\r\n\t\t\treturn Double.POSITIVE_INFINITY;\r\n\t\t}\r\n\t\treturn slope * x + yintercept;\r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_03_Intersection/Point.java",
    "content": "package Q16_03_Intersection;\n\npublic class Point {\n\tpublic double x, y;\n\tpublic Point(double x, double y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Point [x=\" + x + \", y=\" + y + \"]\";\n\t} \n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_03_Intersection/Question.java",
    "content": "package Q16_03_Intersection;\r\n\r\npublic class Question {\r\n\r\n\t/* Checks if middle is between start and end. */\r\n\tpublic static boolean isBetween(double start, double middle, double end) {\r\n\t\tif (start > end) {\r\n\t\t\treturn end <= middle && middle <= start;\r\n\t\t} else {\r\n\t\t\treturn start <= middle && middle <= end;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Checks if middle is between start and end. */\r\n\tpublic static boolean isBetween(Point start, Point middle, Point end) {\r\n\t\treturn isBetween(start.x, middle.x, end.x) && isBetween(start.y, middle.y, end.y);\r\n\t}\r\n\r\n\tpublic static Point intersection(Point start1, Point end1, Point start2, Point end2) {\t\r\n\t\t/* Compute lines (including slope and y-intercept). */\r\n\t\tLine line1 = new Line(start1, end1);\r\n\t\tLine line2 = new Line(start2, end2);\r\n\r\n\t\t/* If the lines are parallel, then their extended lines must have same y-intercept.\r\n\t\t * If so, check that the start or end of one point is on the other line. */\r\n\t\tif (line1.slope == line2.slope) {\r\n\t\t\tif (line1.yintercept != line2.yintercept) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\t/* Check if the start or end of one line is in the other. If so, return that point*/\r\n\t\t\tif (isBetween(start1, start2, end1)) return start2;\r\n\t\t\telse if (isBetween(start1, end2, end1)) return end2;\r\n\t\t\telse if (isBetween(start2, start1, end2)) return start1;\r\n\t\t\telse if (isBetween(start2, end1, end2)) return end1; \t\t\t\t\t\r\n\t\t\telse return null;\t\t\t\r\n\t\t}\r\n\r\n\t\t/* Compute the intersection of the infinite lines, and then check if this falls within the\r\n\t\t * boundary of the line segments. Note that at most one line is vertical. */\r\n\r\n\t\t/* Get intersection's x coordinate. If one is vertical, always use its x coordinate. \r\n\t\t * Otherwise, compute the intersection's x coordinate based on setting each line's y = mx + b equation\r\n\t\t * equal and solving for x. */\r\n\t\tdouble x;\r\n\t\tif (line1.isVertical() || line2.isVertical()) { /* If a line is vertical, use its x coordinate. */\r\n\t\t\tx = line1.isVertical() ? line1.start.x : line2.start.x;\r\n\t\t} else { /* Set y = mx + b equations equal and solve for x */\r\n\t\t\tx =  (line2.yintercept - line1.yintercept) / (line1.slope - line2.slope);\r\n\t\t}\r\n\r\n\t\t/* Get insection's y coordinate using a non-vertical line. Note that if line1 is vertical\r\n\t\t * then line 2 is not vertical (else it would have been caught earlier). */\r\n\t\tdouble y = line1.isVertical() ? line2.getYFromX(x) : line1.getYFromX(x);\r\n\r\n\t\t/* We now have the intersection of the infinite lines. Check if it's within the boundaries\r\n\t\t * of each line segment. */\r\n\t\tPoint intersection = new Point(x, y);\r\n\t\tif (isBetween(start1, intersection, end1) && isBetween(start2, intersection, end2)) {\r\n\t\t\treturn intersection;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\tPoint s1 = new Point(2147000000, 1);\r\n\t\tPoint e1 = new Point(-2147000000, -1);\r\n\t\tPoint s2 = new Point(-10, 0);\r\n\t\tPoint e2 = new Point(0, 0);\r\n\t\tPoint intersection = intersection(s1, e1, s2, e2);\r\n\t\tSystem.out.println(\"Line Segment 1: \" + s1 + \" to \" + e1);\r\n\t\tSystem.out.println(\"Line Segment 2: \" + s2 + \" to \" + e2);\r\n\t\tSystem.out.println(\"Intersection: \" + (intersection == null ? \"None\" : intersection));\r\n\t\tif (intersection != null) {\r\n\t\t\tSystem.out.println(\"Intersection is on segment1: \" + Tester.checkIfPointOnLineSegments(s1, intersection, e1));\r\n\t\t\tSystem.out.println(\"Intersection is on segment1: \" + Tester.checkIfPointOnLineSegments(s2, intersection, e2));\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_03_Intersection/Tester.java",
    "content": "package Q16_03_Intersection;\n\nimport java.util.ArrayList;\n\npublic class Tester {\n\n\tpublic static boolean equalish(double a, double b) {\n\t\treturn Math.abs(a - b) < .001;\n\t}\n\n\tpublic static boolean checkIfPointOnLineSegments(Point start, Point middle, Point end) {\n\t\tif (equalish(start.x, middle.x) && equalish(start.y, middle.y)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (equalish(middle.x, end.x) && equalish(middle.y, end.y)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (start.x == end.x) { // Vertical\n\t\t\tif (equalish(start.x, middle.x)) {\n\t\t\t\treturn Question.isBetween(start, middle, end); \n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tLine line = new Line(start, end);\n\t\tdouble x = middle.x;\n\t\tdouble y = line.slope * x + line.yintercept;\n\t\tif (equalish(y, middle.y)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static ArrayList<Point> getPoints(int size) {\n\t\tArrayList<Point> points = new ArrayList<Point>();\n\t\tfor (int x1 = size * -1; x1 < size; x1+=3) {\n\t\t\tfor (int y1 = size * -1 + 1; y1 < size - 1; y1+=3) {\n\t\t\t\tpoints.add(new Point(x1, y1));\n\t\t\t}\n\t\t}\n\t\treturn points;\n\t}\n\n\tpublic static boolean runTest(Point start1, Point end1, Point start2, Point end2) {\n\t\tPoint intersection = Question.intersection(start1, end1, start2, end2);\n\t\tboolean validate1 = true;\n\t\tboolean validate2 = true;\n\t\tif (intersection == null) {\n\t\t\tSystem.out.println(\"No intersection.\");\n\t\t} else {\n\t\t\tvalidate1 = checkIfPointOnLineSegments(start1, intersection, end1);\n\t\t\tvalidate2 = checkIfPointOnLineSegments(start2, intersection, end2);\n\t\t\tif (validate1 && validate2) {\n\t\t\t\tSystem.out.println(\"has intersection\");\n\t\t\t}\n\t\t\tif (!validate1 || !validate2) {\n\t\t\t\tSystem.out.println(\"ERROR -- \" + validate1 + \", \" + validate2);\n\t\t\t}\n\t\t}\n\n\t\tSystem.out.println(\"  Start1: \" + start1.x + \", \" + start1.y);\n\t\tSystem.out.println(\"  End1: \" + end1.x + \", \" + end1.y);\n\t\tSystem.out.println(\"  Start2: \" + start2.x + \", \" + start2.y);\n\t\tSystem.out.println(\"  End2: \" + end2.x + \", \" + end2.y);\n\t\tif (intersection != null) {\n\t\t\tSystem.out.println(\"  Intersection: \" + intersection.x + \", \" + intersection.y);\n\t\t}\n\n\t\tif (!validate1 || !validate2) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tArrayList<Point> points = getPoints(10);\n\t\tfor (Point start1 : points) {\n\t\t\tfor (Point end1 : points) {\n\t\t\t\tfor (Point start2 : points) {\n\t\t\t\t\tfor (Point end2 : points) {\n\t\t\t\t\t\tboolean success = runTest(start1, end1, start2, end2);\n\t\t\t\t\t\tif (!success) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/Piece.java",
    "content": "package Q16_04_Tic_Tac_Win;\n\nenum Piece { Empty, Red, Blue };\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/Position.java",
    "content": "package Q16_04_Tic_Tac_Win;\n\npublic class Position {\n\tpublic int row, column;\n\tpublic Position(int row, int column) {\n\t\tthis.row = row;\n\t\tthis.column = column;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/PositionIterator.java",
    "content": "package Q16_04_Tic_Tac_Win;\n\nimport java.util.Iterator;\n\npublic class PositionIterator implements Iterator<Position> {\n\tprivate int rowIncrement, colIncrement, size;\n\tprivate Position current;\n\t\n\tpublic PositionIterator(Position p, int rowIncrement, int colIncrement, int size) {\n\t\tthis.rowIncrement = rowIncrement;\n\t\tthis.colIncrement = colIncrement;\n\t\tthis.size = size;\n\t\tcurrent = new Position(p.row - rowIncrement, p.column - colIncrement);\n\t}\n\t\n\t@Override\n\tpublic boolean hasNext() {\n\t\treturn current.row + rowIncrement < size && current.column + colIncrement < size;\n\t}\n\n\t@Override\n\tpublic Position next() {\n\t\tcurrent = new Position(current.row + rowIncrement, current.column + colIncrement);\n\t\treturn current;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionA.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static int convertBoardToInt(Piece[][] board) {\r\n\t\tint sum = 0;\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\tfor (int j = 0; j < board[i].length; j++) {\r\n\t\t\t\tint value = board[i][j].ordinal();\r\n\t\t\t\tsum = sum * 3 + value;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sum;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tPiece[][] board = { \r\n\t\t\t\t{Piece.Empty, Piece.Empty, Piece.Empty},\r\n\t\t\t\t{Piece.Empty, Piece.Empty, Piece.Empty},\r\n\t\t\t\t{Piece.Blue, Piece.Blue, Piece.Blue}};\r\n\t\t\r\n\t\tint v = convertBoardToInt(board);\r\n\t\tSystem.out.println(v);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionB.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\t\r\n\tpublic static Piece hasWon(Piece[][] board, int row, int column) {\r\n\t\tif (board.length != board[0].length) return Piece.Empty;\r\n\t\t\r\n\t\tPiece piece = board[row][column];\r\n\t\t\r\n\t\tif (piece == Piece.Empty) return Piece.Empty;\r\n\t\tif (hasWonRow(board, row) || hasWonColumn(board, column)) {\r\n\t\t\treturn piece;\r\n\t\t}\r\n\t\t\r\n\t\tif (row == column && hasWonDiagonal(board, 1)) {\r\n\t\t\treturn piece;\r\n\t\t}\r\n\t\t\r\n\t\tif (row == (board.length - column - 1) && hasWonDiagonal(board, -1)) {\r\n\t\t\treturn piece;\r\n\t\t}\r\n\t\t\r\n\t\treturn Piece.Empty;\r\n\t}\t\r\n\t\r\n\tpublic static boolean hasWonRow(Piece[][] board, int row) {\r\n\t\tfor (int c = 1; c < board[row].length; c++) {\r\n\t\t\tif (board[row][c] != board[row][0]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static boolean hasWonColumn(Piece[][] board, int column) {\r\n\t\tfor (int r = 1; r < board.length; r++) {\r\n\t\t\tif (board[r][column] != board[0][column]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static boolean hasWonDiagonal(Piece[][] board, int direction) {\r\n\t\tint row = 0;\r\n\t\tint column = direction == 1 ? 0 : board.length - 1;\r\n\t\tPiece first = board[0][column];\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\tif (board[row][column] != first) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\trow += 1;\r\n\t\t\tcolumn += direction;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\t\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\r\n\t\tboard_t[1][1] = board_t[0][2];\r\n\t\tboard_t[2][0] = board_t[0][2];\r\n\t\t\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board, 0, 2);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionC.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionC {\r\n\tpublic static boolean hasWinner(Piece p1, Piece p2, Piece p3) {\r\n\t\tif (p1 == Piece.Empty) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn p1 == p2 && p2 == p3;\r\n\t}\r\n\t\r\n\tpublic static Piece hasWon(Piece[][] board) {\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\t/* Check Rows */\r\n\t\t\tif (hasWinner(board[i][0], board[i][1], board[i][2])) {\r\n\t\t\t\treturn board[i][0];\r\n\t\t\t}\r\n\r\n\t\t\t/* Check Columns */\r\n\t\t\tif (hasWinner(board[0][i], board[1][i], board[2][i])) {\r\n\t\t\t\treturn board[0][i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/* Check Diagonal */\r\n\t\tif (hasWinner(board[0][0], board[1][1], board[2][2])) {\r\n\t\t\treturn board[0][0];\r\n\t\t}\r\n\t\t\r\n\t\tif (hasWinner(board[0][2], board[1][1], board[2][0])) {\r\n\t\t\treturn board[0][2];\r\n\t\t}\r\n\t\t\r\n\t\treturn Piece.Empty;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionD.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionD {\r\n\tpublic static boolean hasWinner(Piece p1, Piece p2, Piece p3) {\r\n\t\tif (p1 == Piece.Empty) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn p1 == p2 && p2 == p3;\r\n\t}\r\n\t\r\n\tpublic static Piece hasWon(Piece[][] board) {\r\n\t\tif (board[0][0] != Piece.Empty &&\r\n\t\t\t(hasWinner(board[0][0], board[0][1], board[0][2]) ||\r\n\t\t\t hasWinner(board[0][0], board[1][0], board[2][0]))) {\r\n\t\t\treturn board[0][0];\r\n\t\t}\r\n\t\t\r\n\t\tif (board[2][2] != Piece.Empty &&\r\n\t\t\t(hasWinner(board[2][0], board[2][1], board[2][2]) ||\r\n\t\t\t hasWinner(board[0][2], board[1][2], board[2][2]))) {\r\n\t\t\treturn board[2][2];\r\n\t\t}\r\n\t\t\r\n\t\tif (board[1][1] != Piece.Empty &&\r\n\t\t\t(hasWinner(board[0][0], board[1][1], board[2][2]) ||\r\n\t\t\t hasWinner(board[0][2], board[1][1], board[2][0]) ||\r\n\t\t\t hasWinner(board[1][0], board[1][1], board[1][2]) ||\r\n\t\t\t hasWinner(board[0][1], board[1][1], board[2][1]))) {\r\n\t\t\treturn board[1][1];\r\n\t\t}\r\n\t\t\r\n\t\treturn Piece.Empty;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionE.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionE {\r\n\r\n\tpublic static Piece hasWon(Piece[][] board) {\r\n\t\tint size = board.length;\r\n\t\tif (board[0].length != size) return Piece.Empty;\r\n\t\tPiece first;\r\n\t\t\r\n\t\t/* Check rows. */\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tfirst = board[i][0];\r\n\t\t\tif (first == Piece.Empty) continue;\r\n\t\t\tfor (int j = 1; j < size; j++) {\r\n\t\t\t\tif (board[i][j] != first) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (j == size - 1) {\r\n\t\t\t\t\treturn first;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Check columns. */\r\n\t\tfor (int i = 0; i < size; i++) {\r\n\t\t\tfirst = board[0][i];\r\n\t\t\tif (first == Piece.Empty) continue;\r\n\t\t\tfor (int j = 1; j < size; j++) {\r\n\t\t\t\tif (board[j][i] != first) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (j == size - 1) {\r\n\t\t\t\t\treturn first;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Check diagonals. */\r\n\t\tfirst = board[0][0];\r\n\t\tif (first != Piece.Empty) {\r\n\t\t\tfor (int i = 1; i < size; i++) {\r\n\t\t\t\tif (board[i][i] != first) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (i == size - 1) {\r\n\t\t\t\t\treturn first;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfirst = board[0][size - 1];\r\n\t\tif (first != Piece.Empty) {\r\n\t\t\tfor (int i = 1; i < size; i++) {\r\n\t\t\t\tif (board[i][size - i - 1] != first) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (i == size - 1) {\r\n\t\t\t\t\treturn first;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn Piece.Empty;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionF.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionF {\r\n\r\n\tpublic static Piece hasWon(Piece[][] board) {\r\n\t\tPiece winner = Piece.Empty;\r\n\t\t\r\n\t\t/* Check rows. */\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\twinner = hasWon(board, i, 0, 0, 1);\r\n\t\t\tif (winner != Piece.Empty) {\r\n\t\t\t\treturn winner;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Check columns. */\r\n\t\tfor (int i = 0; i < board[0].length; i++) {\r\n\t\t\twinner = hasWon(board, 0, i, 1, 0);\r\n\t\t\tif (winner != Piece.Empty) {\r\n\t\t\t\treturn winner;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Check top/left -> bottom/right diagonal. */\r\n\t\twinner = hasWon(board, 0, 0, 1, 1);\r\n\t\tif (winner != Piece.Empty) {\r\n\t\t\treturn winner;\r\n\t\t}\r\n\t\t\r\n\t\t/* Check top/right -> bottom/left diagonal. */\r\n\t\treturn hasWon(board, 0, board[0].length - 1, 1, -1);\r\n\t}\r\n\t\r\n\tpublic static Piece hasWon(Piece[][] board, int row, int col, int incrementRow, int incrementCol) {\r\n\t\tPiece first = board[row][col];\r\n\t\twhile (row < board.length && col < board[row].length) {\r\n\t\t\tif (board[row][col] != first) {\r\n\t\t\t\treturn Piece.Empty;\r\n\t\t\t}\r\n\t\t\trow += incrementRow;\r\n\t\t\tcol += incrementCol;\r\n\t\t}\r\n\t\treturn first;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionG.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionG {\r\n\tpublic static class Check {\r\n\t\tpublic int row, column;\r\n\t\tprivate int rowIncrement, columnIncrement;\r\n\t\tpublic Check(int row, int column, int rowI, int colI) {\r\n\t\t\tthis.row = row;\r\n\t\t\tthis.column = column;\r\n\t\t\tthis.rowIncrement = rowI;\r\n\t\t\tthis.columnIncrement = colI;\r\n\t\t}\r\n\t\t\r\n\t\tpublic void increment() {\r\n\t\t\trow += rowIncrement;\r\n\t\t\tcolumn += columnIncrement;\r\n\t\t}\r\n\t\t\r\n\t\tpublic boolean inBounds(int size) {\r\n\t\t\treturn row >= 0 && column >= 0 &&\r\n\t\t\t\t\trow < size && column < size;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static Piece hasWon(Piece[][] board) {\r\n\t\tif (board.length != board[0].length) return Piece.Empty;\r\n\t\tint size = board.length;\r\n\t\t\r\n\t\t/* Create list of things to check. */\r\n\t\tArrayList<Check> instructions = new ArrayList<Check>();\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\tinstructions.add(new Check(0, i, 1, 0));\r\n\t\t\tinstructions.add(new Check(i, 0, 0, 1));\r\n\t\t}\r\n\t\tinstructions.add(new Check(0, 0, 1, 1));\r\n\t\tinstructions.add(new Check(0, size - 1, 1, -1));\r\n\t\t\r\n\t\t/* Check them. */\r\n\t\tfor (Check instr : instructions) {\r\n\t\t\tPiece winner = hasWon(board, instr);\r\n\t\t\tif (winner != Piece.Empty) {\r\n\t\t\t\treturn winner;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn Piece.Empty;\r\n\t}\r\n\t\r\n\tpublic static Piece hasWon(Piece[][] board, Check instr) {\r\n\t\tPiece first = board[instr.row][instr.column];\r\n\t\twhile (instr.inBounds(board.length)) {\r\n\t\t\tif (board[instr.row][instr.column] != first) {\r\n\t\t\t\treturn Piece.Empty;\r\n\t\t\t}\r\n\t\t\tinstr.increment();\r\n\t\t}\r\n\t\treturn first;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/QuestionH.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionH {\t\r\n\tpublic static Piece hasWon(Piece[][] board) {\r\n\t\tif (board.length != board[0].length) return Piece.Empty;\r\n\t\tint size = board.length;\r\n\t\t\r\n\t\tArrayList<PositionIterator> instructions = new ArrayList<PositionIterator>();\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\tinstructions.add(new PositionIterator(new Position(0, i), 1, 0, size));\r\n\t\t\tinstructions.add(new PositionIterator(new Position(i, 0), 0, 1, size));\r\n\t\t}\r\n\t\tinstructions.add(new PositionIterator(new Position(0, 0), 1, 1, size));\r\n\t\tinstructions.add(new PositionIterator(new Position(0, size - 1), 1, -1, size));\r\n\t\t\r\n\t\tfor (PositionIterator iterator : instructions) {\r\n\t\t\tPiece winner = hasWon(board, iterator);\r\n\t\t\tif (winner != Piece.Empty) {\r\n\t\t\t\treturn winner;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn Piece.Empty;\r\n\t}\r\n\t\r\n\tpublic static Piece hasWon(Piece[][] board, PositionIterator iterator) {\r\n\t\tPosition firstPosition = iterator.next();\r\n\t\tPiece first = board[firstPosition.row][firstPosition.column];\r\n\t\twhile (iterator.hasNext()) {\r\n\t\t\tPosition position = iterator.next();\r\n\t\t\tif (board[position.row][position.column] != first) {\r\n\t\t\t\treturn Piece.Empty;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn first;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint N = 3;\r\n\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\tPiece[][] board = new Piece[N][N];\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\tboard[i][j] = Tester.convertIntToPiece(x);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPiece p1 = hasWon(board);\r\n\t\t\r\n\t\tSystem.out.println(p1);\r\n\t\tAssortedMethods.printMatrix(board_t);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_04_Tic_Tac_Win/Tester.java",
    "content": "package Q16_04_Tic_Tac_Win;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Tester {\t\r\n\tpublic static Piece convertIntToPiece(int i) {\r\n\t\tif (i == 1) {\r\n\t\t\treturn Piece.Blue;\r\n\t\t} else if (i == 2) {\r\n\t\t\treturn Piece.Red;\r\n\t\t} else {\r\n\t\t\treturn Piece.Empty;\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\t\r\n\t\r\n\tpublic static Piece hasWonB(Piece[][] board) {\r\n\t\tfor (int i = 0; i < board.length; i++) {\r\n\t\t\tfor (int j = 0; j < board[0].length; j++) {\r\n\t\t\t\tPiece winner =QuestionB.hasWon(board, i, j);\r\n\t\t\t\tif (winner != Piece.Empty) {\r\n\t\t\t\t\treturn winner;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn Piece.Empty;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int k = 0; k < 100; k++) {\r\n\t\t\tint N = 3;\r\n\t\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\t\tPiece[][] board = new Piece[N][N];\r\n\t\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\t\tboard[i][j] = convertIntToPiece(x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//AssortedMethods.printMatrix(board_t);\r\n\t\t\tPiece p1 = hasWonB(board);\r\n\t\t\tPiece p2 = QuestionC.hasWon(board);\r\n\t\t\tPiece p3 = QuestionD.hasWon(board);\r\n\t\t\tPiece p4 = QuestionE.hasWon(board);\r\n\t\t\tPiece p5 = QuestionF.hasWon(board);\r\n\t\t\tPiece p6 = QuestionG.hasWon(board);\r\n\t\t\tPiece p7 = QuestionH.hasWon(board);\r\n\t\t\t//System.out.println(p + \" \" + p2);\r\n\t\t\tif (p1 != p2 || p2 != p3 || p3 != p4 || p4 != p5 || p5 != p6 || p6 != p7) {\r\n\t\t\t\tSystem.out.println(p1 + \" \" + p2 + \" \" + p3 + \" \" + p4 + \" \" + p5 + \" \" + p6 + \" \" + p7);\r\n\t\t\t\tAssortedMethods.printMatrix(board_t);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (int k = 0; k < 100; k++) {\r\n\t\t\tint N = 4;\r\n\t\t\tint[][] board_t = AssortedMethods.randomMatrix(N, N, 0, 2);\r\n\t\t\tPiece[][] board = new Piece[N][N];\r\n\t\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\t\tint x = board_t[i][j];\r\n\t\t\t\t\tboard[i][j] = convertIntToPiece(x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//AssortedMethods.printMatrix(board_t);\r\n\t\t\tPiece p3 = hasWonB(board);\r\n\t\t\tPiece p4 = QuestionE.hasWon(board);\r\n\t\t\tPiece p5 = QuestionF.hasWon(board);\r\n\t\t\tPiece p6 = QuestionG.hasWon(board);\r\n\t\t\tPiece p7 = QuestionH.hasWon(board);\r\n\t\t\t//System.out.println(p + \" \" + p2);\r\n\t\t\tif (p3 != p4 || p4 != p5 || p5 != p6 || p6 != p7) {\r\n\t\t\t\tSystem.out.println(p3 + \" \" + p4 + \" \" + p5 + \" \" + p6 + \" \" + p7);\r\n\t\t\t\tAssortedMethods.printMatrix(board_t);\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_05_Factorial_Zeros/QuestionA.java",
    "content": "package Q16_05_Factorial_Zeros;\r\n\r\npublic class QuestionA {\r\n\tpublic static int factorsOf5(int i) {\r\n\t\tint count = 0;\r\n\t\twhile (i % 5 == 0) {\r\n\t\t\tcount++;\r\n\t\t\ti /= 5;\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int countFactZeros(int num) {\r\n\t\tint count = 0;\t\t\r\n\t\tfor (int i = 2; i <= num; i++) {\r\n\t\t\tcount += factorsOf5(i);\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int factorial(int num) {\r\n\t\tif (num == 1) {\r\n\t\t\treturn 1;\r\n\t\t} else if (num > 1) {\r\n\t\t\treturn num * factorial(num - 1);\r\n\t\t} else {\r\n\t\t\treturn -1; // Error\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 1; i < 12; i++) {\r\n\t\t\tSystem.out.println(i + \"! (or \" + factorial(i) + \") has \" + countFactZeros(i) + \" zeros\");\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_05_Factorial_Zeros/QuestionB.java",
    "content": "package Q16_05_Factorial_Zeros;\r\n\r\npublic class QuestionB {\r\n\tpublic static int countFactZeros(int num) {\r\n\t\tint count = 0;\r\n\t\tif (num < 0) {\r\n\t\t\tSystem.out.println(\"Factorial is not defined for negative numbers\");\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tfor (int i = 5; num / i > 0; i *= 5) {\r\n\t\t\tcount += num / i;\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int factorial(int num) {\r\n\t\tif (num == 1) {\r\n\t\t\treturn 1;\r\n\t\t} else if (num > 1) {\r\n\t\t\treturn num * factorial(num - 1);\r\n\t\t} else {\r\n\t\t\treturn -1; // Error\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 1; i < 12; i++) {\r\n\t\t\tSystem.out.println(i + \"! (or \" + factorial(i) + \") has \" + countFactZeros(i) + \" zeros\");\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_06_Smallest_Difference/QuestionA.java",
    "content": "package Q16_06_Smallest_Difference;\n\npublic class QuestionA {\n\tpublic static int findSmallestDifference(int[] arrayA, int[] arrayB) {\n\t\tif (arrayA.length == 0 || arrayB.length == 0) return -1;\n\t\n\t\tint smallestDifference = Integer.MAX_VALUE;\n\t\tfor (int a : arrayA) {\n\t\t\tfor (int b : arrayB) {\n\t\t\t\tsmallestDifference = Math.min(smallestDifference, Math.abs(a - b));\n\t\t\t}\n\t\t}\n\t\treturn smallestDifference;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {1, 3, 15, 11, 2};\n\t\tint[] array2 = {23, 127, 234, 19, 8};\n\t\tint difference = findSmallestDifference(array1, array2);\n\t\tSystem.out.println(difference);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_06_Smallest_Difference/QuestionB.java",
    "content": "package Q16_06_Smallest_Difference;\nimport java.util.Arrays;\n\npublic class QuestionB {\n\tpublic static int findSmallestDifference(int[] arrayA, int[] arrayB) {\n\t\tif (arrayA.length == 0 || arrayB.length == 0) return -1;\n\t\tArrays.sort(arrayA);\n\t\tArrays.sort(arrayB);\n\t\tint indexA = 0;\n\t\tint indexB = 0;\n\t\tint smallestDifference = Integer.MAX_VALUE;\n\t\twhile (indexA < arrayA.length && indexB < arrayB.length) {\n\t\t\tint difference = Math.abs(arrayA[indexA] - arrayB[indexB]);\n\t\t\tsmallestDifference = Math.min(smallestDifference, difference);\n\n\t\t\tif (arrayA[indexA] < arrayB[indexB]) {\n\t\t\t\tindexA++;\n\t\t\t} else {\n\t\t\t\tindexB++;\n\t\t\t}\n\t\t}\n\t\treturn smallestDifference;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {1, 3, 15, 11, 2};\n\t\tint[] array2 = {23, 127, 234, 19, 8};\n\t\tint difference = findSmallestDifference(array1, array2);\n\t\tSystem.out.println(difference);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_06_Smallest_Difference/QuestionC.java",
    "content": "package Q16_06_Smallest_Difference;\nimport java.util.Arrays;\n\npublic class QuestionC {\n\tpublic static int getClosestValue(int[] array, int target) {\n\t\tint low = 0;\n\t\tint high = array.length - 1;\n\t\tint mid;\n\t\t\n\t\twhile (low <= high) {\n\t\t\tmid = low + (high - low) / 2;\n\t\t\tif (array[mid] < target) {\n\t\t\t\tlow = mid + 1;\n\t\t\t} else if (array[mid] > target) {\n\t\t\t\thigh = mid - 1;\n\t\t\t} else {\n\t\t\t\treturn array[mid];\n\t\t\t}\n\t\t}\n\t\t\n\t\tint valueA = low < 0 || low >= array.length ? Integer.MAX_VALUE : array[low];\n\t\tint valueB = high < 0 || high >= array.length ? Integer.MAX_VALUE : array[high];\n\t\treturn Math.abs(valueA - target) < Math.abs(valueB - target) ? valueA : valueB; // return closest value\n\t}\n\t\n\tpublic static int findSmallestDifference(int[] shorter, int[] longer) {\n\t\tif (shorter.length == 0 || longer.length == 0) return -1;\n\t\tif (shorter.length > longer.length) return findSmallestDifference(longer, shorter);\n\t\t\n\t\tArrays.sort(shorter);\n\t\t\n\t\tint smallestDifference = Integer.MAX_VALUE;\n\t\tfor (int target : longer) {\n\t\t\tint closest = getClosestValue(shorter, target);\n\t\t\tsmallestDifference = Math.min(smallestDifference, Math.abs(closest - target));\n\t\t}\n\t\t\n\t\treturn smallestDifference;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {1, 3, 15, 11, 2};\n\t\tint[] array2 = {23, 127, 234, 19, 8};\n\t\tint difference = findSmallestDifference(array1, array2);\n\t\tSystem.out.println(difference);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_06_Smallest_Difference/Tester.java",
    "content": "package Q16_06_Smallest_Difference;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 100; i++) {\n\t\t\tint size = (int) (Math.random() * 100.0);\n\t\t\tint[] array1 = AssortedMethods.randomArray(size, i * -1, i);\n\t\t\tint[] array2 = AssortedMethods.randomArray(size, i * -1, i);\n\t\t\tint diffA = QuestionA.findSmallestDifference(array1, array2);\n\t\t\tint diffB = QuestionB.findSmallestDifference(array1, array2);\n\t\t\tint diffC = QuestionC.findSmallestDifference(array1, array2);\n\t\t\tif (diffA != diffB || diffB != diffC) {\n\t\t\t\tdiffA = QuestionA.findSmallestDifference(array1, array2);\n\t\t\t\tdiffB = QuestionB.findSmallestDifference(array1, array2);\n\t\t\t\tdiffC = QuestionC.findSmallestDifference(array1, array2);\n\t\t\t\tSystem.out.println(diffA);\n\t\t\t\tSystem.out.println(diffB);\n\t\t\t\tSystem.out.println(diffC);\n\t\t\t\tSystem.out.println();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_07_Number_Max/Question.java",
    "content": "package Q16_07_Number_Max;\r\n\r\npublic class Question {\r\n\t/* Flips a 1 to a 0 and a 0 to a 1 */\r\n\tpublic static int flip(int bit) {\r\n\t\treturn 1 ^ bit;\r\n\t}\t\r\n\t\r\n\t/* Returns 1 if a is positive, and 0 if a is negative */\r\n\tpublic static int sign(int a) {\r\n\t\treturn flip((a >> 31) & 0x1);\r\n\t}\r\n\t\r\n\tpublic static int getMaxNaive(int a, int b) {\r\n\t\tint k = sign(a - b);\r\n\t\tint q = flip(k);\r\n\t\treturn a * k + b * q;\r\n\t}\r\n\t\r\n\tpublic static int getMax(int a, int b) {\r\n\t\tint c = a - b;\r\n\t\t\r\n\t\tint sa = sign(a); // if a >= 0, then 1 else 0\r\n\t\tint sb = sign(b); // if b >= 0, then 1 else 0\r\n\t\tint sc = sign(c); // depends on whether or not a - b overflows\r\n\t\t\r\n\t\t/* We want to define a value k which is 1 if a > b and 0 if a < b. \r\n\t\t * (if a = b, it doesn't matter what value k is) */\r\n\t\t\r\n\t\tint use_sign_of_a = sa ^ sb; // If a and b have different signs, then k = sign(a)\r\n\t\tint use_sign_of_c = flip(sa ^ sb); // If a and b have the same sign, then k = sign(a - b)\r\n\t\t\r\n\t\t/* We can't use a comparison operator, but we can multiply values by 1 or 0 */\r\n\t\tint k = use_sign_of_a * sa + use_sign_of_c * sc;\r\n\t\tint q = flip(k); // opposite of k\r\n\t\t\r\n\t\treturn a * k + b * q;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = 26;\r\n\t\tint b = -15;\r\n\t\t\r\n\t\tSystem.out.println(\"max_naive(\" + a + \", \" + b + \") = \" + getMaxNaive(a, b));\r\n\t\tSystem.out.println(\"max(\" + a + \", \" + b + \") = \" + getMax(a, b));\t\t\r\n\t\t\r\n\t\ta = -15;\r\n\t\tb = 2147483647;\r\n\t\t\r\n\t\tSystem.out.println(\"max_naive(\" + a + \", \" + b + \") = \" + getMaxNaive(a, b));\r\n\t\tSystem.out.println(\"max(\" + a + \", \" + b + \") = \" + getMax(a, b));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_08_English_Int/Question.java",
    "content": "package Q16_08_English_Int;\r\n\r\nimport java.util.LinkedList;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\tpublic static String[] smalls = {\"Zero\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\", \"Ten\", \"Eleven\", \"Twelve\", \"Thirteen\", \"Fourteen\", \"Fifteen\", \"Sixteen\", \"Seventeen\", \"Eighteen\", \"Nineteen\"};\r\n\tpublic static String[] tens = {\"\", \"\", \"Twenty\", \"Thirty\", \"Forty\", \"Fifty\", \"Sixty\", \"Seventy\", \"Eighty\", \"Ninety\"};\r\n\tpublic static String[] bigs = {\"\", \"Thousand\", \"Million\", \"Billion\"};\r\n\tpublic static String hundred = \"Hundred\";\r\n\tpublic static String negative = \"Negative\";\r\n\t\r\n\tpublic static String convert(int num) {\r\n\t\tif (num == 0) {\r\n\t\t\treturn smalls[0];\r\n\t\t} else if (num < 0) {\r\n\t\t\treturn negative + \" \" + convert(-1 * num);\r\n\t\t}\r\n\t\t\r\n\t\tLinkedList<String> parts = new LinkedList<String>();\r\n\t\tint chunkCount = 0;\r\n\t\t\r\n\t\twhile (num > 0) {\r\n\t\t\tif (num % 1000 != 0) {\r\n\t\t\t\tString chunk = convertChunk(num % 1000) + \" \" + bigs[chunkCount];\r\n\t\t\t\tparts.addFirst(chunk);\r\n\t\t\t}\r\n\t\t\tnum /= 1000; // shift chunk\r\n\t\t\tchunkCount++;\r\n\t\t}\r\n\t\t\r\n\t\treturn listToString(parts);\r\n\t}\r\n\t\r\n\t/* Convert a linked list of strings to a string, dividing it up with spaces. */\r\n\tpublic static String listToString(LinkedList<String> parts) {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\twhile (parts.size() > 1) {\r\n\t\t\tsb.append(parts.pop());\r\n\t\t\tsb.append(\" \");\r\n\t\t}\r\n\t\tsb.append(parts.pop());\r\n\t\treturn sb.toString();\r\n\t}\r\n\t\r\n\tpublic static String convertChunk(int number) {\r\n\t\tLinkedList<String> parts = new LinkedList<String>();\r\n\t\t\r\n\t\t/* Convert hundreds place */\r\n\t\tif (number >= 100) {\r\n\t\t\tparts.addLast(smalls[number / 100]);\r\n\t\t\tparts.addLast(hundred);\r\n\t\t\tnumber %= 100;\r\n\t\t}\r\n\t\t\r\n\t\t/* Convert tens place */\r\n\t\tif (number >= 10 && number <= 19) {\r\n\t\t\tparts.addLast(smalls[number]);\r\n\t\t} else if (number >= 20) {\r\n\t\t\tparts.addLast(tens[number / 10]);\r\n\t\t\tnumber %= 10;\r\n\t\t}\r\n\t\t\r\n\t\t/* Convert ones place */\r\n\t\tif (number >= 1 && number <= 9) {\r\n\t\t\tparts.addLast(smalls[number]);\r\n\t\t}\r\n\t\t\r\n\t\treturn listToString(parts);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\t\t\r\n\t\t/* numbers between 100000 and 1000000 */\r\n\t\tfor (int i = 0; i < 8; i++) {\r\n\t\t\tint value = (int) (-1 * Math.pow(10, i));\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\t\t\t\r\n\t\t\r\n\t\t/* numbers between 0 and 100 */\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint value = AssortedMethods.randomIntInRange(0, 100);\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\t\r\n\t\t\r\n\t\t/* numbers between 100 and 1000 */\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint value = AssortedMethods.randomIntInRange(100, 1000);\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\r\n\t\t\r\n\t\t/* numbers between 1000 and 100000 */\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint value = AssortedMethods.randomIntInRange(1000, 100000);\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\t\t\r\n\t\t\r\n\t\t\r\n\t\t/* numbers between 100000 and 100000000 */\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint value = AssortedMethods.randomIntInRange(100000, 100000000);\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\t\r\n\t\t\r\n\t\t/* numbers between 100000000 and 1000000000 */\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint value = AssortedMethods.randomIntInRange(100000000, 1000000000);\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\t\t\t\r\n                \r\n\t\t/* numbers between 1000000000 and Integer.MAX_VALUE */\r\n\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\tint value = AssortedMethods.randomIntInRange(1000000000, Integer.MAX_VALUE);\r\n\t\t\tString s = convert(value);\r\n\t\t\tSystem.out.println(value + \": \" + s);\r\n\t\t}\t\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_09_Operations/Question.java",
    "content": "package Q16_09_Operations;\r\n\r\nimport java.util.Random;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\t/* Flip a positive sign to negative, or a negative sign to pos */\r\n\tpublic static int negate(int a) {\r\n\t\tint neg = 0;\r\n\t\tint newSign = a < 0 ? 1 : -1;\r\n\t\twhile (a != 0) {\r\n\t\t\tneg += newSign;\r\n\t\t\ta += newSign;\r\n\t\t}\r\n\t    return neg;\r\n\t}\r\n\t\r\n\t/* Flip a positive sign to negative, or a negative sign to pos */\r\n\tpublic static int negateOptimized(int a) {\r\n\t\tint neg = 0;\r\n\t\tint newSign = a < 0 ? 1 : -1;\r\n\t\tint delta = newSign;\r\n\t\twhile (a != 0) {\r\n\t\t\tboolean differentSigns = (a + delta > 0) != (a > 0);\r\n\t\t\tif (a + delta != 0 && differentSigns) { // If delta is too big, reset it.\r\n\t\t\t\tdelta = newSign;\r\n\t\t\t}\r\n\t\t\tneg += delta;\r\n\t\t\ta += delta;\r\n\t\t\tdelta += delta; // Double the delta\r\n\t\t}\r\n\t    return neg;\r\n\t}\t\r\n\r\n\t/* Subtract two numbers by negating b and adding them */\r\n\tpublic static int minus(int a, int b) {\r\n\t\treturn a + negate(b);\r\n\t}\r\n\r\n\t/* Return absolute value */\r\n\tpublic static int abs(int a) {\r\n\t\tif (a < 0) {\r\n\t\t\treturn negateOptimized(a);\r\n\t\t}\r\n\t\telse return a;\r\n\t}\r\n\r\n\t/* Multiply a by b by adding a to itself b times */\r\n\tpublic static int multiply(int a, int b) {\r\n\t\tif (a < b) {\r\n\t\t\treturn multiply(b, a); // algo is faster if b < a\r\n\t\t}\r\n\t\tint sum = 0;\r\n\t\tfor (int i = abs(b); i > 0; i = minus(i, 1)) {\r\n\t\t\tsum += a;\r\n\t\t}\r\n\t\tif (b < 0) {\r\n\t\t\tsum = negateOptimized(sum);\r\n\t\t}\r\n\t\treturn sum;\r\n\t}\r\n\r\n\t/* Divide a by b by literally counting how many times b can go into\r\n\t * a. That is, count how many times you can add b to itself until you reach a. */\r\n\tpublic static int divide(int a, int b) throws java.lang.ArithmeticException {\r\n\t\tif (b == 0) {\r\n\t\t\tthrow new java.lang.ArithmeticException(\"ERROR: Divide by zero.\");\r\n\t\t}\r\n\t\tint absa = abs(a);\r\n\t\tint absb = abs(b);\r\n\t\t\r\n\t\tint product = 0;\r\n\t\tint x = 0;\r\n\t\twhile (product + absb <= absa) { /* don't go past a */\r\n\t\t\tproduct += absb;\r\n\t\t\tx++;\r\n\t\t}\r\n\t\t\r\n\t\tif ((a < 0 && b < 0) || (a > 0 && b > 0)) {\r\n\t\t\treturn x;\r\n\t\t} else {\r\n\t\t\treturn negateOptimized(x);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint minRange = -100;\r\n\t\tint maxRange = 100;\r\n\t\tint cycles = 100;\r\n\t\t\r\n\t\tfor (int i = 0; i < cycles; i++) {\r\n\t\t\tint a = AssortedMethods.randomIntInRange(minRange, maxRange);\r\n\t\t\tint b = AssortedMethods.randomIntInRange(minRange, maxRange);\r\n\t\t\tint ans = minus(a, b);\r\n\t\t\tif (ans != a - b) {\r\n\t\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\t}\r\n\t\t\tSystem.out.println(a + \" - \" + b + \" = \" + ans);\r\n\t\t}\r\n\t\tfor (int i = 0; i < cycles; i++) {\r\n\t\t\tint a = AssortedMethods.randomIntInRange(minRange, maxRange);\r\n\t\t\tint b = AssortedMethods.randomIntInRange(minRange, maxRange);\r\n\t\t\tint ans = multiply(a, b);\r\n\t\t\tif (ans != a * b) {\r\n\t\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\t}\r\n\t\t\tSystem.out.println(a + \" * \" + b + \" = \" + ans);\r\n\t\t}\r\n\t\tfor (int i = 0; i < cycles; i++) {\r\n\t\t\tint a = AssortedMethods.randomIntInRange(minRange, maxRange);\r\n\t\t\tint b = AssortedMethods.randomIntInRange(minRange, maxRange);\r\n\t\t\tSystem.out.print(a + \" / \" + b + \" = \");\r\n\t\t\tint ans = divide(a, b);\r\n\t\t\tif (ans != a / b) {\r\n\t\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\t}\r\n\t\t\tSystem.out.println(ans);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_10_Living_People/Person.java",
    "content": "package Q16_10_Living_People;\n\npublic class Person {\n\tpublic int birth;\n\tpublic int death;\n\tpublic Person(int birthYear, int deathYear) {\n\t\tbirth = birthYear;\n\t\tdeath = deathYear;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_10_Living_People/QuestionA.java",
    "content": "package Q16_10_Living_People;\n\nimport java.util.Random;\n\npublic class QuestionA {\n\t\n\tpublic static int maxAliveYear(Person[] people, int min, int max) {\n\t\tint maxAlive = 0;\n\t\tint maxAliveYear = min;\n\t\t\n\t\tfor (int year = min; year <= max; year++) {\n\t\t\tint alive = 0;\n\t\t\tfor (Person person : people) {\n\t\t\t\tif (person.birth <= year && year <= person.death) {\n\t\t\t\t\talive++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (alive > maxAlive) {\n\t\t\t\tmaxAlive = alive;\n\t\t\t\tmaxAliveYear = year;\n\t\t\t}\n\t\t}\n\n\t\treturn maxAliveYear;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint n = 10000;\n\t\tint first = 0;\n\t\tint last = 200000;\n\t\tRandom random = new Random();\n\t\tPerson[] people = new Person[n];\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tint birth = first + random.nextInt(last - first);\n\t\t\tint death = birth + random.nextInt(last - birth);\n\t\t\tpeople[i] = new Person(birth, death);\n\t\t\t//System.out.println(birth + \", \" + death);\n\t\t}\n\t\t\n\t\tSystem.out.println(n);\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\t//int birth = first + random.nextInt(last - first);\n\t\t\t//int death = birth + random.nextInt(last - birth);\n\t\t\t//people[i] = new Person(birth, death);\n\t\t\tSystem.out.println(people[i].birth);\n\t\t}\n\t\tSystem.out.println(n);\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\t//int birth = first + random.nextInt(last - first);\n\t\t\t//int death = birth + random.nextInt(last - birth);\n\t\t\t//people[i] = new Person(birth, death);\n\t\t\tSystem.out.println(people[i].death);\n\t\t}\t\t\n\t\t\n\t\tint year = maxAliveYear(people, first, last);\n\t\tSystem.out.println(year);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_10_Living_People/QuestionB.java",
    "content": "package Q16_10_Living_People;\n\nimport java.util.Random;\n\npublic class QuestionB {\n\n\tpublic static int maxAliveYear(Person[] people, int min, int max) {\n\t\tint[] years = createYearMap(people, min, max);\n\t\tint best = getMaxIndex(years);\n\n\t\treturn best + min;\n\t}\n\t\n\t/* Add each person's years to a year map. */\t\n\tpublic static int[] createYearMap(Person[] people, int min, int max) {\n\t\tint[] years = new int[max - min + 1];\n\t\tfor (Person person : people) {\n\t\t\tint left = person.birth - min;\n\t\t\tint right = person.death - min;\t\t\t\n\t\t\tincrementRange(years, left, right);\n\t\t}\n\t\treturn years;\n\t}\n\t\n\t/* Increment array for each value between left and right. */\n\tpublic static void incrementRange(int[] values, int left, int right) {\n\t\tfor (int i = left; i <= right; i++) {\n\t\t\tvalues[i]++;\n\t\t}\n\t}\t\n\t\n\t/* Get index of largest element in array. */\n\tpublic static int getMaxIndex(int[] values) {\n\t\tint max = 0;\n\t\tfor (int i = 1; i < values.length; i++) {\n\t\t\tif (values[i] > values[max]) {\n\t\t\t\tmax = i;\n\t\t\t}\n\t\t}\n\t\treturn max;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint n = 3;\n\t\tint first = 1900;\n\t\tint last = 2000;\n\t\tRandom random = new Random();\n\t\tPerson[] people = new Person[n];\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tint birth = first + random.nextInt(last - first);\n\t\t\tint death = birth + random.nextInt(last - birth);\n\t\t\tpeople[i] = new Person(birth, death);\n\t\t\tSystem.out.println(birth + \", \" + death);\n\t\t}\n\t\tint year = maxAliveYear(people, first, last);\n\t\tSystem.out.println(year);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_10_Living_People/QuestionC.java",
    "content": "package Q16_10_Living_People;\n\nimport java.util.Arrays;\nimport java.util.Random;\n\npublic class QuestionC {\n\tpublic static int maxAliveYear(Person[] people, int min, int max) {\n\t\tint[] births = getSortedYears(people, true);\n\t\tint[] deaths = getSortedYears(people, false);\n\n\t\tint birthIndex = 0;\n\t\tint deathIndex = 0;\t\t\n\t\tint currentlyAlive = 0;\n\t\tint maxAlive = 0;\n\t\tint maxAliveYear = min;\n\t\t\n\t\t/* Walk through arrays. */\n\t\twhile (birthIndex < births.length) {\n\t\t\tif (births[birthIndex] <= deaths[deathIndex]) {\n\t\t\t\tcurrentlyAlive++; // include birth \n\t\t\t\tif (currentlyAlive > maxAlive) { \n\t\t\t\t\tmaxAlive = currentlyAlive;\n\t\t\t\t\tmaxAliveYear = births[birthIndex];\n\t\t\t\t}\n\t\t\t\tbirthIndex++; // move birth index\n\t\t\t} else {\n\t\t\t\tcurrentlyAlive--; // include death\n\t\t\t\tdeathIndex++; // move death index\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\treturn maxAliveYear;\n\t}\n\t\n\t/* Copy birth years or death years (depending on the value of copyBirthYear)\n\t * into integer array, then sort array. */\n\tpublic static int[] getSortedYears(Person[] people, boolean copyBirthYear) {\n\t\tint[] years = new int[people.length];\n\t\tfor (int i = 0; i < people.length; i++) {\n\t\t\tyears[i] = copyBirthYear ? people[i].birth : people[i].death;\n\t\t}\n\t\tArrays.sort(years);\n\t\treturn years;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint n = 3;\n\t\tint first = 1900;\n\t\tint last = 2000;\n\t\tRandom random = new Random();\n\t\tPerson[] people = new Person[n];\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tint birth = first + random.nextInt(last - first);\n\t\t\tint death = birth + random.nextInt(last - birth);\n\t\t\tpeople[i] = new Person(birth, death);\n\t\t\tSystem.out.println(birth + \", \" + death);\n\t\t}\n\t\tint year = maxAliveYear(people, first, last);\n\t\tSystem.out.println(year);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_10_Living_People/QuestionD.java",
    "content": "package Q16_10_Living_People;\n\nimport java.util.Random;\n\npublic class QuestionD {\n\t\n\tpublic static int maxAliveYear(Person[] people, int min, int max) {\n\t\t/* Build population delta array. */\n\t\tint[] populationDeltas = getPopulationDeltas(people, min, max);\n\t\tint maxAliveYear = getMaxAliveYear(populationDeltas);\n\t\treturn maxAliveYear + min;\n\t}\n\t\n\t/* Add birth and death years to deltas array. */\n\tpublic static int[] getPopulationDeltas(Person[] people, int min, int max) {\n\t\tint[] populationDeltas = new int[max - min + 2];\n\t\tfor (Person person : people) {\n\t\t\tint birth = person.birth - min;\n\t\t\tpopulationDeltas[birth]++;\n\t\t\t\n\t\t\tint death = person.death - min;\n\t\t\tpopulationDeltas[death + 1]--;\t\n\t\t}\n\t\treturn populationDeltas;\n\t}\n\t\n\t/* Compute running sums and return index with max. */\n\tpublic static int getMaxAliveYear(int[] deltas) {\n\t\tint maxAliveYear = 0;\n\t\tint maxAlive = 0;\n\t\tint currentlyAlive = 0;\n\t\tfor (int year = 0; year < deltas.length; year++) {\n\t\t\tcurrentlyAlive += deltas[year];\n\t\t\tif (currentlyAlive > maxAlive) {\n\t\t\t\tmaxAliveYear = year;\n\t\t\t\tmaxAlive = currentlyAlive;\n\t\t\t}\n\t\t}\t\n\t\t\n\t\treturn maxAliveYear;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint n = 3;\n\t\tint first = 1900;\n\t\tint last = 2000;\n\t\tRandom random = new Random();\n\t\tPerson[] people = new Person[n];\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tint birth = first + random.nextInt(last - first);\n\t\t\tint death = birth + random.nextInt(last - birth);\n\t\t\tpeople[i] = new Person(birth, death);\n\t\t\tSystem.out.println(birth + \", \" + death);\n\t\t}\n\t\tint year = maxAliveYear(people, first, last);\n\t\tSystem.out.println(year);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_10_Living_People/Tester.java",
    "content": "package Q16_10_Living_People;\n\nimport java.util.Random;\n\npublic class Tester {\n\n\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint n = 100;\n\t\tint first = 1900;\n\t\tint last = 2000;\n\t\t\n\t\tRandom random = new Random();\n\t\tPerson[] people = new Person[n + 1];\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tint birth = first + random.nextInt(last - first);\n\t\t\tint death = birth + random.nextInt(last - birth);\n\t\t\tpeople[i] = new Person(birth, death);\n\t\t\t//System.out.println(birth + \", \" + death);\n\t\t}\n\t\tpeople[n] = new Person(first, first);\n\t\t\n\t\tint yearA = QuestionA.maxAliveYear(people, first, last);\n\t\tint yearB = QuestionB.maxAliveYear(people, first, last);\n\t\tint yearC = QuestionC.maxAliveYear(people, first, last);\n\t\tint yearD = QuestionD.maxAliveYear(people, first, last);\n\t\tSystem.out.println(\"A: \" + yearA);\n\t\tSystem.out.println(\"B: \" + yearB);\n\t\tSystem.out.println(\"C: \" + yearC);\n\t\tSystem.out.println(\"D: \" + yearD);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_11_Diving_Board/QuestionA.java",
    "content": "package Q16_11_Diving_Board;\n\nimport java.util.HashSet;\n\npublic class QuestionA {\n\tpublic static int counter = 0;\n\t\n\tpublic static HashSet<Integer> allLengths(int k, int shorter, int longer) {\n\t\tHashSet<Integer> lengths = new HashSet<Integer>();\n\t\tgetAllLengths(k, 0, shorter, longer, lengths);\n\t\treturn lengths;\n\t}\t\n\t\n\tpublic static void getAllLengths(int k, int total, int shorter, int longer, HashSet<Integer> lengths) {\n\t\tcounter++;\n\t\tif (k == 0) {\n\t\t\tlengths.add(total);\n\t\t\treturn;\n\t\t}\n\t\tgetAllLengths(k - 1, total + shorter, shorter, longer, lengths);\n\t\tgetAllLengths(k - 1, total + longer, shorter, longer, lengths);\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tHashSet<Integer> lengths = allLengths(12, 1, 3);\n\t\tSystem.out.println(lengths.toString());\n\t\tSystem.out.println(counter);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_11_Diving_Board/QuestionB.java",
    "content": "package Q16_11_Diving_Board;\n\nimport java.util.HashSet;\n\npublic class QuestionB {\n\tpublic static int counter = 0;\n\t\n\tpublic static HashSet<Integer> allLengths(int k, int shorter, int longer) {\n\t\tHashSet<Integer> lengths = new HashSet<Integer>();\n\t\tHashSet<String> visited = new HashSet<String>(); \n\t\tgetAllLengths(k, 0, shorter, longer, lengths, visited);\n\t\treturn lengths;\n\t}\t\n\t\n\tpublic static void getAllLengths(int k, int total, int shorter, int longer, HashSet<Integer> lengths, HashSet<String> visited) {\n\t\tcounter++;\n\t\tif (k == 0) {\n\t\t\tlengths.add(total);\n\t\t\treturn;\n\t\t}\n\t\tString key = k + \" \" + total;\n\t\tif (visited.contains(key)) {\n\t\t\treturn;\n\t\t}\n\t\tgetAllLengths(k - 1, total + shorter, shorter, longer, lengths, visited);\n\t\tgetAllLengths(k - 1, total + longer, shorter, longer, lengths, visited);\n\t\tvisited.add(key);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tHashSet<Integer> lengths = allLengths(12, 1, 3);\n\t\tSystem.out.println(lengths.toString());\n\t\tSystem.out.println(counter);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_11_Diving_Board/QuestionC.java",
    "content": "package Q16_11_Diving_Board;\n\nimport java.util.HashSet;\n\npublic class QuestionC {\n\tpublic static int counter = 0;\n\t\n\tpublic static HashSet<Integer> allLengths(int k, int shorter, int longer) {\n\t\tcounter++;\n\t\tHashSet<Integer> lengths = new HashSet<Integer>();\n\t\tfor (int nShorter = 0; nShorter <= k; nShorter++) {\n\t\t\tint nLonger = k - nShorter;\n\t\t\tint length = nShorter * shorter + nLonger * longer;\n\t\t\tlengths.add(length);\n\t\t}\n\t\treturn lengths;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tHashSet<Integer> lengths = allLengths(12, 1, 3);\n\t\tSystem.out.println(lengths.toString());\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_11_Diving_Board/Tester.java",
    "content": "package Q16_11_Diving_Board;\n\nimport java.util.HashSet;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tint nSticks = 12;\n\t\tint shorter = 2;\n\t\tint longer = 3;\n\t\tHashSet<Integer> lengthsA = QuestionA.allLengths(nSticks, shorter, longer);\n\t\tHashSet<Integer> lengthsB = QuestionB.allLengths(nSticks, shorter, longer);\n\t\tHashSet<Integer> lengthsC = QuestionC.allLengths(nSticks, shorter, longer);\n\t\tSystem.out.println(QuestionB.counter);\n\t\t\n\t\tSystem.out.println(lengthsA.toString());\n\t\tSystem.out.println(lengthsB.toString());\n\t\tSystem.out.println(lengthsC.toString());\n\t\t\n\t\tSystem.out.println(lengthsA.equals(lengthsB) && lengthsA.equals(lengthsC));\n\t\tSystem.out.println(\"Calls for A: \" + QuestionA.counter);\n\t\tSystem.out.println(\"Calls for B: \" + QuestionB.counter);\n\t\tSystem.out.println(\"Calls for C: \" + QuestionC.counter);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_12_XML_Encoding/Attribute.java",
    "content": "package Q16_12_XML_Encoding;\r\n\r\npublic class Attribute {\r\n\tpublic String tag;\r\n\tpublic String value;\r\n\tpublic Attribute(String t, String v) {\r\n\t\ttag = t;\r\n\t\tvalue = v;\r\n\t}\r\n\t\r\n\tpublic String getTagCode() {\r\n\t\tif (tag == \"family\") {\r\n\t\t\treturn \"1\";\r\n\t\t} else if (tag == \"person\") {\r\n\t\t\treturn \"2\";\r\n\t\t} else if (tag == \"firstName\") {\r\n\t\t\treturn \"3\";\r\n\t\t} else if (tag == \"lastName\") {\r\n\t\t\treturn \"4\";\r\n\t\t} else if (tag == \"state\") {\r\n\t\t\treturn \"5\";\r\n\t\t} \r\n\t\treturn \"--\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_12_XML_Encoding/Element.java",
    "content": "package Q16_12_XML_Encoding;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Element {\r\n\tpublic ArrayList<Attribute> attributes;\r\n\tpublic ArrayList<Element> children;\r\n\tpublic String name;\r\n\tpublic String value;\r\n\t\r\n\tpublic Element(String n) {\r\n\t\tname = n;\r\n\t\tattributes = new ArrayList<Attribute>();\r\n\t\tchildren = new ArrayList<Element>();\r\n\t}\r\n\t\r\n\tpublic Element(String n, String v) {\r\n\t\tname = n;\r\n\t\tvalue = v;\r\n\t\tattributes = new ArrayList<Attribute>();\r\n\t\tchildren = new ArrayList<Element>();\r\n\t}\t\r\n\t\r\n\tpublic String getNameCode() {\r\n\t\tif (name == \"family\") {\r\n\t\t\treturn \"1\";\r\n\t\t} else if (name == \"person\") {\r\n\t\t\treturn \"2\";\r\n\t\t} else if (name == \"firstName\") {\r\n\t\t\treturn \"3\";\r\n\t\t} else if (name == \"lastName\") {\r\n\t\t\treturn \"4\";\r\n\t\t} else if (name == \"state\") {\r\n\t\t\treturn \"5\";\r\n\t\t} \r\n\t\treturn \"--\";\r\n\t}\r\n\t\r\n\tpublic void insert(Attribute attribute) {\r\n\t\tattributes.add(attribute);\r\n\t}\r\n\t\r\n\tpublic void insert(Element child) {\r\n\t\tchildren.add(child);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_12_XML_Encoding/QuestionOO.java",
    "content": "package Q16_12_XML_Encoding;\r\n\r\n\r\npublic class QuestionOO {\r\n\t\r\n\tpublic static void encode(String v, StringBuilder sb) {\r\n\t\tv = v.replace(\"0\", \"\\\\0\");\r\n\t\tsb.append(v);\r\n\t\tsb.append(\" \");\r\n\t}\r\n\t\r\n\tpublic static void encodeEnd(StringBuilder sb) {\r\n\t\tsb.append(\"0\");\r\n\t\tsb.append(\" \");\r\n\t}\r\n\t\r\n\tpublic static void encode(Attribute attr, StringBuilder sb) {\r\n\t\tencode(attr.getTagCode(), sb);\r\n\t\tencode(attr.value, sb);\r\n\t}\r\n\t\r\n\tpublic static void encode(Element root, StringBuilder sb) {\r\n\t\tencode(root.getNameCode(), sb);\r\n\t\tfor (Attribute a : root.attributes) {\r\n\t\t\tencode(a, sb);\r\n\t\t}\r\n\t\tencodeEnd(sb);\r\n\t\tif (root.value != null && root.value != \"\") {\r\n\t\t\tencode(root.value, sb);\r\n\t\t} else {\r\n\t\t\tfor (Element e : root.children) {\r\n\t\t\t\tencode(e, sb);\r\n\t\t\t}\r\n\t\t}\r\n\t\tencodeEnd(sb);\r\n\t}\r\n\t\r\n\tpublic static String encodeToString(Element root) {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\tencode(root, sb);\r\n\t\treturn sb.toString();\r\n\t}\r\n\t\r\n\tpublic static void main(String args[]) {\r\n\t\tElement root = new Element(\"family\");\r\n\t\tAttribute a1 = new Attribute(\"lastName\", \"mcdowell\");\r\n\t\tAttribute a2 = new Attribute(\"state\", \"CA\");\r\n\t\troot.insert(a1);\r\n\t\troot.insert(a2);\r\n\t\t\r\n\t\tElement child = new Element(\"person\", \"Some Message\");\r\n\t\tAttribute a3 = new Attribute(\"firstName\", \"Gayle\");\r\n\t\tchild.insert(a3);\r\n\t\t\r\n\t\troot.insert(child);\r\n\t\t\r\n\t\tString s = encodeToString(root);\r\n\t\tSystem.out.println(s);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_12_XML_Encoding/QuestionString.java",
    "content": "package Q16_12_XML_Encoding;\r\n\r\nimport java.io.ByteArrayOutputStream;\r\nimport java.io.IOException;\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\n\r\npublic class QuestionString {\r\n\tprivate Map<String, Byte> tagMap;\r\n\tprivate static final Byte[] END = { 0, 1 };\r\n\r\n\tprivate ArrayList<String> tokens;\r\n\tprivate int currentTokenIndex;\r\n\r\n\tpublic QuestionString(Map<String, Byte> tagMap) {this.tagMap = tagMap;}\r\n\r\n\tpublic byte[] encode(char[] input) throws IOException {\r\n\t\t// tokenize\r\n\t\ttokenize(input);\r\n\t\tcurrentTokenIndex = 0;\r\n\r\n\t\t// parse\r\n\t\tByteArrayOutputStream outputStream = new ByteArrayOutputStream();\r\n\t\tencodeTokens(outputStream);\r\n\t\treturn outputStream.toByteArray();\r\n\t}\r\n\r\n\tprivate void encodeTokens(ByteArrayOutputStream output) \r\n\t\tthrows IOException {\r\n\t\tnextToken(\"<\");\r\n\r\n\t\t// read tag name\r\n\t\tString tagName = nextToken();\r\n\t\toutput.write(getTagCode(tagName));\r\n\r\n\t\t// read attributes\r\n\t\twhile (!hasNextToken(\">\") && !hasNextTokens(\"/\", \">\")) {\r\n\t\t\t// read next attribute\r\n\t\t\tString key = nextToken();\r\n\t\t\tnextToken(\"=\");\r\n\t\t\tString value = nextToken();\r\n\r\n\t\t\toutput.write(getTagCode(key));\r\n\t\t\tfor (char c : value.toCharArray()) {\r\n\t\t\t\toutput.write(c);\r\n\t\t\t}\r\n\t\t\toutput.write(END[0]);\r\n\t\t\toutput.write(END[1]);\r\n\t\t}\r\n\r\n\t\t// end of attributes\r\n\t\toutput.write(END[0]);\r\n\t\toutput.write(END[1]);\r\n\r\n\t\t// finish this element\r\n\t\tif (hasNextTokens(\"/\", \">\")) {\r\n\t\t\tnextToken(\"/\");\r\n\t\t\tnextToken(\">\");\r\n\t\t} else {\r\n\t\t\tnextToken(\">\");\r\n\t\t\t// while not the end tag\r\n\t\t\twhile (!hasNextTokens(\"<\", \"/\")) {\r\n\t\t\t\t// encode child\r\n\t\t\t\tencodeTokens(output);\r\n\t\t\t}\r\n\t\t\t// ending tag\r\n\t\t\tnextToken(\"<\");\r\n\t\t\tnextToken(\"/\");\r\n\t\t\tnextToken(tagName);\r\n\t\t\tnextToken(\">\");\r\n\t\t}\r\n\r\n\t\toutput.write(END[0]);\r\n\t\toutput.write(END[1]);\r\n\t}\r\n\r\n\tprivate String nextToken() throws IOException {\r\n\t\tif (currentTokenIndex >= tokens.size()) {\r\n\t\t\tthrow new IOException(\"Unexpected end of input.\");\r\n\t\t}\r\n\r\n\t\tString token = tokens.get(currentTokenIndex);\r\n\t\tcurrentTokenIndex++;\r\n\t\treturn token;\r\n\t}\r\n\r\n\tprivate void nextToken(String expectedToken) throws IOException {\r\n\t\tif (currentTokenIndex >= tokens.size()) {\r\n\t\t\tthrow new IOException(\"Unexpected end of input.\");\r\n\t\t}\r\n\r\n\t\tString token = tokens.get(currentTokenIndex);\r\n\t\tif (token.equals(expectedToken)) {\r\n\t\t\tcurrentTokenIndex++;\r\n\t\t} else {\r\n\t\t\tthrow new IOException(\"Unexpected input. Expected '\"\r\n\t\t\t\t\t+ expectedToken + \"'; found '\" + token + \"'.\");\r\n\t\t}\r\n\t}\r\n\r\n\tprivate boolean hasNextToken(String expectedToken) {\r\n\t\tif (currentTokenIndex < tokens.size()) {\r\n\t\t\treturn tokens.get(currentTokenIndex).equals(expectedToken);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate boolean hasNextTokens(String... expectedTokens) {\r\n\t\tif (currentTokenIndex + expectedTokens.length > \r\n\t\t\ttokens.size()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor (int i = 0; i < expectedTokens.length; i++) {\r\n\t\t\tif (!tokens.get(currentTokenIndex + i)\r\n\t\t\t\t\t.equals(expectedTokens[i])) return false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate void tokenize(char[] input) {\r\n\t\ttokens = new ArrayList<String>();\r\n\t\tint i = 0;\r\n\t\twhile (i < input.length) {\r\n\t\t\ti = setNextToken(input, i);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate int setNextToken(char[] input, int inputIndex) {\r\n\t\tint i = inputIndex;\r\n\t\twhile (i < input.length && input[i] == ' ') i++;\r\n\t\tif (i == input.length) return i;\r\n\r\n\t\t// get 1 char token\r\n\t\tchar c = input[i];\r\n\t\tif (c == '<' || c == '>' || c == '=' || c == '/') {\r\n\t\t\ttokens.add(String.valueOf(c));\r\n\t\t\treturn i + 1;\r\n\t\t}\r\n\r\n\t\t// get multiple char token\r\n\t\tStringBuilder string = new StringBuilder();\r\n\t\tdo {\r\n\t\t\tstring.append(c);\r\n\t\t\ti++;\r\n\t\t\tc = input[i];\r\n\t\t\tif (c == '<' || c == '>' || c == '=' || \r\n\t\t\t\tc == '/' || c == ' ') {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} while (i < input.length);\r\n\t\ttokens.add(string.toString());\r\n\t\treturn i;\r\n\t}\r\n\r\n\tprivate byte getTagCode(String tag) throws IOException {\r\n\t\tByte tagCode = tagMap.get(tag);\r\n\t\tif (tagCode == null) {\r\n\t\t\tthrow new IOException(\"Unknown tag: \" + tag);\r\n\t\t}\r\n\t\treturn tagCode;\r\n\t}\r\n\r\n\tpublic static void main(String args[]) {\r\n\t\ttry {\r\n\t\t\tMap<String, Byte> tagMap = new HashMap<String, Byte>();\r\n\t\t\ttagMap.put(\"a\", (byte) 10);\r\n\t\t\ttagMap.put(\"root\", (byte) 11);\r\n\t\t\ttagMap.put(\"href\", (byte) 20);\r\n\t\t\ttagMap.put(\"target\", (byte) 21);\r\n\t\t\ttagMap.put(\"name\", (byte) 50);\r\n\t\t\ttagMap.put(\"id\", (byte) 51);\r\n\r\n\t\t\tQuestionString encoder = new QuestionString(tagMap);\r\n\t\t\tString input;\r\n\t\t\tbyte[] output;\r\n\r\n\t\t\tinput = \"<root></root>\";\r\n\t\t\toutput = encoder.encode(input.toCharArray());\r\n\t\t\tprint(output);\r\n\r\n\t\t\tinput = \"<root id=a />\";\r\n\t\t\toutput = encoder.encode(input.toCharArray());\r\n\t\t\tprint(output);\r\n\r\n\t\t\tinput = \"<root><a href=abc id=xyz></a><a></a></root>\";\r\n\t\t\toutput = encoder.encode(input.toCharArray());\r\n\t\t\tprint(output);\r\n\t\t} catch (Exception ex) {\r\n\t\t\tSystem.out.println(ex);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void print(byte[] output) {\r\n\t\tfor (byte b : output) {\r\n\t\t\tSystem.out.print(b);\r\n\t\t\tSystem.out.print(\" \");\r\n\t\t}\r\n\t\tSystem.out.println();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_13_Bisect_Squares/Line.java",
    "content": "package Q16_13_Bisect_Squares;\r\n\r\npublic class Line {\r\n\tpublic Point start;\r\n\tpublic Point end;\r\n\tpublic Line(Point start, Point end) {\r\n\t\tthis.start = start;\r\n\t\tthis.end = end;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"Line from \" + start.toString() + \" to \" + end.toString();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_13_Bisect_Squares/Point.java",
    "content": "package Q16_13_Bisect_Squares;\r\n\r\npublic class Point {\r\n\tpublic double x;\r\n\tpublic double y;\r\n\tpublic Point(double x, double y) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\t\r\n\tpublic boolean isEqual(Point p) {\r\n\t\treturn (p.x == x && p.y == y);\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"(\" + x + \", \" + y + \")\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_13_Bisect_Squares/Question.java",
    "content": "package Q16_13_Bisect_Squares;\r\n\r\npublic class Question {\r\n\r\n\tpublic static int randomInt(int n) {\r\n\t\treturn (int) (Math.random() * n);\r\n\t}\r\n\t\r\n\tpublic static void printLine(Line l) {\r\n\t\tSystem.out.println(l.start.x + \"\\t\" + l.start.y);\r\n\t\tSystem.out.println(l.end.x + \"\\t\" + l.end.y);\r\n\t}\r\n\t\r\n\tpublic static void printSquare(Square s) {\r\n\t\tSystem.out.println(s.left + \"\\t\" + s.top + \"\\t\" + s.size);\r\n\t}\t\r\n\t\r\n\tpublic static boolean isApproxEqual(double d1, double d2) {\r\n\t\tdouble epsilon = .001;\t\r\n\t\tif (Math.abs(d1 - d2) < epsilon) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tpublic static boolean isApproxEqual(Point p1, Point p2) {\r\n\t\treturn isApproxEqual(p1.x, p2.x) && isApproxEqual(p1.y, p2.y); \r\n\t}\r\n\t\r\n\tpublic static boolean doTest(Square s1, Square s2, Point start, Point end) {\r\n\t\tLine line = s1.cut(s2);\r\n\t\tboolean r = (isApproxEqual(line.start, start) && isApproxEqual(line.end, end)) || (isApproxEqual(line.start, end) && isApproxEqual(line.end, start));\r\n\t\tif (!r) {\r\n\t\t\tprintSquare(s1);\r\n\t\t\tprintSquare(s2);\r\n\t\t\tprintLine(line);\r\n\t\t\tSystem.out.println(start.toString());\r\n\t\t\tSystem.out.println(end.toString());\r\n\t\t\tSystem.out.println();\r\n\t\t\treturn r;\r\n\t\t}\r\n\t\treturn r;\r\n\t}\r\n\t\r\n\tpublic static boolean doTestFull(Square s1, Square s2, Point start, Point end) {\r\n\t\treturn doTest(s1, s2, start, end) && doTest(s2, s1, start, end);\r\n\t}\r\n\t\r\n\tpublic static void doTests() {\r\n\t\t// Equal\r\n\t\tdoTestFull(new Square(1, 1, 5), new Square(1, 1, 5), new Point(3.5, 1), new Point(3.5, 6));\t\r\n\t\t\r\n\t\t// Concentric\r\n\t\tdoTestFull(new Square(1, 1, 5), new Square(2, 2, 3), new Point(3.5, 1), new Point(3.5, 6));\r\n\t\t\r\n\t\t// Partially overlapping -- side by side\r\n\t\tdoTestFull(new Square(10, 10, 10), new Square(8, 10, 10), new Point(8, 15), new Point(20, 15));\r\n\t\t\r\n\t\t// Partially overlapping -- corners\r\n\t\tdoTestFull(new Square(10, 10, 10), new Square(8, 7, 7), new Point(8.777777, 7), new Point(18.8888888, 20));\t\t\r\n\t\t\r\n\t\t// Partially overlapping -- on top of each other\r\n\t\tdoTestFull(new Square(10, 10, 10), new Square(8, 7, 15), new Point(8, 22), new Point(23, 7));\t\t\r\n\t\t\r\n\t\t// Not overlapping -- side by side\r\n\t\tdoTestFull(new Square(10, 10, 10), new Square(19, 25, 4), new Point(12.5, 10), new Point(22, 29));\t\t\t\t\r\n\t\t\r\n\t\t// Not overlapping -- on top of each other\r\n\t\tdoTestFull(new Square(10, 10, 10), new Square(4, 4, 3), new Point(4, 4), new Point(20, 20));\t\t\r\n\t\t\r\n\t\t// Contained\r\n\t\tdoTestFull(new Square(10, 10, 10), new Square(12, 14, 3), new Point(10, 16.66666), new Point(20, 13.333));\t\t\t\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\t/* For an easy way to test these, open up Square Cut Tester.xlsx\r\n\t\t * in the Chapter 7, Problem 5 folder. Copy and paste the exact \r\n\t\t * output from below into the file (including all tabs).\r\n\t\t */\r\n\t\tdoTests();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_13_Bisect_Squares/Square.java",
    "content": "package Q16_13_Bisect_Squares;\r\n\r\npublic class Square {\r\n\tpublic double left;\r\n\tpublic double top;\r\n\tpublic double bottom;\r\n\tpublic double right;\r\n\tpublic double size;\r\n\tpublic Square(double left, double top, double size) {\r\n\t\tthis.left = left;\r\n\t\tthis.top = top;\r\n\t\tthis.bottom = top + size;\r\n\t\tthis.right = left + size;\r\n\t\tthis.size = size;\r\n\t}\r\n\t\r\n\tpublic Point middle() {\r\n\t\treturn new Point((this.left + this.right)/2.0, (this.top + this.bottom)/2.0);\r\n\t}\r\n\t\r\n\tpublic boolean contains(Square other) {\r\n\t\tif (this.left <= other.left && this.right >= other.right && this.top <= other.top && this.bottom >= other.bottom) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\t/* Return the point where the line segment connecting mid1 and\r\n\t * mid2 intercepts the edge of square 1. That is, draw a line \r\n\t * from mid2 to mid1, and continue it out until the edge of\r\n\t * the square. */\r\n\tpublic Point extend(Point mid1, Point mid2, double size) {\r\n\t\t/* Find what direction the line mid2 -> mid1 goes */\r\n\t\tdouble xdir = mid1.x < mid2.x ? -1 : 1;\r\n\t\tdouble ydir = mid1.y < mid2.y ? -1 : 1;\r\n\t\t\r\n\t\t/* If mid1 and mid2 have the same x value, then the slope\r\n\t\t * calculation will throw a divide by 0 exception. So, we\r\n\t\t * compute this specially. */\r\n\t\tif (mid1.x == mid2.x) {\r\n\t\t\treturn new Point(mid1.x, mid1.y + ydir * size / 2.0);\r\n\t\t}\r\n\t\tdouble slope = (mid1.y - mid2.y) / (mid1.x - mid2.x);\r\n\t\tdouble x1 = 0;\r\n\t\tdouble y1 = 0;\r\n\t\t\r\n\t\t/* Calculate slope using the equation (y1 - y2) / (x1 - x2).\r\n\t\t * Note: if the slope is �steep� (>1) then the end of the\r\n\t\t * line segment will hit size / 2 units away from the middle\r\n\t\t * on the y axis. If the slope is �shallow� (<1) the end of\r\n\t\t * the line segment will hit size / 2 units away from the\r\n\t\t * middle on the x axis. */\r\n\t\tif (Math.abs(slope) == 1) {\r\n\t\t\tx1 = mid1.x + xdir * size / 2.0;\r\n\t\t\ty1 = mid1.y + ydir * size / 2.0;\r\n\t\t} else if (Math.abs(slope) < 1) {\r\n\t\t\tx1 = mid1.x + xdir * size / 2.0;\r\n\t\t\ty1 = slope * (x1 - mid1.x) + mid1.y; \r\n\t\t} else {\r\n\t\t\ty1 = mid1.y + ydir * size / 2.0;\r\n\t\t\tx1 = (y1 - mid1.y) / slope + mid1.x;\r\n\t\t}\r\n\t\treturn new Point(x1, y1);\r\n\t}\r\n\t\r\n\tpublic Line cut(Square other) {\r\n\t\t/* Calculate where a line between each middle would collide with the edges of the squares */\r\n\t\tPoint p1 = extend(this.middle(), other.middle(), this.size);\r\n\t\tPoint p2 = extend(this.middle(), other.middle(), -1 * this.size);\r\n\t\tPoint p3 = extend(other.middle(), this.middle(), other.size);\r\n\t\tPoint p4 = extend(other.middle(), this.middle(), -1 * other.size);\r\n\t\r\n\t\t/* Of above points, find start and end of lines. Start is farthest left (with top most as a tie breaker)\r\n\t\t * and end is farthest right (with bottom most as a tie breaker */\r\n\t\tPoint start = p1;\r\n\t\tPoint end = p1;\t\t\r\n\t\tPoint[] points = {p2, p3, p4};\r\n\t\tfor (int i = 0; i < points.length; i++) {\r\n\t\t\tif (points[i].x < start.x || (points[i].x == start.x && points[i].y < start.y)) {\r\n\t\t\t\tstart = points[i];\r\n\t\t\t} else if (points[i].x > end.x || (points[i].x == end.x && points[i].y > end.y)) {\r\n\t\t\t\tend = points[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\t\t\r\n\t\treturn new Line(start, end);\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"(\" + left + \", \" + top + \")|(\" + right + \",\" + bottom + \")\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_14_Best_Line/GraphPoint.java",
    "content": "package Q16_14_Best_Line;\r\n\r\npublic class GraphPoint {\r\n\tpublic double x;\r\n\tpublic double y;\r\n\tpublic GraphPoint(double x1, double y1) {\r\n\t\tx = x1;\r\n\t\ty = y1;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"(\" + x + \", \" + y + \")\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_14_Best_Line/Line.java",
    "content": "package Q16_14_Best_Line;\r\n\r\npublic class Line {\r\n\tpublic static double epsilon = .5;\r\n\tpublic double slope;\r\n\tpublic double intercept;\r\n\t\r\n\tprivate boolean infinite_slope = false;\r\n\t\r\n\tpublic Line(GraphPoint p, GraphPoint q) {\r\n\t\tif (Math.abs(p.x - q.x) > epsilon) { // if x�s are different\r\n\t\t\tslope = (p.y - q.y) / (p.x - q.x); // compute slope\r\n\t\t\tintercept = p.y - slope * p.x; // y intercept from y=mx+b\r\n\t\t} else {\r\n\t\t\tinfinite_slope = true;\r\n\t\t\tintercept = p.x; // x-intercept, since slope is infinite\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic boolean isEquivalent(double a, double b) {\r\n\t\treturn (Math.abs(a - b) < epsilon);\r\n\t}\r\n\t\r\n\tpublic void Print() {\r\n\t\tSystem.out.println(\"y = \" + slope + \"x + \" + intercept);\r\n\t}\r\n\t\t\r\n\tpublic static double floorToNearestEpsilon(double d) {\r\n\t\tint r = (int) (d / epsilon);\r\n\t\treturn ((double) r) * epsilon;\r\n\t}\r\n    \r\n\tpublic boolean isEquivalent(Object o) {  \r\n\t\tLine l = (Line) o;\r\n    \tif (isEquivalent(l.slope, slope) && isEquivalent(l.intercept, intercept) && (infinite_slope == l.infinite_slope)) {\r\n    \t\treturn true;\r\n    \t}\r\n        return false;\r\n    }      \r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_14_Best_Line/Question.java",
    "content": "package Q16_14_Best_Line;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.Set;\r\n\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class Question {\t\r\n\t/* Find line that goes through most number of points. */\r\n\tpublic static Line findBestLine(GraphPoint[] points) {\r\n\t\tHashMapList<Double, Line> linesBySlope = getListOfLines(points);\r\n\t\treturn getBestLine(linesBySlope);\r\n\t}\r\n\t\r\n\t/* Add each pair of points as a line to the list. */\r\n\tpublic static HashMapList<Double, Line> getListOfLines(GraphPoint[] points) {\r\n\t\tHashMapList<Double, Line> linesBySlope = new HashMapList<Double, Line>();\r\n\t\tfor (int i = 0; i < points.length; i++) {\r\n\t\t\tfor (int j = i + 1; j < points.length; j++) {\r\n\t\t\t\tLine line = new Line(points[i], points[j]);\r\n\t\t\t\tdouble key = Line.floorToNearestEpsilon(line.slope);\r\n\t\t\t\tlinesBySlope.put(key, line);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn linesBySlope;\r\n\t}\t\t\r\n\t\r\n\t/* Return the line with the most equivalent other lines. */\r\n\tpublic static Line getBestLine(HashMapList<Double, Line> linesBySlope) {\r\n\t\tLine bestLine = null;\r\n\t\tint bestCount = 0;\r\n\t\t\r\n\t\tSet<Double> slopes = linesBySlope.keySet();\r\n\t\t\r\n\t\tfor (double slope : slopes) {\r\n\t\t\tArrayList<Line> lines = linesBySlope.get(slope);\r\n\t\t\tfor (Line line : lines) {\r\n\t\t\t\t/* count lines that are equivalent to current line */\r\n\t\t\t\tint count = countEquivalentLines(linesBySlope, line);\r\n\t\t\t\t\r\n\t\t\t\t/* if better than current line, replace it */\r\n\t\t\t\tif (count > bestCount) {\r\n\t\t\t\t\tbestLine = line;\r\n\t\t\t\t\tbestCount = count;\r\n\t\t\t\t\tbestLine.Print();\r\n\t\t\t\t\tSystem.out.println(bestCount);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} \r\n\t\treturn bestLine;\r\n\t}\r\n\t\r\n\t/* Check hashmap for lines that are equivalent. Note that we need to check one epsilon above and below the actual slope\r\n\t * since we're defining two lines as equivalent if they're within an epsilon of each other.\r\n\t */\r\n\tpublic static int countEquivalentLines(HashMapList<Double, Line> linesBySlope, Line line) {\r\n\t\tdouble key = Line.floorToNearestEpsilon(line.slope);\r\n\t\tint count = countEquivalentLines(linesBySlope.get(key), line);\r\n\t\tcount += countEquivalentLines(linesBySlope.get(key - Line.epsilon), line);\r\n\t\tcount += countEquivalentLines(linesBySlope.get(key + Line.epsilon), line);\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\t/* Count lines within an array of lines which are \"equivalent\" (slope and y-intercept are within an epsilon value) to a given line */\r\n\tpublic static int countEquivalentLines(ArrayList<Line> lines, Line line) {\r\n\t\tif (lines == null) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\tint count = 0;\r\n\t\tfor (Line parallelLine : lines) {\r\n\t\t\tif (parallelLine.isEquivalent(line)) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count;\t\t\r\n\t}\r\n\t\r\n\r\n\t\r\n\tpublic static GraphPoint[] createPoints() {\r\n\t\tint n_points = 100;\r\n\t\tSystem.out.println(\"Points on Graph\\n***************\");\r\n\t\tGraphPoint[] points = new GraphPoint[n_points - 1];\r\n\t\tfor (int i = 0; i < n_points / 2; i++) {\r\n\t\t\tGraphPoint p = new GraphPoint(i, 2.3 * ((double)i) + 20.0);\r\n\t\t\tpoints[i] = p;\r\n\t\t\tSystem.out.println(p.toString());\r\n\t\t}\r\n\t\tfor (int i = 0; i < n_points / 2 - 1; i++) {\r\n\t\t\tGraphPoint p = new GraphPoint(i, 3.0 * ((double)i) + 1.0);\r\n\t\t\tpoints[n_points / 2 + i] = p;\r\n\t\t\tSystem.out.println(p.toString());\r\n\t\t}\r\n\t\tSystem.out.println(\"****************\\n\");\r\n\t\treturn points;\r\n\t}\r\n\t\r\n\tpublic static int validate(Line line, GraphPoint[] points) {\r\n\t\tint count = 0;\r\n\t\tfor (int i = 0; i < points.length; i++) {\r\n\t\t\tfor (int j = i + 1; j < points.length; j++) {\r\n\t\t\t\tLine other = new Line(points[i], points[j]);\r\n\t\t\t\tif (line.isEquivalent(other)) {\r\n\t\t\t\t\tcount++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tGraphPoint[] points = createPoints();\r\n\t\tLine line = findBestLine(points);\r\n\t\tline.Print();\r\n\t\tSystem.out.println(validate(line, points));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_15_Master_Mind/Question.java",
    "content": "package Q16_15_Master_Mind;\r\n\r\npublic class Question {\r\n\tpublic static int code(char c) {\r\n\t\tswitch (c) {\r\n\t\tcase 'B':\r\n\t\t\treturn 0;\r\n\t\tcase 'G':\r\n\t\t\treturn 1;\r\n\t\tcase 'R':\r\n\t\t\treturn 2;\r\n\t\tcase 'Y':\r\n\t\t\treturn 3;\r\n\t\tdefault:\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static char letterFromCode(int k) {\r\n\t\tswitch (k) {\r\n\t\tcase 0:\r\n\t\t\treturn 'B';\r\n\t\tcase 1:\r\n\t\t\treturn 'G';\r\n\t\tcase 2:\r\n\t\t\treturn 'R';\r\n\t\tcase 3:\r\n\t\t\treturn 'Y';\r\n\t\tdefault:\r\n\t\t\treturn '0';\r\n\t\t}\t\t\r\n\t}\t\r\n\t\r\n\tpublic static int MAX_COLORS = 4;\r\n\t\r\n\tpublic static Result estimate(String guess, String solution) {\r\n\t\tif (guess.length() != solution.length()) return null;\r\n\t\tResult res = new Result(0, 0);\r\n\t\tint[] frequencies = new int[MAX_COLORS];\r\n\t\t    \r\n\t\t/* Compute hits and built frequency table */\r\n\t\tfor (int i = 0; i < guess.length(); i++) {\r\n\t\t\tif (guess.charAt(i) == solution.charAt(i)) {\r\n\t\t\t\tres.hits++;\r\n\t\t\t} else {\r\n\t\t\t\t/* Only increment the frequency table (which will be used for pseudo-hits) if\r\n\t\t\t\t * it's not a hit. If it's a hit, the slot has already been \"used.\" */\r\n\t\t\t\tint code = code(solution.charAt(i));\r\n\t\t\t\tif (code >= 0) {\r\n\t\t\t\t\tfrequencies[code]++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Compute pseudo-hits */\r\n\t\tfor (int i = 0; i < guess.length(); i++) {\r\n\t\t\tint code = code(guess.charAt(i));\r\n\t\t\tif (code >= 0 && frequencies[code] > 0 && guess.charAt(i) != solution.charAt(i)) {\r\n\t\t\t\tres.pseudoHits++;\r\n\t\t\t\tfrequencies[code]--;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn res;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tResult res = estimate(\"GGRR\", \"RGBY\");\r\n\t\tSystem.out.println(res.toString());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_15_Master_Mind/Result.java",
    "content": "package Q16_15_Master_Mind;\n\npublic class Result {\n\tpublic int hits;\n\tpublic int pseudoHits;\n\t\n\tpublic Result(int h, int p) {\n\t\thits = h;\n\t\tpseudoHits = p;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Result [hits=\" + hits + \", pseudoHits=\" + pseudoHits + \"]\";\n\t}\n};\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_15_Master_Mind/Tester.java",
    "content": "package Q16_15_Master_Mind;\r\n\r\nimport java.util.Random;\r\n\r\npublic class Tester {\r\n\r\n\tpublic static Result estimateBad(String g, String s) {\r\n\t\tchar[] guess = g.toCharArray();\r\n\t\tchar[] solution = s.toCharArray();\r\n\t\tint hits = 0;\r\n\t\tfor (int i = 0; i < guess.length; i++) {\r\n\t\t\tif (guess[i] == solution[i]) {\r\n\t\t\t\thits++;\r\n\t\t\t\tsolution[i] = '0';\r\n\t\t\t\tguess[i] = '0';\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tint pseudohits = 0;\r\n\t\t\r\n\t\tfor (int i = 0; i < guess.length; i++) {\r\n\t\t\tif (guess[i] != '0') {\r\n\t\t\t\tfor (int j = 0; j < solution.length; j++) {\r\n\t\t\t\t\tif (solution[j] != '0') {\r\n\t\t\t\t\t\tif (solution[j] == guess[i]) {\r\n\t\t\t\t\t\t\tpseudohits++;\r\n\t\t\t\t\t\t\tsolution[j] = '0';\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn new Result(hits, pseudohits);\r\n\t}\r\n\t\r\n\tpublic static String randomString() {\r\n\t\tint length = 4;\r\n\t\tchar[] str = new char[length];\r\n\t\tRandom generator = new Random();\r\n\t\t\r\n\t\tfor (int i = 0; i < length; i++) {\r\n\t\t\tint v = generator.nextInt(4);\r\n\t\t\tchar c = Question.letterFromCode(v);\r\n\t\t\tstr[i] = c;\r\n\t\t}\r\n\t\t\r\n\t\treturn String.valueOf(str);\r\n\t}\r\n\t\r\n\tpublic static boolean test(String guess, String solution) {\r\n\t\tResult res1 = Question.estimate(guess, solution);\r\n\t\tResult res2 = estimateBad(guess, solution);\r\n\t\tif (res1.hits == res2.hits && res1.pseudoHits == res2.pseudoHits) {\r\n\t\t\treturn true;\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"FAIL: (\" + guess + \", \" + solution + \"): \" + res1.toString() + \" | \" + res2.toString());\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static boolean testRandom() {\r\n\t\tString guess = randomString();\r\n\t\tString solution = randomString();\r\n\t\treturn test(guess, solution);\r\n\t}\r\n\t\r\n\tpublic static boolean test(int count) {\r\n\t\tfor (int i = 0; i < count; i++) {\r\n\t\t\tif (!testRandom()) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\ttest(1000);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_16_Sub_Sort/Question.java",
    "content": "package Q16_16_Sub_Sort;\r\n\r\npublic class Question {\r\n\r\n\tpublic static int findEndOfLeftSubsequence(int[] array) {\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i] < array[i - 1]) {\r\n\t\t\t\treturn i - 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn array.length - 1;\r\n\t}\r\n\t\r\n\tpublic static int findStartOfRightSubsequence(int[] array) {\r\n\t\tfor (int i = array.length - 2; i >= 0; i--) {\r\n\t\t\tif (array[i] > array[i + 1]) {\r\n\t\t\t\treturn i + 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\t\t\r\n\t\r\n\tpublic static int shrinkLeft(int[] array, int min_index, int start) {\r\n\t\tint comp = array[min_index];\r\n\t\tfor (int i = start - 1; i >= 0; i--) {\r\n\t\t\tif (array[i] <= comp) {\r\n\t\t\t\treturn i + 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\tpublic static int shrinkRight(int[] array, int max_index, int start) {\r\n\t\tint comp = array[max_index];\r\n\t\tfor (int i = start; i < array.length; i++) {\r\n\t\t\tif (array[i] >= comp) {\r\n\t\t\t\treturn i - 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn array.length - 1;\r\n\t}\r\n\t\r\n\tpublic static Range findUnsortedSequence(int[] array) {\r\n\t\t// find left subsequence\r\n\t\tint end_left = findEndOfLeftSubsequence(array);\t\r\n\t\t\r\n\t\tif (end_left >= array.length - 1) {\r\n\t\t\t//System.out.println(\"The array is already sorted.\");\r\n\t\t\treturn new Range(0, 0); // Already sorted\r\n\t\t}\r\n\t\t\r\n\t\t// find right subsequence\r\n\t\tint start_right = findStartOfRightSubsequence(array);\t\t\r\n\t\t\r\n\t\tint max_index = end_left; // max of left side\r\n\t\tint min_index = start_right; // min of right side\r\n\t\tfor (int i = end_left + 1; i < start_right; i++) {\r\n\t\t\tif (array[i] < array[min_index]) {\r\n\t\t\t\tmin_index = i;\r\n\t\t\t}\r\n\t\t\tif (array[i] > array[max_index]) {\r\n\t\t\t\tmax_index = i;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\t\r\n\t\t// slide left until less than array[min_index]\r\n\t\tint left_index = shrinkLeft(array, min_index, end_left);\r\n\r\n\t\t// slide right until greater than array[max_index]\r\n\t\tint right_index = shrinkRight(array, max_index, start_right);\r\n\t\t\r\n\t\treturn new Range(left_index, right_index);\r\n\t}\r\n\t\r\n\t/* Validate that sorting between these indices will sort the array. Note that this is not a complete\r\n\t * validation, as it does not check if these are the best possible indices.\r\n\t */\r\n\tpublic static boolean validate(int[] array, int left_index, int right_index) {\r\n\t\tint[] middle = new int[right_index - left_index + 1];\r\n\t\tfor (int i = left_index; i <= right_index; i++) {\r\n\t\t\tmiddle[i - left_index] = array[i];\r\n\t\t}\r\n\t\tjava.util.Arrays.sort(middle);\r\n\t\tfor (int i = left_index; i <= right_index; i++) {\r\n\t\t\tarray[i] = middle[i - left_index];\r\n\t\t}\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i-1] > array[i]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\t\t\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 4, 7, 10, 11, 8, 12, 5, 6, 16, 18, 19};\r\n\t\t\r\n\t\tRange r = findUnsortedSequence(array);\r\n\t\tSystem.out.println(r.toString());\r\n\t\tSystem.out.println(array[r.start] + \", \" + array[r.end]);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_16_Sub_Sort/QuestionB.java",
    "content": "package Q16_16_Sub_Sort;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static int findRightSequenceStart(int[] array) {\r\n\t\tint max = Integer.MIN_VALUE;\r\n\t\tint lastNo = 0;\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tif (max > array[i]) {\r\n\t\t\t\tlastNo = i;\r\n\t\t\t}\r\n\t\t\tmax = Math.max(array[i], max);\r\n\t\t}\r\n\t\treturn lastNo;\r\n\t}\r\n\t\r\n\tpublic static int findLeftSequenceEnd(int[] array) {\r\n\t\tint min = Integer.MAX_VALUE;\r\n\t\tint lastNo = 0;\r\n\t\tfor (int i = array.length - 1; i >= 0; i--) {\r\n\t\t\tif (min < array[i]) {\r\n\t\t\t\tlastNo = i;\r\n\t\t\t}\r\n\t\t\tmin = Math.min(array[i], min);\r\n\t\t}\r\n\t\treturn lastNo;\r\n\t}\r\n\t\r\n\tpublic static Range findUnsortedSequence(int[] array) {\r\n\t\tint leftSequenceEnd = findRightSequenceStart(array);\r\n\t\tint rightSequenceEnd = findLeftSequenceEnd(array);\r\n\t\treturn new Range(leftSequenceEnd, rightSequenceEnd);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 2, 4, 7, 10, 11, 8, 12, 5, 6, 16, 18, 19};\r\n\t\tRange r = findUnsortedSequence(array);\r\n\t\tSystem.out.println(r.toString());\r\n\t\tSystem.out.println(array[r.start] + \", \" + array[r.end]);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_16_Sub_Sort/Range.java",
    "content": "package Q16_16_Sub_Sort;\n\npublic class Range {\n\tpublic int start, end;\n\tpublic Range(int start, int end) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Range [start=\" + start + \", end=\" + end + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result + end;\n\t\tresult = prime * result + start;\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tRange other = (Range) obj;\n\t\tif (end != other.end)\n\t\t\treturn false;\n\t\tif (start != other.start)\n\t\t\treturn false;\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_16_Sub_Sort/Tester.java",
    "content": "package Q16_16_Sub_Sort;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 1000; i++) {\n\t\t\tint[] array = AssortedMethods.randomArray(7, 1, 3);\n\t\t\tRange r1 = Question.findUnsortedSequence(array);\n\t\t\tRange r2 = Question.findUnsortedSequence(array);\n\t\t\tif (r1 == null && r2 == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (r1 == null || !r1.equals(r2)) {\n\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\n\t\t\t\tSystem.out.println(r1 == null ? \"null\" : r1.toString());\n\n\t\t\t\tSystem.out.println(r2 == null ? \"null\" : r2.toString());\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_17_Contiguous_Sequence/Question.java",
    "content": "package Q16_17_Contiguous_Sequence;\r\n\r\npublic class Question {\r\n\t\r\n\tpublic static int getMaxSum(int[] a) {\r\n\t\tint maxSum = 0;\r\n\t\tint runningSum = 0;\r\n\t\tfor (int i = 0; i < a.length; i++) {\r\n\t\t\trunningSum += a[i];\r\n\t\t\tif (maxSum < runningSum) {\r\n\t\t\t\tmaxSum = runningSum;\r\n\t\t\t} else if (runningSum < 0) {\r\n\t\t\t\trunningSum = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn maxSum;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] a = {2, -8, 3, -2, 4, -10};\r\n\t\tSystem.out.println(getMaxSum(a));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_18_Pattern_Matcher/QuestionA.java",
    "content": "package Q16_18_Pattern_Matcher;\n\npublic class QuestionA {\n\n\n\tpublic static boolean doesMatch(String pattern, String value) {\n\t\tif (pattern.length() == 0) return value.length() == 0;\n\t\tint size = value.length();\n\t\t\n\t\tfor (int mainSize = 0; mainSize <= size; mainSize++) {\n\t\t\tString main = value.substring(0, mainSize);\n\t\t\tfor (int altStart = mainSize; altStart <= size; altStart++) {\n\t\t\t\tfor (int altEnd = altStart; altEnd <= size; altEnd++) {\n\t\t\t\t\tString alt = value.substring(altStart, altEnd);\n\t\t\t\t\tString cand = buildFromPattern(pattern, main, alt);\n\t\t\t\t\tif (cand.equals(value)) {\n\t\t\t\t\t\tSystem.out.println(main + \", \" + alt);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static String buildFromPattern(String pattern, String main, String alt) {\t\n\t\tStringBuffer sb = new StringBuffer();\n\t\tchar first = pattern.charAt(0);\n\t\tfor (char c : pattern.toCharArray()) {\n\t\t\tif (c == first) {\n\t\t\t\tsb.append(main);\n\t\t\t} else {\n\t\t\t\tsb.append(alt);\n\t\t\t}\n\t\t}\n\t\treturn sb.toString();\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"ababb\", \"backbatbackbatbat\"}, {\"abab\", \"backsbatbackbats\"}, {\"aba\", \"backsbatbacksbat\"}};\n\t\tfor (String[] test : tests) {\n\t\t\tString pattern = test[0];\n\t\t\tString value = test[1];\n\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + doesMatch(pattern, value));\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_18_Pattern_Matcher/QuestionB.java",
    "content": "package Q16_18_Pattern_Matcher;\n\npublic class QuestionB {\n\t\n\tpublic static String formStringFromPattern(String pattern, String first, String second) {\n\t\tif (pattern.length() == 0) return null;\n\t\t\n\t\tStringBuffer sb = new StringBuffer();\n\t\tchar firstChar = pattern.charAt(0);\n\t\tfor (char c : pattern.toCharArray()) {\n\t\t\tif (c == firstChar) {\n\t\t\t\tsb.append(first);\n\t\t\t} else if (c != firstChar) {\n\t\t\t\tsb.append(second);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t\n\tpublic static int countOf(String pattern, char ch) {\n\t\tint count = 0;\n\t\tfor (char c : pattern.toCharArray()) {\n\t\t\tif (c == ch) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n\t\n\tpublic static String canonical(String pattern) {\n\t\tif (pattern.charAt(0) == 'a') return pattern;\n\t\tStringBuffer sb = new StringBuffer();\n\t\tfor (char c : pattern.toCharArray()) {\n\t\t\tif (c == 'a') {\n\t\t\t\tsb.append('b');\n\t\t\t} else {\n\t\t\t\tsb.append('a');\n\t\t\t}\n\t\t}\n\t\treturn sb.toString();\n\t}\n\n\tpublic static boolean doesMatch(String pattern, String value) {\n\t\tif (pattern.length() == 0) return value.length() == 0;\n\t\t\n\t\tpattern = canonical(pattern);\n\n\t\tint countOfAs = countOf(pattern, 'a');\n\t\tint countOfBs = pattern.length() - countOfAs;\n\t\tint firstB = pattern.indexOf('b');\n\t\t\n\t\tfor (int aSize = 0; aSize <= value.length() / countOfAs; aSize++) {\n\t\t\tint remainingLength = value.length() - aSize * countOfAs;\n\t\t\tString first = value.substring(0, aSize);\n\t\t\tif (countOfBs == 0 || remainingLength % countOfBs == 0) {\n\t\t\t\tint bIndex = firstB * aSize;\n\t\t\t\tint bSize = countOfBs == 0 ? 0 : remainingLength / countOfBs;\n\t\t\t\tString second = countOfBs == 0 ? \"\" : value.substring(bIndex, bSize + bIndex);\n\t\t\t\t\n\t\t\t\tString candidate = formStringFromPattern(pattern, first, second);\n\t\t\t\t\n\t\t\t\tif (candidate.equals(value)) {\n\t\t\t\t\tSystem.out.println(first + \", \" + second);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\t\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"ababb\", \"backbatbackbatbat\"}, {\"abab\", \"backsbatbackbats\"}, {\"aba\", \"backsbatbacksbat\"}};\n\t\tfor (String[] test : tests) {\n\t\t\tString pattern = test[0];\n\t\t\tString value = test[1];\n\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + doesMatch(pattern, value));\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_18_Pattern_Matcher/QuestionC.java",
    "content": "package Q16_18_Pattern_Matcher;\n\npublic class QuestionC {\n\t\n\tpublic static String buildFromPattern(String pattern, String main, String alt) {\t\n\t\tStringBuffer sb = new StringBuffer();\n\t\tchar first = pattern.charAt(0);\n\t\tfor (char c : pattern.toCharArray()) {\n\t\t\tif (c == first) {\n\t\t\t\tsb.append(main);\n\t\t\t} else {\n\t\t\t\tsb.append(alt);\n\t\t\t}\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t\n\tpublic static int countOf(String pattern, char c) {\n\t\tint count = 0;\n\t\tfor (int i = 0; i < pattern.length(); i++) {\n\t\t\tif (pattern.charAt(i) == c) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n\t\n\tpublic static boolean doesMatch(String pattern, String value) {\n\t\tif (pattern.length() == 0) return value.length() == 0;\n\t\t\n\t\tchar mainChar = pattern.charAt(0);\n\t\tchar altChar = mainChar == 'a' ? 'b' : 'a';\n\t\tint size = value.length();\n\n\t\tint countOfMain = countOf(pattern, mainChar);\n\t\tint countOfAlt = pattern.length() - countOfMain;\n\t\tint firstAlt = pattern.indexOf(altChar);\n\t\tint maxMainSize = size / countOfMain;\n\t\t\n\t\tfor (int mainSize = 0; mainSize <= maxMainSize; mainSize++) {\n\t\t\tint remainingLength = size - mainSize * countOfMain;\n\t\t\tString first = value.substring(0, mainSize);\n\t\t\tif (countOfAlt == 0 || remainingLength % countOfAlt == 0) {\n\t\t\t\tint altIndex = firstAlt * mainSize;\n\t\t\t\tint altSize = countOfAlt == 0 ? 0 : remainingLength / countOfAlt;\n\t\t\t\tString second = countOfAlt == 0 ? \"\" : value.substring(altIndex, altSize + altIndex);\n\t\t\t\t\n\t\t\t\tString candidate = buildFromPattern(pattern, first, second);\n\t\t\t\t\n\t\t\t\tif (candidate.equals(value)) {\n\t\t\t\t\tSystem.out.println(first + \", \" + second);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\t\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"ababb\", \"backbatbackbatbat\"}, {\"abab\", \"backsbatbackbats\"}, {\"aba\", \"backsbatbacksbat\"}};\n\t\tfor (String[] test : tests) {\n\t\t\tString pattern = test[0];\n\t\t\tString value = test[1];\n\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + doesMatch(pattern, value));\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_18_Pattern_Matcher/QuestionD.java",
    "content": "package Q16_18_Pattern_Matcher;\n\npublic class QuestionD {\n\tpublic static boolean doesMatch(String pattern, String value) {\n\t\tif (pattern.length() == 0) return value.length() == 0;\n\t\t\n\t\tchar mainChar = pattern.charAt(0);\n\t\tchar altChar = mainChar == 'a' ? 'b' : 'a';\n\t\tint size = value.length();\n\n\t\tint countOfMain = countOf(pattern, mainChar);\n\t\tint countOfAlt = pattern.length() - countOfMain;\n\t\tint firstAlt = pattern.indexOf(altChar);\n\t\tint maxMainSize = size / countOfMain;\n\t\t\n\t\tfor (int mainSize = 0; mainSize <= maxMainSize; mainSize++) {\n\t\t\tint remainingLength = size - mainSize * countOfMain;\n\t\t\tif (countOfAlt == 0 || remainingLength % countOfAlt == 0) {\n\t\t\t\tint altIndex = firstAlt * mainSize;\n\t\t\t\tint altSize = countOfAlt == 0 ? 0 : remainingLength / countOfAlt;\n\t\t\t\tif (matches(pattern, value, mainSize, altSize, altIndex)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\t\n\t\n\tpublic static boolean matches(String pattern, String value, int mainSize, int altSize, int firstAlt) {\n\t\tint stringIndex = mainSize;\n\t\tfor (int i = 1; i < pattern.length(); i++) {\n\t\t\tint size = pattern.charAt(i) == pattern.charAt(0) ? mainSize : altSize;\n\t\t\tint offset = pattern.charAt(i) == pattern.charAt(0) ? 0 : firstAlt;\n\t\t\tif (!isEqual(value, offset, stringIndex, size)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tstringIndex += size;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean isEqual(String s1, int offset1, int offset2, int size) {\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tif (s1.charAt(offset1 + i) != s1.charAt(offset2 + i)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static int countOf(String pattern, char c) {\n\t\tint count = 0;\n\t\tfor (int i = 0; i < pattern.length(); i++) {\n\t\t\tif (pattern.charAt(i) == c) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n \t\n\t\n\t\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"ababb\", \"backbatbackbatbat\"}, {\"abab\", \"backsbatbackbats\"}, {\"aba\", \"backsbatbacksbat\"}};\n\t\tfor (String[] test : tests) {\n\t\t\tString pattern = test[0];\n\t\t\tString value = test[1];\n\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + doesMatch(pattern, value));\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_18_Pattern_Matcher/Tester.java",
    "content": "package Q16_18_Pattern_Matcher;\n\npublic class Tester {\n\tpublic static String invert(String pattern) {\n\t\tString inverted = \"\";\n\t\tfor (char c : pattern.toCharArray()) {\n\t\t\tif (c == 'a') {\n\t\t\t\tinverted += 'b';\n\t\t\t} else if (c == 'b') {\n\t\t\t\tinverted += 'a';\n\t\t\t}\n\t\t}\n\t\treturn inverted;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"ababb\", \"backbatbackbatbat\"}, {\"ababaa\", \"batgobatgobatbat\"}, {\"bb\", \"backback\"}, {\"ababb\", \"backbatbackbatbat\"}, {\"ababb\", \"backbatbackbatbackbat\"}, {\"abab\", \"backsbatbackbats\"}, {\"aba\", \"backsbatbacksbat\"}};\n\t\tfor (String[] test : tests) {\n\t\t\tfor (int i = 0; i <= 1; i++) {\n\t\t\t\tString pattern = i == 0 ? test[0] : invert(test[0]);\n\t\t\t\tString value = test[1];\n\t\t\t\tboolean aMatches = QuestionA.doesMatch(pattern, value);\n\t\t\t\tboolean bMatches = QuestionB.doesMatch(pattern, value);\n\t\t\t\tboolean cMatches = QuestionC.doesMatch(pattern, value);\n\t\t\t\tboolean dMatches = QuestionD.doesMatch(pattern, value);\n\t\t\t\tif (aMatches != bMatches || aMatches != cMatches || aMatches != dMatches) {\n\t\t\t\t\tSystem.out.println(\"ERROR\");\n\t\t\t\t}\n\t\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + aMatches);\n\t\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + bMatches);\n\t\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + cMatches);\n\t\t\t\tSystem.out.println(pattern + \", \" + value + \": \" + dMatches);\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_19_Pond_Sizes/QuestionA.java",
    "content": "package Q16_19_Pond_Sizes;\n\nimport java.util.ArrayList;\n\npublic class QuestionA {\t\n\tpublic static ArrayList<Integer> computePondSizes(int[][] land) {\n\t\tArrayList<Integer> pondSizes = new ArrayList<Integer>();\n\t\tfor (int r = 0; r < land.length; r++) {\n\t\t\tfor (int c = 0; c < land[r].length; c++) {\n\t\t\t\tif (land[r][c] == 0) {\n\t\t\t\t\tint size = computeSize(land, r, c);\t\t\t\t\t\n\t\t\t\t\tpondSizes.add(size);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn pondSizes;\n\t}\n\t\n\tpublic static int computeSize(int[][] land, int row, int col) {\n\t\t/* If out of bounds or already visited. */\n\t\tif (row < 0 || col < 0 || row >= land.length || col >= land[row].length || land[row][col] != 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tint size = 1;\n\t\tland[row][col] = -1;\n\t\tfor (int dr = -1; dr <= 1; dr++) {\n\t\t\tfor (int dc = -1; dc <= 1; dc++) {\n\t\t\t\tsize += computeSize(land, row + dr, col + dc);\n\t\t\t}\n\t\t}\n\t\treturn size;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\t\n\t\tint[][] land = {{0, 2, 1, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}, {0, 1, 0, 1}};\n\t\tArrayList<Integer> sizes = computePondSizes(land);\n\t\tfor (int sz : sizes) {\n\t\t\tSystem.out.println(sz);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_19_Pond_Sizes/QuestionB.java",
    "content": "package Q16_19_Pond_Sizes;\n\nimport java.util.ArrayList;\n\npublic class QuestionB {\n\t\n\tpublic static ArrayList<Integer> computePondSizes(int[][] land) {\n\t\tboolean[][] visited = new boolean[land.length][land[0].length];\n\t\tArrayList<Integer> pondSizes = new ArrayList<Integer>();\n\t\tfor (int r = 0; r < land.length; r++) {\n\t\t\tfor (int c = 0; c < land[r].length; c++) {\n\t\t\t\tint size = computeSize(land, visited, r, c);\n\t\t\t\tif (size > 0) {\n\t\t\t\t\tpondSizes.add(size);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn pondSizes;\n\t}\n\t\n\tpublic static int computeSize(int[][] land, boolean[][] visited, int row, int col) {\n\t\t/* If out of bounds or already visited. */\n\t\tif (row < 0 || col < 0 || row >= land.length || col >= land[row].length || visited[row][col] || land[row][col] != 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tint size = 1;\n\t\tvisited[row][col] = true;\n\t\tfor (int dr = -1; dr <= 1; dr++) {\n\t\t\tfor (int dc = -1; dc <= 1; dc++) {\n\t\t\t\tsize += computeSize(land, visited, row + dr, col + dc);\n\t\t\t}\n\t\t}\n\t\treturn size;\n\t}\n\t\n\tpublic static void main(String[] args) {\t\n\t\tint[][] land = {{0, 2, 1, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}, {0, 1, 0, 1}};\n\t\tArrayList<Integer> sizes = computePondSizes(land);\n\t\tfor (int sz : sizes) {\n\t\t\tSystem.out.println(sz);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_20_T9/QuestionA.java",
    "content": "package Q16_20_T9;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\n\nimport CtCILibrary.AssortedMethods;\nimport CtCILibrary.TrieNode;\n\npublic class QuestionA {\n\tpublic static char[][] t9Letters = {\n\t\t\tnull, \t\t\t\t\t// 0\n\t\t\tnull, \t\t\t\t\t// 1\n\t\t\t{'a', 'b', 'c'}, \t\t// 2\n\t\t\t{'d', 'e', 'f'}, \t\t// 3\n\t\t\t{'g', 'h', 'i'}, \t\t// 4\n\t\t\t{'j', 'k', 'l'},\t\t// 5\n\t\t\t{'m', 'n', 'o'},\t\t// 6\n\t\t\t{'p', 'q', 'r', 's'}, \t// 7\n\t\t\t{'t', 'u', 'v'},\t\t// 8\n\t\t\t{'w', 'x', 'y', 'z'} \t// 9\n\t};\n\t\n\tpublic static char[] getT9Chars(char digit) {\n\t\tif (!Character.isDigit(digit)) {\n\t\t\treturn null;\n\t\t}\n\t\tint dig = Character.getNumericValue(digit) - Character.getNumericValue('0');\n\t\treturn t9Letters[dig];\n\t}\n\t\n\tpublic static void getValidWords(String number, int index, String prefix, HashSet<String> wordSet, ArrayList<String> results) {\n\t\t/* If it's a complete word, print it. */\n\t\tif (index == number.length() ) {\n\t\t\tif (wordSet.contains(prefix)) {\n\t\t\t\tresults.add(prefix);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Get characters that match this digit */\n\t\tchar digit = number.charAt(index);\n\t\tchar[] letters = getT9Chars(digit);\n\t\t\n\t\t/* Go through all remaining options. */\n\t\tif (letters != null) {\n\t\t\tfor (char letter : letters) {\n\t\t\t\tgetValidWords(number, index + 1, prefix + letter, wordSet, results);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static ArrayList<String> getValidT9Words(String number, HashSet<String> wordList) {\n\t\tArrayList<String> results = new ArrayList<String>();\n\t\tgetValidWords(number, 0, \"\", wordList, results);\n\t\treturn results;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tArrayList<String> words = getValidT9Words(\"33835676368\", AssortedMethods.getWordListAsHashSet());\n\t\tfor (String w: words) {\n\t\t\tSystem.out.println(w);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_20_T9/QuestionB.java",
    "content": "package Q16_20_T9;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\n\nimport CtCILibrary.AssortedMethods;\nimport CtCILibrary.Trie;\nimport CtCILibrary.TrieNode;\n\npublic class QuestionB {\n\tpublic static char[][] t9Letters = {\n\t\t\tnull, \t\t\t\t\t// 0\n\t\t\tnull, \t\t\t\t\t// 1\n\t\t\t{'a', 'b', 'c'}, \t\t// 2\n\t\t\t{'d', 'e', 'f'}, \t\t// 3\n\t\t\t{'g', 'h', 'i'}, \t\t// 4\n\t\t\t{'j', 'k', 'l'},\t\t// 5\n\t\t\t{'m', 'n', 'o'},\t\t// 6\n\t\t\t{'p', 'q', 'r', 's'}, \t// 7\n\t\t\t{'t', 'u', 'v'},\t\t// 8\n\t\t\t{'w', 'x', 'y', 'z'} \t// 9\n\t};\n\t\n\tpublic static char[] getT9Chars(char digit) {\n\t\tif (!Character.isDigit(digit)) {\n\t\t\treturn null;\n\t\t}\n\t\tint dig = Character.getNumericValue(digit) - Character.getNumericValue('0');\n\t\treturn t9Letters[dig];\n\t}\n\t\n\tpublic static void getValidWords(String number, int index, String prefix, TrieNode trieNode, ArrayList<String> results) {\n\t\t/* If it's a complete word, print it. */\n\t\tif (index == number.length()) {\n\t\t\tif (trieNode.terminates()) { // Is complete word\n\t\t\t\tresults.add(prefix);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Get characters that match this digit */\n\t\tchar digit = number.charAt(index);\n\t\tchar[] letters = getT9Chars(digit);\n\t\t\n\t\t/* Go through all remaining options. */\n\t\tif (letters != null) {\t\t\n\t\t\tfor (char letter : letters) {\n\t\t\t\tTrieNode child = trieNode.getChild(letter);\n\t\t\t\tif (child != null) { /* If there are words that start with prefix + letter, continue */\n\t\t\t\t\tgetValidWords(number, index + 1, prefix + letter, child, results);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static ArrayList<String> getValidT9Words(String number, Trie trie) {\n\t\tArrayList<String> results = new ArrayList<String>();\n\t\tgetValidWords(number, 0, \"\", trie.getRoot(), results);\n\t\treturn results;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tArrayList<String> words = getValidT9Words(\"8733\", AssortedMethods.getTrieDictionary());\n\t\tfor (String w: words) {\n\t\t\tSystem.out.println(w);\n\t\t}\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_20_T9/QuestionC.java",
    "content": "package Q16_20_T9;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport CtCILibrary.AssortedMethods;\nimport CtCILibrary.HashMapList;\n\npublic class QuestionC {\n\tpublic static int numLetters = 26;\n\tpublic static char[][] t9Letters = {\n\t\t\tnull, \t\t\t\t\t// 0\n\t\t\tnull, \t\t\t\t\t// 1\n\t\t\t{'a', 'b', 'c'}, \t\t// 2\n\t\t\t{'d', 'e', 'f'}, \t\t// 3\n\t\t\t{'g', 'h', 'i'}, \t\t// 4\n\t\t\t{'j', 'k', 'l'},\t\t// 5\n\t\t\t{'m', 'n', 'o'},\t\t// 6\n\t\t\t{'p', 'q', 'r', 's'}, \t// 7\n\t\t\t{'t', 'u', 'v'},\t\t// 8\n\t\t\t{'w', 'x', 'y', 'z'} \t// 9\n\t};\n\t\n\t/* Convert from a string to its T9 representation. */\n\tpublic static String convertToT9(String word, HashMap<Character, Character> letterToNumberMap) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (char c : word.toCharArray()) {\n\t\t\tif (letterToNumberMap.containsKey(c)) {\n\t\t\t\tchar digit = letterToNumberMap.get(c);\n\t\t\t\tsb.append(digit);\n\t\t\t}\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t\n\t/* Convert mapping of number->letters into letter->number */\n\tpublic static HashMap<Character, Character> createLetterToNumberMap() {\n\t\tHashMap<Character, Character> letterToNumberMap = new HashMap<Character, Character>();\n\t\tfor (int i = 0; i < t9Letters.length; i++) {\n\t\t\tchar[] letters = t9Letters[i];\n\t\t\tif (letters != null) {\n\t\t\t\tfor (char letter : letters) {\n\t\t\t\t\tchar c = Character.forDigit(i, 10);\n\t\t\t\t\tletterToNumberMap.put(letter, c);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\t\treturn letterToNumberMap;\n\t}\n\t\n\t/* Create a hash table that maps from a number to all words that\n\t * have this numerical representation. */\n\tpublic static HashMapList<String, String> initializeDictionary(String[] words) {\n\t\t/* Create hash table that maps from a letter to the digit */\n\t\tHashMap<Character, Character> letterToNumberMap = createLetterToNumberMap();\n\t\t\n\t\t/* Create word -> number map */\n\t\tHashMapList<String, String> wordsToNumbers = new HashMapList<String, String>(); \n\t\tfor (String word : words) {\n\t\t\tString numbers = convertToT9(word, letterToNumberMap);\n\t\t\twordsToNumbers.put(numbers, word);\n\t\t}\n\t\treturn wordsToNumbers;\n\t}\n\t\n\tpublic static ArrayList<String> getValidT9Words(String numbers, HashMapList<String, String> dictionary) {\n\t\treturn dictionary.get(numbers);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tHashMapList<String, String> dictionary = initializeDictionary(AssortedMethods.getListOfWords());\n\t\tArrayList<String> words = getValidT9Words(\"8733\", dictionary);\n\t\tfor (String w: words) {\n\t\t\tSystem.out.println(w);\n\t\t}\t\n\n\t}\n\n}"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_21_Sum_Swap/QuestionA.java",
    "content": "package Q16_21_Sum_Swap;\n\npublic class QuestionA {\n\t\n\tpublic static int sum(int[] array) {\n\t\tint s = 0;\n\t\tfor (int a : array) {\n\t\t\ts += a;\n\t\t}\n\t\treturn s;\n\t}\n\t\n\tpublic static int[] findSwapValues(int[] array1, int[] array2) {\n\t\tint sum1 = sum(array1);\n\t\tint sum2 = sum(array2);\n\t\t\t\t\n\t\tfor (int one : array1) {\n\t\t\tfor (int two : array2) {\n\t\t\t\tint newSum1 = sum1 - one + two;\n\t\t\t\tint newSum2 = sum2 - two + one;\n\t\t\t\tif (newSum1 == newSum2) {\n\t\t\t\t\tint[] values = {one, two};\n\t\t\t\t\treturn values;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {1, 1, 1, 2, 2, 4};\n\t\tint[] array2 = {3, 3, 3, 6};\n\t\tint[] swaps = findSwapValues(array1, array2);\n\t\tif (swaps == null) {\n\t\t\tSystem.out.println(\"null\");\n\t\t} else {\n\t\t\tSystem.out.println(swaps[0] + \" \" + swaps[1]);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_21_Sum_Swap/QuestionB.java",
    "content": "package Q16_21_Sum_Swap;\n\npublic class QuestionB {\n\tpublic static int[] findSwapValues(int[] array1, int[] array2) {\n\t\tInteger target = getTarget(array1, array2);\n\t\tif (target == null) return null;\n\t\t\t\t\n\t\tfor (int one : array1) {\n\t\t\tfor (int two : array2) {\n\t\t\t\tif (one - two == target) {\n\t\t\t\t\tint[] values = {one, two};\n\t\t\t\t\treturn values;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static Integer getTarget(int[] array1, int[] array2) {\n\t\tint sum1 = sum(array1);\n\t\tint sum2 = sum(array2);\n\t\t\n\t\tif ((sum1 - sum2) % 2 != 0) return null;\n\t\t\n\t\treturn (sum1 - sum2) / 2;\n\t}\t\n\t\n\tpublic static int sum(int[] array) {\n\t\tint s = 0;\n\t\tfor (int a : array) {\n\t\t\ts += a;\n\t\t}\n\t\treturn s;\n\t}\n\t\n\t\n\t\n\n\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {1, 1, 1, 2, 2, 4};\n\t\tint[] array2 = {3, 3, 3, 6};\n\t\tint[] swaps = findSwapValues(array1, array2);\n\t\tif (swaps == null) {\n\t\t\tSystem.out.println(\"null\");\n\t\t} else {\n\t\t\tSystem.out.println(swaps[0] + \" \" + swaps[1]);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_21_Sum_Swap/QuestionC.java",
    "content": "package Q16_21_Sum_Swap;\n\nimport java.util.HashSet;\n\npublic class QuestionC {\n\t\n\tpublic static int sum(int[] array) {\n\t\tint s = 0;\n\t\tfor (int a : array) {\n\t\t\ts += a;\n\t\t}\n\t\treturn s;\n\t}\n\t\n\tpublic static int[] findSwapValues(int[] array1, int[] array2) {\n\t\tInteger target = getTarget(array1, array2);\n\t\tif (target == null) return null;\n\t\treturn findDifference(array1, array2, target);\n\t}\n\t\n\tpublic static int[] findDifference(int[] array1, int[] array2, int target) {\n\t\tHashSet<Integer> contents2 = getContents(array2);\n\t\tfor (int one : array1) {\n\t\t\tint two = one - target;\n\t\t\tif (contents2.contains(two)) {\n\t\t\t\tint[] values = {one, two};\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static Integer getTarget(int[] array1, int[] array2) {\n\t\tint sum1 = sum(array1);\n\t\tint sum2 = sum(array2);\n\t\t\n\t\tif ((sum1 - sum2) % 2 != 0) return null;\n\t\treturn (sum1 - sum2) / 2;\n\t}\n\t\n\tpublic static HashSet<Integer> getContents(int[] array) {\n\t\tHashSet<Integer> set = new HashSet<Integer>();\n\t\tfor (int a : array) {\n\t\t\tset.add(a);\n\t\t}\n\t\treturn set;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {-9, -1, -4, 8, 9, 6, -5, -7, 3, 9};\n\t\tint[] array2 = {6, 6, 4, -1, 7, -6, -9, 4, -8, 8};\n\t\tint[] swaps = findSwapValues(array1, array2);\n\t\tif (swaps == null) {\n\t\t\tSystem.out.println(\"null\");\n\t\t} else {\n\t\t\tSystem.out.println(swaps[0] + \" \" + swaps[1]);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_21_Sum_Swap/QuestionD.java",
    "content": "package Q16_21_Sum_Swap;\n\nimport java.util.Arrays;\nimport java.util.HashSet;\n\npublic class QuestionD {\n\t\n\tpublic static int sum(int[] array) {\n\t\tint s = 0;\n\t\tfor (int a : array) {\n\t\t\ts += a;\n\t\t}\n\t\treturn s;\n\t}\n\t\n\tpublic static Integer getTarget(int[] array1, int[] array2) {\n\t\tint sum1 = sum(array1);\n\t\tint sum2 = sum(array2);\n\t\t\n\t\tif ((sum1 - sum2) % 2 != 0) return null;\n\t\treturn (sum1 - sum2) / 2;\n\t}\n\t\n\tpublic static int[] findSwapValues(int[] array1, int[] array2) {\n\t\tInteger target = getTarget(array1, array2);\n\t\tif (target == null) return null;\n\t\treturn findDifference(array1, array2, target);\n\t}\n\t\n\tpublic static int[] findDifference(int[] array1, int[] array2, int target) {\n\t\tArrays.sort(array1);\n\t\tArrays.sort(array2);\n\t\t\n\t\tint a = 0;\n\t\tint b = 0;\n\t\t\n\t\twhile (a < array1.length && b < array2.length) {\n\t\t\tint difference = array1[a] - array2[b]; \n\t\t\t/* Compare difference to target. If difference is too small, then\n\t\t\t * make it bigger by moving a to a bigger value. If it is too big,\n\t\t\t * then make it smaller by moving b to a bigger value. If it's\n\t\t\t * just right, return this pair. */\n\t\t\tif (difference == target) {\n\t\t\t\tint[] values = {array1[a], array2[b]};\n\t\t\t\treturn values;\n\t\t\t} else if (difference < target) { \n\t\t\t\ta++;\n\t\t\t} else {\n\t\t\t\tb++;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array1 = {1, 1, 1, 2, 2, 4};\n\t\tint[] array2 = {3, 3, 3, 6};\n\t\tint[] swaps = findSwapValues(array1, array2);\n\t\tif (swaps == null) {\n\t\t\tSystem.out.println(\"null\");\n\t\t} else {\n\t\t\tSystem.out.println(swaps[0] + \" \" + swaps[1]);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_21_Sum_Swap/Tester.java",
    "content": "package Q16_21_Sum_Swap;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\t\n\tpublic static boolean isEquivalent(int[] a, int[] b, int[] c, int[] d) {\n\t\tif (a == null || b == null || c == null || d == null) {\n\t\t\treturn a == null && b == null && c == null && d == null;\n\t\t}\n\t\treturn difference(a) == difference(b) && difference(a) == difference(c) && difference(a) == difference(d);\n\t}\n\t\n\tpublic static int difference(int[] a) {\n\t\tif (a.length != 2) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn a[0] - a[1];\n\t}\n\t\n\tpublic static String arrayToString(int[] array) {\n\t\tStringBuffer sb = new StringBuffer();\n\t\tfor (int a : array) {\n\t\t\tsb.append(a + \" \");\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint count = 0;\n\t\tint max = 100;\n\t\twhile (count < max) {\n\t\t\tint[] array1 = AssortedMethods.randomArray(10, -10,  10);\n\t\t\tint[] array2 = AssortedMethods.randomArray(10, -10,  10);;\n\t\t\tint[] swapsA = QuestionA.findSwapValues(array1, array2);\n\t\t\tint[] swapsB = QuestionB.findSwapValues(array1, array2);\n\t\t\tint[] swapsC = QuestionC.findSwapValues(array1, array2);\n\t\t\tint[] swapsD = QuestionD.findSwapValues(array1, array2);\n\t\t\t\n\t\t\tif (swapsA != null || swapsB != null || swapsC != null || swapsD != null) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t\t\n\t\t\tif (!isEquivalent(swapsA, swapsB, swapsC, swapsD)) {\n\t\t\t\tSystem.out.println(\"Error\");\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array1));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array2));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsA));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsB));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsC));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsD));\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"Equivalent.\");\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array1));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(array2));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsA));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsB));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsC));\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(swapsD));\n\t\t\t\tSystem.out.println(\"\\n\");\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_22_Langtons_Ant/Ant.java",
    "content": "package Q16_22_Langtons_Ant;\n\npublic class Ant {\n\tpublic Position position = new Position(0, 0);\n\tpublic Orientation orientation = Orientation.right;\n\t\n\tpublic void turn(boolean clockwise) {\n\t\torientation = orientation.getTurn(clockwise);\n\t}\n\t\n\tpublic void move() {\n\t\tif (orientation == Orientation.left) {\n\t\t\tposition.column--;\n\t\t} else if (orientation == Orientation.right) {\n\t\t\tposition.column++;\n\t\t} else if (orientation == Orientation.up) {\n\t\t\tposition.row--;\n\t\t} else if (orientation == Orientation.down) {\n\t\t\tposition.row++;\n\t\t}\n\t}\n\t\n\tpublic void adjustPosition(int shiftRow, int shiftColumn) {\n\t\tposition.row += shiftRow;\n\t\tposition.column += shiftColumn;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_22_Langtons_Ant/Board.java",
    "content": "package Q16_22_Langtons_Ant;\n\nimport java.util.HashSet;\n\npublic class Board {\t\n\tprivate HashSet<Position> blackCells = new HashSet<Position>();\n\tprivate Ant ant = new Ant();\n\tprivate Position topLeftCorner = new Position(0, 0);\n\tprivate Position bottomRightCorner = new Position(0, 0);\n\t\n\tpublic Board() { }\n\t\n\t/* Move ant. */\n\tpublic void move() {\n\t\tant.turn(!isBlack(ant.position)); // Turn clockwise on white, counter on black\n\t\tflip(ant.position); // flip\n\t\tant.move(); // move\n\t\tensureFit(ant.position);\n\t}\n\t\n\t/* Flip color of cells. */\n\tprivate void flip(Position position) {\n\t\tif (blackCells.contains(position)) {\n\t\t\tblackCells.remove(position);\n\t\t} else {\n\t\t\tblackCells.add(position.clone());\n\t\t}\n\t}\n\t\n\t/* \"Grow\" the grid by tracking the most top-left and \n\t * bottom-right position that we've seen. */\n\tprivate void ensureFit(Position position) {\n\t\tint row = position.row;\n\t\tint column = position.column;\n\t\t\n\t\ttopLeftCorner.row = Math.min(topLeftCorner.row, row);\n\t\ttopLeftCorner.column = Math.min(topLeftCorner.column, column);\n\n\t\tbottomRightCorner.row = Math.max(bottomRightCorner.row, row);\n\t\tbottomRightCorner.column = Math.max(bottomRightCorner.column, column);\n\t}\t\n\t\n\t/* Check if cell is white. */\n\tpublic boolean isBlack(Position p) {\n\t\treturn blackCells.contains(p);\n\t}\n\t\n\t/* Check if cell is white. */\n\tpublic boolean isBlack(int row, int column) {\n\t\treturn blackCells.contains(new Position(row, column));\n\t}\t\n\t\n\t/* Print board. */\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tint rowMin = topLeftCorner.row;\n\t\tint rowMax = bottomRightCorner.row;\n\t\tint colMin = topLeftCorner.column;\n\t\tint colMax = bottomRightCorner.column;\n\t\tfor (int r = rowMin; r <= rowMax; r++) {\n\t\t\tfor (int c = colMin; c <= colMax; c++) {\n\t\t\t\tif (r == ant.position.row && c == ant.position.column) {\n\t\t\t\t\tsb.append(ant.orientation);\n\t\t\t\t} else if (isBlack(r, c)) {\n\t\t\t\t\tsb.append(\"X\");\n\t\t\t\t} else {\n\t\t\t\t\tsb.append(\"_\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tsb.append(\"\\n\");\n\t\t}\n\t\tsb.append(\"Ant: \" + ant.orientation + \". \\n\");\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_22_Langtons_Ant/Grid.java",
    "content": "package Q16_22_Langtons_Ant;\n\npublic class Grid {\t\n\tprivate boolean[][] grid; // false is white, true is black\n\tprivate Ant ant = new Ant();\n\t\n\tpublic Grid() {\n\t\tgrid = new boolean[1][1];\n\t}\n\t\n\t/* Copy old values into new array, with an offset/shift applied to the row and columns. */\n\tprivate void copyWithShift(boolean[][] oldGrid, boolean[][] newGrid, int shiftRow, int shiftColumn) {\n\t\tfor (int r = 0; r < oldGrid.length; r++) {\n\t\t\tfor (int c = 0; c < oldGrid[0].length; c++) {\n\t\t\t\tnewGrid[r + shiftRow][c + shiftColumn] = oldGrid[r][c];\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* Ensure that the given position will fit on the array. If \n\t * necessary, double the size of the matrix, copy the old values \n\t * over, and adjust the ant's position so that it's in a positive\n\t * ranges.\n\t */\n\tprivate void ensureFit(Position position) {\n\t\tint shiftRow = 0;\n\t\tint shiftColumn = 0;\n\t\t\n\t\t/* Calculate new number of rows. */\n\t\tint numRows = grid.length;\n\t\tif (position.row < 0) {\n\t\t\tshiftRow = numRows;\n\t\t\tnumRows *= 2;\n\t\t} else if (position.row >= numRows) {\n\t\t\tnumRows *= 2;\n\t\t}\n\t\t\n\t\t/* Calculate new number of columns. */\n\t\tint numColumns = grid[0].length;\n\t\tif (position.column < 0) {\n\t\t\tshiftColumn = numColumns;\n\t\t\tnumColumns *= 2;\n\t\t} else if (position.column >= numColumns) {\n\t\t\tnumColumns *= 2;\n\t\t}\n\t\t\n\t\t/* Grow array, if necessary. Shift ant's position too. */\n\t\tif (numRows != grid.length || numColumns != grid[0].length) {\n\t\t\tboolean[][] newGrid = new boolean[numRows][numColumns];\n\t\t\tcopyWithShift(grid, newGrid, shiftRow, shiftColumn);\n\t\t\tant.adjustPosition(shiftRow, shiftColumn);\n\t\t\tgrid = newGrid;\n\t\t}\n\t}\n\t\n\t/* Flip color of cells. */\n\tprivate void flip(Position position) {\n\t\tint row = position.row;\n\t\tint column = position.column;\n\t\tgrid[row][column] = grid[row][column] ? false : true;\n\t}\n\t\n\t/* Move ant. */\n\tpublic void move() {\n\t\tant.turn(!grid[ant.position.row][ant.position.column]); // Turn clockwise on white, counterclockwise on black\n\t\tflip(ant.position); // flip\n\t\tant.move(); // move\n\t\tensureFit(ant.position); // grow\n\t}\n\t\n\t/* Print board. The first loop of this is a \"compression\" which only prints the active parts of the board. The active\n\t * board is the smallest rectangle that contains all the black cells and the ant. This is fairly optional. Nice to do\n\t * but also not essential. \n\t * FULL BOARD:    ACTIVE BOARD:\n\t *  _____          _X\n\t *  ___X_          XX\n\t *  __XX_           X\n\t *  ___X_\n\t *  _____\n\t *  _____*/\n\tpublic String toString() {\n\t\tint firstActiveRow = grid.length;\n\t\tint firstActiveColumn = grid[0].length;\n\t\tint lastActiveRow = 0;\n\t\tint lastActiveColumn = 0;\t\t\n\t\tfor (int r = 0; r < grid.length; r++) {\n\t\t\tfor (int c = 0; c < grid[r].length; c++) {\n\t\t\t\tif (grid[r][c] || (ant.position.row == r && ant.position.column == c)) { // If there's something there\n\t\t\t\t\tfirstActiveRow = Math.min(firstActiveRow, r);\n\t\t\t\t\tfirstActiveColumn = Math.min(firstActiveColumn, c);\n\t\t\t\t\tlastActiveRow = Math.max(lastActiveRow, r);\n\t\t\t\t\tlastActiveColumn = Math.max(lastActiveColumn, c);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\t\t\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (int r = firstActiveRow; r <= lastActiveRow; r++) {\n\t\t\tfor (int c = firstActiveColumn; c <= lastActiveColumn; c++) {\n\t\t\t\tif (r == ant.position.row && c == ant.position.column) {\n\t\t\t\t\tsb.append(ant.orientation);\n\t\t\t\t} else if (grid[r][c]) {\n\t\t\t\t\tsb.append(\"X\");\n\t\t\t\t} else {\n\t\t\t\t\tsb.append(\"_\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tsb.append(\"\\n\");\n\t\t}\n\t\tsb.append(\"Ant: \" + ant.orientation + \". \\n\");\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_22_Langtons_Ant/Orientation.java",
    "content": "package Q16_22_Langtons_Ant;\n\npublic enum Orientation {\n\tleft, up, right, down;\n\t\n\tpublic Orientation getTurn(boolean clockwise) {\n\t\tif (this == left) {\n\t\t\treturn clockwise ? up : down;\n\t\t} else if (this == up) {\n\t\t\treturn clockwise ? right : left;\n\t\t} else if (this == right) {\n\t\t\treturn clockwise ? down : up;\n\t\t} else { // down\n\t\t\treturn clockwise ? left : right;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\tif (this == left) {\n\t\t\treturn \"\\u2190\";\n\t\t} else if (this == up) {\n\t\t\treturn \"\\u2191\";\n\t\t} else if (this == right) {\n\t\t\treturn \"\\u2192\";\n\t\t} else { // down\n\t\t\treturn \"\\u2193\";\n\t\t}\t\t\t\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_22_Langtons_Ant/Position.java",
    "content": "package Q16_22_Langtons_Ant;\n\npublic class Position {\n\tpublic int row;\n\tpublic int column;\n\t\n\tpublic Position(int row, int column) {\n\t\tthis.row = row;\n\t\tthis.column = column;\n\t}\n\t\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (o instanceof Position) { \n\t\t\tPosition p = (Position) o;\n\t\t\treturn p.row == row && p.column == column;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic int hashCode() {\n\t\treturn (row * 31) ^ column;\n\t}\n\t\n\tpublic Position clone() {\n\t\treturn new Position(row, column);\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_22_Langtons_Ant/Question.java",
    "content": "package Q16_22_Langtons_Ant;\n\npublic class Question {\n\n\tpublic static void main(String[] args) {\n\t\tBoard board = new Board();\n\t\tGrid grid = new Grid();\n\t\tSystem.out.println(board.toString());\n\t\tfor (int i = 0; i < 100; i++) {\n\t\t\tSystem.out.println(\"\\n\\n---- MOVE \" + i + \" ----\");\n\t\t\tboard.move();\n\t\t\tString bs = board.toString();\n\t\t\tSystem.out.println(bs);\n\t\t\t\n\t\t\tgrid.move();\n\t\t\tString gs = grid.toString();\n\t\t\tSystem.out.println(gs);\n\t\t\t\n\t\t\tboolean equals = bs.equals(gs);\n\t\t\tSystem.out.println(equals);\n\t\t\t\n\t\t\tif (!equals) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_23_Rand7_From_Rand5/Question.java",
    "content": "package Q16_23_Rand7_From_Rand5;\r\n\r\npublic class Question {\r\n\tpublic static int rand7() {\r\n\t\twhile (true) {\r\n\t\t\tint num = 5 * rand5() + rand5();\r\n\t\t\tif (num < 21) {\r\n\t\t\t\treturn num % 7;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static int rand5() {\r\n\t\treturn (int) (Math.random() * 100) % 5;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t/* Test: call rand7 many times and inspect the results. */\r\n\t\tint[] arr = new int[7];\r\n\t\tint test_size = 1000000;\r\n\t\tfor(int k = 0; k < test_size; k++){\r\n\t\t\tarr[rand7()]++;\r\n\t\t}\r\n\r\n\t\tfor (int i = 0; i < 7; i++) {\r\n\t\t\tdouble percent = 100.0 * arr[i] / test_size;\r\n\t\t\tSystem.out.println(i + \" appeared \" + percent + \"% of the time.\");\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_23_Rand7_From_Rand5/QuestionB.java",
    "content": "package Q16_23_Rand7_From_Rand5;\r\n\r\npublic class QuestionB {\r\n\tpublic static int rand7() {\r\n\t\twhile (true) {\r\n\t\t\tint r1 = 2 * rand5(); /* evens between 0 and 9 */\r\n\t\t\tint r2 = rand5(); /* will be later used to generate a 0 or 1 */\r\n\t\t\tif (r2 != 4) { /* r2 has an extra even number, so discard the extra */\r\n\t\t\t\tint rand1 = r2 % 2; /* Generate 0 or 1 */\r\n\t\t\t\tint num = r1 + rand1; /* will be in the range 0 through 9 */\r\n\t\t\t\tif (num < 7) {\r\n\t\t\t\t\treturn num;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static int rand5() {\r\n\t\treturn (int) (Math.random() * 100) % 5;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t/* Test: call rand7 many times and inspect the results. */\r\n\t\tint[] arr = new int[7];\r\n\t\tint test_size = 1000000;\r\n\t\tfor(int k = 0; k < test_size; k++){\r\n\t\t\tarr[rand7()]++;\r\n\t\t}\r\n\t\t\r\n\t\tfor (int i = 0; i < 7; i++) {\r\n\t\t\tdouble percent = 100.0 * arr[i] / test_size;\r\n\t\t\tSystem.out.println(i + \" appeared \" + percent + \"% of the time.\");\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_24_Pairs_With_Sum/Pair.java",
    "content": "package Q16_24_Pairs_With_Sum;\n\npublic class Pair {\n\tpublic int first;\n\tpublic int second;\n\t\n\tpublic Pair(int first, int second) {\n\t\tthis.first = first;\n\t\tthis.second = second;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn \"(\" + first + \", \" + second + \")\";\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_24_Pairs_With_Sum/QuestionA.java",
    "content": "package Q16_24_Pairs_With_Sum;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class QuestionA {\t\r\n\tpublic static ArrayList<Pair> printPairSums(int[] array, int sum) {\r\n\t\tArrayList<Pair> result = new ArrayList<Pair>();\r\n\t\tfor (int i = 0 ; i < array.length; i++) {\r\n\t\t\tfor (int j = i + 1; j < array.length; j++) {\r\n\t\t\t\tif (array[i] + array[j] == sum) {\r\n\t\t\t\t\tresult.add(new Pair(array[i], array[j]));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] test = {9, 3, 6, 5, 5, 7, -1, 13, 14, -2, 12, 0};\r\n\t\tArrayList<Pair> pairs = printPairSums(test, 12);\r\n\t\tfor (Pair p : pairs) {\r\n\t\t\tSystem.out.println(p.toString());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_24_Pairs_With_Sum/QuestionB.java",
    "content": "package Q16_24_Pairs_With_Sum;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.HashSet;\r\n\r\npublic class QuestionB {\r\n\tpublic static ArrayList<Pair> printPairSums(int[] array, int sum) {\r\n\t\tArrayList<Pair> result = new ArrayList<Pair>();\r\n\t\tHashMap<Integer, Integer> unpairedCount = new HashMap<Integer, Integer>();\r\n\t\tfor (int x : array) {\r\n\t\t\tint complement = sum - x;\r\n\t\t\tif (unpairedCount.getOrDefault(complement, 0) > 0) {\r\n\t\t\t\tresult.add(new Pair(x, complement));\r\n\t\t\t\tadjustCounterBy(unpairedCount, complement, -1); // decrement complement\r\n\t\t\t} else {\r\n\t\t\t\tadjustCounterBy(unpairedCount, x, 1); // increment x\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static void adjustCounterBy(HashMap<Integer, Integer> counter, int key, int delta) {\r\n\t\tcounter.put(key, counter.getOrDefault(key, 0) + delta);\r\n\t}\r\n\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] test = {-1, -1, -1, -1, 0, 0, 0, 0, 1, 1};\r\n\t\tArrayList<Pair> pairs = printPairSums(test, -1);\r\n\t\tfor (Pair p : pairs) {\r\n\t\t\tSystem.out.println(p.toString());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_24_Pairs_With_Sum/QuestionC.java",
    "content": "package Q16_24_Pairs_With_Sum;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\n\r\npublic class QuestionC {\t\r\n\tpublic static ArrayList<Pair> printPairSums(int[] array, int sum) {\r\n\t\tArrayList<Pair> result = new ArrayList<Pair>();\r\n\t\tArrays.sort(array);\r\n\t\tint first = 0;\r\n\t\tint last = array.length - 1;\r\n\t\twhile (first < last) {\r\n\t\t\tint s = array[first] + array[last];\r\n\t\t\tif (s == sum) {\r\n\t\t\t\tresult.add(new Pair(array[first], array[last]));\r\n\t\t\t\t++first;\r\n\t\t\t\t--last;\r\n\t\t\t} else {\r\n\t\t\t\tif (s < sum) {\r\n\t\t\t\t\t++first;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t--last;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] test = {9, 3, 6, 5, 7, 7, -1, 13, 14, -2, 12, 0};\r\n\t\tArrayList<Pair> pairs = printPairSums(test, 12);\r\n\t\tfor (Pair p : pairs) {\r\n\t\t\tSystem.out.println(p.toString());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_24_Pairs_With_Sum/Tester.java",
    "content": "package Q16_24_Pairs_With_Sum;\n\nimport java.util.ArrayList;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\t\n\tpublic static void print(ArrayList<Pair> pairs) {\n\t\tfor (Pair p : pairs) {\n\t\t\tSystem.out.print(p.toString() + \", \");\n\t\t}\n\t\tSystem.out.println();\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = {9, 3, 6, 5, 7, 7, -1, 13, 14, -2, 12, 0};\n\t\tint sum = 12;\n\t\t\n\t\tArrayList<Pair> pairsA = QuestionA.printPairSums(array, sum);\n\t\tArrayList<Pair> pairsB = QuestionB.printPairSums(array, sum);\n\t\tArrayList<Pair> pairsC = QuestionC.printPairSums(array, sum);\n\t\t\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\n\t\tSystem.out.println(\"sum: \" + sum);\n\t\tprint(pairsA);\n\t\tprint(pairsB);\n\t\tprint(pairsC);\n\t\tSystem.out.println();\n\t\tSystem.out.println();\n\t\tSystem.out.println();\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_25_LRU_Cache/Cache.java",
    "content": "package Q16_25_LRU_Cache;\n\nimport java.util.HashMap;\n\npublic class Cache {\t\t\t\n\tprivate int maxCacheSize;\n\tprivate HashMap<Integer, LinkedListNode> map = new HashMap<Integer, LinkedListNode>();\n\tprivate LinkedListNode listHead = null;\n\tpublic LinkedListNode listTail = null;\n\t\n\t\n\tpublic Cache(int maxSize) {\n\t\tmaxCacheSize = maxSize;\n\t}\n\t\n\t/* Get value for key and mark as most recently used. */\n\tpublic String getValue(int key) {\n\t\tLinkedListNode item = map.get(key);\n\t\tif (item == null) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t/* Move to front of list to mark as most recently used. */\n\t\tif (item != listHead) { \n\t\t\tremoveFromLinkedList(item);\n\t\t\tinsertAtFrontOfLinkedList(item);\n\t\t}\n\t\treturn item.value;\n\t}\n\t\n\t/* Remove node from linked list. */\n\tprivate void removeFromLinkedList(LinkedListNode node) {\n\t\tif (node == null) {\n\t\t\treturn;\n\t\t}\n\t\tif (node.prev != null) {\n\t\t\tnode.prev.next = node.next;\n\t\t}\n\t\tif (node.next != null) {\n\t\t\tnode.next.prev = node.prev;\n\t\t}\n\t\tif (node == listTail) {\n\t\t\tlistTail = node.prev;\n\t\t}\n\t\tif (node == listHead) {\n\t\t\tlistHead = node.next;\n\t\t}\t\t\n\t}\n\t\n\t/* Insert node at front of linked list. */\n\tprivate void insertAtFrontOfLinkedList(LinkedListNode node) {\n\t\tif (listHead == null) {\n\t\t\tlistHead = node;\n\t\t\tlistTail = node;\n\t\t} else {\n\t\t\tlistHead.prev = node;\n\t\t\tnode.next = listHead;\n\t\t\tlistHead = node;\n\t\t\tlistHead.prev = null;\n\t\t}\n\t}\n\t\n\t/* Remove key, value pair from cache, deleting from hash table\n\t * and linked list. */\n\tpublic boolean removeKey(int key) {\n\t\tLinkedListNode node = map.get(key);\n\t\tremoveFromLinkedList(node);\n\t\tmap.remove(key);\n\t\treturn true;\n\t}\n\t\n\t/* Put key, value pair in cache. Removes old value for key if\n\t * necessary. Inserts pair into linked list and hash table.*/\n\tpublic void setKeyValue(int key, String value) {\n\t\t/* Remove if already there. */\n\t\tremoveKey(key); \n\t\t\n\t\t/* If full, remove least recently used item from cache. */\n\t\tif (map.size() >= maxCacheSize && listTail != null) {\n\t\t\tremoveKey(listTail.key);\n\t\t}\n\t\t\n\t\t/* Insert new node. */\n\t\tLinkedListNode node = new LinkedListNode(key, value);\n\t\tinsertAtFrontOfLinkedList(node);\n\t\tmap.put(key, node);\n\t}\n\t\n\tpublic String getCacheAsString() {\n\t\tif (listHead == null) return \"\";\n\t\treturn listHead.printForward();\n\t}\n\t\n\tprivate class LinkedListNode {\n\t\tprivate LinkedListNode next;\n\t\tprivate LinkedListNode prev;\n\t\tpublic int key;\n\t\tpublic String value;\n\t\tpublic LinkedListNode(int k, String v) {\n\t\t\tkey = k;\n\t\t\tvalue = v;\n\t\t}\n\t\t\n\t\tpublic String printForward() {\n\t\t\tString data = \"(\" + key + \",\" + value + \")\";\n\t\t\tif (next != null) {\n\t\t\t\treturn data + \"->\" + next.printForward();\n\t\t\t} else {\n\t\t\t\treturn data;\n\t\t\t}\n\t\t}\n\t}\t\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_25_LRU_Cache/Question.java",
    "content": "package Q16_25_LRU_Cache;\n\npublic class Question {\n\n\t/**\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\tint cache_size = 5;\n\t\tCache cache = new Cache(cache_size);\n\t\t\n\t\tcache.setKeyValue(1, \"1\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.setKeyValue(2, \"2\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.setKeyValue(3, \"3\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.getValue(1);\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.setKeyValue(4, \"4\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.getValue(2);\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.setKeyValue(5, \"5\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.getValue(5);\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.setKeyValue(6,  \"6\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.getValue(1);\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.setKeyValue(5, \"5a\");\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\tcache.getValue(3);\n\t\tSystem.out.println(cache.getCacheAsString());\n\t\t// 6->5->2->4->1\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_26_Calculator/Operator.java",
    "content": "package Q16_26_Calculator;\n\npublic enum Operator {\n\tADD, SUBTRACT, MULTIPLY, DIVIDE, BLANK\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_26_Calculator/QuestionA.java",
    "content": "package Q16_26_Calculator;\n\nimport java.util.ArrayList;\n\npublic class QuestionA {\n\tpublic static Term collapseTerm(Term primary, Term secondary) {\n\t\tif (primary == null) return secondary;\n\t\tif (secondary == null) return primary;\n\t\t\n\t\tdouble value = applyOp(primary.getNumber(), secondary.getOperator(), secondary.getNumber());\n\t\tprimary.setNumber(value);\n\t\treturn primary;\n\t}\n\t\n\tpublic static double applyOp(double left, Operator op, double right) {\n\t\tif (op == Operator.ADD) {\n\t\t\treturn left + right;\n\t\t} else if (op == Operator.SUBTRACT) {\n\t\t\treturn left - right;\n\t\t} else if (op == Operator.MULTIPLY) {\n\t\t\treturn left * right;\n\t\t} else if (op == Operator.DIVIDE) {\n\t\t\treturn left / right;\n\t\t} else {\n\t\t\treturn right;\n\t\t}\n\t}\n\t\n\t/* Compute the result of the arithmetic sequence. This\n\t   works by reading left to right and applying each term to\n\t   a result. When we see a multiplication or division, we \n\t   instead apply this sequence to a temporary variable. */\n\tpublic static double compute(String sequence) {\n\t\tArrayList<Term> terms = Term.parseTermSequence(sequence);\n\t\tif (terms == null) return Integer.MIN_VALUE;\n\t\t\n\t\tdouble result = 0;\n\t\tTerm processing = null;\n\t\tfor (int i = 0; i < terms.size(); i++) {\n\t\t\tTerm current = terms.get(i);\n\t\t\tTerm next = i + 1 < terms.size() ? terms.get(i + 1) : null;\n\t\t\t\n\t\t\t/* Apply the current term to “processing”. */\n\t\t\tprocessing = collapseTerm(processing, current);\n\t\t\t\n\t\t\t/* If next term is + or -, then this cluster is done \n\t\t\t * and we should apply “processing” to “result”. */\n\t\t\tif (next == null || next.getOperator() == Operator.ADD || next.getOperator() == Operator.SUBTRACT) {\n\t\t\t\tresult = applyOp(result, processing.getOperator(), processing.getNumber());\n\t\t\t\tprocessing = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString expression = \"6/5*3+4*5/2-12/6*3/3+3+3\";\n\t\tdouble result = compute(expression);\n\t\tSystem.out.println(result);\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_26_Calculator/QuestionB.java",
    "content": "package Q16_26_Calculator;\nimport java.util.Stack;\n\npublic class QuestionB {\n\tpublic enum Operator {\n\t\tADD, SUBTRACT, MULTIPLY, DIVIDE, BLANK\n\t}\n\t\n\t/* Return the operator that occurs as offset. */\n\tpublic static Operator parseNextOperator(String sequence, int offset) {\n\t\tif (offset < sequence.length()) {\n\t\t\tchar op = sequence.charAt(offset);\n\t\t\tswitch(op) {\n\t\t\tcase '+': return Operator.ADD;\n\t\t\tcase '-': return Operator.SUBTRACT;\n\t\t\tcase '*': return Operator.MULTIPLY;\n\t\t\tcase '/': return Operator.DIVIDE;\n\t\t\t}\n\t\t}\n\t\treturn Operator.BLANK;\n\t}\t\n\t\n\t/* Return the number that starts at offset. */\n\tpublic static int parseNextNumber(String seq, int offset) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\twhile (offset < seq.length() && Character.isDigit(seq.charAt(offset))) {\n\t\t\tsb.append(seq.charAt(offset));\n\t\t\toffset++;\n\t\t}\n\t\treturn Integer.parseInt(sb.toString());\t\n\t}\t\n\t\n\t/* Apply operator: left [op] right. */\n\tpublic static double applyOp(double left, Operator op, double right) {\n\t\tif (op == Operator.ADD) {\n\t\t\treturn left + right;\n\t\t} else if (op == Operator.SUBTRACT) {\n\t\t\treturn left - right;\n\t\t} else if (op == Operator.MULTIPLY) {\n\t\t\treturn left * right;\n\t\t} else if (op == Operator.DIVIDE) {\n\t\t\treturn left / right;\n\t\t} else {\n\t\t\treturn right;\n\t\t}\n\t}\n\t\n\t/* Return priority of operator. Mapped so that:\n\t *     addition == subtraction < multiplication == division. */\n\tpublic static int priorityOfOperator(Operator op) {\n\t\tswitch (op) {\n\t\tcase ADD: return 1;\n\t\tcase SUBTRACT: return 1;\n\t\tcase MULTIPLY: return 2;\n\t\tcase DIVIDE: return 2;\n\t\tcase BLANK: return 0;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* Collapse top until priority(futureTop) > priority(top). \n\t * Collapsing means to pop the top 2 numbers and apply the \n\t * operator popped from the top of the operator stack, and then\n\t * push that onto the numbers stack.*/\n\tpublic static void collapseTop(Operator futureTop, Stack<Double> numberStack, Stack<Operator> operatorStack) {\n\t\twhile (operatorStack.size() >= 1 && numberStack.size() >= 2) {\n\t\t\tif (priorityOfOperator(futureTop) <= priorityOfOperator(operatorStack.peek())) {\n\t\t\t\tdouble second = numberStack.pop();\n\t\t\t\tdouble first = numberStack.pop();\n\t\t\t\tOperator op = operatorStack.pop();\n\t\t\t\tdouble collapsed = applyOp(first, op, second);\n\t\t\t\tnumberStack.push(collapsed);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static double compute(String sequence) {\n\t\tStack<Double> numberStack = new Stack<Double>();\n\t\tStack<Operator> operatorStack = new Stack<Operator>();\n\t\t\n\t\tfor (int i = 0; i < sequence.length(); i++) {\n\t\t\ttry\n\t\t\t{\n\t\t\t\t/* Get number and push. */\n\t\t\t\tint value = parseNextNumber(sequence, i);\n\t\t\t\tnumberStack.push((double) value);\n\t\t\t\t\n\t\t\t\t/* Move to the operator. */\n\t\t\t\ti += Integer.toString(value).length();\n\t\t\t\tif (i >= sequence.length()) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Get operator, collapse top as needed, push operator. */\n\t\t\t\tOperator op = parseNextOperator(sequence, i);\n\t\t\t\tcollapseTop(op, numberStack, operatorStack);\n\t\t\t\toperatorStack.push(op);\n\t\t\t} catch (NumberFormatException ex) {\n\t\t\t\treturn Integer.MIN_VALUE;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Do final collapse. */\n\t\tcollapseTop(Operator.BLANK, numberStack, operatorStack);\n\t\tif (numberStack.size() == 1 && operatorStack.size() == 0) {\n\t\t\treturn numberStack.pop();\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString expression = \"6/5*3+4*5/2-12/6*3/3+3+3\";\n\t\tdouble result = compute(expression);\n\t\tSystem.out.println(result);\t\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 16. Moderate/Q16_26_Calculator/Term.java",
    "content": "package Q16_26_Calculator;\n\nimport java.util.ArrayList;\n\npublic class Term {\t\n\tprivate double value;\n\tprivate Operator operator = Operator.BLANK;\n\t\n\tpublic Term(double v, Operator op) {\n\t\tvalue = v;\n\t\toperator = op;\n\t}\n\t\n\tpublic double getNumber() {\n\t\treturn value;\n\t}\n\t\n\tpublic Operator getOperator() {\n\t\treturn operator;\n\t}\n\t\n\tpublic void setNumber(double v) {\n\t\tvalue = v;\n\t}\n\t\n\tpublic static ArrayList<Term> parseTermSequence(String sequence) {\n\t\tArrayList<Term> terms = new ArrayList<Term>();\n\t\tint offset = 0;\n\t\twhile (offset < sequence.length()) {\n\t\t\tOperator op = Operator.BLANK;\n\t\t\tif (offset > 0) {\n\t\t\t\top = parseOperator(sequence.charAt(offset));\n\t\t\t\tif (op == Operator.BLANK) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\toffset++;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tint value = parseNextNumber(sequence, offset);\n\t\t\t\toffset += Integer.toString(value).length();\n\t\t\t\tTerm term = new Term(value, op);\n\t\t\t\tterms.add(term);\n\t\t\t} catch (NumberFormatException ex) {\n\t\t\t\treturn null;\n\t\t\t}\t\n\t\t}\n\t\treturn terms;\n\t}\n\t\n\tpublic static Operator parseOperator(char op) {\n\t\tswitch(op) {\n\t\tcase '+': return Operator.ADD;\n\t\tcase '-': return Operator.SUBTRACT;\n\t\tcase '*': return Operator.MULTIPLY;\n\t\tcase '/': return Operator.DIVIDE;\n\t\t}\n\t\treturn Operator.BLANK;\n\t}\n\t\n\tpublic static int parseNextNumber(String sequence, int offset) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\twhile (offset < sequence.length() && Character.isDigit(sequence.charAt(offset))) {\n\t\t\tsb.append(sequence.charAt(offset));\n\t\t\toffset++;\n\t\t}\n\t\treturn Integer.parseInt(sb.toString());\t\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_01_Add_Without_Plus/QuestionA.java",
    "content": "package Q17_01_Add_Without_Plus;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static int add(int a, int b) {\r\n\t\tif (b == 0) return a;\r\n\t\tint sum = a ^ b; // add without carrying\r\n\t\tint carry = (a & b) << 1; // carry, but don�t add\r\n\t\treturn add(sum, carry); // recurse\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = Integer.MAX_VALUE - 50;\r\n\t\tint b = 92;\r\n\t\tint sum = add(a, b);\r\n\t\tint intendedSum = a + b;\r\n\t\tif (sum != intendedSum) {\r\n\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"SUCCESS\");\r\n\t\t}\r\n\t\tSystem.out.println(a + \" + \" + b + \" = \" + sum + \" vs \" + intendedSum);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_01_Add_Without_Plus/QuestionB.java",
    "content": "package Q17_01_Add_Without_Plus;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static int add(int a, int b) {\r\n\t\twhile (b != 0) {\r\n\t\t\tint sum = a ^ b; // add without carrying\r\n\t\t\tint carry = (a & b) << 1; // carry, but don't add\t\t\t\r\n\t\t\ta = sum;\r\n\t\t\tb = carry;\r\n\t\t}\r\n\t\treturn a;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint a = Integer.MAX_VALUE - 50;\r\n\t\tint b = 92;\r\n\t\tint sum = add(a, b);\r\n\t\tint intendedSum = a + b;\r\n\t\tif (sum != intendedSum) {\r\n\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"SUCCESS\");\r\n\t\t}\r\n\t\tSystem.out.println(a + \" + \" + b + \" = \" + sum + \" vs \" + intendedSum);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_01_Add_Without_Plus/Tester.java",
    "content": "package Q17_01_Add_Without_Plus;\r\n\r\npublic class Tester {\t\r\n\tpublic static int randomInt(int n) {\r\n\t\treturn (int) (Math.random() * n);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int a = 0; a < 1000; a++) {\r\n\t\t\tfor (int b = 0; b < 1000; b++) {\r\n\t\t\t\tint sumA = QuestionA.add(a, b);\r\n\t\t\t\tint sumB = QuestionB.add(a, b);\r\n\t\t\t\tint sum = a + b;\r\n\t\t\t\tif (sumA != sum || sumB != sum) {\r\n\t\t\t\t\tSystem.out.println(\"ERROR: \" + a + \" + \" + b + \" = \" + sum + \" vs: \" + sumA + \", \" + sumB);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSystem.out.println(\"SUCCESS: \" + a + \" + \" + b + \" = \" + sum);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_02_Shuffle/Question.java",
    "content": "package Q17_02_Shuffle;\r\n\r\nimport java.util.Random;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\t\r\n\tpublic static int[] shuffleArrayRecursively(int[] cards, int i) {\r\n\t\tif (i == 0) {\r\n\t\t\treturn cards;\r\n\t\t}\r\n\t\t\r\n\t\t/* shuffle elements 0 through index - 1 */\r\n\t\tshuffleArrayRecursively(cards, i - 1);\r\n\t\tRandom rand = new Random();\r\n\t\tint k = rand.nextInt(i + 1); // Generate random between 0 and i (inclusive)\t\t\r\n\t\t\r\n\t\t/* Swap element k and index */\r\n\t\tint temp = cards[k];\r\n\t\tcards[k] = cards[i];\r\n\t\tcards[i] = temp;\r\n\t\t\r\n\t\t/* Return shuffled array */\r\n\t\treturn cards;\r\n \t}\r\n\t\r\n\tpublic static void shuffleArrayIteratively(int[] cards) { \r\n\t\tRandom rand = new Random();\r\n\t\tfor (int i = 0; i < cards.length; i++) { \r\n\t\t\tint k = rand.nextInt(i + 1); // Generate random between 0 and i (inclusive)\r\n\t\t\tint temp = cards[k];\r\n\t\t\tcards[k] = cards[i];\r\n\t\t\tcards[i] = temp;\r\n\t\t} \r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] cards = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(cards));\r\n\t\tshuffleArrayIteratively(cards);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(cards));\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_03_Random_Set/Question.java",
    "content": "package Q17_03_Random_Set;\r\n\r\nimport java.util.Random;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\r\n\r\n\t/* pick M elements from original array.  Clone original array so that\r\n\t * we don�t destroy the input. */\r\n\tpublic static int[] pickMRandomly(int[] original, int m) {\r\n\t\tRandom rand = new Random();\r\n\t\tfor (int i = 0; i < original.length; i++) { \r\n\t\t\tint k = rand.nextInt(i + 1); // Generate random between 0 and i (inclusive)\r\n\t\t\tint temp = original[k];\r\n\t\t\toriginal[k] = original[i];\r\n\t\t\toriginal[i] = temp;\r\n\t\t} \r\n\t\treturn original;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] cards = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(cards));\r\n\t\tint[] set = pickMRandomly(cards, 4);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(set));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_03_Random_Set/QuestionAlternate.java",
    "content": "package Q17_03_Random_Set;\n\nimport java.util.Random;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionAlternate {\n\t\n\t/* pick M elements from original array, using only elements 0 through i (inclusive).*/\n\tpublic static int[] pickMRecursively(int[] original, int m, int i) {\n\t\tif (i + 1 < m) { // Not enough elements\n\t\t\treturn null; \n\t\t} else if (i + 1 == m) { // Base case -- copy first m elements into array\n\t\t\tint[] set = new int[m];\n\t\t\tfor (int k = 0; k < m; k++) {\n\t\t\t\tset[k] = original[k];\n\t\t\t}\n\t\t\treturn set;\n\t\t} else {\n\t\t\tint[] set = pickMRecursively(original, m, i - 1);\n\t\t\tRandom rand = new Random();\n\t\t\tint k = rand.nextInt(i + 1); // Generate random between 0 and i (inclusive)\n\t\t\tif (k < m) {\n\t\t\t\tset[k] = original[i];\n\t\t\t}\n\t\t\treturn set;\n\t\t}\n\t}\t\n\n\t/* pick M elements from original array.*/\n\tpublic static int[] pickMIteratively(int[] original, int m) {\n\t\tif (m > original.length) return null;\n\t\tint[] subset = new int[m];\n\t\t\n\t\t/* Fill in subset array with first part of original array */\n\t\tfor (int i = 0; i < m ; i++) {\n\t\t\tsubset[i] = original[i];\n\t\t}\n\t\t\n\t\tRandom rand = new Random();\n\t\t\n\t\t/* Go through rest of original array. */\n\t\tfor (int i = m; i < original.length; i++) {\n\t\t\tint k = rand.nextInt(i + 1); // Generate random between 0 and i (inclusive)\n\t\t\tif (k < m) {\n\t\t\t\tsubset[k] = original[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn subset;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] cards = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};\n\t\tSystem.out.println(AssortedMethods.arrayToString(cards));\n\t\tint[] set = pickMIteratively(cards, 4);\n\t\tSystem.out.println(AssortedMethods.arrayToString(set));\n\t}\t\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_04_Missing_Number/BitInteger.java",
    "content": "package Q17_04_Missing_Number;\r\n\r\npublic class BitInteger {\r\n\tpublic static int INTEGER_SIZE;\r\n\tprivate boolean[] bits;\r\n\tpublic BitInteger() {\r\n\t\tbits = new boolean[INTEGER_SIZE];\r\n\t}\r\n\t/* Creates a number equal to given value. Takes time proportional \r\n\t * to INTEGER_SIZE. */\r\n\tpublic BitInteger(int value){\r\n\t\tbits = new boolean[INTEGER_SIZE];\r\n\t\tfor (int j = 0; j < INTEGER_SIZE; j++){\r\n\t\t\tif (((value >> j) & 1) == 1) bits[INTEGER_SIZE - 1 - j] = true;\r\n\t\t\telse bits[INTEGER_SIZE - 1 - j] = false;\r\n\t\t}\r\n\t}\r\n\t\r\n\t/** Returns k-th most-significant bit. */ \r\n\tpublic int fetch(int k){\r\n\t\tif (bits[k]) return 1;\r\n\t\telse return 0;\r\n\t}\r\n\t\r\n\t/** Sets k-th most-significant bit. */\r\n\tpublic void set(int k, int bitValue){\r\n\t\tif (bitValue == 0 ) bits[k] = false;\r\n\t\telse bits[k] = true;\r\n\t}\r\n\t\r\n\t/** Sets k-th most-significant bit. */\r\n\tpublic void set(int k, char bitValue){\r\n\t\tif (bitValue == '0' ) bits[k] = false;\r\n\t\telse bits[k] = true;\r\n\t}\r\n\t\r\n\t/** Sets k-th most-significant bit. */\r\n\tpublic void set(int k, boolean bitValue){\r\n\t\tbits[k] = bitValue;\r\n\t}\t\r\n\t\r\n\tpublic void swapValues(BitInteger number) {\r\n\t\tfor (int i = 0; i < INTEGER_SIZE; i++) {\r\n\t\t\tint temp = number.fetch(i);\r\n\t\t\tnumber.set(i, this.fetch(i));\r\n\t\t\tthis.set(i, temp);\r\n\t\t}\r\n\t}\r\n\t\t\r\n\tpublic int toInt() {\r\n\t\tint number = 0;\r\n\t\tfor (int j = INTEGER_SIZE - 1; j >= 0; j--){\r\n\t\t\tnumber = number | fetch(j);\r\n\t\t\tif (j > 0) {\r\n\t\t\t\tnumber = number << 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn number;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_04_Missing_Number/Question.java",
    "content": "package Q17_04_Missing_Number;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Random;\r\n\r\npublic class Question {\r\n    /* Create a random array of numbers from 0 to n, but skip 'missing' */\r\n    public static ArrayList<BitInteger> initialize(int n, int missing) {\r\n        BitInteger.INTEGER_SIZE = Integer.toBinaryString(n).length();\r\n        ArrayList<BitInteger> array = new ArrayList<BitInteger>();\r\n        \r\n        for (int i = 1; i <= n; i++) {\r\n        \tarray.add(new BitInteger(i == missing ? 0 : i));\r\n        }\r\n\r\n        // Shuffle the array once.\r\n        for (int i = 0; i < n; i++){\r\n            int rand = i + (int) (Math.random() * (n-i));\r\n            array.get(i).swapValues(array.get(rand));\r\n        }\r\n        \r\n        return array;\r\n    }\r\n\r\n\r\n    public static int findMissing(ArrayList<BitInteger> array) {\r\n       return findMissing(array, BitInteger.INTEGER_SIZE - 1);\r\n    }        \r\n\r\n    private static int findMissing(ArrayList<BitInteger> input, int column) {\r\n    \tif (column < 0) { // Base case and error condition\r\n    \t\treturn 0;\r\n    \t}\r\n    \tArrayList<BitInteger> oneBits = new ArrayList<BitInteger>(input.size()/2);\r\n    \tArrayList<BitInteger> zeroBits = new ArrayList<BitInteger>(input.size()/2);\r\n        for (BitInteger t : input) {\r\n            if (t.fetch(column) == 0) {\r\n                zeroBits.add(t);\r\n            } else {\r\n                oneBits.add(t);\r\n            }\r\n        }\r\n        if (zeroBits.size() <= oneBits.size()) {\r\n        \tint v = findMissing(zeroBits, column - 1);\r\n        \tSystem.out.print(\"0\");\r\n            return (v << 1) | 0;\r\n        } else {\r\n        \tint v = findMissing(oneBits, column - 1);\r\n        \tSystem.out.print(\"1\");\r\n            return (v << 1) | 1;\r\n        }\r\n    }\r\n\r\n    public static void main(String[] args) {\r\n        Random rand = new Random(); \r\n        int n = rand.nextInt(300000) + 1;\r\n        int missing = rand.nextInt(n+1);\r\n        ArrayList<BitInteger> array = initialize(n, missing);\r\n        System.out.println(\"The array contains all numbers but one from 0 to \" + n + \", except for \" + missing);\r\n        \r\n        int result = findMissing(array);\r\n        if (result != missing) {\r\n            System.out.println(\"Error in the algorithm!\\n\" + \"The missing number is \" + missing + \", but the algorithm reported \" + result);\r\n        } else {\r\n            System.out.println(\"The missing number is \" + result);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_05_Letters_and_Numbers/QuestionA.java",
    "content": "package Q17_05_Letters_and_Numbers;\n\npublic class QuestionA {\n\tpublic static char[] extractSubarray(char[] array, int start, int end) {\n\t\tif (start > end) return null;\t\t\n\t\tchar[] subarray = new char[end - start + 1];\n\t\tfor (int i = start; i <= end; i++) {\n\t\t\tsubarray[i - start] = array[i];\n\t\t}\n\t\treturn subarray;\n\t}\n\t\n\tpublic static boolean hasEqualLettersNumbers(char[] array, int start, int end) {\n\t\tint counter = 0;\n\t\tfor (int i = start; i <= end; i++) {\n\t\t\tif (Character.isLetter(array[i])) {\n\t\t\t\tcounter++;\n\t\t\t} else if (Character.isDigit(array[i])) {\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t}\n\t\treturn counter == 0;\n\t}\n\t\n\tpublic static char[] findLongestSubarray(char[] array) {\n\t\tfor (int len = array.length; len > 1; len--) {\n\t\t\tfor (int i = 0; i <= array.length - len; i++) {\n\t\t\t\tif (hasEqualLettersNumbers(array, i, i + len - 1)) {\n\t\t\t\t\treturn extractSubarray(array, i, i + len - 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\n\t\treturn null;\t\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tchar b = '1';\n\t\tchar a = 'a';\n\t\tchar[] array = {a, b, a, b, a, b, b, b, b, b, a, a, a, a, a, b, a, b, a, b, b, a, a, a, a, a, a, a};\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tSystem.out.print(array[i] + \" \");\n\t\t}\n\t\tSystem.out.println();\n\t\tchar[] max = findLongestSubarray(array);\n\t\tSystem.out.println(max.length);\n\t\tfor (int i = 0; i < max.length; i++) {\n\t\t\tSystem.out.print(max[i] + \" \");\n\t\t}\n\t\tSystem.out.println(\"\\nIs Valid? \" + hasEqualLettersNumbers(max, 0, max.length - 1));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_05_Letters_and_Numbers/QuestionB.java",
    "content": "package Q17_05_Letters_and_Numbers;\n\nimport java.util.HashMap;\n\n\npublic class QuestionB {\n\t/* Compute the difference between the number of letters and \n\t * numbers between the beginning of the array and each index. */\n\tpublic static int[] computeDeltaArray(char[] array) {\n\t\tint[] deltas = new int[array.length];\n\t\tint delta = 0;\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tif (Character.isLetter(array[i])) {\n\t\t\t\tdelta++;\n\t\t\t} else if (Character.isDigit(array[i])) {\n\t\t\t\tdelta--;\n\t\t\t}\n\t\t\tdeltas[i] = delta;\n\t\t}\n\t\treturn deltas;\n\t}\n\t\n\t/* Find the matching pair of values in the deltas array with the \n\t * largest difference in indices. */ \t\n\tpublic static int[] findLongestMatch(int[] deltas) {\n\t\tHashMap<Integer, Integer> map = new HashMap<Integer, Integer>();\n\t\tmap.put(0,  -1);\n\t\tint[] max = new int[2];\n\t\tfor (int i = 0; i < deltas.length; i++) {\n\t\t\tif (!map.containsKey(deltas[i])) {\n\t\t\t\tmap.put(deltas[i],  i);\n\t\t\t} else {\n\t\t\t\tint match = map.get(deltas[i]);\n\t\t\t\tint distance = i - match;\n\t\t\t\tint longest = max[1] - max[0];\n\t\t\t\tif (distance > longest) {\n\t\t\t\t\tmax[1] = i;\n\t\t\t\t\tmax[0] = match;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn max;\n\t}\n\t\n\tpublic static char[] extract(char[] array, int start, int end) {\n\t\tif (start > end) return null;\n\t\tchar[] subarray = new char[end - start + 1];\n\t\tfor (int i = start; i <= end; i++) {\n\t\t\tsubarray[i - start] = array[i];\n\t\t}\n\t\treturn subarray;\n\t}\n\n\tpublic static char[] findLongestSubarray(char[] array) {\n\t\t/* Compute deltas betw count of numbers and count of letters. */\n\t\tint[] deltas = computeDeltaArray(array);\n\n\t\t/* Find pair in deltas with matching values and largest span. */\n\t\tint[] match = findLongestMatch(deltas);\n\n\t\t/* Return the subarray. Note that it starts one *after* the \n\t\t * initial occurence of this delta. */\n\t\treturn extract(array, match[0] + 1, match[1]);\n\t}\n\t\n\tpublic static boolean isEqual(char[] array, int start, int end) {\n\t\tint counter = 0;\n\t\tfor (int i = start; i < end; i++) {\n\t\t\tif (Character.isLetter(array[i])) {\n\t\t\t\tcounter++;\n\t\t\t} else if (Character.isDigit(array[i])) {\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t}\n\t\treturn counter == 0;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tchar b = '1';\n\t\tchar a = 'a';\n\t\tchar[] array = {a, b, a, b, a, b, b, b, b, b, a, a, a, a, a, b, a, b, a, b, b, a, a, a, a, a, a, a};\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tSystem.out.print(array[i] + \" \");\n\t\t}\n\t\tSystem.out.println();\n\t\tchar[] max = findLongestSubarray(array);\n\t\tif (max == null) {\n\t\t\tSystem.out.println(\"No equal subarray\");\n\t\t} else {\n\t\t\tSystem.out.println(max.length);\n\t\t\tfor (int i = 0; i < max.length; i++) {\n\t\t\t\tSystem.out.print(max[i] + \" \");\n\t\t\t}\n\t\n\t\t\tSystem.out.println(\"\\nIs Valid? \" + isEqual(max, 0, max.length));\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_05_Letters_and_Numbers/Tester.java",
    "content": "package Q17_05_Letters_and_Numbers;\n\npublic class Tester {\n\n\t/**\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\tchar b = 'b';\n\t\tchar a = '1';\n\t\tchar[] array = {a, b, a, b, a, b, b, b, b, b, a, a, a, a, a, b, a, b, a, b, b, a, a, a, a, a, a, a};\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tSystem.out.print(array[i] + \" \");\n\t\t}\n\t\tSystem.out.println();\n\t\tSystem.out.println();\n\t\tchar[] maxA = QuestionA.findLongestSubarray(array);\n\t\tchar[] maxB = QuestionB.findLongestSubarray(array);\n\t\t\n\t\tif (maxA == null) {\n\t\t\tSystem.out.println(\"A is null.\");\n\t\t} else {\n\t\t\tSystem.out.println(\"A: \" + maxA.length);\n\t\t\tfor (int i = 0; i < maxA.length; i++) {\n\t\t\t\tSystem.out.print(maxA[i] + \" \");\n\t\t\t}\n\t\t\tSystem.out.println(\"\\nIs Valid? \" + QuestionA.hasEqualLettersNumbers(maxA, 0, maxA.length - 1));\n\t\t\tSystem.out.println();\n\t\t}\n\t\t\n\t\tif (maxB == null) {\n\t\t\tSystem.out.println(\"B is null.\");\n\t\t} else {\n\t\t\tSystem.out.println(\"B: \" + maxB.length);\n\t\t\tfor (int i = 0; i < maxB.length; i++) {\n\t\t\t\tSystem.out.print(maxB[i] + \" \");\n\t\t\t}\t\n\t\t\tSystem.out.println(\"\\nIs Valid? \" + QuestionA.hasEqualLettersNumbers(maxB, 0, maxB.length - 1));\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_06_Count_of_2s/Question.java",
    "content": "package Q17_06_Count_of_2s;\r\n\r\npublic class Question {\t\r\n\tpublic static int count2sInRangeAtDigit(int number, int d) {\r\n\t\tint powerOf10 = (int) Math.pow(10, d);\r\n\t\tint nextPowerOf10 = powerOf10 * 10;\r\n\t\tint right = number % powerOf10;\r\n\t\t\r\n\t\tint roundDown = number - number % nextPowerOf10;\r\n\t\tint roundUp = roundDown + nextPowerOf10;\r\n\t\t\r\n\t\tint digit = (number / powerOf10) % 10; \r\n\t\tif (digit < 2) { // if the digit in spot digit is \r\n\t\t\treturn roundDown / 10;\r\n\t\t} else if (digit == 2) {\r\n\t\t\treturn roundDown / 10 + right + 1;\r\n\t\t} else {\r\n\t\t\treturn roundUp / 10;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static int count2sInRange(int number) {\r\n\t\tint count = 0;\r\n\t\tint len = String.valueOf(number).length();\r\n\t\tfor (int digit = 0; digit < len; digit++) {\r\n\t\t\tcount += count2sInRangeAtDigit(number, digit);\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int count2sR(int n) {\t\r\n\t\t/* Alternate, messier, solution */\r\n\t\t\r\n\t\t// Example: n = 513\r\n\t\t\r\n\t\t// Base case\r\n\t\tif (n == 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\t// Split apart 513 into 5 * 100 + 13.\r\n\t\t// [Power = 100; First = 5; Remainder = 13]\r\n\t\tint power = 1;\r\n\t\twhile (10 * power < n) {\r\n\t\t\tpower *= 10;\r\n\t\t}\r\n\t\tint first = n / power;\r\n\t\tint remainder = n % power;\r\n\t\t\r\n\t\t// Counts 2s from first digit\r\n\t\tint nTwosFirst = 0;\r\n\t\tif (first > 2) {\r\n\t\t\tnTwosFirst += power; \r\n\t\t} else if (first == 2) {\r\n\t\t\tnTwosFirst += remainder + 1;\r\n\t\t}\r\n\t\t\r\n\t\t// Count 2s from all other digits\r\n\t\tint nTwosOther = first * count2sR(power - 1) + count2sR(remainder);\r\n\t\t\r\n\t\treturn nTwosFirst + nTwosOther;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 10000; i++) {\r\n\t\t\tint v1 = count2sR(i);\r\n\t\t\tint v2 = count2sInRange(i);\t\r\n\t\t\tSystem.out.println(\"Between 0 and \" + i + \": \" + v1 + \" \" + v2);\r\n\t\t}\r\n\t}\r\n\r\n}"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_06_Count_of_2s/QuestionBrute.java",
    "content": "package Q17_06_Count_of_2s;\r\n\r\npublic class QuestionBrute {\r\n\r\n\tpublic static int numberOf2s(int n) {\r\n\t\tint count = 0;\r\n\t\twhile (n > 0) {\r\n\t\t\tif (n % 10 == 2) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t\tn = n / 10;\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static int numberOf2sInRange(int n) {\r\n\t\tint count = 0;\r\n\t\tfor (int i = 2; i <= n; i++) { // Might as well start at 2\r\n\t\t\tcount += numberOf2s(i);\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 1000; i++) {\r\n\t\t\tint v = numberOf2sInRange(i);\r\n\t\t\tSystem.out.println(\"Between 0 and \" + i + \": \" + v);\r\n\t\t}\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_07_Baby_Names/Graph.java",
    "content": "package Q17_07_Baby_Names;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class Graph {\n\tprivate ArrayList<GraphNode> nodes;\n\tprivate HashMap<String, GraphNode> map;\n\t\n\tpublic Graph() {\n\t\tmap = new HashMap<String, GraphNode>();\n\t\tnodes = new ArrayList<GraphNode>();\n\t}\n\t\n\tpublic boolean hasNode(String name) {\n\t\treturn map.containsKey(name);\n\t}\t\n\t\n\tpublic GraphNode createNode(String name, int freq) {\n\t\tif (map.containsKey(name)) { \n\t\t\treturn getNode(name);\n\t\t}\n\t\t\n\t\tGraphNode node = new GraphNode(name, freq);\n\t\tnodes.add(node);\n\t\tmap.put(name, node);\n\t\treturn node;\n\t}\n\t\n\tprivate GraphNode getNode(String name) {\n\t\treturn map.get(name);\n\t}\n\t\n\tpublic ArrayList<GraphNode> getNodes() {\n\t\treturn nodes;\n\t}\n\t\n\tpublic void addEdge(String startName, String endName) {\n\t\tGraphNode start = getNode(startName);\n\t\tGraphNode end = getNode(endName);\n\t\tif (start != null && end != null) {\n\t\t\tstart.addNeighbor(end);\n\t\t\tend.addNeighbor(start);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_07_Baby_Names/GraphNode.java",
    "content": "package Q17_07_Baby_Names;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\npublic class GraphNode {\n\tprivate ArrayList<GraphNode> neighbors;\n\tprivate HashMap<String, GraphNode> map;\n\tprivate String name;\n\tprivate int frequency;\n\tprivate boolean visited = false;\n\t\n\tpublic GraphNode(String nm, int freq) {\n\t\tname = nm;\n\t\tfrequency = freq;\n\t\tneighbors = new ArrayList<GraphNode>();\n\t\tmap = new HashMap<String, GraphNode>();\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic int getFrequency() {\n\t\treturn frequency;\n\t}\n\t\n\tpublic boolean addNeighbor(GraphNode node) {\n\t\tif (map.containsKey(node.getName())) {\n\t\t\treturn false;\n\t\t}\n\t\tneighbors.add(node);\n\t\tmap.put(node.getName(), node);\n\t\treturn true;\n\t}\n\t\n\tpublic ArrayList<GraphNode> getNeighbors() {\n\t\treturn neighbors;\n\t}\n\t\t\n\tpublic boolean isVisited() {\n\t\treturn visited;\n\t}\n\t\n\tpublic void setIsVisited(boolean v) {\n\t\tvisited = v;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_07_Baby_Names/NameSet.java",
    "content": "package Q17_07_Baby_Names;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\npublic class NameSet {\n\tprivate Set<String> names = new HashSet<String>();\n\tprivate int frequency = 0;\n\tprivate String rootName;\n\t\n\tpublic NameSet(String name, int freq) {\n\t\tnames.add(name);\n\t\tfrequency = freq;\n\t\trootName = name;\n\t}\n\t\n\tpublic Set<String> getNames() {\n\t\treturn names;\n\t}\n\t\n\tpublic String getRootName() {\n\t\treturn rootName;\n\t}\n\t\n\tpublic void copyNamesWithFrequency(Set<String> more, int freq) {\n\t\tnames.addAll(more);\n\t\tfrequency += freq;\n\t}\n\t\n\tpublic int getFrequency() {\n\t\treturn frequency;\n\t}\n\t\n\tpublic int size() {\n\t\treturn names.size();\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_07_Baby_Names/QuestionA.java",
    "content": "package Q17_07_Baby_Names;\n\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map.Entry;\nimport java.util.Set;\n\npublic class QuestionA {\n\n\t/* Read through (name, frequency) pairs and initialize a mapping\n\t * of names to NameSets (equivalence classes).*/\n\tpublic static HashMap<String, NameSet> constructGroups(HashMap<String, Integer> names) {\n\t\tHashMap<String, NameSet> groups = new HashMap<String, NameSet>();\n\t\tfor (Entry<String, Integer> entry : names.entrySet()) {\n\t\t    String name = entry.getKey();\n\t\t    int frequency = entry.getValue();\n\t\t    NameSet group = new NameSet(name, frequency);\n\t\t    groups.put(name,  group);\n\t\t}\n\t\treturn groups;\n\t}\n\t\n\tpublic static void mergeClasses(HashMap<String, NameSet> groups, String[][] synonyms) {\n\t\tfor (String[] entry : synonyms) {\n\t\t    String name1 = entry[0];\n\t\t    String name2 = entry[1];\n\t\t    NameSet set1 = groups.get(name1);\n\t\t    NameSet set2 = groups.get(name2);\n\t\t    if (set1 != set2) {\n\t\t    \t/* Always merge the smaller set into the bigger one. */\n\t\t    \tNameSet smaller = set2.size() < set1.size() ? set2 : set1;\n\t\t    \tNameSet bigger = set2.size() < set1.size() ? set1 : set2;\n\t\t    \t\n\t\t\t    /* Merge lists */\n\t\t\t    Set<String> otherNames = smaller.getNames();\n\t\t\t    int frequency = smaller.getFrequency();\n\t\t\t    bigger.copyNamesWithFrequency(otherNames, frequency);\n\t\t\t    \n\t\t\t    /* Update mapping */\n\t\t\t    for (String name : otherNames) {\n\t\t\t    \tgroups.put(name,  bigger);\n\t\t\t    }\n\t\t    }\n\t\t}\n\t}\n\t\n\tpublic static HashMap<String, Integer> convertToMap(HashMap<String, NameSet> groups) {\n\t\tHashMap<String, Integer> list = new HashMap<String, Integer>();\n\t\tfor (NameSet group : groups.values()) {\n\t\t\tlist.put(group.getRootName(), group.getFrequency());\n\t\t}\n\t\treturn list;\n\t}\n\t\n\tpublic static HashMap<String, Integer> trulyMostPopular(HashMap<String, Integer> names, String[][] synonyms) {\n\t\tHashMap<String, NameSet> groups = constructGroups(names);\n\t\tmergeClasses(groups, synonyms);\n\t\treturn convertToMap(groups);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tHashMap<String, Integer> names = new HashMap<String, Integer>();\n\t\t\n\t\tnames.put(\"John\", 3);\n\t\tnames.put(\"Jonathan\", 4);\n\t\tnames.put(\"Johnny\", 5);\n\t\tnames.put(\"Chris\", 1);\n\t\tnames.put(\"Kris\", 3);\n\t\tnames.put(\"Brian\", 2);\n\t\tnames.put(\"Bryan\", 4);\n\t\tnames.put(\"Carleton\", 4);\n\t\t\n\t\tString[][] synonyms = \n\t\t\t{{\"John\", \"Jonathan\"}, \n\t\t\t {\"Jonathan\", \"Johnny\"}, \n\t\t\t {\"Chris\", \"Kris\"}, \n\t\t\t {\"Brian\", \"Bryan\"}};\n\t\t\n\t\tHashMap<String, Integer> finalList = trulyMostPopular(names, synonyms);\n\t\tfor (Entry<String, Integer> entry : finalList.entrySet()) {\n\t\t    String name = entry.getKey();\n\t\t    int frequency = entry.getValue();\n\t\t    System.out.println(name + \": \" + frequency);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_07_Baby_Names/QuestionB.java",
    "content": "package Q17_07_Baby_Names;\n\nimport java.util.HashMap;\nimport java.util.Map.Entry;\n\npublic class QuestionB {\n\t/* Add all names to graph as nodes. */\n\tpublic static Graph constructGraph(HashMap<String, Integer> names) {\n\t\tGraph graph = new Graph();\n\t\tfor (Entry<String, Integer> entry : names.entrySet()) {\n\t\t    String name = entry.getKey();\n\t\t    int frequency = entry.getValue();\n\t\t    graph.createNode(name, frequency);\n\t\t}\n\t\treturn graph;\n\t}\n\t\n\t/* Connect synonymous spellings. */\n\tpublic static void connectEdges(Graph graph, String[][] synonyms) {\n\t\tfor (String[] entry : synonyms) {\n\t\t    String name1 = entry[0];\n\t\t    String name2 = entry[1];\n\t\t    graph.addEdge(name1,  name2);\n\t\t}\n\t}\n\t\n\t/* Do depth-first search to find the total frequency of this \n\t * component, and mark each node as visited.*/\t\n\tpublic static int getComponentFrequency(GraphNode node) {\n\t\tif (node.isVisited()) {\n\t\t\treturn 0;\n\t\t}\n\t\tnode.setIsVisited(true);\n\t\tint sum = node.getFrequency();\n\t\tfor (GraphNode child : node.getNeighbors()) {\n\t\t\tsum += getComponentFrequency(child);\n\t\t}\n\t\treturn sum;\n\t}\n\t\n\t/* Do DFS of each component. If a node has been visited before,\n\t * then its component has already been computed. */\n\tpublic static HashMap<String, Integer> getTrueFrequencies(Graph graph) {\n\t\tHashMap<String, Integer> rootNames = new HashMap<String, Integer>();\n\t\tfor (GraphNode node : graph.getNodes()) {\n\t\t\tif (!node.isVisited()) {\n\t\t\t\tint frequency = getComponentFrequency(node);\n\t\t\t\tString name = node.getName();\n\t\t\t\trootNames.put(name, frequency);\n\t\t\t}\n\t\t}\n\t\treturn rootNames;\n\t}\n\t\n\tpublic static HashMap<String, Integer> trulyMostPopular(HashMap<String, Integer> names, String[][] synonyms) {\n\t\tGraph graph = constructGraph(names);\n\t\tconnectEdges(graph, synonyms);\n\t\tHashMap<String, Integer> rootNames = getTrueFrequencies(graph);\n\t\treturn rootNames;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tHashMap<String, Integer> names = new HashMap<String, Integer>();\n\t\t\n\t\tnames.put(\"John\", 3);\n\t\tnames.put(\"Jonathan\", 4);\n\t\tnames.put(\"Johnny\", 5);\n\t\tnames.put(\"Chris\", 1);\n\t\tnames.put(\"Kris\", 3);\n\t\tnames.put(\"Brian\", 2);\n\t\tnames.put(\"Bryan\", 4);\n\t\tnames.put(\"Carleton\", 4);\n\t\t\n\t\tString[][] synonyms = \n\t\t\t{{\"John\", \"Jonathan\"}, \n\t\t\t {\"Jonathan\", \"Johnny\"}, \n\t\t\t {\"Chris\", \"Kris\"}, \n\t\t\t {\"Brian\", \"Bryan\"}};\n\t\t\n\t\tHashMap<String, Integer> rootNames = trulyMostPopular(names, synonyms);\n\t\tfor (Entry<String, Integer> entry : rootNames.entrySet()) {\n\t\t    String name = entry.getKey();\n\t\t    int frequency = entry.getValue();\n\t\t    System.out.println(name + \": \" + frequency);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_08_Circus_Tower/HtWt.java",
    "content": "package Q17_08_Circus_Tower;\r\n\r\npublic class HtWt implements Comparable<HtWt> {\r\n\tprivate int height;\r\n\tprivate int weight;\r\n\tpublic HtWt(int h, int w) { height = h; weight = w; }\r\n\t\r\n\tpublic int compareTo(HtWt second) {\r\n\t\tif (this.height != second.height) { \r\n\t\t\treturn ((Integer)this.height).compareTo(second.height);\r\n\t\t} else {\r\n\t\t\treturn ((Integer)this.weight).compareTo(second.weight);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"(\" + height + \", \" + weight + \")\";\r\n\t}\r\n\t\r\n\t/* Returns true if \"this\" should be lined up before \"other\". Note \r\n\t * that it's possible that this.isBefore(other) and \r\n\t * other.isBefore(this) are both false. This is different from the \r\n\t * compareTo method, where if a < b then b > a. */\r\n\tpublic boolean isBefore(HtWt other) {\r\n\t\tif (height < other.height && weight < other.weight) {\r\n\t\t\treturn true;\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_08_Circus_Tower/QuestionA.java",
    "content": "package Q17_08_Circus_Tower;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.*;\r\n\r\npublic class QuestionA {\r\n\tpublic static ArrayList<HtWt> longestIncreasingSeq(ArrayList<HtWt> items) {\r\n\t\tCollections.sort(items);\r\n\t\treturn bestSeqAtIndex(items, new ArrayList<HtWt>(), 0);\r\n\t}\r\n\t\r\n\t// Returns longer sequence\r\n\tprivate static ArrayList<HtWt> max(ArrayList<HtWt> seq1, ArrayList<HtWt> seq2) {\r\n\t\tif (seq1 == null) {\r\n\t\t\treturn seq2;\r\n\t\t} else if (seq2 == null) {\r\n\t\t\treturn seq1;\r\n\t\t}\r\n\t\treturn seq1.size() > seq2.size() ? seq1 : seq2;\r\n\t}\r\n\t\r\n\tprivate static boolean canAppend(ArrayList<HtWt> solution, HtWt value) {\r\n\t\tif (solution == null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (solution.size() == 0) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tHtWt last = solution.get(solution.size() - 1);\r\n\t\treturn last.isBefore(value);\r\n\t}\r\n\t\r\n\tprivate static ArrayList<HtWt> bestSeqAtIndex(ArrayList<HtWt> array, ArrayList<HtWt> sequence, int index) {\r\n\t\tif (index >= array.size()) return sequence;\r\n\t\t\r\n\t\tHtWt value = array.get(index);\r\n\t\t\r\n\t\tArrayList<HtWt> bestWith = null;\r\n\t\tif (canAppend(sequence, value)) {\r\n\t\t\tArrayList<HtWt> sequenceWith = (ArrayList<HtWt>) sequence.clone();\r\n\t\t\tsequenceWith.add(value);\r\n\t\t\tbestWith = bestSeqAtIndex(array, sequenceWith, index + 1);\r\n\t\t}\r\n\t\t\r\n\t\tArrayList<HtWt> bestWithout = bestSeqAtIndex(array, sequence, index + 1);\r\n\t\treturn max(bestWith, bestWithout);\r\n\t}\r\n\t\r\n\tpublic static ArrayList<HtWt> initialize() {\r\n\t\tArrayList<HtWt> items = new ArrayList<HtWt>();\r\n\t\t\r\n\t\tHtWt item = new HtWt(65, 60);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(70, 150);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(56, 90);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(75, 190);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(60, 95);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(68, 110);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(35, 65);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(40, 60);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(45, 63);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\treturn items;\r\n\t}\r\n\t\r\n\tpublic static void printList(ArrayList<HtWt> list) {\r\n\t\tfor (HtWt item : list) {\r\n\t\t\tSystem.out.println(item.toString() + \" \");\r\n\t\t}\r\n\t}\r\n\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<HtWt> items = initialize();\r\n\t\tArrayList<HtWt> solution = longestIncreasingSeq(items);\r\n\t\tprintList(solution);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_08_Circus_Tower/QuestionB.java",
    "content": "package Q17_08_Circus_Tower;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.*;\r\n\r\npublic class QuestionB {\r\n\r\n\t// Returns longer sequence\r\n\tprivate static ArrayList<HtWt> max(ArrayList<HtWt> seq1, ArrayList<HtWt> seq2) {\r\n\t\tif (seq1 == null) {\r\n\t\t\treturn seq2;\r\n\t\t} else if (seq2 == null) {\r\n\t\t\treturn seq1;\r\n\t\t}\r\n\t\treturn seq1.size() > seq2.size() ? seq1 : seq2;\r\n\t}\r\n\t\r\n\tprivate static boolean canAppend(ArrayList<HtWt> solution, HtWt value) {\r\n\t\tif (solution == null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (solution.size() == 0) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tHtWt last = solution.get(solution.size() - 1);\r\n\t\treturn last.isBefore(value);\r\n\t}\r\n\t\r\n\tpublic static ArrayList<HtWt> longestIncreasingSeq(ArrayList<HtWt> array) {\r\n\t\tCollections.sort(array);\r\n\t\t\r\n\t\tArrayList<ArrayList<HtWt>> solutions = new ArrayList<ArrayList<HtWt>>();\r\n\t\tArrayList<HtWt> bestSequence = null;\r\n\t\tfor (int i = 0; i < array.size(); i++) {\r\n\t\t\tArrayList<HtWt> longestAtIndex = bestSeqAtIndex(array, solutions, i);\r\n\t\t\tsolutions.add(i, longestAtIndex);\r\n\t\t\tbestSequence = max(bestSequence, longestAtIndex);\r\n\t\t}\r\n\t\t\r\n\t\treturn bestSequence;\r\n\t}\r\n\t\r\n\tprivate static ArrayList<HtWt> bestSeqAtIndex(ArrayList<HtWt> array, ArrayList<ArrayList<HtWt>> solutions, int index) {\r\n\t\tHtWt value = array.get(index);\r\n\t\t\r\n\t\tArrayList<HtWt> bestSequence = new ArrayList<HtWt>();\r\n\t\t\r\n\t\tfor (int i = 0; i < index; i++) {\r\n\t\t\tArrayList<HtWt> solution = solutions.get(i);\r\n\t\t\tif (canAppend(solution, value)) {\r\n\t\t\t\tbestSequence = max(solution, bestSequence);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tArrayList<HtWt> best = (ArrayList<HtWt>) bestSequence.clone();\r\n\t\tbest.add(value);\r\n\t\t\r\n\t\treturn best;\r\n\t}\r\n\t\r\n\tpublic static ArrayList<HtWt> initialize() {\r\n\t\tArrayList<HtWt> items = new ArrayList<HtWt>();\r\n\t\t\r\n\t\tHtWt item = new HtWt(65, 60);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(70, 150);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(56, 90);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(75, 190);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(60, 95);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(68, 110);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(35, 65);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(40, 60);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(45, 63);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\treturn items;\r\n\t}\r\n\t\r\n\tpublic static void printList(ArrayList<HtWt> list) {\r\n\t\tfor (HtWt item : list) {\r\n\t\t\tSystem.out.println(item.toString() + \" \");\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<HtWt> items = initialize();\r\n\t\tArrayList<HtWt> solution = longestIncreasingSeq(items);\r\n\t\tprintList(solution);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_08_Circus_Tower/QuestionOld.java",
    "content": "package Q17_08_Circus_Tower;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.*;\r\n\r\npublic class QuestionOld {\r\n\r\n\t// Returns longer sequence\r\n\tprivate static ArrayList<HtWt> seqWithMaxLength(ArrayList<HtWt> seq1, ArrayList<HtWt> seq2) {\r\n\t\tif (seq1 == null) {\r\n\t\t\treturn seq2;\r\n\t\t} else if (seq2 == null) {\r\n\t\t\treturn seq1;\r\n\t\t}\r\n\t\treturn seq1.size() > seq2.size() ? seq1 : seq2;\r\n\t}\r\n\t\r\n\tprivate static void longestIncreasingSubsequence(ArrayList<HtWt> array, ArrayList<ArrayList<HtWt>> solutions, int current_index) {\r\n\t\tif (current_index >= array.size() || current_index < 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tHtWt current_element = array.get(current_index);\r\n\t\t\r\n\t\t// Find longest sequence that we can append current_element to\r\n\t\tArrayList<HtWt> best_sequence = null;\r\n\t\tfor (int i = 0; i < current_index; i++) {\r\n\t\t\tif (array.get(i).isBefore(current_element)) { // If current_element is bigger than list tail\r\n\t\t\t\tbest_sequence = seqWithMaxLength(best_sequence, solutions.get(i)); // Set best_sequence to our new max\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Append current_element\r\n\t\tArrayList<HtWt> new_solution = new ArrayList<HtWt>();\r\n\t\tif (best_sequence != null) {\r\n\t\t\tnew_solution.addAll(best_sequence);\r\n\t\t} \r\n\t\tnew_solution.add(current_element);\r\n\t\t\r\n\t\t// Add to list and recurse\r\n\t\tsolutions.add(current_index, new_solution);\r\n\t\tlongestIncreasingSubsequence(array, solutions, current_index + 1);\r\n\t}\r\n\t\r\n\tpublic static ArrayList<HtWt> longestIncreasingSeq(ArrayList<HtWt> array) {\r\n\t\tCollections.sort(array);\r\n\t\t\r\n\t\tArrayList<ArrayList<HtWt>> solutions = new ArrayList<ArrayList<HtWt>>();\r\n\t\tlongestIncreasingSubsequence(array, solutions, 0);\r\n\t\t\r\n\t\tArrayList<HtWt> best_sequence = null;\r\n\t\tfor (int i = 0; i < array.size(); i++) {\r\n\t\t\tbest_sequence = seqWithMaxLength(best_sequence, solutions.get(i));\r\n\t\t}\r\n\t\t\r\n\t\treturn best_sequence;\r\n\t}\t\r\n\t\r\n\tpublic static ArrayList<HtWt> initialize() {\r\n\t\tArrayList<HtWt> items = new ArrayList<HtWt>();\r\n\t\t\r\n\t\tHtWt item = new HtWt(65, 60);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(70, 150);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(56, 90);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(75, 190);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(60, 95);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(68, 110);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(35, 65);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(40, 60);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\titem = new HtWt(45, 63);\r\n\t\titems.add(item);\r\n\t\t\r\n\t\treturn items;\r\n\t}\r\n\t\r\n\tpublic static void printList(ArrayList<HtWt> list) {\r\n\t\tfor (HtWt item : list) {\r\n\t\t\tSystem.out.println(item.toString() + \" \");\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tArrayList<HtWt> items = initialize();\r\n\t\tArrayList<HtWt> solution = longestIncreasingSeq(items);\r\n\t\tprintList(solution);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_08_Circus_Tower/Tester.java",
    "content": "package Q17_08_Circus_Tower;\n\nimport java.util.ArrayList;\n\npublic class Tester {\n\tpublic static int randomInt(int n) {\n\t\treturn (int) (Math.random() * n);\n\t}\n\t\n\tpublic static boolean validate(ArrayList<HtWt> seq) {\n\t\tfor (int i = 1; i < seq.size(); i++) {\n\t\t\tHtWt prev = seq.get(i - 1);\n\t\t\tHtWt curr = seq.get(i);\n\t\t\tif (!prev.isBefore(curr)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int j = 0; j < 100; j++) {\n\t\t\tArrayList<HtWt> arrayA = new ArrayList<HtWt>();\n\t\t\tArrayList<HtWt> arrayB = new ArrayList<HtWt>();\n\t\t\tArrayList<HtWt> arrayC = new ArrayList<HtWt>();\n\t\t\tfor (int i = 0; i < 10; i++)  {\n\t\t\t\tHtWt value = new HtWt(randomInt(100), randomInt(100));\n\t\t\t\tarrayA.add(value);\n\t\t\t\tarrayB.add(value);\n\t\t\t\tarrayC.add(value);\n\t\t\t}\n\t\t\t\n\t\t\tArrayList<HtWt> seq1 = QuestionA.longestIncreasingSeq(arrayA);\n\t\t\tArrayList<HtWt> seq2 = QuestionB.longestIncreasingSeq(arrayB);\n\t\t\tArrayList<HtWt> seq3 = QuestionOld.longestIncreasingSeq(arrayC);\n\t\t\t\n\t\t\tif (seq1.size() != seq2.size() || seq1.size() != seq3.size()) {\n\t\t\t\tSystem.out.println(\"ERROR: \" + seq1.size() + \", \" + seq2.size() + \", \" + seq3.size());\n\t\t\t\tSystem.out.println(seq1.toString());\n\t\t\t\tSystem.out.println(seq2.toString());\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"SUCCESS: \" + seq1.size() + \" == \" + seq2.size() + \" == \" + seq3.size());\n\t\t\t\tSystem.out.println(seq1.toString());\n\t\t\t\tSystem.out.println(seq2.toString());\t\n\t\t\t\tSystem.out.println(seq3.toString());\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_09_Kth_Multiple/QuestionA.java",
    "content": "package Q17_09_Kth_Multiple;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Collections;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static ArrayList<Integer> allPossibleKFactors(int k) {\r\n\t\tArrayList<Integer> values = new ArrayList<Integer>();\r\n\t\tfor (int a = 0; a <= k; a++) { // 3\r\n\t\t\tint powA = (int) Math.pow(3,  a);\r\n\t\t\tfor (int b = 0; b <= k; b++) { // 5\r\n\t\t\t\tint powB = (int) Math.pow(5,  b);\r\n\t\t\t\tfor (int c = 0; c <= k; c++) { // 7\r\n\t\t\t\t\tint powC = (int) Math.pow(7, c);\r\n\t\t\t\t\tint value = powA * powB * powC;\r\n\t\t\t\t\tif (value < 0 || powA == Integer.MAX_VALUE || powB == Integer.MAX_VALUE || powC == Integer.MAX_VALUE) {\r\n\t\t\t\t\t\tvalue = Integer.MAX_VALUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvalues.add(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn values;\r\n\t}\r\n\t\r\n\tpublic static int getKthMagicNumber(int k) {\r\n\t\tArrayList<Integer> possibilities = allPossibleKFactors(k);\r\n\t\tCollections.sort(possibilities);\r\n\t\treturn possibilities.get(k);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 50; i++) {\r\n\t\t\tSystem.out.println(i + \" : \" + getKthMagicNumber(i));\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_09_Kth_Multiple/QuestionB.java",
    "content": "package Q17_09_Kth_Multiple;\r\n\r\nimport java.util.Queue;\r\nimport java.util.LinkedList;\r\n\r\npublic class QuestionB {\r\n\r\n\tpublic static int removeMin(Queue<Integer> q) {\r\n\t\tint min = q.peek();\r\n\t\tfor (Integer v : q) {\r\n\t\t\tif (min > v) {\r\n\t\t\t\tmin = v;\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (q.contains(min)) {\r\n\t\t\tq.remove(min);\r\n\t\t}\r\n\t\treturn min;\r\n\t}\r\n\t\r\n\tpublic static void addProducts(Queue<Integer> q, int v) {\r\n\t\tq.add(v * 3);\r\n\t\tq.add(v * 5);\r\n\t\tq.add(v * 7);\r\n\t}\r\n\t\r\n\tpublic static int getKthMagicNumber(int k) {\r\n\t\tif (k < 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tint val = 1;\r\n\t\tQueue<Integer> q = new LinkedList<Integer>();\r\n\t\taddProducts(q, 1);\r\n\t\tfor (int i = 0; i < k; i++) { // Start at 1 since we've already done one iteration\r\n\t\t\tval = removeMin(q);\r\n\t\t\taddProducts(q, val);\r\n\t\t}\r\n\t\treturn val;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 14; i++) {\r\n\t\t\tSystem.out.println(i + \" : \" + getKthMagicNumber(i));\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_09_Kth_Multiple/QuestionC.java",
    "content": "package Q17_09_Kth_Multiple;\r\n\r\nimport java.util.Queue;\r\nimport java.util.LinkedList;\r\n\r\npublic class QuestionC {\r\n\tpublic static void printQueue(Queue<Integer> q, int x) {\r\n\t\tSystem.out.print(x + \": \");\r\n\t\tfor (Integer a : q) {\r\n\t\t\tSystem.out.print(a / x + \", \");\r\n\t\t}\r\n\t\tSystem.out.println(\"\");\r\n\t}\r\n\t\r\n\tpublic static int getKthMagicNumber(int k) {\r\n\t\tif (k < 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tint val = 0;\r\n\t\tQueue<Integer> queue3 = new LinkedList<Integer>();\r\n\t\tQueue<Integer> queue5 = new LinkedList<Integer>();\r\n\t\tQueue<Integer> queue7 = new LinkedList<Integer>();\r\n\t\tqueue3.add(1);\r\n\t\tfor (int i = 0; i <= k; i++) { // Include 0th iteration through kth iteration\r\n\t\t\tint v3 = queue3.size() > 0 ? queue3.peek() : Integer.MAX_VALUE; \r\n\t\t\tint v5 = queue5.size() > 0 ? queue5.peek() : Integer.MAX_VALUE;\r\n\t\t\tint v7 = queue7.size() > 0 ? queue7.peek() : Integer.MAX_VALUE;\r\n\t\t\tval = Math.min(v3, Math.min(v5, v7));\r\n\t\t\tif (val == v3) {\r\n\t\t\t\tqueue3.remove();\r\n\t\t\t\tqueue3.add(3 * val);\r\n\t\t\t\tqueue5.add(5 * val);\r\n\t\t\t} else if (val == v5) {\r\n\t\t\t\tqueue5.remove();\r\n\t\t\t\tqueue5.add(5 * val);\r\n\t\t\t} else if (val == v7) {\r\n\t\t\t\tqueue7.remove();\r\n\t\t\t}\r\n\t\t\tqueue7.add(7 * val);\r\n\t\t}\r\n\t\treturn val;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 14; i++) {\r\n\t\t\tSystem.out.println(i + \" : \" + getKthMagicNumber(i));\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_10_Majority_Element/QuestionA.java",
    "content": "package Q17_10_Majority_Element;\n\npublic class QuestionA {\n\tpublic static boolean validate(int[] array, int majority) {\n\t\tint count = 0;\n\t\tfor (int n : array) {\n\t\t\tif (n == majority) {\n\t\t\t\tcount++;\n\t\t\t} \n\t\t}\n\t\t\n\t\treturn count > array.length / 2;\n\t}\n\n\tpublic static int findMajorityElement(int[] array) {\n\t\tfor (int x : array) {\n\t\t\tif (validate(array, x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {0, 0, 1, 2, 2, 0, 1, 0, 1, 1, 1, 1, 1};\n\t\tSystem.out.println(array.length);\n\t\tSystem.out.println(findMajorityElement(array));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_10_Majority_Element/QuestionB.java",
    "content": "package Q17_10_Majority_Element;\n\npublic class QuestionB {\n\t\n\tpublic static int getCandidate(int[] array) {\n\t\tint majority = 0;\n\t\tint count = 0;\n\t\tfor (int n : array) {\n\t\t\tif (count == 0) {\n\t\t\t\tmajority = n;\n\t\t\t}\n\t\t\tif (n == majority) {\n\t\t\t\tcount++;\n\t\t\t} else {\n\t\t\t\tcount--;\n\t\t\t}\n\t\t}\n\t\treturn majority;\n\t}\n\t\n\tpublic static boolean validate(int[] array, int majority) {\n\t\tint count = 0;\n\t\tfor (int n : array) {\n\t\t\tif (n == majority) {\n\t\t\t\tcount++;\n\t\t\t} \n\t\t}\n\t\t\n\t\treturn count > array.length / 2;\n\t}\n\n\tpublic static int findMajorityElement(int[] array) {\n\t\tint candidate = getCandidate(array);\n\t\treturn validate(array, candidate) ? candidate : -1;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {0, 0, 1, 2, 2, 0, 1, 0, 1, 1, 1, 1, 1};\n\t\tSystem.out.println(array.length);\n\t\tSystem.out.println(findMajorityElement(array));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_11_Word_Distance/LocationPair.java",
    "content": "package Q17_11_Word_Distance;\n\npublic class LocationPair {\n\tpublic int location1;\n\tpublic int location2;\n\tpublic LocationPair(int first, int second) {\n\t\tsetLocations(first, second);\n\t}\n\t\n\tpublic void setLocations(int first, int second) {\n\t\tthis.location1 = first;\n\t\tthis.location2 = second;\n\t}\n\t\n\tpublic void setLocations(LocationPair loc) {\n\t\tsetLocations(loc.location1, loc.location2);\n\t}\t\n\t\n\tpublic int distance() {\n\t\treturn Math.abs(location1 - location2);\n\t}\n\t\n\tpublic boolean isValid() {\n\t\treturn location1 >= 0 && location2 >= 0;\n\t}\n\t\n\tpublic void updateWithMin(LocationPair loc) {\n\t\tif (!isValid() || loc.distance() < distance()) {\n\t\t\tsetLocations(loc);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn \"(\" + location1 + \", \" + location2 + \")\";\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_11_Word_Distance/QuestionA.java",
    "content": "package Q17_11_Word_Distance;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static LocationPair findClosest(String[] words, String word1, String word2) {\r\n\t\tLocationPair best = new LocationPair(-1, -1);\r\n\t\tLocationPair current = new LocationPair(-1, -1);\r\n\t\tfor (int i = 0; i < words.length; i++) {\r\n\t\t\tString word = words[i];\r\n\t\t\tif (word.equals(word1)) {\r\n\t\t\t\tcurrent.location1 = i;\r\n\t\t\t\tbest.updateWithMin(current);\r\n\t\t\t} else if (word.equals(word2)) {\r\n\t\t\t\tcurrent.location2 = i;\r\n\t\t\t\tbest.updateWithMin(current);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn best;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] wordlist = AssortedMethods.getLongTextBlobAsStringList();\r\n\t\tString word1 = \"river\";\r\n\t\tString word2 = \"life\";\r\n\t\tLocationPair pair = findClosest(wordlist, word1, word2);\r\n\t\tSystem.out.println(\"Distance between <\" + word1 + \"> and <\" + word2 + \">: \" + pair.toString());\t\t\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_11_Word_Distance/QuestionB.java",
    "content": "package Q17_11_Word_Distance;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static HashMapList<String, Integer> getWordLocations(String[] words) {\r\n\t\tHashMapList<String, Integer> locations = new HashMapList<String, Integer>();\r\n\t\tfor (int i = 0; i < words.length; i++) {\r\n\t\t\tlocations.put(words[i], i);\r\n\t\t}\r\n\t\treturn locations;\r\n\t}\r\n\t\r\n\tpublic static LocationPair findMinDistancePair(ArrayList<Integer> array1, ArrayList<Integer> array2) {\r\n\t\tif (array1 == null || array2 == null || array1.size() == 0 || array2.size() == 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tint index1 = 0;\r\n\t\tint index2 = 0;\r\n\t\tLocationPair best = new LocationPair(array1.get(0), array2.get(0));\r\n\t\tLocationPair current = new LocationPair(array1.get(0), array2.get(0));\r\n\t\t\r\n\t\twhile (index1 < array1.size() && index2 < array2.size()) {\r\n\t\t\tcurrent.setLocations(array1.get(index1), array2.get(index2));\r\n\t\t\tbest.updateWithMin(current);\r\n\t\t\tif (current.location1 < current.location2) {\r\n\t\t\t\tindex1++;\r\n\t\t\t} else {\r\n\t\t\t\tindex2++;\r\n\t\t\t}\r\n\t\t}\t\r\n\t\t\r\n\t\treturn best;\r\n\t}\r\n\t\r\n\tpublic static LocationPair findClosest(String word1, String word2, HashMapList<String, Integer> locations) {\r\n\t\tArrayList<Integer> locations1 = locations.get(word1);\r\n\t\tArrayList<Integer> locations2 = locations.get(word2);\t\t\r\n\t\treturn findMinDistancePair(locations1, locations2);\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] wordlist = AssortedMethods.getLongTextBlobAsStringList();\r\n\t\tString word1 = \"river\";\r\n\t\tString word2 = \"life\";\r\n\t\tHashMapList<String, Integer> locations = getWordLocations(wordlist);\r\n\t\tLocationPair pair = findClosest(word1, word2, locations);\r\n\t\tSystem.out.println(\"Distance between <\" + word1 + \"> and <\" + word2 + \">: \" + pair.toString());\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_11_Word_Distance/Tester.java",
    "content": "package Q17_11_Word_Distance;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class Tester {\r\n\t\r\n\tpublic static String wordAtLocation(String[] words, int loc) {\r\n\t\tif (loc < 0 || loc >= words.length) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn words[loc];\r\n\t}\r\n\t\r\n\t// Method to confirm other result\r\n\tpublic static boolean searchConfirm(String[] words, String word1, String word2, int distance) {\r\n\t\tboolean found_at_distance = false;\r\n\t\tfor (int i = 0; i < words.length; i++) {\r\n\t\t\tif (words[i].equals(word1)) {\r\n\t\t\t\tfor (int j = 1; j < distance; j++) {\r\n\t\t\t\t\tString loc2a = wordAtLocation(words, i - j);\r\n\t\t\t\t\tString loc2b = wordAtLocation(words, i + j);\r\n\t\t\t\t\tif (word2.equals(loc2a) || word2.equals(loc2b)) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tString loc2a = wordAtLocation(words, i - distance);\r\n\t\t\t\tString loc2b = wordAtLocation(words, i + distance);\r\n\t\t\t\tif (word2.equals(loc2a) || word2.equals(loc2b)) {\r\n\t\t\t\t\tfound_at_distance = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn found_at_distance;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] wordlist = AssortedMethods.getLongTextBlobAsStringList();\r\n\t\tSystem.out.println(AssortedMethods.stringArrayToString(wordlist));\r\n\t\tHashMapList<String, Integer> locations = QuestionB.getWordLocations(wordlist);\r\n\t\t\r\n\t\tString[][] pairs = {{\"Lara\", \"the\"}, {\"river\", \"life\"}, {\"path\", \"their\"}, {\"life\", \"a\"}};\r\n\t\tfor (String[] pair : pairs) {\r\n\t\t\tString word1 = pair[0];\r\n\t\t\tString word2 = pair[1];\r\n\t\t\tLocationPair pairA = QuestionA.findClosest(wordlist, word1, word2);\r\n\t\t\tLocationPair pairB = QuestionB.findClosest(word1, word2, locations);\r\n\t\t\tboolean confirmC = searchConfirm(wordlist, word1, word2, pairA.distance());\r\n\t\t\t\r\n\t\t\tSystem.out.println(\"Distance between <\" + word1 + \"> and <\" + word2 + \">: \" + confirmC);\r\n\t\t\tSystem.out.println(pairA.toString() + \": \" + pairA.distance());\r\n\t\t\tSystem.out.println(pairB.toString() + \": \" + pairB.distance());\r\n\t\t\tSystem.out.println();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_12_BiNode/BiNode.java",
    "content": "package Q17_12_BiNode;\r\n\r\npublic class BiNode {\r\n\tpublic BiNode node1;\r\n\tpublic BiNode node2;\r\n\tpublic int data; \r\n\tpublic BiNode(int d) {\r\n\t\tdata = d;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_12_BiNode/QuestionA.java",
    "content": "package Q17_12_BiNode;\r\n\r\npublic class QuestionA {\r\n\tprivate static class NodePair {\r\n\t\tBiNode head;\r\n\t\tBiNode tail;\r\n\r\n\t\tpublic NodePair(BiNode head, BiNode tail)  {\r\n\t\t\tthis.head = head;\r\n\t\t\tthis.tail = tail;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static NodePair convert(BiNode root) {\r\n\t\tif (root == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tNodePair part1 = convert(root.node1);\r\n\t\tNodePair part2 = convert(root.node2);\r\n\t\t\r\n\t\tif (part1 != null) {\r\n\t\t\tconcat(part1.tail, root);\r\n\t\t}\r\n\t\t\r\n\t\tif (part2 != null) {\r\n\t\t\tconcat(root, part2.head);\r\n\t\t}\r\n\t\t\r\n\t\treturn new NodePair(part1 == null ? root : part1.head, part2 == null ? root : part2.tail);\r\n\t}\t\r\n\t\r\n\tpublic static void concat(BiNode x, BiNode y) {\r\n\t\tx.node2 = y;\r\n\t\ty.node1 = x;\r\n\t}\r\n\r\n\tpublic static void printLinkedListTree(BiNode root) {\r\n\t\tfor (BiNode node = root; node != null; node = node.node2) {\r\n\t\t\tif (node.node2 != null && node.node2.node1 != node) {\r\n\t\t\t\tSystem.out.print(\"inconsistent node: \" + node);\r\n\t\t\t}\r\n\t\t\tSystem.out.print(node.data + \"->\");\r\n\t\t}\r\n\t\tSystem.out.println();\r\n\t}\r\n\r\n\tpublic static BiNode createTree() {\r\n\t\tBiNode[] nodes = new BiNode[7];\r\n\t\tfor (int i = 0; i < nodes.length; i++) {\r\n\t\t\tnodes[i] = new BiNode(i);\r\n\t\t}\r\n\t\tnodes[4].node1 = nodes[2];\r\n\t\tnodes[4].node2 = nodes[5];\r\n\t\tnodes[2].node1 = nodes[1];\r\n\t\tnodes[2].node2 = nodes[3];\r\n\t\tnodes[5].node2 = nodes[6];\r\n\t\tnodes[1].node1 = nodes[0];\r\n\t\treturn nodes[4];\r\n\t}\r\n\r\n\tpublic static void printAsTree(BiNode root, String spaces) {\r\n\t\tif (root == null) {\r\n\t\t\tSystem.out.println(spaces + \"- null\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tSystem.out.println(spaces + \"- \" + root.data);\r\n\t\tprintAsTree(root.node1, spaces + \"   \");\r\n\t\tprintAsTree(root.node2, spaces + \"   \");\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tBiNode root = createTree();\r\n\t\tprintAsTree(root, \"\");\r\n\t\tNodePair n = convert(root);\r\n\t\tprintLinkedListTree(n.head);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_12_BiNode/QuestionB.java",
    "content": "package Q17_12_BiNode;\r\n\r\npublic class QuestionB {\r\n\tstatic int count = 0;\r\n\tpublic static BiNode convert(BiNode root) {\r\n\t\tif (root == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tBiNode part1 = convert(root.node1);\r\n\t\tBiNode part2 = convert(root.node2);\r\n\t\t\r\n\t\tif (part1 != null) {\r\n\t\t\tconcat(getTail(part1), root);\r\n\t\t}\r\n\t\t\r\n\t\tif (part2 != null) {\r\n\t\t\tconcat(root, part2);\r\n\t\t}\r\n\t\t\r\n\t\treturn part1 == null ? root : part1;\r\n\t}\t\r\n\t\r\n\tpublic static BiNode getTail(BiNode node) {\r\n\t\tif (node == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\twhile (node.node2 != null) {\r\n\t\t\tcount++;\r\n\t\t\tnode = node.node2;\r\n\t\t}\r\n\t\treturn node;\r\n\t}\r\n\t\r\n\tpublic static void concat(BiNode x, BiNode y) {\r\n\t\tx.node2 = y;\r\n\t\ty.node1 = x;\r\n\t}\r\n\r\n\tpublic static void printLinkedListTree(BiNode root) {\r\n\t\tfor (BiNode node = root; node != null; node = node.node2) {\r\n\t\t\tif (node.node2 != null && node.node2.node1 != node) {\r\n\t\t\t\tSystem.out.print(\"inconsistent node: \" + node);\r\n\t\t\t}\r\n\t\t\tSystem.out.print(node.data + \"->\");\r\n\t\t}\r\n\t\tSystem.out.println();\r\n\t}\r\n\r\n\tpublic static BiNode createTree() {\r\n\t\tBiNode[] nodes = new BiNode[7];\r\n\t\tfor (int i = 0; i < nodes.length; i++) {\r\n\t\t\tnodes[i] = new BiNode(i);\r\n\t\t}\r\n\t\tnodes[4].node1 = nodes[2];\r\n\t\tnodes[4].node2 = nodes[5];\r\n\t\tnodes[2].node1 = nodes[1];\r\n\t\tnodes[2].node2 = nodes[3];\r\n\t\tnodes[5].node2 = nodes[6];\r\n\t\tnodes[1].node1 = nodes[0];\r\n\t\treturn nodes[4];\r\n\t}\r\n\r\n\tpublic static void printAsTree(BiNode root, String spaces) {\r\n\t\tif (root == null) {\r\n\t\t\tSystem.out.println(spaces + \"- null\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tSystem.out.println(spaces + \"- \" + root.data);\r\n\t\tprintAsTree(root.node1, spaces + \"   \");\r\n\t\tprintAsTree(root.node2, spaces + \"   \");\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tBiNode root = createTree();\r\n\t\tprintAsTree(root, \"\");\r\n\t\tBiNode n = convert(root);\r\n\t\tprintLinkedListTree(n);\r\n\t\tSystem.out.println(count);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_12_BiNode/QuestionC.java",
    "content": "package Q17_12_BiNode;\r\n\r\n\r\npublic class QuestionC {\r\n\r\n\tpublic static void printAsTree(BiNode root, String spaces) {\r\n\t\tif (root == null) {\r\n\t\t\tSystem.out.println(spaces + \"- null\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tSystem.out.println(spaces + \"- \" + root.data);\r\n\t\tprintAsTree(root.node1, spaces + \"   \");\r\n\t\tprintAsTree(root.node2, spaces + \"   \");\r\n\t}\r\n\t\r\n\tpublic static BiNode createTree() {\r\n\t\tBiNode[] nodes = new BiNode[7];\r\n\t\tfor (int i = 0; i < nodes.length; i++) {\r\n\t\t\tnodes[i] = new BiNode(i);\r\n\t\t}\r\n\t\tnodes[4].node1 = nodes[2];\r\n\t\tnodes[4].node2 = nodes[5];\r\n\t\tnodes[2].node1 = nodes[1];\r\n\t\tnodes[2].node2 = nodes[3];\r\n\t\tnodes[5].node2 = nodes[6];\r\n\t\tnodes[1].node1 = nodes[0];\r\n\t\treturn nodes[4];\r\n\t}\r\n\t\r\n\tpublic static void printLinkedListTree(BiNode root) {\r\n\t\tfor (BiNode node = root; node != null; node = node.node2) {\r\n\t\t\tif (node.node2 != null && node.node2.node1 != node) {\r\n\t\t\t\tSystem.out.print(\"inconsistent node: \" + node);\r\n\t\t\t}\r\n\t\t\tSystem.out.print(node.data + \"->\");\r\n\t\t}\r\n\t\tSystem.out.println();\r\n\t}\r\n\t\r\n\tpublic static BiNode convertToCircular(BiNode root) {\r\n\t\tif (root == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tBiNode part1 = convertToCircular(root.node1);\r\n\t\tBiNode part3 = convertToCircular(root.node2);\r\n\t\t\t\t\r\n\t\tif (part1 == null && part3 == null) {\r\n\t\t\troot.node1 = root;\r\n\t\t\troot.node2 = root;\r\n\t\t\treturn root;\r\n\t\t}\r\n\t\tBiNode tail3 = part3 == null ? null : part3.node1;\r\n\t\t\r\n\t\t/* join left to root */\r\n\t\tif (part1 == null) {\r\n\t\t\tconcat(part3.node1, root);\r\n\t\t} else {\r\n\t\t\tconcat(part1.node1, root);\r\n\t\t}\r\n\t\t\r\n\t\t/* join right to root */\r\n\t\tif (part3 == null) {\r\n\t\t\tconcat(root, part1);\r\n\t\t} else {\r\n\t\t\tconcat(root, part3);\r\n\t\t}\r\n\t\t\r\n\t\t/* join right to left */\r\n\t\tif (part1 != null && part3 != null) {\r\n\t\t\tconcat(tail3, part1);\r\n\t\t}\r\n\t\t\r\n\t\treturn part1 == null ? root : part1;\r\n\t}\r\n\t\r\n\tpublic static BiNode convert(BiNode root) {\r\n\t\tBiNode head = convertToCircular(root);\r\n\t\thead.node1.node2 = null;\r\n\t\thead.node1 = null;\r\n\t\treturn head;\r\n\t}\r\n\t\r\n\tpublic static void concat(BiNode x, BiNode y) {\r\n\t\tx.node2 = y;\r\n\t\ty.node1 = x;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tBiNode root = createTree();\r\n\t\tprintAsTree(root, \"\");\r\n\t\tBiNode r = convert(root);\r\n\t\tprintLinkedListTree(r);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_13_ReSpace/ParseResult.java",
    "content": "package Q17_13_ReSpace;\r\n\r\npublic class ParseResult {\r\n\tpublic int invalid = Integer.MAX_VALUE;\r\n\tpublic String parsed = \"\";\r\n\tpublic ParseResult(int inv, String p) {\r\n\t\tinvalid = inv;\r\n\t\tparsed = p;\r\n\t}\r\n\t\r\n\tpublic ParseResult clone() {\r\n\t\treturn new ParseResult(this.invalid, this.parsed);\r\n\t}\r\n\t\r\n\tpublic static ParseResult min(ParseResult r1, ParseResult r2) {\r\n\t\tif (r1 == null) {\r\n\t\t\treturn r2;\r\n\t\t} else if (r2 == null) {\r\n\t\t\treturn r1;\r\n\t\t} \r\n\t\t\r\n\t\treturn r2.invalid < r1.invalid ? r2 : r1;\r\n\t}\t\r\n}"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_13_ReSpace/QuestionA.java",
    "content": "package Q17_13_ReSpace;\r\n\r\nimport java.util.HashSet;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\npublic class QuestionA {\t\r\n\tpublic static String bestSplit(HashSet<String> dictionary, String sentence) {\r\n\t\tParseResult r = split(dictionary, sentence, 0);\r\n\t\treturn r == null ? null : r.parsed;\r\n\t}\r\n\t\r\n\tpublic static ParseResult split(HashSet<String> dictionary, String sentence, int start) {\r\n\t\tif (start >= sentence.length()) {\r\n\t\t\treturn new ParseResult(0, \"\");\r\n\t\t} \r\n\r\n\t\tint bestInvalid = Integer.MAX_VALUE;\r\n\t\tString bestParsing = null;\r\n\r\n\t\tString partial = \"\";\r\n\t\tint index = start;\r\n\t\twhile (index < sentence.length()) {\r\n\t\t\tchar c = sentence.charAt(index);\r\n\t\t\tpartial += c;\r\n\t\t\tint invalid = dictionary.contains(partial) ? 0 : \r\n\t\t\t\tpartial.length();\r\n\t\t\tif (invalid < bestInvalid) { // Short circuit\r\n\t\t\t\t/* Recurse, putting a space after this character. If this\r\n\t\t\t\t * is better than the current best option, replace the best\r\n\t\t\t\t * option. */\r\n\t\t\t\tParseResult result = split(dictionary, sentence, index + 1);\r\n\t\t\t\tif (invalid + result.invalid < bestInvalid) {\r\n\t\t\t\t\tbestInvalid = invalid + result.invalid;\r\n\t\t\t\t\tbestParsing = partial + \" \" + result.parsed;\r\n\t\t\t\t\tif (bestInvalid == 0) break;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tindex++;\r\n\t\t}\r\n\t\treturn new ParseResult(bestInvalid, bestParsing);\r\n\t}\r\n\r\n\t\r\n\tpublic static String clean(String str) {\r\n\t\tchar[] punctuation = {',', '\"', '!', '.', '\\'', '?', ','};\r\n\t\tfor (char c : punctuation) {\r\n\t\t\tstr = str.replace(c, ' ');\r\n\t\t}\r\n\t\treturn str.replace(\" \", \"\").toLowerCase();\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tHashSet<String> dictionary = AssortedMethods.getWordListAsHashSet();\r\n\t\tString sentence = \"As one of the top companies in the world, Google\"; // will surely attract the attention of computer gurus. This does not, however, mean the company is for everyone.\";\r\n\t\tsentence = clean(sentence);\r\n\t\tSystem.out.println(sentence);\r\n\t\t//Result v = parse(0, 0, new HashMap<Integer, Result>());\r\n\t\t//System.out.println(v.parsed);\r\n\t\tSystem.out.println(bestSplit(dictionary, sentence));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_13_ReSpace/QuestionB.java",
    "content": "package Q17_13_ReSpace;\r\n\r\nimport java.util.HashSet;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\npublic class QuestionB {\r\n\t\r\n\tpublic static String bestSplit(HashSet<String> dictionary, String sentence) {\r\n\t\tParseResult[] memo = new ParseResult[sentence.length()];\r\n\t\tParseResult r = split(dictionary, sentence, 0, memo);\r\n\t\treturn r == null ? null : r.parsed;\r\n\t}\r\n\t\r\n\tpublic static ParseResult split(HashSet<String> dictionary, String sentence, int start, ParseResult[] memo) {\r\n\t\tif (start >= sentence.length()) {\r\n\t\t\treturn new ParseResult(0, \"\");\r\n\t\t} if (memo[start] != null) {\r\n\t\t\treturn memo[start];\r\n\t\t}\r\n\r\n\t\tint bestInvalid = Integer.MAX_VALUE;\r\n\t\tString bestParsing = null;\r\n\r\n\t\tString partial = \"\";\r\n\t\tint index = start;\r\n\t\twhile (index < sentence.length()) {\r\n\t\t\tchar c = sentence.charAt(index);\r\n\t\t\tpartial += c;\r\n\t\t\tint invalid = dictionary.contains(partial) ? 0 : \r\n\t\t\t\tpartial.length();\r\n\t\t\tif (invalid < bestInvalid) { // Short circuit\r\n\t\t\t\t/* Recurse, putting a space after this character. If this\r\n\t\t\t\t * is better than the current best option, replace the best\r\n\t\t\t\t * option. */\r\n\t\t\t\tParseResult result = split(dictionary, sentence, index + 1, memo);\r\n\t\t\t\tif (invalid + result.invalid < bestInvalid) { \r\n\t\t\t\t\tbestInvalid = invalid + result.invalid;\r\n\t\t\t\t\tbestParsing = partial + \" \" + result.parsed;\r\n\t\t\t\t\tif (bestInvalid == 0) break; // Short circuit\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tindex++;\r\n\t\t}\r\n\t\tmemo[start] = new ParseResult(bestInvalid, bestParsing);\r\n\t\treturn memo[start];\r\n\t}\t\r\n\t\r\n\tpublic static String clean(String str) {\r\n\t\tchar[] punctuation = {',', '\"', '!', '.', '\\'', '?', ','};\r\n\t\tfor (char c : punctuation) {\r\n\t\t\tstr = str.replace(c, ' ');\r\n\t\t}\r\n\t\treturn str.replace(\" \", \"\").toLowerCase();\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tHashSet<String> dictionary = AssortedMethods.getWordListAsHashSet();\r\n\t\tString sentence = \"As one of the topk companies in the world, Google will surely attract the attention of computer gurus. This does not, however, mean the company is for everyone.\";\r\n\t\tsentence = clean(sentence);\r\n\t\tSystem.out.println(sentence);\r\n\t\t//Result v = parse(0, 0, new HashMap<Integer, Result>());\r\n\t\t//System.out.println(v.parsed);\r\n\t\tSystem.out.println(bestSplit(dictionary, sentence));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_14_Smallest_K/QuestionA.java",
    "content": "package Q17_14_Smallest_K;\r\n\r\nimport java.util.Arrays;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionA {\r\n\t\r\n\tpublic static int[] smallestK(int[] array, int k) {\r\n\t\tif (k <= 0 || k > array.length) {\r\n\t\t\tthrow new IllegalArgumentException();\r\n\t\t}\r\n\t\t\r\n\t\t/* Sort array. */\r\n\t\tArrays.sort(array);\r\n\t\t\r\n\t\t/* Copy first k elements. */\r\n\t\tint[] smallest = new int[k];\r\n\t\tfor (int i = 0; i < k; i++) {\r\n\t\t\tsmallest[i] = array[i];\r\n\t\t}\r\n\t\treturn smallest;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 5, 2, 9, 1, 11, 6, 13, 15};\r\n\t\tint[] smallest = smallestK(array, 3);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(smallest));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_14_Smallest_K/QuestionB.java",
    "content": "package Q17_14_Smallest_K;\r\n\r\nimport java.util.Comparator;\r\nimport java.util.PriorityQueue;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionB {\r\n\t\r\n\tpublic static class MaxHeapComparator implements Comparator<Integer> {\r\n\t    public int compare(Integer x, Integer y) {\r\n\t        return y - x;\r\n\t    }\r\n\t}\r\n\t\r\n\tpublic static int[] smallestK(int[] array, int k) {\r\n\t\tif (k <= 0 || k > array.length) {\r\n\t\t\tthrow new IllegalArgumentException();\r\n\t\t}\r\n\t\t\r\n\t\tPriorityQueue<Integer> heap = getKMaxHeap(array, k);\r\n\t\treturn heapToIntArray(heap);\r\n\t}\r\n\t\r\n\t/* Convert heap to int array. */\r\n\tpublic static int[] heapToIntArray(PriorityQueue<Integer> heap) {\r\n\t\tint[] array = new int[heap.size()];\r\n\t\twhile (!heap.isEmpty()) {\r\n\t\t\tarray[heap.size() - 1] = heap.poll();\r\n\t\t}\r\n\t\treturn array;\r\n\t}\t\r\n\t\r\n\t/* Create max heap of smallest k elements. */\t\r\n\tpublic static PriorityQueue<Integer> getKMaxHeap(int[] array, int k) {\r\n\t\tPriorityQueue<Integer> heap = new PriorityQueue<Integer>(k, new MaxHeapComparator());\r\n\t\tfor (int a : array) {\r\n\t\t\tif (heap.size() < k) { // If space remaining\r\n\t\t\t\theap.add(a);\r\n\t\t\t} else if (a < heap.peek()) { // If full and top is small\r\n\t\t\t\theap.poll(); // remove highest\r\n\t\t\t\theap.add(a); // insert new element\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn heap;\r\n\t}\t\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 5, 2, 9, -1, 11, 6, 13, 15};\r\n\t\tint[] smallest = smallestK(array, 3);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(smallest));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_14_Smallest_K/QuestionC.java",
    "content": "package Q17_14_Smallest_K;\r\n\r\nimport java.util.Random;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionC {\r\n\t\r\n\tpublic static int[] smallestK(int[] array, int k) {\r\n\t\tif (k <= 0 || k > array.length) {\r\n\t\t\tthrow new IllegalArgumentException();\r\n\t\t}\r\n\t\t\r\n\t\tint threshold = rank(array, k - 1);\r\n\t\tint[] smallest = new int[k];\r\n\t\tint count = 0;\r\n\t\tfor (int a : array) {\r\n\t\t\tif (a <= threshold) {\r\n\t\t\t\tsmallest[count] = a;\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn smallest;\r\n\t}\r\n\t\r\n\t/* Get item with rank. */\r\n\tpublic static int rank(int[] array, int rank) {\r\n\t\treturn rank(array, 0, array.length - 1, rank);\r\n\t}\r\n\t\r\n\t/* Get element with rank between left and right indices. */\r\n\tpublic static int rank(int[] array, int left, int right, int rank) {\r\n\t\tint pivot = array[randomIntInRange(left, right)];\r\n\t\tint leftEnd = partition(array, left, right, pivot); // returns end of left partition\r\n\t\tint leftSize = leftEnd - left + 1;\r\n\t\tif (rank == leftSize - 1) {\r\n\t\t\treturn max(array, left, leftEnd);\r\n\t\t} else if (rank < leftSize) {\r\n\t\t\treturn rank(array, left, leftEnd, rank);\r\n\t\t} else {\r\n\t\t\treturn rank(array, leftEnd + 1, right, rank - leftSize);\r\n\t\t}\r\n\t}\r\n\t\r\n\t/* Partition array around pivot such that all elements <= pivot\r\n\t * come before all elements > pivot. */\r\n\tpublic static int partition(int[] array, int left, int right, int pivot) {\r\n\t\twhile (left <= right) {\r\n\t\t\tif (array[left] > pivot) {\r\n\t\t\t\t/* Left is bigger than pivot. Swap it to the right\r\n\t\t\t\t * side, where we know it should be. */\r\n\t\t\t\tswap(array, left, right);\r\n\t\t\t\tright--;\r\n\t\t\t} else if (array[right] <= pivot) {\r\n\t\t\t\t/* Right is smaller than the pivot. Swap it to the \r\n\t\t\t\t * left side, where we know it should be. */\r\n\t\t\t\tswap(array, left, right);\r\n\t\t\t\tleft++;\r\n\t\t\t} else {\r\n\t\t\t\t/* Left and right are in correct places. Expand both\r\n\t\t\t\t * sides. */\r\n\t\t\t\tleft++;\r\n\t\t\t\tright--;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn left - 1;\r\n\t} \r\n\t\r\n\t/* Get random integer within range, inclusive. */\r\n\tpublic static int randomIntInRange(int min, int max) {\r\n\t\tRandom rand = new Random();\r\n\t\treturn rand.nextInt(max + 1 - min) + min;\r\n\t}\t\r\n\t\r\n\t/* Swap values at index i and j. */\r\n\tpublic static void swap(int[] array, int i, int j) {\r\n\t\tint t = array[i];\r\n\t\tarray[i] = array[j];\r\n\t\tarray[j] = t;\r\n\t}\r\n\t\r\n\t/* Get largest element in array between left and right indices. */\r\n\tpublic static int max(int[] array, int left, int right) {\r\n\t\tint max = Integer.MIN_VALUE;\r\n\t\tfor (int i = left; i <= right; i++) {\r\n\t\t\tmax = Math.max(array[i], max);\r\n\t\t}\r\n\t\treturn max;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = {1, 5, 2, 9, -1, 11, 6, 13, 15};\r\n\t\tint[] smallest = smallestK(array, 3);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(smallest));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_14_Smallest_K/QuestionD.java",
    "content": "package Q17_14_Smallest_K;\n\nimport java.util.Random;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionD {\n\tpublic static class PartitionResult {\n\t\tint leftSize;\n\t\tint middleSize;\n\t\tpublic PartitionResult(int left, int middle) {\n\t\t\tthis.leftSize = left;\n\t\t\tthis.middleSize = middle;\n\t\t}\n\t}\n\t\n\tpublic static int[] smallestK(int[] array, int k) {\n\t\tif (k <= 0 || k > array.length) throw new IllegalArgumentException();\n\t\t\n\t\tint threshold = rank(array, k - 1);\n\t\tint[] smallest = new int[k];\n\t\tint count = 0;\n\t\tfor (int a : array) {\n\t\t\tif (a < threshold) {\n\t\t\t\tsmallest[count] = a;\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\t\n\t\twhile (count < k) {\n\t\t\tsmallest[count] = threshold;\n\t\t\tcount++;\n\t\t}\n\t\t\n\t\treturn smallest;\n\t}\t\n\t\n\t/* Find value with rank k in array. */\n\tpublic static int rank(int[] array, int k) {\n\t\tif (k >= array.length) {\n\t\t\tthrow new IllegalArgumentException();\n\t\t}\n\t\treturn rank(array, k, 0, array.length - 1);\n\t}\n \n\t/* Find value with rank k in sub array between start and end. */\n\tprivate static int rank(int[] array, int k, int start, int end) {\n\t\t/* Partition array around an arbitrary pivot. */\n\t\tint pivot = array[randomIntInRange(start, end)];\n\t\tPartitionResult partition = partition(array, start, end, pivot);\n\t\tint leftSize = partition.leftSize;\n\t\tint middleSize = partition.middleSize;\n\t\t\n\t\tif (k < leftSize) { // Rank k is on left half\n\t\t\treturn rank(array, k, start, start + leftSize - 1);\n\t\t} else if (k < leftSize + middleSize) { // Rank k is in middle\n\t\t\treturn pivot; // middle is all pivot values\n\t\t} else { // Rank k is on right\n\t\t\treturn rank(array, k - leftSize - middleSize, start + leftSize + middleSize, end);\n\t\t}\n\t}\n \n\t/* Partition result into < pivot, equal to pivot -> bigger than pivot. */\n\tprivate static PartitionResult partition(int[] array, int start, int end, int pivot) {\n\t\tint left = start; /* Stays at (right) edge of left side. */\n\t\tint right = end;  /* Stays at (left) edge of right side. */\n\t\tint middle = start; /* Stays at (right) edge of middle. */\n\t\twhile (middle <= right) {\n\t\t\tif (array[middle] < pivot) {\n\t\t\t\t/* Middle is smaller than the pivot. Left is either \n\t\t\t\t * smaller or equal to the pivot. Either way, swap\n\t\t\t\t * them. Then middle and left should move by one.\n\t\t\t\t */\n\t\t\t\tswap(array, middle, left);\n\t\t\t\tmiddle++;\n\t\t\t\tleft++;\n\t\t\t} else if (array[middle] > pivot) {\n\t\t\t\t/* Middle is bigger than the pivot. Right could have\n\t\t\t\t * any value. Swap them, then we know that the new\n\t\t\t\t * right is bigger than the pivot. Move right by one.\n\t\t\t\t */\n\t\t\t\tswap(array, middle, right);\n\t\t\t\tright--;\n\t\t\t} else if (array[middle] == pivot) {\n\t\t\t\t/* Middle is equal to the pivot. Move by one. */\n\t\t\t\tmiddle++;\n\t\t\t}\n\t\t}\n\t\t/* Return sizes of left and middle. */\n\t\treturn new PartitionResult(left - start, right - left + 1);\n\t}\n\t\n\tpublic static int randomIntInRange(int min, int max) {\n\t\tRandom rand = new Random();\n\t\treturn rand.nextInt(max + 1 - min) + min;\n\t}\t\n \n\t/* Swap values at index i and j. */\n\tpublic static void swap(int[] array, int i, int j) {\n\t\tint t = array[i];\n\t\tarray[i] = array[j];\n\t\tarray[j] = t;\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 5, 2, 3, 2, 9, -1, 11, 6, 13, 15, 2};\n\t\tint[] smallest = smallestK(array, 6);\n\t\tSystem.out.println(AssortedMethods.arrayToString(smallest));\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_14_Smallest_K/Tester.java",
    "content": "package Q17_14_Smallest_K;\r\n\r\nimport java.util.Arrays;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Tester {\r\n\r\n\tpublic static int rankB(int[] array, int rank) {\r\n\t\tint[] cloned = array.clone();\r\n\t\tArrays.sort(cloned);\r\n\t\treturn cloned[rank];\r\n\t}\r\n\t\r\n\tpublic static void swap(int[] array, int i, int j) {\r\n\t\tint t = array[i];\r\n\t\tarray[i] = array[j];\r\n\t\tarray[j] = t;\r\n\t}\r\n\t\r\n\tpublic static boolean isUnique(int[] array) {\r\n\t\tint[] cloned = array.clone();\r\n\t\tArrays.sort(cloned);\r\n\t\tfor (int i = 1; i < cloned.length; i++) {\r\n\t\t\tif (cloned[i] == cloned[i - 1]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static int max(int[] array, int left, int right) {\r\n\t\tint max = Integer.MIN_VALUE;\r\n\t\tfor (int i = left; i <= right; i++) {\r\n\t\t\tmax = Math.max(array[i], max);\r\n\t\t}\r\n\t\treturn max;\r\n\t}\r\n\t\r\n\tpublic static int randomInt(int n) {\r\n\t\treturn (int) (Math.random() * n);\r\n\t}\r\n\t\r\n\tpublic static int randomIntInRange(int min, int max) {\r\n\t\treturn randomInt(max + 1 - min) + min;\r\n\t}\r\n\t\r\n\tpublic static boolean isEqual(int[] array1, int[] array2) {\r\n\t\tif (array1.length != array2.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor (int i = 0; i < array1.length; i++) {\r\n\t\t\tif (array1[i] != array2[i]) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static boolean isEquivalent(int[] array1, int[] array2) {\r\n\t\tArrays.sort(array1);\r\n\t\tArrays.sort(array2);\r\n\t\treturn isEqual(array1, array2);\r\n\t}\r\n\t\r\n\tpublic static boolean testArray(int[] array1) {\r\n\t\tint[] copy = array1.clone();\r\n\t\tint[] array2 = new int[array1.length];\r\n\t\tfor (int i = 0; i < array1.length; i++) {\r\n\t\t\tarray2[i] = QuestionD.rank(array1, i);\r\n\t\t}\r\n\t\t\r\n\t\tArrays.sort(array1);\r\n\t\tif (!isEqual(array1, array2)) {\r\n\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\tSystem.out.println(\"Original Array: \" + AssortedMethods.arrayToString(copy));\r\n\t\t\tSystem.out.println(\"Ranked Array:   \" + AssortedMethods.arrayToString(array2));\r\n\t\t\tSystem.out.println(\"Sorted Array:   \" + AssortedMethods.arrayToString(array1));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\t\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint numberOfTests = 1000;\r\n\t\tint countWithC = 0;\r\n\t\tint countTotal = 0;\r\n\t\t\r\n\t\tfor (int i = 0; i < numberOfTests; i++) {\r\n\t\t\tint length = AssortedMethods.randomIntInRange(1, 10);\r\n\t\t\tint rank = AssortedMethods.randomIntInRange(1, length);\r\n\t\t\tint minRange = -1 * i;\r\n\t\t\tint maxRange = i;\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tint[] array = AssortedMethods.randomArray(length, minRange, maxRange);\r\n\t\t\tint[] smallestA = QuestionA.smallestK(array.clone(), rank);\r\n\t\t\tint[] smallestB = QuestionB.smallestK(array.clone(), rank);\r\n\t\t\tint[] smallestD = QuestionD.smallestK(array.clone(), rank);\r\n\t\t\tint[] smallestC = smallestD;\r\n\t\t\tif (isUnique(array)) {\r\n\t\t\t\tsmallestC = QuestionC.smallestK(array.clone(), rank);\r\n\t\t\t\tcountWithC++;\r\n\t\t\t}\r\n\t\t\tcountTotal++;\r\n\t\t\tif (!isEquivalent(smallestA, smallestB) || !isEquivalent(smallestB, smallestD) || !isEquivalent(smallestD, smallestC)) {\r\n\t\t\t\tSystem.out.println(\"ERROR\");\r\n\t\t\t\tSystem.out.println(array);\r\n\t\t\t\tSystem.out.println(\"ArrayA: \" + AssortedMethods.arrayToString(smallestA));\r\n\t\t\t\tSystem.out.println(\"ArrayA: \" + AssortedMethods.arrayToString(smallestA));\r\n\t\t\t\tSystem.out.println(\"ArrayB: \" + AssortedMethods.arrayToString(smallestB));\r\n\t\t\t\tSystem.out.println(\"ArrayC: \" + AssortedMethods.arrayToString(smallestC));\r\n\t\t\t\tSystem.out.println(\"ArrayD: \" + AssortedMethods.arrayToString(smallestD));\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tSystem.out.println(\"Completed \" + countTotal + \" runs, including \" + countWithC + \" with C\");\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_15_Longest_Word/LengthComparator.java",
    "content": "package Q17_15_Longest_Word;\r\n\r\nimport java.util.Comparator;\r\n\r\npublic class LengthComparator implements Comparator<String> {\r\n\tpublic int compare(String o1, String o2) {\r\n\t\tif (o1.length() < o2.length()) return 1;\r\n\t\tif (o1.length() > o2.length()) return -1;\r\n\t\treturn 0;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_15_Longest_Word/Question.java",
    "content": "package Q17_15_Longest_Word;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.HashMap;\r\n\r\npublic class Question {\r\n\tpublic static String printLongestWord(String arr[]) {\r\n\t\tHashMap<String, Boolean> map = new HashMap<String, Boolean>();\r\n\t\tfor (String str : arr) {\r\n\t\t\tmap.put(str, true);\r\n\t\t}\r\n\t\tArrays.sort(arr, new LengthComparator()); // Sort by length\r\n\t\tfor (String s : arr) {\r\n\t\t\tif (canBuildWord(s, true, map)) {\r\n\t\t\t\tSystem.out.println(s);\r\n\t\t\t\treturn s;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn \"\";\r\n\t}\r\n\t\r\n\tpublic static boolean canBuildWord(String str, boolean isOriginalWord, HashMap<String, Boolean> map) {\r\n\t\tif (map.containsKey(str) && !isOriginalWord) {\r\n\t\t\treturn map.get(str);\r\n\t\t}\r\n\t\tfor (int i = 1; i < str.length(); i++) {\r\n\t\t\tString left = str.substring(0, i);\r\n\t\t\tString right = str.substring(i);\r\n\t\t\tif (map.containsKey(left) && map.get(left) == true && \r\n\t\t\t\tcanBuildWord(right, false, map)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tmap.put(str, false);\r\n\t\treturn false;\r\n\t}\t\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] arr = createGiantArray();\t\r\n\t\tprintLongestWord(arr);\r\n\t}\r\n\t\r\n\tpublic static String[] createGiantArray() {\r\n\t\tString arr[] = {\"a\", \r\n\t\t\t\t\"able\", \r\n\t\t\t\t\"about\", \r\n\t\t\t\t\"account\", \r\n\t\t\t\t\"acid\", \r\n\t\t\t\t\"across\", \r\n\t\t\t\t\"act\", \r\n\t\t\t\t\"addition\", \r\n\t\t\t\t\"adjustment\", \r\n\t\t\t\t\"advertisement\", \r\n\t\t\t\t\"after\", \r\n\t\t\t\t\"again\", \r\n\t\t\t\t\"against\", \r\n\t\t\t\t\"agreement\", \r\n\t\t\t\t\"air\", \r\n\t\t\t\t\"all\", \r\n\t\t\t\t\"almost\", \r\n\t\t\t\t\"among\", \r\n\t\t\t\t\"amount\", \r\n\t\t\t\t\"amusement\", \r\n\t\t\t\t\"and\", \r\n\t\t\t\t\"angle\", \r\n\t\t\t\t\"angry\", \r\n\t\t\t\t\"animal\", \r\n\t\t\t\t\"answer\", \r\n\t\t\t\t\"ant\", \r\n\t\t\t\t\"any\", \r\n\t\t\t\t\"apparatus\", \r\n\t\t\t\t\"apple\", \r\n\t\t\t\t\"approval\", \r\n\t\t\t\t\"arch\", \r\n\t\t\t\t\"argument\", \r\n\t\t\t\t\"arm\", \r\n\t\t\t\t\"army\", \r\n\t\t\t\t\"art\", \r\n\t\t\t\t\"as\", \r\n\t\t\t\t\"at\", \r\n\t\t\t\t\"attack\", \r\n\t\t\t\t\"attempt\", \r\n\t\t\t\t\"attention\", \r\n\t\t\t\t\"attraction\", \r\n\t\t\t\t\"authority\", \r\n\t\t\t\t\"automatic\", \r\n\t\t\t\t\"awake\", \r\n\t\t\t\t\"baby\", \r\n\t\t\t\t\"back\", \r\n\t\t\t\t\"bad\", \r\n\t\t\t\t\"bag\", \r\n\t\t\t\t\"balance\", \r\n\t\t\t\t\"ball\", \r\n\t\t\t\t\"band\", \r\n\t\t\t\t\"base\", \r\n\t\t\t\t\"basin\", \r\n\t\t\t\t\"basket\", \r\n\t\t\t\t\"bath\", \r\n\t\t\t\t\"be\", \r\n\t\t\t\t\"beautiful\", \r\n\t\t\t\t\"because\", \r\n\t\t\t\t\"bed\", \r\n\t\t\t\t\"bee\", \r\n\t\t\t\t\"before\", \r\n\t\t\t\t\"behaviour\", \r\n\t\t\t\t\"belief\", \r\n\t\t\t\t\"bell\", \r\n\t\t\t\t\"bent\", \r\n\t\t\t\t\"berry\", \r\n\t\t\t\t\"between\", \r\n\t\t\t\t\"bird\", \r\n\t\t\t\t\"birth\", \r\n\t\t\t\t\"bit\", \r\n\t\t\t\t\"bite\", \r\n\t\t\t\t\"bitter\", \r\n\t\t\t\t\"black\", \r\n\t\t\t\t\"blade\", \r\n\t\t\t\t\"blood\", \r\n\t\t\t\t\"blow\", \r\n\t\t\t\t\"blue\", \r\n\t\t\t\t\"board\", \r\n\t\t\t\t\"boat\", \r\n\t\t\t\t\"body\", \r\n\t\t\t\t\"boiling\", \r\n\t\t\t\t\"bone\", \r\n\t\t\t\t\"book\", \r\n\t\t\t\t\"boot\", \r\n\t\t\t\t\"bottle\", \r\n\t\t\t\t\"box\", \r\n\t\t\t\t\"boy\", \r\n\t\t\t\t\"brain\", \r\n\t\t\t\t\"brake\", \r\n\t\t\t\t\"branch\", \r\n\t\t\t\t\"brass\", \r\n\t\t\t\t\"bread\", \r\n\t\t\t\t\"breath\", \r\n\t\t\t\t\"brick\", \r\n\t\t\t\t\"bridge\", \r\n\t\t\t\t\"bright\", \r\n\t\t\t\t\"broken\", \r\n\t\t\t\t\"brother\", \r\n\t\t\t\t\"brown\", \r\n\t\t\t\t\"brush\", \r\n\t\t\t\t\"bucket\", \r\n\t\t\t\t\"building\", \r\n\t\t\t\t\"bulb\", \r\n\t\t\t\t\"burn\", \r\n\t\t\t\t\"burst\", \r\n\t\t\t\t\"business\", \r\n\t\t\t\t\"but\", \r\n\t\t\t\t\"butter\", \r\n\t\t\t\t\"button\", \r\n\t\t\t\t\"by\", \r\n\t\t\t\t\"cake\", \r\n\t\t\t\t\"camera\", \r\n\t\t\t\t\"canvas\", \r\n\t\t\t\t\"card\", \r\n\t\t\t\t\"care\", \r\n\t\t\t\t\"carriage\", \r\n\t\t\t\t\"cart\", \r\n\t\t\t\t\"cat\", \r\n\t\t\t\t\"cause\", \r\n\t\t\t\t\"certain\", \r\n\t\t\t\t\"chain\", \r\n\t\t\t\t\"chalk\", \r\n\t\t\t\t\"chance\", \r\n\t\t\t\t\"change\", \r\n\t\t\t\t\"cheap\", \r\n\t\t\t\t\"cheese\", \r\n\t\t\t\t\"chemical\", \r\n\t\t\t\t\"chest\", \r\n\t\t\t\t\"chief\", \r\n\t\t\t\t\"chin\", \r\n\t\t\t\t\"church\", \r\n\t\t\t\t\"circle\", \r\n\t\t\t\t\"clean\", \r\n\t\t\t\t\"clear\", \r\n\t\t\t\t\"clock\", \r\n\t\t\t\t\"cloth\", \r\n\t\t\t\t\"cloud\", \r\n\t\t\t\t\"coal\", \r\n\t\t\t\t\"coat\", \r\n\t\t\t\t\"cold\", \r\n\t\t\t\t\"collar\", \r\n\t\t\t\t\"colour\", \r\n\t\t\t\t\"comb\", \r\n\t\t\t\t\"come\", \r\n\t\t\t\t\"comfort\", \r\n\t\t\t\t\"committee\", \r\n\t\t\t\t\"common\", \r\n\t\t\t\t\"company\", \r\n\t\t\t\t\"comparison\", \r\n\t\t\t\t\"competition\", \r\n\t\t\t\t\"complete\", \r\n\t\t\t\t\"complex\", \r\n\t\t\t\t\"condition\", \r\n\t\t\t\t\"connection\", \r\n\t\t\t\t\"conscious\", \r\n\t\t\t\t\"control\", \r\n\t\t\t\t\"cook\", \r\n\t\t\t\t\"copper\", \r\n\t\t\t\t\"copy\", \r\n\t\t\t\t\"cord\", \r\n\t\t\t\t\"cork\", \r\n\t\t\t\t\"cotton\", \r\n\t\t\t\t\"cough\", \r\n\t\t\t\t\"country\", \r\n\t\t\t\t\"cover\", \r\n\t\t\t\t\"cow\", \r\n\t\t\t\t\"crack\", \r\n\t\t\t\t\"credit\", \r\n\t\t\t\t\"crime\", \r\n\t\t\t\t\"cruel\", \r\n\t\t\t\t\"crush\", \r\n\t\t\t\t\"cry\", \r\n\t\t\t\t\"cup\", \r\n\t\t\t\t\"cup\", \r\n\t\t\t\t\"current\", \r\n\t\t\t\t\"curtain\", \r\n\t\t\t\t\"curve\", \r\n\t\t\t\t\"cushion\", \r\n\t\t\t\t\"damage\", \r\n\t\t\t\t\"danger\", \r\n\t\t\t\t\"dark\", \r\n\t\t\t\t\"daughter\", \r\n\t\t\t\t\"day\", \r\n\t\t\t\t\"dead\", \r\n\t\t\t\t\"dear\", \r\n\t\t\t\t\"death\", \r\n\t\t\t\t\"debt\", \r\n\t\t\t\t\"decision\", \r\n\t\t\t\t\"deep\", \r\n\t\t\t\t\"degree\", \r\n\t\t\t\t\"delicate\", \r\n\t\t\t\t\"dependent\", \r\n\t\t\t\t\"design\", \r\n\t\t\t\t\"desire\", \r\n\t\t\t\t\"destruction\", \r\n\t\t\t\t\"detail\", \r\n\t\t\t\t\"development\", \r\n\t\t\t\t\"different\", \r\n\t\t\t\t\"digestion\", \r\n\t\t\t\t\"direction\", \r\n\t\t\t\t\"dirty\", \r\n\t\t\t\t\"discovery\", \r\n\t\t\t\t\"discussion\", \r\n\t\t\t\t\"disease\", \r\n\t\t\t\t\"disgust\", \r\n\t\t\t\t\"distance\", \r\n\t\t\t\t\"distribution\", \r\n\t\t\t\t\"division\", \r\n\t\t\t\t\"do\", \r\n\t\t\t\t\"dog\", \r\n\t\t\t\t\"door\", \r\n\t\t\t\t\"doubt\", \r\n\t\t\t\t\"down\", \r\n\t\t\t\t\"drain\", \r\n\t\t\t\t\"drawer\", \r\n\t\t\t\t\"dress\", \r\n\t\t\t\t\"drink\", \r\n\t\t\t\t\"driving\", \r\n\t\t\t\t\"drop\", \r\n\t\t\t\t\"dry\", \r\n\t\t\t\t\"dust\", \r\n\t\t\t\t\"ear\", \r\n\t\t\t\t\"early\", \r\n\t\t\t\t\"earth\", \r\n\t\t\t\t\"east\", \r\n\t\t\t\t\"edge\", \r\n\t\t\t\t\"education\", \r\n\t\t\t\t\"effect\", \r\n\t\t\t\t\"egg\", \r\n\t\t\t\t\"elastic\", \r\n\t\t\t\t\"electric\", \r\n\t\t\t\t\"end\", \r\n\t\t\t\t\"engine\", \r\n\t\t\t\t\"enough\", \r\n\t\t\t\t\"equal\", \r\n\t\t\t\t\"error\", \r\n\t\t\t\t\"even\", \r\n\t\t\t\t\"event\", \r\n\t\t\t\t\"ever\", \r\n\t\t\t\t\"every\", \r\n\t\t\t\t\"example\", \r\n\t\t\t\t\"exchange\", \r\n\t\t\t\t\"existence\", \r\n\t\t\t\t\"expansion\", \r\n\t\t\t\t\"experience\", \r\n\t\t\t\t\"expert\", \r\n\t\t\t\t\"eye\", \r\n\t\t\t\t\"face\", \r\n\t\t\t\t\"fact\", \r\n\t\t\t\t\"fall\", \r\n\t\t\t\t\"FALSE\", \r\n\t\t\t\t\"family\", \r\n\t\t\t\t\"far\", \r\n\t\t\t\t\"farm\", \r\n\t\t\t\t\"fat\", \r\n\t\t\t\t\"father\", \r\n\t\t\t\t\"fear\", \r\n\t\t\t\t\"feather\", \r\n\t\t\t\t\"feeble\", \r\n\t\t\t\t\"feeling\", \r\n\t\t\t\t\"female\", \r\n\t\t\t\t\"fertile\", \r\n\t\t\t\t\"fiction\", \r\n\t\t\t\t\"field\", \r\n\t\t\t\t\"fight\", \r\n\t\t\t\t\"finger\", \r\n\t\t\t\t\"fire\", \r\n\t\t\t\t\"first\", \r\n\t\t\t\t\"fish\", \r\n\t\t\t\t\"fixed\", \r\n\t\t\t\t\"flag\", \r\n\t\t\t\t\"flame\", \r\n\t\t\t\t\"flat\", \r\n\t\t\t\t\"flight\", \r\n\t\t\t\t\"floor\", \r\n\t\t\t\t\"flower\", \r\n\t\t\t\t\"fly\", \r\n\t\t\t\t\"fold\", \r\n\t\t\t\t\"food\", \r\n\t\t\t\t\"foolish\", \r\n\t\t\t\t\"foot\", \r\n\t\t\t\t\"for\", \r\n\t\t\t\t\"force\", \r\n\t\t\t\t\"fork\", \r\n\t\t\t\t\"form\", \r\n\t\t\t\t\"forward\", \r\n\t\t\t\t\"fowl\", \r\n\t\t\t\t\"frame\", \r\n\t\t\t\t\"free\", \r\n\t\t\t\t\"frequent\", \r\n\t\t\t\t\"friend\", \r\n\t\t\t\t\"from\", \r\n\t\t\t\t\"front\", \r\n\t\t\t\t\"fruit\", \r\n\t\t\t\t\"full\", \r\n\t\t\t\t\"future\", \r\n\t\t\t\t\"garden\", \r\n\t\t\t\t\"general\", \r\n\t\t\t\t\"get\", \r\n\t\t\t\t\"girl\", \r\n\t\t\t\t\"give\", \r\n\t\t\t\t\"glass\", \r\n\t\t\t\t\"glove\", \r\n\t\t\t\t\"go\", \r\n\t\t\t\t\"goat\", \r\n\t\t\t\t\"gold\", \r\n\t\t\t\t\"good\", \r\n\t\t\t\t\"government\", \r\n\t\t\t\t\"grain\", \r\n\t\t\t\t\"grass\", \r\n\t\t\t\t\"great\", \r\n\t\t\t\t\"green\", \r\n\t\t\t\t\"grey\", \r\n\t\t\t\t\"grip\", \r\n\t\t\t\t\"group\", \r\n\t\t\t\t\"growth\", \r\n\t\t\t\t\"guide\", \r\n\t\t\t\t\"gun\", \r\n\t\t\t\t\"hair\", \r\n\t\t\t\t\"hammer\", \r\n\t\t\t\t\"hand\", \r\n\t\t\t\t\"hanging\", \r\n\t\t\t\t\"happy\", \r\n\t\t\t\t\"harbour\", \r\n\t\t\t\t\"hard\", \r\n\t\t\t\t\"harmony\", \r\n\t\t\t\t\"hat\", \r\n\t\t\t\t\"hate\", \r\n\t\t\t\t\"have\", \r\n\t\t\t\t\"he\", \r\n\t\t\t\t\"head\", \r\n\t\t\t\t\"healthy\", \r\n\t\t\t\t\"hear\", \r\n\t\t\t\t\"hearing\", \r\n\t\t\t\t\"heart\", \r\n\t\t\t\t\"heat\", \r\n\t\t\t\t\"help\", \r\n\t\t\t\t\"high\", \r\n\t\t\t\t\"history\", \r\n\t\t\t\t\"hole\", \r\n\t\t\t\t\"hollow\", \r\n\t\t\t\t\"hook\", \r\n\t\t\t\t\"hope\", \r\n\t\t\t\t\"horn\", \r\n\t\t\t\t\"horse\", \r\n\t\t\t\t\"hospital\", \r\n\t\t\t\t\"hour\", \r\n\t\t\t\t\"house\", \r\n\t\t\t\t\"how\", \r\n\t\t\t\t\"humour\", \r\n\t\t\t\t\"I\", \r\n\t\t\t\t\"ice\", \r\n\t\t\t\t\"idea\", \r\n\t\t\t\t\"if\", \r\n\t\t\t\t\"ill\", \r\n\t\t\t\t\"important\", \r\n\t\t\t\t\"impulse\", \r\n\t\t\t\t\"in\", \r\n\t\t\t\t\"increase\", \r\n\t\t\t\t\"industry\", \r\n\t\t\t\t\"ink\", \r\n\t\t\t\t\"insect\", \r\n\t\t\t\t\"instrument\", \r\n\t\t\t\t\"insurance\", \r\n\t\t\t\t\"interest\", \r\n\t\t\t\t\"invention\", \r\n\t\t\t\t\"iron\", \r\n\t\t\t\t\"island\", \r\n\t\t\t\t\"jelly\", \r\n\t\t\t\t\"jewel\", \r\n\t\t\t\t\"join\", \r\n\t\t\t\t\"journey\", \r\n\t\t\t\t\"judge\", \r\n\t\t\t\t\"jump\", \r\n\t\t\t\t\"keep\", \r\n\t\t\t\t\"kettle\", \r\n\t\t\t\t\"key\", \r\n\t\t\t\t\"kick\", \r\n\t\t\t\t\"kind\", \r\n\t\t\t\t\"kiss\", \r\n\t\t\t\t\"knee\", \r\n\t\t\t\t\"knife\", \r\n\t\t\t\t\"knot\", \r\n\t\t\t\t\"knowledge\", \r\n\t\t\t\t\"land\", \r\n\t\t\t\t\"language\", \r\n\t\t\t\t\"last\", \r\n\t\t\t\t\"late\", \r\n\t\t\t\t\"laugh\", \r\n\t\t\t\t\"law\", \r\n\t\t\t\t\"lead\", \r\n\t\t\t\t\"leaf\", \r\n\t\t\t\t\"learning\", \r\n\t\t\t\t\"leather\", \r\n\t\t\t\t\"left\", \r\n\t\t\t\t\"leg\", \r\n\t\t\t\t\"let\", \r\n\t\t\t\t\"letter\", \r\n\t\t\t\t\"level\", \r\n\t\t\t\t\"library\", \r\n\t\t\t\t\"lift\", \r\n\t\t\t\t\"light\", \r\n\t\t\t\t\"like\", \r\n\t\t\t\t\"limit\", \r\n\t\t\t\t\"line\", \r\n\t\t\t\t\"linen\", \r\n\t\t\t\t\"lip\", \r\n\t\t\t\t\"liquid\", \r\n\t\t\t\t\"list\", \r\n\t\t\t\t\"little\", \r\n\t\t\t\t\"living\", \r\n\t\t\t\t\"lock\", \r\n\t\t\t\t\"long\", \r\n\t\t\t\t\"look\", \r\n\t\t\t\t\"loose\", \r\n\t\t\t\t\"loss\", \r\n\t\t\t\t\"loud\", \r\n\t\t\t\t\"love\", \r\n\t\t\t\t\"low\", \r\n\t\t\t\t\"machine\", \r\n\t\t\t\t\"make\", \r\n\t\t\t\t\"male\", \r\n\t\t\t\t\"man\", \r\n\t\t\t\t\"manager\", \r\n\t\t\t\t\"map\", \r\n\t\t\t\t\"mark\", \r\n\t\t\t\t\"market\", \r\n\t\t\t\t\"married\", \r\n\t\t\t\t\"mass\", \r\n\t\t\t\t\"match\", \r\n\t\t\t\t\"material\", \r\n\t\t\t\t\"may\", \r\n\t\t\t\t\"meal\", \r\n\t\t\t\t\"measure\", \r\n\t\t\t\t\"meat\", \r\n\t\t\t\t\"medical\", \r\n\t\t\t\t\"meeting\", \r\n\t\t\t\t\"memory\", \r\n\t\t\t\t\"metal\", \r\n\t\t\t\t\"middle\", \r\n\t\t\t\t\"military\", \r\n\t\t\t\t\"milk\", \r\n\t\t\t\t\"mind\", \r\n\t\t\t\t\"mine\", \r\n\t\t\t\t\"minute\", \r\n\t\t\t\t\"mist\", \r\n\t\t\t\t\"mixed\", \r\n\t\t\t\t\"money\", \r\n\t\t\t\t\"monkey\", \r\n\t\t\t\t\"month\", \r\n\t\t\t\t\"moon\", \r\n\t\t\t\t\"morning\", \r\n\t\t\t\t\"mother\", \r\n\t\t\t\t\"motion\", \r\n\t\t\t\t\"mountain\", \r\n\t\t\t\t\"mouth\", \r\n\t\t\t\t\"move\", \r\n\t\t\t\t\"much\", \r\n\t\t\t\t\"muscle\", \r\n\t\t\t\t\"music\", \r\n\t\t\t\t\"nail\", \r\n\t\t\t\t\"name\", \r\n\t\t\t\t\"narrow\", \r\n\t\t\t\t\"nation\", \r\n\t\t\t\t\"natural\", \r\n\t\t\t\t\"near\", \r\n\t\t\t\t\"necessary\", \r\n\t\t\t\t\"neck\", \r\n\t\t\t\t\"need\", \r\n\t\t\t\t\"needle\", \r\n\t\t\t\t\"nerve\", \r\n\t\t\t\t\"net\", \r\n\t\t\t\t\"new\", \r\n\t\t\t\t\"news\", \r\n\t\t\t\t\"night\", \r\n\t\t\t\t\"no\", \r\n\t\t\t\t\"noise\", \r\n\t\t\t\t\"normal\", \r\n\t\t\t\t\"north\", \r\n\t\t\t\t\"nose\", \r\n\t\t\t\t\"not\", \r\n\t\t\t\t\"note\", \r\n\t\t\t\t\"now\", \r\n\t\t\t\t\"number\", \r\n\t\t\t\t\"nut\", \r\n\t\t\t\t\"observation\", \r\n\t\t\t\t\"of\", \r\n\t\t\t\t\"off\", \r\n\t\t\t\t\"offer\", \r\n\t\t\t\t\"office\", \r\n\t\t\t\t\"oil\", \r\n\t\t\t\t\"old\", \r\n\t\t\t\t\"on\", \r\n\t\t\t\t\"only\", \r\n\t\t\t\t\"open\", \r\n\t\t\t\t\"operation\", \r\n\t\t\t\t\"opinion\", \r\n\t\t\t\t\"opposite\", \r\n\t\t\t\t\"or\", \r\n\t\t\t\t\"orange\", \r\n\t\t\t\t\"order\", \r\n\t\t\t\t\"organization\", \r\n\t\t\t\t\"ornament\", \r\n\t\t\t\t\"other\", \r\n\t\t\t\t\"out\", \r\n\t\t\t\t\"oven\", \r\n\t\t\t\t\"over\", \r\n\t\t\t\t\"owner\", \r\n\t\t\t\t\"page\", \r\n\t\t\t\t\"pain\", \r\n\t\t\t\t\"paint\", \r\n\t\t\t\t\"paper\", \r\n\t\t\t\t\"parallel\", \r\n\t\t\t\t\"parcel\", \r\n\t\t\t\t\"part\", \r\n\t\t\t\t\"past\", \r\n\t\t\t\t\"paste\", \r\n\t\t\t\t\"payment\", \r\n\t\t\t\t\"peace\", \r\n\t\t\t\t\"pen\", \r\n\t\t\t\t\"pencil\", \r\n\t\t\t\t\"person\", \r\n\t\t\t\t\"physical\", \r\n\t\t\t\t\"picture\", \r\n\t\t\t\t\"pig\", \r\n\t\t\t\t\"pin\", \r\n\t\t\t\t\"pipe\", \r\n\t\t\t\t\"place\", \r\n\t\t\t\t\"plane\", \r\n\t\t\t\t\"plant\", \r\n\t\t\t\t\"plate\", \r\n\t\t\t\t\"play\", \r\n\t\t\t\t\"please\", \r\n\t\t\t\t\"pleasure\", \r\n\t\t\t\t\"plough\", \r\n\t\t\t\t\"pocket\", \r\n\t\t\t\t\"point\", \r\n\t\t\t\t\"poison\", \r\n\t\t\t\t\"polish\", \r\n\t\t\t\t\"political\", \r\n\t\t\t\t\"poor\", \r\n\t\t\t\t\"porter\", \r\n\t\t\t\t\"position\", \r\n\t\t\t\t\"possible\", \r\n\t\t\t\t\"pot\", \r\n\t\t\t\t\"potato\", \r\n\t\t\t\t\"powder\", \r\n\t\t\t\t\"power\", \r\n\t\t\t\t\"present\", \r\n\t\t\t\t\"price\", \r\n\t\t\t\t\"print\", \r\n\t\t\t\t\"prison\", \r\n\t\t\t\t\"private\", \r\n\t\t\t\t\"probable\", \r\n\t\t\t\t\"process\", \r\n\t\t\t\t\"produce\", \r\n\t\t\t\t\"profit\", \r\n\t\t\t\t\"property\", \r\n\t\t\t\t\"prose\", \r\n\t\t\t\t\"protest\", \r\n\t\t\t\t\"public\", \r\n\t\t\t\t\"pull\", \r\n\t\t\t\t\"pump\", \r\n\t\t\t\t\"punishment\", \r\n\t\t\t\t\"purpose\", \r\n\t\t\t\t\"push\", \r\n\t\t\t\t\"put\", \r\n\t\t\t\t\"quality\", \r\n\t\t\t\t\"question\", \r\n\t\t\t\t\"quick\", \r\n\t\t\t\t\"quiet\", \r\n\t\t\t\t\"quite\", \r\n\t\t\t\t\"rail\", \r\n\t\t\t\t\"rain\", \r\n\t\t\t\t\"range\", \r\n\t\t\t\t\"rat\", \r\n\t\t\t\t\"rate\", \r\n\t\t\t\t\"ray\", \r\n\t\t\t\t\"reaction\", \r\n\t\t\t\t\"reading\", \r\n\t\t\t\t\"ready\", \r\n\t\t\t\t\"reason\", \r\n\t\t\t\t\"receipt\", \r\n\t\t\t\t\"record\", \r\n\t\t\t\t\"red\", \r\n\t\t\t\t\"regret\", \r\n\t\t\t\t\"regular\", \r\n\t\t\t\t\"relation\", \r\n\t\t\t\t\"religion\", \r\n\t\t\t\t\"representative\", \r\n\t\t\t\t\"request\", \r\n\t\t\t\t\"respect\", \r\n\t\t\t\t\"responsible\", \r\n\t\t\t\t\"rest\", \r\n\t\t\t\t\"reward\", \r\n\t\t\t\t\"rhythm\", \r\n\t\t\t\t\"rice\", \r\n\t\t\t\t\"right\", \r\n\t\t\t\t\"ring\", \r\n\t\t\t\t\"river\", \r\n\t\t\t\t\"road\", \r\n\t\t\t\t\"rod\", \r\n\t\t\t\t\"roll\", \r\n\t\t\t\t\"roof\", \r\n\t\t\t\t\"room\", \r\n\t\t\t\t\"root\", \r\n\t\t\t\t\"rough\", \r\n\t\t\t\t\"round\", \r\n\t\t\t\t\"rub\", \r\n\t\t\t\t\"rule\", \r\n\t\t\t\t\"run\", \r\n\t\t\t\t\"sad\", \r\n\t\t\t\t\"safe\", \r\n\t\t\t\t\"sail\", \r\n\t\t\t\t\"salt\", \r\n\t\t\t\t\"same\", \r\n\t\t\t\t\"sand\", \r\n\t\t\t\t\"say\", \r\n\t\t\t\t\"scale\", \r\n\t\t\t\t\"school\", \r\n\t\t\t\t\"science\", \r\n\t\t\t\t\"scissors\", \r\n\t\t\t\t\"screw\", \r\n\t\t\t\t\"sea\", \r\n\t\t\t\t\"seat\", \r\n\t\t\t\t\"second\", \r\n\t\t\t\t\"secret\", \r\n\t\t\t\t\"secretary\", \r\n\t\t\t\t\"see\", \r\n\t\t\t\t\"seed\", \r\n\t\t\t\t\"seem\", \r\n\t\t\t\t\"selection\", \r\n\t\t\t\t\"self\", \r\n\t\t\t\t\"send\", \r\n\t\t\t\t\"sense\", \r\n\t\t\t\t\"separate\", \r\n\t\t\t\t\"serious\", \r\n\t\t\t\t\"servant\", \r\n\t\t\t\t\"sex\", \r\n\t\t\t\t\"shade\", \r\n\t\t\t\t\"shake\", \r\n\t\t\t\t\"shame\", \r\n\t\t\t\t\"sharp\", \r\n\t\t\t\t\"sheep\", \r\n\t\t\t\t\"shelf\", \r\n\t\t\t\t\"ship\", \r\n\t\t\t\t\"shirt\", \r\n\t\t\t\t\"shock\", \r\n\t\t\t\t\"shoe\", \r\n\t\t\t\t\"short\", \r\n\t\t\t\t\"shut\", \r\n\t\t\t\t\"side\", \r\n\t\t\t\t\"sign\", \r\n\t\t\t\t\"silk\", \r\n\t\t\t\t\"silver\", \r\n\t\t\t\t\"simple\", \r\n\t\t\t\t\"sister\", \r\n\t\t\t\t\"size\", \r\n\t\t\t\t\"skin\", \r\n\t\t\t\t\"skirt\", \r\n\t\t\t\t\"sky\", \r\n\t\t\t\t\"sleep\", \r\n\t\t\t\t\"slip\", \r\n\t\t\t\t\"slope\", \r\n\t\t\t\t\"slow\", \r\n\t\t\t\t\"small\", \r\n\t\t\t\t\"smash\", \r\n\t\t\t\t\"smell\", \r\n\t\t\t\t\"smile\", \r\n\t\t\t\t\"smoke\", \r\n\t\t\t\t\"smooth\", \r\n\t\t\t\t\"snake\", \r\n\t\t\t\t\"sneeze\", \r\n\t\t\t\t\"snow\", \r\n\t\t\t\t\"so\", \r\n\t\t\t\t\"soap\", \r\n\t\t\t\t\"society\", \r\n\t\t\t\t\"sock\", \r\n\t\t\t\t\"soft\", \r\n\t\t\t\t\"solid\", \r\n\t\t\t\t\"some\", \r\n\t\t\t\t\"\", \r\n\t\t\t\t\"son\", \r\n\t\t\t\t\"song\", \r\n\t\t\t\t\"sort\", \r\n\t\t\t\t\"sound\", \r\n\t\t\t\t\"soup\", \r\n\t\t\t\t\"south\", \r\n\t\t\t\t\"space\", \r\n\t\t\t\t\"spade\", \r\n\t\t\t\t\"special\", \r\n\t\t\t\t\"sponge\", \r\n\t\t\t\t\"spoon\", \r\n\t\t\t\t\"spring\", \r\n\t\t\t\t\"square\", \r\n\t\t\t\t\"stage\", \r\n\t\t\t\t\"stamp\", \r\n\t\t\t\t\"star\", \r\n\t\t\t\t\"start\", \r\n\t\t\t\t\"statement\", \r\n\t\t\t\t\"station\", \r\n\t\t\t\t\"steam\", \r\n\t\t\t\t\"steel\", \r\n\t\t\t\t\"stem\", \r\n\t\t\t\t\"step\", \r\n\t\t\t\t\"stick\", \r\n\t\t\t\t\"sticky\", \r\n\t\t\t\t\"stiff\", \r\n\t\t\t\t\"still\", \r\n\t\t\t\t\"stitch\", \r\n\t\t\t\t\"stocking\", \r\n\t\t\t\t\"stomach\", \r\n\t\t\t\t\"stone\", \r\n\t\t\t\t\"stop\", \r\n\t\t\t\t\"store\", \r\n\t\t\t\t\"story\", \r\n\t\t\t\t\"straight\", \r\n\t\t\t\t\"strange\", \r\n\t\t\t\t\"street\", \r\n\t\t\t\t\"stretch\", \r\n\t\t\t\t\"strong\", \r\n\t\t\t\t\"structure\", \r\n\t\t\t\t\"substance\", \r\n\t\t\t\t\"such\", \r\n\t\t\t\t\"sudden\", \r\n\t\t\t\t\"sugar\", \r\n\t\t\t\t\"suggestion\", \r\n\t\t\t\t\"summer\", \r\n\t\t\t\t\"sun\", \r\n\t\t\t\t\"support\", \r\n\t\t\t\t\"surprise\", \r\n\t\t\t\t\"sweet\", \r\n\t\t\t\t\"swim\", \r\n\t\t\t\t\"system\", \r\n\t\t\t\t\"table\", \r\n\t\t\t\t\"tail\", \r\n\t\t\t\t\"take\", \r\n\t\t\t\t\"talk\", \r\n\t\t\t\t\"tall\", \r\n\t\t\t\t\"taste\", \r\n\t\t\t\t\"tax\", \r\n\t\t\t\t\"teaching\", \r\n\t\t\t\t\"tendency\", \r\n\t\t\t\t\"test\", \r\n\t\t\t\t\"than\", \r\n\t\t\t\t\"that\", \r\n\t\t\t\t\"the\", \r\n\t\t\t\t\"then\", \r\n\t\t\t\t\"theory\", \r\n\t\t\t\t\"there\", \r\n\t\t\t\t\"thick\", \r\n\t\t\t\t\"thin\", \r\n\t\t\t\t\"thing\", \r\n\t\t\t\t\"this\", \r\n\t\t\t\t\"thought\", \r\n\t\t\t\t\"thread\", \r\n\t\t\t\t\"throat\", \r\n\t\t\t\t\"through\", \r\n\t\t\t\t\"through\", \r\n\t\t\t\t\"thumb\", \r\n\t\t\t\t\"thunder\", \r\n\t\t\t\t\"ticket\", \r\n\t\t\t\t\"tight\", \r\n\t\t\t\t\"till\", \r\n\t\t\t\t\"time\", \r\n\t\t\t\t\"tin\", \r\n\t\t\t\t\"tired\", \r\n\t\t\t\t\"to\", \r\n\t\t\t\t\"toe\", \r\n\t\t\t\t\"together\", \r\n\t\t\t\t\"tomorrow\", \r\n\t\t\t\t\"tongue\", \r\n\t\t\t\t\"tooth\", \r\n\t\t\t\t\"top\", \r\n\t\t\t\t\"touch\", \r\n\t\t\t\t\"town\", \r\n\t\t\t\t\"trade\", \r\n\t\t\t\t\"train\", \r\n\t\t\t\t\"transport\", \r\n\t\t\t\t\"tray\", \r\n\t\t\t\t\"tree\", \r\n\t\t\t\t\"trick\", \r\n\t\t\t\t\"trouble\", \r\n\t\t\t\t\"trousers\", \r\n\t\t\t\t\"TRUE\", \r\n\t\t\t\t\"turn\", \r\n\t\t\t\t\"twist\", \r\n\t\t\t\t\"umbrella\", \r\n\t\t\t\t\"under\", \r\n\t\t\t\t\"unit\", \r\n\t\t\t\t\"up\", \r\n\t\t\t\t\"use\", \r\n\t\t\t\t\"value\", \r\n\t\t\t\t\"verse\", \r\n\t\t\t\t\"very\", \r\n\t\t\t\t\"vessel\", \r\n\t\t\t\t\"view\", \r\n\t\t\t\t\"violent\", \r\n\t\t\t\t\"voice\", \r\n\t\t\t\t\"waiting\", \r\n\t\t\t\t\"walk\", \r\n\t\t\t\t\"wall\", \r\n\t\t\t\t\"war\", \r\n\t\t\t\t\"warm\", \r\n\t\t\t\t\"wash\", \r\n\t\t\t\t\"waste\", \r\n\t\t\t\t\"watch\", \r\n\t\t\t\t\"water\", \r\n\t\t\t\t\"wave\", \r\n\t\t\t\t\"wax\", \r\n\t\t\t\t\"way\", \r\n\t\t\t\t\"weather\", \r\n\t\t\t\t\"week\", \r\n\t\t\t\t\"weight\", \r\n\t\t\t\t\"well\", \r\n\t\t\t\t\"west\", \r\n\t\t\t\t\"wet\", \r\n\t\t\t\t\"wheel\", \r\n\t\t\t\t\"when\", \r\n\t\t\t\t\"where\", \r\n\t\t\t\t\"while\", \r\n\t\t\t\t\"whip\", \r\n\t\t\t\t\"whistle\", \r\n\t\t\t\t\"white\", \r\n\t\t\t\t\"who\", \r\n\t\t\t\t\"why\", \r\n\t\t\t\t\"wide\", \r\n\t\t\t\t\"will\", \r\n\t\t\t\t\"wind\", \r\n\t\t\t\t\"window\", \r\n\t\t\t\t\"wine\", \r\n\t\t\t\t\"wing\", \r\n\t\t\t\t\"winter\", \r\n\t\t\t\t\"wire\", \r\n\t\t\t\t\"wise\", \r\n\t\t\t\t\"with\", \r\n\t\t\t\t\"woman\", \r\n\t\t\t\t\"wood\", \r\n\t\t\t\t\"wool\", \r\n\t\t\t\t\"word\", \r\n\t\t\t\t\"work\", \r\n\t\t\t\t\"worm\", \r\n\t\t\t\t\"wound\", \r\n\t\t\t\t\"writing\", \r\n\t\t\t\t\"wrong\", \r\n\t\t\t\t\"year\", \r\n\t\t\t\t\"yellow\", \r\n\t\t\t\t\"yes\", \r\n\t\t\t\t\"yesterday\", \r\n\t\t\t\t\"you\", \r\n\t\t\t\t\"young\"};\r\n\t\t\r\n\t\treturn arr;\r\n\t\t\r\n\t\t/* To see performance on a larger array, comment / delete the above \"return arr;\" line and uncomment the below code.\r\n\t\t * This will create a giant array by concatenating words from the above list.*/\r\n\t\t/*ArrayList<String> list = new ArrayList<String>();\r\n\t\tfor (int i = 0; i < arr.length; i++) {\r\n\t\t\tint n = AssortedMethods.randomIntInRange(0, 1000);\r\n\t\t\tString s = arr[i];\r\n\t\t\tfor (int j = 0; j < n; j++) {\r\n\t\t\t\tint index = AssortedMethods.randomIntInRange(0, i);\r\n\t\t\t\ts += arr[index];\r\n\t\t\t}\r\n\t\t\tlist.add(s);\r\n\t\t\tlist.add(arr[i]);\r\n\t\t}\r\n\t\tString[] ar = new String[list.size()];\r\n\t\tfor (int i = 0; i < list.size(); i++) {\r\n\t\t\tar[i] = list.get(i);\r\n\t\t}\t\t\r\n\t\treturn ar;\r\n\t\t*/\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_16_The_Masseuse/QuestionA.java",
    "content": "package Q17_16_The_Masseuse;\n\npublic class QuestionA {\n\tpublic static int maxMinutes(int[] massages) {\n\t\treturn maxMinutes(massages, 0);\n\t}\n\t\n\tpublic static int maxMinutes(int[] massages, int index) {\n\t\tif (index >= massages.length) { // Out of bounds\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t\t/* Best with this reservation. */\n\t\tint bestWith = massages[index] + maxMinutes(massages, index + 2);\n\t\t\n\t\t/* Best without this reservation. */\n\t\tint bestWithout = maxMinutes(massages, index + 1);\n\t\t\n\t\t/* Return best of this subarray, starting from index. */\n\t\treturn Math.max(bestWith, bestWithout);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] massages = {30, 15, 60, 75, 45, 15, 15, 45};\n\t\tSystem.out.println(maxMinutes(massages));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_16_The_Masseuse/QuestionB.java",
    "content": "package Q17_16_The_Masseuse;\n\npublic class QuestionB {\n\t\n\tpublic static int maxMinutes(int[] massages) {\n\t\tint[] memo = new int[massages.length];\n\t\treturn maxMinutes(massages, 0, memo);\n\t}\n\t\n\tpublic static int maxMinutes(int[] massages, int index, int[] memo) {\n\t\tif (index >= massages.length) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (memo[index] == 0) {\n\t\t\tint bestWith = massages[index] + maxMinutes(massages, index + 2, memo);\n\t\t\tint bestWithout = maxMinutes(massages, index + 1, memo);\n\t\t\tmemo[index] = Math.max(bestWith, bestWithout);\n\t\t}\n\t\t\n\t\treturn memo[index];\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] massages = {2*15, 1*15, 4*15, 5*15, 3*15, 1*15, 1*15, 3*15};\n\t\tSystem.out.println(maxMinutes(massages));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_16_The_Masseuse/QuestionC.java",
    "content": "package Q17_16_The_Masseuse;\n\npublic class QuestionC {\n\tpublic static int maxMinutes(int[] massages) {\n\t\t/* Allocating two extra slots in the array so we don't have to do bounds\n\t\t   * checking on lines 7 and 8. */\t\t\n\t\tint[] memo = new int[massages.length + 2];\n\t\tmemo[massages.length] = 0;\n\t\tmemo[massages.length + 1] = 0;\n\t\tfor (int i = massages.length - 1; i >= 0; i--) {\n\t\t\tint bestWith = massages[i] + memo[i + 2];\n\t\t\tint bestWithout = memo[i + 1];\n\t\t\tmemo[i] = Math.max(bestWith, bestWithout);\n\t\t}\n\t\treturn memo[0];\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] massages = {2*15, 1*15, 4*15, 5*15, 3*15, 1*15, 1*15, 3*15};\n\t\tSystem.out.println(maxMinutes(massages));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_16_The_Masseuse/QuestionD.java",
    "content": "package Q17_16_The_Masseuse;\n\npublic class QuestionD {\n\tpublic static int maxMinutes(int[] massages) {\n\t\tint oneAway = 0;\n\t\tint twoAway = 0;\n\t\tfor (int i = massages.length - 1; i >= 0; i--) {\n\t\t\tint bestWith = massages[i] + twoAway;\n\t\t\tint bestWithout = oneAway;\n\t\t\tint current = Math.max(bestWith, bestWithout);\n\t\t\ttwoAway = oneAway;\n\t\t\toneAway = current;\n\t\t}\n\t\treturn oneAway;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] massages = {2*15, 1*15, 4*15, 5*15, 3*15, 1*15, 1*15, 3*15};\n\t\tSystem.out.println(maxMinutes(massages));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_16_The_Masseuse/Tester.java",
    "content": "package Q17_16_The_Masseuse;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\tpublic static int[] generateRandomArray(int size) {\n\t\tint[] array = AssortedMethods.randomArray(size, 1, 10);\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tarray[i] *= 15;\n\t\t}\n\t\treturn array;\n\t}\n\t\n\tpublic static int[] sumEveryOther(int[] array) {\n\t\tint first = 0;\n\t\tfor (int i = 0; i < array.length; i += 2) {\n\t\t\tfirst += array[i];\n\t\t}\n\t\t\n\t\tint second = 0;\n\t\tfor (int i = 1; i < array.length; i += 2) {\n\t\t\tsecond += array[i];\n\t\t}\n\t\t\n\t\tint[] a = {first, second};\n\t\treturn a;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint cutOff = 5;\n\t\tint numTests = 100;\n\t\tfor (int i = 1; i < cutOff; i++) {\n\t\t\tint[] massages = generateRandomArray(i);\n\t\t\tint maxA = QuestionA.maxMinutes(massages);\n\t\t\tint maxB = QuestionB.maxMinutes(massages);\n\t\t\tint maxC = QuestionC.maxMinutes(massages);\n\t\t\tint maxD = QuestionD.maxMinutes(massages);\n\t\t\tint[] list = sumEveryOther(massages);\n\t\t\tif (maxA != list[0] && maxA != list[1]) {\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(massages));\n\t\t\t\tSystem.out.println(maxA + \", \" + maxB + \", \" + maxC + \", \" + maxD);\n\t\t\t}\n\t\t\t\n\t\t\tif (maxA != maxB || maxB != maxC || maxC != maxD) {\n\t\t\t\tSystem.out.println(\"Error at \" + i + \": \" + maxA + \", \" + maxB + \", \" + maxC + \", \" + maxD);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (int i = cutOff; i < numTests; i++) {\n\t\t\tint[] massages = generateRandomArray(i);\n\t\t\tint maxB = QuestionB.maxMinutes(massages);\n\t\t\tint maxC = QuestionC.maxMinutes(massages);\n\t\t\tint maxD = QuestionD.maxMinutes(massages);\n\t\t\tint[] list = sumEveryOther(massages);\n\t\t\tif (maxB != list[0] && maxB != list[1]) {\n\t\t\t\tSystem.out.println(AssortedMethods.arrayToString(massages));\n\t\t\t\tSystem.out.println(maxB + \", \" + maxC + \", \" + maxD);\n\t\t\t}\t\t\t\n\t\t\tif (maxB != maxC || maxC != maxD) {\n\t\t\t\tSystem.out.println(\"Error at \" + i + \": \" + maxB + \", \" + maxC + \", \" + maxD);\n\t\t\t}\n\t\t}\n\t\tSystem.out.println(\"All tests have run.\");\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_17_Multi_Search/QuestionA.java",
    "content": "package Q17_17_Multi_Search;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionA {\r\n\tpublic static boolean isSubstringAtLocation(String big, String small, int offset) {\r\n\t\tfor (int i = 0; i < small.length(); i++) {\r\n\t\t\tif (big.charAt(offset + i) != small.charAt(i)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static ArrayList<Integer> search(String big, String small) {\r\n\t\tArrayList<Integer> locations = new ArrayList<Integer>();\r\n\t\tfor (int i = 0; i < big.length() - small.length() + 1; i++) {\r\n\t\t\tif (isSubstringAtLocation(big, small, i)) {\r\n\t\t\t\tlocations.add(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn locations;\r\n\t}\r\n\t\r\n\tpublic static HashMapList<String, Integer> searchAll(String big, String[] smalls) {\r\n\t\tHashMapList<String, Integer> lookup = new HashMapList<String, Integer>();\r\n\t\tfor (String small : smalls) {\r\n\t\t\tArrayList<Integer> locations = search(big, small);\r\n\t\t\tlookup.put(small, locations);\r\n\t\t}\r\n\t\treturn lookup;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString big = \"mississippi\";\r\n\t\tString[] smalls = {\"is\", \"ppi\", \"hi\", \"sis\", \"i\", \"mississippi\"};\r\n\t\tHashMapList<String, Integer> locations = searchAll(big, smalls);\r\n        System.out.println(locations.toString());\r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_17_Multi_Search/QuestionB.java",
    "content": "package Q17_17_Multi_Search;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionB {\r\n\tpublic static void subtractValue(ArrayList<Integer> locations, int delta) {\r\n\t\tif (locations == null) return;\r\n\t\tfor (int i = 0; i < locations.size(); i++) {\r\n\t\t\tlocations.set(i, locations.get(i) - delta);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static Trie createTrieFromString(String s) {\r\n\t\tTrie trie = new Trie();\r\n\t\tfor (int i = 0; i < s.length(); i++) {\r\n\t    \tString suffix = s.substring(i);\r\n\t    \ttrie.insertString(suffix, i);\r\n\t\t}\r\n\t\treturn trie;\r\n\t}\r\n\t\r\n\tpublic static HashMapList<String, Integer> searchAll(String big, String[] smalls) {\r\n\t\tHashMapList<String, Integer> lookup = new HashMapList<String, Integer>();\r\n        Trie tree = createTrieFromString(big);\r\n\t\tfor (String s : smalls) {\r\n\t\t\t/* Get terminating location of each occurrence.*/\r\n        \tArrayList<Integer> locations = tree.search(s);\r\n        \t\r\n        \t/* Adjust to starting location. */\r\n        \tsubtractValue(locations, s.length());\r\n        \t\r\n        \t/* Insert. */\r\n        \tlookup.put(s, locations);\r\n\t\t}\r\n\t\t\r\n\t\treturn lookup;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString big = \"mississippi\";\r\n\t\tString[] smalls = {\"is\", \"ppi\", \"hi\", \"sis\", \"i\", \"mississippi\"};\r\n\t\tHashMapList<String, Integer> locations = searchAll(big, smalls);\r\n        System.out.println(locations.toString());\r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_17_Multi_Search/QuestionC.java",
    "content": "package Q17_17_Multi_Search;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionC {\r\n\tpublic static Trie createTreeFromStrings(String[] smalls, int maxSize) {\r\n        Trie tree = new Trie();\r\n\t\tfor (String s : smalls) {\r\n\t\t\tif (s.length() <= maxSize) {\r\n\t\t\t\ttree.insertString(s, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn tree;\r\n\t}\r\n\t\r\n\tpublic static ArrayList<String> findStringsAtLoc(TrieNode root, String big, int start) {\r\n\t\tArrayList<String> strings = new ArrayList<String>();\r\n\t\tint index = start;\r\n\t\twhile (index < big.length()) {\r\n\t\t\troot = root.getChild(big.charAt(index));\r\n\t\t\tif (root == null) break;\r\n\t\t\tif (root.terminates()) {\r\n\t\t\t\tstrings.add(big.substring(start, index + 1));\r\n\t\t\t}\r\n\t\t\tindex++;\r\n\t\t\t\r\n\t\t}\r\n\t\treturn strings;\r\n\t}\r\n\t\r\n\tpublic static void insertIntoHashMap(ArrayList<String> strings, HashMapList<String, Integer> map, int index) {\r\n\t\tfor (String s : strings) {\r\n\t\t\tmap.put(s, index);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic static HashMapList<String, Integer> searchAll(String big, String[] smalls) {\r\n\t\tHashMapList<String, Integer> lookup = new HashMapList<String, Integer>();\r\n\t\tTrieNode root = createTreeFromStrings(smalls, big.length()).getRoot();\r\n\t\t\r\n\t\tfor (int i = 0; i < big.length(); i++) {\r\n\t\t\tArrayList<String> strings = findStringsAtLoc(root, big, i);\r\n\t\t\tinsertIntoHashMap(strings, lookup, i);\r\n\t\t}\r\n\t\t\r\n\t\treturn lookup;\r\n\t}\t\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tString big = \"mississippi\";\r\n\t\tString[] smalls = {\"is\", \"ppi\", \"hi\", \"sis\", \"i\", \"mississippi\"};\r\n\t\tHashMapList<String, Integer> locations = searchAll(big, smalls);\r\n        System.out.println(locations.toString());\r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_17_Multi_Search/Trie.java",
    "content": "package Q17_17_Multi_Search;\r\n\r\nimport java.util.ArrayList;\r\n\r\npublic class Trie {\r\n\tprivate TrieNode root = new TrieNode();\r\n\t\r\n\tpublic ArrayList<Integer> search(String s) {\r\n\t\treturn root.search(s);\r\n\t}\r\n\t\r\n\tpublic void insertString(String str, int location) {\r\n\t\troot.insertString(str, location);\r\n\t}\r\n\t\r\n\tpublic TrieNode getRoot() {\r\n\t\treturn root;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_17_Multi_Search/TrieNode.java",
    "content": "package Q17_17_Multi_Search;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\npublic class TrieNode {\r\n\tprivate HashMap<Character, TrieNode> children;\r\n\tprivate ArrayList<Integer> indexes;\r\n\t\r\n\tpublic TrieNode() { \r\n\t\tchildren = new HashMap<Character, TrieNode>();\r\n\t\tindexes = new ArrayList<Integer>();\r\n\t}\r\n\t\r\n\t\r\n\tpublic void insertString(String s, int index) {\r\n\t\tif (s == null) return;\r\n\t\tindexes.add(index);\r\n\t\tif (s.length() > 0) {\r\n\t\t\tchar value = s.charAt(0);\r\n\t\t\tTrieNode child = null;\r\n\t\t\tif (children.containsKey(value)) {\r\n\t\t\t\tchild = children.get(value);\r\n\t\t\t} else {\r\n\t\t\t\tchild = new TrieNode();\r\n\t\t\t\tchildren.put(value, child);\r\n\t\t\t}\r\n\t\t\tString remainder = s.substring(1);\r\n\t\t\tchild.insertString(remainder, index + 1);\r\n\t\t} else {\r\n\t\t\tchildren.put('\\0', null);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic ArrayList<Integer> search(String s) {\r\n\t\tif (s == null || s.length() == 0) {\r\n\t\t\treturn indexes;\r\n\t\t} else {\r\n\t\t\tchar first = s.charAt(0);\r\n\t\t\tif (children.containsKey(first)) {\r\n\t\t\t\tString remainder = s.substring(1);\r\n\t\t\t\treturn children.get(first).search(remainder);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic boolean terminates() {\r\n\t\treturn children.containsKey('\\0');\r\n\t}\r\n\t\r\n\tpublic TrieNode getChild(char c) {\r\n\t\treturn children.get(c);\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/HeapNode.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\npublic class HeapNode implements Comparable<HeapNode> {\n\tpublic int locationWithinList;\n\tpublic int listId;\n\t\n\tpublic HeapNode(int location, int list) {\n\t\tlocationWithinList = location;\n\t\tlistId = list;\n\t}\n\n\t@Override\n\tpublic int compareTo(HeapNode n) {\n\t\treturn locationWithinList - n.locationWithinList;\n\t}\t\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/QuestionA.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\npublic class QuestionA {\n\t/* Find next instance of element starting from index. */\n\tpublic static int findNextInstance(int[] array, int element, int index) {\n\t\tfor (int i = index; i < array.length; i++) {\n\t\t\tif (array[i] == element) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t\n\t/* Given an index, find the closure (i.e., the element which terminates a complete\n\t * subarray containing all elements in smallArray). This will be the max of the\n\t * next locations of each element in smallArray. */\n\tpublic static int findClosure(int[] bigArray, int[] smallArray, int index) {\n\t\tint max = -1;\n\t\tfor (int i = 0; i < smallArray.length; i++) {\n\t\t\tint next = findNextInstance(bigArray, smallArray[i], index);\n\t\t\tif (next == -1) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tmax = Math.max(next,  max);\n\t\t}\n\t\treturn max;\n\t}\n\t\n\tpublic static Range shortestSupersequence(int[] bigArray, int[] smallArray) {\n\t\tint bestStart = -1;\n\t\tint bestEnd = -1;\n\t\tfor (int i = 0; i < bigArray.length; i++) {\n\t\t\tint end = findClosure(bigArray, smallArray, i);\n\t\t\tif (end == -1) break;\n\t\t\tif (bestStart == -1 || end - i < bestEnd - bestStart) {\n\t\t\t\tbestStart = i;\n\t\t\t\tbestEnd = end;\n\t\t\t}\n\t\t}\n\t\tif (bestStart < 0 || bestEnd < 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn new Range(bestStart, bestEnd);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {7, 5, 9, 0, 2, 1, 3, 5, 7, 9, 1, 1, 5, 8, 9, 7};\n\t\tint[] set = {1, 5, 9};\n\t\tSystem.out.println(array.length);\n\t\tRange shortest = shortestSupersequence(array, set);\n\t\tSystem.out.println(shortest.getStart() + \", \" + shortest.getEnd());\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/QuestionB.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\npublic class QuestionB {\n\n\t/* Do backwards sweep to get a list of the next occurrence of value from each index. */\n\tpublic static int[] getNextElement(int[] bigArray, int value) {\n\t\tint next = -1;\n\t\tint[] nexts = new int[bigArray.length];\n\t\tfor (int i = bigArray.length - 1; i >= 0; i--) {\n\t\t\tif (bigArray[i] == value) {\n\t\t\t\tnext = i;\n\t\t\t}\n\t\t\tnexts[i] = next;\n\t\t}\n\t\treturn nexts;\n\t}\n\t\n\t/* Create table of next occurrences. */ \n\tpublic static int[][] getNextElementsMulti(int[] big, int[] small) {\n\t\tint[][] nextElements = new int[small.length][big.length];\n\t\tfor (int i = 0; i < small.length; i++) {\n\t\t\tnextElements[i] = getNextElement(big, small[i]);\n\t\t}\n\t\treturn nextElements;\n\t}\n\t\n\t/* Given an index and the table of next elements, find the closure\n\t * for this index (which will be the min of this column. */\n\tpublic static int getClosureForIndex(int[][] nextElements, int index) {\n\t\tint max = -1;\n\t\tfor (int i = 0; i < nextElements.length; i++) {\n\t\t\tif (nextElements[i][index] == -1) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tmax = Math.max(max, nextElements[i][index]);\n\t\t}\n\t\treturn max;\n\t}\n\t\n\t/* Get closure for each index. */\n\tpublic static int[] getClosures(int[][] nextElements) {\n\t\tint[] maxNextElement = new int[nextElements[0].length];\n\t\tfor (int i = 0; i < nextElements[0].length; i++) {\n\t\t\tmaxNextElement[i] = getClosureForIndex(nextElements, i);\n\t\t}\n\t\treturn maxNextElement;\n\t}\n\t\n\t/* Get shortest closure. */\n\tpublic static Range getShortestClosure(int[] closures) {\n\t\tint bestStart = -1;\n\t\tint bestEnd = -1;\n\t\tfor (int i = 0; i < closures.length; i++) {\n\t\t\tif (closures[i] == -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tint current = closures[i] - i;\n\t\t\tif (bestStart == -1 || current < bestEnd - bestStart) {\n\t\t\t\tbestStart = i;\n\t\t\t\tbestEnd = closures[i];\n\t\t\t}\n\t\t}\n\t\tif (bestStart < 0 || bestEnd < 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn new Range(bestStart, bestEnd);\n\t}\n\t\n\tpublic static Range shortestSupersequence(int[] big, int[] small) {\n\t\tint[][] nextElements = getNextElementsMulti(big, small);\n\t\tint[] closures = getClosures(nextElements);\n\t\treturn getShortestClosure(closures);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {9, 5, 1, 0, 2, 1, 3, 5, 7, 9, 1, 1, 5, 8, 9, 7};\n\t\tint[] set = {1, 5, 9};\n\t\tSystem.out.println(array.length);\n\t\tRange shortest = shortestSupersequence(array, set);\n\t\tSystem.out.println(shortest.getStart() + \", \" + shortest.getEnd());\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/QuestionC.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\npublic class QuestionC {\n\n\tpublic static Range shortestSupersequence(int[] big, int[] small) {\n\t\tint[] closures = getClosures(big, small);\n\t\treturn getShortestClosure(closures);\n\t}\n\t\n\t/* Get closure for each index. */\n\tpublic static int[] getClosures(int[] big, int[] small) {\n\t\tint[] closure = new int[big.length];\n\t\tfor (int i = 0; i < small.length; i++) {\n\t\t\tsweepForClosure(big, closure, small[i]);\n\t\t}\n\t\treturn closure;\n\t}\t\n\t\n\t/* Do backwards sweep and update the closures list with the next occurrence of value, if it's later than the current closure*/\n\tpublic static void sweepForClosure(int[] big, int[] closures, int value) {\n\t\tint next = -1;\n\t\tfor (int i = big.length - 1; i >= 0; i--) {\n\t\t\tif (big[i] == value) {\n\t\t\t\tnext = i;\n\t\t\t}\n\t\t\tif ((next == -1 || closures[i] < next) && (closures[i] != -1)) {\n\t\t\t\tclosures[i] = next;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* Get shortest closure. */\n\tpublic static Range getShortestClosure(int[] closures) {\n\t\tif (closures == null || closures.length == 0) return null;\n\t\tRange shortest = new Range(0, closures[0]);\n\t\tfor (int i = 1; i < closures.length; i++) {\n\t\t\tif (closures[i] == -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tRange range = new Range(i, closures[i]);\n\t\t\tif (!shortest.shorterThan(range)) {\n\t\t\t\tshortest = range;\n\t\t\t}\n\t\t}\n\t\tif (shortest.length() <= 0) return null;\n\t\treturn shortest;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {9, 2, 4, 6, 2, 5, 9};\n\t\tint[] set = {1, 5, 9};\n\t\tSystem.out.println(array.length);\n\t\tRange shortest = shortestSupersequence(array, set);\n\t\tif (shortest == null) {\n\t\t\tSystem.out.println(\"No valid subsequence.\");\n\t\t} else {\n\t\t\tSystem.out.println(shortest.getStart() + \", \" + shortest.getEnd());\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/QuestionD.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.PriorityQueue;\nimport java.util.Queue;\n\nimport CtCILibrary.HashMapList;\n\npublic class QuestionD {\n\n\tpublic static Range getShortestClosure(ArrayList<Queue<Integer>> lists) {\n\t\tPriorityQueue<HeapNode> minHeap = new PriorityQueue<HeapNode>();\n\t\tint max = Integer.MIN_VALUE;\n\t\t\n\t\t/* Insert min element from each list. */ \n\t\tfor (int i = 0; i < lists.size(); i++) {\n\t\t\tQueue<Integer> list = lists.get(i);\n\t\t\tif (list == null || list.size() == 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tint head = list.remove();\n\t\t\tminHeap.add(new HeapNode(head, i));\n\t\t\tmax = Math.max(max, head);\n\t\t}\n\t\t\n\t\tint min = minHeap.peek().locationWithinList;\n\t\tint bestRangeMin = min;\n\t\tint bestRangeMax = max;\n\t\t\n\t\twhile (true) {\n\t\t\t/* Remove min node. */\n\t\t\tHeapNode n = minHeap.poll();\n\t\t\tQueue<Integer> list = lists.get(n.listId);\n\t\t\t\n\t\t\t/* Compare range to best range. */\n\t\t\tmin = n.locationWithinList;\n\t\t\tif (max - min < bestRangeMax - bestRangeMin) {\n\t\t\t\tbestRangeMax = max;\n\t\t\t\tbestRangeMin = min;\n\t\t\t}\n\t\t\t\n\t\t\t/* If there are no more elements, then there's no more subsequences and we can break. */\n\t\t\tif (list.size() == 0) {\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\t/* Add new head of list to heap. */\n\t\t\tn.locationWithinList = list.remove();\n\t\t\tminHeap.add(n);\n\t\t\tmax = Math.max(max, n.locationWithinList);\n\t\t}\n\t\t\n\t\treturn new Range(bestRangeMin, bestRangeMax);\n\t}\n\t\n\t/* Get list of queues (linked lists) storing the indices at which\n\t * each element in smallArray appears in bigArray. */\n\tpublic static ArrayList<Queue<Integer>> getLocationsForElements(int[] big, int[] small) {\n\t\t/* Initialize hash map from item value to locations. */\n\t\tHashMap<Integer, Queue<Integer>> itemLocations = new HashMap<Integer, Queue<Integer>>();\n\t\tfor (int s : small) {\n\t\t\tQueue<Integer> queue = new LinkedList<Integer>();\n\t\t\titemLocations.put(s, queue);\n\t\t}\n\t\t\n\t\t/* Walk through big array, adding the item locations to hash map */\n\t\tfor (int i = 0; i < big.length; i++) {\n\t\t\tQueue<Integer> queue = itemLocations.get(big[i]);\n\t\t\tif (queue != null) {\n\t\t\t\tqueue.add(i);\n\t\t\t}\n\t\t}\n\t\t\n\t\tArrayList<Queue<Integer>> allLocations = new ArrayList<Queue<Integer>>();\n\t\tallLocations.addAll(itemLocations.values());\n\t\treturn allLocations;\n\t}\n\t\n\tpublic static Range shortestSupersequence(int[] big, int[] small) {\n\t\tArrayList<Queue<Integer>> locations = getLocationsForElements(big, small);\n\t\tif (locations == null) return null;\n\t\treturn getShortestClosure(locations);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {7, 5, 9, 0, 2, 1, 3, 5, 7, 9, 1, 1, 5, 8, 8, 9, 7};\n\t\tint[] set = {1, 5, 9};\n\t\tSystem.out.println(array.length);\n\t\tRange shortest = shortestSupersequence(array, set);\n\t\tif (shortest == null) {\n\t\t\tSystem.out.println(\"not found\");\n\t\t} else {\n\t\t\tSystem.out.println(shortest.getStart() + \", \" + shortest.getEnd());\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/QuestionE.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\nimport java.util.HashMap;\n\npublic class QuestionE {\n\t/* CountedLookup acts a simple hash table with increment/decrement functions\n\t * which can efficiently tell you how many values in the hash table are\n\t * at least one. \n\t */\n\tpublic static class CountedLookup {\n\t\tHashMap<Integer, Integer> lookup = new HashMap<Integer, Integer>();\n\t\tint fulfilled = 0;\n\t\tpublic CountedLookup(int[] array) {\n\t\t\tfor (int a : array) {\n\t\t\t\tlookup.put(a, 0);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic boolean contains(int v) {\n\t\t\treturn lookup.containsKey(v);\n\t\t}\n\t\t\n\t\tpublic void incrementIfFound(int v) {\n\t\t\tif (!contains(v)) return;\n\t\t\tif (lookup.getOrDefault(v, 0) == 0) {\n\t\t\t\tfulfilled += 1;\n\t\t\t}\t\t\t\n\t\t\tlookup.put(v, lookup.getOrDefault(v, 0) + 1);\n\t\t}\n\t\t\n\t\tpublic void decrementIfFound(int v) {\n\t\t\tif (!contains(v)) return;\n\t\t\tlookup.put(v, lookup.getOrDefault(v, 0) - 1);\n\t\t\tif (lookup.getOrDefault(v, 0) == 0) {\n\t\t\t\tfulfilled -= 1;\n\t\t\t}\n\t\t}\t\t\n\t\t\n\t\tpublic boolean areAllFulfilled() {\n\t\t\treturn fulfilled == lookup.keySet().size();\n\t\t}\n\t}\n\t\n\t/* Find shortest subarray which contains all elements from small. */\n\tpublic static Range shortestSupersequence(int[] big, int[] small) {\n\t\tif (big.length < small.length) return null;\n\t\t\n\t\tCountedLookup countedLookup = new CountedLookup(small);\n\t\tRange best = null;\n\t\tint right = 0;\n\t\tcountedLookup.incrementIfFound(big[0]); // Take in left\n\t\tfor (int left = 0; left < big.length; left++) {\n\t\t\tright = findClosure(big, right, countedLookup); // Move right to closure end\n\t\t\tif (!countedLookup.areAllFulfilled()) { // No closure -> break\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\t/* Update biggest range. */\n\t\t\tint length = right - left + 1;\n\t\t\tif (best == null || best.length() > length) {\n\t\t\t\tbest = new Range(left, right);\n\t\t\t}\n\t\t\tcountedLookup.decrementIfFound(big[left]); // Drop leftmost element\n\t\t}\n\t\treturn best;\n\t}\n\t\n\t/* Find closure for index, and update countedlookup */\n\tpublic static int findClosure(int[] big, int startIndex, CountedLookup countedLookup) {\n\t\tint index = startIndex;\n\t\t\n\t\t/* Move forward until everything is fulfilled. */\n\t\twhile (!countedLookup.areAllFulfilled() && index + 1 < big.length) {\n\t\t\tindex++;\n\t\t\tcountedLookup.incrementIfFound(big[index]);\n\t\t}\n\t\treturn index;\t\n\t}\t\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {7, 5, 9, 0, 2, 1, 3, 5, 7, 9, 1, 1, 5, 8, 8, 9, 7};\n\t\tint[] set = {1, 5, 9};\n\t\tRange shortest = shortestSupersequence(array, set);\n\t\tif (shortest == null) {\n\t\t\tSystem.out.println(\"not found\");\n\t\t} else {\n\t\t\tSystem.out.println(shortest.toString());\n\t\t\tfor (int i = shortest.getStart(); i <= shortest.getEnd(); i++) {\n\t\t\t\tSystem.out.print(array[i] + \", \");\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/Range.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\npublic class Range {\n\tprivate int start;\n\tprivate int end;\n\tpublic Range(int s, int e) {\n\t\tstart = s;\n\t\tend = e;\n\t}\n\t\n\tpublic int length() {\n\t\treturn end - start + 1;\n\t}\n\t\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result + end;\n\t\tresult = prime * result + start;\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tRange other = (Range) obj;\n\t\tif (end != other.end)\n\t\t\treturn false;\n\t\tif (start != other.start)\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Range [start=\" + start + \", end=\" + end + \"]\";\n\t}\n\n\tpublic boolean shorterThan(Range other) {\n\t\treturn length() < other.length();\n\t}\n\t\n\tpublic int getStart() {\n\t\treturn start;\n\t}\n\t\n\tpublic int getEnd() {\n\t\treturn end;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_18_Shortest_Supersequence/Tester.java",
    "content": "package Q17_18_Shortest_Supersequence;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\tpublic static boolean equivalent(Range[] ranges) {\n\t\tif (ranges[0] == null) {\n\t\t\tfor (Range r : ranges) {\n\t\t\t\tif (r != null) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tint targetLength = ranges[0].length();\n\t\tfor (Range r : ranges) {\n\t\t\tint length = r == null ? 0 : r.length();\n\t\t\tif (targetLength != length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 100; i++) {\n\t\t\tint[] array = AssortedMethods.randomArray(i,  0,  15);\n\t\t\tint[] set = {0, 5, 8, 10};\n\t\t\t\n\t\t\tRange[] ranges = new Range[5];\n\t\t\t\n\t\t\tranges[0] = QuestionA.shortestSupersequence(array, set);\n\t\t\tranges[1] = QuestionB.shortestSupersequence(array, set);\n\t\t\tranges[2] = QuestionC.shortestSupersequence(array, set);\n\t\t\tranges[3] = QuestionD.shortestSupersequence(array, set);\n\t\t\tranges[4] = QuestionE.shortestSupersequence(array, set);\n\t\t\t\n\t\t\tif (!equivalent(ranges)) {\n\t\t\t\tSystem.out.println(\"Mismatching.\");\n\t\t\t} else {\n\t\t\t\tint length = ranges[0] == null ? 0 : ranges[0].length();\n\t\t\t\tSystem.out.println(\"Matching: \" + length);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_19_Missing_Two/QuestionA.java",
    "content": "package Q17_19_Missing_Two;\n\nimport java.math.BigInteger;\n\npublic class QuestionA {\n\n\tpublic static BigInteger productToN(int n) {\n\t\tBigInteger fullProduct = new BigInteger(\"1\");\n\t\tfor (int i = 2; i <= n; i++) {\n\t\t\tfullProduct = fullProduct.multiply(new BigInteger(i + \"\"));\n\t\t}\n\t\treturn fullProduct;\n\t}\n\t\n\tpublic static int missingOne(int[] array) {\n\t\tBigInteger fullProduct = productToN(array.length + 1);\n\t\t\n\t\tBigInteger actualProduct = new BigInteger(\"1\");\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tBigInteger value = new BigInteger(array[i] + \"\");\n\t\t\tactualProduct = actualProduct.multiply(value);\n\t\t}\n\t\t\n\t\tBigInteger missingNumber = fullProduct.divide(actualProduct);\n\t\treturn Integer.parseInt(missingNumber.toString());\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint max = 100;\n\t\tint x = 8;\n\t\tint len = max - 1;\n\t\tint count = 0;\n\t\tint[] array = new int[len];\n\t\tfor (int i = 1; i <= max; i++) {\n\t\t\tif (i != x) {\n\t\t\t\tarray[count] = i;\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\tSystem.out.println(x);\n\t\tint solution = missingOne(array);\n\t\t\n\t\tSystem.out.println(solution);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_19_Missing_Two/QuestionB.java",
    "content": "package Q17_19_Missing_Two;\n\npublic class QuestionB {\n\tpublic static int missingOne(int[] array) {\n\t\tint max_value = array.length + 1;\n\t\tint remainder = max_value * (max_value + 1) / 2;\n\t\t\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tremainder -= array[i];\n\t\t}\n\t\treturn remainder;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint max = 100;\n\t\tint x = 8;\n\t\tint len = max - 1;\n\t\tint count = 0;\n\t\tint[] array = new int[len];\n\t\tfor (int i = 1; i <= max; i++) {\n\t\t\tif (i != x) {\n\t\t\t\tarray[count] = i;\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\tSystem.out.println(x);\n\t\tint solution = missingOne(array);\n\t\t\n\t\tSystem.out.println(solution);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_19_Missing_Two/QuestionC.java",
    "content": "package Q17_19_Missing_Two;\n\npublic class QuestionC {\n\tpublic static int squareSumToN(int n, int power) {\n\t\tint sum = 0;\n\t\tfor (int i = 1; i <= n; i++) {\n\t\t\tsum += (int) Math.pow(i, power);\n\t\t}\n\t\treturn sum;\n\t}\n\t\n\tpublic static int[] solveEquation(int r1, int r2) {\n\t\t/* ax^2 + bx + c \n\t\t * -->\n\t\t * x = [-b +- sqrt(b^2 - 4ac)] / 2a\n\t\t * In this case, it has to be a + not a -\n\t\t * \n\t\t */\n\t\tint a = 2;\n\t\tint b = -2 * r1;\n\t\tint c = r1 * r1 - r2;\n\t\t\n\t\tdouble part1 = -1 * b;\n\t\tdouble part2 = Math.sqrt(b*b - 4 * a * c);\n\t\tdouble part3 = 2 * a;\n\t\t\n\t\t\n\t\tint solutionX = (int) ((part1 + part2) / part3);\n\t\tint solutionY = r1 - solutionX;\n\t\t\n\t\tint solutionX2 = (int) ((part1 - part2) / part3);\n\t\tint solutionY2 = r1 - solutionX2;\n\t\t\n\t\tSystem.out.println(\"Alternate: (\" + solutionX2 + \", \" + solutionY2 + \")\");\n\t\t\n\t\tint[] solution = {solutionX, solutionY};\n\t\treturn solution;\n\t}\n\t\n\tpublic static int[] missingTwo(int[] array) {\n\t\tint max_value = array.length + 2;\n\t\tint rem_square = squareSumToN(max_value, 2);\n\t\tint rem_one = max_value * (max_value + 1) / 2;\n\t\t\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\trem_square -= array[i] * array[i];\n\t\t\trem_one -= array[i];\n\t\t}\n\t\t\n\t\treturn solveEquation(rem_one, rem_square);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint max = 100;\n\t\tfor (int x = 1; x < max; x++) {\n\t\t\tfor (int y = 1; y < max; y++) {\n\t\t\t\tif (x != y) {\n\t\t\t\t\tint len = max - 2;\n\t\t\t\t\tint count = 0;\n\t\t\t\t\tint[] array = new int[len];\n\t\t\t\t\tfor (int i = 1; i <= max; i++) {\n\t\t\t\t\t\tif (i != x && i != y) {\n\t\t\t\t\t\t\tarray[count] = i;\n\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tint[] solution = missingTwo(array);\n\t\t\t\t\t\n\t\t\t\t\tif ((solution[0] == x && solution[1] == y) ||\n\t\t\t\t\t\t(solution[1] == x && solution[0] == y)) {\t\n\t\t\t\t\t\tSystem.out.println(\"Success: \" + solution[0] + \", \" + solution[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tSystem.out.println(\"Error: \" + x + \", \" + y + \" | \" + solution[0] + \", \" + solution[1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_20_Continuous_Median/MaxHeapComparator.java",
    "content": "package Q17_20_Continuous_Median;\r\n\r\nimport java.util.Comparator;\r\n\r\npublic class MaxHeapComparator implements Comparator<Integer>{\r\n\t// Comparator that sorts integers from highest to lowest\r\n\t@Override\r\n\tpublic int compare(Integer o1, Integer o2) {\r\n\t\t// TODO Auto-generated method stub\r\n\t\tif (o1 < o2) return 1;\r\n\t\telse if (o1 == o2) return 0;\r\n\t\telse return -1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_20_Continuous_Median/MinHeapComparator.java",
    "content": "package Q17_20_Continuous_Median;\r\n\r\nimport java.util.Comparator;\r\n\r\npublic class MinHeapComparator implements Comparator<Integer>{\r\n\t// Comparator that sorts integers from lowest to highest\r\n\t@Override\r\n\tpublic int compare(Integer o1, Integer o2) {\r\n\t\tif (o1 > o2) return 1;\r\n\t\telse if (o1 == o2)\treturn 0;\r\n\t\telse return -1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_20_Continuous_Median/Question.java",
    "content": "package Q17_20_Continuous_Median;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.Comparator;\r\nimport java.util.PriorityQueue;\r\n\r\npublic class Question {\r\n\tprivate static Comparator<Integer> maxHeapComparator;\r\n\tprivate static Comparator<Integer> minHeapComparator;\r\n\tprivate static PriorityQueue<Integer> maxHeap;\r\n\tprivate static PriorityQueue<Integer> minHeap;\r\n\r\n\tpublic static void addNewNumber(int randomNumber) {\r\n\t\t/* Note: addNewNumber maintains a condition that maxHeap.size() >= minHeap.size() */\r\n\t\tif (maxHeap.size() == minHeap.size()) {\r\n\t\t\tif ((minHeap.peek() != null) && \r\n\t\t\t\t\trandomNumber > minHeap.peek()) {\r\n\t\t\t\tmaxHeap.offer(minHeap.poll());\r\n\t\t\t\tminHeap.offer(randomNumber);\r\n\t\t\t} else {\r\n\t\t\t\tmaxHeap.offer(randomNumber);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif(randomNumber < maxHeap.peek()){\r\n\t\t\t\tminHeap.offer(maxHeap.poll());\r\n\t\t\t\tmaxHeap.offer(randomNumber);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tminHeap.offer(randomNumber);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static double getMedian() {\r\n\t\t/* maxHeap is always at least as big as minHeap. So if maxHeap is empty, then minHeap is also. */\t\t\r\n\t\tif (maxHeap.isEmpty()) {\r\n\t\t\treturn 0;\r\n\t\t} \r\n\t\tif (maxHeap.size() == minHeap.size()) {\r\n\t\t\treturn ((double)minHeap.peek() + (double) maxHeap.peek()) / 2;\r\n\t\t} else {\r\n\t\t\t/* If maxHeap and minHeap are of different sizes, then maxHeap must have one extra element. Return maxHeap�s top element.*/\t\t\t\r\n\t\t\treturn maxHeap.peek();\r\n\t\t} \r\n\t}\r\n\r\n\tpublic static void addNewNumberAndPrintMedian(int randomNumber) {\r\n\t\taddNewNumber(randomNumber);\r\n\t\tSystem.out.println(\"Random Number = \" + randomNumber);\r\n\t\tprintMinHeapAndMaxHeap();\r\n\t\tSystem.out.println(\"\\nMedian = \" + getMedian() + \"\\n\");\r\n\t}\r\n\r\n\tpublic static void printMinHeapAndMaxHeap(){\r\n\t\tInteger[] minHeapArray = minHeap.toArray(\r\n\t\t\t\tnew Integer[minHeap.size()]);\r\n\t\tInteger[] maxHeapArray = maxHeap.toArray(\r\n\t\t\t\tnew Integer[maxHeap.size()]);\r\n\r\n\t\tArrays.sort(minHeapArray, maxHeapComparator);\r\n\t\tArrays.sort(maxHeapArray, maxHeapComparator);\r\n\t\tSystem.out.print(\"MinHeap =\");\r\n\t\tfor (int i = minHeapArray.length - 1; i >= 0 ; i--){\r\n\t\t\tSystem.out.print(\" \" + minHeapArray[i]);\r\n\t\t}\r\n\t\tSystem.out.print(\"\\nMaxHeap =\");\r\n\t\tfor (int i = 0; i < maxHeapArray.length; i++){\r\n\t\t\tSystem.out.print(\" \" + maxHeapArray[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tint arraySize = 10;\r\n\t\tint range = 7;\r\n\r\n\t\tmaxHeapComparator = new MaxHeapComparator();\r\n\t\tminHeapComparator = new MinHeapComparator();\r\n\t\tmaxHeap = new PriorityQueue<Integer>(arraySize - arraySize/2, maxHeapComparator);\r\n\t\tminHeap = new PriorityQueue<Integer>(arraySize/2, minHeapComparator);\r\n\t\t\r\n\t\tfor(int i = 0; i < arraySize; i++) {\r\n\t\t\tint randomNumber = (int) (Math.random( ) * (range+1));\r\n\t\t\taddNewNumberAndPrintMedian(randomNumber);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_21_Volume_of_Histogram/HistogramData.java",
    "content": "package Q17_21_Volume_of_Histogram;\n\npublic class HistogramData {\n\n\tprivate int height;\n\tprivate int leftMaxIndex = -1;\n\tprivate int rightMaxIndex = -1;\n\t\n\tpublic HistogramData(int v) {\n\t\theight = v;\n\t}\n\t\n\tpublic int getHeight() { return height; }\n\tpublic int getLeftMaxIndex() { return leftMaxIndex; }\n\tpublic void setLeftMaxIndex(int idx) { leftMaxIndex = idx; };\n\tpublic int getRightMaxIndex() { return rightMaxIndex; }\n\tpublic void setRightMaxIndex(int idx) { rightMaxIndex = idx; };\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_21_Volume_of_Histogram/QuestionA.java",
    "content": "package Q17_21_Volume_of_Histogram;\n\npublic class QuestionA {\n\n\tpublic static int findIndexOfMax(int[] histogram, int start, int end) {\n\t\tint indexOfMax = start;\n\t\tfor (int i = start + 1; i <= end; i++) {\n\t\t\tif (histogram[i] > histogram[indexOfMax]) {\n\t\t\t\tindexOfMax = i;\n\t\t\t}\n\t\t}\n\t\treturn indexOfMax;\n\t}\n\t\n\tpublic static int borderedVolume(int[] histogram, int start, int end) {\n\t\tif (start >= end) return 0;\n\t\t\n\t\tint min = Math.min(histogram[start], histogram[end]);\n\t\tint sum = 0;\n\t\tfor (int i = start + 1; i < end; i++) {\n\t\t\tsum += min - histogram[i];\n\t\t}\n\t\treturn sum;\n\t}\n\t\n\tpublic static int subgraphVolume(int[] histogram, int start, int end, boolean isLeft) {\n\t\tif (start >= end) return 0;\t\n\t\tint sum = 0;\n\t\tif (isLeft) {\n\t\t\tint max = findIndexOfMax(histogram, start, end - 1);\n\t\t\tsum += borderedVolume(histogram, max, end);\n\t\t\tsum += subgraphVolume(histogram, start, max, isLeft);\n\t\t} else {\n\t\t\tint max = findIndexOfMax(histogram, start + 1, end);\n\t\t\tsum += borderedVolume(histogram, start, max);\n\t\t\tsum += subgraphVolume(histogram, max, end, isLeft);\n\t\t} \n\t\t\n\t\treturn sum;\n\t}\n\t\n\tpublic static int computeHistogramVolume(int[] histogram) {\n\t\tint start = 0;\n\t\tint end = histogram.length - 1;\n\t\t\n\t\tint max = findIndexOfMax(histogram, start, end);\n\t\t\n\t\tint leftVolume =  subgraphVolume(histogram, start, max, true);\n\t\tint rightVolume = subgraphVolume(histogram, max, end, false);\n\t\t\n\t\treturn leftVolume + rightVolume;\t\t\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] histogram = {0, 0, 4, 0, 0, 6, 0, 0, 3, 0, 8, 0, 2, 0, 5, 2, 0, 3, 0, 0};\n\t\tint result = computeHistogramVolume(histogram);\n\t\tSystem.out.println(result);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_21_Volume_of_Histogram/QuestionB.java",
    "content": "package Q17_21_Volume_of_Histogram;\n\npublic class QuestionB {\n\tpublic static int borderedVolume(HistogramData[] data, int start, int end) {\n\t\tif (start >= end) return 0;\n\t\t\n\t\tint min = Math.min(data[start].getHeight(), data[end].getHeight());\n\t\tint sum = 0;\n\t\tfor (int i = start + 1; i < end; i++) {\n\t\t\tsum += min - data[i].getHeight();\n\t\t}\n\t\treturn sum;\n\t}\n\t\n\tpublic static int subgraphVolume(HistogramData[] histogram, int start, int end, boolean isLeft) {\n\t\tif (start >= end) return 0;\t\n\t\tint sum = 0;\n\t\tif (isLeft) {\n\t\t\tint max = histogram[end - 1].getLeftMaxIndex();\t\n\t\t\tsum += borderedVolume(histogram, max, end);\n\t\t\tsum += subgraphVolume(histogram, start, max, isLeft);\t\n\t\t} else {\n\t\t\tint max = histogram[start + 1].getRightMaxIndex();\t\n\t\t\tsum += borderedVolume(histogram, start, max);\n\t\t\tsum += subgraphVolume(histogram, max, end, isLeft);\t\t\n\t\t}\n\t\t\n\t\treturn sum;\n\t}\n\t\n\tpublic static HistogramData[] createHistogramData(int[] histo) {\n\t\tHistogramData[] histogram = new HistogramData[histo.length];\n\t\tfor (int i = 0; i < histo.length; i++) {\n\t\t\thistogram[i] = new HistogramData(histo[i]);\n\t\t}\n\t\t\n\t\t/* Set left max index. */\n\t\tint maxIndex = 0;\n\t\tfor (int i = 0; i < histo.length; i++) {\n\t\t\tif (histo[maxIndex] < histo[i]) {\n\t\t\t\tmaxIndex = i;\n\t\t\t}\n\t\t\thistogram[i].setLeftMaxIndex(maxIndex);\n\t\t}\n\t\t\n\t\t/* Set right max index. */\n\t\tmaxIndex = histogram.length - 1;\n\t\tfor (int i = histogram.length - 1; i >= 0; i--) {\n\t\t\tif (histo[maxIndex] < histo[i]) {\n\t\t\t\tmaxIndex = i;\n\t\t\t}\n\t\t\thistogram[i].setRightMaxIndex(maxIndex);\t\t\t\n\t\t}\t\t\n\t\t\n\t\treturn histogram;\n\t}\n\t\n\tpublic static int computeHistogramVolume(int[] histogram) {\n\t\tint start = 0;\n\t\tint end = histogram.length - 1;\n\t\t\n\t\tHistogramData[] data = createHistogramData(histogram);\n\t\t\n\t\tint max = data[0].getRightMaxIndex();\n\t\t\n\t\tint leftVolume =  subgraphVolume(data, start, max, true);\n\t\tint rightVolume = subgraphVolume(data, max, end, false);\n\t\t\n\t\treturn leftVolume + rightVolume;\t\t\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] histogram = {0, 0, 4, 0, 0, 6, 0, 0, 3, 0, 8, 0, 2, 0, 5, 2, 0, 3, 0, 0};\n\t\tint result = computeHistogramVolume(histogram);\n\t\tSystem.out.println(result);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_21_Volume_of_Histogram/QuestionC.java",
    "content": "package Q17_21_Volume_of_Histogram;\n\npublic class QuestionC {\n\n\t/* Go through each bar and compute the volume of water above it. \n\t * Volume of water at a bar =\n\t *   height - min(tallest bar on left, tallest bar on right)\n\t *   [where above equation is positive]\n\t * Compute the left max in the first sweep, then sweep again to \n\t * compute the right max, minimum of the bar heights, and the \n\t * delta. */\n\tpublic static int computeHistogramVolume(int[] histo) {\n\t\t/* Get left max */\n\t\tint[] leftMaxes = new int[histo.length];\n\t\tint leftMax = histo[0];\n\t\tfor (int i = 0; i < histo.length; i++) {\n\t\t\tleftMax = Math.max(leftMax, histo[i]);\n\t\t\tleftMaxes[i] = leftMax;\n\t\t}\n\t\t\n\t\tint sum = 0;\n\t\t\n\t\t/* Get right max */\n\t\tint rightMax = histo[histo.length - 1];\n\t\tfor (int i = histo.length - 1; i >= 0; i--) {\n\t\t\trightMax = Math.max(rightMax, histo[i]);\n\t\t\tint secondTallest = Math.min(rightMax, leftMaxes[i]);\n\t\t\t\n\t\t\t/* If there are taller things on the left and right side, then there is \n\t\t\t * water above this bar. Compute the volume and add to the sum. */\n\t\t\tif (secondTallest > histo[i]) { \n\t\t\t\tsum += secondTallest - histo[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn sum;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] histogram = {0, 0, 4, 0, 0, 6, 0, 0, 3, 0, 8, 0, 2, 0, 5, 2, 0, 3, 0, 0};\n\t\tint result = computeHistogramVolume(histogram);\n\t\tSystem.out.println(result);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_21_Volume_of_Histogram/Tester.java",
    "content": "package Q17_21_Volume_of_Histogram;\n\npublic class Tester {\n\n\t/**\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\tString[][] tests = {{\"6 1 8 1 2 1 5\", \"16\"},\n\t\t\t\t{\"5 1 2 1 8\", \"11\"},\n\t\t\t\t{\"15 12 20 16 17 25\", \"10\"},\n\t\t\t\t{\"28 25 26\", \"1\"},\n\t\t\t\t{\"28 25 28\", \"3\"},\n\t\t\t\t{\"22\", \"0\"},\n\t\t\t\t{\"22 22\", \"0\"},\n\t\t\t\t{\"0 0 4 0 0 6 0 0 3 0 8 0 2 0 5 2 0 3 0 0\", \"46\"}};\n\t\tfor (int i = 0; i < tests.length; i++) {\n\t\t\tString input = tests[i][0];\n\t\t\tString output = tests[i][1];\n\t\t\tString[] inputStringArray = input.split(\" \");\n\t\t\tint[] histogram = new int[inputStringArray.length];\n\t\t\tfor (int j = 0; j < inputStringArray.length; j++) {\n\t\t\t\thistogram[j] = Integer.parseInt(inputStringArray[j]);\n\t\t\t}\n\t\t\tint targetVolume = Integer.parseInt(output);\n\t\t\t\n\t\t\tint volumeA = QuestionA.computeHistogramVolume(histogram);\n\t\t\tint volumeB = QuestionB.computeHistogramVolume(histogram);\n\t\t\tint volumeC = QuestionC.computeHistogramVolume(histogram);\n\t\t\tif (volumeA != targetVolume || volumeB != targetVolume || volumeC != targetVolume) {\n\t\t\t\tSystem.out.println(\"FAILURE: \" + input + \" -> wanted \" + output + \" but got (\" + volumeA + \", \" + volumeB + \", \" + volumeC + \")\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(\"SUCCESS: \" + input + \" -> \" + targetVolume);\n\t\t\t}\t\t\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_22_Word_Transformer/BFSData.java",
    "content": "package Q17_22_Word_Transformer;\n\nimport java.util.HashMap;\nimport java.util.LinkedList;\nimport java.util.Queue;\n\npublic class BFSData {\n\tpublic Queue<PathNode> toVisit = new LinkedList<PathNode>();\n\tpublic HashMap<String, PathNode> visited = new HashMap<String, PathNode>();\n\n\tpublic BFSData(String root) {\n\t\tPathNode sourcePath = new PathNode(root, null);\n\t\ttoVisit.add(sourcePath);\n\t\tvisited.put(root, sourcePath);\t\n\t}\n\t\n\tpublic boolean isFinished() {\n\t\treturn toVisit.isEmpty();\n\t}\n}\n\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_22_Word_Transformer/PathNode.java",
    "content": "package Q17_22_Word_Transformer;\n\nimport java.util.LinkedList;\n\npublic class PathNode {\n\tprivate String word = null;\n\tprivate PathNode previousNode = null;\n\tpublic PathNode(String word, PathNode previous) {\n\t\tthis.word = word;\n\t\tpreviousNode = previous;\n\t}\n\t\n\tpublic String getWord() {\n\t\treturn word;\n\t}\n\t\n\t/* Traverse path and return linked list of nodes. */\n\tpublic LinkedList<String> collapse(boolean startsWithRoot) {\n\t\tLinkedList<String> path = new LinkedList<String>();\n\t\tPathNode node = this;\n\t\twhile (node != null) {\n\t\t\tif (startsWithRoot) {\n\t\t\t\tpath.addLast(node.word);\n\t\t\t} else {\n\t\t\t\tpath.addFirst(node.word);\n\t\t\t}\n\t\t\tnode = node.previousNode;\n\t\t}\n\t\treturn path;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_22_Word_Transformer/QuestionA.java",
    "content": "package Q17_22_Word_Transformer;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashSet;\r\nimport java.util.LinkedList;\r\nimport java.util.Map;\r\nimport java.util.Queue;\r\nimport java.util.Set;\r\nimport java.util.TreeMap;\r\nimport java.util.TreeSet;\r\n\r\npublic class QuestionA {\r\n\r\n\tpublic static ArrayList<String> wordsOneAway(String word) {\r\n\t\tArrayList<String> words = new ArrayList<String>();\r\n\t\tfor (int i = 0; i < word.length(); i++) {\r\n\t\t\tfor (char c = 'a'; c <= 'z'; c++) {\r\n\t\t\t\tString w = word.substring(0, i) + c + word.substring(i + 1);\r\n\t\t\t\twords.add(w);\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\treturn words;\r\n\t}\r\n\t\r\n\tpublic static LinkedList<String> transform(HashSet<String> visited, String startWord, String stopWord, Set<String> dictionary) {\r\n\t\tif (startWord.equals(stopWord)) {\r\n\t\t\tLinkedList<String> path = new LinkedList<String>();\r\n\t\t\tpath.add(startWord);\r\n\t\t\treturn path;\r\n\t\t} else if (visited.contains(startWord) || !dictionary.contains(startWord)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvisited.add(startWord);\r\n\t\tArrayList<String> words = wordsOneAway(startWord);\r\n\t\t\r\n\t\tfor (String word : words) {\r\n\t\t\tLinkedList<String> path = transform(visited, word, stopWord, dictionary);\r\n\t\t\tif (path != null) {\r\n\t\t\t\tpath.addFirst(startWord);\r\n\t\t\t\treturn path;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic static LinkedList<String> transform(String start, String stop, String[] words) {\r\n\t\tHashSet<String> dict = setupDictionary(words);\r\n\t\tHashSet<String> visited = new HashSet<String>();\r\n\t\treturn transform(visited, start, stop, dict);\r\n\t}\r\n\t\r\n\tpublic static HashSet<String> setupDictionary(String[] words) {\r\n\t\tHashSet<String> hash = new HashSet<String>();\r\n\t\tfor (String word : words) {\r\n\t\t\thash.add(word.toLowerCase());\r\n\t\t}\r\n\t\treturn hash;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] words = {\"maps\", \"tan\", \"tree\", \"apple\", \"cans\", \"help\", \"aped\", \"pree\", \"pret\", \"apes\", \"flat\", \"trap\", \"fret\", \"trip\", \"trie\", \"frat\", \"fril\"};\t\t\r\n\t\tLinkedList<String> list = transform(\"tree\", \"flat\", words);\r\n\t\t\r\n\t\tif (list == null) {\r\n\t\t\tSystem.out.println(\"No path.\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(list.toString());\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_22_Word_Transformer/QuestionB.java",
    "content": "package Q17_22_Word_Transformer;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashSet;\r\nimport java.util.LinkedList;\r\nimport java.util.Set;\r\n\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionB {\r\n\t\r\n\t/* find path to transform startWord into endWord. */\r\n\tpublic static LinkedList<String> transform(String start, String stop, String[] words) {\r\n\t\tHashMapList<String, String> wildcardToWordList = createWildcardToWordMap(words);\r\n\t\tHashSet<String> visited = new HashSet<String>();\r\n\t\treturn transform(visited, start, stop, wildcardToWordList);\r\n\t}\r\n\t\r\n\t/* Do a depth-first search from start to stop, traveling through each word that is one edit away. */\r\n\tpublic static LinkedList<String> transform(HashSet<String> visited, String start, String stop, HashMapList<String, String> wildcardToWordList) {\r\n\t\tif (start.equals(stop)) {\r\n\t\t\tLinkedList<String> path = new LinkedList<String>();\r\n\t\t\tpath.add(start);\r\n\t\t\treturn path;\r\n\t\t} else if (visited.contains(start)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvisited.add(start);\r\n\t\tArrayList<String> words = getValidLinkedWords(start, wildcardToWordList);\r\n\t\t\r\n\t\tfor (String word : words) {\r\n\t\t\tLinkedList<String> path = transform(visited, word, stop, wildcardToWordList);\r\n\t\t\tif (path != null) {\r\n\t\t\t\tpath.addFirst(start);\r\n\t\t\t\treturn path;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\t/* Insert words in dictionary into mapping from wildcard form -> word. */\r\n\tpublic static HashMapList<String, String> createWildcardToWordMap(String[] words) {\r\n\t\tHashMapList<String, String> wildcardToWords = new HashMapList<String, String>();\r\n\t\tfor (String word : words) {\r\n\t\t\tArrayList<String> linked = getWildcardRoots(word);\r\n\t\t\tfor (String linkedWord : linked) {\r\n\t\t\t\twildcardToWords.put(linkedWord, word);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn wildcardToWords;\r\n\t}\t\r\n\t\r\n\t/* Get list of wildcards associated with word. */\r\n\tpublic static ArrayList<String> getWildcardRoots(String w) {\r\n\t\tArrayList<String> words = new ArrayList<String>();\r\n\t\tfor (int i = 0; i < w.length(); i++) {\r\n\t\t\tString word = w.substring(0, i) + \"_\" + w.substring(i + 1);\r\n\t\t\twords.add(word);\r\n\t\t}\r\n\t\treturn words;\r\n\t}\t\r\n\t\r\n\r\n\t\r\n\t/* Return words that are one edit away. */\r\n\tpublic static ArrayList<String> getValidLinkedWords(String word, HashMapList<String, String> wildcardToWords) {\r\n\t\tArrayList<String> wildcards = getWildcardRoots(word);\r\n\t\tArrayList<String> linkedWords = new ArrayList<String>();\r\n\t\tfor (String wildcard : wildcards) {\r\n\t\t\tArrayList<String> words = wildcardToWords.get(wildcard);\r\n\t\t\tfor (String linkedWord : words) {\r\n\t\t\t\tif (!linkedWord.equals(word)) {\r\n\t\t\t\t\tlinkedWords.add(linkedWord);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn linkedWords;\r\n\t}\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] words = {\"maps\", \"tan\", \"tree\", \"apple\", \"cans\", \"help\", \"aped\", \"pree\", \"pret\", \"apes\", \"flat\", \"trap\", \"fret\", \"trip\", \"trie\", \"frat\", \"fril\"};\t\t\r\n\t\tLinkedList<String> list = transform(\"tree\", \"flat\", words);\r\n\t\t\r\n\t\tif (list == null) {\r\n\t\t\tSystem.out.println(\"No path.\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(list.toString());\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_22_Word_Transformer/QuestionC.java",
    "content": "package Q17_22_Word_Transformer;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashSet;\r\nimport java.util.LinkedList;\r\n\r\nimport CtCILibrary.HashMapList;\r\n\r\npublic class QuestionC {\r\n\t\r\n\tpublic static LinkedList<String> transform(String startWord, String stopWord, String[] words) {\r\n\t\tHashMapList<String, String> wildcardToWordList = getWildcardToWordList(words);\r\n\t\t\r\n\t\tBFSData sourceData = new BFSData(startWord);\r\n\t\tBFSData destData = new BFSData(stopWord);\r\n\t\t\r\n\t\twhile (!sourceData.isFinished() && !destData.isFinished()) {\r\n\t\t\t/* Search out from source. */\r\n\t\t\tString collision = searchLevel(wildcardToWordList, sourceData, destData);\r\n\t\t\tif (collision != null) {\r\n\t\t\t\treturn mergePaths(sourceData, destData, collision);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/* Search out from destination. */\r\n\t\t\tcollision = searchLevel(wildcardToWordList, destData, sourceData);\r\n\t\t\tif (collision != null) {\r\n\t\t\t\treturn mergePaths(sourceData, destData, collision);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\t/* Search one level and return collision, if any. */\r\n\tpublic static String searchLevel(HashMapList<String, String> wildcardToWordList, BFSData primary, BFSData secondary) {\r\n\t\t/* We only want to search one level at a time. Count how many nodes are currently in the primary's\r\n\t\t * level and only do that many nodes. We'll continue to add nodes to the end. */\r\n\t\tint count = primary.toVisit.size(); \r\n\t\tfor (int i = 0; i < count; i++) {\r\n\t\t\t/* Pull out first node. */\r\n\t\t\tPathNode pathNode = primary.toVisit.poll();\r\n\t\t\tString word = pathNode.getWord();\r\n\t\t\t\r\n\t\t\t/* Check if it's already been visited. */\r\n\t\t\tif (secondary.visited.containsKey(word)) {\r\n\t\t\t\treturn pathNode.getWord();\r\n\t\t\t}\t\t\t\t\r\n\t\t\t\r\n\t\t\t/* Add friends to queue. */\r\n\t\t\tArrayList<String> words = getValidLinkedWords(word, wildcardToWordList);\r\n\t\t\tfor (String w : words) {\r\n\t\t\t\tif (!primary.visited.containsKey(w)) {\r\n\t\t\t\t\tPathNode next = new PathNode(w, pathNode);\r\n\t\t\t\t\tprimary.visited.put(w, next);\r\n\t\t\t\t\tprimary.toVisit.add(next);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic static LinkedList<String> mergePaths(BFSData bfs1, BFSData bfs2, String connection) {\r\n\t\tPathNode end1 = bfs1.visited.get(connection); // end1 -> source\r\n\t\tPathNode end2 = bfs2.visited.get(connection); // end2 -> dest\r\n\t\tLinkedList<String> pathOne = end1.collapse(false); // forward: source -> connection\r\n\t\tLinkedList<String> pathTwo = end2.collapse(true); // reverse: connection -> dest\r\n\t\tpathTwo.removeFirst(); // remove connection\r\n\t\tpathOne.addAll(pathTwo); // add second path\r\n\t\treturn pathOne;\r\n\t}\r\n\t\r\n\tpublic static ArrayList<String> getWildcardRoots(String word) {\r\n\t\tArrayList<String> words = new ArrayList<String>();\r\n\t\tfor (int i = 0; i < word.length(); i++) {\r\n\t\t\tString w = word.substring(0, i) + \"_\" + word.substring(i + 1);\r\n\t\t\twords.add(w);\r\n\t\t}\r\n\t\treturn words;\r\n\t}\t\r\n\t\r\n\tpublic static HashMapList<String, String> getWildcardToWordList(String[] words) {\r\n\t\tHashMapList<String, String> wildcardToWords = new HashMapList<String, String>();\r\n\t\tfor (String word : words) {\r\n\t\t\tArrayList<String> linked = getWildcardRoots(word);\r\n\t\t\tfor (String linkedWord : linked) {\r\n\t\t\t\twildcardToWords.put(linkedWord, word);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn wildcardToWords;\r\n\t}\r\n\t\r\n\tpublic static ArrayList<String> getValidLinkedWords(String word, HashMapList<String, String> wildcardToWords) {\r\n\t\tArrayList<String> wildcards = getWildcardRoots(word);\r\n\t\tArrayList<String> linkedWords = new ArrayList<String>();\r\n\t\tfor (String wildcard : wildcards) {\r\n\t\t\tArrayList<String> words = wildcardToWords.get(wildcard);\r\n\t\t\tfor (String linkedWord : words) {\r\n\t\t\t\tif (!linkedWord.equals(word)) {\r\n\t\t\t\t\tlinkedWords.add(linkedWord);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn linkedWords;\r\n\t}\t\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tString[] words = {\"maps\", \"tan\", \"tree\", \"apple\", \"cans\", \"help\", \"aped\", \"pree\", \"pret\", \"apes\", \"flat\", \"trap\", \"fret\", \"trip\", \"trie\", \"frat\", \"fril\"};\t\t\r\n\t\tLinkedList<String> list = transform(\"tree\", \"flat\", words);\r\n\t\t\r\n\t\tif (list == null) {\r\n\t\t\tSystem.out.println(\"No path.\");\r\n\t\t} else {\r\n\t\t\tSystem.out.println(list.toString());\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_22_Word_Transformer/Tester.java",
    "content": "package Q17_22_Word_Transformer;\n\nimport java.util.LinkedList;\n\npublic class Tester {\n\n\tpublic static void printList(LinkedList<String> list) {\n\t\tif (list == null) {\n\t\t\tSystem.out.println(\"No path.\");\n\t\t} else {\n\t\t\tSystem.out.println(list.toString());\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tString[] words = {\"maps\", \"tan\", \"tree\", \"apple\", \"cans\", \"help\", \"aped\", \"pree\", \"pret\", \"apes\", \"flat\", \"trap\", \"fret\", \"trip\", \"trie\", \"frat\", \"fril\"};\t\t\n\t\tLinkedList<String> listA = QuestionA.transform(\"tree\", \"flat\", words);\n\t\tLinkedList<String> listB = QuestionB.transform(\"tree\", \"flat\", words);\n\t\tLinkedList<String> listC = QuestionC.transform(\"tree\", \"flat\", words);\n\t\tprintList(listA);\n\t\tprintList(listB);\n\t\tprintList(listC);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_23_Max_Black_Square/Question.java",
    "content": "package Q17_23_Max_Black_Square;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class Question {\t\r\n\tpublic static Subsquare findSquareWithSize(int[][] matrix, int squareSize) {\r\n\t\t// On an edge of length N, there are (N - sz + 1) squares of length sz.\r\n\t\tint count = matrix.length - squareSize + 1; \r\n\t\t\r\n\t\t// Iterate through all squares with side length square_size.\r\n\t\tfor (int row = 0; row < count; row++) {\r\n\t\t\tfor (int col = 0; col < count; col++) {\r\n\t\t\t\tif (isSquare(matrix, row, col, squareSize)) {\r\n\t\t\t\t\treturn new Subsquare(row, col, squareSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic static Subsquare findSquare(int[][] matrix){\r\n\t\tassert(matrix.length > 0);\r\n\t\tfor (int row = 0; row < matrix.length; row++){\r\n\t\t\tassert(matrix[row].length == matrix.length);\r\n\t\t}\r\n\t\t\r\n\t\tint N = matrix.length;\r\n\t\t\r\n\t\tfor (int i = N; i >= 1; i--) {\r\n\t\t\tSubsquare square = findSquareWithSize(matrix, i);\r\n\t\t\tif (square != null) {\r\n\t\t\t\treturn square;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\t\r\n\r\n\tprivate static boolean isSquare(int[][] matrix, int row, int col, int size) {\r\n\t\t// Check top and bottom border.\r\n\t\tfor (int j = 0; j < size; j++){\r\n\t\t\tif (matrix[row][col+j] == 1) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (matrix[row+size-1][col+j] == 1) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Check left and right border.\r\n\t\tfor (int i = 1; i < size - 1; i++) {\r\n\t\t\tif (matrix[row+i][col] == 1){\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (matrix[row+i][col+size-1] == 1) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(7, 7, 0, 1);\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\tSubsquare square = findSquare(matrix);\r\n\t\tsquare.print();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_23_Max_Black_Square/QuestionEff.java",
    "content": "package Q17_23_Max_Black_Square;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionEff {\r\n\tpublic static Subsquare findSquareWithSize(SquareCell[][] processed, int square_size) {\r\n\t\t// On an edge of length N, there are (N - sz + 1) squares of length sz.\r\n\t\tint count = processed.length - square_size + 1; \r\n\t\t\r\n\t\t// Iterate through all squares with side length square_size.\r\n\t\tfor (int row = 0; row < count; row++) {\r\n\t\t\tfor (int col = 0; col < count; col++) {\r\n\t\t\t\tif (isSquare(processed, row, col, square_size)) {\r\n\t\t\t\t\treturn new Subsquare(row, col, square_size);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tpublic static Subsquare findSquare(int[][] matrix){\r\n\t\tassert(matrix.length > 0);\r\n\t\tfor (int row = 0; row < matrix.length; row++){\r\n\t\t\tassert(matrix[row].length == matrix.length);\r\n\t\t}\r\n\t\t\r\n\t\tSquareCell[][] processed = processSquare(matrix);\r\n\t\t\r\n\t\tint N = matrix.length;\r\n\t\t\r\n\t\tfor (int i = N; i >= 1; i--) {\r\n\t\t\tSubsquare square = findSquareWithSize(processed, i);\r\n\t\t\tif (square != null) {\r\n\t\t\t\treturn square;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\t\r\n\r\n\tprivate static boolean isSquare(SquareCell[][] matrix, int row, int col, int size) {\r\n\t\tSquareCell topLeft = matrix[row][col];\r\n\t\tSquareCell topRight = matrix[row][col + size - 1];\r\n\t\tSquareCell bottomRight = matrix[row + size - 1][col];\r\n\t\tif (topLeft.zerosRight < size) { // Check top edge\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (topLeft.zerosBelow < size) { // Check left edge\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (topRight.zerosBelow < size) { // Check right edge\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (bottomRight.zerosRight < size) { // Check bottom edge\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic static SquareCell[][] processSquare(int[][] matrix) {\r\n\t\tSquareCell[][] processed = new SquareCell[matrix.length][matrix.length];\r\n\t\t\r\n\t\tfor (int r = matrix.length - 1; r >= 0; r--) {\r\n\t\t\tfor (int c = matrix.length - 1; c >= 0; c--) {\r\n\t\t\t\tint rightZeros = 0;\r\n\t\t\t\tint belowZeros = 0;\r\n\t\t\t\tif (matrix[r][c] == 0) { // only need to process if it's a black cell\r\n\t\t\t\t\trightZeros++;\r\n\t\t\t\t\tbelowZeros++;\r\n\t\t\t\t\tif (c + 1 < matrix.length) { // next column over is on same row\r\n\t\t\t\t\t\tSquareCell previous = processed[r][c + 1];\r\n\t\t\t\t\t\trightZeros += previous.zerosRight;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (r + 1 < matrix.length) {\r\n\t\t\t\t\t\tSquareCell previous = processed[r + 1][c];\r\n\t\t\t\t\t\tbelowZeros += previous.zerosBelow;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tprocessed[r][c] = new SquareCell(rightZeros, belowZeros);\r\n\t\t\t}\r\n\t\t}\t\r\n\t\treturn processed;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(7, 7, 0, 1);\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\tSubsquare square = findSquare(matrix);\r\n\t\tsquare.print();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_23_Max_Black_Square/SquareCell.java",
    "content": "package Q17_23_Max_Black_Square;\r\n\r\npublic class SquareCell {\r\n\tpublic int zerosRight = 0;\r\n\tpublic int zerosBelow = 0;\r\n\tpublic SquareCell(int right, int below) {\r\n\t\tzerosRight = right;\r\n\t\tzerosBelow = below;\r\n\t}\r\n\t\r\n\tpublic void setZerosRight(int right) {\r\n\t\tzerosRight = right;\r\n\t}\r\n\t\r\n\tpublic void setZerosBelow(int below) {\r\n\t\tzerosBelow = below;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_23_Max_Black_Square/Subsquare.java",
    "content": "package Q17_23_Max_Black_Square;\r\n\r\npublic class Subsquare {\r\n\tpublic int row, column, size;\r\n\tpublic Subsquare(int r, int c, int sz) {\r\n\t\trow = r;\r\n\t\tcolumn = c;\r\n\t\tsize = sz;\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tSystem.out.println(\"(\" + row + \", \" + column + \", \" + size + \")\");\r\n\t}\r\n}"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_24_Max_Submatrix/QuestionA.java",
    "content": "package Q17_24_Max_Submatrix;\r\n\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionA {\r\n\tpublic static SubMatrix getMaxMatrix(int[][] matrix) {\r\n\t\tint rowCount = matrix.length;\r\n\t\tint columnCount = matrix[0].length;\r\n\t\tSubMatrix best = null;\r\n\t\tfor (int row1 = 0; row1 < rowCount; row1++) {\r\n\t\t\tfor (int row2 = row1; row2 < rowCount; row2++) {\r\n\t\t\t\tfor (int col1 = 0; col1 < columnCount; col1++) {\r\n\t\t\t\t\tfor (int col2 = col1; col2 < columnCount; col2++) {\r\n\t\t\t\t\t\tint sum = sum(matrix, row1, col1, row2, col2);\r\n\t\t\t\t\t\tif (best == null || best.getSum() < sum) {\r\n\t\t\t\t\t\t\tbest = new SubMatrix(row1, col1, row2, col2, sum);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn best;\r\n\t}\r\n\t\r\n\tprivate static int sum(int[][] matrix, int row1, int col1, int row2, int col2) {\r\n\t\tint sum = 0;\r\n\t\tfor (int r = row1; r <= row2; r++) {\r\n\t\t\tfor (int c = col1; c <= col2; c++) {\r\n\t\t\t\tsum += matrix[r][c];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sum;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(10, 10, -5, 5);\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\tSubMatrix sub = getMaxMatrix(matrix);\r\n\t\tSystem.out.println(sub.toString());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_24_Max_Submatrix/QuestionB.java",
    "content": "package Q17_24_Max_Submatrix;\r\n\r\nimport CtCILibrary.*;\r\n\r\npublic class QuestionB {\r\n\tpublic static SubMatrix getMaxMatrix(int[][] matrix) {\r\n\t\tSubMatrix best = null;\r\n\t\tint rowCount = matrix.length;\r\n\t\tint columnCount = matrix[0].length;\r\n\t\tint[][] sumThrough = precomputeSums(matrix);\r\n\t\t\r\n\t\tfor (int row1 = 0; row1 < rowCount; row1++) {\r\n\t\t\tfor (int row2 = row1; row2 < rowCount; row2++) {\r\n\t\t\t\tfor (int col1 = 0; col1 < columnCount; col1++) {\r\n\t\t\t\t\tfor (int col2 = col1; col2 < columnCount; col2++) {\r\n\t\t\t\t\t\tint sum = sum(sumThrough, row1, col1, row2, col2);\r\n\t\t\t\t\t\tif (best == null || best.getSum() < sum) {\r\n\t\t\t\t\t\t\tbest = new SubMatrix(row1, col1, row2, col2, sum);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn best;\r\n\t}\r\n\t\t\r\n\tprivate static int[][] precomputeSums(int[][] matrix) {\r\n\t\tint[][] sumThrough = new int[matrix.length][matrix[0].length];\r\n\t\tfor (int r = 0; r < matrix.length; r++) {\r\n\t\t\tfor (int c = 0; c < matrix[0].length; c++) {\r\n\t\t\t\tint left = c > 0 ? sumThrough[r][c - 1] : 0;\r\n\t\t\t\tint top = r > 0 ? sumThrough[r - 1][c] : 0;\r\n\t\t\t\tint overlap = r > 0 && c > 0 ? sumThrough[r - 1][c - 1] : 0;\r\n\t\t\t\tsumThrough[r][c] = left + top - overlap + matrix[r][c];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn sumThrough;\r\n\t}\r\n\t\r\n\tprivate static int sum(int[][] sumThrough, int r1, int c1, int r2, int c2) {\r\n\t\tint topAndLeft = r1 > 0 && c1 > 0 ? sumThrough[r1 - 1][c1 - 1] : 0;\r\n\t\tint left = c1 > 0 ? sumThrough[r2][c1 - 1] : 0;\r\n\t\tint top = r1 > 0 ? sumThrough[r1 - 1][c2] : 0;\r\n\t\tint full = sumThrough[r2][c2];\r\n\t\treturn full - left - top + topAndLeft;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(10, 10, -5, 5);\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\tSystem.out.println(getMaxMatrix(matrix));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_24_Max_Submatrix/QuestionC.java",
    "content": "package Q17_24_Max_Submatrix;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class QuestionC {\t\r\n\tpublic static SubMatrix getMaxMatrix(int[][] matrix) {\r\n\t\tint rowCount = matrix.length;\r\n\t\tint colCount = matrix[0].length;\r\n\t\r\n\t\tSubMatrix best = null;\r\n\t\r\n\t\tfor (int rowStart = 0; rowStart < rowCount; rowStart++) {\r\n\t\t\tint[] partialSum = new int[colCount];\r\n\t\t\r\n\t\t\tfor (int rowEnd = rowStart; rowEnd < rowCount; rowEnd++) {\r\n\t\t\t\t/* Add values at row rowEnd. */\r\n\t\t\t\tfor (int i = 0; i < colCount; i++) {\r\n\t\t\t\t\tpartialSum[i] += matrix[rowEnd][i];\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\t\tRange bestRange = maxSubArray(partialSum, colCount);\r\n\t\t\t\tif (best == null || best.getSum() < bestRange.sum) {\r\n\t\t\t\t\tbest = new SubMatrix(rowStart, bestRange.start, rowEnd, bestRange.end, bestRange.sum);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn best;\r\n\t}\r\n\r\n\tpublic static Range maxSubArray(int[] array, int N) {\r\n\t\tRange best = null;\r\n\t\tint start = 0;\r\n\t\tint sum = 0;\r\n\r\n\t\tfor (int i = 0; i < N; i++) {\r\n\t\t\tsum += array[i];\r\n\t\t\tif (best == null || sum > best.sum) {\r\n\t\t\t\tbest = new Range(start, i, sum);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/* If running_sum is < 0 no point in trying to continue the \r\n\t\t\t * series. Reset. */\r\n\t\t\tif (sum < 0) {\r\n\t\t\t\tstart = i + 1;\r\n\t\t\t\tsum = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn best;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[][] matrix = AssortedMethods.randomMatrix(10, 10, -5, 5);\r\n\t\tAssortedMethods.printMatrix(matrix);\r\n\t\tSystem.out.println(getMaxMatrix(matrix));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_24_Max_Submatrix/Range.java",
    "content": "package Q17_24_Max_Submatrix;\n\npublic class Range {\n\tpublic int start, end, sum;\n\tpublic Range(int start, int end, int sum) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.sum = sum;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_24_Max_Submatrix/SubMatrix.java",
    "content": "package Q17_24_Max_Submatrix;\n\npublic class SubMatrix {\n\tprivate int row1, row2, col1, col2, sum;\n\tpublic SubMatrix(int r1, int c1, int r2, int c2, int sm) {\n\t\trow1 = r1;\n\t\tcol1 = c1;\n\t\trow2 = r2;\n\t\tcol2 = c2;\n\t\tsum = sm;\n\t}\n\t\n\tpublic int getSum() {\n\t\treturn sum;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn \"[(\" + row1 + \",\" + col1 + \") -> (\" + row2 + \",\" + col2 + \") = \" + sum + \"]\";\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_24_Max_Submatrix/Tester.java",
    "content": "package Q17_24_Max_Submatrix;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class Tester {\n\n\tpublic static void main(String[] args) {\n\t\tint[][] matrix = AssortedMethods.randomMatrix(10, 10, -5, 5);\n\t\tAssortedMethods.printMatrix(matrix);\n\t\tSubMatrix subA = QuestionA.getMaxMatrix(matrix);\n\t\tSystem.out.println(subA.toString());\n\t\t\n\t\tSubMatrix subB = QuestionB.getMaxMatrix(matrix);\n\t\tSystem.out.println(subB.toString());\n\t\t\n\t\tSubMatrix subC = QuestionC.getMaxMatrix(matrix);\n\t\tSystem.out.println(subC.toString());\t\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_25_Word_Rectangle/Question.java",
    "content": "package Q17_25_Word_Rectangle;\r\n\r\nimport java.util.ArrayList;\r\nimport CtCILibrary.AssortedMethods;\r\nimport CtCILibrary.Trie;\r\n\r\npublic class Question {\r\n\tprivate int maxWordLength;\r\n\tprivate WordGroup[] groupList ;\r\n\tprivate Trie trieList[];\r\n\r\n\tpublic Question(String[] list) {\r\n\t\tgroupList = WordGroup.createWordGroups(list);\r\n\t\tmaxWordLength = groupList.length;\r\n\t\t// Initialize trieList to store trie of groupList[i] at ith position.\r\n\t\ttrieList = new Trie[maxWordLength];\r\n\t}\r\n\r\n\t/* This function finds a rectangle of letters of the largest \r\n\t * possible area (length x breadth) such that every row forms a \r\n\t * word (reading left to right) from the list and every column \r\n\t * forms a word (reading top to bottom) from the list. \r\n\t */\r\n\tpublic Rectangle maxRectangle() {\r\n\t\t// The dimensions of the largest possible rectangle.\r\n\t\tint maxSize = maxWordLength * maxWordLength; \r\n\r\n\t\tfor (int z = maxSize; z > 0; z--) {\r\n\t\t\t// Find out all pairs i,j less than maxWordLength \r\n\t\t\t// such that i * j = z\r\n\t\t\tfor (int i = 1; i <= maxWordLength; i ++ ) {\r\n\t\t\t\tif (z % i == 0) {\r\n\t\t\t\t\tint j = z / i;\r\n\t\t\t\t\tif (j <= maxWordLength) {\r\n\t\t\t\t\t\t// Check if a Rectangle of length i and height \r\n\t\t\t\t\t\t// j can be created. \r\n\t\t\t\t\t\tRectangle rectangle = makeRectangle(i,j);\r\n\t\t\t\t\t\tif (rectangle != null) {\r\n\t\t\t\t\t\t\treturn rectangle;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/* This function takes the length and height of a rectangle as\r\n\t * arguments. It tries to form a rectangle of the given length and \r\n\t * height using words of the specified length as its rows, in which \r\n\t * words whose length is the specified height form the columns. It \r\n\t * returns the rectangle so formed, and null if such a rectangle \r\n\t * cannot be formed.\r\n\t */\r\n\tprivate Rectangle makeRectangle(int length, int height) {\r\n\t\tif (groupList[length - 1] == null || groupList[height - 1] == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (trieList[height - 1] == null) {\r\n\t\t\tArrayList<String> words = groupList[height - 1].getWords();\r\n\t\t\ttrieList[height - 1] = new Trie(words); \r\n\t\t}\r\n\t\treturn makePartialRectangle(length, height, new Rectangle(length));\r\n\t}\r\n\r\n\r\n\t/* This function recursively tries to form a rectangle with words\r\n\t * of length l from the dictionary as rows and words of length h\r\n\t * from the dictionary as columns. To do so, we start with an empty\r\n\t * rectangle and add in a word with length l as the first row. We\r\n\t * then check the trie of words of length h to see if each partial\r\n\t * column is a prefix of a word with length h. If so we branch\r\n\t * recursively and check the next word till we've formed a complete\r\n\t * rectangle. When we have a complete rectangle check if every\r\n\t * column is a word in the dictionary.\r\n\t */\r\n\tprivate Rectangle makePartialRectangle(int l, int h, Rectangle rectangle) {\r\n\r\n\t\t// Check if we have formed a complete rectangle by seeing if each column\r\n\t\t// is in the dictionary\r\n\t\tif (rectangle.height == h) {\r\n\t\t\tif (rectangle.isComplete(l, h, groupList[h - 1])) {\r\n\t\t\t\treturn rectangle;\r\n\t\t\t} else {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the rectangle is not empty, validate that each column is a\r\n\t\t// substring of a word of length h in the dictionary using the\r\n\t\t// trie of words of length h.\r\n\t\tif (!rectangle.isPartialOK(l, trieList[h - 1])) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\t// For each word of length l, try to make a new rectangle by adding\r\n\t\t// the word to the existing rectangle.\r\n\t\tfor (int i = 0; i < groupList[l-1].length(); i++) {\r\n\t\t\tRectangle orgPlus = rectangle.append(groupList[l-1].getWord(i));\r\n\t\t\tRectangle rect = makePartialRectangle(l, h, orgPlus);\r\n\t\t\tif (rect != null) {\r\n\t\t\t\treturn rect;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Test harness.\r\n\tpublic static void main(String[] args) {\r\n\t\tQuestion dict = new Question(AssortedMethods.getListOfWords());\r\n\t\tRectangle rect = dict.maxRectangle();\r\n\t\tif (rect != null) {\r\n\t\t\trect.print();\r\n\t\t} else {\r\n\t\t\tSystem.out.println (\"No rectangle exists\");\r\n\t\t}\r\n\t}\r\n\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_25_Word_Rectangle/Rectangle.java",
    "content": "package Q17_25_Word_Rectangle;\r\n\r\nimport CtCILibrary.Trie;\r\n\r\n/* A class that represents a rectangular array of letters. */\r\npublic class Rectangle {\r\n    \r\n    // Rectangle data.\r\n    public int height;\r\n    public int length; \r\n    public char [][] matrix;\r\n\r\n    public Rectangle(int len) {\r\n        this.length = len;\r\n    }\r\n\r\n    /* Construct a rectangular array of letters of the specified length\r\n     * and height, and backed by the specified matrix of letters. (It is\r\n     * assumed that the length and height specified as arguments are \r\n     * consistent with the array argument's dimensions.)\r\n     */\r\n    public Rectangle(int length, int height, char[][] letters) {\r\n        this.height = letters.length;\r\n        this.length = letters[0].length;\r\n        matrix = letters;\r\n    }\r\n\r\n    /* Return the letter present at the specified location in the array.\r\n     */\r\n    public char getLetter (int i, int j) {\r\n        return matrix[i][j];\r\n    }\r\n    \r\n    public String getColumn(int i) {\r\n\t\tchar[] column = new char[height];\r\n\t\tfor (int j = 0; j < height; j++) {\r\n\t\t\tcolumn[j] = getLetter(j, i);\r\n\t\t}\r\n\t\treturn new String(column);\r\n    }\r\n    \r\n    public boolean isComplete(int l, int h, WordGroup groupList) {\r\n\t\t// Check if we have formed a complete rectangle.\r\n\t\tif (height == h) {\r\n\t\t\t// Check if each column is a word in the dictionary.\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tString col = getColumn(i);\r\n\t\t\t\tif (!groupList.containsWord(col)) {\r\n\t\t\t\t\treturn false; // Invalid rectangle.\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true; // Valid Rectangle!\r\n\t\t}\r\n\t\treturn false;\r\n    }\r\n    \r\n    public boolean isPartialOK(int l, Trie trie) {\r\n    \tif (height == 0) {\r\n    \t\treturn true;\r\n    \t}\r\n\t\tfor (int i = 0; i < l ; i++ ) {\r\n\t\t\tString col = getColumn(i);\r\n\t\t\tif (!trie.contains(col)) {\r\n\t\t\t\treturn false; // Invalid rectangle.\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n    }\r\n\r\n    /* If the length of the argument s is consistent with that of this\r\n     * Rectangle object, then return a Rectangle whose matrix is constructed by\r\n     * appending s to the underlying matrix. Otherwise, return null. The\r\n     * underlying matrix of this Rectangle object is /not/ modified.\r\n     */\r\n    public Rectangle append(String s) {\r\n        if (s.length() == length) {\r\n            char temp[][] = new char[height + 1][length];\r\n            for (int i = 0; i < height; i++) {\r\n                for (int j = 0; j < length; j++) {\r\n                    temp[i][j] = matrix[i][j];\r\n                }\r\n            }\r\n            s.getChars(0, length, temp[height], 0);\r\n\r\n            return new Rectangle(length, height + 1, temp);\r\n        }\r\n        return null;\r\n    }\r\n\r\n    /* Print the rectangle out, row by row. */\r\n    public void print() {\r\n        for (int i = 0; i < height ; i++) {\r\n            for (int j = 0; j < length; j++) {\r\n                System.out.print(matrix[i][j]);\r\n            }\r\n            System.out.println(\" \");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_25_Word_Rectangle/WordGroup.java",
    "content": "package Q17_25_Word_Rectangle;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\n/* A container for a group of words of the same length. */\r\npublic class WordGroup {\r\n\tprivate HashMap<String, Boolean> lookup = new HashMap<String, Boolean>();\r\n    private ArrayList<String> group = new ArrayList<String>();\r\n    \r\n    public WordGroup() {\r\n\r\n    }\r\n    \r\n    public boolean containsWord(String s) {\r\n    \treturn lookup.containsKey(s);\r\n    }\r\n    \r\n    public void addWord (String s) {\r\n        group.add(s);\r\n        lookup.put(s, true);\r\n    }\r\n    \r\n    public int length() {\r\n        return group.size();\r\n    }\r\n    \r\n    public String getWord(int i) {\r\n        return group.get(i);\r\n    }\r\n    \r\n    public ArrayList<String> getWords(){ \r\n        return group;\r\n    }\r\n    \r\n    public static WordGroup[] createWordGroups(String[] list) {\r\n    \tWordGroup[] groupList;\r\n    \tint maxWordLength = 0;\r\n\t\t// Find out the length of the longest word\r\n\t\tfor (int i = 0; i < list.length; i++) {\r\n\t\t\tif (list[i].length() > maxWordLength) {\r\n\t\t\t\tmaxWordLength = list[i].length();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/* Group the words in the dictionary into lists of words of \r\n\t\t * same length.groupList[i] will contain a list of words, each \r\n\t\t * of length (i+1). */\r\n\t\tgroupList = new WordGroup[maxWordLength];\r\n\t\tfor (int i = 0; i < list.length; i++) {\r\n\t\t\t/* We do wordLength - 1 instead of just wordLength since this is used as\r\n\t\t\t * an index and no words are of length 0 */\r\n\t\t\tint wordLength = list[i].length() - 1; \r\n\t\t\tif (groupList[wordLength] == null) {\r\n\t\t\t\tgroupList[wordLength] = new WordGroup();\r\n\t\t\t}\r\n\t\t\tgroupList[wordLength].addWord(list[i]);\r\n\t\t}\r\n\t\treturn groupList;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_26_Sparse_Similarity/DocPair.java",
    "content": "package Q17_26_Sparse_Similarity;\n\npublic class DocPair {\n\tpublic int doc1;\n\tpublic int doc2;\n\t\n\tpublic DocPair(int d1, int d2) {\n\t\tdoc1 = d1;\n\t\tdoc2 = d2;\n\t}\n\t\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (o instanceof DocPair) { \n\t\t\tDocPair p = (DocPair) o;\n\t\t\treturn p.doc1 == doc1 && p.doc2 == doc2;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic int hashCode() {\n\t\treturn (doc1 * 31) ^ doc2;\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_26_Sparse_Similarity/Document.java",
    "content": "package Q17_26_Sparse_Similarity;\n\nimport java.util.ArrayList;\n\npublic class Document {\n\tprivate ArrayList<Integer> words;\n\tprivate int docId;\n\t\n\tpublic Document(int id, ArrayList<Integer> w) {\n\t\tdocId = id;\n\t\twords = w;\n\t}\n\t\n\tpublic ArrayList<Integer> getWords() {\n\t\treturn words;\n\t}\n\t\n\tpublic int getId() {\n\t\treturn docId;\n\t}\n\t\n\tpublic int size() {\n\t\treturn words == null ? 0 : words.size();\n\t}\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_26_Sparse_Similarity/QuestionA.java",
    "content": "package Q17_26_Sparse_Similarity;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map.Entry;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionA {\n\tpublic static HashMap<DocPair, Double> computeSimilarities(HashMap<Integer, Document> documents) {\n\t\tArrayList<Document> docs = new ArrayList<Document>();\n\t\tfor (Document doc : documents.values()) {\n\t\t\tdocs.add(doc);\n\t\t}\n\t\treturn computeSimilarities(docs);\n\t}\n\t\n\tpublic static HashMap<DocPair, Double> computeSimilarities(ArrayList<Document> documents) {\n\t\tHashMap<DocPair, Double> similarities = new HashMap<DocPair, Double>();\n\t\tfor (int i = 0; i < documents.size(); i++) {\n\t\t\tfor (int j = i + 1; j < documents.size(); j++) {\n\t\t\t\tDocument doc1 = documents.get(i);\n\t\t\t\tDocument doc2 = documents.get(j);\n\t\t\t\tdouble sim = computeSimilarity(doc1, doc2);\n\t\t\t\tif (sim > 0) {\n\t\t\t\t\tDocPair pair = new DocPair(doc1.getId(), doc2.getId());\n\t\t\t\t\tsimilarities.put(pair, sim);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn similarities;\n\t}\n\t\t\n\tpublic static double computeSimilarity(Document doc1, Document doc2) {\n\t\tint intersection = 0;\n\t\tHashSet<Integer> set1 = new HashSet<Integer>();\n\t\tset1.addAll(doc1.getWords());\n\t\t\n\t\tfor (int word : doc2.getWords()) {\n\t\t\tif (set1.contains(word)) {\n\t\t\t\tintersection++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tdouble union = doc1.size() + doc2.size() - intersection;\n\t\t\n\t\treturn intersection / union;\n\t}\t\n\t\n\tpublic static ArrayList<Integer> removeDups(int[] array) {\n\t\tHashSet<Integer> set = new HashSet<Integer>();\n\t\tfor (int a : array) {\n\t\t\tset.add(a);\n\t\t}\n\t\tArrayList<Integer> list = new ArrayList<Integer>();\n\t\tlist.addAll(set);\n\t\treturn list;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint numDocuments = 10;\n\t\tint docSize = 5;\n\t\tHashMap<Integer, Document> documents = new HashMap<Integer, Document>();\n\t\tfor (int i = 0; i < numDocuments; i++) {\n\t\t\tint[] words = AssortedMethods.randomArray(docSize, 0, 10);\n\t\t\tArrayList<Integer> w = Tester.removeDups(words);\n\t\t\tSystem.out.println(i + \": \" + w.toString());\n\t\t\tDocument doc = new Document(i, w);\n\t\t\tdocuments.put(i, doc);\n\t\t}\n\t\t\n\t\tHashMap<DocPair, Double> similarities = computeSimilarities(documents);\n\t\tTester.printSim(similarities);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_26_Sparse_Similarity/QuestionB.java",
    "content": "package Q17_26_Sparse_Similarity;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map.Entry;\nimport java.util.Set;\n\nimport CtCILibrary.AssortedMethods;\nimport CtCILibrary.HashMapList;\n\npublic class QuestionB {\n\tpublic static HashMap<DocPair, Double> computeSimilarities(HashMap<Integer, Document> documents) {\n\t\tHashMapList<Integer, Integer> wordToDocs = groupWords(documents);\n\t\tHashMap<DocPair, Double> similarities = computeIntersections(wordToDocs);\n\t\tadjustToSimilarities(documents, similarities);\n\t\treturn similarities;\n\t}\t\n\t\n\t/* Create hash table from each word to where it appears. */\n\tpublic static HashMapList<Integer, Integer> groupWords(HashMap<Integer, Document> documents) {\n\t\tHashMapList<Integer, Integer> wordToDocs = new HashMapList<Integer, Integer>();\n\n\t\tfor (Document doc : documents.values()) {\n\t\t\tArrayList<Integer> words = doc.getWords();\n\t\t\tfor (int word : words) {\n\t\t\t\twordToDocs.put(word, doc.getId());\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn wordToDocs;\n\t}\n\t\n\t/* Compute intersections of documents. Iterate through each list of \n\t * documents and then each pair within that list, incrementing the \n\t * intersection of each page. */\n\tpublic static HashMap<DocPair, Double> computeIntersections(HashMapList<Integer, Integer> wordToDocs) {\n\t\tHashMap<DocPair, Double> similarities = new HashMap<DocPair, Double>();\n\t\tSet<Integer> words = wordToDocs.keySet();\n\t\tfor (int word : words) {\n\t\t\tArrayList<Integer> docs = wordToDocs.get(word);\n\t\t\tCollections.sort(docs);\n\t\t\tfor (int i = 0; i < docs.size(); i++) {\n\t\t\t\tfor (int j = i + 1; j < docs.size(); j++) {\n\t\t\t\t\tincrement(similarities, docs.get(i), docs.get(j));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn similarities;\n\t}\n\t\n\t/* Increment the intersection size of each document pair. */\n\tpublic static void increment(HashMap<DocPair, Double> similarities, int doc1, int doc2) {\n\t\tDocPair pair = new DocPair(doc1, doc2);\n\t\tif (!similarities.containsKey(pair)) {\n\t\t\tsimilarities.put(pair, 1.0);\n\t\t} else {\n\t\t\tsimilarities.put(pair, similarities.get(pair) + 1);\t\t\n\t\t}\n\t}\t\n\t\n\t/* Adjust the intersection value to become the similarity. */\n\tpublic static void adjustToSimilarities(HashMap<Integer, Document> documents, HashMap<DocPair, Double> similarities) {\n\t\tfor (Entry<DocPair, Double> entry : similarities.entrySet()) {\n\t\t\tDocPair pair = entry.getKey();\n\t\t\tDouble intersection = entry.getValue();\n\t\t\tDocument doc1 = documents.get(pair.doc1);\n\t\t\tDocument doc2 = documents.get(pair.doc2);\n\t\t\tdouble union = (double) doc1.size() + doc2.size() - intersection;\n\t\t\tentry.setValue(intersection / union);\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint numDocuments = 10;\n\t\tint docSize = 5;\n\t\tHashMap<Integer, Document> documents = new HashMap<Integer, Document>();\n\t\tfor (int i = 0; i < numDocuments; i++) {\n\t\t\tint[] words = AssortedMethods.randomArray(docSize, 0, 10);\n\t\t\tArrayList<Integer> w = Tester.removeDups(words);\n\t\t\tSystem.out.println(i + \": \" + w.toString());\n\t\t\tDocument doc = new Document(i, w);\n\t\t\tdocuments.put(i, doc);\n\t\t}\n\t\t\n\t\tHashMap<DocPair, Double> similarities = computeSimilarities(documents);\n\t\tTester.printSim(similarities);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_26_Sparse_Similarity/QuestionC.java",
    "content": "package Q17_26_Sparse_Similarity;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map.Entry;\n\nimport CtCILibrary.AssortedMethods;\n\npublic class QuestionC {\n\tpublic static class Element implements Comparable<Element> {\n\t\tpublic int word;\n\t\tpublic int document;\n\t\tpublic Element(int w, int d) {\n\t\t\tword = w;\n\t\t\tdocument = d;\n\t\t}\n\t\t\n\t\tpublic int compareTo(Element e) {\n\t\t\tif (word == e.word) {\n\t\t\t\treturn document - e.document;\n\t\t\t}\n\t\t\treturn word - e.word;\n\t\t}\n\t}\n\t\n\tpublic static HashMap<DocPair, Double> computeSimilarities(HashMap<Integer, Document> documents) {\n\t\tArrayList<Element> elements = sortWords(documents);\n\t\tHashMap<DocPair, Double> similarities = computeIntersections(elements);\n\t\tadjustToSimilarities(documents, similarities);\n\t\treturn similarities;\n\t}\t\n\t\n\t/* Throw all words into one list, sorting by the word then the document. */\n\tpublic static ArrayList<Element> sortWords(HashMap<Integer, Document> docs) {\n\t\tArrayList<Element> elements = new ArrayList<Element>();\n\t\tfor (Document doc : docs.values()) {\n\t\t\tArrayList<Integer> words = doc.getWords();\n\t\t\tfor (int word : words) {\n\t\t\t\telements.add(new Element(word, doc.getId()));\n\t\t\t}\n\t\t}\n\t\tCollections.sort(elements);\n\t\treturn elements;\n\t}\n\t\n\t/* Increment the intersection size of each document pair. */\n\tpublic static void increment(HashMap<DocPair, Double> similarities, int doc1, int doc2) {\n\t\tDocPair pair = new DocPair(doc1, doc2);\n\t\tif (!similarities.containsKey(pair)) {\n\t\t\tsimilarities.put(pair, 1.0);\n\t\t} else {\n\t\t\tsimilarities.put(pair, similarities.get(pair) + 1);\t\t\n\t\t}\n\t}\n\t\n\t/* Adjust the intersection value to become the similarity. */\n\tpublic static HashMap<DocPair, Double> computeIntersections(ArrayList<Element> elements) {\n\t\tHashMap<DocPair, Double> similarities = new HashMap<DocPair, Double>();\n\t\t\n\t\tfor (int i = 0; i < elements.size(); i++) {\n\t\t\tElement left = elements.get(i);\n\t\t\tfor (int j = i + 1; j < elements.size(); j++) {\n\t\t\t\tElement right = elements.get(j);\n\t\t\t\tif (left.word != right.word) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tincrement(similarities, left.document, right.document);\t\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn similarities;\n\t}\n\t\n\t/* Adjust the intersection value to become the similarity. */\n\tpublic static void adjustToSimilarities(HashMap<Integer, Document> documents, HashMap<DocPair, Double> similarities) {\n\t\tfor (Entry<DocPair, Double> entry : similarities.entrySet()) {\n\t\t\tDocPair pair = entry.getKey();\n\t\t\tDouble intersection = entry.getValue();\n\t\t\tDocument doc1 = documents.get(pair.doc1);\n\t\t\tDocument doc2 = documents.get(pair.doc2);\n\t\t\tdouble union = (double) doc1.size() + doc2.size() - intersection;\n\t\t\tentry.setValue(intersection / union);\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint numDocuments = 10;\n\t\tint docSize = 5;\n\t\tHashMap<Integer, Document> documents = new HashMap<Integer, Document>();\n\t\tfor (int i = 0; i < numDocuments; i++) {\n\t\t\tint[] words = AssortedMethods.randomArray(docSize, 0, 10);\n\t\t\tArrayList<Integer> w = Tester.removeDups(words);\n\t\t\tSystem.out.println(i + \": \" + w.toString());\n\t\t\tDocument doc = new Document(i, w);\n\t\t\tdocuments.put(i, doc);\n\t\t}\n\t\t\n\t\tHashMap<DocPair, Double> similarities = computeSimilarities(documents);\n\t\tTester.printSim(similarities);\n\t}\n\n}\n"
  },
  {
    "path": "Java/Ch 17. Hard/Q17_26_Sparse_Similarity/Tester.java",
    "content": "package Q17_26_Sparse_Similarity;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map.Entry;\n\npublic class Tester {\n\tpublic static ArrayList<Integer> removeDups(int[] array) {\n\t\tHashSet<Integer> set = new HashSet<Integer>();\n\t\tfor (int a : array) {\n\t\t\tset.add(a);\n\t\t}\n\t\tArrayList<Integer> list = new ArrayList<Integer>();\n\t\tlist.addAll(set);\n\t\treturn list;\n\t}\n\t\n\tpublic static boolean isEqual(HashMap<DocPair, Double> one, HashMap<DocPair, Double> two) {\n\t\tif (one.size() != two.size()) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (Entry<DocPair, Double> a : one.entrySet()) {\n\t\t\tif (!two.containsKey(a.getKey())) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdouble sim1 = a.getValue();\n\t\t\tdouble sim2 = two.get(a.getKey());\n\t\t\tif (sim1 != sim2) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static void printSim(HashMap<DocPair, Double> similarities) {\n\t\tfor (Entry<DocPair, Double> result : similarities.entrySet()) {\n\t\t\tDocPair pair = result.getKey();\n\t\t\tDouble sim = result.getValue();\n\t\t\tSystem.out.println(pair.doc1 + \", \" + pair.doc2 + \" : \" + sim);\n\t\t}\n\t}\n\t\n\tpublic static void addTo(HashMap<Integer, Document> documents, int id, int[] array) {\n\t\tArrayList<Integer> w = removeDups(array);\n\t\tDocument doc = new Document(id, w);\n\t\tdocuments.put(id, doc);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\t/*int numDocuments = 5;\n\t\tint docSize = 5;\n\t\tHashMap<Integer, Document> documents = new HashMap<Integer, Document>();\n\t\tfor (int i = 0; i < numDocuments; i++) {\n\t\t\tint[] words = AssortedMethods.randomArray(docSize, 0, 10);\n\t\t\tArrayList<Integer> w = removeDups(words);\n\t\t\tSystem.out.println(i + \": \" + w.toString());\n\t\t\tDocument doc = new Document(i, w);\n\t\t\tdocuments.put(i, doc);\n\t\t}*/\n\t\tHashMap<Integer, Document> documents = new HashMap<Integer, Document>();\n\t\t\n\t\tint[] array1 = {14, 15, 100, 9, 3};\n\t\taddTo(documents, 13, array1);\n\n\t\tint[] array2 = {32, 1, 9, 3, 5};\n\t\taddTo(documents, 16, array2);\n\n\t\tint[] array3 = {15, 29, 2, 6, 8, 7};\n\t\taddTo(documents, 19, array3);\n\n\t\tint[] array4 = {7, 10};\n\t\taddTo(documents, 24, array4);\n\t\t\n\t\t\n\t\tHashMap<DocPair, Double> simA = QuestionA.computeSimilarities(documents);\n\t\tHashMap<DocPair, Double> simB = QuestionB.computeSimilarities(documents);\n\t\tHashMap<DocPair, Double> simC = QuestionC.computeSimilarities(documents);\n\t\tSystem.out.println(\"----------\");\n\t\tprintSim(simA);\n\t\tSystem.out.println(\"----------\");\n\t\tprintSim(simB);\n\t\tSystem.out.println(\"----------\");\n\t\tprintSim(simC);\n\t\tSystem.out.println(\"----------\");\n\t\t\n\t\tSystem.out.println(isEqual(simA, simB));\n\t\tSystem.out.println(isEqual(simB, simC));\n\t\tSystem.out.println(isEqual(simA, simC));\n\t}\n\n}\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/AssortedMethods.java",
    "content": "package CtCILibrary;\r\n\r\nimport java.util.*;\r\nimport java.awt.*;\r\n\r\npublic class AssortedMethods {\r\n\tpublic static int randomInt(int n) {\r\n\t\treturn (int) (Math.random() * n);\r\n\t}\r\n\r\n\tpublic static int randomIntInRange(int min, int max) {\r\n\t\treturn randomInt(max + 1 - min) + min;\r\n\t}\r\n\r\n\tpublic static boolean randomBoolean() {\r\n\t\treturn randomIntInRange(0, 1) == 0;\r\n\t}\r\n\r\n\tpublic static boolean randomBoolean(int percentTrue) {\r\n\t\treturn randomIntInRange(1, 100) <= percentTrue;\r\n\t}\r\n\t\r\n\tpublic static boolean[][] randomBooleanMatrix(int M, int N, int percentTrue) {\r\n\t\tboolean[][] matrix = new boolean[M][N];\r\n\t\tfor (int i = 0; i < M; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tmatrix[i][j] = randomBoolean(percentTrue);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn matrix;\r\n\t}\t\r\n\r\n\tpublic static int[][] randomMatrix(int M, int N, int min, int max) {\r\n\t\tint[][] matrix = new int[M][N];\r\n\t\tfor (int i = 0; i < M; i++) {\r\n\t\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\t\tmatrix[i][j] = randomIntInRange(min, max);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn matrix;\r\n\t}\r\n\r\n\r\n\tpublic static int[] randomArray(int N, int min, int max) {\r\n\t\tint[] array = new int[N];\r\n\t\tfor (int j = 0; j < N; j++) {\r\n\t\t\tarray[j] = randomIntInRange(min, max);\r\n\t\t}\r\n\t\treturn array;\r\n\t}\r\n\r\n\tpublic static LinkedListNode randomLinkedList(int N, int min, int max) {\r\n\t\tLinkedListNode root = new LinkedListNode(randomIntInRange(min, max),\r\n\t\t\t\tnull, null);\r\n\t\tLinkedListNode prev = root;\r\n\t\tfor (int i = 1; i < N; i++) {\r\n\t\t\tint data = randomIntInRange(min, max);\r\n\t\t\tLinkedListNode next = new LinkedListNode(data, null, null);\r\n\t\t\tprev.setNext(next);\r\n\t\t\tprev = next;\r\n\t\t}\r\n\t\treturn root;\r\n\t}\r\n\r\n\tpublic static LinkedListNode linkedListWithValue(int N, int value) {\r\n\t\tLinkedListNode root = new LinkedListNode(value, null, null);\r\n\t\tLinkedListNode prev = root;\r\n\t\tfor (int i = 1; i < N; i++) {\r\n\t\t\tLinkedListNode next = new LinkedListNode(value, null, null);\r\n\t\t\tprev.setNext(next);\r\n\t\t\tprev = next;\r\n\t\t}\r\n\t\treturn root;\r\n\t}\r\n\r\n\tpublic static LinkedListNode createLinkedListFromArray(int[] vals) {\r\n\t\tLinkedListNode head = new LinkedListNode(vals[0], null, null);\r\n\t\tLinkedListNode current = head;\r\n\t\tfor (int i = 1; i < vals.length; i++) {\r\n\t\t\tcurrent = new LinkedListNode(vals[i], null, current);\r\n\t\t}\r\n\t\treturn head;\r\n\t}\r\n\r\n\tpublic static String arrayToString(int[] array) {\r\n\t\tif (array == null) return \"\";\r\n\t\treturn arrayToString(array, 0, array.length - 1);\r\n\t}\r\n\t\r\n\tpublic static String arrayToString(int[] array, int start, int end) {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\tfor (int i = start; i <= end; i++) {\r\n\t\t\tint v = array[i];\r\n\t\t\tsb.append(v + \", \");\r\n\t\t}\r\n\t\treturn sb.toString();\r\n\t}\t\r\n\r\n\tpublic static String stringArrayToString(String[] array) {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\tfor (String v : array) {\r\n\t\t\tsb.append(v + \", \");\r\n\t\t}\r\n\t\treturn sb.toString();\r\n\t}\r\n\r\n\tpublic static String toFullBinaryString(int a) {\r\n\t\tString s = \"\";\r\n\t\tfor (int i = 0; i < 32; i++) {\r\n\t\t\tInteger lsb = new Integer(a & 1);\r\n\t\t\ts = lsb.toString() + s;\r\n\t\t\ta = a >> 1;\r\n\t\t}\r\n\t\treturn s;\r\n\t}\r\n\r\n\tpublic static String toBaseNString(int a, int base) {\r\n\r\n\t\tString s = \"\";\r\n\t\twhile (true) {\r\n\t\t\tint lastdigit = a % base;\r\n\t\t\ts = lastdigit + s;\r\n\t\t\ta = a / base;\r\n\t\t\tif (a == 0)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\treturn s;\r\n\t}\r\n\r\n\tpublic static void printMatrix(int[][] matrix) {\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 0; j < matrix[i].length; j++) {\r\n\t\t\t\tif (matrix[i][j] < 10 && matrix[i][j] > -10) {\r\n\t\t\t\t\tSystem.out.print(\" \");\r\n\t\t\t\t}\r\n\t\t\t\tif (matrix[i][j] < 100 && matrix[i][j] > -100) {\r\n\t\t\t\t\tSystem.out.print(\" \");\r\n\t\t\t\t}\r\n\t\t\t\tif (matrix[i][j] >= 0) {\r\n\t\t\t\t\tSystem.out.print(\" \");\r\n\t\t\t\t}\r\n\t\t\t\tSystem.out.print(\" \" + matrix[i][j]);\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void printMatrix(boolean[][] matrix) {\r\n\t\tfor (int i = 0; i < matrix.length; i++) {\r\n\t\t\tfor (int j = 0; j < matrix[i].length; j++) {\r\n\t\t\t\tif (matrix[i][j]) {\r\n\t\t\t\t\tSystem.out.print(\"1\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSystem.out.print(\"0\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void printIntArray(int[] array) {\r\n\t\tfor (int i = 0; i < array.length; i++) {\r\n\t\t\tSystem.out.print(array[i] + \" \");\r\n\t\t}\r\n\t\tSystem.out.println(\"\");\r\n\t}\r\n\r\n\tpublic static String charArrayToString(char[] array) {\r\n\t\tStringBuilder buffer = new StringBuilder(array.length);\r\n\t\tfor (char c : array) {\r\n\t\t\tif (c == 0) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbuffer.append(c);\r\n\t\t}\r\n\t\treturn buffer.toString();\r\n\t}\r\n\r\n\tpublic static String listOfPointsToString(ArrayList<Point> list) {\r\n\t\tStringBuilder buffer = new StringBuilder();\r\n\t\tfor (Point p : list) {\r\n\t\t\tbuffer.append(\"(\" + p.x + \",\" + p.y + \")\");\r\n\t\t}\r\n\t\treturn buffer.toString();\r\n\t}\r\n\r\n\tpublic static TreeNode randomBST(int N, int min, int max) {\r\n\t\tint d = randomIntInRange(min, max);\r\n\t\tTreeNode root = new TreeNode(d);\r\n\t\tfor (int i = 1; i < N; i++) {\r\n\t\t\troot.insertInOrder(randomIntInRange(min, max));\r\n\t\t}\r\n\t\treturn root;\r\n\t}\r\n\r\n\t/* Creates tree by mapping the array left to right, top to bottom. */\r\n\tpublic static TreeNode createTreeFromArray(int[] array) {\r\n\t\tif (array.length > 0) {\r\n\t\t\tTreeNode root = new TreeNode(array[0]);\r\n\t\t\tjava.util.Queue<TreeNode> queue = new java.util.LinkedList<TreeNode>();\r\n\t\t\tqueue.add(root);\r\n\t\t\tboolean done = false;\r\n\t\t\tint i = 1;\r\n\t\t\twhile (!done) {\r\n\t\t\t\tTreeNode r = (TreeNode) queue.element();\r\n\t\t\t\tif (r.left == null) {\r\n\t\t\t\t\tr.left = new TreeNode(array[i]);\r\n\t\t\t\t\ti++;\r\n\t\t\t\t\tqueue.add(r.left);\r\n\t\t\t\t} else if (r.right == null) {\r\n\t\t\t\t\tr.right = new TreeNode(array[i]);\r\n\t\t\t\t\ti++;\r\n\t\t\t\t\tqueue.add(r.right);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tqueue.remove();\r\n\t\t\t\t}\r\n\t\t\t\tif (i == array.length) {\r\n\t\t\t\t\tdone = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn root;\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static String getLongTextBlob() {\r\n\t\tString book = \"As they rounded a bend in the path that ran beside the river, Lara recognized the silhouette of a fig tree atop a nearby hill. The weather was hot and the days were long. The fig tree was in full leaf, but not yet bearing fruit. \"\r\n\t\t\t\t+ \"Soon Lara spotted other landmarks�an outcropping of limestone beside the path that had a silhouette like a man�s face, a marshy spot beside the river where the waterfowl were easily startled, a tall tree that looked like a man with his arms upraised. They were drawing near to the place where there was an island in the river. The island was a good spot to make camp. They would sleep on the island tonight.\"\r\n\t\t\t\t+ \"Lara had been back and forth along the river path many times in her short life. Her people had not created the path�it had always been there, like the river�but their deerskin-shod feet and the wooden wheels of their handcarts kept the path well worn. Lara�s people were salt traders, and their livelihood took them on a continual journey. \";\r\n\t\tString book_mod = book.replace('.', ' ').replace(',', ' ')\r\n\t\t\t\t.replace('-', ' ');\r\n\t\treturn book_mod;\r\n\t}\r\n\r\n\tpublic static String[] getLongTextBlobAsStringList() {\r\n\t\treturn getLongTextBlob().split(\" \");\r\n\t}\r\n\r\n\tpublic static Trie getTrieDictionary() {\r\n\t\treturn new Trie(getListOfWords());\r\n\t}\r\n\t\r\n\tpublic static HashSet<String> getWordListAsHashSet() {\r\n\t\tString[] wordList = getListOfWords();\r\n\t\tHashSet<String> wordSet = new HashSet<String>();\r\n\t\tfor (String s : wordList) {\r\n\t\t\twordSet.add(s);\r\n\t\t}\r\n\t\treturn wordSet;\r\n\t}\t\r\n\t\r\n\tpublic static String getLongSampleText(boolean forceLower) {\r\n\t\tString text = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi enim magna, rhoncus at risus at, tincidunt pretium sapien. Maecenas vitae sagittis urna. Donec egestas, mauris ut porttitor eleifend, lectus felis sollicitudin sapien, luctus tempor ligula lacus sit amet quam. Quisque gravida est dolor, vel cursus lacus cursus vel. Morbi vulputate ligula nec libero ullamcorper iaculis. Sed finibus tincidunt scelerisque. Cras condimentum lectus ac sem ornare, non pellentesque enim bibendum. Quisque tincidunt eget elit ut iaculis. Aliquam purus sapien, tincidunt non imperdiet eu, venenatis quis turpis. Vestibulum finibus porta urna sed consequat. Phasellus at rutrum enim. In euismod tellus nec ligula placerat dapibus. Quisque mauris urna, malesuada sit amet scelerisque at, euismod vitae nulla. Sed cursus lacus vitae leo venenatis, id ultrices ex fermentum.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Duis non libero iaculis, euismod sapien non, lacinia odio. Nunc at est sodales, posuere nisl sit amet, bibendum tellus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc condimentum pretium congue. Sed viverra nibh ut tellus accumsan, non viverra sapien blandit. Integer convallis aliquam lacus, ut congue lectus feugiat sit amet. Nunc vel nisl sed nisi iaculis pharetra nec quis lacus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec laoreet in ex a facilisis. Aenean tincidunt dapibus augue, eu ultricies odio hendrerit ut. Nunc turpis sapien, blandit nec nibh quis, efficitur sodales dolor. Sed fringilla id quam eu vestibulum.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Cras rutrum lorem rutrum tortor auctor cursus. Aenean tempor sed tellus eget vulputate. Nulla velit tellus, volutpat nec massa eget, fermentum euismod justo. Pellentesque scelerisque lobortis nulla ac vestibulum. Pellentesque ac scelerisque nibh. Duis tristique, nunc a posuere fermentum, felis sem egestas leo, id pellentesque ex augue in nibh. Nullam in eros lobortis, convallis nulla at, malesuada turpis. Aliquam consectetur efficitur orci bibendum tempus. Aenean ut lorem in arcu pellentesque accumsan a bibendum tortor. Maecenas neque nisi, mattis eget ex eget, porttitor ullamcorper erat. Maecenas varius ligula sed ullamcorper fermentum. In placerat ut dui nec placerat. Cras condimentum velit nec porttitor tincidunt. Cras et neque eu dolor condimentum imperdiet. Ut bibendum quam a erat varius hendrerit.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"In hac habitasse platea dictumst. Ut eleifend sem sit amet metus tincidunt euismod. Donec vel placerat mauris. Nulla facilisi. Nam vel purus et velit blandit ultricies. Aliquam non gravida erat. Ut non aliquam orci. Mauris ultrices condimentum dapibus.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Cras ipsum sem, luctus eget suscipit sit amet, fermentum id elit. Morbi consectetur, tellus quis pretium interdum, erat nisi finibus massa, eget molestie ligula nisi egestas lorem. Praesent vitae consectetur erat, vitae lacinia dolor. Praesent placerat ut sapien eget bibendum. Phasellus malesuada lacus in metus bibendum, vel dapibus dolor imperdiet. Etiam ut nibh in risus iaculis commodo. Cras a elementum risus. Aenean luctus, dolor id accumsan egestas, dolor dui auctor augue, vitae commodo massa lacus at odio. In ut dignissim ex, sed tristique odio.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Aenean ac malesuada lorem, eget placerat dui. Etiam at libero dictum, posuere neque non, interdum leo. Vivamus tempus sem id orci tempor, sit amet mattis augue aliquam. Aenean efficitur nunc sed lobortis egestas. Vivamus aliquet mi sit amet nisi convallis, sed volutpat neque fringilla. Duis blandit risus vitae felis pellentesque, quis facilisis ante suscipit. Proin vehicula metus commodo, aliquet nunc a, dignissim odio. In laoreet tortor ut nisl tempus fermentum. Maecenas auctor elementum leo, at tempor nisi feugiat et. Cras pulvinar arcu sit amet sem efficitur, vitae dictum eros lobortis. Pellentesque at orci consectetur, facilisis dui vel, lacinia dolor. Nullam rutrum porta dui, a sollicitudin neque aliquam vel. Sed sodales diam ac lorem feugiat, ut vulputate quam lacinia. Phasellus tincidunt dictum nibh et ultrices.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Cras odio diam, euismod eu libero vitae, iaculis venenatis justo. Suspendisse pretium lectus nec suscipit mollis. Aenean eleifend ac turpis et tempor. Morbi turpis tortor, dictum sed condimentum id, commodo ut ligula. Aenean interdum nibh ante, nec cursus turpis facilisis nec. Aliquam scelerisque mollis mauris, quis rutrum nisl aliquet eget. Mauris condimentum tellus quis libero pretium feugiat. Nulla facilisi. Maecenas pharetra ultricies purus, nec fermentum quam eleifend non. Aliquam iaculis accumsan tellus quis pretium. Sed in ex sollicitudin, varius nibh in, scelerisque felis.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Duis et lacus eu lorem scelerisque lacinia vitae eu odio. Ut mi dolor, vehicula eget libero ut, imperdiet sodales justo. Suspendisse pulvinar dignissim sagittis. Nam arcu velit, tempor non tortor id, sodales egestas nibh. Morbi dictum a felis quis pretium. Mauris dignissim ligula vel nunc blandit, in dapibus augue dignissim. Quisque non risus non augue aliquam semper at in tortor. Ut sed massa varius odio ultrices aliquet. In tempor augue ex, eu rutrum ex malesuada eu.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Ut dignissim nisl ut purus placerat rutrum eu vel diam. Nulla aliquam lectus quis neque tempor iaculis. Quisque non ligula in nibh dapibus scelerisque. Duis aliquam venenatis odio sed congue. Aenean vel dui nulla. Curabitur at maximus metus. Integer non lectus vel lacus gravida eleifend. Aenean sed sapien molestie dui consectetur mollis nec non erat. Vestibulum facilisis in massa nec posuere. Nam nec elit vulputate, commodo urna non, mollis magna. Duis dolor lorem, tincidunt eget volutpat in, viverra ut nunc. Aenean lacinia ornare mi id accumsan.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Donec non cursus nibh. Duis eu dolor sollicitudin nisi consectetur blandit vitae nec tortor. Praesent tempor condimentum magna at tincidunt. Nullam nisi lacus, maximus eget euismod ut, tristique sit amet augue. Mauris a dui justo. Pellentesque convallis ullamcorper lectus eget pellentesque. Integer scelerisque fermentum egestas. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque suscipit a mauris a rhoncus. Ut pulvinar, mi id porta pulvinar, urna tortor dapibus mauris, ut cursus tellus tellus in tortor. Curabitur at nunc placerat, vehicula libero quis, iaculis odio. Mauris id porttitor leo, et ultricies ex. Sed cursus egestas ante in tristique.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Pellentesque nec lobortis elit, eu fermentum leo. Aliquam elementum at orci pulvinar laoreet. Aenean eu vulputate sapien, quis vestibulum nunc. Aliquam tincidunt mollis mi, ac consectetur felis tempor porta. Nulla facilisi. In porta elementum hendrerit. Nulla mattis quis eros quis lobortis. Quisque semper enim at finibus fringilla. Duis nunc orci, semper sit amet magna hendrerit, rhoncus posuere libero.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Fusce facilisis sem massa, eget ultricies sem laoreet nec. Praesent non blandit felis. Nulla facilisi. Sed orci velit, tristique at pharetra cursus, euismod sit amet turpis. Nulla quis euismod elit, ut dapibus diam. Nam pulvinar convallis interdum. Phasellus nunc ante, porttitor quis dignissim vel, dictum a neque. Fusce quis augue quis ipsum pulvinar ultricies. Ut nec nunc vitae lectus vehicula elementum eu quis magna. Aliquam euismod iaculis lorem nec pretium. Integer eget sagittis mi. Interdum et malesuada fames ac ante ipsum primis in faucibus.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Vestibulum at mattis ex. Cras eu ligula quis eros gravida aliquet. Pellentesque non lorem ac ante laoreet porttitor. Vestibulum eget consequat lacus. Ut at arcu velit. Aenean mattis aliquet urna a hendrerit. Nam condimentum finibus fermentum. Cras id est at ex tincidunt fringilla. Maecenas ultricies vel nisi eu semper. Vivamus a volutpat justo. Quisque cursus vulputate eros, eu dictum eros. Maecenas tempus magna semper egestas feugiat. Donec interdum sagittis mi, eu vulputate nisi. Ut accumsan rutrum faucibus.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Mauris id ultricies mauris. Vivamus purus magna, dictum at posuere non, ullamcorper sagittis magna. Etiam dictum consequat justo, a euismod purus ornare quis. Suspendisse hendrerit pulvinar metus, id malesuada purus scelerisque et. Suspendisse dui quam, convallis nec libero non, hendrerit aliquet leo. Nam eget accumsan massa. Proin vel ante neque. Donec dapibus, est nec ullamcorper auctor, ligula lorem molestie augue, at luctus sapien lorem eget libero. Duis porttitor massa id purus sollicitudin, sed gravida massa porta. Mauris sollicitudin id sem ac maximus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin vulputate justo vel dignissim lacinia. Donec quam justo, venenatis id ex dignissim, malesuada posuere neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam lacus turpis, semper vel orci vitae, condimentum hendrerit ligula.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Morbi ut dui risus. Sed eu est velit. Sed vel congue risus. Praesent pulvinar eu arcu tempor sagittis. Integer fringilla mollis pellentesque. Aliquam sed lobortis lacus. Quisque rhoncus maximus odio et mollis. Sed egestas, lectus ut fringilla mattis, velit massa ullamcorper metus, a feugiat metus nunc sit amet tellus. Praesent egestas, metus nec mollis laoreet, elit est pellentesque tellus, mollis dictum nunc mauris eu nisi. Sed laoreet tempus risus at ornare.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Sed lorem tortor, egestas sit amet ligula ac, sollicitudin porttitor elit. Praesent consectetur id metus mollis suscipit. Phasellus non dictum mauris. In porta nisl sit amet tincidunt porta. Nullam sollicitudin, odio ac vehicula fermentum, arcu purus gravida lacus, at tempor felis odio sit amet lorem. Integer euismod eros sed gravida mattis. Vestibulum nec justo eros. Nunc fermentum molestie mauris sit amet imperdiet. Maecenas pulvinar sit amet ligula vitae aliquam. Aliquam hendrerit orci sed ex pellentesque porta.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Mauris tempor quis nunc vel consequat. Donec a aliquet tortor, et mollis est. Nullam a cursus lectus. Quisque non laoreet magna, sit amet elementum justo. Vestibulum fringilla metus eu magna scelerisque venenatis. Proin fringilla massa in lobortis finibus. Suspendisse dignissim est at leo tincidunt mollis. Curabitur luctus velit fringilla nisi blandit semper.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Suspendisse potenti. Duis at semper arcu. Mauris aliquam non augue a luctus. Praesent aliquet tristique turpis id imperdiet. Nullam at enim id tellus finibus faucibus eu auctor eros. Praesent lobortis cursus suscipit. Ut porta lacus at risus aliquet, non sagittis orci sollicitudin. Ut viverra sapien sed tincidunt sagittis. Fusce luctus diam vitae ante fermentum, non cursus est sollicitudin. Maecenas at tincidunt augue, scelerisque tincidunt arcu. Etiam interdum nisl at blandit laoreet. Phasellus in sapien id purus auctor fringilla. Donec erat nunc, finibus eu porta nec, vulputate sit amet neque. In hac habitasse platea dictumst.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Duis ornare lectus luctus magna scelerisque, quis convallis erat feugiat. Ut at libero pellentesque, congue lectus at, tincidunt nunc. Curabitur elementum, metus eget tincidunt ultrices, ante orci feugiat velit, quis fermentum enim leo a diam. Quisque ultricies pulvinar orci, vitae pharetra nisi auctor a. Nullam eu condimentum neque, id congue purus. Ut eros sapien, sollicitudin quis risus tristique, ultrices pulvinar mauris. Nunc ullamcorper suscipit nulla, ac fringilla ipsum dignissim vitae. Cras porttitor sed ex eu finibus. Praesent tincidunt, libero in maximus bibendum, nibh turpis rhoncus neque, sed commodo tortor orci ac tellus. Sed eget lacinia dolor, non pellentesque magna. Suspendisse et ipsum vestibulum, suscipit urna sit amet, ullamcorper nisi. Ut ut ante sit amet velit varius hendrerit. Proin in massa sit amet ex posuere vestibulum. Ut egestas sodales magna ut mollis. Fusce vitae leo iaculis, posuere leo ut, pretium neque. Nullam tincidunt dui eu dui tristique, non venenatis libero maximus.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Quisque sed auctor dolor. Nam sit amet cursus nisl. Nunc et pretium risus. Ut tempor massa nec dolor malesuada ultricies. Praesent hendrerit vestibulum tincidunt. Suspendisse et magna eget turpis hendrerit rhoncus ut at purus. Vestibulum non tellus mattis, lacinia justo id, iaculis lorem. Vestibulum tincidunt sapien nec lorem dapibus, egestas mollis turpis tempor. Nunc id imperdiet tortor, vel sodales ex. Duis ut libero nec nibh sollicitudin sollicitudin.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Integer viverra quam at metus elementum, in ornare ex gravida. Suspendisse sed velit cursus, pellentesque mauris in, gravida ligula. Maecenas et nibh auctor, molestie urna in, euismod mi. Integer lobortis lacinia enim eu egestas. Praesent nisl enim, consectetur eu libero eget, convallis semper ex. Maecenas commodo velit nec erat ultricies, et dapibus neque dignissim. Nullam dictum velit et ipsum egestas volutpat. Ut feugiat diam id eros convallis sagittis. Aenean viverra justo eu enim malesuada, ut interdum neque sollicitudin. Aliquam erat volutpat. Sed aliquam leo nunc, id laoreet sapien posuere at. Nunc imperdiet lacus ac efficitur hendrerit.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Vivamus dignissim erat eu erat aliquam luctus. Sed varius lacinia mauris, placerat facilisis massa finibus quis. Proin ac turpis a neque vulputate maximus vel non libero. Nunc ornare tempor tortor, vitae dignissim augue ullamcorper et. Cras at auctor risus, at interdum tortor. Proin finibus convallis ex, et pulvinar augue tincidunt sed. Suspendisse laoreet velit non mi viverra rhoncus. Fusce tristique pulvinar mauris, et tempor dolor. In gravida felis metus, eu venenatis ante aliquet non. Sed condimentum orci at urna aliquam, vitae ornare quam pellentesque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Quisque lacinia, lacus sit amet cursus semper, risus felis convallis ipsum, vitae condimentum tellus nunc non dui. Sed semper, magna at laoreet convallis, diam erat imperdiet leo, sit amet fringilla felis purus eget justo. Sed accumsan odio eget sem tristique mattis. In hac habitasse platea dictumst. Etiam aliquet ultricies augue, ac consequat risus semper volutpat. Praesent sollicitudin dolor enim, quis egestas ex vestibulum quis. Quisque vehicula, lectus eget dapibus sodales, orci massa facilisis justo, vel semper ante nunc nec augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam a lorem dignissim, accumsan erat sit amet, ornare purus. Curabitur sit amet tempus odio, id laoreet libero. Quisque augue nisi, sodales ac finibus vitae, pharetra vel turpis. Ut interdum sodales feugiat. Maecenas facilisis, eros eu blandit volutpat, est risus lobortis tortor, in interdum elit odio eget nunc. Fusce et aliquet tortor, quis consectetur tortor. Nullam ut urna non massa bibendum semper.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Vivamus dui tortor, mattis eu iaculis viverra, rutrum sit amet quam. Sed non mollis dui, quis pretium dolor. In consequat nisl nec orci ultrices condimentum sit amet nec arcu. In cursus velit a congue fringilla. Curabitur hendrerit faucibus faucibus. Phasellus aliquet ut risus at rhoncus. Praesent tellus orci, scelerisque vel elit varius, lobortis porttitor erat.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Sed ac neque vehicula, interdum ligula ac, pharetra mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed ipsum erat, lobortis sed mollis sit amet, porttitor elementum dui. Nunc in massa ut mauris rutrum sollicitudin. Pellentesque nec sem auctor mauris fermentum faucibus id at odio. Nullam ut libero at tortor egestas commodo. Aenean vitae est nec leo fermentum iaculis ut ut dui. Nulla elementum non dolor vitae cursus.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nulla lorem neque, sodales vel erat non, pretium gravida nibh. Vivamus vestibulum tempor rutrum. Maecenas risus dolor, congue in ullamcorper eu, consequat id magna. Cras pretium gravida purus eu aliquet. Sed pellentesque lorem ac metus posuere dapibus. Sed at ligula at dui porta semper at vitae sem. Sed elementum nunc eget blandit hendrerit. Curabitur sit amet dui nulla. Nam leo orci, consequat sit amet urna quis, faucibus sagittis ligula. Pellentesque nec tincidunt ante, a ornare mauris. Phasellus vehicula feugiat nisl, et fermentum velit tempus eget.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Cras vel nunc vitae leo viverra laoreet eget non dolor. Duis eleifend, metus tincidunt auctor ultricies, leo tellus condimentum velit, eget vulputate dolor mauris a felis. Nunc hendrerit, velit id molestie pharetra, nulla diam mollis erat, quis cursus erat orci eget lacus. Donec in massa vehicula, aliquet sapien et, congue libero. In quis ex faucibus est pharetra suscipit. Nunc quis dictum leo. Donec urna leo, pretium tempus vulputate a, iaculis sit amet odio. Aenean dictum consequat elit, in gravida erat aliquam sit amet. Praesent nec urna mi. Fusce quis malesuada lacus, id mollis ex. Nullam felis eros, vestibulum id luctus a, eleifend in lacus. Nullam iaculis tempus tortor, quis porttitor magna scelerisque sit amet.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nunc et nisi ac ligula vulputate pharetra eu sit amet tellus. Integer eleifend, nulla sit amet auctor posuere, libero tellus finibus magna, quis maximus sapien ipsum vel nibh. Vestibulum dictum risus et justo efficitur tempus. Ut eu hendrerit libero, nec rhoncus sapien. Integer et est magna. Quisque ullamcorper lacinia ex, et elementum turpis molestie sit amet. Integer placerat pharetra aliquet. Praesent id sodales erat. Donec iaculis, nibh et dapibus rhoncus, sem enim dignissim leo, eget porttitor neque diam eu sem. Duis consequat dignissim libero at aliquet. Maecenas pharetra nisi sit amet mollis interdum. Aenean vestibulum orci lacinia, porta lorem in, pharetra nibh. Duis sem elit, rutrum id nunc ac, lobortis aliquet mauris. Nullam ornare tortor ac erat venenatis, vitae tincidunt nunc posuere.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Aenean id arcu tellus. Cras justo odio, tempor a lacus ultricies, hendrerit condimentum urna. Curabitur lobortis blandit nulla eget aliquam. Pellentesque placerat efficitur molestie. Nullam ac libero maximus, volutpat magna condimentum, consequat nisi. Donec sagittis est nec tincidunt convallis. Nullam blandit neque augue. Suspendisse diam lacus, mollis quis condimentum nec, varius ut mi. Donec aliquam quam non nulla commodo, ac ultricies nisl gravida. Nullam ante purus, aliquam id urna vitae, interdum ultricies dolor. Nulla ipsum nulla, egestas facilisis nisl vel, rutrum feugiat erat.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Fusce ornare dapibus commodo. In gravida, nibh gravida cursus pretium, lorem massa blandit diam, quis vestibulum dolor dui at felis. Maecenas eget ornare ex. Nunc blandit laoreet gravida. Nulla efficitur euismod nisl non interdum. Vestibulum eleifend porta venenatis. Suspendisse mattis consequat ligula, tincidunt mollis nisl. In molestie, mauris a bibendum tempus, justo nisl congue libero, id euismod leo odio et odio. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent in volutpat tellus, sagittis ullamcorper tortor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras tincidunt ultricies dolor hendrerit iaculis. Vestibulum sodales dignissim felis porttitor ultrices. Ut condimentum nunc id nisi egestas, non finibus dui accumsan.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Sed eget nibh vitae lorem condimentum rhoncus. Vivamus tincidunt molestie nisl non viverra. Nulla facilisi. Cras eu dolor erat. Suspendisse fringilla in risus sed rhoncus. Quisque eu dolor libero. Integer dictum est quis felis luctus sagittis. Ut auctor nibh iaculis nibh consequat tempor. Proin ex tortor, dapibus gravida mauris et, pretium elementum risus. Vivamus venenatis tempus diam quis varius. Fusce at ultricies mauris. Cras consequat est mattis dolor ultrices, ac mattis nibh porttitor. Donec fringilla, velit eget viverra dignissim, augue tortor tempus velit, in fringilla dolor dolor a nibh. Duis quis gravida sapien. Etiam aliquam semper ante sed consequat. Sed urna sem, semper sodales urna et, sollicitudin luctus nunc.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nam nisl arcu, pharetra ac tincidunt non, bibendum nec magna. Cras lobortis felis non lectus maximus, id dapibus nisi pellentesque. Maecenas id velit eros. Donec volutpat orci sed risus malesuada vestibulum. Nunc metus arcu, auctor eu nisl eget, varius ornare erat. Sed mollis ante non lectus gravida iaculis. Proin nunc lectus, convallis nec interdum vitae, sodales eu dui. Ut ipsum tortor, efficitur a leo in, imperdiet maximus felis. Ut iaculis libero id arcu dapibus, vel ullamcorper mi consequat. In varius elementum est at pretium. Aenean accumsan dapibus risus, vel sollicitudin justo facilisis a.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Sed ultrices, erat in varius tempor, felis sem vulputate dui, vel accumsan enim lorem eget purus. Duis feugiat fringilla elit, non ultricies massa lobortis non. Proin nec molestie massa, id tincidunt elit. Aliquam purus orci, condimentum nec ante lacinia, vulputate semper nisl. Maecenas vitae nibh pulvinar est gravida pulvinar. Praesent tincidunt tellus sed ex pretium, et aliquam odio egestas. Nunc eget iaculis velit. Aenean est erat, eleifend ut eros ac, bibendum pellentesque felis. Nulla convallis, arcu sit amet bibendum egestas, massa augue tincidunt lacus, ac posuere magna justo sit amet magna. Donec id ante ex.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Fusce sit amet feugiat risus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent fringilla est sit amet iaculis gravida. Morbi urna magna, hendrerit sollicitudin ex sit amet, aliquam volutpat dolor. Vivamus fermentum quis augue ut luctus. In eu nibh mi. Mauris ipsum metus, auctor quis mattis convallis, commodo id arcu. Aenean semper id lorem pulvinar auctor. Cras fringilla egestas lectus, nec fermentum neque eleifend non. Nunc scelerisque est posuere laoreet imperdiet. Morbi in dignissim mauris, sed sagittis libero. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas dapibus tincidunt blandit.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Vivamus ac risus magna. Etiam venenatis ac ligula at mollis. Morbi elit nulla, molestie sit amet nunc id, fermentum imperdiet leo. Morbi vitae gravida felis, dapibus aliquet neque. Ut eu urna cursus eros placerat porta. Donec vitae faucibus quam. Proin ac dolor sit amet turpis pellentesque tristique. Pellentesque quis iaculis nisl. Morbi gravida imperdiet orci, eget ultricies diam egestas ac. Mauris elit ante, pharetra quis ligula ut, condimentum imperdiet tortor. Donec egestas libero eu mauris pellentesque lobortis.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Mauris sollicitudin leo a lectus mattis, in convallis dolor dapibus. Nam dapibus vitae velit ac tincidunt. Etiam facilisis, urna eu dictum mollis, nisl libero fermentum lectus, nec lacinia quam massa a arcu. Etiam mollis sodales ante, in vulputate nibh blandit eget. Maecenas sit amet felis libero. Sed congue sed eros nec lacinia. Praesent magna ipsum, vehicula quis magna et, condimentum elementum arcu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam erat volutpat. Mauris rhoncus tortor id imperdiet tincidunt.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Donec mollis quis metus nec scelerisque. Integer nec leo eu massa semper mattis vel eu nisi. Nullam tellus urna, lacinia quis interdum quis, accumsan consectetur odio. Curabitur mauris mauris, consequat et porta ac, elementum at massa. Maecenas bibendum, quam ac posuere tincidunt, turpis arcu convallis neque, sit amet condimentum orci ex ut purus. Duis sit amet malesuada leo. Fusce nulla nibh, condimentum quis enim ut, lacinia mattis erat. Quisque varius nulla tempus, feugiat lorem et, mattis nisi. In at eleifend nibh, at commodo ipsum. Proin et massa sollicitudin, volutpat justo non, lacinia est. Etiam imperdiet libero nec dolor ornare condimentum. Sed ante neque, pharetra at suscipit a, efficitur non lacus.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Sed elementum ut ex ac scelerisque. Proin metus erat, laoreet ut orci et, consectetur tincidunt elit. Pellentesque placerat egestas metus, a fringilla erat tristique sed. Donec sagittis, ipsum ac mattis auctor, tortor nunc imperdiet nibh, eu pretium lacus lacus sed dui. Quisque elementum elit arcu, sed aliquet sapien consequat at. Suspendisse accumsan ultricies dolor, sit amet finibus dolor luctus quis. Pellentesque sed porttitor diam, vitae ultrices metus. Vivamus ornare malesuada nibh. Donec vehicula facilisis dui, eu accumsan velit porttitor in. Phasellus sagittis, augue nec maximus cursus, lorem orci hendrerit nibh, eget ullamcorper velit sem non justo. Vestibulum sed nunc nisl. Donec et nunc fermentum, molestie est in, tristique eros. Vivamus tincidunt auctor odio, at lobortis ante bibendum sit amet. Sed in justo consectetur nisi viverra rhoncus quis posuere elit.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam a tristique odio. Pellentesque sed mattis ex. Pellentesque dignissim varius lectus. Proin hendrerit lacus diam, ac porttitor libero dapibus sed. Maecenas sit amet leo posuere orci auctor pretium. Nam gravida, arcu eget convallis porttitor, felis leo ultrices est, sed pulvinar lorem nisi et sapien. Nulla eu enim a mauris pretium lacinia. Curabitur lacinia urna enim, a tempor nunc venenatis non. Integer at sem id odio luctus mollis hendrerit id enim.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nunc sagittis, dolor vel lacinia mattis, erat erat vehicula diam, at commodo quam neque a felis. Sed efficitur, felis a rutrum imperdiet, ex nisi elementum orci, a tempus turpis nibh eget velit. Cras dictum dictum odio condimentum bibendum. Sed finibus, justo eget tempus blandit, ligula est sodales purus, eget convallis risus mauris et neque. Nunc vulputate, felis in posuere congue, diam orci sollicitudin orci, ut blandit arcu tortor quis sem. Maecenas posuere fermentum ullamcorper. In congue elit eget orci ultrices, in consequat libero venenatis. Morbi luctus feugiat malesuada. Nunc ut mi sed mauris imperdiet porttitor quis quis urna. Pellentesque fermentum augue commodo eleifend rhoncus. Aliquam a erat facilisis mi interdum cursus. Duis ligula magna, pharetra vitae accumsan sed, accumsan eget ligula.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nullam enim dolor, facilisis dapibus pretium sit amet, posuere non nunc. Aenean volutpat, erat consectetur semper accumsan, augue nisi feugiat sem, ut consequat elit nisl sit amet lacus. Donec sodales libero eu dui tincidunt, vitae pulvinar magna faucibus. Etiam euismod nisl justo. Donec lorem massa, vulputate sit amet velit id, molestie sagittis massa. Nullam vel efficitur ante. Nullam dignissim ligula nisl, non posuere elit accumsan vitae. Pellentesque placerat lacinia maximus. Aenean in suscipit massa. Suspendisse egestas leo diam, a aliquet eros condimentum vitae.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Aenean sed nunc lobortis nulla sollicitudin commodo. Duis dictum, turpis id fermentum vestibulum, risus urna semper erat, egestas auctor leo est vitae mi. Etiam lectus felis, venenatis ac posuere a, hendrerit non velit. Proin id mattis neque, et eleifend magna. Praesent congue eros a pretium blandit. Vestibulum vulputate lectus id erat scelerisque, at sollicitudin metus volutpat. Curabitur hendrerit eu nisi eget rutrum. Nulla facilisi. Mauris varius enim neque, a luctus mauris dapibus nec. Nunc porttitor, nisi eget ultricies ornare, nunc dolor blandit felis, vestibulum iaculis sapien nisi et diam. Donec vehicula dui sit amet placerat aliquet. Aenean finibus ex urna, in consequat massa fringilla et. Aliquam at ullamcorper eros. Vivamus sem lorem, iaculis ac imperdiet eget, mollis vel neque.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Donec justo nisl, lobortis sit amet elit at, consequat accumsan leo. Phasellus at justo urna. Phasellus molestie felis vitae volutpat dignissim. Nam vel leo eu diam ultricies tincidunt. Vestibulum venenatis urna a libero accumsan, eu posuere enim finibus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In pretium pulvinar convallis.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Donec ultrices in felis et tincidunt. Suspendisse volutpat blandit erat, non malesuada eros mattis in. In elementum turpis at mi porttitor accumsan. Pellentesque viverra, orci et viverra sollicitudin, nulla turpis maximus diam, id pulvinar odio augue eu ipsum. In porttitor leo sit amet velit rhoncus molestie. Nam in tempus nisl. Phasellus hendrerit consequat sem. Nulla sollicitudin velit eu nunc congue, id tincidunt diam congue. Nulla lacinia malesuada blandit. Curabitur vehicula erat at urna eleifend commodo. Ut ultricies fringilla sapien, in tincidunt magna. Nunc vel enim eget arcu imperdiet cursus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Aenean rutrum orci a tempor pulvinar. Aliquam ut nibh sed quam hendrerit ultrices. Proin sodales ac leo in tempor. Nulla id condimentum urna. Vivamus vitae metus nec risus mollis porttitor. Donec quis euismod neque, gravida malesuada tellus. Nunc sem lacus, fringilla at lectus nec, semper tempus ipsum.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Sed iaculis sit amet neque id molestie. Suspendisse ipsum enim, eleifend ut imperdiet sollicitudin, auctor vitae eros. Praesent venenatis nisi velit, id maximus risus congue blandit. Cras cursus eget augue vel sollicitudin. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam congue, ligula nec semper pretium, diam urna sagittis turpis, at venenatis mauris ipsum quis velit. Suspendisse elementum cursus pellentesque. Proin accumsan mauris arcu, a pretium lectus lobortis id. Nullam congue tellus in ullamcorper varius. Quisque non mi quis est pharetra tincidunt eget congue enim. Nulla tempus ac neque ac suscipit. Sed porta, dui vel euismod sagittis, velit nibh malesuada ipsum, in consequat est nibh eget arcu. Nam imperdiet sagittis justo et fermentum. Etiam lobortis nibh interdum orci bibendum, a interdum risus fermentum. Proin in ante tincidunt neque molestie sodales at non diam.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nulla est dui, eleifend non aliquam sed, posuere ut ex. Aliquam dolor justo, blandit at arcu id, dignissim vestibulum sapien. Phasellus tristique ipsum vel risus facilisis cursus. Suspendisse hendrerit dignissim est ac pulvinar. Mauris tempor auctor orci, vitae commodo arcu laoreet sit amet. Aliquam hendrerit turpis a risus pharetra consectetur. Sed convallis quis nunc vel laoreet. Morbi sollicitudin pharetra dui sed porttitor. Praesent quis elementum quam, vitae rutrum mi.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"In tempus sollicitudin ultrices. Vivamus hendrerit ligula id maximus dapibus. Integer a aliquet nunc, sed accumsan diam. Curabitur faucibus varius enim, non elementum felis venenatis nec. Etiam purus tortor, rutrum at arcu ac, ornare vulputate dui. In consectetur luctus volutpat. Nulla sed eros pharetra, porta elit eu, pellentesque erat. Maecenas faucibus cursus malesuada. Praesent blandit mauris ullamcorper massa congue, sagittis sodales neque varius. Vivamus viverra sodales tortor non gravida. Proin in nibh nec orci maximus porta quis sed arcu. Morbi a dapibus ipsum, quis ornare lectus. Donec ut ante turpis. Sed felis justo, molestie vel felis ac, auctor blandit lacus. In at auctor mauris. Aenean consectetur vulputate blandit.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Maecenas luctus, enim vel suscipit convallis, lorem libero volutpat eros, ut laoreet augue mauris non diam. Curabitur ut ornare leo. Vivamus nec augue sed velit sagittis hendrerit sed nec tortor. Nullam volutpat velit id feugiat convallis. Mauris non mi id nibh ornare sagittis. Fusce luctus quis ex vestibulum consectetur. Proin fermentum neque et varius ornare. Vivamus quis nibh quam. Nullam et neque eget augue euismod pretium consectetur sit amet mi. Curabitur fringilla nibh vitae massa aliquam, ut finibus lorem facilisis. Nullam sodales tristique magna convallis viverra. Morbi interdum, nisi vel posuere congue, orci purus hendrerit turpis, non pellentesque tellus libero eget sem.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nulla nec euismod quam, in mattis enim. In dapibus non eros eu dapibus. Nam lorem leo, luctus id cursus et, euismod et eros. Quisque eget interdum nisl. Vestibulum sed nibh non quam iaculis scelerisque. Quisque ut fermentum mauris, sit amet scelerisque mauris. Vestibulum vel eros at enim rhoncus porttitor. Duis vel mauris scelerisque, interdum quam vel, mollis leo. Praesent sit amet tortor facilisis, dictum leo sit amet, ullamcorper ex. Donec ultrices scelerisque nunc accumsan vehicula. Curabitur ultricies mollis turpis, eget ornare massa congue in. Donec nisl neque, pellentesque rhoncus nunc rutrum, porta commodo elit. Suspendisse potenti. Cras non est quis ligula molestie sodales in eget ex.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Nulla sed tincidunt felis. Phasellus gravida odio in eros aliquet tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin vitae aliquam sapien. Vivamus tincidunt rhoncus pretium. Integer pellentesque feugiat sapien nec tristique. Suspendisse libero dui, consectetur eu nibh sed, sodales interdum nulla. Nunc in risus porta nunc lacinia laoreet at ut odio. Duis velit metus, pharetra in quam lobortis, porta accumsan turpis. Donec in sapien egestas, cursus diam sit amet, eleifend nisl. Integer at augue id nunc sagittis vulputate cursus ac mauris.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Vestibulum est est, sodales non ultrices non, venenatis eu felis. Nulla felis urna, consectetur a purus ut, fermentum tempus magna. Phasellus ut dui tincidunt neque interdum congue ut at ante. Nulla blandit eros id libero vestibulum consequat. Maecenas gravida tincidunt felis ut auctor. In vehicula, ligula eu eleifend pulvinar, neque ex interdum quam, id cursus neque turpis non lorem. Nunc id libero dapibus, iaculis mi et, tempor massa. Vestibulum id gravida dui. Nulla vitae ipsum at lectus commodo blandit ac sed neque.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Morbi magna purus, volutpat sed pulvinar non, bibendum quis est. Cras semper nulla augue, quis elementum orci congue malesuada. Nulla et rutrum arcu. Pellentesque dignissim pharetra lacus. Etiam eu quam tincidunt, commodo tortor non, dictum mauris. Fusce aliquam maximus ante a pretium. Nulla ut lacus orci. Morbi sollicitudin auctor placerat. Integer at porttitor orci. Ut volutpat orci ante, nec venenatis quam mollis sit amet.\\r\\n\" + \r\n\t\t\t\t\"\\r\\n\" + \r\n\t\t\t\t\"Donec volutpat, leo auctor congue iaculis, tellus urna feugiat lorem, id laoreet velit sem porttitor diam. Quisque interdum volutpat metus ac pellentesque. Etiam nec nunc sed urna vestibulum posuere ut vitae metus. Duis ac tortor scelerisque, fermentum erat a, blandit purus. Donec ac nunc ipsum. Duis.\";\r\n\t\treturn forceLower ? text.toLowerCase() : text;\r\n\t}\r\n\r\n\tpublic static String[] getListOfWords() {\r\n\t\t// Words in the dictionary.\r\n\t\tString[] wordList = { \"the\", \"of\", \"and\", \"a\", \"to\", \"in\", \"is\", \"be\",\r\n\t\t\t\t\"that\", \"was\", \"world\", \"awesome\", \"he\", \"for\", \"it\", \"with\",\r\n\t\t\t\t\"as\", \"his\", \"I\", \"on\", \"have\", \"at\", \"by\", \"not\", \"surely\",\r\n\t\t\t\t\"they\", \"this\", \"attract\", \"computer\", \"had\", \"are\", \"but\",\r\n\t\t\t\t\"from\", \"or\", \"she\", \"an\", \"which\", \"you\", \"one\", \"we\", \"all\",\r\n\t\t\t\t\"were\", \"her\", \"would\", \"there\", \"their\", \"will\", \"when\",\r\n\t\t\t\t\"who\", \"him\", \"been\", \"has\", \"more\", \"if\", \"no\", \"out\", \"do\",\r\n\t\t\t\t\"so\", \"can\", \"what\", \"up\", \"said\", \"about\", \"other\", \"into\",\r\n\t\t\t\t\"than\", \"its\", \"time\", \"only\", \"could\", \"new\", \"them\", \"man\",\r\n\t\t\t\t\"some\", \"these\", \"then\", \"two\", \"first\", \"May\", \"any\", \"like\",\r\n\t\t\t\t\"now\", \"my\", \"such\", \"make\", \"over\", \"our\", \"even\", \"most\",\r\n\t\t\t\t\"me\", \"state\", \"after\", \"also\", \"made\", \"many\", \"did\", \"must\",\r\n\t\t\t\t\"before\", \"back\", \"see\", \"through\", \"way\", \"where\", \"get\",\r\n\t\t\t\t\"much\", \"go\", \"well\", \"your\", \"know\", \"should\", \"down\", \"work\",\r\n\t\t\t\t\"year\", \"because\", \"come\", \"people\", \"just\", \"say\", \"each\",\r\n\t\t\t\t\"those\", \"take\", \"day\", \"good\", \"how\", \"long\", \"Mr\", \"own\",\r\n\t\t\t\t\"too\", \"little\", \"use\", \"us\", \"very\", \"great\", \"still\", \"men\",\r\n\t\t\t\t\"here\", \"life\", \"both\", \"between\", \"old\", \"under\", \"last\",\r\n\t\t\t\t\"never\", \"place\", \"same\", \"another\", \"think\", \"abuse\", \"house\",\r\n\t\t\t\t\"while\", \"high\", \"right\", \"might\", \"came\", \"off\", \"find\",\r\n\t\t\t\t\"states\", \"since\", \"used\", \"give\", \"against\", \"three\",\r\n\t\t\t\t\"himself\", \"look\", \"few\", \"general\", \"heart\", \"hand\", \"school\",\r\n\t\t\t\t\"resin\", \"part\", \"small\", \"American\", \"home\", \"during\",\r\n\t\t\t\t\"number\", \"again\", \"Mrs\", \"around\", \"thought\", \"went\",\r\n\t\t\t\t\"without\", \"however\", \"govern\", \"don't\", \"does\", \"got\",\r\n\t\t\t\t\"public\", \"United\", \"point\", \"end\", \"become\", \"head\", \"once\",\r\n\t\t\t\t\"course\", \"fact\", \"upon\", \"need\", \"system\", \"set\", \"every\",\r\n\t\t\t\t\"trend\", \"war\", \"put\", \"form\", \"water\", \"took\", \"program\",\r\n\t\t\t\t\"present\", \"government\", \"thing\", \"told\", \"possible\", \"group\",\r\n\t\t\t\t\"large\", \"until\", \"always\", \"city\", \"didn't\", \"order\", \"away\",\r\n\t\t\t\t\"called\", \"want\", \"eyes\", \"something\", \"unite\", \"going\",\r\n\t\t\t\t\"face\", \"far\", \"asked\", \"interest\", \"later\", \"show\", \"knew\",\r\n\t\t\t\t\"though\", \"less\", \"night\", \"early\", \"almost\", \"let\", \"open\",\r\n\t\t\t\t\"enough\", \"side\", \"case\", \"days\", \"yet\", \"better\", \"nothing\",\r\n\t\t\t\t\"tell\", \"problem\", \"toward\", \"given\", \"why\", \"national\",\r\n\t\t\t\t\"room\", \"young\", \"social\", \"light\", \"business\", \"president\",\r\n\t\t\t\t\"help\", \"power\", \"country\", \"next\", \"things\", \"word\", \"looked\",\r\n\t\t\t\t\"real\", \"John\", \"line\", \"second\", \"church\", \"seem\", \"certain\",\r\n\t\t\t\t\"big\", \"Four\", \"felt\", \"several\", \"children\", \"service\",\r\n\t\t\t\t\"feel\", \"important\", \"rather\", \"name\", \"per\", \"among\", \"often\",\r\n\t\t\t\t\"turn\", \"development\", \"developmentcomputer\", \"keep\", \"family\", \"seemed\", \"white\",\r\n\t\t\t\t\"company\", \"mind\", \"members\", \"others\", \"within\", \"done\",\r\n\t\t\t\t\"along\", \"turned\", \"god\", \"sense\", \"week\", \"best\", \"change\",\r\n\t\t\t\t\"kind\", \"began\", \"child\", \"ever\", \"law\", \"matter\", \"least\",\r\n\t\t\t\t\"means\", \"question\", \"act\", \"close\", \"mean\", \"leave\", \"itself\",\r\n\t\t\t\t\"force\", \"study\", \"York\", \"action\", \"it's\", \"door\",\r\n\t\t\t\t\"experience\", \"human\", \"result\", \"times\", \"run\", \"different\",\r\n\t\t\t\t\"car\", \"example\", \"hands\", \"whole\", \"center\", \"although\",\r\n\t\t\t\t\"call\", \"Five\", \"inform\", \"gave\", \"plan\", \"woman\", \"boy\",\r\n\t\t\t\t\"feet\", \"provide\", \"taken\", \"thus\", \"body\", \"play\", \"seen\",\r\n\t\t\t\t\"today\", \"having\", \"cost\", \"perhaps\", \"field\", \"local\",\r\n\t\t\t\t\"really\", \"am\", \"increase\", \"reason\", \"themselves\", \"clear\",\r\n\t\t\t\t\"I'm\", \"information\", \"figure\", \"late\", \"above\", \"history\",\r\n\t\t\t\t\"love\", \"girl\", \"held\", \"special\", \"move\", \"person\", \"whether\",\r\n\t\t\t\t\"college\", \"sure\", \"probably\", \"either\", \"seems\", \"cannot\",\r\n\t\t\t\t\"art\", \"free\", \"across\", \"death\", \"quite\", \"street\", \"value\",\r\n\t\t\t\t\"anything\", \"making\", \"past\", \"brought\", \"moment\", \"control\",\r\n\t\t\t\t\"office\", \"heard\", \"problems\", \"became\", \"full\", \"near\",\r\n\t\t\t\t\"half\", \"nature\", \"hold\", \"live\", \"available\", \"known\",\r\n\t\t\t\t\"board\", \"effect\", \"already\", \"Economic\", \"money\", \"position\",\r\n\t\t\t\t\"believe\", \"age\", \"together\", \"shall\", \"TRUE\", \"political\",\r\n\t\t\t\t\"court\", \"report\", \"level\", \"rate\", \"air\", \"pay\", \"community\",\r\n\t\t\t\t\"complete\", \"music\", \"necessary\", \"society\", \"behind\", \"type\",\r\n\t\t\t\t\"read\", \"idea\", \"wanted\", \"land\", \"party\", \"class\", \"organize\",\r\n\t\t\t\t\"return\", \"department\", \"education\", \"following\", \"mother\",\r\n\t\t\t\t\"sound\", \"ago\", \"nation\", \"voice\", \"six\", \"bring\", \"wife\",\r\n\t\t\t\t\"common\", \"south\", \"strong\", \"town\", \"book\", \"students\",\r\n\t\t\t\t\"hear\", \"hope\", \"able\", \"industry\", \"stand\", \"tax\", \"west\",\r\n\t\t\t\t\"meet\", \"particular\", \"cut\", \"short\", \"stood\", \"university\",\r\n\t\t\t\t\"spirit\", \"start\", \"total\", \"future\", \"front\", \"low\",\r\n\t\t\t\t\"century\", \"Washington\", \"usually\", \"care\", \"recent\",\r\n\t\t\t\t\"evidence\", \"further\", \"million\", \"simple\", \"road\",\r\n\t\t\t\t\"sometimes\", \"support\", \"view\", \"fire\", \"says\", \"hard\",\r\n\t\t\t\t\"morning\", \"table\", \"left\", \"situation\", \"try\", \"outside\",\r\n\t\t\t\t\"lines\", \"surface\", \"ask\", \"modern\", \"top\", \"peace\",\r\n\t\t\t\t\"personal\", \"member\", \"minutes\", \"lead\", \"schools\", \"talk\",\r\n\t\t\t\t\"consider\", \"gone\", \"soon\", \"father\", \"ground\", \"living\",\r\n\t\t\t\t\"months\", \"therefore\", \"America\", \"started\", \"longer\", \"Dr\",\r\n\t\t\t\t\"dark\", \"various\", \"finally\", \"hour\", \"north\", \"third\", \"fall\",\r\n\t\t\t\t\"greater\", \"pressure\", \"stage\", \"expected\", \"secretary\",\r\n\t\t\t\t\"needed\", \"That's\", \"kept\", \"eye\", \"values\", \"union\",\r\n\t\t\t\t\"private\", \"alone\", \"black\", \"required\", \"space\", \"subject\",\r\n\t\t\t\t\"english\", \"month\", \"understand\", \"I'll\", \"nor\", \"answer\",\r\n\t\t\t\t\"moved\", \"amount\", \"conditions\", \"direct\", \"red\", \"student\",\r\n\t\t\t\t\"rest\", \"nations\", \"heart\", \"costs\", \"record\", \"picture\",\r\n\t\t\t\t\"taking\", \"couldn't\", \"hours\", \"deal\", \"forces\", \"everything\",\r\n\t\t\t\t\"write\", \"coming\", \"effort\", \"market\", \"island\", \"wall\",\r\n\t\t\t\t\"purpose\", \"basis\", \"east\", \"lost\", \"St\", \"except\", \"letter\",\r\n\t\t\t\t\"looking\", \"property\", \"Miles\", \"difference\", \"entire\", \"else\",\r\n\t\t\t\t\"color\", \"followed\", \"feeling\", \"son\", \"makes\", \"friend\",\r\n\t\t\t\t\"basic\", \"cold\", \"including\", \"single\", \"attention\", \"note\",\r\n\t\t\t\t\"cause\", \"hundred\", \"step\", \"paper\", \"developed\", \"tried\",\r\n\t\t\t\t\"simply\", \"can't\", \"story\", \"committee\", \"inside\", \"reached\",\r\n\t\t\t\t\"easy\", \"appear\", \"include\", \"accord\", \"Actually\", \"remember\",\r\n\t\t\t\t\"beyond\", \"dead\", \"shown\", \"fine\", \"religious\", \"continue\",\r\n\t\t\t\t\"ten\", \"defense\", \"getting\", \"Central\", \"beginning\", \"instead\",\r\n\t\t\t\t\"river\", \"received\", \"doing\", \"employ\", \"trade\", \"terms\",\r\n\t\t\t\t\"trying\", \"friends\", \"sort\", \"administration\", \"higher\",\r\n\t\t\t\t\"cent\", \"expect\", \"food\", \"building\", \"religion\", \"meeting\",\r\n\t\t\t\t\"ready\", \"walked\", \"follow\", \"earth\", \"speak\", \"passed\",\r\n\t\t\t\t\"foreign\", \"NATURAL\", \"medical\", \"training\", \"County\", \"list\",\r\n\t\t\t\t\"floor\", \"piece\", \"especially\", \"indeed\", \"stop\", \"wasn't\",\r\n\t\t\t\t\"England\", \"difficult\", \"likely\", \"Suddenly\", \"moral\", \"plant\",\r\n\t\t\t\t\"bad\", \"club\", \"needs\", \"international\", \"working\",\r\n\t\t\t\t\"countries\", \"develop\", \"drive\", \"reach\", \"police\", \"sat\",\r\n\t\t\t\t\"charge\", \"farm\", \"fear\", \"test\", \"determine\", \"hair\",\r\n\t\t\t\t\"results\", \"stock\", \"trouble\", \"happened\", \"growth\", \"square\",\r\n\t\t\t\t\"William\", \"cases\", \"effective\", \"serve\", \"miss\", \"involved\",\r\n\t\t\t\t\"doctor\", \"earlier\", \"increased\", \"being\", \"blue\", \"hall\",\r\n\t\t\t\t\"particularly\", \"boys\", \"paid\", \"sent\", \"production\",\r\n\t\t\t\t\"district\", \"using\", \"thinking\", \"concern\", \"Christian\",\r\n\t\t\t\t\"press\", \"girls\", \"wide\", \"usual\", \"direction\", \"feed\",\r\n\t\t\t\t\"trial\", \"walk\", \"begin\", \"weeks\", \"points\", \"respect\",\r\n\t\t\t\t\"certainly\", \"ideas\", \"industrial\", \"methods\", \"operation\",\r\n\t\t\t\t\"addition\", \"association\", \"combine\", \"knowledge\", \"decided\",\r\n\t\t\t\t\"temperature\", \"statement\", \"Yes\", \"below\", \"game\", \"nearly\",\r\n\t\t\t\t\"science\", \"directly\", \"horse\", \"influence\", \"size\", \"showed\",\r\n\t\t\t\t\"build\", \"throughout\", \"questions\", \"character\", \"foot\",\r\n\t\t\t\t\"Kennedy\", \"firm\", \"reading\", \"husband\", \"doubt\", \"services\",\r\n\t\t\t\t\"according\", \"lay\", \"stay\", \"programs\", \"anyone\", \"average\",\r\n\t\t\t\t\"French\", \"spring\", \"former\", \"summer\", \"bill\", \"lot\",\r\n\t\t\t\t\"chance\", \"due\", \"comes\", \"army\", \"actual\", \"Southern\",\r\n\t\t\t\t\"neither\", \"relate\", \"rise\", \"evening\", \"normal\", \"wish\",\r\n\t\t\t\t\"visit\", \"population\", \"remain\", \"measure\", \"merely\",\r\n\t\t\t\t\"arrange\", \"condition\", \"decision\", \"account\", \"opportunity\",\r\n\t\t\t\t\"pass\", \"demand\", \"strength\", \"window\", \"active\", \"deep\",\r\n\t\t\t\t\"degree\", \"ran\", \"western\", \"E\", \"sales\", \"continued\", \"fight\",\r\n\t\t\t\t\"heavy\", \"arm\", \"standard\", \"generally\", \"carry\", \"hot\",\r\n\t\t\t\t\"provided\", \"serious\", \"led\", \"wait\", \"hotel\", \"opened\",\r\n\t\t\t\t\"performance\", \"maybe\", \"station\", \"changes\", \"literature\",\r\n\t\t\t\t\"marry\", \"claim\", \"works\", \"bed\", \"wrong\", \"main\", \"unit\",\r\n\t\t\t\t\"George\", \"hit\", \"planning\", \"supply\", \"systems\", \"add\",\r\n\t\t\t\t\"chief\", \"officer\", \"Soviet\", \"pattern\", \"stopped\", \"price\",\r\n\t\t\t\t\"success\", \"lack\", \"myself\", \"truth\", \"freedom\", \"manner\",\r\n\t\t\t\t\"quality\", \"gun\", \"manufacture\", \"clearly\", \"share\",\r\n\t\t\t\t\"movement\", \"length\", \"ways\", \"burn\", \"forms\", \"Organization\",\r\n\t\t\t\t\"break\", \"somewhat\", \"efforts\", \"cover\", \"meaning\", \"progress\",\r\n\t\t\t\t\"treatment\", \"beautiful\", \"placed\", \"happy\", \"attack\",\r\n\t\t\t\t\"apparently\", \"blood\", \"groups\", \"carried\", \"sign\", \"radio\",\r\n\t\t\t\t\"dance\", \"I've\", \"regard\", \"man's\", \"train\", \"herself\",\r\n\t\t\t\t\"numbers\", \"corner\", \"REACTION\", \"immediately\", \"language\",\r\n\t\t\t\t\"running\", \"recently\", \"shake\", \"larger\", \"lower\", \"machine\",\r\n\t\t\t\t\"attempt\", \"learn\", \"couple\", \"race\", \"audience\", \"Oh\",\r\n\t\t\t\t\"middle\", \"brown\", \"date\", \"health\", \"persons\",\r\n\t\t\t\t\"understanding\", \"arms\", \"daily\", \"suppose\", \"additional\",\r\n\t\t\t\t\"hospital\", \"pool\", \"technical\", \"served\", \"declare\",\r\n\t\t\t\t\"described\", \"current\", \"poor\", \"steps\", \"reported\", \"sun\",\r\n\t\t\t\t\"based\", \"produce\", \"determined\", \"receive\", \"park\", \"staff\",\r\n\t\t\t\t\"faith\", \"responsibility\", \"Europe\", \"latter\", \"British\",\r\n\t\t\t\t\"season\", \"equal\", \"learned\", \"practice\", \"green\", \"writing\",\r\n\t\t\t\t\"ones\", \"choice\", \"fiscal\", \"term\", \"watch\", \"scene\",\r\n\t\t\t\t\"activity\", \"product\", \"types\", \"ball\", \"heat\", \"clothe\",\r\n\t\t\t\t\"lived\", \"distance\", \"parent\", \"letters\", \"returned\",\r\n\t\t\t\t\"forward\", \"obtained\", \"offer\", \"specific\", \"straight\", \"fix\",\r\n\t\t\t\t\"division\", \"slowly\", \"shot\", \"poet\", \"seven\", \"moving\",\r\n\t\t\t\t\"mass\", \"plane\", \"proper\", \"propose\", \"drink\", \"obviously\",\r\n\t\t\t\t\"plans\", \"whatever\", \"afternoon\", \"figures\", \"parts\",\r\n\t\t\t\t\"approve\", \"saying\", \"born\", \"immediate\", \"fame\", \"gives\",\r\n\t\t\t\t\"extent\", \"justice\", \"cars\", \"mark\", \"pretty\", \"opinion\",\r\n\t\t\t\t\"ahead\", \"glass\", \"refuse\", \"enter\", \"completely\", \"send\",\r\n\t\t\t\t\"desire\", \"judge\", \"none\", \"waiting\", \"popular\", \"Democratic\",\r\n\t\t\t\t\"film\", \"mouth\", \"Corps\", \"importance\", \"touch\", \"director\",\r\n\t\t\t\t\"ship\", \"there's\", \"council\", \"EFFECTS\", \"event\", \"worth\",\r\n\t\t\t\t\"existence\", \"designed\", \"hardly\", \"indicated\", \"analysis\",\r\n\t\t\t\t\"established\", \"products\", \"growing\", \"patient\", \"rule\",\r\n\t\t\t\t\"bridge\", \"pain\", \"base\", \"check\", \"cities\", \"elements\",\r\n\t\t\t\t\"leaders\", \"discussion\", \"limited\", \"sit\", \"Thomas\",\r\n\t\t\t\t\"agreement\", \"gas\", \"factors\", \"marriage\", \"easily\", \"closed\",\r\n\t\t\t\t\"excite\", \"accept\", \"applied\", \"allow\", \"bit\", \"married\",\r\n\t\t\t\t\"oil\", \"Rhode\", \"shape\", \"interested\", \"strange\", \"compose\",\r\n\t\t\t\t\"professional\", \"remained\", \"news\", \"Despite\", \"beauty\",\r\n\t\t\t\t\"responsible\", \"wonder\", \"spent\", \"tear\", \"unless\", \"eight\",\r\n\t\t\t\t\"permit\", \"covered\", \"Negro\", \"played\", \"I'd\", \"vote\",\r\n\t\t\t\t\"balance\", \"Charles\", \"loss\", \"Commission\", \"original\", \"fair\",\r\n\t\t\t\t\"reasons\", \"studies\", \"exactly\", \"built\", \"behavior\", \"enemy\",\r\n\t\t\t\t\"teeth\", \"bank\", \"die\", \"James\", \"relations\", \"weight\",\r\n\t\t\t\t\"prepared\", \"related\", \"sea\", \"bar\", \"warn\", \"post\", \"trees\",\r\n\t\t\t\t\"official\", \"separate\", \"clay\", \"Sunday\", \"raised\", \"events\",\r\n\t\t\t\t\"thin\", \"dropped\", \"cattle\", \"invite\", \"playing\", \"prevent\",\r\n\t\t\t\t\"detail\", \"standing\", \"grow\", \"places\", \"someone\", \"bright\",\r\n\t\t\t\t\"Talking\", \"meant\", \"print\", \"capital\", \"happen\", \"sides\",\r\n\t\t\t\t\"everyone\", \"facilities\", \"filled\", \"lip\", \"essential\",\r\n\t\t\t\t\"techniques\", \"June\", \"knows\", \"stain\", \"hadn't\", \"dinner\",\r\n\t\t\t\t\"dog\", \"dollars\", \"caught\", \"shout\", \"buy\", \"divide\",\r\n\t\t\t\t\"entered\", \"Chicago\", \"speed\", \"jazz\", \"appoint\", \"governor\",\r\n\t\t\t\t\"institutions\", \"fit\", \"materials\", \"sight\", \"store\",\r\n\t\t\t\t\"dependence\", \"explain\", \"gain\", \"he'd\", \"leadership\", \"quiet\",\r\n\t\t\t\t\"realize\", \"parents\", \"Communist\", \"neighbor\", \"round\",\r\n\t\t\t\t\"included\", \"kitchen\", \"thousand\", \"Christ\", \"isn't\",\r\n\t\t\t\t\"radiation\", \"broad\", \"stops\", \"failure\", \"retire\", \"election\",\r\n\t\t\t\t\"primary\", \"king\", \"books\", \"command\", \"edge\", \"ember\",\r\n\t\t\t\t\"March\", \"sitting\", \"conference\", \"bottom\", \"lady\", \"advise\",\r\n\t\t\t\t\"churches\", \"model\", \"battle\", \"giving\", \"sport\", \"address\",\r\n\t\t\t\t\"considerable\", \"spread\", \"funds\", \"trip\", \"youth\",\r\n\t\t\t\t\"CONSTRUCTION\", \"rock\", \"regular\", \"changed\", \"boat\", \"memory\",\r\n\t\t\t\t\"successful\", \"captain\", \"hell\", \"brother\", \"murder\", \"quick\",\r\n\t\t\t\t\"moreover\", \"highly\", \"difficulty\", \"inch\", \"saw\", \"clean\",\r\n\t\t\t\t\"collect\", \"camp\", \"experiment\", \"shows\", \"Authority\", \"older\",\r\n\t\t\t\t\"lord\", \"variety\", \"material\", \"frame\", \"distinguish\",\r\n\t\t\t\t\"scientific\", \"introduce\", \"principal\", \"Jack\", \"kill\",\r\n\t\t\t\t\"collection\", \"fell\", \"entertain\", \"pieces\", \"management\",\r\n\t\t\t\t\"otherwise\", \"security\", \"danger\", \"entirely\", \"civil\",\r\n\t\t\t\t\"frequently\", \"advertise\", \"records\", \"secret\", \"title\",\r\n\t\t\t\t\"impossible\", \"yesterday\", \"fast\", \"Mike\", \"produced\", \"favor\",\r\n\t\t\t\t\"noted\", \"caused\", \"lose\", \"purposes\", \"solid\", \"song\",\r\n\t\t\t\t\"corporation\", \"lie\", \"winter\", \"dress\", \"electric\", \"key\",\r\n\t\t\t\t\"dry\", \"reduce\", \"fresh\", \"goes\", \"hill\", \"names\", \"slow\",\r\n\t\t\t\t\"quickly\", \"telephone\", \"threaten\", \"oppose\", \"deliver\",\r\n\t\t\t\t\"officers\", \"expression\", \"published\", \"famous\", \"pray\",\r\n\t\t\t\t\"adopt\", \"London\", \"clothes\", \"laws\", \"citizens\", \"announced\",\r\n\t\t\t\t\"minute\", \"master\", \"sharp\", \"advantage\", \"greatest\",\r\n\t\t\t\t\"relation\", \"Mary\", \"leaving\", \"gray\", \"manager\", \"animal\",\r\n\t\t\t\t\"object\", \"bottle\", \"draw\", \"honor\", \"recognize\", \"drop\",\r\n\t\t\t\t\"intend\", \"relationship\", \"opposite\", \"sources\", \"poetry\",\r\n\t\t\t\t\"ability\", \"assistance\", \"operating\", \"bear\", \"join\", \"climb\",\r\n\t\t\t\t\"companies\", \"exist\", \"fixed\", \"gradual\", \"possibility\",\r\n\t\t\t\t\"hunt\", \"spoke\", \"satisfy\", \"units\", \"neck\", \"sleep\",\r\n\t\t\t\t\"doesn't\", \"finished\", \"carefully\", \"facts\", \"nice\",\r\n\t\t\t\t\"practical\", \"save\", \"takes\", \"allowed\", \"wine\", \"remind\",\r\n\t\t\t\t\"rich\", \"financial\", \"dream\", \"knife\", \"stations\", \"civilize\",\r\n\t\t\t\t\"Rose\", \"cool\", \"died\", \"thick\", \"imagine\", \"literary\", \"bind\",\r\n\t\t\t\t\"inches\", \"earn\", \"familiar\", \"seeing\", \"distribution\",\r\n\t\t\t\t\"marked\", \"coffee\", \"rules\", \"slip\", \"apply\", \"page\", \"beside\",\r\n\t\t\t\t\"daughter\", \"Relatively\", \"classes\", \"explore\", \"stated\",\r\n\t\t\t\t\"German\", \"musical\", \"smile\", \"significant\", \"block\", \"mix\",\r\n\t\t\t\t\"reports\", \"PROPOSED\", \"shelter\", \"presence\", \"Affairs\",\r\n\t\t\t\t\"named\", \"ordinary\", \"circumstances\", \"mile\", \"sweep\",\r\n\t\t\t\t\"remains\", \"admire\", \"Catholic\", \"dust\", \"operations\", \"rain\",\r\n\t\t\t\t\"tree\", \"nobody\", \"Henry\", \"Robert\", \"village\", \"advance\",\r\n\t\t\t\t\"offered\", \"agree\", \"mechanic\", \"upper\", \"occasion\",\r\n\t\t\t\t\"requirements\", \"capacity\", \"appears\", \"travel\", \"article\",\r\n\t\t\t\t\"houses\", \"valley\", \"beat\", \"opening\", \"box\", \"evil\",\r\n\t\t\t\t\"succeed\", \"surround\", \"application\", \"slightly\", \"remembered\",\r\n\t\t\t\t\"interests\", \"warm\", \"subjects\", \"search\", \"presented\", \"shoe\",\r\n\t\t\t\t\"sweet\", \"interesting\", \"membership\", \"suggest\", \"notice\",\r\n\t\t\t\t\"connection\", \"extreme\", \"exchange\", \"flow\", \"spend\",\r\n\t\t\t\t\"everybody\", \"poems\", \"campaign\", \"win\", \"forced\", \"freeze\",\r\n\t\t\t\t\"nine\", \"eat\", \"newspaper\", \"please\", \"escape\", \"lives\",\r\n\t\t\t\t\"swim\", \"file\", \"wind\", \"provides\", \"shop\", \"apartment\",\r\n\t\t\t\t\"fashion\", \"reasonable\", \"created\", \"Germany\", \"watched\",\r\n\t\t\t\t\"cells\", \"session\", \"somehow\", \"fully\", \"whose\", \"teacher\",\r\n\t\t\t\t\"raise\", \"recognized\", \"unity\", \"Providence\", \"reference\",\r\n\t\t\t\t\"explained\", \"twenty\", \"Russian\", \"features\", \"shoulder\",\r\n\t\t\t\t\"sir\", \"forest\", \"studied\", \"Sam\", \"signal\", \"chair\",\r\n\t\t\t\t\"reduced\", \"procedure\", \"forth\", \"limit\", \"disturb\",\r\n\t\t\t\t\"universe\", \"mentioned\", \"pick\", \"reality\", \"differences\",\r\n\t\t\t\t\"soft\", \"traditional\", \"Mission\", \"flat\", \"looks\", \"picked\",\r\n\t\t\t\t\"weather\", \"smaller\", \"leg\", \"chairman\", \"ancient\", \"narrow\",\r\n\t\t\t\t\"fellow\", \"twist\", \"belief\", \"excellent\", \"rights\",\r\n\t\t\t\t\"vocational\", \"laid\", \"politics\", \"fill\", \"response\",\r\n\t\t\t\t\"struggle\", \"disappear\", \"prove\", \"duty\", \"FOLLOWS\", \"editor\",\r\n\t\t\t\t\"welcome\", \"anode\", \"possess\", \"hearing\", \"BUILDINGS\", \"ideal\",\r\n\t\t\t\t\"scientist\", \"formed\", \"watching\", \"circle\", \"ought\", \"garden\",\r\n\t\t\t\t\"library\", \"accuse\", \"message\", \"slight\", \"junior\", \"knock\",\r\n\t\t\t\t\"empty\", \"protection\", \"treated\", \"birth\", \"expressed\",\r\n\t\t\t\t\"planned\", \"choose\", \"confuse\", \"Virginia\", \"killed\",\r\n\t\t\t\t\"frighten\", \"stayed\", \"worry\", \"surprise\", \"aside\",\r\n\t\t\t\t\"photograph\", \"removed\", \"turning\", \"Jr\", \"pull\", \"personnel\",\r\n\t\t\t\t\"agency\", \"pointed\", \"speech\", \"listen\", \"November\", \"sample\",\r\n\t\t\t\t\"Louis\", \"motor\", \"selected\", \"Berlin\", \"CLAIMS\", \"spot\",\r\n\t\t\t\t\"strike\", \"increasing\", \"exercise\", \"handle\", \"hole\", \"Leader\",\r\n\t\t\t\t\"baby\", \"ride\", \"avoid\", \"cross\", \"twice\", \"commercial\",\r\n\t\t\t\t\"failed\", \"prompt\", \"fat\", \"fourth\", \"visitor\", \"interior\",\r\n\t\t\t\t\"Jewish\", \"wing\", \"desk\", \"faculty\", \"forget\", \"operate\",\r\n\t\t\t\t\"stair\", \"besides\", \"relief\", \"standards\", \"France\", \"perfect\",\r\n\t\t\t\t\"pour\", \"Nevertheless\", \"brief\", \"Jones\", \"kick\", \"attend\",\r\n\t\t\t\t\"plus\", \"solution\", \"wage\", \"individuals\", \"powers\",\r\n\t\t\t\t\"minister\", \"taste\", \"discovered\", \"pulled\", \"hire\", \"writer\",\r\n\t\t\t\t\"verb\", \"preach\", \"friendly\", \"observed\", \"fan\", \"connect\",\r\n\t\t\t\t\"Fig\", \"count\", \"egg\", \"items\", \"mention\", \"Texas\",\r\n\t\t\t\t\"calculate\", \"platform\", \"drag\", \"mere\", \"tomorrow\", \"faces\",\r\n\t\t\t\t\"pure\", \"fighting\", \"resources\", \"increases\", \"assumed\",\r\n\t\t\t\t\"broke\", \"coast\", \"strict\", \"whom\", \"Russia\", \"qualify\",\r\n\t\t\t\t\"Morgan\", \"victory\", \"fields\", \"pleasure\", \"contain\", \"fold\",\r\n\t\t\t\t\"review\", \"April\", \"teach\", \"Richard\", \"whisper\", \"chosen\",\r\n\t\t\t\t\"metal\", \"PRINCIPLES\", \"competition\", \"railroad\", \"safe\",\r\n\t\t\t\t\"proved\", \"carrying\", \"horses\", \"kiss\", \"Mercer\", \"wheel\",\r\n\t\t\t\t\"sail\", \"wants\", \"compared\", \"relieve\", \"approximately\",\r\n\t\t\t\t\"wood\", \"historical\", \"persuade\", \"smiled\", \"crowd\", \"motion\",\r\n\t\t\t\t\"shore\", \"suit\", \"calls\", \"seat\", \"deserve\", \"San\", \"snow\",\r\n\t\t\t\t\"double\", \"educational\", \"neighborhood\", \"relative\",\r\n\t\t\t\t\"teachers\", \"Independent\", \"puzzle\", \"nose\", \"dogs\", \"waited\",\r\n\t\t\t\t\"naturally\", \"stone\", \"origin\", \"Rome\", \"wild\", \"scale\",\r\n\t\t\t\t\"tremble\", \"drawn\", \"guess\", \"communism\", \"absence\", \"roof\",\r\n\t\t\t\t\"sections\", \"sky\", \"walls\", \"Aircraft\", \"complain\",\r\n\t\t\t\t\"independence\", \"busy\", \"elect\", \"revolution\", \"roar\",\r\n\t\t\t\t\"willing\", \"League\", \"mine\", \"nurse\", \"liberal\", \"completed\",\r\n\t\t\t\t\"poem\", \"dollar\", \"ordered\", \"levels\", \"ton\", \"settled\",\r\n\t\t\t\t\"allowance\", \"bitter\", \"realized\", \"let's\", \"moon\",\r\n\t\t\t\t\"sensitive\", \"servant\", \"hunger\", \"China\", \"sale\",\r\n\t\t\t\t\"appearance\", \"lips\", \"policies\", \"actions\", \"strengthen\",\r\n\t\t\t\t\"Monday\", \"onto\", \"directed\", \"leading\", \"machinery\",\r\n\t\t\t\t\"theater\", \"Paris\", \"Frank\", \"somewhere\", \"Statements\", \"mill\",\r\n\t\t\t\t\"projects\", \"starting\", \"hat\", \"ruin\", \"depend\", \"stands\",\r\n\t\t\t\t\"signs\", \"families\", \"stir\", \"Khrushchev\", \"largely\", \"punish\",\r\n\t\t\t\t\"drew\", \"breathe\", \"amuse\", \"characteristic\", \"electronic\",\r\n\t\t\t\t\"pale\", \"pictures\", \"destroy\", \"expense\", \"somebody\",\r\n\t\t\t\t\"completion\", \"disappoint\", \"fifty\", \"found\", \"soil\", \"flame\",\r\n\t\t\t\t\"enjoy\", \"bless\", \"emotional\", \"promise\", \"she'd\", \"wave\",\r\n\t\t\t\t\"commerce\", \"Jury\", \"bay\", \"tempt\", \"correct\", \"asking\",\r\n\t\t\t\t\"content\", \"estimated\", \"conscious\", \"shine\", \"teaching\",\r\n\t\t\t\t\"catch\", \"dish\", \"Saturday\", \"greet\", \"background\", \"flood\",\r\n\t\t\t\t\"insect\", \"worse\", \"yellow\", \"occurred\", \"afraid\", \"ceremony\",\r\n\t\t\t\t\"decrease\", \"trust\", \"yourself\", \"legs\", \"you've\",\r\n\t\t\t\t\"communication\", \"describe\", \"sincere\", \"decide\", \"leaf\",\r\n\t\t\t\t\"encourage\", \"rub\", \"declared\", \"cry\", \"bite\", \"July\", \"lung\",\r\n\t\t\t\t\"significance\", \"helped\", \"gross\", \"apart\", \"disease\",\r\n\t\t\t\t\"issues\", \"scratch\", \"dictionary\", \"risk\", \"broadcast\", \"drum\",\r\n\t\t\t\t\"representative\", \"uncle\", \"cutting\", \"Jesus\", \"neglect\",\r\n\t\t\t\t\"depth\", \"substantial\", \"GETS\", \"adventure\", \"beg\", \"entrance\",\r\n\t\t\t\t\"plays\", \"throw\", \"ends\", \"Arts\", \"alive\", \"confidence\",\r\n\t\t\t\t\"intellectual\", \"cheer\", \"properties\", \"experiments\", \"nut\",\r\n\t\t\t\t\"plenty\", \"beneath\", \"closely\", \"description\", \"melt\", \"swear\",\r\n\t\t\t\t\"tall\", \"loose\", \"area\", \"bury\", \"measured\", \"request\",\r\n\t\t\t\t\"ourselves\", \"stream\", \"wipe\", \"band\", \"fingers\", \"creature\",\r\n\t\t\t\t\"Hanover\", \"attorney\", \"load\", \"passing\", \"billion\", \"earnest\",\r\n\t\t\t\t\"discussed\", \"translate\", \"achievement\", \"headquarters\",\r\n\t\t\t\t\"inquiry\", \"rapidly\", \"express\", \"hesitate\", \"guard\", \"jobs\",\r\n\t\t\t\t\"borrow\", \"owe\", \"Phil\", \"California\", \"ambition\", \"supposed\",\r\n\t\t\t\t\"lake\", \"they're\", \"slope\", \"Typical\", \"spite\", \"wore\", \"dear\",\r\n\t\t\t\t\"employees\", \"map\", \"pair\", \"spin\", \"one's\", \"praise\",\r\n\t\t\t\t\"imagination\", \"hung\", \"instrument\", \"plow\", \"holding\",\r\n\t\t\t\t\"objects\", \"straighten\", \"dominant\", \"scarce\", \"ring\",\r\n\t\t\t\t\"matters\", \"creep\", \"plain\", \"resolution\", \"credit\", \"period\",\r\n\t\t\t\t\"improve\", \"maintenance\", \"seize\", \"Laos\", \"we'll\", \"dozen\",\r\n\t\t\t\t\"located\", \"dig\", \"towards\", \"curse\", \"major\", \"breath\",\r\n\t\t\t\t\"weigh\", \"comfort\", \"federal\", \"guests\", \"priest\", \"sell\",\r\n\t\t\t\t\"bodies\", \"female\", \"primarily\", \"cousin\", \"grew\", \"spiritual\",\r\n\t\t\t\t\"dine\", \"engine\", \"politician\", \"custom\", \"educate\",\r\n\t\t\t\t\"individual\", \"job\", \"Tom\", \"cook\", \"grass\", \"mail\",\r\n\t\t\t\t\"salesman\", \"nail\", \"tap\", \"wet\", \"bedroom\", \"sufficient\",\r\n\t\t\t\t\"chest\", \"dramatic\", \"silence\", \"behave\", \"breakfast\",\r\n\t\t\t\t\"sudden\", \"passage\", \"scatter\", \"objection\", \"unusual\",\r\n\t\t\t\t\"argument\", \"policy\", \"powerful\", \"throat\", \"formal\", \"rapid\",\r\n\t\t\t\t\"Parker\", \"wrap\", \"luck\", \"grind\", \"rifle\", \"HIGHEST\", \"loan\",\r\n\t\t\t\t\"represent\", \"skill\", \"spell\", \"broken\", \"arch\", \"angle\",\r\n\t\t\t\t\"sick\", \"swell\", \"blind\", \"Contemporary\", \"engineer\",\r\n\t\t\t\t\"military\", \"boundary\", \"location\", \"homes\", \"boil\",\r\n\t\t\t\t\"officials\", \"operator\", \"Senate\", \"lend\", \"hearts\", \"embers\", \"abused\", \"resins\", \"trendy\", \"ssdsy\" };\r\n\t\treturn wordList;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/BTreePrinter.java",
    "content": "package CtCILibrary;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Collections;\r\nimport java.util.List;\r\n\r\npublic class BTreePrinter {\r\n\r\n    public static <T extends Comparable<?>> void printNode(TreeNode root) {\r\n        int maxLevel = BTreePrinter.maxLevel(root);\r\n\r\n        printNodeInternal(Collections.singletonList(root), 1, maxLevel);\r\n    }\r\n\r\n    private static <T extends Comparable<?>> void printNodeInternal(List<TreeNode> nodes, int level, int maxLevel) {\r\n        if (nodes.isEmpty() || BTreePrinter.isAllElementsNull(nodes))\r\n            return;\r\n\r\n        int floor = maxLevel - level;\r\n        int endgeLines = (int) Math.pow(2, (Math.max(floor - 1, 0)));\r\n        int firstSpaces = (int) Math.pow(2, (floor)) - 1;\r\n        int betweenSpaces = (int) Math.pow(2, (floor + 1)) - 1;\r\n\r\n        BTreePrinter.printWhitespaces(firstSpaces);\r\n\r\n        List<TreeNode> newNodes = new ArrayList<TreeNode>();\r\n        for (TreeNode node : nodes) {\r\n            if (node != null) {\r\n                System.out.print(node.data);\r\n                newNodes.add(node.left);\r\n                newNodes.add(node.right);\r\n            } else {\r\n                newNodes.add(null);\r\n                newNodes.add(null);\r\n                System.out.print(\" \");\r\n            }\r\n\r\n            BTreePrinter.printWhitespaces(betweenSpaces);\r\n        }\r\n        System.out.println(\"\");\r\n\r\n        for (int i = 1; i <= endgeLines; i++) {\r\n            for (int j = 0; j < nodes.size(); j++) {\r\n                BTreePrinter.printWhitespaces(firstSpaces - i);\r\n                if (nodes.get(j) == null) {\r\n                    BTreePrinter.printWhitespaces(endgeLines + endgeLines + i + 1);\r\n                    continue;\r\n                }\r\n\r\n                if (nodes.get(j).left != null)\r\n                    System.out.print(\"/\");\r\n                else\r\n                    BTreePrinter.printWhitespaces(1);\r\n\r\n                BTreePrinter.printWhitespaces(i + i - 1);\r\n\r\n                if (nodes.get(j).right != null)\r\n                    System.out.print(\"\\\\\");\r\n                else\r\n                    BTreePrinter.printWhitespaces(1);\r\n\r\n                BTreePrinter.printWhitespaces(endgeLines + endgeLines - i);\r\n            }\r\n\r\n            System.out.println(\"\");\r\n        }\r\n\r\n        printNodeInternal(newNodes, level + 1, maxLevel);\r\n    }\r\n\r\n    private static void printWhitespaces(int count) {\r\n        for (int i = 0; i < count; i++)\r\n            System.out.print(\" \");\r\n    }\r\n\r\n    private static <T extends Comparable<?>> int maxLevel(TreeNode node) {\r\n        if (node == null)\r\n            return 0;\r\n\r\n        return Math.max(BTreePrinter.maxLevel(node.left), BTreePrinter.maxLevel(node.right)) + 1;\r\n    }\r\n\r\n    private static <T> boolean isAllElementsNull(List<T> list) {\r\n        for (Object object : list) {\r\n            if (object != null)\r\n                return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/BitVector.java",
    "content": "package CtCILibrary;\r\n\r\npublic class BitVector {\r\n\tprivate static int DATA_SIZE = 32;\r\n\tprivate int length;\r\n\tprivate int[] vector;\r\n\t\r\n\tpublic BitVector(int length) {\r\n\t\tthis.length = length;\r\n\t\tif (length % DATA_SIZE == 0) {\r\n\t\t\tvector = new int[length / DATA_SIZE];\r\n\t\t} else {\r\n\t\t\tvector = new int[length / DATA_SIZE + 1];\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic int length() {\r\n\t\treturn length;\r\n\t}\r\n\t\r\n\tpublic boolean get(int i) {\r\n\t\tint b = vector[i / DATA_SIZE];\r\n\t\tint bit_index = i % DATA_SIZE;\r\n\r\n\t\tif (((b >> bit_index) & 1) == 1) {\r\n\t\t\treturn true;\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tfor (int k : vector) {\r\n\t\t\tfor (int i = 0; i < DATA_SIZE; i++) {\r\n\t\t\t\tif ((k >> i & 1) == 1) {\r\n\t\t\t\t\tSystem.out.print(1);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSystem.out.print(0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tSystem.out.println();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void set(int i, boolean flag) {\r\n\t\tif (i >= 0 && i < length) {\r\n\t\t\tint mask = ~(1 << i);\r\n\t\t\tint b = vector[i / DATA_SIZE] & mask;\r\n\t\t\tif (flag) {\r\n\t\t\t\tvector[i / DATA_SIZE] = b | (1 << i);\r\n\t\t\t} else {\r\n\t\t\t\tvector[i / DATA_SIZE] = b;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/HashMapList.java",
    "content": "package CtCILibrary;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.Set;\r\n\r\npublic class HashMapList<T, E> {\r\n\tprivate HashMap<T, ArrayList<E>> map = new HashMap<T, ArrayList<E>>();\r\n\t\r\n\t/* Insert item into list at key. */\r\n\tpublic void put(T key, E item) {\r\n\t\tif (!map.containsKey(key)) {\r\n\t\t\tmap.put(key, new ArrayList<E>());\r\n\t\t}\r\n\t\tmap.get(key).add(item);\r\n\t}\r\n\t\r\n\t/* Insert list of items at key. */\r\n\tpublic void put(T key, ArrayList<E> items) {\r\n\t\tmap.put(key, items);\r\n\t}\r\n\t\r\n\t/* Get list of items at key. */\r\n\tpublic ArrayList<E> get(T key) {\r\n\t\treturn map.get(key);\r\n\t}\r\n\t\r\n\t/* Check if hashmaplist contains key. */\r\n\tpublic boolean containsKey(T key) {\r\n\t\treturn map.containsKey(key);\r\n\t}\r\n\t\r\n\t/* Check if list at key contains value. */\r\n\tpublic boolean containsKeyValue(T key, E value) {\r\n\t\tArrayList<E> list = get(key);\r\n\t\tif (list == null) return false;\r\n\t\treturn list.contains(value);\r\n\t}\r\n\t\r\n\t/* Get the list of keys. */\r\n\tpublic Set<T> keySet() {\r\n\t\treturn map.keySet();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn map.toString();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/LinkedListNode.java",
    "content": "package CtCILibrary;\r\n\r\npublic class LinkedListNode {\r\n\tpublic LinkedListNode next;\r\n\tpublic LinkedListNode prev;\r\n\tpublic LinkedListNode last;\r\n\tpublic int data;\r\n\tpublic LinkedListNode(int d, LinkedListNode n, LinkedListNode p) {\r\n\t\tdata = d;\r\n\t\tsetNext(n);\r\n\t\tsetPrevious(p);\r\n\t}\r\n\t\r\n\tpublic LinkedListNode(int d) {\r\n\t\tdata = d;\r\n\t}\t\r\n\t\r\n\tpublic LinkedListNode() { }\r\n\r\n\tpublic void setNext(LinkedListNode n) {\r\n\t\tnext = n;\r\n\t\tif (this == last) {\r\n\t\t\tlast = n;\r\n\t\t}\r\n\t\tif (n != null && n.prev != this) {\r\n\t\t\tn.setPrevious(this);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void setPrevious(LinkedListNode p) {\r\n\t\tprev = p;\r\n\t\tif (p != null && p.next != this) {\r\n\t\t\tp.setNext(this);\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic String printForward() {\r\n\t\tif (next != null) {\r\n\t\t\treturn data + \"->\" + next.printForward();\r\n\t\t} else {\r\n\t\t\treturn ((Integer) data).toString();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic LinkedListNode clone() {\r\n\t\tLinkedListNode next2 = null;\r\n\t\tif (next != null) {\r\n\t\t\tnext2 = next.clone();\r\n\t\t}\r\n\t\tLinkedListNode head2 = new LinkedListNode(data, next2, null);\r\n\t\treturn head2;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/TreeNode.java",
    "content": "package CtCILibrary;\r\n\r\n/* One node of a binary tree. The data element stored is a single \r\n * character.\r\n */\r\npublic class TreeNode {\r\n\tpublic int data;      \r\n\tpublic TreeNode left;    \r\n\tpublic TreeNode right; \r\n\tpublic TreeNode parent;\r\n\tprivate int size = 0;\r\n\r\n\tpublic TreeNode(int d) {\r\n\t\tdata = d;\r\n\t\tsize = 1;\r\n\t}\r\n\t\r\n\tprivate void setLeftChild(TreeNode left) {\r\n\t\tthis.left = left;\r\n\t\tif (left != null) {\r\n\t\t\tleft.parent = this;\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate void setRightChild(TreeNode right) {\r\n\t\tthis.right = right;\r\n\t\tif (right != null) {\r\n\t\t\tright.parent = this;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void insertInOrder(int d) {\r\n\t\tif (d <= data) {\r\n\t\t\tif (left == null) {\r\n\t\t\t\tsetLeftChild(new TreeNode(d));\r\n\t\t\t} else {\r\n\t\t\t\tleft.insertInOrder(d);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (right == null) {\r\n\t\t\t\tsetRightChild(new TreeNode(d));\r\n\t\t\t} else {\r\n\t\t\t\tright.insertInOrder(d);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsize++;\r\n\t}\r\n\t\r\n\tpublic int size() {\r\n\t\treturn size;\r\n\t}\r\n\t\r\n\tpublic boolean isBST() {\r\n\t\tif (left != null) {\r\n\t\t\tif (data < left.data || !left.isBST()) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (right != null) {\r\n\t\t\tif (data >= right.data || !right.isBST()) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tpublic int height() {\r\n\t\tint leftHeight = left != null ? left.height() : 0;\r\n\t\tint rightHeight = right != null ? right.height() : 0;\r\n\t\treturn 1 + Math.max(leftHeight, rightHeight);\r\n\t}\r\n\t\r\n\tpublic TreeNode find(int d) {\r\n\t\tif (d == data) {\r\n\t\t\treturn this;\r\n\t\t} else if (d <= data) {\r\n\t\t\treturn left != null ? left.find(d) : null;\r\n\t\t} else if (d > data) {\r\n\t\t\treturn right != null ? right.find(d) : null;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t\r\n\tprivate static TreeNode createMinimalBST(int arr[], int start, int end){\r\n\t\tif (end < start) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tint mid = (start + end) / 2;\r\n\t\tTreeNode n = new TreeNode(arr[mid]);\r\n\t\tn.setLeftChild(createMinimalBST(arr, start, mid - 1));\r\n\t\tn.setRightChild(createMinimalBST(arr, mid + 1, end));\r\n\t\treturn n;\r\n\t}\r\n\t\r\n\tpublic static TreeNode createMinimalBST(int[] array) {\r\n\t\treturn createMinimalBST(array, 0, array.length - 1);\r\n\t}\r\n\t\r\n\tpublic void print() {\r\n\t\tBTreePrinter.printNode(this);\r\n\t}\r\n} \r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/Trie.java",
    "content": "package CtCILibrary;\r\n\r\nimport java.util.ArrayList;\r\n\r\n\r\n/* Implements a trie. We store the input list of words in tries so\r\n * that we can efficiently find words with a given prefix. \r\n */ \r\npublic class Trie\r\n{\r\n    // The root of this trie.\r\n    private TrieNode root;\r\n\r\n    /* Takes a list of strings as an argument, and constructs a trie that stores these strings. */\r\n    public Trie(ArrayList<String> list) {\r\n        root = new TrieNode();\r\n        for (String word : list) {\r\n            root.addWord(word);\r\n        }\r\n    }  \r\n    \r\n\r\n    /* Takes a list of strings as an argument, and constructs a trie that stores these strings. */    \r\n    public Trie(String[] list) {\r\n        root = new TrieNode();\r\n        for (String word : list) {\r\n            root.addWord(word);\r\n        }\r\n    }    \r\n\r\n    /* Checks whether this trie contains a string with the prefix passed\r\n     * in as argument.\r\n     */\r\n    public boolean contains(String prefix, boolean exact) {\r\n        TrieNode lastNode = root;\r\n        int i = 0;\r\n        for (i = 0; i < prefix.length(); i++) {\r\n            lastNode = lastNode.getChild(prefix.charAt(i));\r\n            if (lastNode == null) {\r\n                return false;\t \r\n            }\r\n        }\r\n        return !exact || lastNode.terminates();\r\n    }\r\n    \r\n    public boolean contains(String prefix) {\r\n    \treturn contains(prefix, false);\r\n    }\r\n    \r\n    public TrieNode getRoot() {\r\n    \treturn root;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/CtCILibrary/CtCILibrary/TrieNode.java",
    "content": "package CtCILibrary;\r\n\r\nimport java.util.HashMap;\r\n\r\n/* One node in the trie. Most of the logic of the trie is implemented\r\n * in this class.\r\n */\r\npublic class TrieNode {\r\n    /* The children of this node in the trie.*/\r\n    private HashMap<Character, TrieNode> children;\r\n    private boolean terminates = false;\r\n\r\n    // The character stored in this node as data.\r\n    private char character;\t\r\n\r\n\t/* Constructs a trie node and stores this character as the node's value.\r\n\t * Initializes the list of child nodes of this node to an empty hash map. */\r\n    public TrieNode() {\r\n    \tchildren = new HashMap<Character, TrieNode>();\r\n    }\r\n\r\n    /* Constructs a trie node and stores in the node the char passed in\r\n     * as the argument. Initializes the list of child nodes of this\r\n     * node to an empty hash map.\r\n     */\r\n    public TrieNode(char character) {\r\n        this();\r\n        this.character = character;\r\n    }\r\n\r\n    /* Returns the character data stored in this node. */\r\n    public char getChar() {\r\n        return character;\r\n    }\r\n\r\n    /* Add this word to the trie, and recursively create the child\r\n     * nodes. */\r\n    public void addWord(String word) {\r\n    \tif (word == null || word.isEmpty()) {\r\n    \t\treturn;\r\n    \t}\r\n    \t\r\n        char firstChar = word.charAt(0);\r\n\r\n        TrieNode child = getChild(firstChar);\r\n        if (child == null) {\r\n            child = new TrieNode(firstChar);\r\n            children.put(firstChar, child);\r\n        } \r\n\r\n        if (word.length() > 1) {\r\n            child.addWord(word.substring(1));\r\n        } else {\r\n        \tchild.setTerminates(true);\r\n        }\r\n    }\r\n\r\n    /* Find a child node of this node that has the char argument as its\r\n     * data. Return null if no such child node is present in the trie.\r\n     */\r\n    public TrieNode getChild(char c) {\r\n    \treturn children.get(c);\r\n    }\r\n\r\n    /* Returns whether this node represents the end of a complete word. */\r\n    public boolean terminates() {\r\n    \treturn terminates;\r\n    }\r\n    \r\n    /* Set whether this node is the end of a complete word.*/\r\n    public void setTerminates(boolean t) {\r\n    \tterminates = t;\r\n    }\r\n}\r\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_01.java",
    "content": "package Big_O;\n\npublic class Ex_01 {\n\tpublic static int sum(int n) {\n\t\tif (n <= 0) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn n + sum(n-1);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint s = sum(4);\n\t\tSystem.out.println(s);\n\t}\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_02.java",
    "content": "package Big_O;\n\npublic class Ex_02 {\n\tpublic static int pairSum(int a, int b) {\n\t\treturn a + b;\n\t}\n\t\n\tpublic static int pairSumSequence(int n) {\n\t\tint sum = 0;\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tsum += pairSum(i, i + 1);\n\t\t}\n\t\treturn sum;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint s = pairSumSequence(4);\n\t\tSystem.out.println(s);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_03.java",
    "content": "package Big_O;\n\npublic class Ex_03 {\n\tpublic static void minAndMax1(int[] array) {\n\t\tint min = Integer.MAX_VALUE;\n\t\tint max = Integer.MIN_VALUE;\n\t\tfor (int x : array) {\n\t\t\tif (x < min) min = x;\n\t\t\tif (x > max) max = x;\n\t\t}\n\t\tSystem.out.println(min + \", \" + max);\n\t}\n\t\n\tpublic static void minAndMax2(int[] array) {\n\t\tint min = Integer.MAX_VALUE;\n\t\tint max = Integer.MIN_VALUE;\n\t\tfor (int x : array) {\n\t\t\tif (x < min) min = x;\n\t\t}\n\t\tfor (int x : array) {\n\t\t\tif (x > max) max = x;\n\t\t}\t\t\n\t\tSystem.out.println(min + \", \" + max);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 2, 5, 2, 2, 5, -1, 9, 3};\n\t\tminAndMax1(array);\n\t\tminAndMax2(array);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_04.java",
    "content": "package Big_O;\n\npublic class Ex_04 {\n\tpublic static void foo(int[] arrA, int[] arrB) {\n\t\tfor (int a : arrA) {\n\t\t\tSystem.out.println(a);\n\t\t}\n\t\tfor (int b : arrB) {\n\t\t\tSystem.out.println(b);\n\t\t}\n\t}\n\t\n\tpublic static void bar(int[] arrA, int[] arrB) {\n\t\tfor (int a : arrA) {\n\t\t\tfor (int b : arrB) {\n\t\t\t\tSystem.out.println(a + \",\" + b);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] arrA = {1, 2, 5, 2, 2, 5, -1, 9, 3};\n\t\tint[] arrB = {5, 2, 1, 0, 2};\n\t\tfoo(arrA, arrB);\n\t\tbar(arrA, arrB);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_05.java",
    "content": "package Big_O;\n\npublic class Ex_05 {\n\tpublic static int f(int n) {\n\t\tif (n <= 0) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn f(n - 1) + f(n - 1);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tf(1);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_06.java",
    "content": "package Big_O;\n\npublic class Ex_06 {\n\tpublic static void foo(int[] array) {\n\t\tint sum = 0;\n\t\tint product = 1;\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tsum += array[i];\n\t\t}\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tproduct *= array[i];\n\t\t}\t\n\t\tSystem.out.println(sum + \", \" + product);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 2, 5, 2, 2, 5, -1, 9, 3};\n\t\tfoo(array);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_07.java",
    "content": "package Big_O;\n\npublic class Ex_07 {\n\tpublic static void printPairs(int[] array) {\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tfor (int j = 0; j < array.length; j++) {\n\t\t\t\tSystem.out.println(array[i] + \",\" + array[j]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {0, 1, 2, 3};\n\t\tprintPairs(array);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_08.java",
    "content": "package Big_O;\n\npublic class Ex_08 {\n\tpublic static void printUnorderedPairs(int[] array) {\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tfor (int j = i; j < array.length; j++) {\n\t\t\t\tSystem.out.println(array[i] + \",\" + array[j]);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {0, 1, 2, 3};\n\t\tprintUnorderedPairs(array);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_09.java",
    "content": "package Big_O;\n\npublic class Ex_09 {\n\tpublic static void printUnorderedPairs(int[] arrayA, int[] arrayB) {\n\t\tfor (int i = 0; i < arrayA.length; i++) {\n\t\t\tfor (int j = 0; j < arrayB.length; j++) {\n\t\t\t\tif (arrayA[i] < arrayB[j]) {\n\t\t\t\t\tSystem.out.println(arrayA[i] + \",\" + arrayB[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] arrayA = {0, 1, 2, 3};\n\t\tint[] arrayB = {4, 5, 6};\n\t\tprintUnorderedPairs(arrayA, arrayB);\n\t}\t\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_10.java",
    "content": "package Big_O;\n\npublic class Ex_10 {\n\tpublic static void printUnorderedPairs(int[] arrayA, int[] arrayB) {\n\t\tfor (int i = 0; i < arrayA.length; i++) {\n\t\t\tfor (int j = 0; j < arrayB.length; j++) {\n\t\t\t\tfor (int k = 0; k < 1000; k++) {\n\t\t\t\t\tSystem.out.println(arrayA[i] + \",\" + arrayB[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] arrayA = {0, 1, 2, 3};\n\t\tint[] arrayB = {4, 5, 6};\n\t\tprintUnorderedPairs(arrayA, arrayB);\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_11.java",
    "content": "package Big_O;\n\npublic class Ex_11 {\n\tpublic static void reverse(int[] array) {\n\t    for (int i = 0; i < array.length / 2; i++) {\n\t        int other = array.length - i - 1;\n\t        int temp = array[i];\n\t        array[i] = array[other];\n\t        array[other] = temp;\n\t    }\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {0, 1, 2, 3, 4, 5};\n\t\treverse(array);\n\t\tfor (int x : array) {\n\t\t\tSystem.out.println(x);\n\t\t}\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_14.java",
    "content": "package Big_O;\n\npublic class Ex_14 {\n\tpublic static boolean isPrime(int n) {\n\t    for (int x = 2; x * x <= n; x++) {\n\t        if (n % x == 0) {\n\t            return false;\n\t        }\n\t    }\n\t    return true;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] array = {2, 3, 4, 5, 6, 7, 8, 9, 10};\n\t\tfor (int x : array) {\n\t\t\tboolean isPrimeNumber = isPrime(x);\n\t\t\tif (isPrimeNumber) {\n\t\t\t\tSystem.out.println(x + \": prime\");\n\t\t\t} else {\n\t\t\t\tSystem.out.println(x + \": not prime\");\n\t\t\t}\n\t\t}\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_15.java",
    "content": "package Big_O;\n\npublic class Ex_15 {\n\tpublic static int factorial(int n) {\n\t    if (n < 0) {\n\t        return -1;\n\t    } else if (n == 0) {\n\t        return 1;\n\t    } else {\n\t        return n * factorial(n - 1);\n\t    }\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(factorial(4));\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_16.java",
    "content": "package Big_O;\n\npublic class Ex_16 {\n\tpublic static void permutation(String str) {\n\t\tpermutation(str, \"\");\n\t}\n\t\n\tpublic static void permutation(String str, String prefix) {\n\t\tif (str.length() == 0) {\n\t\t\tSystem.out.println(prefix);\n\t\t} else {\n\t\t\tfor (int i = 0; i < str.length(); i++) {\n\t\t\t\tString rem = str.substring(0, i) + str.substring(i + 1);\n\t\t\t\tpermutation(rem, prefix + str.charAt(i));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tpermutation(\"abc\");\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_17.java",
    "content": "package Big_O;\n\npublic class Ex_17 {\n\tpublic static int fib(int n) {\n\t    if (n <= 0) return 0;\n\t    else if (n == 1) return 1;    \n\t    return fib(n - 1) + fib(n - 2);\n\t}\n\n\t\n\tpublic static void main(String[] args) {\n\t\tfor (int i = 0; i < 6; i++) {\n\t\t\tSystem.out.println(i + \": \" + fib(i));\n\t\t}\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_18.java",
    "content": "package Big_O;\n\npublic class Ex_18 {\n\tpublic static void allFib(int n) {\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tSystem.out.println(i + \": \" + fib(i));\n\t\t}\n\t}\n\t\n\tpublic static int fib(int n) {\n\t    if (n <= 0) return 0;\n\t    else if (n == 1) return 1;    \n\t    return fib(n - 1) + fib(n - 2);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tallFib(6);\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_19.java",
    "content": "package Big_O;\n\npublic class Ex_19 {\n\tpublic static void allFib(int n) {\n\t\tint[] memo = new int[n + 1];\n\t\tfor (int i = 0; i < n; i++) {\n\t\t\tSystem.out.println(i + \": \" + fib(i, memo));\n\t\t}\n\t}\t\n\t\n\tpublic static int fib(int n, int[] memo) {\n\t    if (n <= 0) return 0;\n\t    else if (n == 1) return 1;\n\t    else if (memo[n] > 0) return memo[n];\n\t    \n\t    memo[n] = fib(n - 1, memo) + fib(n - 2, memo);\n\t    return memo[n];\n\t}\n\n\t\n\tpublic static void main(String[] args) {\n\t\tallFib(6);\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Ex_20.java",
    "content": "package Big_O;\n\npublic class Ex_20 {\n\tpublic static int powersOf2(int n) {\n\t    if (n == 1) {\n\t        System.out.println(1);\n\t        return 1;\n\t    } else {\n\t        int prev = powersOf2(n / 2);\n\t        int curr = prev * 2;\n\t        System.out.println(curr);\n\t        return curr;\n\t    }\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tpowersOf2(100);\n\t}\t\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_01.java",
    "content": "package Big_O;\n\npublic class Q_01 {\n\n\tpublic static int product(int a, int b) {\n\t    int sum = 0;\n\t    for (int i = 0; i < b; i++) {\n\t        sum += a;\n\t    }\n\t    return sum;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(product(5, 6));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_02.java",
    "content": "package Big_O;\n\npublic class Q_02 {\n\n\tpublic static int power(int a, int b) {\n\t\tif (b < 0) {\n\t\t\treturn 0; // error\n\t\t} else if (b == 0) {\n\t\t\treturn 1; \n\t\t} else {\n\t\t\treturn a * power(a, b - 1);\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(power(3, 4));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_03.java",
    "content": "package Big_O;\n\npublic class Q_03 {\n\n\tpublic static int mod(int a, int b) {\n\t    if (b <= 0) {\n\t        return -1;\n\t    }\n\t    int div = a / b;\n\t    return a - div * b;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(mod(3, 6));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_04.java",
    "content": "package Big_O;\n\npublic class Q_04 {\n\n\tpublic static int div(int a, int b) {\n\t\tint count = 0;\n\t\tint sum = b;\n\t\twhile (sum <= a) {\n\t\t\tsum += b;\n\t\t\tcount++;\n\t\t}\n\t\treturn count;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(div(12, 4));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_05.java",
    "content": "package Big_O;\n\npublic class Q_05 {\n\n\tpublic static int sqrt(int n) {\n\t    return sqrt_helper(n, 1, n);\n\t} \n\t\n\tpublic static int sqrt_helper(int n, int min, int max) {\n\t    if (max < min) return -1; // no square root\n\t    \n\t    int guess = (min + max) / 2;\n\t    if (guess * guess == n) { // found it!\n\t        return guess;\n\t    } else if (guess * guess < n) { // too low\n\t        return sqrt_helper(n, guess + 1, max); // try higher\n\t    } else { // too high\n\t        return sqrt_helper(n, min, guess - 1); // try lower\n\t    }\n\t}\n\t        \n\t\n\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(sqrt(26));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_06.java",
    "content": "package Big_O;\n\npublic class Q_06 {\n\n\tpublic static int sqrt(int n) {\n\t    for (int guess = 1; guess * guess <= n; guess++) {\n\t        if (guess * guess == n) {\n\t            return guess;\n\t        }\n\t    }\n\t    return -1;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(sqrt(26));\n\t}\n\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_09.java",
    "content": "package Big_O;\n\npublic class Q_09 {\n\t\n\tpublic static int[] copyArray(int[] array) {\n\t\tint[] copy = new int[0];\n\t\tfor (int value : array) {\n\t\t\tcopy = appendToNew(copy, value);\n\t\t}\n\t\treturn copy;\n\t}\n\n\tpublic static int[] appendToNew(int[] array, int value) {\n\t\t// copy all elements over to new array\n\t\tint[] bigger = new int[array.length + 1];\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tbigger[i] = array[i];\n\t\t}\n\n\t\t// add new element\n\t\tbigger[bigger.length - 1] = value;\n\t\treturn bigger;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tint[] array = {1, 2, 3, 4, 5, 6};\n\t\tint[] copy = copyArray(array);\n\t\tfor (int x : copy) {\n\t\t\tSystem.out.println(x);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_10.java",
    "content": "package Big_O;\n\npublic class Q_10 {\n\n\tpublic static int sumDigits(int n) {\n\t\tint sum = 0;\n\t\twhile (n > 0) {\n\t\t\tsum += n % 10;\n\t\t\tn /= 10;\n\t\t}\n\t\treturn sum;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(sumDigits(1252));\n\t}\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_11.java",
    "content": "package Big_O;\n\npublic class Q_11 {\n\n\tpublic static int numChars = 26;\n\t\n\tpublic static void printSortedStrings(int remaining) {\n\t\tprintSortedStrings(remaining, \"\");\n\t}\n\t\n\tpublic static void printSortedStrings(int remaining, String prefix) {\n\t\tif (remaining == 0) {\n\t\t\tSystem.out.println(prefix);\n\t\t} else {\n\t\t\tfor (int i = 0; i < numChars; i++) {\n\t\t\t\tchar c = ithLetter(i);\n\t\t\t\tprintSortedStrings(remaining - 1, prefix + c);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static boolean isInOrder(String s) {\n\t\tfor (int i = 1; i < s.length(); i++) {\n\t\t\tint prev = ithLetter(s.charAt(i - 1));\n\t\t\tint curr = ithLetter(s.charAt(i));\n\t\t\tif (prev > curr) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static char ithLetter(int i) {\n\t\treturn (char) (((int) 'a') + i);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tprintSortedStrings(3);\n\t}\n}\n"
  },
  {
    "path": "Java/Introduction/Big_O/Q_12.java",
    "content": "package Big_O;\n\npublic class Q_12 {\n\n\tpublic static int binarySearch(int[] a, int x) {\n\t\tint low = 0;\n\t\tint high = a.length - 1;\n\t\tint mid;\n\t\t\n\t\twhile (low <= high) {\n\t\t\tmid = (low + high) / 2;\n\t\t\tif (a[mid] < x) {\n\t\t\t\tlow = mid + 1;\n\t\t\t} else if (a[mid] > x) {\n\t\t\t\thigh = mid - 1;\n\t\t\t} else {\n\t\t\t\treturn mid;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t\n\tpublic static void mergesort(int[] array) {\n\t\tint[] helper = new int[array.length];\n\t\tmergesort(array, helper, 0, array.length - 1);\n\t}\n\n\tpublic static void mergesort(int[] array, int[] helper, int low, int high) {\n\t\tif (low < high) {\n\t\t\tint middle = (low + high) / 2;\n\t\t\tmergesort(array, helper, low, middle); // Sort left half\n\t\t\tmergesort(array, helper, middle+1, high); // Sort right half\n\t\t\tmerge(array, helper, low, middle, high); // Merge them\n\t\t}\n\t}\n\n\tpublic static void merge(int[] array, int[] helper, int low, int middle, int high) {\n\t\t/* Copy both halves into a helper array */\n\t\tfor (int i = low; i <= high; i++) {\n\t\t\thelper[i] = array[i];\n\t\t}\n\n\t\tint helperLeft = low;\n\t\tint helperRight = middle + 1;\n\t\tint current = low;\n\n\t\t/* Iterate through helper array. Compare the left and right\n\t\t * half, copying back the smaller element from the two halves\n\t\t * into the original array. */\n\t\twhile (helperLeft <= middle && helperRight <= high) {\n\t\t\tif (helper[helperLeft] <= helper[helperRight]) {\n\t\t\t\tarray[current] = helper[helperLeft];\n\t\t\t\thelperLeft++;\n\t\t\t} else { // If right element is smaller than left element\n\t\t\t\tarray[current] = helper[helperRight];\n\t\t\t\thelperRight++;\n\t\t\t}\n\t\t\tcurrent++;\n\t\t}\n\n\t\t/* Copy the rest of the left side of the array into the\n\t\t * target array */\n\t\tint remaining = middle - helperLeft;\n\t\tfor (int i = 0; i <= remaining; i++) {\n\t\t\tarray[current + i] = helper[helperLeft + i];\n\t\t}\n\t}\t\n\t\n\tpublic static int intersection(int[] a, int[] b) {\n\t\tmergesort(b);\n\t\tint intersect = 0;\n\t\t\n\t\tfor (int x : a) {\n\t\t\tif (binarySearch(b, x) >= 0) {\n\t\t\t\tintersect++;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn intersect;\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tint[] a = {1, 3, 5, 7};\n\t\tint[] b = {1, 9, 2, 7};\n\t\tint x = intersection(a, b);\n\t\tSystem.out.println(x);\n\t}\n}\n"
  },
  {
    "path": "Java/Introduction/CompareBinaryToHex/CompareBinaryToHex.java",
    "content": "package CompareBinaryToHex;\r\n\r\npublic class CompareBinaryToHex {\r\n\r\n\tpublic static int digitToValue(char c) {\r\n\t\tif (c >= '0' && c <= '9') {\r\n\t\t\treturn c - '0';\r\n\t\t} else if (c >= 'A' && c <= 'F') {\r\n\t\t\treturn 10 + c - 'A';\r\n\t\t} else if (c >= 'a' && c <= 'f') {\r\n\t\t\treturn 10 + c - 'a';\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\t\r\n\tpublic static int convertFromBase(String number, int base) {\r\n\t\tif (base < 2 || (base > 10 && base != 16)) return -1;\r\n\t\tint value = 0;\r\n\t\tfor (int i = number.length() - 1; i >= 0; i--) {\r\n\t\t\tint digit = digitToValue(number.charAt(i));\r\n\t\t\tif (digit < 0 || digit >= base) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tint exp = number.length() - 1 - i;\r\n\t\t\tvalue += digit * Math.pow(base, exp);\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\t\r\n\tpublic static boolean compareBinToHex(String binary, String hex) {\r\n\t\tint n1 = convertFromBase(binary, 2);\r\n\t\tint n2 = convertFromBase(hex, 16);\r\n\t\tif (n1 < 0 || n2 < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn n1 == n2;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tSystem.out.println(compareBinToHex(\"111001011\", \"1CB\"));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "Java/Introduction/SwapMinMax/SwapMinMax.java",
    "content": "package SwapMinMax;\r\n\r\nimport CtCILibrary.AssortedMethods;\r\n\r\npublic class SwapMinMax {\r\n\t\r\n\tpublic static int getMinIndex(int[] array) {\r\n\t\tint minIndex = 0;\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i] < array[minIndex]) {\r\n\t\t\t\tminIndex = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn minIndex;\r\n\t}\r\n\t\r\n\tpublic static int getMaxIndex(int[] array) {\r\n\t\tint maxIndex = 0;\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i] > array[maxIndex]) {\r\n\t\t\t\tmaxIndex = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn maxIndex;\r\n\t}\r\n\t\r\n\tpublic static void swap(int[] array, int m, int n) {\r\n\t\tint temp = array[m];\r\n\t\tarray[m] = array[n];\r\n\t\tarray[n] = temp;\r\n\t}\r\n\t\r\n\tpublic static void swapMinMaxBetter(int[] array) {\r\n\t\tint minIndex = getMinIndex(array);\r\n\t\tint maxIndex = getMaxIndex(array);\r\n\t\tswap(array, minIndex, maxIndex);\r\n\t}\r\n\r\n\tpublic static void swapMinMax(int[] array) {\r\n\t\tint minIndex = 0;\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i] < array[minIndex]) {\r\n\t\t\t\tminIndex = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tint maxIndex = 0;\r\n\t\tfor (int i = 1; i < array.length; i++) {\r\n\t\t\tif (array[i] > array[maxIndex]) {\r\n\t\t\t\tmaxIndex = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tint temp = array[minIndex];\r\n\t\tarray[minIndex] = array[maxIndex];\r\n\t\tarray[maxIndex] = temp;\r\n\t}\r\n\t\r\n\tpublic static void main(String[] args) {\r\n\t\tint[] array = AssortedMethods.randomArray(10, -10, 10);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t\tswapMinMaxBetter(array);\r\n\t\tSystem.out.println(AssortedMethods.arrayToString(array));\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "README.md",
    "content": "# CtCI-6th-Edition\nSolutions for [Cracking the Coding Interview 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Edition/dp/0984782850) by [Gayle Laakmann McDowell](http://www.gayle.com/).\n\nCrowdsourcing solutions for every widely used programming language. **Contributions welcome**.\n\n## Cloning\n\nSolutions in Java are contained directly in this repo and are the same solutions found\nin [the book](http://www.amazon.com/Cracking-Coding-Interview-6th-Edition/dp/0984782850). Solutions in other programming languages are contributed by the community and each have\ntheir own dedicated repos which are referenced from this repo as git submodules. What this means for cloning:\n\n- If you want to make a local clone of solutions in all languages, you should use the `--recursive` option:\n\n        git clone --recursive https://github.com/careercup/CtCI-6th-Edition.git\n\n- If you're only interested in the Java solutions:\n\n        git clone https://github.com/careercup/CtCI-6th-Edition.git\n\n- If you originally cloned without `--recursive`, and then later decide you want the git submodules too, run:\n\n        git submodule update --init --recursive\n\n## Contributing\n\n### Work Flow\n1. Fork the appropriate repo for your language to your GitHub user. (see [Where to submit pull requests](#where-to-submit-pull-requests))\n2. Write quality code and lint if applicable.\n3. Add tests if applicable.\n4. Open a pull request and provide a descriptive comment for what you did.\n\n### Where to submit pull requests\n\nPull requests pertaining to Java solutions should be submitted to the main [CtCI-6th-Edition repo](https://github.com/careercup/CtCI-6th-Edition). Please submit pull requests for all other languages to the appropriate language-specific repo.\n\n- [CtCI-6th-Edition-Clojure](https://github.com/careercup/CtCI-6th-Edition-Clojure)\n- [CtCI-6th-Edition-C](https://github.com/careercup/CtCI-6th-Edition-C)\n- [CtCI-6th-Edition-cpp](https://github.com/careercup/CtCI-6th-Edition-cpp)\n- [CtCI-6th-Edition-CSharp](https://github.com/careercup/CtCI-6th-Edition-CSharp)\n- [CtCI-6th-Edition-Go](https://github.com/careercup/CtCI-6th-Edition-Go)\n- [CtCI-6th-Edition-Groovy](https://github.com/careercup/CtCI-6th-Edition-Groovy)\n- [CtCI-6th-Edition-Haskell](https://github.com/careercup/CtCI-6th-Edition-Haskell)\n- [CtCI-6th-Edition-JavaScript](https://github.com/careercup/CtCI-6th-Edition-JavaScript)\n- [CtCI-6th-Edition-JavaScript-ES2015](https://github.com/careercup/CtCI-6th-Edition-JavaScript-ES2015)\n- [CtCI-6th-Edition-Julia](https://github.com/careercup/CtCI-6th-Edition-Julia)\n- [CtCI-6th-Edition-Kotlin](https://github.com/careercup/CtCI-6th-Edition-Kotlin)\n- [CtCI-6th-Edition-Objective-C](https://github.com/careercup/CtCI-6th-Edition-Objective-C)\n- [CtCI-6th-Edition-php](https://github.com/careercup/CtCI-6th-Edition-php)\n- [CtCI-6th-Edition-Python](https://github.com/careercup/CtCI-6th-Edition-Python)\n- [CtCI-6th-Edition-Ruby](https://github.com/careercup/CtCI-6th-Edition-Ruby)\n- [CtCI-6th-Edition-Swift](https://github.com/careercup/CtCI-6th-Edition-Swift)\n\n### Adding a new Language\n\nSolutions in other languages are welcome too and should follow this workflow:\n\n1. Create the new repo under your own GitHub user account and start contributing solutions. The repo name should follow this naming convention: `CtCI-6th-Edition-<language>`.\n2. Open an [issue on the CtCI-6th-Edition repo](https://github.com/careercup/CtCI-6th-Edition/issues) to request that your solution repo be promoted to join the careercup GitHub organization and referenced from the main repo as a git submodule.\n3. If your request is approved, navigate to your repo's settings page and select the \"Transfer Ownership\" option, and specify \"careercup\" as the new owner.\n\n"
  }
]