如何实现自然数0~9循环递增or递减?

最近在看 LeetCode 第 752 题 打开转盘锁BFS)求解的时候,发现了一个惊世骇俗的操作,现记录一下,顺便贴个本题代码。

func openLock(deadends []string, target string) int {
	step := 0 // 旋转次数
	deadendsMap := make(map[string]bool)
	visitedMap := make(map[string]bool)

	for _, v := range deadends { // 记录所有“死亡点”
		deadendsMap[v] = true
	}

	q := []string{"0000"} // 队列q
	for len(q) > 0 {      // 循环直至队列为空
		size := len(q)              // 获取BFS当前level的节点个数
		for i := 0; i < size; i++ { // 遍历当前层的节点
			node := q[0]        // 获取出列的节点
			q = q[1:]           // 节点出列
			if node == target { // 如果出列的节点正好是目标节点
				return step // 返回当前所用的步数
			}
			if _, ok := visitedMap[node]; ok { // 之前访问过该节点,跳过
				continue
			}
			if _, ok := deadendsMap[node]; ok { // 遇到“死亡点”,跳过
				continue
			}
			visitedMap[node] = true // 将该点标记为访问过

			for j := 0; j < len(node); j++ { // 通过遍历当前字符串,找出它的所有子节点,安排入列
				// 卧槽,这不背下来有点亏(2023/10/9 15:27)
				num := int(node[j] - '0')                             // 获取当前的数字num
				up := (num + 1) % 10                                  // 往上拧所得的新数,比如1变成2
				down := (num + 9) % 10                                // 往下拧所得的新数,比如7变成6
				q = append(q, node[:j]+strconv.Itoa(up)+node[j+1:])   // 拼成新字符串,入列
				q = append(q, node[:j]+strconv.Itoa(down)+node[j+1:]) // 拼成新字符串 入列
			}
		}
		step++ // 当前层的所有节点遍历完毕,层次+1
	}
	return -1 // 无论如何都遇不到目标节点,返回-1
}

注意:其中(num + 1) % 10 and (num + 9) % 10 令人拍案!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值