题解 | 华为HJ20-m#密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足1≤n≤100
输入描述:
一组字符串。
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出:
OK NG NG OK
#include <stdio.h>
#include <string.h>
//以下是Senky的代码:
int Judge_len(char* str, int len) { //判断长度
int is_length=0;
if (len >= 8) is_length = 1;
return is_length;
}
int Judge_num(char s) { //判断数字
int is_number=0;
if (s >= '0' && s <= '9') {
is_number = 1;
}
return is_number;
}
int Judge_gra_low(char s) { //判断小写字母
int is_gra_low=0;
if (s >= 'a' && s <= 'z') {
is_gra_low = 1;
}
return is_gra_low;
}
int Judge_gra_up(char s) { //判断大写字母
int is_gra_up=0;
if (s >= 'A' && s <= 'Z') {
is_gra_up = 1;
}
return is_gra_up;
}
int Judge_repeat(char* str, int len) { //长度大于2的子串重复就一定会有长度为3的子串重复
int no_repeat=1;
for (int i = 0; i < len - 3; i++) {
for (int j = i+1; j < len - 3; j++) {
if (str[i] == str[j] &&
str[i + 1] == str[j + 1] &&
str[i + 2] == str[j + 2]) {
no_repeat = 0;
return no_repeat;
}
}
}
return no_repeat;
}
void start() {
char str[101];
while (scanf("%s", str) != EOF) {
int len = strlen(str);
int is_length=0;//字符串长度合格标志
int is_number = 0; //字符串数字合格标志
int is_gra_low = 0; //字符串小写字母标志
int is_gra_up = 0; //字符串大写字母标志
int char_flag = 0; //有字符的标志
int no_repeat = 1; //字符串没有重复子串的标志
is_length=Judge_len(str, len); //长度是否合格
for (int i = 0; i < len ; i++) {
if (Judge_num(str[i])) is_number=1;//有数字
else if(Judge_gra_low(str[i])) is_gra_low=1;//有小写
else if(Judge_gra_up(str[i])) is_gra_up=1;//有大写
else char_flag = 1; //有字符
}
no_repeat =Judge_repeat(str, len); //2个以上的重复子串
//调试部分
// printf("长度:%d\n", is_length);
// printf("数字:%d\n", is_number);
// printf("小写:%d\n", is_gra_low);
// printf("大写:%d\n", is_gra_up);
// printf("重复:%d\n", no_repeat);
if (is_length &&
(3 <= is_number + is_gra_low + is_gra_up + char_flag) &&
no_repeat) {
printf("OK\n");
}else printf("NG\n");
}
}
int main() {
start();
return 0;//编辑于2022/10/13
}
总结:
①程序看起来代码没必要这么大量,但是为了维护程序的结构性,因此写的比较有逻辑和条理,读起来可以说毫不费劲 ;
② 当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;
华为-HJ 文章被收录于专栏
机试的题解
查看5道真题和解析
