敏感字段加密
难度:★★
字符串处理,细心一点。
敏感字段加密
知识点字符串循环
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
【敏感字段加密】给定一个由多个命令字组成的命令字符串:
1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和>偶数个双引号;
2、命令字之间以一个或多个下划线_进行分割;
3、可以通过两个双引号""来标识包含下划线_的命令字或空命令字(仅>包含两个双引号的命令字),双引号不会在命令字内部出现; 请对指定>索引的敏感字段进行加密,替换为******(6个*),并删除命令字前后多余>的下划线_。如果无法找到指定索引的命令字,输出字符串ERROR。
输入描述:
输入为两行,第一行为命令字索引K(从0开始),第二行为命令字符串S。
输出描述:
输出处理后的命令字符串,如果无法找到指定索引的命令字,输出字符串ERROR
示例1
输入
1
password__a12345678_timeout_100
输出
password_******_timeout_100
示例2
输入
2
aaa_password_“a12_45678"timeout__100"”_
输出
aaa_password_******timeout_100""
解题思路:
- 使用
Scanner
对象读取命令字索引和命令字符串。 - 根据下划线将命令字符串拆分为命令字列表。
- 遍历命令字符串的每个字符,根据双引号的位置和下划线进行处理,将命令字添加到列表中。
- 判断索引是否超出命令字列表范围,若超出则输出"ERROR"。
- 对命令字列表进行遍历,根据索引将敏感字段替换为6个星号,并删除多余的下划线。
- 输出处理后的命令字符串。
JAVA代码:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 读取命令字索引
int n = scan.nextInt();
scan.nextLine();
// 读取命令字符串
String s = scan.nextLine();
int len = s.length();
List<String> list = new ArrayList<>();
String temp = "";
boolean yh = false; // 双引号标记
// 遍历命令字符串的每个字符
for (int i = 0; i < len; i++) {
if (s.charAt(i) != '_') {
if (s.charAt(i) == '\"') {
yh = !yh; // 切换双引号标记
}
temp += s.charAt(i); // 将字符添加到temp字符串中
// 如果已到达命令字符串末尾,将temp作为一个命令字添加到列表中
if (i == len - 1) {
list.add(temp);
}
} else {
if (temp.equals("")) {
continue; // 如果temp为空,跳过继续处理
}
if (yh) {
temp += s.charAt(i); // 在双引号内,将下划线添加到temp字符串中
} else {
list.add(temp); // 将temp作为一个命令字添加到列表中
temp = ""; // 重置temp为空
}
}
}
int count = list.size();
if (n >= count) {
System.out.println("ERROR"); // 索引超出命令字列表范围,输出ERROR
} else {
String res = "";
// 对命令字列表进行遍历
for (int i = 0; i < count; i++) {
if (i == n) {
res += "******"; // 将敏感字段替换为6个星号
} else {
res += list.get(i); // 将当前命令字添加到结果字符串中
}
if (i != list.size() - 1) {
res += "_"; // 如果不是最后一个命令字,添加下划线到结果字符串中
}
}
System.out.println(res); // 输出结果字符串
}
}
代码说明:
代码思路和实现说明如下:
- 代码首先使用
Scanner
对象读取输入的命令字索引和命令字符串。 - 命令字符串的处理使用一个临时字符串
temp
来存储正在处理的命令字,yh
布尔变量用于标记是否在双引号内。 - 在遍历命令字符串的每个字符时,根据字符是否为下划线进行处理:
- 如果字符不是下划线,将其添加到
temp
字符串中。 - 如果字符是下划线:
- 如果
temp
字符串为空,表示出现多个连续的下划线,跳过继续处理。 - 如果在双引号内,将下划线添加到
temp
字符串中。 - 如果不在双引号内,表示一个命令字的结束,将
temp
字符串作为一个命令字添加到命令字列表中,并将temp
重置为空。
- 如果
- 如果字符不是下划线,将其添加到
- 最后,根据索引和命令字列表进行加密和处理,并输出处理后的命令字符串。