首先看一下题
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足 1≤n≤100
输入描述:
一组字符串。
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000输出:
OK NG NG OK
一、问题分析
1.提出了一些对于密码的要求比如
长度超过8位(应该是可以等于)
2.包括大写字母,小写字母,数字,其他符号,这四种至少三种
3.不含有长度大于2的包含公共元素的字串重复,
这句话有点绕,理解一下的话就是说不能有长度大于2的子字符串相同?
4.其他符号不包含空格或者换行
5.数据范围:输入的字符串长度范围[1,100]
6.输入是一组字符串
7.输出是:符合要求输出OK,不符合要求输出NG
8.021Abc9Abc1这个字符串不通过的原因是它的子字符串Abc和后面的Abc重复了,所以不符合要求
二、解题思路
1.首先我们定义一个char input[101];用来存储输入
2.我们对字符串进行校验
3.首先是长度校验,如果字符串长度<8,输出NG,
4.然后是复杂度校验,
需要设置4个变量用来记录是否符合,upper,lower,digit,othersymbol全都为0
校验的方法是我们遍历字符串,如果遇到小写字母islower(input[i]) == 1类型的我们就标记lower=1
如果遇到大写字母isupper(input[i]) == 1我们就标记upper = 1
如果遇到数字isdigit(input[i]) == 1我们标记digit=1
遇到符号(其他情况)我们标记othersymbol=1
我们该如何判断呢?第一种方法是使用函数
isupper, islower, isdigit都是ctype.h库提供的字符处理函数,可以用来判断字符的类型
另一种方法
如果我们的当前字符input[i]>='a' && input[i]<='z'的时候,就证明我们的input[i]字符是从a到z之间的小写字母,这个时候我们可以标记lower=1
如果我们的当前字符input[i]>='A' && input[i]<='Z'的时候,就证明我们的input[i]字符时大写字母,我们可以标记upper=1
如果我们的当前字符input[i]>='0' && input[i]<='9'那么证明,我们的input[i]是数字,我们标记digit=1
其他的情况,我们的input[i]是其他符号,我们标记othersymbol=1
5.遍历完一次密码之后我们查看
if(upper + lower + digit + othersymbol < 3){
我们输出NG
}
6.之后我们检查密码的公共字串
我们设定一个for循环从i=0到i=len-4(因为我们判断的公共字串不能是本身,所以如果i=len-3的时候,不可能再有j在它的右边与他相同),里面再套一个for循环从j=i+1到j=len-3检查
如果input[i] == input[j]那么我们继续检查input[i+1]和input[j+1]是否一样,如果一样的话那么我们有公共字串,我们输出NG,
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
我们的j先跑,
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
直到j=len-2我们也没有找到与0相同的字符
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
然后我们的i++,j变成i+1
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
遍历整个字符传没有找到一样的
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
直到我们i变成3的时候,我们的j从4开始跑
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
跑到7的时候发现了相同字符
i | input[i] | len-3 | len-2 | len-1 | |||||||
j | input[j] | ||||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
于是我们检查input[i+1]和input[j+1]
i | input[i] | input[i+1] | len-3 | len-2 | len-1 | ||||||
j | input[j] | input[j+1] | |||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
再检查input[i+2]和input[j+2]
i | input[i] | input[i+1] | input[i+2] | len-3 | len-2 | len-1 | |||||
j | input[j] | input[j+1] | input[j+2] | ||||||||
字符串 | 0 | 2 | 1 | A | b | c | 9 | A | b | c | 1 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
发现了公共子字符串,输出NG
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int validatePassword(char *input){
int len = strlen(input);
if (len < 8){
printf("NG\n");
return 0;
}
int upper = 0;
int lower = 0;
int digit = 0;
int othersymbol = 0;
for (int i = 0; i < len; i++){
if (isupper(input[i])) upper = 1;
else if (islower(input[i])) lower = 1;
else if (isdigit(input[i])) digit = 1;
else othersymbol = 1;
}
if (upper + lower + digit + othersymbol < 3) {
printf("NG\n");
return 0;
}
for (int i = 0; i < len - 4; i++) {
for (int j = i + 1; j < len - 3; j++) {
if ((input[i] == input[j]) && (input[i+1] == input[j+1]) && (input[i+2] == input[j+2])) {
//printf("the input[i] is %c\ninput[j] is %c\n",input[i],input[j]);
printf("NG\n");
return 0;
}
}
}
return 1;
}
int main(){
char input[100];
while (scanf("%s", input) != EOF) {
if(validatePassword(input)) {
printf("OK\n");
}
}
return 0;
}
20241030 20:25
标签:021Abc9Abc1,int,len,NG,字符串,华为,input,HJ20,机试 From: https://blog.csdn.net/bingw0114/article/details/143373972