题解 | #密码验证合格程序#
密码验证合格程序
http://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
密码验证合格程序:C语言解法
第一判断是否超过8位,第二用位运算判断字符类型是否足够,第三用快慢指针判断重复子串。
#include<stdio.h>
#define ok "OK"
#define ng "NG"
char* repetition(char *str){
int fast=1, slow=0, num=0;
//因为我们初始化字符数组是给的是'\0',所以判定结束时也用'\0'
while(str[slow] != '\0'){
//从头开始遍历,慢指针赋0,快指针指向慢指针的下一个,遇到相同的就进入判定
if(str[fast++] == str[slow]){
//判定是否有长度大于2的不含公共元素的子串重复,
//注意j不能设的太大,否则会把“不连续但重复“的情况加到结果中
for(int j=0; j<3; j++){
//防止数组越界
if(str[fast+j-1] == '\0') break;
else if(str[fast+j-1] == str[slow+j]) num++;
}
if(num >=3) return ng;
else num = 0;
//快指针到头时,慢指针加一,快指针再次指向慢指针的下一个
}else if(str[fast] == '\0'){
slow++;
fast = slow+1;
}
}
return ok;
}
char* judge(char *password, int size){
char digit = 0;
int cont = 0;
//超过8位条件要写小于等于
if(size <= 8) return ng;
//遍历判断是否有***字符,并把不同类型记录到二进制数位中
for(int i=0; i<size; i++){
if(password[i]>='a' && password[i]<='z'){
//&的优先级很低,想要优先运算需要加括号
if((digit&0x01) == 0) digit |= 0x01;
}else if(password[i]>='A' && password[i]<='Z'){
if((digit&0x02) == 0) digit |= 0x02;
}else if(password[i]>='0' && password[i]<='9'){
//写左移几位或直接写数字都可以
if((digit&(0x01<<2)) == 0) digit |= 0x01<<2;
}else{
if((digit&(0x01<<3)) == 0) digit |= 0x01<<3;
}
}
//判断二进制数中有多少个1
while(digit > 0){
cont += digit&0x01;
digit >>= 1;
}
if(cont < 3) return ng;
//判断重复子串
return repetition(password);
}
int main(){
char str[100] = {0};
while(~scanf("%s\n",&str)){
printf("%s\n",judge(str,strlen(str)));
}
}