diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ec2c85c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + + { + "name": "Debug Local File", + "type": "Ruby", + "request": "launch", + "cwd": "${workspaceRoot}", + "program": "${file}" } + ] +} \ No newline at end of file diff --git a/lib/exercises.rb b/lib/exercises.rb index e1b3850..416639f 100644 --- a/lib/exercises.rb +++ b/lib/exercises.rb @@ -1,29 +1,123 @@ # 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(nm) where n is array length(words) and m is word length(letters) +# Space Complexity: O(n) def grouped_anagrams(strings) - raise NotImplementedError, "Method hasn't been implemented yet!" + return [] if strings.nil? + return [] if strings.empty? + + hash = {} + + strings.each do |word| + letters = word.split("").sort + + if hash[letters] # if it has the sorted letters + hash[letters] << word + else + hash[letters] = [word] + + end + end + + return hash.values 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: O (n log n) for using sort +# Space Complexity: O (n) def top_k_frequent_elements(list, k) - raise NotImplementedError, "Method hasn't been implemented yet!" -end + return [] if list.nil? || list.empty? + + if k.nil? + raise ArgumentError,"k was not provided" + end + + frequent = Hash.new(0) + + list.each do |num| + frequent[num] += 1 + end + + results = frequent.sort_by{|num , frequency| -frequency } + results[0...k].map{|num , frequency| num } +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 -# row, column or 3x3 subgrid -# Time Complexity: ? -# Space Complexity: ? +# row, column or the 9 3x3 subgrid +# Time Complexity: O(1) for a 9 block sudoku +# Space Complexity: O(n) for the hash table def valid_sudoku(table) - raise NotImplementedError, "Method hasn't been implemented yet!" + if table.nil? || table.empty? + raise ArgumentError,'no table provided' + end + + # row check + table.each do |row| + row_hash = {} + row.each do |input| + if validate_sudoku_input(input) + if row_hash[input] + false + else + row_hash[input] = true + end + end + end + end + + # column check + i = 0 + while i < 9 + col_hash = {} + table.each do |row| + input = row[i] + if validate_sudoku_input(input) + if col_hash[input] + false + else + col_hash[input] = true + end + end + end + i += 1 + end + + # 9 3x3 block + [0,3,6].each do |rows| # created array for rows + [0,3,6].each do |columns| # created array for columns + return false unless sudoku_3x3_block(rows, columns, table) + end + end + + true end + + +def validate_sudoku_input(value) + if value != "." && value =~ /[^123456789]/ + false + end +end + +def sudoku_3x3_block(rows, columns, table) + block_hash = {} + (rows...rows+3).each do |row| + (columns...columns+3).each do |column| + input = table[row][column] + return false unless validate_sudoku_input(input) + if block_hash[input] + false + else + block_hash[input] = true + end + end + end + true +end \ No newline at end of file diff --git a/test/exercises_test.rb b/test/exercises_test.rb index 74646dc..8d09b1c 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 = [ @@ -236,4 +236,4 @@ expect(valid).must_equal false end end -end +end \ No newline at end of file