牛客网华为机试【字符串加密】
程序员文章站
2022-04-04 20:05:25
...
题目描述
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如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
题目分析
问题描述的很乱!!
我稍微整理一下思路:
- 输入秘钥和明文
- 对秘钥进行字符去重(将秘钥转换为字符数组,遍历,定义StringBuilder 进行拼接,当StringBuilder 的对象中找不到当前字符时,就拼接上!)
- 将秘钥拼接完整(长度等于 26),长度不够时,使用字母 [a,z] 补全,同时保证不能重复,其思路和第二步一致。拼接时,判断需要判断(区分大小写)大小写。
- 得到完整的 key(秘钥)
- 拼接密文,按照大写、小写、空格分别拼接。
- 如果是大写,则从第 4 步得到的秘钥中使用
key.charAt(word.charAt(i) - 65)
取出目标字符,还要转换为大写(保证大小写前后一致) - 如果是小写,则从第 4 步得到的秘钥中使用
key.charAt(word.charAt(i) - 97)
,同样需要转换为小写。 - 如果是空格,直接拼接即可。
- 输出密文
java 代码
import java.util.Scanner;
/**
* Created by Feng on 2020/2/21 13:15
* CurrentProject's name is java8
* 字符串加密
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNextLine()){
// 秘钥
String key = input.nextLine();
// 明文
String word = input.nextLine();
System.out.println(encrypt(key, word));
}
}
/**
* 加密
* @param key 秘钥
* @param word 明文
* @return 密文
*/
private static String encrypt(String key, String word){
String string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 先将 key 中的字符变成只出现一次
StringBuilder keyTemp = new StringBuilder();
char[] keyChars = key.toCharArray();
for (char aChar : keyChars) {
if(keyTemp.indexOf(String.valueOf(aChar)) == -1){
keyTemp.append(aChar);
}
}
// 拼接:字符只出现一次的完整的 key
char[] chars = string.toCharArray();
for (char aChar : chars) {
if(keyTemp.length() == 26){
break;
}
if(keyTemp.indexOf(String.valueOf(aChar)) == -1 &&
!keyTemp.toString().toUpperCase().contains(String.valueOf(aChar))){
keyTemp.append(aChar);
}
}
// 最终完整的 key
key = keyTemp.toString();
StringBuilder result = new StringBuilder();
// 拼接:密文
for (int i = 0; i < word.length(); i++) {
// 大写
if(word.charAt(i) >= 'A' && word.charAt(i) <= 'Z'){
result.append(String.valueOf(key.charAt(word.charAt(i) - 65)).toUpperCase());
continue;
}
// 小写
if(word.charAt(i) >= 'a' && word.charAt(i) <= 'z'){
result.append(String.valueOf(key.charAt(word.charAt(i) - 97)).toLowerCase());
continue;
}
if(word.charAt(i) == ' '){
result.append(' ');
}
}
return result.toString();
}
}
结果
上一篇: Oracle索引聚簇表的数据加载
下一篇: PHP字符串怎么转化为整数