这是我在准备笔试的时候做的一个题目,我觉得这道题我目前的解法不够好,希望在这里和大家进行探讨。
(1) 题目
题目描述
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如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。
请实现下述接口,通过指定的密匙和明文得到密文。
详细描述:
接口说明
原型:
voidencrypt(char * key,char * data,char * encrypt);
输入参数:
char * key:密匙
char * data:明文
输出参数:
char * encrypt:密文
返回值:
void
输入描述:
先输入key和要加密的字符串
输出描述:
返回加密后的字符串
输入例子:
nihao
ni
输出例子:
le
(2) 我的思路
首先根据密钥来构建一个map,map中记录密码对照表,然后对于明文逐一加密。这题比较重点的地方就是构建这个对照表,这里稍微复杂点,还有考虑大小写问题。
(3) 我的实现
package com.huawei.exec;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class EncodeString
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
//密钥
String key = scanner.nextLine();
//明文
char[] express = scanner.nextLine().toCharArray();
//构建对照表
Map<Character, Character> keyMap = createKeyTable(key.toUpperCase());
//根据对照表进行加密
for (int i = 0; i < express.length; i++)
{
express[i] = keyMap.get(express[i]);
}
//输出结果
for (int i = 0; i < express.length; i++)
{
System.out.print(express[i]);
}
System.out.println();
}
}
//构建对照表
public static Map<Character, Character> createKeyTable(String key)
{
//密码对照表
Map<Character, Character> keyMap = new TreeMap<>();
//密钥
char[] keyChars = key.toCharArray();
//去重
String newKey = "";
for (int i = 0; i < keyChars.length; i++)
{
if(!newKey.contains(keyChars[i]+""))
{
newKey += keyChars[i];
}
}
//去重之后的密钥字符数组
char[] newKeyChars = newKey.toCharArray();
//将密钥写入对照表
for(int j=0; j<newKeyChars.length; j++)
{
keyMap.put((char)(j+65), newKeyChars[j]);
keyMap.put((char)(j+97), (char)(newKeyChars[j]+32));
}
//将剩余的未插入的字符插入对照表
int index = 65;
int index2 = 97;
for(int j=0; j<26-newKeyChars.length; j++)
{
for(int k=65; k<=90; k++)
{
if(!keyMap.containsValue((char)k))
{
keyMap.put((char)(newKeyChars.length+index), (char)k);
keyMap.put((char)(newKeyChars.length+index2), (char)(k+32));
index++;
index2++;
}
}
}
keyMap.put(' ', ' ');
return keyMap;
}
}
(4) 总结
这题总体来说难度不大,但是比较繁琐。我在这里抛砖引玉,希望大神给出跟简单高效的实现方式,不甚感激。