#P3099. 敏感字段加密(100分)
-
1000ms
Tried: 273
Accepted: 47
Difficulty: 3
所属公司 :
华为od
敏感字段加密(100分)
题目要求分析: 题目要求我们对一个命令字符串进行处理,并对指定索引的命令字进行加密。命令字之间以下划线_分割,有时候命令字可能包含下划线并被双引号""包裹。我们需要正确处理双引号包裹的命令字,切分命令字后对指定索引的命令字进行替换,最后输出结果。
具体要求如下:
将命令字符串中的命令字提取出来; 如果某个命令字的索引等于给定的k,则将该命令字替换为∗∗∗∗∗∗; 如果k超出了命令字的范围,输出ERROR; 最终的输出字符串不应包含多余的下划线。
本题关键在于如何标记双引号′"′,我们可以用一个变量mark来表示当前是否有双引号,每遇到双引号就标记一次,如果当前双引号为标记状态,那么后面的字符串都要加进来。把下划线分割开的每一段字符串用一个vector存起来,最后输出即可。
c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int k;
string s;
vector<string>str;
cin>>k>>s;
s+="_";//末尾加一个方便把最后一段也加进去不影响最终结果
string command="";
bool mark=0;
for(auto c:s)
{
if(c=='"')mark^=1;
if(c!='_'||mark)//如果不是下划线或者有双引号
{
command+=c;
}
else if(command.size())
{
str.push_back(command);
command="";
}
}
if(k>=str.size())//如果越界
{
cout<<"ERROR"<<endl;
return 0;
}
str[k]="******";
string res="";
for(int i=0;i<str.size();i++)
{
res+=str[i];
if(i<str.size()-1)res+='_';//记得补下划线
}
cout<<res;
}
python
def main():
k = int(input()) # 输入应为合法整数,例如3
s = input() # 输入字符串,例如 "abc_def"
s += "_" # 末尾加一个方便把最后一段也加进去不影响最终结果
str_list = []
command = ""
mark = False
for c in s:
if c == '"':
mark ^= 1
if c != '_' or mark: # 如果不是下划线或者有双引号
command += c
elif command:
str_list.append(command)
command = ""
if k >= len(str_list): # 如果越界
print("ERROR")
return
str_list[k] = "******"
res = ""
for i in range(len(str_list)):
res += str_list[i]
if i < len(str_list) - 1: # 记得补下划线
res += '_'
print(res)
if __name__ == "__main__":
main()
java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt(); // 读取整数k
String s = scanner.next(); // 读取字符串s
s += "_"; // 末尾加一个方便把最后一段也加进去不影响最终结果
List<String> strList = new ArrayList<>(); // 用于存储处理后的字符串片段
StringBuilder command = new StringBuilder();
boolean mark = false;
// 遍历字符串s中的每个字符
for (char c : s.toCharArray()) {
if (c == '"') {
mark = !mark; // 切换标记状态
}
if (c != '_' || mark) { // 如果不是下划线或者有双引号
command.append(c); // 拼接字符到当前命令
} else if (command.length() > 0) {
strList.add(command.toString()); // 添加完整命令到列表
command.setLength(0); // 重置命令
}
}
// 如果k超过片段数量,输出错误信息
if (k >= strList.size()) {
System.out.println("ERROR");
return;
}
strList.set(k, "******"); // 用星号替换第k个片段
StringBuilder res = new StringBuilder();
// 构建结果字符串
for (int i = 0; i < strList.size(); i++) {
res.append(strList.get(i));
if (i < strList.size() - 1) {
res.append('_'); // 记得补下划线
}
}
System.out.println(res.toString()); // 输出最终结果
}
}
题目内容
给定一个由多个命令字组成的命令字符串:
1.字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号;
2.命令字之间以一个或多个下划线 进行分割;
3.可以通过两个双引号 ""来标识包含下划线,的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现,请对指定索引的敏感字段进行加密,替换为 * * * * * * (6个*),并删除命令字前后多余的下划线_。
如果无法找到指定索引的命令字,输出字符串ERROR。
输入描述
输入为两行,第一行为命令字素引K(从0开始),第二行为命令字符串S。
输出描述
输出处理后的命令字符串,如果无法找到指定索引的命令字,输出字符串ERROR。
样例1
输入
1
password_a12345678_timeout_100
输出
password_******_timeout_100
说明
无
样例2
输入
2
aaa_password_******_timeout_100_""_
输出
aaa_password_******_timeout_100_""
说明
无