输入描述:
先输入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()); } } }