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 = [