Go基础刷题笔记(2299. 强密码检验器 II) | 青训营笔记

403 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

题目

2299. 强密码检验器 II 如果一个密码满足以下所有条件,我们称它是一个  密码:

  • 它有至少 8 个字符。
  • 至少包含 一个小写英文 字母。
  • 至少包含 一个大写英文 字母。
  • 至少包含 一个数字 。
  • 至少包含 一个特殊字符 。特殊字符为:"!@#$%^&*()-+" 中的一个。
  • 它  包含 2 个连续相同的字符(比方说 "aab" 不符合该条件,但是 "aba" 符合该条件)。

给你一个字符串 password ,如果它是一个  密码,返回 true,否则返回 false 。

leetcode.cn/problems/st…

分析

题目层次

它有至少8个字符

用len函数获取字符串password的长度,如果该长度小于8,返回false

至少包含一个小写英文字母

遍历字符串password,如果一个小写英文字母都没有,返回false

至少包含一个大写英文字母

遍历字符串password,如果一个大写英文字母都没有,返回false

至少包含一个数字

遍历字符串password,如果一个数字都没有,返回false

至少包含一个特殊字符。特殊字符为:"!@#$%^&*()-+" 中的一个

遍历字符串password,如果一个特殊字符都没有,返回false

它不包含 2 个连续相同的字符

两两遍历(每两个地遍历)字符串password,如果连续两个字符相同,返回false

语言层次

字符与字符串

字符的类型

Go语言中字符有两种:一个是byte(用uint8表示,ASCII),另一个是rune(用int32表示,unicode字符集);通过range遍历得到一般是rune,通过切片得到的是byte或者是字符串。

我们通过下面这段代码验证

func main() {
    str := "12"
    fmt.Printf("str:%s, type:%T\n", str, str)
    fmt.Printf("str[0]:%d, type:%T\n", str[0], str[0])
    fmt.Printf("str[0:]:%s, type:%T\n", str[0:], str[0:])
    for _, v := range str {
        fmt.Printf("v:%d, type:%T\n", v, v)
        break
    }
}

结果如下:

str:12, type:string

str[0]:49, type:uint8

str[0:]:12, type:string

v:49, type:int32

内置的函数

在uncoide包下内置一些判断字符的函数,如IsUpperIsLowerIsDigit

在strings包下也内置了一些函数,如ContainsContainsRune.

参考代码

func strongPasswordCheckerII(password string) bool {
    len_ := len(password)
    if len_ < 8 {
        return false
    }
    var (
        haslor = false
        hasupr = false
        hasDig = false
        hasSec = false
    )
    for i, v := range password {
        if i != len_ - 1 {
            if password[i] == password[i + 1] {
                return false
            }
        }
        if unicode.IsLower(v) {
            haslor = true
        } else if unicode.IsUpper(v) {
            hasupr = true
        } else if unicode.IsDigit(v) {
            hasDig = true
        } else if strings.ContainsRune("!@#$%^&*()-+", v) {
            hasSec = true
        }
    }
    return haslor && hasupr && hasDig && hasSec
}