草庐IT

Golang每日一练(leetDay0022)

Hann Yang 2024-06-11 原文

目录

64. 最小路径和 Minimum Path Sum  🌟🌟

65. 有效数字 Valid Number  🌟🌟🌟

66. 加一 Plus One  🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


64. 最小路径和 Minimum Path Sum

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

代码1:动态规划

package main

import (
	"fmt"
)

func minPathSum(grid [][]int) int {
	m, n := len(grid), len(grid[0])
	dp := make([][]int, m)
	for i := range dp {
		dp[i] = make([]int, n)
	}
	dp[0][0] = grid[0][0]
	for i := 1; i < m; i++ {
		dp[i][0] = dp[i-1][0] + grid[i][0]
	}
	for j := 1; j < n; j++ {
		dp[0][j] = dp[0][j-1] + grid[0][j]
	}
	for i := 1; i < m; i++ {
		for j := 1; j < n; j++ {
			dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
		}
	}
	return dp[m-1][n-1]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func main() {
	grid := [][]int{{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}
	fmt.Println(minPathSum(grid))

	grid = [][]int{{1, 2, 3}, {4, 5, 6}}
	fmt.Println(minPathSum(grid))
}

输出:

7
12

代码2:DFS

package main

import (
	"fmt"
)

func minPathSum(grid [][]int) int {
	m, n := len(grid), len(grid[0])
	return dfs(grid, m-1, n-1)
}

func dfs(grid [][]int, i, j int) int {
	if i == 0 && j == 0 {
		return grid[0][0]
	}
	res, left := 1<<31, 1<<31
	if i > 0 {
		res = dfs(grid, i-1, j)
	}
	if j > 0 {
		left = dfs(grid, i, j-1)
	}
	if res > left {
		res = left
	}
	return res + grid[i][j]
}

func main() {
	grid := [][]int{{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}
	fmt.Println(minPathSum(grid))

	grid = [][]int{{1, 2, 3}, {4, 5, 6}}
	fmt.Println(minPathSum(grid))
}

 写成闭包函数:

package main

import (
	"fmt"
)

func minPathSum(grid [][]int) int {
	var dfs func(i, j int) int
	dfs = func(i, j int) int {
		if i == 0 && j == 0 {
			return grid[0][0]
		}
		res, left := 1<<31, 1<<31
		if i > 0 {
			res = dfs(i-1, j)
		}
		if j > 0 {
			left = dfs(i, j-1)
		}
		if res > left {
			res = left
		}
		return res + grid[i][j]
	}
	return dfs(len(grid)-1, len(grid[0])-1)
}

func main() {
	grid := [][]int{{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}
	fmt.Println(minPathSum(grid))

	grid = [][]int{{1, 2, 3}, {4, 5, 6}}
	fmt.Println(minPathSum(grid))
}

65. 有效数字 Valid Number

有效数字(按顺序)可以分成以下几个部分:

  1. 一个 小数 或者 整数
  2. (可选)一个 'e' 或 'E' ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-'
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 '.'
    2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3. 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-'
  2. 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

示例 1:

输入:s = "0"
输出:true

示例 2:

输入:s = "e"
输出:false

示例 3:

输入:s = "."
输出:false

提示:

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,或者点 '.' 。

代码:

package main

import (
	"fmt"
	"strings"
)

func isNumber(s string) bool {
	s = strings.TrimSpace(s)
	if len(s) == 0 {
		return false
	}
	hasNum := false
	hasDot := false
	hasE := false
	for i, ch := range s {
		if ch >= '0' && ch <= '9' {
			hasNum = true
		} else if ch == '.' {
			if hasDot || hasE || i == len(s)-1 || (i == 0 && len(s) == 1) {
				return false
			}
			hasDot = true
		} else if ch == 'e' || ch == 'E' {
			if hasE || !hasNum || i == len(s)-1 || i == 0 {
				return false
			}
			hasE = true
			hasNum = false
		} else if ch == '+' || ch == '-' {
			if i != 0 && (s[i-1] != 'e' && s[i-1] != 'E') {
				return false
			}
		} else {
			return false
		}
	}
	return hasNum
}

func main() {
	fmt.Println(isNumber("0"))
	fmt.Println(isNumber(" 0.1 "))
	fmt.Println(isNumber("abc"))
	fmt.Println(isNumber("1 a"))
	fmt.Println(isNumber("2e10"))
	fmt.Println(isNumber(" -90e3   "))
	fmt.Println(isNumber(" 1e"))
	fmt.Println(isNumber("e3"))
	fmt.Println(isNumber(" 6e-1"))
	fmt.Println(isNumber(" 99e2.5 "))
	fmt.Println(isNumber("53.5e93"))
	fmt.Println(isNumber(" --6 "))
	fmt.Println(isNumber("-+3"))
	fmt.Println(isNumber("95a54e53"))
}

输出:

true
true
false
false
true
true
false
false
true
false
true
false
false
false

代码2:

用正则表达式判断

package main

import (
	"fmt"
	"regexp"
)

func isNumber(s string) bool {
	pattern := "^\\s*([+-]?((\\d+\\.?)|(\\.\\d+)|(\\d+\\.\\d+)))((e|E)[+-]?\\d+)?\\s*$"
	matched, _ := regexp.MatchString(pattern, s)
	return matched
}

func main() {
	fmt.Println(isNumber("0"))
	fmt.Println(isNumber(" 0.1 "))
	fmt.Println(isNumber("abc"))
	fmt.Println(isNumber("1 a"))
	fmt.Println(isNumber("2e10"))
	fmt.Println(isNumber(" -90e3   "))
	fmt.Println(isNumber(" 1e"))
	fmt.Println(isNumber("e3"))
	fmt.Println(isNumber(" 6e-1"))
	fmt.Println(isNumber(" 99e2.5 "))
	fmt.Println(isNumber("53.5e93"))
	fmt.Println(isNumber(" --6 "))
	fmt.Println(isNumber("-+3"))
	fmt.Println(isNumber("95a54e53"))
}

66. 加一 Plus One

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [0]
输出:[1]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

代码:

package main

import (
	"fmt"
)

func plusOne(digits []int) []int {
	n := len(digits)
	for i := n - 1; i >= 0; i-- {
		if digits[i] < 9 {
			digits[i]++
			return digits
		}
		digits[i] = 0
	}
	return append([]int{1}, digits...)
}

func plusOne2(digits []int) []int {
	n := len(digits)
	for i := n - 1; i >= 0; i-- {
		if digits[i] < 9 {
			digits[i]++
			for j := i + 1; j < n; j++ {
				digits[j] = 0
			}
			return digits
		}
	}
	return append([]int{1}, make([]int, n)...)
}

func plusOne3(digits []int) []int {
	var carry int // 进位
	n := len(digits)
	digits[n-1]++
	for i := n - 1; i >= 0; i-- {
		digits[i] += carry
		carry = digits[i] / 10
		digits[i] %= 10
	}
	if carry > 0 {
		digits = append([]int{1}, digits...)
	}
	return digits
}

func main() {
	digits := []int{4, 3, 2, 1}
	fmt.Println(plusOne(digits))
	digits2 := []int{4, 3, 2, 1}
	fmt.Println(plusOne2(digits2))
	digits3 := []int{4, 3, 2, 1}
	fmt.Println(plusOne3(digits3))
}

输出:

[4 3 2 2]
[4 3 2 2]
[4 3 2 2]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

有关Golang每日一练(leetDay0022)的更多相关文章

  1. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  2. Python:每日一题之小张的衣服(优先队列、哈夫曼编码) - 2

    题目描述小张买了 n 件白色的衣服,他觉得所有衣服都是一种颜色太单调,希望对这些衣服进行染色,每次染色时,他会将某种颜色的所有衣服寄去染色厂,第 i 件衣服的邮费为 ai​ 元,染色厂会按照小张的要求将其中一部分衣服染成同一种任意的颜色,之后将衣服寄给小张,请问小张要将 n 件衣服染成不同颜色的最小代价是多少?输入描述第一行为一个整数 n ,表示衣服的数量。第二行包括 n 个整数a1​,a2​...an​ 表示第 i 件衣服的邮费为 ai​ 元。(1≤n≤10^5,1≤ai​≤10^9 )输出描述输出一个整数表示小张所要花费的最小代价。输入输出样例输入551321输出25 思考🤔:题意:意思是

  3. C++---最长上升子序列模型---最大上升子序列和(每日一道算法2023.3.3) - 2

    注意事项:本题为"线性dp—最长上升子序列的长度"的扩展题,所以dp思路这里就不再赘述。题目:比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等。这些子序列中和最大为18,为子序列(1,3,5,9)的和。你的任务,就是对于给定的序列,求出最大上升子序列和。注意,最长的上升子序列的和不一定是最大的,比如序列(100,1,2,3)的最大上升子序列和为100,而最长上升子序列为(1,2,3)。输入格式输入的第一行是序列的长度N。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。输出格式输出一个整数,表示最大上升子序列和。数据

  4. 牛客竞赛每日俩题 - 动态规划3 - 2

    目录类01背包问题,选or不选变种走方格类01背包问题,选or不选不同的子序列_牛客题霸_牛客网问题翻译:        S有多少个不同的子串与T相同        S[1:m]中的子串与T[1:n]相同的个数        由S的前m个字符组成的子串与T的前n个字符相同的个数状态:        子状态:由S的前1,2,...,m个字符组成的子串与T的前1,2,...,n个字符相同的个数        F(i,j):S[1:i]中的子串与T[1:j]相同的个数状态递推:        在F(i,j)处需要考虑S[i]=T[j]和S[i]!=T[j]两种情况        当S[i]=T[j]

  5. ​ 【蓝桥杯】每日四道编程题(两道真题+两道模拟)​| 第6天 - 2

    专栏: 蓝桥杯——每日四道编程题(两道真题+两道模拟)“蓝桥杯就要开始了,这些题刷到就是赚到”₍ᐢ..ᐢ₎♡另一个专栏: 蓝桥杯——每日四道填空题(两道真题+两道模拟题)专题前瞻:复习并查集、Tire字符串、双指针、二分目录第一道真题(日志统计)输出描述输入输出样例第二道真题(合根植物)输出描述输入输出样例第三道模拟题(acwing):Trie字符串统计第四道真题(扫地机器人)题目描述第一道真题(日志统计) 输出描述按从小到大的顺序输出热帖 id。每个 id 一行。输入输出样例输入:71020101010101019110031003输出;13运行限制最大运行时间:1s最大运行内存:256M双

  6. 【蓝桥杯】每日四道填空题(两道真题+两道模拟题)| 第四天 - 2

    专栏:蓝桥杯——每日四道填空题(两道真题+两道模拟题)&离蓝桥杯已经不到一个月时间了,赶快刷起来吧,填空题一定别丢分!!୧꒰•̀ᴗ•́꒱୨另一个专栏是:蓝桥杯——编程题刷题营(每日四题,两道模拟,两道真题)目录第一道真题(2016年省赛):寒假作业 |答案:64第二道真题(2019年省赛):质数 |答案:17569第三道模拟题(2022年第二次模拟赛): 拆分质数个数|答案:33第四道模拟题():答案:10第一道真题(2016年省赛):寒假作业 |答案:64题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。现在小学的数学题目也不是那么好玩的。看看这个寒假作业:  

  7. 【C语言每日亿题】运算符专练 · 第4日 - 2

    🌕写在前面Hello🤗大家好啊,我是kikokingzz,名字太长不好记,大家可以叫我kiko哦~从今天开始,我将正式开启一个新的打卡专题——《C语言百炼成神计划》,没错!百炼成神,目的是通过百天刷题计划,通过题目和知识点串联的方式,完成C语言的复习和巩固;后期还会配有专门的笔记总结和文档教程哦!想要搞定,搞透C语言的同学🎉🎉欢迎持续关注🎉🎉🍊博客主页:kikoking的江湖背景🍊🌟🌟往期必看🌟🌟🔥【C语言百炼成神】第一日·操作符🔥🔥【C语言百炼成神】第二日·操作符🔥🔥【C语言百炼成神】第三日·操作符🔥ps:文章若有任何疑问欢迎光速评论私信我!!有时kiko可能会打错,脑子瓦特了😵‍💫目录🌕写

  8. 利用腾讯云函数实现和鲸社区每日自动登录 - 2

    和鲸社区算是国内比较不错的机器学习算力平台,可以通过每日登录积累成长值,每月还会给鲸币奖励,有一段时间每天都会登登陆一次,但是有时候还是会忘记。最近根据腾讯云Serverless部署云函数实现自动登录,解放双手。首先每次登陆后将进行微信推送,我采用的是pushplus平台,获取token即可。微信推送#从pushplus平台获取tokentoken='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'defsendToWechat(title,content):url='http://www.pushplus.plus/send'headers={'Content-Type

  9. 华为OD机试Golang解题 - 任务总执行时长 - 2

    华为Od必看系列华为OD机试全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理已参加机试人员的实战技巧华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典文章目录华为Od必看系列使用说明本期题目:任务总执行时长题目输入输出示例一输入输出说明go代码实现华为OD其它语言版本

  10. 【编程实践】Golang 获取HTTP请求的IP地址 - 2

    目录Golang获取HTTP请求的IP地址HTTP的发展历史3,HTTP所在的网络层次4,HTTP请求与响应

随机推荐