题解 | #密码验证合格程序#

密码验证合格程序

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)));
    }
}
全部评论
看着快慢指针跟双循环差不多……
点赞 回复 分享
发布于 2022-07-25 21:32
大佬问下,不含空格的话用scanf不会检测不出来空格吗
点赞 回复 分享
发布于 2023-05-24 10:16 广东
如 “111222333aaCbbbb” ,我试了这么多只有你的输出 NG,其他都是 OK。这道题很离谱啊,“包含公共部分”的子串不重复,好多同志都没考虑到
点赞 回复 分享
发布于 10-07 12:58 湖南

相关推荐

爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
5 2 评论
分享
牛客网
牛客企业服务