diff --git a/lib/fibonacci.rb b/lib/fibonacci.rb index 7465c25..12659e8 100644 --- a/lib/fibonacci.rb +++ b/lib/fibonacci.rb @@ -1,8 +1,19 @@ -# Improved Fibonacci +# # Improved Fibonacci + +# # Time Complexity - O(n) +# # Space Complexity - O(n) (should be O(n)) +# # Hint, you may want a recursive helper method -# Time Complexity - ? -# Space Complexity - ? (should be O(n)) -# Hint, you may want a recursive helper method def fibonacci(n) - + raise ArgumentError if n < 0 + return fib_helper([0, 1], 2, n) +end + +def fib_helper(fib_saver, current, n) + return n if n == 0 || n == 1 + return fib_saver.sum if current == n + new_sum = fib_saver.sum + fib_saver[0] = fib_saver[1] + fib_saver[1] = new_sum + return fib_helper(fib_saver, current + 1, n) end diff --git a/lib/super_digit.rb b/lib/super_digit.rb index 33e367f..ad7bf1d 100644 --- a/lib/super_digit.rb +++ b/lib/super_digit.rb @@ -1,15 +1,23 @@ # Superdigit -# Time Complexity - ? -# Space Complexity - ? +# Time Complexity - O(nlog10n)? +# Space Complexity - O(log10n)? def super_digit(n) - + return n if n < 10 + super_digit(digitize(n)) end - -# Time Complexity - ? -# Space Complexity - ? +def digitize(n) + return n if n < 10 + sum = 0 + single_digit = n % 10 + sum += single_digit + return sum + digitize(n / 10) +end + + +# Time Complexity - I'm pretty sure this solution doesn't reduce the time complexity, unfortunately. So it's O(nlog10n) still? +# Space Complexity - O(log10n)? def refined_super_digit(n, k) - + super_digit(n * k) end - \ No newline at end of file diff --git a/test/super_digit_test.rb b/test/super_digit_test.rb index 60da3a1..4547940 100644 --- a/test/super_digit_test.rb +++ b/test/super_digit_test.rb @@ -1,6 +1,6 @@ require_relative "test_helper" -xdescribe "super_digit" do +describe "super_digit" do it "will return 2 for super_digit(9875)" do # Act answer = super_digit(9875) @@ -33,13 +33,13 @@ expect(answer).must_equal 6 end - describe "refined superdigit" do + describe "refined superdigit" do it "will return 1 for n = 1 and k = 1" do # Act answer = refined_super_digit(1, 1) # Assert - expect(answer).must_equal 1 + expect(answer).must_equal 1 end it "will return 8 for n=9875 and k = 4" do @@ -53,7 +53,7 @@ it "will return 3 for n=148 and k = 3" do # Act answer = refined_super_digit(148, 3) - + # Assert expect(answer).must_equal 3 end