题目描述:
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
题解:
if else+for循环判断就可以了,一共就三种情况
代码(Go):
func detectCapitalUse(word string) bool {
if len(word) == 1{
return true
}
if word[0] >= 'A' && word[0] <= 'Z'{
if word[1] >= 'A' && word[1] <= 'Z'{
for i := 2;i < len(word);i++{
if word[i] >= 'a' && word[i] <= 'z'{
return false
}
}
}else{
for i := 2;i < len(word);i++{
if word[i] >= 'A' && word[i] <= 'Z'{
return false
}
}
}
}else{
for i := 1;i < len(word);i++{
if word[i] >= 'A' && word[i] <= 'Z'{
return false
}
}
}
return true
}
题目描述:
有效括号字符串为空 “”、“(” + A + “)” 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。
例如,“”,“()”,“(())()” 和 “(()(()))” 都是有效的括号字符串。
如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。
对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s 。
题解:
用一个变量完成符号匹配,遇左括号加一右括号减一。等于0时将字符串保存下来,最后完成去外括号后拼接。官方题解时空复杂度虽然和我一样但是时空都优化了很多,实际上不需要将字符串保存下来,可以在遍历的时候随时存储,这样只需要遍历一次字符串就能得到最终结果
代码(Go):
func removeOuterParentheses(s string) string {
sce := []string{}
num := 0
start := 0
for i,v := range s{
if v == '('{
num++
}else{
num--
}
if num == 0{
sce = append(sce,s[start:i + 1])
start = i + 1
}
}
var re string
for _,v := range sce{
if v != "()"{
temp := v[1:len(v) - 1]
re += temp
}
}
return re
}
题目描述:
排排坐,分糖果。
我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。
给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。
然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。
重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为 num_people、元素之和为 candies 的数组,以表示糖果的最终分发情况(即 ans[i] 表示第 i 个小朋友分到的糖果数)。
题解:
for循环暴力模拟。这题一看就是有数学方法,官方题解有详细说明,而且这题暴力模拟没有特别慢,时间依然能击败100%
代码(Go):
func distributeCandies(candies int, num_people int) []int {
i := 1
sce := make([]int,num_people)
for candies != 0{
if candies >= i{
sce[(i - 1)%num_people] += i
candies -= i
i++
}else{
sce[(i - 1)%num_people] += candies
candies = 0
}
}
return sce
}
题目描述:
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。
题解:
思路类似双指针,一个指向开始位置(第一种水果),一个指向第二种水果,只不过还需要有一个指针用来指向当出现第三种水果时,第一个指针需要移动到的位置,遍历一遍数组即可求解
代码(Go):
func totalFruit(fruits []int) int {
startone,starttwo,end := 0,0,0
length := 0
for i,v := range fruits{
if v != fruits[startone] && v != fruits[starttwo]{
if i - startone > length{
length = i - startone
}
startone = end
starttwo = i
end = starttwo
}
if v != fruits[end]{
end = i
}
}
if len(fruits) - startone > length{
length = len(fruits) - startone
}
return length
}
今天的题目比较常规,双指针是数组问题永远的神!