Skip to content

Commit 2a8ceae

Browse files
hh
authored andcommitted
Week 2 - han
1 parent 71d9c80 commit 2a8ceae

File tree

5 files changed

+133
-0
lines changed

5 files changed

+133
-0
lines changed

invert-binary-tree/han.exs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Definition for a binary tree node.
2+
#
3+
# defmodule TreeNode do
4+
# @type t :: %__MODULE__{
5+
# val: integer,
6+
# left: TreeNode.t() | nil,
7+
# right: TreeNode.t() | nil
8+
# }
9+
# defstruct val: 0, left: nil, right: nil
10+
# end
11+
12+
defmodule Solution do
13+
@spec invert_tree(root :: TreeNode.t | nil) :: TreeNode.t | nil
14+
def invert_tree(nil), do: nil
15+
16+
def invert_tree(root) do
17+
invert(root, root.left, root.right)
18+
end
19+
20+
defp invert(parent, nil, nil), do: parent
21+
22+
defp invert(parent, left, nil) do
23+
%TreeNode{parent | left: nil, right: invert(left, left.left, left.right)}
24+
end
25+
26+
defp invert(parent, nil, right) do
27+
%TreeNode{parent | left: invert(right, right.left, right.right), right: nil}
28+
end
29+
30+
defp invert(parent, left, right) do
31+
tmp = left
32+
33+
%TreeNode{parent |
34+
left: invert(right, right.left, right.right),
35+
right: invert(tmp, tmp.left, tmp.right)}
36+
end
37+
end

linked-list-cycle/han.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Definition for singly-linked list.
2+
# class ListNode
3+
# attr_accessor :val, :next
4+
# def initialize(val)
5+
# @val = val
6+
# @next = nil
7+
# end
8+
# end
9+
10+
# @param {ListNode} head
11+
# @return {Boolean}
12+
def hasCycle(head)
13+
return false unless head && head.next
14+
15+
slow = head
16+
fast = head.next
17+
18+
loop do
19+
break true if slow == fast
20+
21+
slow = slow.next
22+
fast = fast&.next&.next
23+
24+
break false unless fast
25+
end
26+
end

merge-two-sorted-lists/han.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Definition for singly-linked list.
2+
#
3+
# defmodule ListNode do
4+
# @type t :: %__MODULE__{
5+
# val: integer,
6+
# next: ListNode.t() | nil
7+
# }
8+
# defstruct val: 0, next: nil
9+
# end
10+
11+
defmodule Solution do
12+
@spec merge_two_lists(list1 :: ListNode.t | nil, list2 :: ListNode.t | nil) :: ListNode.t | nil
13+
def merge_two_lists(nil, nil), do: nil
14+
def merge_two_lists(nil, list2), do: list2
15+
def merge_two_lists(list1, nil), do: list1
16+
17+
def merge_two_lists(list1, list2) when list1.val >= list2.val do
18+
%ListNode{list2 | next: merge_two_lists(list1, list2.next)}
19+
end
20+
21+
def merge_two_lists(list1, list2) do
22+
%ListNode{list1 | next: merge_two_lists(list1.next, list2)}
23+
end
24+
end

reverse-linked-list/han.exs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Definition for singly-linked list.
2+
#
3+
# defmodule ListNode do
4+
# @type t :: %__MODULE__{
5+
# val: integer,
6+
# next: ListNode.t() | nil
7+
# }
8+
# defstruct val: 0, next: nil
9+
# end
10+
11+
defmodule Solution do
12+
def reverse_list(head) when is_nil(head), do: nil
13+
14+
@spec reverse_list(head :: ListNode.t | nil) :: ListNode.t | nil
15+
def reverse_list(head, arr \\ []) do
16+
new_arr = List.insert_at(arr, -1, head.val)
17+
if head.next do
18+
reverse_list(head.next, new_arr)
19+
else
20+
Enum.reduce(tl(new_arr), %ListNode{val: hd(new_arr), next: nil}, fn x, acc ->
21+
%ListNode{val: x, next: acc}
22+
end)
23+
end
24+
end
25+
end

valid-parentheses/han.exs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
defmodule Solution do
2+
def is_valid(s) when byte_size(s) > 1 do
3+
brackets = %{")" => "(", "}" => "{", "]" => "["}
4+
opens = ["[", "{", "("]
5+
6+
result = Enum.reduce_while(String.graphemes(s), [], fn x, acc ->
7+
cond do
8+
x in opens ->
9+
{:cont, List.insert_at(acc, -1, x)}
10+
brackets[x] == List.last(acc) ->
11+
{:cont, List.delete_at(acc, -1)}
12+
true ->
13+
{:halt, List.insert_at(acc, -1, x)}
14+
end
15+
end)
16+
17+
length(result) < 1
18+
end
19+
20+
def is_valid(_), do: false
21+
end

0 commit comments

Comments
 (0)