这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
题目
2299. 强密码检验器 II 如果一个密码满足以下所有条件,我们称它是一个 强 密码:
- 它有至少
8个字符。- 至少包含 一个小写英文 字母。
- 至少包含 一个大写英文 字母。
- 至少包含 一个数字 。
- 至少包含 一个特殊字符 。特殊字符为:
"!@#$%^&*()-+"中的一个。- 它 不 包含
2个连续相同的字符(比方说"aab"不符合该条件,但是"aba"符合该条件)。给你一个字符串
password,如果它是一个 强 密码,返回true,否则返回false。
分析
题目层次
它有至少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包下内置一些判断字符的函数,如IsUpper、IsLower、IsDigit。
在strings包下也内置了一些函数,如Contains、ContainsRune.
参考代码
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
}