输入描述:
先输入key和要加密的字符串
输出描述:
返回加密后的字符串
1 其实难点就是,如何构造一个新的key, 原key要去重后, 再和26个字母拼接, 去重后形成新的key,
因此用set
2 最后就是考虑原串会出现大小写 以及空格的情况,目前 密钥是全大写, 将set转化成list, 可以根据下标去直接查值,下标就是字符之间的ASCII码差值,小写的情况就要考虑再转化成大写

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().toUpperCase();
                String str = sc.nextLine();
                char[] cKey = key.toCharArray();
                char[] c2 = str.toCharArray();
                LinkedHashSet<Character> set = new LinkedHashSet<>();
                //先把key 放进去,set自动去重
                for(int i=0;i<cKey.length;i++){
                    set.add(cKey[i]);
                }
                //再把26个字母放进去,形成新的key,set自动去重
                int k = 0;
                while(set.size()<26){
                    char ch = (char)('A'+k);//从A一个个往后加 自动去重
                    set.add(ch);
                    k++;
                }
                //得到新的密钥后 将它转化成list, 再用原串去匹配密钥之后的加密串
                ArrayList<Character> listKey = new ArrayList<>(set);
                StringBuffer sb = new StringBuffer();//存放加密后的字符串
                for(int i=0;i<c2.length;i++){
                    //判断是不是空格 是的话直接添加进去
                    if(c2[i]==' '){
                        sb.append(c2[i]);
                    }else if(c2[i]<'a'){
                        //如果是大写,则直接匹配下标 找到对应的值
                        int n = (int)(c2[i]-'A');
                        sb.append(listKey.get(n));
                    }else{
                        //最后是小写,要将原来大写key转化成小写
                        int n =(int)(c2[i]-'a');
                        char c = (char)(listKey.get(n)+'a'-'A');//转换成小写
                        sb.append(c);
                    }
                }
                System.out.println(sb.toString());
            }
        }
}