Java课后习题,不会写,求解

img

img


有一种加密方法为:其使用一个字母串(可以含重复字母,字母个数不超过50)作为密钥。假定密钥单词串为feather,则先去掉密钥单词中的重复字母得到单词串feathr,然后将其反序,并将字母表中的其它字母以反序追加到后面:
加密字母的对应关系如下:a对应r,b对应h,c对应t,d对应a,e对应e,f对应f,g对应z,h对应y,i对应x,j对应w,k对应v,l对应u,m对应s,n对应q,o对应p,p对应o,q对应n,r对应m,s对应l,t对应k,u对应j,v对应i,w对应g,x对应d,y对应c,z对应b
其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密输入的字符串。假定输入的待加密字符串中的字母全为小写字母,并且输入密钥也全为小写字母。
【输入形式】
从标准输入中输入密钥串,然后在下一行输入要加密的字符串。密钥串字母个数不超过50个,待加密字符串的字符数不超过100个。
【输出形式】
加密后结果输出到标准输出。
【样例输入】
feather
c language is wonderful.

【样例输出】

t urqzjrze xl gpqaemfju.
【样例输入】
huxihxhxu
ilovechina!
【样例输出】
tqnezuvtoi!

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String key = sc.nextLine(); // 读入密钥
        String str = sc.nextLine(); // 读入待加密字符串

        // 去掉密钥中的重复字母,并将其反序
        StringBuilder sb = new StringBuilder();
        for (int i = key.length() - 1; i >= 0; i--) {
            char ch = key.charAt(i);
            if (sb.indexOf(String.valueOf(ch)) == -1) {
                sb.append(ch);
            }
        }

        // 将字母表中的其它字母以反序追加到后面
        for (char ch = 'z'; ch >= 'a'; ch--) {
            if (sb.indexOf(String.valueOf(ch)) == -1) {
                sb.append(ch);
            }
        }

        // 构建加密映射表
        String alphabet = "abcdefghijklmnopqrstuvwxyz";
        String cipher = sb.toString();
        Map<Character, Character> map = new HashMap<>();
        for (int i = 0; i < alphabet.length(); i++) {
            map.put(alphabet.charAt(i), cipher.charAt(i));
        }

        // 对字符串进行加密
        StringBuilder result = new StringBuilder();
        for (char ch : str.toCharArray()) {
            if (Character.isLowerCase(ch)) {
                result.append(map.get(ch));
            } else {
                result.append(ch);
            }
        }

        System.out.println(result);
    }
}


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

哥们你真人才