1、首先使用LinkedList存储由'A'~'Z'的26个字符链表,作为加密的键值,之所以选择LinkedList,是因为可以方便的弹出第一个元素。
2、以HashMap来存储源字符和加密后字符之间的映射关系
3、从0~25开始遍历,首先获取到key中的字符,如果HashMap中没有,则加入,同时删掉LinkedList中的字符;如果HashMap中存在了(代表键值映射已经有了),则循环取下个。注意:在key的最后一个字符的时候,有可能HashMap中已经有了,则需要直接插入LinkedList中的首元素。
4、key遍历完了之后,则依次弹出LinkedList中的首元素,依次加入HashMap中,至此,源字符与加密后的字符键值映射关系已经完成
5、遍历需要加密的文本,经过加密后输出。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String key = sc.nextLine();
String origin = sc.nextLine();
LinkedList<Character> list = new LinkedList<Character>();
for (int i = 0; i < 26; i++) {
list.add(Character.toUpperCase((char) (65 + i)));
}
Map<Character, Character> map = new HashMap<Character, Character>();
int len = key.length();
for (int i = 0, j = 0; i < 26; i++) {
if (j < len) {
char c;
do {
c = key.charAt(j++);
} while (map.containsValue(Character.toUpperCase(c)) && j < len);
if (j == len && map.containsValue(Character.toUpperCase(c))) {
map.put((char) (65 + i), list.removeFirst());
} else {
map.put((char) (65 + i), Character.toUpperCase(c));
list.remove((Character) Character.toUpperCase(c));
}
} else {
map.put((char) (65 + i), list.removeFirst());
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < origin.length(); i++) {
char c = origin.charAt(i);
if (Character.isLetter(c)) {
char d = map.get(Character.toUpperCase(c));
if (Character.isLowerCase(c)) {
d = Character.toLowerCase(d);
}
sb.append(d);
} else {
sb.append(c);
}
}
System.out.println(sb.toString());
}
}
} 


京公网安备 11010502036488号