题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
以下是使用Go语言实现的代码示例来验证密码是否符合要求:
package main import ( "fmt" "strings" "unicode" ) func isPasswordValid(password string) bool { if len(password) < 8 { return false } // 计算密码中包含的字符种类数量 characterTypes := 0 if containsLowerCase(password) { characterTypes++ } if containsUpperCase(password) { characterTypes++ } if containsDigit(password) { characterTypes++ } if containsSpecialSymbol(password) { characterTypes++ } if characterTypes < 3 { return false } // 检查密码中是否有长度大于2的包含公共元素的子串重复 for i := 0; i < len(password)-2; i++ { substr := password[i : i+3] if strings.Count(password, substr) > 1 { return false } } return true } func containsLowerCase(s string) bool { for _, c := range s { if unicode.IsLower(c) { return true } } return false } func containsUpperCase(s string) bool { for _, c := range s { if unicode.IsUpper(c) { return true } } return false } func containsDigit(s string) bool { for _, c := range s { if unicode.IsDigit(c) { return true } } return false } func containsSpecialSymbol(s string) bool { for _, c := range s { if !(unicode.IsLetter(c) || unicode.IsDigit(c)) { return true } } return false } func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { text := scanner.Text() if isPasswordValid(text) { fmt.Println("OK") } else { fmt.Println("NG") } } }
在上面的代码中,我们定义了一个 isPasswordValid
函数来检查密码是否符合要求。它首先检查密码长度是否超过8位,然后计算密码中包含的字符种类数量,如果少于3种,则返回 false。接下来,它会遍历密码中的每个三个字符的子串,并检查是否有重复出现的子串,如果有则返回 false。最后,如果所有的条件都满足,则返回 true。
在 main
函数中,我们读取用户输入的密码,并调用 isPasswordValid
函数进行验证。根据验证结果输出 "OK" 或 "NG"。
package main import ( "bufio" "fmt" "os" ) func valid(str string) bool { // 判断长度 if len(str) <= 8 { return false } // 包括大小写字母,数字,其他符号,以上四种至少三种 mapSet := map[int]bool{} for i := 0; i < len(str); i++ { if str[i] >= '0' && str[i] <= '9' { mapSet[0] = true } else if str[i] >= 'A' && str[i] <= 'Z' { mapSet[1] = true } else if str[i] >= 'a' && str[i] <= 'z' { mapSet[2] = true } else { mapSet[3] = true } } count := 0 for _, v := range mapSet { if v { count++ } } if count < 3 { return false } // 不能有长度大于2的不含公共元素的子串重复(注:其他符号不含空格或换行) m := make(map[string]bool) for i := 0; i < len(str)-2; i++ { if m[str[i:i+3]] { return false } else { m[str[i:i+3]] = true } } return true } func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { text := scanner.Text() if valid(text) { fmt.Println("OK") } else { fmt.Println("NG") } } }
错误示例:
package main import ( "bufio" "fmt" "os" "strings" "unicode" ) func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { password := scanner.Text() if isValidPassword(password) { fmt.Println("OK") } else { fmt.Println("NG") } } } func isValidPassword(password string) bool { // 检查长度是否超过8位 if len(password) <= 8 { return false } // 检查是否包括大小写字母、数字、其他符号 var hasLower, hasUpper, hasDigit, hasSymbol bool for _, char := range password { switch { case unicode.IsLower(char): hasLower = true case unicode.IsUpper(char): hasUpper = true case unicode.IsDigit(char): hasDigit = true case !unicode.IsSpace(char) && !unicode.IsControl(char): hasSymbol = true } } if !(hasLower && hasUpper && hasDigit && hasSymbol) { return false } // 检查是否有长度大于2的包含公共元素的子串重复 for i := 0; i < len(password)-3; i++ { substr := password[i : i+3] if strings.Contains(password[i+3:], substr) { return false } } return true }
这段代码首先读取输入的字符串数量,然后使用循环读取每个密码字符串。对于每个密码字符串,调用isValidPassword
函数来判断是否符合密码要求。isValidPassword
函数首先检查密码长度是否超过8位。然后使用循环遍历每个字符,检查是否包括大小写字母、数字和其他符号。最后,使用循环检查是否有长度大于2的包含公共元素的子串重复。如果所有条件都满足,则返回true
,否则返回false
。
最后,根据isValidPassword
函数的返回值,打印输出"OK"或"NG"。
华为机试题解 文章被收录于专栏
华为机试102道题解