Golang每日一练(leetDay0013)

目录
37. 解数独 Sudoku Solver 🌟🌟🌟
38. 外观数列 Count and Say 🌟🌟
39. 组合总和 Combination Sum 🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
37. 解数独 Sudoku Solver
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:

输入:board = [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"]]输出: [["5","3","4","6","7","8","9","1","2"], ["6","7","2","1","9","5","3","4","8"], ["1","9","8","3","4","2","5","6","7"], ["8","5","9","7","6","1","4","2","3"], ["4","2","6","8","5","3","7","9","1"], ["7","1","3","9","2","4","8","5","6"], ["9","6","1","5","3","7","2","8","4"], ["2","8","7","4","1","9","6","3","5"], ["3","4","5","2","8","6","1","7","9"]]解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
提示:
board.length == 9board[i].length == 9board[i][j]是一位数字或者'.'- 题目数据 保证 输入数独仅有一个解
代码:
package mainimport "fmt"func solveSudoku(board [][]byte) {rows := make([]map[byte]bool, 9) // 行集合cols := make([]map[byte]bool, 9) // 列集合sudo := make([]map[byte]bool, 9) // 3x3宫格集合empty := make([][2]int, 0) // 空格子坐标// 初始化行、列、3x3宫格集合for i := 0; i < 9; i++ {rows[i] = make(map[byte]bool)cols[i] = make(map[byte]bool)sudo[i] = make(map[byte]bool)for j := 1; j <= 9; j++ {rows[i][byte(j+'0')] = truecols[i][byte(j+'0')] = truesudo[i][byte(j+'0')] = true}}// 预处理,将空格子坐标和行、列、3x3宫格集合更新for i := 0; i < 9; i++ {for j := 0; j < 9; j++ {if board[i][j] != '.' {val := board[i][j]delete(rows[i], val)delete(cols[j], val)delete(sudo[(i/3)*3+j/3], val)} else {empty = append(empty, [2]int{i, j})}}}// 回溯函数var backtrack func(int) boolbacktrack = func(iter int) bool {// 所有空格子坐标均已填充if iter == len(empty) {return true}// 获取空格子坐标i, j := empty[iter][0], empty[iter][1]// 获取该格子所在3x3宫格索引k := (i/3)*3 + j/3// 该格子可选数值集合choices := make(map[byte]bool)for num := range rows[i] {if cols[j][num] && sudo[k][num] {choices[num] = true}}for num := range choices {// 尝试填充该格子board[i][j] = num// 更新行、列、3x3宫格集合delete(rows[i], num)delete(cols[j], num)delete(sudo[k], num)// 递归填充下一个空格子if backtrack(iter + 1) {return true}// 回溯,还原现场rows[i][num] = truecols[j][num] = truesudo[k][num] = true}// 所有数值均不可选,回溯到上一层board[i][j] = '.'return false}backtrack(0)
}func main() {board := [][]byte{{'5', '3', '.', '.', '7', '.', '.', '.', '.'},{'6', '.', '.', '1', '9', '5', '.', '.', '.'},{'.', '9', '8', '.', '.', '.', '.', '6', '.'},{'8', '.', '.', '.', '6', '.', '.', '.', '3'},{'4', '.', '.', '8', '.', '3', '.', '.', '1'},{'7', '.', '.', '.', '2', '.', '.', '.', '6'},{'.', '6', '.', '.', '.', '.', '2', '8', '.'},{'.', '.', '.', '4', '1', '9', '.', '.', '5'},{'.', '.', '.', '.', '8', '.', '.', '7', '9'}}solveSudoku(board)for _, row := range board {for _, col := range row {fmt.Print(col-48, " ")}fmt.Println()}answer := [][]byte{{'5', '3', '4', '6', '7', '8', '9', '1', '2'},{'6', '7', '2', '1', '9', '5', '3', '4', '8'},{'1', '9', '8', '3', '4', '2', '5', '6', '7'},{'8', '5', '9', '7', '6', '1', '4', '2', '3'},{'4', '2', '6', '8', '5', '3', '7', '9', '1'},{'7', '1', '3', '9', '2', '4', '8', '5', '6'},{'9', '6', '1', '5', '3', '7', '2', '8', '4'},{'2', '8', '7', '4', '1', '9', '6', '3', '5'},{'3', '4', '5', '2', '8', '6', '1', '7', '9'}}// 判断与答案是否一致equal := truefor i, row := range board {for j, col := range row {if col != answer[i][j] {equal = falsebreak}}if !equal {break}}fmt.Println(equal)
}
输出:
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
true
代码2:
package mainimport "fmt"type position struct {x inty int
}func solveSudoku(board [][]byte) {pos, find := []position{}, falsefor i := 0; i < len(board); i++ {for j := 0; j < len(board[0]); j++ {if board[i][j] == '.' {pos = append(pos, position{x: i, y: j})}}}putSudoku(&board, pos, 0, &find)
}
func putSudoku(board *[][]byte, pos []position, index int, succ *bool) {if *succ == true {return}if index == len(pos) {*succ = truereturn}for i := 1; i < 10; i++ {if checkSudoku(board, pos[index], i) && !*succ {(*board)[pos[index].x][pos[index].y] = byte(i) + '0'putSudoku(board, pos, index+1, succ)if *succ == true {return}(*board)[pos[index].x][pos[index].y] = '.'}}
}
func checkSudoku(board *[][]byte, pos position, val int) bool {// 判断行是否有重复数字for i := 0; i < len((*board)[0]); i++ {if (*board)[pos.x][i] != '.' && int((*board)[pos.x][i]-'0') == val {return false}}// 判断列是否有重复数字for i := 0; i < len((*board)); i++ {if (*board)[i][pos.y] != '.' && int((*board)[i][pos.y]-'0') == val {return false}}// 判断九宫格是否有重复数字posx, posy := pos.x-pos.x%3, pos.y-pos.y%3for i := posx; i < posx+3; i++ {for j := posy; j < posy+3; j++ {if (*board)[i][j] != '.' && int((*board)[i][j]-'0') == val {return false}}}return true
}func main() {board := [][]byte{{'5', '3', '.', '.', '7', '.', '.', '.', '.'},{'6', '.', '.', '1', '9', '5', '.', '.', '.'},{'.', '9', '8', '.', '.', '.', '.', '6', '.'},{'8', '.', '.', '.', '6', '.', '.', '.', '3'},{'4', '.', '.', '8', '.', '3', '.', '.', '1'},{'7', '.', '.', '.', '2', '.', '.', '.', '6'},{'.', '6', '.', '.', '.', '.', '2', '8', '.'},{'.', '.', '.', '4', '1', '9', '.', '.', '5'},{'.', '.', '.', '.', '8', '.', '.', '7', '9'}}solveSudoku(board)for _, row := range board {for _, col := range row {fmt.Print(col-48, " ")}fmt.Println()}answer := [][]byte{{'5', '3', '4', '6', '7', '8', '9', '1', '2'},{'6', '7', '2', '1', '9', '5', '3', '4', '8'},{'1', '9', '8', '3', '4', '2', '5', '6', '7'},{'8', '5', '9', '7', '6', '1', '4', '2', '3'},{'4', '2', '6', '8', '5', '3', '7', '9', '1'},{'7', '1', '3', '9', '2', '4', '8', '5', '6'},{'9', '6', '1', '5', '3', '7', '2', '8', '4'},{'2', '8', '7', '4', '1', '9', '6', '3', '5'},{'3', '4', '5', '2', '8', '6', '1', '7', '9'}}// 判断与答案是否一致equal := truefor i, row := range board {for j, col := range row {if col != answer[i][j] {equal = falsebreak}}if !equal {break}}fmt.Println(equal)
}
38. 外观数列 Count and Say
给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = "1"countAndSay(n)是对countAndSay(n-1)的描述,然后转换成另一个数字字符串。
前五项如下:
1. 1 2. 11 3. 21 4. 1211 5. 111221 第一项是数字 1 描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11" 描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21" 描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211" 描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。
例如,数字字符串 "3322251" 的描述如下图:

示例 1:
输入:n = 1 输出:"1" 解释:这是一个基本样例。
示例 2:
输入:n = 4 输出:"1211" 解释: countAndSay(1) = "1" countAndSay(2) = 读 "1" = 一 个 1 = "11" countAndSay(3) = 读 "11" = 二 个 1 = "21" countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"
提示:
1 <= n <= 30
代码:
package mainimport ("fmt""strconv""strings"
)func countAndSay(n int) string {if n == 1 {return "1"}prev := countAndSay(n - 1)var res strings.Builderfor i, j := 0, 0; j <= len(prev); j++ {if j == len(prev) || prev[j] != prev[i] {res.WriteString(strconv.Itoa(j - i))res.WriteByte(prev[i])i = j}}return res.String()
}func main() {for i := 1; i < 6; i++ {fmt.Println(countAndSay(i))}}
输出:
1
11
21
1211
111221
39. 组合总和 Combination Sum
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1:
输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 解释: 2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。 7 也是一个候选, 7 = 7 。仅有这两种组合。
示例 2:
输入: candidates = [2,3,5], target = 8 输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:
输入: candidates = [2], target = 1 输出: []
提示:
1 <= candidates.length <= 301 <= candidates[i] <= 200candidate中的每个元素都 互不相同1 <= target <= 500
代码:
package mainimport "fmt"func combinationSum(candidates []int, target int) [][]int {var res [][]intvar backtrack func([]int, int, int)backtrack = func(path []int, sum int, start int) {if sum >= target {if sum == target {res = append(res, append([]int{}, path...))return}return}for i := start; i < len(candidates); i++ {path = append(path, candidates[i])backtrack(path, sum+candidates[i], i)path = path[:len(path)-1]}}backtrack([]int{}, 0, 0)return res
}func main() {candidates := []int{2, 3, 6, 7}fmt.Println(combinationSum(candidates, 7))candidates = []int{2, 3, 5}fmt.Println(combinationSum(candidates, 8))candidates = []int{2}fmt.Println(combinationSum(candidates, 1))}
输出:
[[2 2 3] [7]]
[[2 2 2 2] [2 3 3] [3 5]]
[]
代码2:
package mainimport ("fmt""sort"
)func combinationSum(candidates []int, target int) [][]int {if len(candidates) == 0 {return [][]int{}}c, res := []int{}, [][]int{}sort.Ints(candidates)findcombinationSum(candidates, target, 0, c, &res)return res
}
func findcombinationSum(nums []int, target, index int, c []int, res *[][]int) {if target <= 0 {if target == 0 {b := make([]int, len(c))copy(b, c)*res = append(*res, b)}return}for i := index; i < len(nums); i++ {if nums[i] > target {break}c = append(c, nums[i])findcombinationSum(nums, target-nums[i], i, c, res)c = c[:len(c)-1]}
}func main() {candidates := []int{2, 3, 6, 7}fmt.Println(combinationSum(candidates, 7))candidates = []int{2, 3, 5}fmt.Println(combinationSum(candidates, 8))candidates = []int{2}fmt.Println(combinationSum(candidates, 1))}
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
![]() | Golang每日一练 专栏 |
![]() | Python每日一练 专栏 |
![]() | C/C++每日一练 专栏 |
![]() | Java每日一练 专栏 |
相关文章:
Golang每日一练(leetDay0013)
目录 37. 解数独 Sudoku Solver 🌟🌟🌟 38. 外观数列 Count and Say 🌟🌟 39. 组合总和 Combination Sum 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Py…...
7个Python中的隐藏小技巧分享
Python 是每个程序员都喜欢的语言,因为它易于编码和易于阅读的语法。但是,你知道 python 有一些很酷的技巧可以用来让事情变得更简单吗?在今天的内容中,我将与你分享7 个你可能从未使用过的Python 技巧前言Python 是每个程序员都喜…...
学习系统编程No.8【bash实现】
引言: 北京时间:2023/3/22/6:59,一晃3月都要过去了,时间真快,我都不知道自己这个月是怎么过的呢?怎么就要结束了,难受,恍惚自己还在2022年,刚刚晨跑回来,洗完…...
2023年顶级编程语言趋势
对于开发人员和软件工程师来说,选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易,工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行,对当今最流行的编程语言的分析,可以帮助你了解最新趋势并响应最新趋势。…...
网络安全之认识勒索病毒
一、什么是勒索病毒 勒索病毒,是一种新型电脑病毒,伴随数字货币兴起,主要以邮件、程序木马、网页挂马、服务器入侵、捆绑软件等多种形式进行传播,一旦感染将给用户带来无法估量的损失。如果遭受勒索病毒攻击,将会使绝…...
C语言手撕一个Hash表(HashTable)
什么是Hash Table 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列函数 散列函数是将我们想插入的节点散列成一个数值的函数。它…...
代码随想录第二十七天(669、108、538、回溯算法介绍)
669. 修剪二叉搜索树 不能简单地通过递归实现代码,比如: class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root nullptr || root->val < low || root->val > high) return nullptr;root->left t…...
【Leetcode】设计循环队列
目录 【Leetcode622】设计循环队列 A.链接 B.题目再现 C.解法 【Leetcode622】设计循环队列 A.链接 设计循环队列 B.题目再现 C.解法 其实这题用数组或是链表都能解决,但是如果是用链表的话,那么队列为空的条件和队列满了的条件是一样的࿰…...
【Linux】浅谈shell命令以及运行原理
前言:上篇博文把linux下的基本指令讲解完了。本期我们聊聊Linux下【shell】命令及其运行原理。 目录 Shell的基本概念与作用 原理图展示 shell命令执行原理 Shell的基本概念与作用 Linux严格意义上说的是一个操作系统,我们称之为“核心(ker…...
【shell脚本】nginx服务管理及存活检测脚本实战
前言 今天终于敢说自己是csdn万粉博主了,感谢大家的厚爱,我会继续输出更多优质的好文章,一起学习。 座右铭: 先努力让自己发光,再帮助更多的人。 🏠 个人主页:我是沐风晓月 🧑 个人…...
web服务器—nginx
一、nginx介绍Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。和apache一样,都是web服务器软件,因为其性能优异,所以被广大运维喜欢。又因…...
网络安全工具大合集
还是一句话,功夫再高,也怕菜刀首先,恭喜你发现了宝藏。本文章集成了全网优秀的开源攻防武器项目,包含:信息收集工具(自动化利用工具、资产发现工具、目录扫描工具、子域名收集工具、指纹识别工具、端口扫描…...
什么是SHA256?比特币是如何应用SHA256算法的?
SHA 256算法是一种具有确定性的单向哈希函数 算法是执行操作的一系列步骤或过程 哈希函数是种数学函数,输入的长度任意,但是输出长度固定,可以理解为文件的数字指纹,同一个输入值,总是得相同的输出 SHA256࿰…...
JDK20正式发布了GA版本,短期维护支持,以及JDK21预览
最近,Oracle发布了JDK20,相比对于Java开发者来说,JDK的发版是比较收关注的事情了,小简也来和大家一起了解了解JDK20发生了什么变化呢? 首先,JDK20是一个短周期版本,有6个月的维护时间࿰…...
.NET/C#/GC与内存管理(含深度解析)
详情请看参考文章:.NET面试题解析(06)-GC与内存管理 - 不灬赖 - 博客园 (cnblogs.com)一、对象创建及生命周期一个对象的生命周期简单概括就是:创建>使用>释放,在.NET中一个对象的生命周期:new创建对象并分配内存对象初始化…...
Java开发 | 内部类 | 静态内部类 | 非静态内部类 | 匿名内部类
目录 1.内部类 1.1内部类的简单创建 1.2内部类的分类 1.2.1普通内部类 1.2.2静态内部类 1.3匿名内部类 1.4局部内部类 1.内部类 内部类就是一是一个类里面装着另外一个类,就像俄罗斯套娃一样。最外层的类我们叫外部类,内层的类我们叫内部类。 1…...
Portal认证
Portal认证Portal认证简介Portal认证协议Portal认证方式Portal认证流程Portal认证用户下线Portal认证简介 定义: Portal认证通常也称作Web认证,一般将Portal认证网站成为门户网站。用户上网时,必须在门户网站进行认证,如果没有认…...
论文解读:ChangeFormer | A TRANSFORMER-BASED SIAMESE NETWORK FOR CHANGE DETECTION
论文地址:https://arxiv.org/pdf/2201.01293.pdf 项目代码:https://github.com/wgcban/ChangeFormer 发表时间:2022 本文提出了一种基于transformer的siamese网络架构(ChangeFormer),用于一对共配准遥感图…...
Redis 内存优化技巧
这次跟大家分享一些优化神技如何用更少的内存保存更多的数据?我们应该从 Redis 是如何保存数据的原理展开,分析键值对的存储结构和原理。从而继续延展出每种数据类型底层的数据结构,针对不同场景使用更恰当的数据结构和编码实现更少的内存占用…...
【java】笔试强训Day2【倒置字符串与排序子序列】
目录 ⛳选择题 1.A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明: 2.下面代码将输出什么内容:( ) 3.阅读如下代码。 请问,对语句行 test.hello(). 描述正确的有&…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...
02-性能方案设计
需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…...



