From aaa6dbb963c36021a7ea935d049b25873c089d30 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sun, 3 Aug 2025 06:15:11 +0300 Subject: [PATCH 1/6] Improved Node.toString() --- .../kotlin/com_github_leetcode/random/Node.kt | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com_github_leetcode/random/Node.kt b/src/main/kotlin/com_github_leetcode/random/Node.kt index ffe6b388..2902b417 100644 --- a/src/main/kotlin/com_github_leetcode/random/Node.kt +++ b/src/main/kotlin/com_github_leetcode/random/Node.kt @@ -1,7 +1,5 @@ package com_github_leetcode.random -import java.util.StringJoiner - class Node { var `val`: Int var next: Node? = null @@ -12,33 +10,38 @@ class Node { } override fun toString(): String { - val result = StringJoiner(",", "[", "]") - val result2 = StringJoiner(",", "[", "]") - result2.add(`val`.toString()) + val result = StringBuilder() + result.append("[") + result.append("[") + result.append(`val`) + result.append(",") if (random == null) { - result2.add("null") + result.append("null") } else { - result2.add(random!!.`val`.toString()) + result.append(random!!.`val`) } - result.add(result2.toString()) + result.append("]") var curr = next while (curr != null) { - val result3 = StringJoiner(",", "[", "]") - result3.add(curr.`val`.toString()) + result.append(",") + result.append("[") + result.append(curr.`val`) + result.append(",") if (curr.random == null) { - result3.add("null") + result.append("null") } else { var randomIndex = 0 - var curr2: Node? = this - while (curr2!!.next != null && curr2 !== curr.random) { - randomIndex += 1 - curr2 = curr2.next + var indexFinder: Node? = this + while (indexFinder!!.next != null && indexFinder !== curr.random) { + randomIndex++ + indexFinder = indexFinder.next } - result3.add(randomIndex.toString()) + result.append(randomIndex) } - result.add(result3.toString()) + result.append("]") curr = curr.next } + result.append("]") return result.toString() } } From 97ce53b0abad53ef1980396e48c92cc5943a6666 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sun, 3 Aug 2025 06:43:35 +0300 Subject: [PATCH 2/6] Improved task 133 --- .../com_github_leetcode/neighbors/Node.kt | 27 -------------- .../g0101_0200/s0133_clone_graph/Solution.kt | 36 ------------------- .../kotlin/com_github_leetcode/NodeTest.kt | 7 ---- .../com_github_leetcode/neighbors/NodeTest.kt | 30 ---------------- .../s0133_clone_graph/SolutionTest.kt | 2 +- 5 files changed, 1 insertion(+), 101 deletions(-) delete mode 100644 src/main/kotlin/com_github_leetcode/neighbors/Node.kt delete mode 100644 src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt delete mode 100644 src/test/kotlin/com_github_leetcode/neighbors/NodeTest.kt diff --git a/src/main/kotlin/com_github_leetcode/neighbors/Node.kt b/src/main/kotlin/com_github_leetcode/neighbors/Node.kt deleted file mode 100644 index 75da4bdc..00000000 --- a/src/main/kotlin/com_github_leetcode/neighbors/Node.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com_github_leetcode.neighbors - -import java.util.StringJoiner - -class Node(var `val`: Int) { - constructor(i: Int, asList: List) : this(i) { - this.neighbors = ArrayList(asList) - } - - var neighbors: ArrayList = ArrayList() - - override fun toString(): String { - val result = StringJoiner(",", "[", "]") - for (node in neighbors) { - if (node!!.neighbors.isEmpty()) { - result.add(node.`val`.toString()) - } else { - val result2 = StringJoiner(",", "[", "]") - for (nodeItem in node.neighbors) { - result2.add(nodeItem!!.`val`.toString()) - } - result.add(result2.toString()) - } - } - return result.toString() - } -} diff --git a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt deleted file mode 100644 index 5580bd23..00000000 --- a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt +++ /dev/null @@ -1,36 +0,0 @@ -package g0101_0200.s0133_clone_graph - -// #Medium #Hash_Table #Depth_First_Search #Breadth_First_Search #Graph #Udemy_Graph -// #Top_Interview_150_Graph_General #2022_10_09_Time_351_ms_(60.91%)_Space_37.1_MB_(70.56%) - -import com_github_leetcode.neighbors.Node - -/* - * Definition for a Node. - * class Node(var `val`: Int) { - * var neighbors: ArrayList = ArrayList() - * } - */ -class Solution { - fun cloneGraph(node: Node?): Node? { - return cloneGraph(node, HashMap()) - } - - private fun cloneGraph(node: Node?, processedNodes: MutableMap): Node? { - if (node == null) { - return null - } else if (processedNodes[node] != null) { - return processedNodes[node] - } - val newNode = Node(node.`val`) - processedNodes[node] = newNode - newNode.neighbors = ArrayList() - for (neighbor in node.neighbors) { - val clonedNeighbor: Node? = cloneGraph(neighbor, processedNodes) - if (clonedNeighbor != null) { - newNode.neighbors.add(clonedNeighbor) - } - } - return newNode - } -} diff --git a/src/test/kotlin/com_github_leetcode/NodeTest.kt b/src/test/kotlin/com_github_leetcode/NodeTest.kt index 0a531144..18b24922 100644 --- a/src/test/kotlin/com_github_leetcode/NodeTest.kt +++ b/src/test/kotlin/com_github_leetcode/NodeTest.kt @@ -5,13 +5,6 @@ import org.hamcrest.MatcherAssert.assertThat import org.junit.jupiter.api.Test internal class NodeTest { - @Test - fun constructor() { - val node = Node() - assertThat(node.`val`, equalTo(0)) - assertThat(node.toString(), equalTo("[]")) - } - @Test fun constructor2() { val node = Node(1) diff --git a/src/test/kotlin/com_github_leetcode/neighbors/NodeTest.kt b/src/test/kotlin/com_github_leetcode/neighbors/NodeTest.kt deleted file mode 100644 index 8670d39a..00000000 --- a/src/test/kotlin/com_github_leetcode/neighbors/NodeTest.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com_github_leetcode.neighbors - -import org.hamcrest.CoreMatchers.equalTo -import org.hamcrest.MatcherAssert.assertThat -import org.junit.jupiter.api.Test - -internal class NodeTest { - @Test - fun create() { - val node = com_github_leetcode.Node(1) - assertThat(node.`val`, equalTo(1)) - } - - @Test - fun create2() { - val node1 = Node(1) - val node2 = Node(2) - val node3 = Node(3) - val node4 = Node(4) - val node1and2and4 = Node(1, listOf(node2, node4)) - val node2and1and3 = Node(2, listOf(node1, node3)) - val node3and2and4 = Node(3, listOf(node2, node4)) - val node4and1and3 = Node(4, listOf(node1, node3)) - val node = Node( - 5, - listOf(node1and2and4, node2and1and3, node3and2and4, node4and1and3), - ) - assertThat(node.toString(), equalTo("[[2,4],[1,3],[2,4],[1,3]]")) - } -} diff --git a/src/test/kotlin/g0101_0200/s0133_clone_graph/SolutionTest.kt b/src/test/kotlin/g0101_0200/s0133_clone_graph/SolutionTest.kt index ab692bb7..aa1d7145 100644 --- a/src/test/kotlin/g0101_0200/s0133_clone_graph/SolutionTest.kt +++ b/src/test/kotlin/g0101_0200/s0133_clone_graph/SolutionTest.kt @@ -1,6 +1,6 @@ package g0101_0200.s0133_clone_graph -import com_github_leetcode.neighbors.Node +import com_github_leetcode.Node import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.MatcherAssert.assertThat import org.junit.jupiter.api.Test From 47bd91a9c5af3a999e083055fa924342122757ef Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sun, 3 Aug 2025 06:44:58 +0300 Subject: [PATCH 3/6] Improved task 133 --- .../g0101_0200/s0133_clone_graph/Solution.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt diff --git a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt new file mode 100644 index 00000000..2954d1b8 --- /dev/null +++ b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt @@ -0,0 +1,31 @@ +package g0101_0200.s0133_clone_graph + +// #Medium #Hash_Table #Depth_First_Search #Breadth_First_Search #Graph #Udemy_Graph +// #Top_Interview_150_Graph_General #2025_08_03_Time_133_ms_(88.96%)_Space_43.11_MB_(67.94%) + +import com_github_leetcode.Node + +class Solution { + fun cloneGraph(node: Node?): Node? { + return cloneGraph(node, HashMap()) + } + + private fun cloneGraph(node: Node?, processedNodes: MutableMap): Node? { + if (node == null) { + return null + } else if (processedNodes[node] != null) { + return processedNodes[node] + } + val newNode = Node(0) + processedNodes.put(node, newNode) + newNode.`val` = node.`val` + newNode.neighbors = ArrayList() + for (neighbor in node.neighbors) { + val clonedNeighbor = cloneGraph(neighbor, processedNodes) + if (clonedNeighbor != null) { + (newNode.neighbors as ArrayList).add(clonedNeighbor) + } + } + return newNode + } +} From 95b1529cb1e1b73a96324209cbc78369c6145204 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sun, 3 Aug 2025 06:46:13 +0300 Subject: [PATCH 4/6] Improved task 133 --- src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt index 2954d1b8..3ea7f67b 100644 --- a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt +++ b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt @@ -5,6 +5,12 @@ package g0101_0200.s0133_clone_graph import com_github_leetcode.Node +/* + * Definition for a Node. + * class Node(var `val`: Int) { + * var neighbors: ArrayList = ArrayList() + * } + */ class Solution { fun cloneGraph(node: Node?): Node? { return cloneGraph(node, HashMap()) From dfe1e0cc2d83354cf4b8b4a239fb43f761fcaf08 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sun, 3 Aug 2025 06:50:11 +0300 Subject: [PATCH 5/6] Improved task 133 --- src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt index 3ea7f67b..c6b459fa 100644 --- a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt +++ b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt @@ -16,16 +16,14 @@ class Solution { return cloneGraph(node, HashMap()) } - private fun cloneGraph(node: Node?, processedNodes: MutableMap): Node? { + private fun cloneGraph(node: Node?, processedNodes: MutableMap): Node? { if (node == null) { return null } else if (processedNodes[node] != null) { return processedNodes[node] } - val newNode = Node(0) + val newNode = Node(node.`val`) processedNodes.put(node, newNode) - newNode.`val` = node.`val` - newNode.neighbors = ArrayList() for (neighbor in node.neighbors) { val clonedNeighbor = cloneGraph(neighbor, processedNodes) if (clonedNeighbor != null) { From af8b4107e8a83f667a2ba8ca13e1bf65247de3ef Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sun, 3 Aug 2025 06:52:33 +0300 Subject: [PATCH 6/6] Improved task 133 --- src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt index c6b459fa..9b8210c9 100644 --- a/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt +++ b/src/main/kotlin/g0101_0200/s0133_clone_graph/Solution.kt @@ -23,7 +23,7 @@ class Solution { return processedNodes[node] } val newNode = Node(node.`val`) - processedNodes.put(node, newNode) + processedNodes[node] = newNode for (neighbor in node.neighbors) { val clonedNeighbor = cloneGraph(neighbor, processedNodes) if (clonedNeighbor != null) {