借鉴文章:Java-敏感字段加密 - 哔哩哔哩
题目描述
给定一个由多个命令字组成的命令字符串;
1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号
2、命令字之间以一个或多个下划线_进行分割
3、可以通过两个双引号""来标识包含下划线_的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现
请对指定索引的敏感字段进行加密,替换为******(6个*),
并删除命令字前后多余的下划线_。
如果无法找到指定索引的命令字,输出字符串ERROR
输入描述
输入为两行,
第一行为命令字索引K (从0开始),
第二行为命 令字符串S。
输出描述
输出处理后的命令字符串,如果无法找到指定索引的命令字, 输出字符串ERROR
用例
|----|-----------------------------------|
| 输入 | 1 passworda12345678_timeout_100 |
| 输出 | password_******_timeout_100 |
|----|--------------------------------------------|
| 输入 | 2 aaa_password_"a12_45678"timeout_100""_ |
| 输出 | aaa_password_******timeout_100"" |
| 说明 | 无 |
java 程序
package com.tarena.test.B10;
import java.util.LinkedList;
import java.util.Scanner;
/**
*
*
给定一个由多个命令字组成的命令字符串;
1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号
2、命令字之间以一个或多个下划线_进行分割
3、可以通过两个双引号""来标识包含下划线_的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现
请对指定索引的敏感字段进行加密,替换为******(6个*),
并删除命令字前后多余的下划线_。
如果无法找到指定索引的命令字,输出字符串ERROR 作者:红叶快乐起来 https://www.bilibili.com/read/cv23309523/ 出处:bilibili
* @author Administrator
*
*/
public class B11Self {
public static void main(String[] args) {
try(Scanner sc = new Scanner(System.in)){
Integer index = Integer.parseInt( sc.nextLine());
String value = sc.nextLine();
System.out.println(resultStr(index,value));
}
}
public static String resultStr(Integer index,String value) {
LinkedList<String> list = new LinkedList<>();
char[] valueArr = value.toCharArray();
for(int i =0;i<valueArr.length;i++) {
char ca = valueArr[i];
String temp = "";
if(ca == '"') {
int next = value.indexOf('"',i+1);
//+1因为后面的"也需要截取到
temp = value.substring(i,next+1);
i = next + 1;
}else {
int next = value.indexOf("_",i);
if(next != -1) {
temp = value.substring(i,next);
i = next;
}else {
//没有_直接截取后面全部的
temp = value.substring(i);
//结束循环
i = value.length();
}
}
if(!"".equals(temp)) {
list.add(temp);
}
}
if(index<list.size()) {
list.set(index, "******");
StringBuilder str = new StringBuilder();
list.forEach(temp -> str.append(temp).append("_"));
//将最后的_删除
return str.substring(0,str.length()-1);
}else {
return "ERROR";
}
}
}
了解知识点:
1 、try(){} try 方法的()内可以自主关闭任何java流类型参数
2、subString(begin,end) begin与end相同是返回"" (空字符串)
3、subString(0,value.length()); 这样的截取没有作用。subString 是包头不包尾,但是java的索引是从0开始。但是长度是1。如果要丢弃最后一个字符subString(0,value.length()-1) 才可以;