【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【栈】2023C-密码输入检测【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例
      • 输入
      • 输出
      • 解题思路
      • 代码
        • Python
        • Java
        • C++
        • 时空复杂度
        • 华为OD算法/大厂面试高频题算法练习冲刺训练

          题目描述与示例

          题目描述

          给定用户密码输入流 input,输入流中字符'<'表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。

          密码安全要求如下:

          1. 密码长度>=8;
          2. 密码至少需要包含 1 个大写字母;
          3. 密码至少需要包含 1 个小写字母;
          4. 密码至少需要包含 1 个数字;
          5. 密码至少需要包含 1 个字母和数字以外的非空白特殊字符

          注意空串退格后仍然为空串,且用户输入的字符串不包含'<'字符和空白字符。

          输入描述

          用一行字符串表示输入的用户数据,输入的字符串中'<'字符标识退格,用户输入的字符串不包含空白字符,例如:ABC

          输出描述

          输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由','分隔, 例如:ABc89%00,true

          示例

          输入

          ABC 

          输出

          ABc89%00,true
          

          解题思路

          本题分为两个步骤:

          1. 对输入的密码进行退格处理,这显然可以使用栈来完成。
          2. 对处理完毕之后的密码进行各个条件的判断,直接调用各种字符串相关的API即可完成。

          代码

          Python

          # 题目:【栈】2023C-密码输入检测
          # 分值:100
          # 作者:许老师-闭着眼睛学数理化
          # 算法:栈
          # 代码看不懂的地方,请直接在群上提问
          s = input()
          stack = list()
          # 遍历字符串s中的每一个字符ch
          for ch in s:
              # 如果不是退格,则直接入栈
              if ch != "<":
                  stack.append(ch)
              # 如果遇到退格,且栈不为空栈,弹出栈顶元素表示退格
              elif ch == "<" and len(stack) > 0:
                  stack.pop()
          # 重新合并栈中的所有元素,得到处理后的字符串s_new
          s_new = "".join(stack)
          # 对字符串s_new进行每一个条件的判断
          # 判断1:长度是否大于等于8
          flag1 = len(s_new) >= 8
          # 判断2:是否存在大写字符
          flag2 = any(ch.isupper() for ch in s_new)
          # 判断3:是否存在小写字符
          flag3 = any(ch.islower() for ch in s_new)
          # 判断4:是否存在数字
          flag4 = any(ch.isdigit() for ch in s_new)
          # 判断5:是否存在除了字符串、数字、空格之外的特殊字符
          flag5 = any(not ch.isalnum() and not ch.isspace() for ch in s_new)
          # 若上述五个条件均为True,则输出字符串和true
          if flag1 and flag2 and flag3 and flag4 and flag5:
              print(f"{s_new},true")
          # 否则输出字符串和false
          else:
              print(f"{s_new},false")
          

          Java

          import java.util.Scanner;
          import java.util.Stack;
          public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
                  String s = scanner.next();
                  Stack stack = new Stack<>();
                  for (char ch : s.toCharArray()) { if (ch != '<') { stack.push(ch);
                      } else if (ch == '<' && !stack.isEmpty()) { stack.pop();
                      }
                  }
                  StringBuilder sNew = new StringBuilder();
                  while (!stack.isEmpty()) { sNew.insert(0, stack.pop());
                  }
                  boolean flag1 = sNew.length() >= 8;
                  boolean flag2 = false, flag3 = false, flag4 = false, flag5 = false;
                  for (char ch : sNew.toString().toCharArray()) { if (Character.isUpperCase(ch)) { flag2 = true;
                      } else if (Character.isLowerCase(ch)) { flag3 = true;
                      } else if (Character.isDigit(ch)) { flag4 = true;
                      } else if (!Character.isLetterOrDigit(ch) && !Character.isWhitespace(ch)) { flag5 = true;
                      }
                  }
                  if (flag1 && flag2 && flag3 && flag4 && flag5) { System.out.println(sNew.toString() + ",true");
                  } else { System.out.println(sNew.toString() + ",false");
                  }
              }
          }
          

          C++

          #include #include #include int main() { std::string s;
              std::cin >> s;
              std::stack stack;
              for (char ch : s) { if (ch != '<') { stack.push(ch);
                  } else if (ch == '<' && !stack.empty()) { stack.pop();
                  }
              }
              std::string s_new;
              while (!stack.empty()) { s_new = stack.top() + s_new;
                  stack.pop();
              }
              bool flag1 = s_new.length() >= 8;
              bool flag2 = false, flag3 = false, flag4 = false, flag5 = false;
              for (char ch : s_new) { if (isupper(ch)) { flag2 = true;
                  } else if (islower(ch)) { flag3 = true;
                  } else if (isdigit(ch)) { flag4 = true;
                  } else if (!isalnum(ch) && !isspace(ch)) { flag5 = true;
                  }
              }
              if (flag1 && flag2 && flag3 && flag4 && flag5) { std::cout << s_new << ",true" << std::endl;
              } else { std::cout << s_new << ",false" << std::endl;
              }
              return 0;
          }
          

          时空复杂度

          时间复杂度:O(N)。处理字符串每个字符串仅需遍历一遍。五次判断,需要均需要遍历一次s_new。总体时间复杂度为O(6N)=O(N)

          空间复杂度:O(1)。仅需若干常数变量。


          华为OD算法/大厂面试高频题算法练习冲刺训练

          • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

          • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

          • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

          • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

          • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

          • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

          • 绿色聊天软件戳 od1336了解更多