华为OD机试-密码输入检测

 

题目描述:给定用户密码 输入流input,输入流中字符<表示退格,可以清除前一个输入的字符,
请你编写程序,输出最终得到的密码字符并判断密码是否满足如下的密码安全要求。
密码安全要求如下:
1.密码长度>=8;
2.密码至少需要包含1个大写字母
3.密码至少需要包含1个小写字母,
4.密码至少需要包含1个数字;
5.密码至少需要包含1个字母和数字以外的非空白特殊字符
注意空串退格后仍然为空串,且用户输入的字符串不包含<”字符和空白字符。

输入描述:用一行字符串表示只 输入的用户数据,输入的字符串中<"字符标识退格,用户输入的字符串不包含空白字符,例如:ABC<c89%000<
输出描述:输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由,分隔, 例如:ABc89%00.true

示例1
输入:ABC
输出:ABc89%00,true
说明:解释:多余的C和0由于退格被去除,最终用户输入的密码为ABc89%00,且满足密码安全要求,输出true

示例2
输入:
输出:ABC,false
说明:不满足密码安全要求
示例3
输入:AB<
输出:,false
说明:输出字符串为空,不满足密码安全要求

 JAVA解法:

import java.util.*;
 
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '<') {
                if (!stack.isEmpty()){
                    stack.pop();
                }
            } else {
                stack.push(String.valueOf(s.charAt(i)));
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        while (!stack.isEmpty()) {
            stringBuilder.append(stack.pop());
        }
        StringBuilder result = stringBuilder.reverse();
        boolean flag = true;
        if (result.length() < 8) {
            flag = false;
        }
        int d = 0, n = 0, w = 0, m = 0;
        for (int i = 0; i < result.length(); i++) {
            if (Character.isDigit(result.charAt(i))) {
                d++;
            }
            if (Character.isLowerCase(result.charAt(i))) {
                n++;
            }
            if (Character.isUpperCase(result.charAt(i))) {
                w++;
            }
            if (Character.isSpaceChar(result.charAt(i))) {
                m++;
            }
        }
 
        if (d == 0 || n == 0 || w == 0 || result.length() - d - n - w - m == 0) {
            flag = false;
        }
        System.out.println(result + "," + flag);
    }
}

C++解法:

#include<bits/stdc++.h>
#define int long long
using namespace std;
 
int ck(char c)
{
    // 判断字符类型
    if (c>='a' && c<='z')
        return 1;  // 如果字符是小写字母,则返回1
    if (c>='A' && c<='Z')
        return 2;  // 如果字符是大写字母,则返回2
    if (c>='0' && c<='9')
        return 3;  // 如果字符是数字,则返回3
    return 4;      // 如果字符是特殊字符,则返回4
}
 
signed main()
{
    char c;      // 用于接收单个字符输入
    string s;    // 用于构建最终的密码字符串
    while (cin>>c) // 循环读取每个字符
    {
        if (c=='\n') // 如果读到换行符则结束循环
            break;
        if (c=='<')  // 如果当前字符是退格符'<'
        {
            if (s.size()) // 如果字符串非空
                s.pop_back();  // 删除字符串的最后一个字符
        }
        else
            s.push_back(c); // 否则,将字符加到字符串末尾
    }
    set<int> st;  // 使用集合来存储字符类型,避免重复
    for (char c : s) // 遍历字符串中的每个字符
        st.insert(ck(c));  // 插入字符类型到集合中
 
    cout << s << ",";  // 输出最终的密码字符串
    cout << (st.size() == 4 ? "true" : "false") << endl;  // 判断集合大小是否为4,是则输出true,否则输出false
    return 0;
}

Pythone解法:

def solve():
    line = input()  # 读取用户输入
    s = []  # 使用列表作为栈,用于处理退格操作
    for c in line:
        if c == '<':  # 检测到退格符'<'
            if s:  # 如果栈不为空
                s.pop()  # 弹出栈顶元素,模拟退格操作
        else:
            s.append(c)  # 将当前字符压入栈中
    st = set()  # 创建一个集合,用于存储不同类型的字符
    for c in s:
        st.add(ck(c))  # 对最终密码中的每个字符进行类型判断,并添加到集合中
 
    # 输出最终密码和是否满足安全要求的判断
    # 如果集合的大小为4,表示包含所有必需的字符类型,满足密码要求
    print(''.join(s) + ',' + ('true' if len(st) == 4 else 'false'))
 
def ck(c):
    # 根据字符类型返回不同的数字,便于类型统计
    if c >= 'a' and c <= 'z':  # 小写字母
        return 1
    if c >= 'A' and c <= 'Z':  # 大写字母
        return 2
    if c >= '0' and c <= '9':  # 数字
        return 3
    return 4  # 其他字符,如特殊符号
        
if __name__ == '__main__':
    solve()

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔乙己大叔

你看我有机会吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值