题目描述:给定用户密码 输入流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()