遍历 words 的字字符串 word,定义变量 begin 表示子字符串开始位置,当 words[i]==separator 时表示 word[begin:i] 是满足条件的子串,将子串加入结果集中,同时 begin=i+1 表示为下一个字符串的开始位置。
注意:
当 words[i]==separator 且 begin=i 时会切割出空字符串,需要跳过
当 word 遍历结束后,begin<len(word) 时,需要将 word[begin:] 加入结果集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
funcsplitWordsBySeparator(words []string, separator byte) []string { var res []string for _, word := range words { begin := 0 for i, w := range word { if w == int32(separator) { if i != begin { res = append(res, word[begin:i]) } begin = i + 1 } } if begin < len(word) { res = append(res, word[begin:]) } } return res }
6915. 合并后数组中的最大元素
倒序相加:
遵循 「正难则反」的原则,从后往前倒序遍历,nums[i−1]<=nums[i] 时进行合并,使用 res 记录最大值。
第一个数可能比后面累加起来都要大,所以 res 初始值为 nums[0]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
funcmaxArrayValue(nums []int)int64 { res := nums[0] for i := len(nums) - 1; i > 0; { if nums[i] >= nums[i-1] { nums[i] += nums[i-1] if nums[i] > res { res = nums[i] } nums = append(nums[:i-1], nums[i:]...) } i-- } returnint64(res) }
6955. 长度递增组的最大数目
解题思路:
首先将 usageLimits 排序,假设排好序的数组为 usageLimits=[1,2,3,4,5],我们可以组出如下数组(其中 x 为占位符):
funcmaxIncreasingGroups(usageLimits []int)int { sort.Ints(usageLimits) curr, ans := 0, 0 for _, n := range usageLimits { curr += n if curr>=ans+1 { ans += 1 curr -= ans } } return ans }
funccountPalindromePaths(parent []int, s string)int64 { n := len(parent) type pair struct{ to, wt int } g := make([][]pair, n) for i := 1; i < n; i++ { p := parent[i] g[p] = append(g[p], pair{i, 1 << (s[i] - 'a')}) }
ans := 0 cnt := map[int]int{0: 1} // 一条「空路径」 var dfs func(int, int) dfs = func(v, xor int) { for _, e := range g[v] { x := xor ^ e.wt ans += cnt[x] // x ^ x = 0 for i := 0; i < 26; i++ { ans += cnt[x^(1<<i)] // x ^ (x^(1<<i)) = 1<<i } cnt[x]++ dfs(e.to, x) } } dfs(0, 0) returnint64(ans) }