华为上机真题密码要求
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题密码要求相关的知识,希望对你有一定的参考价值。
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
密码要求:
1.长度超过8位;
2.包括大小写字母.数字.其它符号,以上四种至少三种;
3.不能有相同长度大于2的子串重复;
1.2 输入描述
一组或多组长度超过2的子符串。每组占一行
1.3 输出描述
如果符合要求输出:OK,否则输出NG
二、解题思路
本题是一道模拟题,按照密码要求一次检查即可。
(1)条件 1:如果字符串长度小于等于 8 位,则不符合要求;
(2)条件 2:计算有多少种字符,少于三种则不符合要求,可以使用数组计数或者位运算计数;
(3)条件 3:只需要判断长度为 3 的子串是否有重复即可,这个可通过两层 for 循环或者 find 函数来实现。
三、代码实现
代码实现如下所示。
#include <iostream>
#include <string>
using namespace std;
bool checkPasswd(string str)
// 条件 1
if (str.size() <= 8)
return false;
// 条件 2
int n = str.size();
int num = 0;
for (int i = 0; i < n; ++i)
if (isupper(str[i]))
num |= 1;
else if (islower(str[i]))
num |= 2;
else if (str[i] >= '0' && str[i] <= '9')
num |= 4;
else
num |= 8;
int m = 0;
int p = 1;
for (int i = 0; i < 4; ++i)
if (num & p)
m++;
p = p * 2;
if (m < 3) return false;
// 条件 3
for (int i = 0; i < n - 2; ++i)
int idx = str.find(str.substr(i, 3), 0);
int idy = str.find(str.substr(i, 3), idx + 1);
if (idy != -1)
return false;
return true;
int main()
string str;
while (getline(cin, str))
bool flag = checkPasswd(str);
if (flag)
cout<<"OK"<<endl;
else
cout<<"NG"<<endl;
return 0;
四、时间复杂度
时间复杂度:O(n + 3n^2)。
在上述代码中,假设字符串长度为 n,第一个 for 循环遍历字符种类的时间复杂度为 O(n),计算是否存在子串的时间复杂度为 O(3n^2),所以总的时间复杂度为 O(n + 3n^2)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞
以上是关于华为上机真题密码要求的主要内容,如果未能解决你的问题,请参考以下文章