解题思路:

  • 题意步骤和要求 以及解题思路:
  • 1. 给字符串去重 且保留第一个 ,得到一个处理之后的单词A
  • 2. 将单词A作为新表头 后续依照字母顺序 依次填充剩余字母表
  • 3. 根据原字母表和新字母表的对应 根据需要加密的原文 对应的新字母表单词 ,构建加密文;
  • 解决思路:
  • 1的解决 可以使用有序的不可重复的数据结构 LinkedHashSet<>. set中最后得到的就是新表头A。 为了后面保证原文单词对应的大小写不变,所以将新字母表 都处理为大写字母。 在第三步构建加密文的时候,方便处理。
  • 还是利用LinkedHashSet的有序的不可重复性质, 循环26次,依次添加大写字字母进去
  • 基础知识‘A’=65,‘a’=97 相差32,所以大小写的转换可以加减32;
  • ‘A’ = (char)(‘B’ - 1);
  • 找下标
  • 字母顺序为 0--26位置;
  • 原文的当前字母 与对应大小写字母a的差值 即为下标。
  • 将set转为list, 可以通过下标 获取新字母表对应的字母;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) { 
            // 密钥 统一转为大写字母,且后续构建新字母表 都为大写字母
            String pwd = in.next().toUpperCase();
            String str = in.next();

            // 密钥去重
            LinkedHashSet<Character> set = new LinkedHashSet<>();
            for (int i = 0; i < pwd.length(); i++) {
                set.add(pwd.charAt(i));
            }

            int k = 0;
            //  新字母表填充: 通过有序且不重复的set  依次添加 大写字母
            while (k < 26) {
                // 转char
                set.add((char) ('A' + k));
                k++;
            }

            // set转为list 可以获取下标
            List<Character> list = new ArrayList<>(set);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                Character c = str.charAt(i);
                if (c.equals(' ')) {
                    sb.append(c);
                } else if (c < 'a') {
                    // <a(97)  说明是大写字母 则下标为:
                    int n = c - 'A';
                    // 大写字母,因为新字母表也是大写字母,所以这里不需要转换
                    sb.append((char)list.get(n));
                } else {
                    // >'a' 说明是小写字母,
                    // 先找到下标,对应的字母,   与第一个字母的距离  就是下标
                    int n = c - 'a';
                    list.get(n);
                    // 再转换为小写字母  + 32 将密文对应的大写字母 转小写
                    sb.append((char)(list.get(n) + ('a' - 'A')));
                }
            }

            System.out.println(sb.toString());
        }
    }
}