小言_互联网的博客

【华为上机真题】密码要求

401人阅读  评论(0)

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.2 输入描述

1.3 输出描述

二、解题思路

三、代码实现

四、时间复杂度


 

一、题目描述

密码要求:

1.长度超过8位;

2.包括大小写字母.数字.其它符号,以上四种至少三种;

3.不能有相同长度大于2的子串重复;

1.2 输入描述

一组或多组长度超过2的子符串。每组占一行

1.3 输出描述

如果符合要求输出:OK,否则输出NG

二、解题思路

本题是一道模拟题,按照密码要求一次检查即可。

(1)条件 1:如果字符串长度小于等于 8 位,则不符合要求;

(2)条件 2:计算有多少种字符,少于三种则不符合要求,可以使用数组计数或者位运算计数;

(3)条件 3:只需要判断长度为 3 的子串是否有重复即可,这个可通过两层 for 循环或者 find 函数来实现。

三、代码实现

代码实现如下所示。


  
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. bool checkPasswd(string str)
  5. {
  6. // 条件 1
  7. if (str. size() <= 8) {
  8. return false;
  9. }
  10. // 条件 2
  11. int n = str. size();
  12. int num = 0;
  13. for ( int i = 0; i < n; ++i) {
  14. if ( isupper(str[i])) {
  15. num |= 1;
  16. } else if ( islower(str[i])) {
  17. num |= 2;
  18. } else if (str[i] >= '0' && str[i] <= '9') {
  19. num |= 4;
  20. } else {
  21. num |= 8;
  22. }
  23. }
  24. int m = 0;
  25. int p = 1;
  26. for ( int i = 0; i < 4; ++i) {
  27. if (num & p) {
  28. m++;
  29. }
  30. p = p * 2;
  31. }
  32. if (m < 3) return false;
  33. // 条件 3
  34. for ( int i = 0; i < n - 2; ++i) {
  35. int idx = str. find(str. substr(i, 3), 0);
  36. int idy = str. find(str. substr(i, 3), idx + 1);
  37. if (idy != -1) {
  38. return false;
  39. }
  40. }
  41. return true;
  42. }
  43. int main()
  44. {
  45. string str;
  46. while ( getline(cin, str)) {
  47. bool flag = checkPasswd(str);
  48. if (flag) {
  49. cout<< "OK"<<endl;
  50. } else {
  51. cout<< "NG"<<endl;
  52. }
  53. }
  54. return 0;
  55. }

四、时间复杂度

时间复杂度:O(n + 3n^2)。

在上述代码中,假设字符串长度为 n,第一个 for 循环遍历字符种类的时间复杂度为 O(n),计算是否存在子串的时间复杂度为 O(3n^2),所以总的时间复杂度为 O(n + 3n^2)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞



转载:https://blog.csdn.net/u011074149/article/details/127819420
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场