題目描述
有一種技巧可以對數據進行加密,它使用一個單詞作爲它的密匙。下面是它的工作原理:首先,選擇一個單詞作爲密匙,如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();
}
}