描述
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示)
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。
请实现下述接口,通过指定的密匙和明文得到密文。
数据范围:1≤n≤100 ,保证输入的字符串中仅包含小写字母
输入描述:
先输入key和要加密的字符串
输出描述:
返回加密后的字符串
题意理解
开始也没读懂题目,看别人的代码才明白的,题目的意思是
一:根据key得到新密匙
处理输入的key的时候,在key中出现的字符,在key本身中只保留一个最前面的,题解中用一个临时字符串存储,然后在标准的字符串中还需要把这个字符给删除掉(用空字符替换)。key处理结束时,key中就没有重复的字符了,同理此时标准字符串中也没有key的字符,然后将key+标准字符串连接起来,总长度还是26,也就是说输入的key不同,得到的密匙是不同的。
二:从新密匙中找到要加密的字符
新密匙newString和STANDARD_TABLE的关系:STANDARD_TABLE中出现的字符,位置是按字母顺序排序的,所以位置直接减去‘a’就可以得到,然后在 newString中同样的索引位置即使它新对应的字符
/**
* 字符串加密
*/
public class HJ36 {
//题目中要求的全小写字母
private static final String STANDARD_TABLE = "abcdefghijklmnopqrstuvwxyz";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String key = scanner.nextLine();
String msg = scanner.nextLine();
// 1. 获取新密匙
String newString = getNewString(key);
// 2. 获取密文
String keyword = getKeyword(msg, newString);
System.out.println(keyword);
}
/**
* 获取新的字母表:题目的意思是,处理key的时候,在key中出现的字符,在key本身中只保留一个最前面的,然后在标准的字符串中还需要把这个字符给删除掉(即用空字符替换)
* 等到key处理结束时,key中就没有重复的字符了,同理此时标准字符串中也没有key的字符,然后将key+标准字符串连接起来,总长度还是26
* @param key
* @return
*/
private static String getNewString(String key) {
//新起一个字符串保存key去重后的数据
String toUpdate = STANDARD_TABLE;
String newKey = "";
for (char c : key.toCharArray()) {
// key 中字母去重
if (!newKey.contains(c + "")) {
newKey += c;}
toUpdate = toUpdate.replace(c + "", "");
}
return newKey + toUpdate;
}
/**
* 加密明文
* @param msg
* @param newTable newTable和原table的关系:Table 中出现的字符,位置是按字母顺序排序的,所以位置直接减去‘a’就可以得到,然后在 newTable 中同样的索引位置即使它新对应的字符
* @return
*/
private static String getKeyword(String msg, String newTable) {
String keyword = "";
for (char c : msg.toCharArray()) {
int index = c - 'a';
keyword += newTable.toCharArray()[index];
}
return keyword;
}
}