diff --git a/lib/exercises.rb b/lib/exercises.rb index 2cb2bfa..d002867 100644 --- a/lib/exercises.rb +++ b/lib/exercises.rb @@ -2,11 +2,34 @@ # This method will return an array of arrays. # Each subarray will have strings which are anagrams of each other -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n log n)? (Not sure what Ruby's default sort implementation is...) +# Space Complexity: O(n), where n is the number of items in the array def grouped_anagrams(strings) - raise NotImplementedError, "Method hasn't been implemented yet!" + # raise NotImplementedError, "Method hasn't been implemented yet!" + return [] if strings.length == 0 + + grouped_anagrams = [] + hash = {} + i = 0 + + while i <= strings.length - 1 + sorted_word = strings[i].split("").sort.join + + if !hash.key?(sorted_word) + hash[sorted_word] = [strings[i]] + else + hash[sorted_word] << strings[i] + end + + i += 1 + end + + hash.each_value do |words| + grouped_anagrams << words.sort + end + + return grouped_anagrams end # This method will return the k most common elements @@ -17,14 +40,13 @@ def top_k_frequent_elements(list, k) raise NotImplementedError, "Method hasn't been implemented yet!" end - # This method will return the true if the table is still # a valid sudoku table. # Each element can either be a ".", or a digit 1-9 -# The same digit cannot appear twice or more in the same +# The same digit cannot appear twice or more in the same # row, column or 3x3 subgrid # Time Complexity: ? # Space Complexity: ? def valid_sudoku(table) raise NotImplementedError, "Method hasn't been implemented yet!" -end \ No newline at end of file +end diff --git a/test/exercises_test.rb b/test/exercises_test.rb index a649110..26f1705 100644 --- a/test/exercises_test.rb +++ b/test/exercises_test.rb @@ -5,7 +5,7 @@ it "will return [] for an empty array" do #Arrange list = [] - + # Act-Assert expect(grouped_anagrams(list)).must_equal [] end @@ -18,13 +18,14 @@ answer = grouped_anagrams(list) expected_answer = [ - ["ate","eat","tea"], - ["nat","tan"], - ["bat"] + ["ate", "eat", "tea"], + ["nat", "tan"], + ["bat"], ] # Assert answer.each_with_index do |array, index| + puts "**** MY ARRAY #{array}" expect(expected_answer).must_include array.sort end end @@ -42,7 +43,7 @@ ["tar"], ["pop"], ["pan"], - ["pap"] + ["pap"], ] # Assert @@ -59,7 +60,7 @@ answer = grouped_anagrams(list) expected_answer = [ - [ "aet", "ate", "eat", "eta", "tae", "tea"] + ["aet", "ate", "eat", "eta", "tae", "tea"], ] # Assert answer.each_with_index do |array, index| @@ -71,14 +72,14 @@ xdescribe "top_k_frequent_elements" do it "works with example 1" do # Arrange - list = [1,1,1,2,2,3] + list = [1, 1, 1, 2, 2, 3] k = 2 # Act answer = top_k_frequent_elements(list, k) # Assert - expect(answer.sort).must_equal [1,2] + expect(answer.sort).must_equal [1, 2] end it "works with example 2" do @@ -128,22 +129,21 @@ # Assert expect(answer.sort).must_equal [1] end - end xdescribe "valid sudoku" do it "works for the table given in the README" do # Arrange table = [ - ["5","3",".",".","7",".",".",".","."], - ["6",".",".","1","9","5",".",".","."], - [".","9","8",".",".",".",".","6","."], - ["8",".",".",".","6",".",".",".","3"], - ["4",".",".","8",".","3",".",".","1"], - ["7",".",".",".","2",".",".",".","6"], - [".","6",".",".",".",".","2","8","."], - [".",".",".","4","1","9",".",".","5"], - [".",".",".",".","8",".",".","7","9"] + ["5", "3", ".", ".", "7", ".", ".", ".", "."], + ["6", ".", ".", "1", "9", "5", ".", ".", "."], + [".", "9", "8", ".", ".", ".", ".", "6", "."], + ["8", ".", ".", ".", "6", ".", ".", ".", "3"], + ["4", ".", ".", "8", ".", "3", ".", ".", "1"], + ["7", ".", ".", ".", "2", ".", ".", ".", "6"], + [".", "6", ".", ".", ".", ".", "2", "8", "."], + [".", ".", ".", "4", "1", "9", ".", ".", "5"], + [".", ".", ".", ".", "8", ".", ".", "7", "9"], ] # Act @@ -156,15 +156,15 @@ it "fails for the table given in the README" do # Arrange table = [ - ["8","3",".",".","7",".",".",".","."], - ["6",".",".","1","9","5",".",".","."], - [".","9","8",".",".",".",".","6","."], - ["8",".",".",".","6",".",".",".","3"], - ["4",".",".","8",".","3",".",".","1"], - ["7",".",".",".","2",".",".",".","6"], - [".","6",".",".",".",".","2","8","."], - [".",".",".","4","1","9",".",".","5"], - [".",".",".",".","8",".",".","7","9"] + ["8", "3", ".", ".", "7", ".", ".", ".", "."], + ["6", ".", ".", "1", "9", "5", ".", ".", "."], + [".", "9", "8", ".", ".", ".", ".", "6", "."], + ["8", ".", ".", ".", "6", ".", ".", ".", "3"], + ["4", ".", ".", "8", ".", "3", ".", ".", "1"], + ["7", ".", ".", ".", "2", ".", ".", ".", "6"], + [".", "6", ".", ".", ".", ".", "2", "8", "."], + [".", ".", ".", "4", "1", "9", ".", ".", "5"], + [".", ".", ".", ".", "8", ".", ".", "7", "9"], ] # Act @@ -177,15 +177,15 @@ it "fails for a duplicate number in a sub-box" do # Arrange table = [ - ["5","3",".",".","7",".",".",".","."], - ["6",".","3","1","9","5",".",".","."], - [".","9","8",".",".",".",".","6","."], - ["8",".",".",".","6",".",".",".","3"], - ["4",".",".","8",".","3",".",".","1"], - ["7",".",".",".","2",".",".",".","6"], - [".","6",".",".",".",".","2","8","."], - [".",".",".","4","1","9",".",".","5"], - [".",".",".",".","8",".",".","7","9"] + ["5", "3", ".", ".", "7", ".", ".", ".", "."], + ["6", ".", "3", "1", "9", "5", ".", ".", "."], + [".", "9", "8", ".", ".", ".", ".", "6", "."], + ["8", ".", ".", ".", "6", ".", ".", ".", "3"], + ["4", ".", ".", "8", ".", "3", ".", ".", "1"], + ["7", ".", ".", ".", "2", ".", ".", ".", "6"], + [".", "6", ".", ".", ".", ".", "2", "8", "."], + [".", ".", ".", "4", "1", "9", ".", ".", "5"], + [".", ".", ".", ".", "8", ".", ".", "7", "9"], ] # Act @@ -198,15 +198,15 @@ it "fails for a duplicate number in a bottom right sub-box" do # Arrange table = [ - ["5","3",".",".","7",".",".",".","."], - ["6",".","2","1","9","5",".",".","."], - [".","9","8",".",".",".",".","6","."], - ["8",".",".",".","6",".",".",".","3"], - ["4",".",".","8",".","3",".",".","1"], - ["7",".",".",".","2",".",".",".","6"], - [".","6",".",".",".",".","2","8","."], - [".",".",".","4","1","9","8",".","5"], - [".",".",".",".","8",".",".","7","9"] + ["5", "3", ".", ".", "7", ".", ".", ".", "."], + ["6", ".", "2", "1", "9", "5", ".", ".", "."], + [".", "9", "8", ".", ".", ".", ".", "6", "."], + ["8", ".", ".", ".", "6", ".", ".", ".", "3"], + ["4", ".", ".", "8", ".", "3", ".", ".", "1"], + ["7", ".", ".", ".", "2", ".", ".", ".", "6"], + [".", "6", ".", ".", ".", ".", "2", "8", "."], + [".", ".", ".", "4", "1", "9", "8", ".", "5"], + [".", ".", ".", ".", "8", ".", ".", "7", "9"], ] # Act @@ -216,4 +216,4 @@ expect(valid).must_equal false end end -end \ No newline at end of file +end