Golang每日一练(leetDay0024) 爬楼梯、简化路径、编辑距离

简介: Golang每日一练(leetDay0024) 爬楼梯、简化路径、编辑距离

70. 爬楼梯 Climbing Stairs

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2

输出:2

解释:有两种方法可以爬到楼顶。

1. 1 阶 + 1 阶

2. 2 阶

示例 2:

输入:n = 3

输出:3

解释:有三种方法可以爬到楼顶。

1. 1 阶 + 1 阶 + 1 阶

2. 1 阶 + 2 阶

3. 2 阶 + 1 阶


提示:

  • 1 <= n <= 45

代码: 题目本质就是斐波那切数列

package main
import "fmt"
func climbStairs(n int) int {
  if n <= 1 {
    return 1
  }
  dp := make([]int, n+1)
  dp[0], dp[1] = 1, 1
  for i := 2; i <= n; i++ {
    dp[i] = dp[i-1] + dp[i-2]
  }
  return dp[n]
}
func main() {
  fmt.Println(climbStairs(2))
  fmt.Println(climbStairs(3))
  fmt.Println(climbStairs(5))
}

输出:

2

3

8


71. 简化路径 Simplify Path

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/'
  • 最后一个目录名(如果存在)不能 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.''..')。

返回简化后得到的 规范路径

示例 1:

输入:path = "/home/"

输出:"/home"

解释:注意,最后一个目录名后面没有斜杠。

示例 2:

输入:path = "/../"

输出:"/"

解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。


示例 3:

输入:path = "/home//foo/"

输出:"/home/foo"

解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。


示例 4:

输入:path = "/a/./b/../../c/"

输出:"/c"


提示:

  • 1 <= path.length <= 3000
  • path 由英文字母,数字,'.''/''_' 组成。
  • path 是一个有效的 Unix 风格绝对路径。

代码:

package main
import (
  "fmt"
  "strings"
)
func simplifyPath(path string) string {
  dirs := strings.Split(path, "/")
  stack := make([]string, 0)
  for _, dir := range dirs {
    if dir == "" || dir == "." {
      continue
    }
    if dir == ".." {
      if len(stack) > 0 {
        stack = stack[:len(stack)-1]
      }
    } else {
      stack = append(stack, dir)
    }
  }
  return "/" + strings.Join(stack, "/")
}
func main() {
  fmt.Println(simplifyPath("/home/"))
  fmt.Println(simplifyPath("/../"))
  fmt.Println(simplifyPath("/home//foo/"))
  fmt.Println(simplifyPath("/a/./b/../../c/"))
}

输出:

/home

/

/home/foo

/c


72. 编辑距离 Edit Distance

给你两个单词 word1word2请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros"

输出:3

解释:

horse -> rorse (将 'h' 替换为 'r')

rorse -> rose (删除 'r')

rose -> ros (删除 'e')


示例 2:

输入:word1 = "intention", word2 = "execution"

输出:5

解释:

intention -> inention (删除 't')

inention -> enention (将 'i' 替换为 'e')

enention -> exention (将 'n' 替换为 'x')

exention -> exection (将 'n' 替换为 'c')

exection -> execution (插入 'u')


提示:

  • 0 <= word1.length, word2.length <= 500
  • word1word2 由小写英文字母组成

代码1:

package main
import (
  "fmt"
)
func minDistance(word1 string, word2 string) int {
  m, n := len(word1), len(word2)
  dp := make([][]int, m+1)
  for i := 0; i <= m; i++ {
    dp[i] = make([]int, n+1)
    dp[i][0] = i
  }
  for j := 1; j <= n; j++ {
    dp[0][j] = j
  }
  for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
      if word1[i-1] == word2[j-1] {
        dp[i][j] = dp[i-1][j-1]
      } else {
        dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
      }
    }
  }
  return dp[m][n]
}
func min(a, b, c int) int {
  if a <= b && a <= c {
    return a
  }
  if b <= a && b <= c {
    return b
  }
  return c
}
func main() {
  word1 := "horse"
  word2 := "ros"
  fmt.Println(minDistance(word1, word2))
  word1 = "intention"
  word2 = "execution"
  fmt.Println(minDistance(word1, word2))
}

代码2:滚动数组

package main
import (
  "fmt"
)
func minDistance(word1 string, word2 string) int {
  m, n := len(word1), len(word2)
  dp := make([]int, n+1)
  for j := 1; j <= n; j++ {
    dp[j] = j
  }
  for i := 1; i <= m; i++ {
    pre := dp[0]
    dp[0] = i
    for j := 1; j <= n; j++ {
      temp := dp[j]
      if word1[i-1] == word2[j-1] {
        dp[j] = pre
      } else {
        dp[j] = min(pre, dp[j-1], dp[j]) + 1
      }
      pre = temp
    }
  }
  return dp[n]
}
func min(a, b, c int) int {
  if a <= b && a <= c {
    return a
  }
  if b <= a && b <= c {
    return b
  }
  return c
}
func main() {
  word1 := "horse"
  word2 := "ros"
  fmt.Println(minDistance(word1, word2))
  word1 = "intention"
  word2 = "execution"
  fmt.Println(minDistance(word1, word2))
}

代码3: 记忆化搜索

package main
import (
  "fmt"
)
func minDistance(word1 string, word2 string) int {
  m, n := len(word1), len(word2)
  memo := make([][]int, m)
  for i := range memo {
    memo[i] = make([]int, n)
    for j := range memo[i] {
      memo[i][j] = -1
    }
  }
  var dfs func(i, j int) int
  dfs = func(i, j int) int {
    if i+1 == 0 {
      return j + 1
    }
    if j+1 == 0 {
      return i + 1
    }
    if memo[i][j] != -1 {
      return memo[i][j]
    }
    if word1[i] == word2[j] {
      memo[i][j] = dfs(i-1, j-1)
    } else {
      memo[i][j] = min(dfs(i-1, j-1), dfs(i, j-1), dfs(i-1, j)) + 1
    }
    return memo[i][j]
  }
  return dfs(m-1, n-1)
}
func min(a, b, c int) int {
  if a <= b && a <= c {
    return a
  }
  if b <= a && b <= c {
    return b
  }
  return c
}
func main() {
  word1 := "horse"
  word2 := "ros"
  fmt.Println(minDistance(word1, word2))
  word1 = "intention"
  word2 = "execution"
  fmt.Println(minDistance(word1, word2))
}

输出:

3

5


🌟 每日一练刷题专栏 🌟

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

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

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

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

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


相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
20天前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
58 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
20天前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
34 0
Linux 终端命令之文件浏览(2) more
|
20天前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
26 0
Linux 终端操作命令(2)内部命令
|
20天前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
41 0
力扣 C++|一题多解之动态规划专题(2)
|
20天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
73 0
|
20天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
145 1
|
20天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
62 1
|
20天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
66 1
|
20天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
33 1
|
20天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
46 0