牛客网

您所在的位置:网站首页 牛客网华为机试c语言 牛客网

牛客网

2024-07-15 09:19| 来源: 网络整理| 查看: 265

描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示)

上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。

请实现下述接口,通过指定的密匙和明文得到密文。

数据范围:1≤n≤100 ,保证输入的字符串中仅包含小写字母

输入描述: 先输入key和要加密的字符串

输出描述: 返回加密后的字符串

示例1 输入:

nihao ni

输出:

le

参考代码和详细注释即解题思路(输入的字符串大小写都可以处理成功)

import java.util.*; /** * @Author lqs * @Date 2022年05月19日 10:12:04 * @Version 1.0.0 * @ClassName ms * @Describe 注意: * 在代码中定义整数型时,全部使用long型,防止int存储不下 */ public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); char[] key = input.nextLine().toCharArray();//读取可以并转成字符数组 char[] encryptionStrToChar = input.nextLine().toCharArray();//读取需要加密的字符串并转换成字符 String[] letterString = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split(" ");//正常顺序的字符串 ArrayList keyString24 = getKeyString26(key, letterString);//获取去重后并补充完整的key // System.out.println(keyString24.size());//测试用 System.out.println(getKeyToEncryptionString(encryptionStrToChar, letterString, keyString24));//输出加密好后的字符串 } /** * 将需要加密的字符串进行加密处理 * @param encryption 需要加密的字符串 * @param letterString 正常顺序的正常字母 * @param keyLetterString 加密用的key * @return 返回加密好后的字符串 */ private static String getKeyToEncryptionString(char[] encryption,String[] letterString,ArrayList keyLetterString){ // ArrayList letterStringList = new ArrayList(Arrays.asList(letterString));//将字符串数组转换层列表 List listLetterString = Arrays.asList(letterString);//将字符串转换成列表 StringBuilder encryptionString = new StringBuilder();//存储结果的字符串 for (char c : encryption) { if (Character.isLowerCase(c)){//如果需要加密的字符为小写,则结果字符串中也需要保存小写 int indexOf = listLetterString.indexOf(String.valueOf(Character.toUpperCase(c))); encryptionString.append(keyLetterString.get(indexOf).toLowerCase(Locale.ROOT)); }else {//如果需要加密的字符为大写,则结果字符串中保存大写 int indexOf = listLetterString.indexOf(String.valueOf(c)); encryptionString.append(keyLetterString.get(indexOf)); } } return encryptionString.toString(); } /** * 将初始的key去重并添加其在字母表中没有的字母 * @param key 需要处理的key * @param letterString 正常顺序的24字母 * @return 返回处理好后的key字母表 */ private static ArrayList getKeyString26(char [] key,String[] letterString){ ArrayList arrayList = new ArrayList();//用来存储去重后的字符串 //去重,并转换层字符串的形式 for (char c : key) { if (!arrayList.contains(String.valueOf(c).toUpperCase(Locale.ROOT))){//将key转换成大写,方便处理 arrayList.add(String.valueOf(Character.toUpperCase(c))); } } //追加补充key里面没有的字母 for (String s : letterString) { if (!arrayList.contains(s)){ arrayList.add(s); } } //测试用 // for (String s : arrayList) { // System.out.print(s); // } return arrayList; } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3