Golang每日一练(leetDay0005)
目录
13. 罗马数字转整数 Roman to Integer ★
14. 最长公共前缀 Longest Common Prefix ★
15. 三数之和 3Sum ★★★
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
13. 罗马数字转整数 Roman to Integer
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 罗马数字 2
写做 II
,即为两个并列的 1 。12
写做 XII
,即为 X
+ II
。 27
写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = "III" 输出: 3
示例 2:
输入: s = "IV" 输出: 4
示例 3:
输入: s = "IX" 输出: 9
示例 4:
输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s
仅含字符('I', 'V', 'X', 'L', 'C', 'D', 'M')
- 题目数据保证
s
是一个有效的罗马数字,且表示整数在范围[1, 3999]
内 - 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
- IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
- 关于罗马数字的详尽书写规则,可以参考 罗马数字(链接略) 。
代码:
package main
import (
"fmt"
)
var roman = map[string]int{
"I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000}
func romanToInt(s string) int {
if s == "" {
return 0
}
num, lastint, total := 0, 0, 0
for i := 0; i < len(s); i++ {
char := s[len(s)-(i+1) : len(s)-i]
num = roman[char]
if num < lastint {
total = total - num
} else {
total = total + num
}
lastint = num
}
return total
}
func main() {
fmt.Println(romanToInt("IX"))
fmt.Println(romanToInt("LVIII"))
fmt.Println(romanToInt("MCMXCIV"))
}
输出:
9
58
1994
14. 最长公共前缀 Longest Common Prefix
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
代码:
package main
import (
"fmt"
"strings"
)
func longestCommonPrefix(strs []string) string {
if len(strs) == 0 {
return ""
}
prefix := strs[0]
for i := 1; i < len(strs); i++ {
for !strings.HasPrefix(strs[i], prefix) {
prefix = prefix[:len(prefix)-1]
if prefix == "" {
return ""
}
}
}
return prefix
}
func main() {
fmt.Println(longestCommonPrefix([]string{"flower", "flow", "flight"}))
fmt.Println(longestCommonPrefix([]string{"dog", "racecar", "car"}))
}
输出:
fl
说明:
将第一个字符串作为公共前缀的初始值,从第二个字符串开始依次与公共前缀进行比较。
如果当前字符串不是以公共前缀开头,则将公共前缀缩短一个字符,继续比较。
如果公共前缀已经为空,则说明不存在公共前缀,返回空字符串。
15. 三数之和 3Sum
给你一个包含 n
个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c,使得 a + b + c = 0?请你找出所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = [] 输出:[]
示例 3:
输入:nums = [0] 输出:[]
提示:
0 <= nums.length <= 3000
-10^5 <= nums[i] <= 10^5
代码1:
package main
import (
"fmt"
"sort"
)
func threeSum(nums []int) [][]int {
sort.Ints(nums) // 先将数组排序
res := [][]int{}
for i := 0; i < len(nums)-2; i++ {
if i > 0 && nums[i] == nums[i-1] { // 跳过重复的元素
continue
}
l, r := i+1, len(nums)-1 // 双指针
for l < r {
sum := nums[i] + nums[l] + nums[r]
if sum == 0 {
res = append(res, []int{nums[i], nums[l], nums[r]})
for l < r && nums[l] == nums[l+1] { // 跳过重复的元素
l++
}
for l < r && nums[r] == nums[r-1] { // 跳过重复的元素
r--
}
l++
r--
} else if sum < 0 {
l++
} else {
r--
}
}
}
return res
}
func main() {
fmt.Println(threeSum([]int{-1, 0, 1, 2, -1, -4}))
fmt.Println(threeSum([]int{}))
fmt.Println(threeSum([]int{0}))
}
代码2:
package main
import (
"fmt"
"sort"
)
func threeSum(nums []int) [][]int {
sort.Ints(nums) // 先将数组排序
n := len(nums)
res := [][]int{}
for i := 0; i < n; i++ {
if i > 0 && nums[i] == nums[i-1] { // 去重
continue
}
k := n - 1
target := -nums[i]
for j := i + 1; j < n; j++ {
if j > i+1 && nums[j] == nums[j-1] { // 去重
continue
}
for j < k && nums[j]+nums[k] > target { // 双指针
k--
}
if j == k {
break
}
if nums[j]+nums[k] == target {
res = append(res, []int{nums[i], nums[j], nums[k]})
}
}
}
return res
}
func main() {
nums := []int{-1, 0, 1, 2, -1, -4}
fmt.Println(threeSum(nums))
fmt.Println(threeSum([]int{}))
fmt.Println(threeSum([]int{0}))
}
输出:
[[-1 -1 2] [-1 0 1]]
[]
[]
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
Golang每日一练 专栏 | |
Python每日一练 专栏 | |
C/C++每日一练 专栏 | |
Java每日一练 专栏 |