密码输入检测 - 华为OD统一考试
2024-01-08 15:32:39
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++
题目描述
给定用户密码输入流input,输入流中字符 ‘<’ 表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。
密码安全要求如下:
- 密码长度>=8;
- 密码至少需要包含1个大写字母:
- 密码至少需要包含1个小写字母;
- 密码至少需要包含1个数字;
- 密码至少需要包含1个字母和数字以外的非空白特殊字符;
注意空串退格后仍然为空串,且用户输入的字符串不包含 ‘<’ 字符和空白字符。
输入描述
用一行字符串表示输入的用户数据,输入的字符串中 ‘<’ 字符标识退格,用户输入的字符串不包含空白字符,例如:ABC<c89%000<
输出描述
输出经过程序处理后,输出的实际密码字符串,并输出该密码字符串是否满足密码安全要求。两者间由 ‘,’ 分隔,例如:ABc89%00,true
示例1
输入:
ABC<c89%000<
输出:
ABc89%00,true
解释: 多余的C和0由于退格被去除,最终用户输入的密码为ABc89%00,且满足密码安全要求输出true
示例2
输入:
ABC
输出:
ABC,false
解释: 不满足密码安全要求
题解
字符串模拟题, 代码思路:
- 字符处理:使用
Deque
(双端队列)来处理字符输入和退格操作。遍历输入的字符数组,如果是退格字符'<'
,则从队尾删除一个字符;否则,将字符加入队尾。- 密码安全要求判断:统计密码中包含的小写字母、大写字母、数字和其他字符的数量(
c1
、c2
、c3
、c4
)。判断密码是否满足安全要求:长度大于等于8,同时包含至少一个小写字母、一个大写字母、一个数字和一个其他字符。- 输出结果:将密码字符串和判断结果以字符串格式输出,使用逗号分隔。
Java
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine();
Deque<Character> deque = new ArrayDeque<>();
for (char c : input.toCharArray()) {
if (Character.isWhitespace(c)) continue;
// 退格,删除最后一个字符
if (c == '<' && !deque.isEmpty()) {
deque.pollLast();
} else {
deque.offerLast(c);
}
}
StringBuilder password = new StringBuilder();
// 记录各种类型字符的数量
int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
while (!deque.isEmpty()) {
char c = deque.pollFirst();
password.append(c);
if ('a' <= c && c <= 'z') {
c1++;
} else if ('A' <= c && c <= 'Z') {
c2++;
} else if ('0' <= c && c <= '9') {
c3++;
} else {
c4++;
}
}
boolean valid = password.length() >= 8 && c1 * c2 * c3 * c4 != 0;
System.out.println(String.format("%s,%s", password.toString(), valid));
}
}
Python
def process_password(input_str):
# 使用列表模拟双端队列
password_queue = []
for char in input_str:
if char.isspace():
continue
# 退格,删除最后一个字符
if char == '<' and password_queue:
password_queue.pop()
else:
password_queue.append(char)
# 构建密码字符串
password = ''.join(password_queue)
# 统计各种类型字符的数量
c1, c2, c3, c4 = 0, 0, 0, 0
for char in password_queue:
if 'a' <= char <= 'z':
c1 += 1
elif 'A' <= char <= 'Z':
c2 += 1
elif '0' <= char <= '9':
c3 += 1
else:
c4 += 1
# 判断密码是否满足安全要求
valid = len(password) >= 8 and c1 * c2 * c3 * c4 != 0
# 输出结果
print(f"{password},{str(valid).lower()}")
# 从标准输入读取一行字符串
input_str = input()
# 处理密码
process_password(input_str)
C++
#include <iostream>
#include <deque>
using namespace std;
int main() {
string input;
getline(cin, input);
deque<char> dq;
for (char c : input) {
if (isspace(c)) continue;
// 退格,删除最后一个字符
if (c == '<' && !dq.empty()) {
dq.pop_back();
} else {
dq.push_back(c);
}
}
string password;
// 记录各种类型字符的数量
int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
while (!dq.empty()) {
char c = dq.front();
dq.pop_front();
password.push_back(c);
if ('a' <= c && c <= 'z') {
c1++;
} else if ('A' <= c && c <= 'Z') {
c2++;
} else if ('0' <= c && c <= '9') {
c3++;
} else {
c4++;
}
}
bool valid = password.length() >= 8 && c1 * c2 * c3 * c4 != 0;
cout << password << "," << (valid ? "true" : "false") << endl;
return 0;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ???? 和收藏 ?,让更多的人看到。🙏🙏🙏
文章来源:https://blog.csdn.net/user_longling/article/details/135457704
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!