二维矩阵的遍历方向

给定一个矩阵, 通过for循环可以有多少种遍历方式以及各种遍历方式的方向是怎么样的? 给定矩阵比较抽象, 我们举一个更具体的例子: 给定一个字符串"babad", 有多少种不同的遍历方式?各种遍历方式的遍历方向又是什么样子的? 右斜遍历 s = "babad" n = len(s) for L in range(n): for i in range(n): j = i + L if(j >= n): continue print((i,j))

April 1, 2024 · 1 min

边界处理

力扣 931. 下降路径最小和 是一道经典的动态规划题,但是我卡在了边界问题上。 如何优雅的处理col为0和col为n-1的情况。 dp[row][col] = min(dp[row-1][max(col-1,0)], dp[row-1][col], dp[row-1][min(col+1,n-1)]) 通过max和min来约束边界。

March 12, 2024 · 1 min

AutoWire可以注入列表和字典

目前我们业务代码里有一种常见的模式,定义一个接口,接着通过多个handler类实现这个接口, 在面对不同的情况时通过调用不同的handler类来处理业务代码,通常这些handler类都会继承一个公用的父类,父类中会有一些公共的方法。 本文不讨论这种模式的合理性,单纯从技术角度分析实现的方案。因为在Java生态下,都是使用spring框架。所以之前的业务代码中都会把这些handler做成bean,而如何使用这些bean,实现方案千奇百怪。有交给spring ioc容器管理后,自行从context中根据bean name获取的。也有手动注入到一个大map中的。 其实官方文档里指出里Autowired注解是可以自动注入map和list的,这句话有点奇怪,我还是直接show code吧。 我使用的java版本是 openjdk 21.0.2 2024-01-16 OpenJDK Runtime Environment (build 21.0.2+13-58) OpenJDK 64-Bit Server VM (build 21.0.2+13-58, mixed mode, sharing) 对于使用spring的ioc容器和bean而言,只需要spring-context依赖即可。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.1.4</version> </dependency> 首先我们定义一个接口IMan和它的两个字类Teacher和Student, 为了方便我们不加入额外的逻辑和属性 public interface IMan {} public class Teacher implements IMan{} public class Student implements IMan{} 我们在实现一个ClassRoom类,该类使用@AutoWried注解注入一个元素类型为IMan的list和一个key为String, Value类型为IMan的map public class ClassRoom { @Autowired IMan[] people; @Autowired Map<String, IMan> categories; } 同时,使用xml配置自动装配和相关的bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www....

February 23, 2024 · 1 min

993. 二叉树的堂兄弟节点

题目 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 卡点 这道题我想到了使用bfs遍历树并且去记录深度,但有两点未思考到 深度记录的方式应该是和节点绑定,即每个节点应该有自己的深度变量。我试图通过一个变量记录深度,结果难以通过队列的变化确定(应该可以通过遍历前记录队列中节点数量,然后for循环遍历完成后对全局深度+1) dfs和bfs都可以在遍历前去获取到父节点信息,而且是要在对节点进行操作之前,bfs是在入队列前,而我在思考的时候是思考的节点进入队列后如何判断它的父节点。当然这里也可以判断,如果我不使用队列,而是使用一个数据,元素不停的加入,而元素的pop是通过移动一个队首的指针完成,那么我就可以通过下标运算得到父节点的值,但这样内存消耗会大一些。 答案 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right # dfs class Solution: def isCousins(self, root: Optional[TreeNode], x: int, y: int) -> bool: queue = [] queue....

February 8, 2024 · 1 min

记录一下我Mac上安装的一些工具

全局包管理工具 brew python (system) pyenv(install by brew) echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc echo 'eval "$(pyenv init -)"' >> ~/.zshrc poetry(install by brew) poetry install poetry env remove 3.12 go (install with official installer) warp (终端)

February 8, 2024 · 1 min

python3.12安装numpy1.25.2不兼容问题

• Installing numpy (1.25.2): Failed ChefBuildError Backend 'setuptools.build_meta:__legacy__' is not available. Traceback (most recent call last): File "/opt/homebrew/Cellar/poetry/1.7.1/libexec/lib/python3.12/site-packages/pyproject_hooks/_in_process/_in_process.py", line 77, in _build_backend obj = import_module(mod_path) ^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/Cellar/python@3.12/3.12.1_1/Frameworks/Python.framework/Versions/3.12/lib/python3.12/importlib/__init__.py", line 90, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1387, in _gcd_import File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1387, in _gcd_import File "<frozen importlib....

February 4, 2024 · 2 min

vscode-godot-配置

.vscode/lanch.json { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "GDScript Godot", "type": "godot", "request": "launch", "project": "${workspaceFolder}", "port": 6007, "address": "tcp://127.0.0.1", "launch_game_instance": true, "launch_scene": false } ] } .vscode/settings.json { "godot_tools.editor_path": "/Applications/Godot.app/Contents/MacOS/Godot", "godot_tools.gdscript_lsp_server_port": 6005, }

January 14, 2024 · 1 min

海的信徒

我生在海边 但一生只见过一次大海 我的母亲提醒我 “不要开口” 推开车门海边的喧嚣闯入我被匆匆挤出 海浪扑打瞳孔中蓝色沸腾我匆忙捂住嘴巴 不要 开口 堤坝空荡没有过客 世界很大,呼啸的海风将每个人隔绝 海在轰鸣 我松开双手,向海吼叫 海风带走我发出的每一句声响

January 7, 2024 · 1 min

双十一线上事故复盘

事故一 背景: 服务old一个前后端不分离的老项目,服务new是一个前后端分离的新服务。部分功能从服务old迁移到服务new,采用了请求重定向的方式,前端请求服务old的老接口后重定向到新服务。 现象: 大促前5分钟,应用tp99,tp999开始有个别报警超时,tp999响应时间超过20s。 事故二 经验: 永远不相信任何服务提供方,永远不强依赖服务提供方。 熔断、降级 熔断机制: 对R2M依赖过强,当R2M出现不可用了,实名没有熔断机制。 合理的设计应该是,假如分布式缓存服务不可用,则启用本地缓存并使用LRU机制,放弃峰值TPS和一定的成功率保证服务可用。 降级: 任何一个服务都要提供日志降级方式(这里又要引入熔断机制,假如依赖的动态配置服务挂了,那么所有的配置项应该启用默认配置,并且该配置应该是优先保证服务可用,可以牺牲可观察性,牺牲服务能力)

November 4, 2023 · 1 min

软件工程实践指南

本文记载我在软件工程实践过程中总结的经验 1、在生产环境为测试环境的凭证设置特殊报错 在实际开发过程中,我们可能会有各种各样的环境,这些环境可能会提供给业务方使用。我们的工程中经常会有权限校验操作,在测试环境为了方便可能会给业务方分配一个统一的凭证,而生产环境会分配单独的凭证。如果是这样,那么建议生产环境校验时为这个特殊凭证单独设置错误提示,以通知用户错误的将测试环境的凭证用于生产环境。 2、不要为pin等字段设置默认值 用户会使用pin,而有的时候我们会想要获取这些pin做日志等分析处理,如果获取不到这些pin应该使用null标记这些字段,而不是设置“unknown”等默认字段,因为客户可能会使用这些字段作为pin。 3、预防型捕获异常可以有,但是一定要在日志中指出是意料之外的异常 在业务导向比较强的代码中,可以在一些不必加try catch的地方显示捕获异常。因为一些代码在业务导向强的项目中属于边缘代码,比如埋点、日志等,对于一些业务比如个人实名来说这些代码可以失败但不能阻塞流程。预防性try catch能保证这部分代码不出问题,但是我无法保证同事或者其他中间件等

October 13, 2023 · 1 min