import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String key = sc.nextLine();//key char[] unencryptedString = sc.nextLine().toCharArray();//要加密的字符串 //建立两个26字母表,区分大小写 char[] lowercase = new char[26]; char[] uppercase = new char[26]; lowercase[0] = 'a'; uppercase[0] = 'A'; for (int i = 1; i < 26; i++) { lowercase[i] = (char) (lowercase[i-1]+1); uppercase[i] = (char) (uppercase[i-1]+1); } //System.out.println(lowercase+uppercase);//打印可以直接打印字符数组。 /*首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个, 将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。*/ //1.剔除key中的重复字母。 String keyNoRepetition = ""; for (int i = 0; i < key.length(); i++) { //判断key中的字母变成小写之后是否已经存储了。 if(!keyNoRepetition.contains(key.substring(i,i+1).toLowerCase())){ keyNoRepetition += key.substring(i,i+1).toLowerCase();//存入时要小写 } } //2.建立一个新的融合keyNoRepetition之后的字母表strNewLowercase String strNewLowercase = new String(lowercase); /* //直接写String strNewLowercase = lowercase.toString();会得到一串“[C@179d3b25”,即“类名+@+地址”。 //或者 String strNewLowercase = String.velueOf(lowercase); //或者使用循环。 for (int i = 0; i < 26; i++) { strNewLowercase+=lowercase[i]; }*/ //2.1剔除字母表中含有的key中的字母 for (int i = 0; i < keyNoRepetition.length(); i++) { //删除字母表中已经存在的含有 keyNoRepetition中的字母 strNewLowercase=strNewLowercase.replace(keyNoRepetition.substring(i,i+1),""); } //2.2将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。 strNewLowercase = keyNoRepetition.toLowerCase()+strNewLowercase; //System.out.println(strNewLowercase); /*在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。 因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。 Attack AT DAWN 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 Tpptad TP ITVH * */ //注意大小写还有空格的处理 char[] charNewLowercase = strNewLowercase.toCharArray(); char[] charNewUppercase = strNewLowercase.toUpperCase().toCharArray(); for (int i = 0; i < unencryptedString.length; i++) { if(String.valueOf(uppercase).contains(String.valueOf(unencryptedString[i]))){ //如果是大写 for (int j = 0; j < 26; j++) { if(unencryptedString[i]==uppercase[j]){ unencryptedString[i] = charNewUppercase[j]; break; } } }else if(String.valueOf(lowercase).contains(String.valueOf(unencryptedString[i]))){ //如果是小写 for (int j = 0; j < 26; j++) { if(unencryptedString[i]==lowercase[j]){ unencryptedString[i] = charNewLowercase[j]; break; } } }else if(unencryptedString[i]=='\u0000'){ continue; } } System.out.println(unencryptedString); } }