From c2188d46baf8f22c2f1146912d93bd69bb569767 Mon Sep 17 00:00:00 2001 From: Li Dai Date: Thu, 22 Apr 2021 02:29:46 -0700 Subject: [PATCH] 3 exercises tests passing --- lib/exercises.rb | 88 +++++++++++++++++++++++++++++++++++++----- test/exercises_test.rb | 2 +- 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/lib/exercises.rb b/lib/exercises.rb index e1b3850..ae6d1b7 100644 --- a/lib/exercises.rb +++ b/lib/exercises.rb @@ -1,19 +1,49 @@ # This method will return an array of arrays. # Each subarray will have strings which are anagrams of each other -# Time Complexity: ? -# Space Complexity: ? +# n => number of strings, m => largest number of characters of a string +# Time Complexity: n * mlog(m) (sorting n strings: n * mlog(m); lookup, push, assign: O(1), iterating o(n)) +# Space Complexity: n * m (worst case has to create a new array/key for each string, and takes m space to sort it) def grouped_anagrams(strings) - raise NotImplementedError, "Method hasn't been implemented yet!" + anagram_hash = Hash.new + grouped_anagrams = Array.new + + #build a hash table where key is the sorted string and value is an array of the anagrams + strings.each_with_index do |string, index| + sorted_str = string.chars.sort.join + if anagram_hash.key?(sorted_str) + anagram_hash[sorted_str] << strings[index] + else + anagram_hash[sorted_str] = [strings[index]] + end + end + + anagram_hash.values.each do |anagrams| + grouped_anagrams << anagrams + end + + return grouped_anagrams end # This method will return the k most common elements # in the case of a tie it will select the first occuring element. -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: Olog(n) for sorting +# Space Complexity: o(n) def top_k_frequent_elements(list, k) - raise NotImplementedError, "Method hasn't been implemented yet!" + elements_counter = Hash.new(0) + + list.each do |num| + elements_counter[num] += 1 + end + + result_elements = [] + elements_counter.values.sort.reverse.take(k).each do |frequency| + result_elements << elements_counter.key(frequency) + elements_counter.delete(elements_counter.key(frequency)) + end + + return result_elements end @@ -22,8 +52,48 @@ def top_k_frequent_elements(list, k) # Each element can either be a ".", or a digit 1-9 # The same digit cannot appear twice or more in the same # row, column or 3x3 subgrid -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(1) fixed grid +# Space Complexity: O(1) def valid_sudoku(table) - raise NotImplementedError, "Method hasn't been implemented yet!" + + #check rows + 9.times do |r| + line_hash = Hash.new(0) + 9.times do |c| + if table[r][c] != "." + line_hash[table[r][c]] += 1 + return false if line_hash[table[r][c]] > 1 + end + end + end + + #check columns + 9.times do |c| + column_hash = Hash.new(0) + 9.times do |r| + if table[r][c] != "." + column_hash[table[r][c]] += 1 + return false if column_hash[table[r][c]] > 1 + end + end + end + + #check sub-box + 3.times do |box_r| + 3.times do |box_c| + box_hash = Hash.new(0) + 3.times do |r| + 3.times do |c| + row = r + box_r * 3 + col = c + box_c * 3 + if table[row][col] != "." + box_hash[table[row][col]] += 1 + return false if box_hash[table[row][col]] > 1 + end + end + end + end + end + + return true end diff --git a/test/exercises_test.rb b/test/exercises_test.rb index 74646dc..8025075 100644 --- a/test/exercises_test.rb +++ b/test/exercises_test.rb @@ -151,7 +151,7 @@ end end - xdescribe "valid sudoku" do + describe "valid sudoku" do it "works for the table given in the README" do # Arrange table = [