解题思路:
- 题意步骤和要求 以及解题思路:
- 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()); } } }