Bot image for GPT-4

Shared conversation

GPT-4 ·

我需要你担任算法教师和指导者,你需要对代码做 CodeReview:
要求:
1、评价代码规范性
2、指出不足指出
3、给出改进后的版本
代码:class Solution {
fun collectTheCoins(coins: IntArray, edges: Array<IntArray>): Int {
val n = coins.size
// 入度表
val inDegrees = IntArray(n)
// 领接表
val graph = HashMap<Int, MutableList<Int>>()
for (edge in edges) {
graph.getOrPut(edge[0]) { LinkedList<Int>() }.add(edge[1])
graph.getOrPut(edge[1]) { LinkedList<Int>() }.add(edge[0])
inDegrees[edge[0]]++
inDegrees[edge[1]]++
}
// 剩余的边
var left_edge = edges.size // n - 1
// 1、拓扑排序剪枝无金币子树
val queue = LinkedList<Int>()
for (node in 0 until n) {
// 题目是无向图,所以叶子结点的入度也是 1
if (inDegrees[node] == 1 && coins[node] == 0) {
queue.offer(node)
}
}
while (!queue.isEmpty()) {
// 删除叶子结点
val node = queue.poll()
left_edge -= 1
// 修改相邻节点
for (edge in graph[node]!!) {
if (--inDegrees[edge] == 1 && coins[edge] == 0) queue.offer(edge)
}
}
// 2、拓扑排序剪枝与叶子结点距离不大于 2 的节点(裁剪 2 层)
// 叶子节点
for (node in 0 until n) {
if (inDegrees[node] == 1 && coins[node] == 1) {
queue.offer(node)
}
}
for (node in queue) {
// 2.1 删除叶子结点
left_edge -= 1
// 2.2 删除到叶子结点距离为 1 的节点
for (edge in graph[node]!!) {
if (--inDegrees[edge] == 1) left_edge -= 1
}
}
// println(inDegrees.joinToString())
// coins=[0,0],edges=[[0,1]] 会减去所有节点导致出现负数
return Math.max(left_edge * 2, 0)
}
}

首先,我会对代码进行评价,指出不足之处,然后给出改进后的版本。

  1. 评价代码规范性

代码整体上可读性较好,变量命名和代码结构清晰。但有一些小问题需要改进:

  • 注释应使用英文,以便于不同国家的开发者阅读。
  • 在方法命名时,使用驼峰命名法更符合 Kotlin 的命名规范。
  • 遵循 Kotlin 的代码风格,使用 val 代替 var,如果变量不需要重新赋值。
  1. 指出不足之处
  • 注释不够清晰,部分注释使用中文,不利于国际化。
  • 在方法名和变量名方面,可以更符合 Kotlin 的规范。
  1. 改进后的版本
kotlin
class Solution {
    fun collectTheCoins(coins: IntArray, edges: Array<IntArray>): Int {
        val n = coins.size
        // In-degree table
        val inDegrees = IntArray(n)
        // Adjacency list
        val graph = HashMap<Int, MutableList<Int>>()
        for (edge in edges) {
            graph.getOrPut(edge[0]) { LinkedList<Int>() }.add(edge[1])
            graph.getOrPut(edge[1]) { LinkedList<Int>() }.add(edge[0])
            inDegrees[edge[0]]++
            inDegrees[edge[1]]++
        }
        // Remaining edges
        var leftEdge = edges.size
        // 1. Topological sort to prune subtrees without coins
        val queue = LinkedList<Int>()
        for (node in 0 until n) {
            if (inDegrees[node] == 1 && coins[node] == 0) {
                queue.offer(node)
            }
        }
        while (queue.isNotEmpty()) {
            val node = queue.poll()
            leftEdge -= 1
            for (edge in graph[node]!!) {
                if (--inDegrees[edge] == 1 && coins[edge] == 0) queue.offer(edge)
            }
        }
        // 2. Topological sort to prune nodes with a distance not greater than 2 from the leaf nodes
        for (node in 0 until n) {
            if (inDegrees[node] == 1 && coins[node] == 1) {
                queue.offer(node)
            }
        }
        for (node in queue) {
            // 2.1 Remove leaf nodes
            leftEdge -= 1
            // 2.2 Remove nodes with a distance of 1 from the leaf nodes
            for (edge in graph[node]!!) {
                if (--inDegrees[edge] == 1) leftEdge -= 1
            }
        }
        return maxOf(leftEdge * 2, 0)
    }
}

主要改进了以下几点:

  • 将注释改为英文,更易于阅读。
  • 修改方法名和变量名,使其更符合 Kotlin 的命名规范。
  • 使用了 Kotlin 的 maxOf 函数代替 Math.max

This conversation may have been edited by the sharer.

Bot image for GPT-4Talk to GPT-4 on Poe