首页 > 编程语言 >华为机试HJ20 密码验证合格程序

华为机试HJ20 密码验证合格程序

时间:2024-11-03 16:51:20浏览次数:4  
标签:021Abc9Abc1 int len NG 字符串 华为 input HJ20 机试

首先看一下题

描述

密码要求: 

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,

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

我们的j先跑,

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

直到j=len-2我们也没有找到与0相同的字符

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

然后我们的i++,j变成i+1

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

遍历整个字符传没有找到一样的

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

直到我们i变成3的时候,我们的j从4开始跑

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

跑到7的时候发现了相同字符

iinput[i]len-3len-2len-1
jinput[j]
字符串021Abc9Abc1
位置012345678910

于是我们检查input[i+1]和input[j+1]

iinput[i]input[i+1]len-3len-2len-1
jinput[j]input[j+1]
字符串021Abc9Abc1
位置012345678910

再检查input[i+2]和input[j+2]

iinput[i]input[i+1]input[i+2]len-3len-2len-1
jinput[j]input[j+1]input[j+2]
字符串021Abc9Abc1
位置012345678910

发现了公共子字符串,输出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

相关文章

  • 华为机试HJ16 购物单
    首先看一下题描述王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件附件电脑打印机,扫描仪书柜图书书桌台灯,文具工作椅无如果要买归类为附件的物品,必须先买该附件所属的主件,且每件物品只能购买一次。每个......
  • 华为机试HJ18 识别有效的IP地址和掩码并进行分类统计
    首先看一下题描述请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为 A,B,C,D,E五类A类地址从1.0.0.0到126.255.255.255;B类地址从128.0.0.0到191.255.255.255;C类地址从192.0.0.0到223.255.255.255;......
  • 华为OD机试-E卷,100分 - 最小的调整次数特异性双端队列Java & Python& JS & C++ & C
    最新华为OD机试题目描述有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。现在要求移除数据的顺......
  • 华为OD机试-E卷100分 -货币单位换算Java & Python& JS & C++ & C
    最新华为OD机试题目描述记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃......
  • 华为开发者 云托管
    本文地址目录目录目录华为开发者云托管app上架要求华为云托管官方文档典型场景接入步骤使用限制华为开发者云托管app上架要求上架app到华为商店(AppGalleryConnect,AGC)需要准备的资料有:基础条件app签名,特殊权限授权证书app信息:图标、五图、应用介绍、分类隐......
  • 5个有效的华为(HUAWEI)手机数据恢复方法
    5个有效的手机数据恢复方法华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因,因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台;因此,预防总比哀叹好,这就是为什么众多智能手机用户选择此类软件的原因。尽管有很多解决......
  • 华为大模型面试通关秘籍:50道高频面试题及答案解析
    觉得中大厂面试太难的,完全就是自己没准备充分,技术不到位,没准备的面试完全是浪费时间,更是对自己的不负责!.今天我给大家分享一下我整理的**《精选50个大模型高频面试题》**大模型面试专题和答案,其中大部分都是面试常问的面试题,可以对照这查漏补缺奥!祝大家早日上岸呀!1.简......
  • 华为OD机试-(E卷,100分) - 热点网站统计(Java & Python& JS & C++ & C )
    最新华为OD机试题目描述企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URLtopN。请设计一个算法,可以高效动态统计TopN的页面。输入描述每一行都是一个URL或一个数字,如果是URL,代表一段时间内的网页访问;如果是一个数字N,代表本次需要输出的TopN个URL......
  • 天津大学2024华为杯I.个大的大个 题解
    原题链接https://acm.tju.edu.cn/problem/P2040学校oj好像挂了,题解发不出去,又没有草稿功能,所以先存在这里了。前言华为杯时候对字符串不太熟,加上看错题了导致没做出这题,很可惜,苦练几个月,现在已经成为串串大师,回过头来秒一下这题发个题解泄恨。题意给定一个长为\(n\)的字符......
  • 华为云开源项目Sermant正式成为CNCF官方项目
    近日,云原生计算基金会(CNCF)正式接纳由华为云发起的云原生无代理服务网格项目Sermant。Sermant的加入,极大地丰富了云原生微服务治理技术的探索、创新和发展,为CNCF社区注入了新的活力。 Sermant是华为云在微服务治理技术领域多年的技术积累和丰富的实践经验孵化而来,致力于解决大......