牛客網華爲機試【簡單密碼】

題目描述

密碼是我們生活中非常重要的東東,我們的那麼一點不能說的祕密就全靠它了。哇哈哈. 接下來淵子要在密碼之上再加一套密碼,雖然簡單但也安全。

假設淵子原來一個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);
        }
    }
}

結果

在這裏插入圖片描述

發佈了131 篇原創文章 · 獲贊 121 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章