Python如何将普通双函数代码改写为LeetCode要求的类提交格式
LeetCode 200 岛屿数量 提交代码改写方案
原代码封装失败原因
原双函数写法用函数属性做跨函数变量共享,直接套入类模板时会出现三类报错:
- 类的实例方法默认第一个参数必须为
self,直接照搬函数定义会丢失实例上下文 - 类内部方法互相调用必须加
self.前缀,裸调用DFS会触发名称未定义错误 - 原代码直接引用全局
grid变量的写法,在LeetCode的类提交环境下无法正确获取输入值
符合提交规范的可运行代码
class Solution(object): def numIslands(self, grid): """ :type grid: List[List[str]] :rtype: int """ self.m = len(grid) self.n = len(grid[0]) if self.m > 0 else 0 self.visited = [[False for _ in range(self.n)] for _ in range(self.m)] self.myStack = [] self.islandCnt = 0 self.grid = grid for i in range(self.m): for j in range(self.n): if grid[i][j] == "1" and not self.visited[i][j]: self.islandCnt += 1 self.DFS(i, j) return self.islandCnt def DFS(self, i, j): shift = 0 self.visited[i][j] = True self.myStack.append((i, j)) adjacent = [(i, j-1), (i, j+1), (i-1, j), (i+1, j)] for ele in adjacent: ni, nj = ele[0], ele[1] if 0 <= ni <= self.m -1 and 0 <= nj <= self.n -1 and not self.visited[ni][nj] and self.grid[ni][nj] == '1': shift = 1 self.DFS(ni, nj) if shift == 0: Recent = self.myStack.pop() if len(self.myStack) != 0: self.myStack.pop() self.DFS(Recent[0], Recent[1])
改写逻辑说明
- 完全保留原有DFS遍历、栈回溯、计数逻辑,没有修改核心算法思路
- 所有跨方法共享的变量(网格尺寸、访问标记数组、栈、计数器、输入网格本身)都绑定到实例属性
self上,替代原来的函数属性共享方式 - 辅助方法DFS作为类的内部方法定义,所有递归调用、变量访问都通过
self完成上下文传递 - 增加了空网格的边界判断,避免输入为空时触发索引越界错误
内容的提问来源于stack exchange,提问作者Junyeong Ahn
相关产品推荐
相关产品推荐

