Golang每日一练(leetDay0031)

简介: Golang每日一练(leetDay0031)

91. 解码方法  Decode Ways


一条包含字母 A-Z 的消息通过以下映射进行了 编码


'A' -> "1"

'B' -> "2"

...

'Z' -> "26"

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:


   "AAJF" ,将消息分组为 (1 1 10 6)

   "KJF" ,将消息分组为 (11 10 6)

注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。


给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。


示例 1:

输入:s = "12"

输出:2

解释:它可以解码为 "AB"(1 2)或者 "L"(12)。


示例 2:

输入:s = "226"

输出:3

解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。


示例 3:

输入:s = "0"

输出:0

解释:没有字符映射到以 0 开头的数字。

含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。

由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。


提示:

   1 <= s.length <= 100

   s 只包含数字,并且可能包含前导零。


代码1: 动态规划


package main
import (
  "fmt"
)
func numDecodings(s string) int {
  n := len(s)
  if n == 0 {
    return 0
  }
  dp := make([]int, n+1)
  dp[0] = 1
  if s[0] == '0' {
    dp[1] = 0
  } else {
    dp[1] = 1
  }
  for i := 2; i <= n; i++ {
    if s[i-1] != '0' {
      dp[i] = dp[i-1]
    }
    if s[i-2] == '1' || (s[i-2] == '2' && s[i-1] >= '0' && s[i-1] <= '6') {
      dp[i] += dp[i-2]
    }
  }
  return dp[n]
}
func main() {
  fmt.Println(numDecodings("12"))
  fmt.Println(numDecodings("226"))
  fmt.Println(numDecodings("0"))
}

输出:

2

3

0

代码2: 滚动数组

package main
import (
  "fmt"
)
func numDecodings(s string) int {
  n := len(s)
  if n == 0 {
    return 0
  }
  prev1, prev2 := 1, 0
  if s[0] == '0' {
    prev1, prev2 = 0, 0
  } else {
    prev1, prev2 = 1, 1
  }
  for i := 2; i <= n; i++ {
    cur := 0
    if s[i-1] != '0' {
      cur = prev1
    }
    if s[i-2] == '1' || (s[i-2] == '2' && s[i-1] >= '0' && s[i-1] <= '6') {
      cur += prev2
    }
    prev1, prev2 = cur, prev1
  }
  return prev1
}
func main() {
  fmt.Println(numDecodings("12"))
  fmt.Println(numDecodings("226"))
  fmt.Println(numDecodings("0"))
}

代码3: DFS

package main
import (
  "fmt"
)
func numDecodings(s string) int {
  n := len(s)
  memo := make([]int, n)
  return dfs(s, 0, memo)
}
func dfs(s string, start int, memo []int) int {
  if start == len(s) {
    return 1
  }
  if memo[start] != 0 {
    return memo[start]
  }
  res := 0
  if s[start] != '0' {
    res += dfs(s, start+1, memo)
  }
  if start+1 < len(s) && (s[start] == '1' || (s[start] == '2' && s[start+1] >= '0' && s[start+1] <= '6')) {
    res += dfs(s, start+2, memo)
  }
  memo[start] = res
  return res
}
func main() {
  fmt.Println(numDecodings("12"))
  fmt.Println(numDecodings("226"))
  fmt.Println(numDecodings("0"))
}





92. 反转链表 II Reverse Linked List II


给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:


512115557df8779d0db86569f1aa284f.jpeg



输入:head = [1,2,3,4,5], left = 2, right = 4

输出:[1,4,3,2,5]


示例 2:

输入:head = [5], left = 1, right = 1

输出:[5]  


提示:

   链表中节点数目为 n

   1 <= n <= 500

   -500 <= Node.val <= 500

   1 <= left <= right <= n


进阶: 你可以使用一趟扫描完成反转吗?


代码:

go


输出:

1->2->3->4->5<nil>

3->2->1->4->5<nil>




93. 复原 IP 地址 Restore IP Addresses


有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。


   例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。


给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。


示例 1:

输入:s = "25525511135"

输出:["255.255.11.135","255.255.111.35"]


示例 2:

输入:s = "0000"

输出:["0.0.0.0"]


示例 3:

输入:s = "101023"

输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]


提示:

   1 <= s.length <= 20

   s 仅由数字组成


代码:

go


输出:









目录
相关文章
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
182 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
136 0
Linux 终端命令之文件浏览(2) more
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
243 0
Linux 终端操作命令(2)内部命令
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
193 0
力扣 C++|一题多解之动态规划专题(2)
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
225 0
Python Numpy入门基础(一)创建数组
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
1120 0
Java语言程序设计试卷6套
|
Java Go C++
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
188 0
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
279 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
16天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
68 1
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
522 4
Golang语言之管道channel快速入门篇

热门文章

最新文章

推荐镜像

更多