牛客网之华为机试题:密码验证程序
一. 简介
本文记录牛客网上华为机试题,涉及字符串处理的题目:密码验证合格程序。
二. 牛客网之华为机试题:简单错误记录
描述
你需要书写一个程序验证给定的密码是否合格。
合格的密码要求:
∙ ∙长度不少于 88 位
∙ ∙必须包含大写字母、小写字母、数字、特殊字符中的至少三种
∙ ∙不能分割出两个独立的、长度大于 22 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 22 的独立子串 s1,s2s1,s2 ,使得 s1=s2s1=s2 ,那么密码不合法。
子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
可见字符集为 ASCII 码在 3333 到 126126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。
解题思路如下:
1. 逐行循环获取密码字符串;
2. 首先,对密码长度进行检查;小于8则输出 NG;
3. 其次,遍历字符串中每个字符,检查是否满足大写字母,小写字母,数字,特殊字符至少存在三种;
4. 最后,检查密码中是否含有相同的子串(子串长度>2);
这里,子串长度固定为3;
C语言实现如下:
#include <ctype.h>
#include <stdio.h>
#include <string.h>int main() {int i;char buf[100] = {0};//逐行循环读取密码while(scanf("%s", buf) != EOF) {int len = strlen(buf);int same_flag = 0;int upper_flag = 0;int lower_flag = 0;int digit_flag = 0;int special_flag = 0;//长度不小于8if(len < 8) {printf("NG\n");continue;}else {//判断是否满足大写字母,小写字母,数字,特殊字符至少三种for(i = 0; i<len; i++) {if(buf[i]>=33 && buf[i] <=126) {if(buf[i]>='A' && buf[i]<='Z') {upper_flag=1;}else if(buf[i]>='a' && buf[i]<='z') {lower_flag=1;}else if(buf[i]>='0' && buf[i]<='9') {digit_flag=1;}else {special_flag=1;}}else {printf("NG\n");break;}}int cnt = upper_flag+lower_flag+digit_flag+special_flag;if((cnt < 3)) {printf("NG\n");}else {//长度满足,类型满足,最后判断是否存在相同的子串for(i=0; (same_flag==0)&&(i<len-5); i++) {for(int j=i+3; j<len-2; j++) {if((buf[i]==buf[j]) && (buf[i+1]== buf[j+1]) && (buf[i+2]==buf[j+2])) {same_flag = 1;}}}if(same_flag==1) {printf("NG\n");}else{printf("OK\n");}}}}return 0;
}