敏感字段加密
题目描述
给定一个由多个命令字组成的命令字符串:
-
字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号;
-
命令字之间以一个或多个下划线,进行分割;
-
可以通过两个双引号 ""来标识包含下划线。的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现;请对指定索引的敏感字段进行加密,替换为******(6个*),并删除命令只字前后多余的下划线。
-
如果无法找到指定索引的命令字,输出字符串Q ERROR。
输入描述
输入为两行,第一行为命令字索引 K
(从0开始),第二行为命令字符串 S
.
输出描述
输出处理后的命令字符串,如果无法找到指定索引的命令字,输出字符串 ERROR
示例1 输入
1 password__a12345678_timeout_100
输出
password_******_timeout_100
索引 1
命令字 "a12345678" 被替换为 "******",并删除了多余的下划线。
示例2 输入
2 aaa_password_"a12_45678"timeout__100""_
输出
aaa_password_******timeout_100""
索引 1
命令字 "a12_45678"(包含在双引号内)被替换为 "******",并删除了多余的下划线。注意最后的空命令字 """" 被保留。
题解
遇到字符 "
后边的字符数原样输出,直到遇到下一个 "
,其他情况下按照 _
进行分割
源码 Java
import java.util.ArrayList;
import java.util.List;
public class SensitiveWords {
static Input input ;
static {
input = new Input("1\n" +
"password__a12345678_timeout_100");
input = new Input("2\n" +
"aaa_password_\"a12_45678\"_timeout__100_\"\"_");
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
int k = Integer.parseInt(input.nextLine());
String ps = input.nextLine();
StringBuilder sb = new StringBuilder("");
for (int i = 0 ; i < ps.length();) {
if (ps.charAt(i) == '"') {
// 处理特殊敏感词
sb.append(ps.charAt(i)) ;
i++;
// 遇到下一个 ” 前所有字符原样追加
while (ps.charAt(i) != '"') {
sb.append(ps.charAt(i)) ;
i++;
}
sb.append('"');
list.add(sb.toString());
sb = new StringBuilder("");
i++;
} else {
// 出现 _ 表示前边有一个敏感词
if (ps.charAt(i) == '_') {
// 如果敏感词长度为 0 不记录
if (sb.length() > 0) {
list.add(sb.toString());
}
sb = new StringBuilder("");
} else {
sb.append(ps.charAt(i));
}
i++;
}
}
// 处理最后一个敏感词
if (sb.length() > 0) {
list.add(sb.toString());
}
String[] array = list.toArray(new if (list.size() > k) {
list.set(k,"******");
System.out.println(String.join("_", list));
} else {
System.out.println("ERROR");
}
}
}
#软件开发薪资爆料#