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()); } } }