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

如果这篇文章对您有所帮助,麻烦点个一键三连。

原创不易,未经允许,请勿转载。

博客主页:https://xiaojujiang.blog.csdn.net/

以上是关于LeetCode周赛第 291 场周赛(Go语言实现版)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode周赛第 291 场周赛(Go语言实现版)

LeetCode周赛第 288 场周赛(Go语言实现版)

LeetCode周赛第 288 场周赛(Go语言实现版)

LeetCode周赛第 288 场周赛(Go语言实现版)

LeetCode周赛第 288 场周赛(Go语言实现版)

LeetCode周赛第193场周赛