从零开始的力扣刷题记录-第三十六天

力扣每日四题

  • 520. 检测大写字母-简单
  • 1021. 删除最外层的括号-简单
  • 1103. 分糖果 II-简单
  • 904. 水果成篮-中等
  • 总结

520. 检测大写字母-简单

题目描述:
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “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
}

1021. 删除最外层的括号-简单

题目描述:
有效括号字符串为空 “”、“(” + 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
}

1103. 分糖果 II-简单

题目描述:
排排坐,分糖果。
我们买了一些糖果 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
}

904. 水果成篮-中等

题目描述:
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 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
}

总结

今天的题目比较常规,双指针是数组问题永远的神!

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)