題目描述
密碼是我們生活中非常重要的東東,我們的那麼一點不能說的祕密就全靠它了。哇哈哈. 接下來淵子要在密碼之上再加一套密碼,雖然簡單但也安全。
假設淵子原來一個BBS上的密碼爲zvbo9441987
,爲了方便記憶,他通過一種算法把這個密碼變換成YUANzhi1987
,這個密碼是他的名字和出生年份,怎麼忘都忘不了,而且可以明目張膽地放在顯眼的地方而不被別人知道真正的密碼。
他是這麼變換的,大家都知道手機上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0
,就這麼簡單,淵子把密碼中出現的小寫字母都變成對應的數字,數字和其他的符號都不做變換,
聲明:密碼中沒有空格,而密碼中出現的大寫字母則變成小寫之後往後移一位,如:X,先變成小寫,再往後移一位,不就是y了嘛,簡單吧。記住,z往後移是a哦。
輸入描述:
輸入包括多個測試數據。輸入是一個明文,密碼長度不超過100個字符,輸入直到文件結尾
輸出描述:
輸出淵子真正的密文
示例
輸入
YUANzhi1987
輸出
zvbo9441987
題目分析
使用加密後的密碼串,解出原始的密碼。
首先,小寫字母,需要對應手機鍵盤上的內容,去得到一個數字。
我這裏使用一個二維數組保存鍵盤上的對應關係,當然,你也可以使用 map 來存儲。
String[][] strings = new String[][]{
{"abc","2"},{"def","3"},
{"ghi","4"},{"jkl","5"},{"mno","6"},
{"pqrs","7"},{"tuv","8"},{"wxyz","9"}
};
現在來看這個數組,我是這麼想的,在輸入的密碼串中,先轉換爲一個字符數組,使用 toCharArray
方法,接着循環這個字符數組,在循環的內部,再去遍歷這個二維數組,當二維數組的 strings[j][0]
元素包含了當前循環到的字符時,表示當前字符的數值就是 strings[j][1]
。
舉個例子,就是說,假如當前的字符是 'z'
,那麼循環到 string[7][0]
的位置時,得到對應字符串是 “wxyz”
,當判斷 z
包含在 wxyz
中時,就取出 “9”
拼接到最終結果上。
然後是大寫字母的處理,先轉換爲小寫字母。
在同爲字符的情況下 :
// 32
System.out.println('a' - 'A');
因此, 字符 'a' == (char)('A' + 32)
然後是後移,就是在轉換爲小寫之後,在加1;
特殊照顧一下 ‘z’,當轉換爲小寫之後,字符若果是 ‘z’ ,就拼接上 ‘a’。
最後,是數字:不變,直接拼接。
java 代碼
import java.util.Scanner;
/**
* Created by Feng on 2020/2/17 14:08
* CurrentProject's name is java8
* 簡單密碼
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[][] strings = new String[][]{
{"abc","2"},{"def","3"},
{"ghi","4"},{"jkl","5"},{"mno","6"},
{"pqrs","7"},{"tuv","8"},{"wxyz","9"}
};
while(input.hasNext()){
String line = input.next();
char[] chars = line.toCharArray();
StringBuilder sb = new StringBuilder();
for (char aChar : chars) {
// 小寫字母
if (aChar >= 'a' && aChar <= 'z') {
for (String[] string : strings) {
boolean contains = string[0].contains(String.valueOf(aChar));
if (contains) {
sb.append(string[1]);
}
}
}
// 大寫字母
if(aChar >= 'A' && aChar <= 'Z'){
// 轉換爲小寫字母並向後移一位
int temp = aChar + 32;
// 當爲 z 時,後移一位是 a
if((char)temp == 'z'){
sb.append('a');
} else {
sb.append((char)(temp + 1));
}
}
// 數字
if(aChar >= '0' && aChar <= '9'){
sb.append(aChar);
}
}
System.out.println(sb);
}
}
}