前言
golang力扣leetcode 第 291 场周赛
都挺简单的,第四题太考验思维能力了,算ac三题吧
第一题
6047.移除指定数字得到的最大结果
6047.移除指定数字得到的最大结果
题解
模拟即可
代码
func removeDigit(number string, digit byte) string { ans := "" for i := 0; i < len(number); i++ { if number[i] == digit { cnt := number[:i] + number[i+1:] if cnt > ans { ans = cnt } } } return ans }
第二题
6048.必须拿起的最小连续卡牌数
6048.必须拿起的最小连续卡牌数
题解
思路:滑动窗口
代码
func minimumCardPickup(cards []int) int { left, right := 0, 0 ans := math.MaxInt32 mp := make(map[int]int) for right != len(cards) { mp[cards[right]]++ for mp[cards[right]] == 2 && left < right { ans = min(ans, right-left+1) mp[cards[left]]-- left++ } right++ } if ans == math.MaxInt32 { return -1 } return ans } func min(i, j int) int { if i < j { return i } return j }
第三题
6049.含最多K个可整除元素的子数组
6049.含最多K个可整除元素的子数组
题解
题目:求不同的连续数组个数,且数组中能整除p的元素不超过k个
思路:这题的难度是:如何对连续数组去重?
1.这里用map[[200]int]来存整个数组进行去重 2.将数组变成字符串形式存入map也可以
代码
func countDistinct(nums []int, k int, p int) int { mp := make(map[[200]int]struct{}) for i := range nums { temp := [200]int{} cnt, idx := 0, 0 for _, v := range nums[i:] { if v%p == 0 { cnt++ if cnt > k { break } } temp[idx] = v idx++ mp[temp] = struct{}{} } } return len(mp) }
第四题
6050.字符串的总引力
6050.字符串的总引力
题解
题目:字符串才分出长度为1,为2,为len(s)-1长度的子字符串,统计所有子字符串中不同字符的个数
思路:
1.如果s[i]之前没有出现过,那么每个子串的引力值都增加1,再加上s[i]这个长度为1的子串,引力值之和为i+1 2.如果s[i]之前出现过,设上次的下标为j, 那么s[0,j-1],s[1,j-1],s[j,i-1]末尾曾增加s[i], 对于这些字符串来说,s[i]字符存在过,其引力值不会变化。 3.而s[j+1,i-1],s[j+2,i-1]这些字符串, 由于不包含字符s[i],所以这些字符串的引力值会增加1, 因此有i-j-1个字符串,再加上s[i]这个长度为1的子串,引力值之和为i-j
代码
func appealSum(s string) int64 { sum, ans := 0, 0 pos := [26]int{} for i := range pos { pos[i] = -1 } for i := 0; i < len(s); i++ { ch := s[i] - 'a' sum += i - pos[ch] pos[ch] = i ans += sum } return int64(ans) }