牛客網華爲機試【字符串加密】

題目描述

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

題目分析

問題描述的很亂!!
我稍微整理一下思路:

  1. 輸入祕鑰和明文
  2. 對祕鑰進行字符去重(將祕鑰轉換爲字符數組,遍歷,定義StringBuilder 進行拼接,當StringBuilder 的對象中找不到當前字符時,就拼接上!)
  3. 將祕鑰拼接完整(長度等於 26),長度不夠時,使用字母 [a,z] 補全,同時保證不能重複,其思路和第二步一致。拼接時,判斷需要判斷(區分大小寫)大小寫。
  4. 得到完整的 key(祕鑰)
  5. 拼接密文,按照大寫、小寫、空格分別拼接。
  6. 如果是大寫,則從第 4 步得到的祕鑰中使用 key.charAt(word.charAt(i) - 65) 取出目標字符,還要轉換爲大寫(保證大小寫前後一致)
  7. 如果是小寫,則從第 4 步得到的祕鑰中使用 key.charAt(word.charAt(i) - 97) ,同樣需要轉換爲小寫。
  8. 如果是空格,直接拼接即可。
  9. 輸出密文

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();
    }
}

結果

在這裏插入圖片描述

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