LeetCode周赛第 291 场周赛(Go语言实现版)
Posted jiangxiaoju
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode周赛第 291 场周赛(Go语言实现版)相关的知识,希望对你有一定的参考价值。
原创不易,未经允许,请勿转载。
代码收录在https://github.com/jiang4869/go-algorithm 欢迎点个star
文章目录
6047. 移除指定数字得到的最大结果
题意
给你一个表示某个正整数的字符串 number 和一个字符 digit 。
从 number 中 恰好 移除 一个 等于 digit 的字符后,找出并返回按 十进制 表示 最大 的结果字符串。生成的测试用例满足 digit 在 number 中出现至少一次。
思路
这题可以用枚举的方式,找出分别移除每个位置的digit后,剩余的字符串,判断这些字符串中组成的数哪个是最大的
代码实现
func removeDigit(number string, digit byte) string
res := ""
for idx := range number
if number[idx] == digit
tmp := number[:idx] + number[idx+1:]
if len(tmp) > len(res)
res = tmp
else if len(tmp) == len(res)
if tmp > res
res = tmp
return res
6048. 必须拿起的最小连续卡牌数
题意
给你一个整数数组 cards ,其中 cards[i] 表示第 i 张卡牌的 值 。如果两张卡牌的值相同,则认为这一对卡牌 匹配 。
返回你必须拿起的最小连续卡牌数,以使在拿起的卡牌中有一对匹配的卡牌。如果无法得到一对匹配的卡牌,返回 -1 。
思路
原本想这题可以用尺取的方式来做,但是cards[i]的值范围太大了,在尺取过程中,判断是否满足条件的时候,会超时,因为时间复杂度最坏情况可能是O(n*m)。
这题题意要求连续的拍中要有相同的卡牌值,所以我们可以先把每个卡牌值出现的下表记录下来。然后找出距离最近的即可。
代码实现
func minimumCardPickup(cards []int) int
mmid := make(map[int][]int)
res := math.MaxInt32
for idx, val := range cards
mmid[val] = append(mmid[val], idx)
for _, v := range mmid
length := len(v)
for i := 0; i < length-1; i++
if (v[i+1] - v[i]) < res
res = v[i+1] - v[i] + 1
if res == math.MaxInt32
return -1
return res
6049. 含最多 K 个可整除元素的子数组
题意
给你一个整数数组 nums 和两个整数 k 和 p ,找出并返回满足要求的不同的子数组数,要求子数组中最多 k 个可被 p 整除的元素。
如果满足下述条件之一,则认为数组 nums1 和 nums2 是 不同 数组:
两数组长度 不同 ,或者
存在 至少 一个下标 i 满足 nums1[i] != nums2[i] 。
子数组 定义为:数组中的连续元素组成的一个 非空 序列。
思路
可以枚举子数组开头的位置i,然后找出以i为起点的子数组,有多少个满足题意的。对于满足题意的子数组,可以把它转成字符串,用map来去重,最后看map中有多少个元素即可。
代码实现
func countDistinct(nums []int, k int, p int) int
mmid := make(map[string]int)
length := len(nums)
for i := 0; i < length; i++
end := i
cnt := 0
res := ""
for end < length
if nums[end]%p == 0
cnt++
res += fmt.Sprintf("%03d", nums[end])
if cnt <= k
mmid[res]++
else
break
end++
return len(mmid)
6050. 字符串的总引力
题意
字符串的 引力 定义为:字符串中 不同 字符的数量。
例如,“abbca” 的引力为 3 ,因为其中有 3 个不同字符 ‘a’、‘b’ 和 ‘c’ 。
给你一个字符串 s ,返回 其所有子字符串的总引力 。
子字符串 定义为:字符串中的一个连续字符序列。
思路
这题其实跟某届蓝桥c++省赛题目一样。
要计算字符串的总引力的话,如果用暴力的方式遍历每个子串,显然是不可能的,复杂度是O(n^2)。
我们可以计算每个字符对总引力的一个贡献。先说结论,每个字符(下标为i,字符串长度为length)的贡献表示为
如果该字符第一次出现:(i+1)*(length-i)
否则:(i-上一次该字符出现的位置)*(length-i)
(下标从0开始)
以abbca
为例:
第一个字符a
参与贡献的子串有5个,
a
ab
abb
abbc
abbca
因为字符a
是第一次出现,所以贡献计算为(0+1)*(5-0)=5
第二个字符b
参与贡献的子串有8个
ab
abb
abbc
abbca
b
bb
bbc
bbca
因为字符b
是第一次出现,所以贡献计算为(1+1)*(5-1)=8
第三个字符b
参与贡献的子串有3个
b
bc
bca
因为字符b
不是第一次出现,上一次出现的位置为1,所以贡献计算为(2-1)*(5-2)=3
后面的以此类推
最后可以计算出该字符串总引力为28
代码实现
func appealSum(s string) int64
res := int64(0)
mmid := make(map[int32][]int)
for idx, val := range s
mmid[val] = append(mmid[val], idx)
length := len(s)
for _, v := range mmid
if len(v) > 0
res += int64((v[0] + 1) * (length - v[0]))
lenv := len(v)
for i := 1; i < lenv; i++
res += int64((v[i] - v[i-1]) * (length - v[i]))
return res
代码收录在https://github.com/jiang4869/go-algorithm 欢迎点个star
如果这篇文章对您有所帮助,麻烦点个一键三连。
原创不易,未经允许,请勿转载。
以上是关于LeetCode周赛第 291 场周赛(Go语言实现版)的主要内容,如果未能解决你的问题,请参考以下文章