-
Notifications
You must be signed in to change notification settings - Fork 0
/
alternating_digit_sum.exs
76 lines (67 loc) · 1.93 KB
/
alternating_digit_sum.exs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# https://leetcode.com/problems/alternating-digit-sum/description/
# 2544. Alternating Digit Sum
#############################
# https://leetcode.com/problems/add-digits/description/
# 258. Add Digits
# Explanation: https://algo.monster/liteproblems/258
import Integer
defmodule Solution do
# Alternating Digit Sum
@spec alternate_digit_sum(n :: integer) :: integer
def alternate_digit_sum(n), do: do_alternate_digit_sum(n, 1, 0, 0)
defp do_alternate_digit_sum(n, negative, digits_num, acc) when n > 0 do
do_alternate_digit_sum(
div(n, 10),
negative * -1,
digits_num + 1,
acc + negative * rem(n, 10)
)
end
defp do_alternate_digit_sum(_, _, digits_num, acc) when is_even(digits_num), do: -acc
defp do_alternate_digit_sum(_, _, _digits_num, acc), do: acc
# Add Digits
@spec add_digits(num :: integer) :: integer
def add_digits(num) when num >= 10 do
add_digits(
num
|> Integer.digits()
|> Enum.sum
)
end
def add_digits(num), do: num
@spec add_digits_ii(num :: integer) :: integer
def add_digits_ii(num) do
case rem(num-1, 9) do
x -> x+1
end
end
end
IO.inspect("Alternating Digit Sum")
IO.inspect(Solution.alternate_digit_sum(521))
# Output: 4
IO.inspect(Solution.alternate_digit_sum(111))
# Output: 1
IO.inspect(Solution.alternate_digit_sum(886996))
# Output: 0
IO.inspect(Solution.alternate_digit_sum(885996))
# Output: -1
IO.inspect(Solution.alternate_digit_sum(886995))
# Output: 1
IO.inspect("Add Digits (recursion)")
IO.inspect(Solution.add_digits(38))
# Output: 2
IO.inspect(Solution.add_digits(0))
# Output: 0
IO.inspect(Solution.add_digits(886995))
# 8+8+6+9+9+5=45
# 4+5=9
# Output: 9
IO.inspect("Add Digits (digital root - Time complexity: O(1))")
IO.inspect(Solution.add_digits_ii(38))
# Output: 2
IO.inspect(Solution.add_digits_ii(0))
# Output: 0
IO.inspect(Solution.add_digits_ii(886995))
# Output: 9
IO.inspect(Solution.add_digits_ii(1))
# Output: 1