目录
敏感字段加密
考察理解能力、循环、hash。
题目描述
给定一个由多个命令字组成的命令字符串:
1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号,
2、命令字之间以一个或多个下划线 进行分割,
3、可以通过两个双引号""来标识包含下划线_的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现
请对指定索引的敏感字段进行加密,替换为******(6个*),并删除命令字前后多余的下划线_。如果无法找到指定索引的命令字,输出字符串ERROR
输入描述
输入为两行,第一行为命令字索引K(从O开始),第二行为命令字符串S
输出描述
输出处理后的命令字符串,如果无法找到指定索引的命令字,输出字符串ERROR的
示例1
输入
1
password__a12345678_timeout_100
输出
password_******_timeout_100
示例2
输入
1
"password__a12345678"_timeout_100
输出
"password__a12345678"_******_100
示例3
输入
0
"password__a12345678"_timeout_100
输出
******__timeout_100
解析
首先理解一下命令字,当双引号不出现时,命令字一共有通过下划线分割后的单词个数。当双引号出现时,双引号包裹的为一个命令字,
未包裹的通过分割下划线确定个数。
一个一个字符的读取,设置一个标志位,当读到双引号时改变标志位,设置结尾的为双引号,双引号结尾后还原标志位,改为一个下划线结尾。用
对象的key、value存储每次的命令和分割符。key为数字,每次记录加一,value为一个对象存储是否为命令和字符串。最后只需要通过key的数字遍历
找到对应的索引,将value存储的字符串改为******,最后按key从小到大对应的value字符相加。
答案
function getSecrityStr(str) {
let [n, target] = str.split('\n')
let len = target.length
let sign = true
let i = 0
let tmp = ''
let obj = {}
let j = 0
while (i < len) {
// 下划线为结尾
if (sign) {
// 当为双引号时改变标志位,判断命令结尾为双引号
if (target[i] === '"') {
tmp = tmp + target[i]
sign = false
// 已经记录了一段命令字符后结尾
} else if (target[i] === '_' && tmp.length) {
obj[j] = {
value: tmp,
order: true
}
j++
obj[j] = {
value: '_',