欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客网华为机试【字符串加密】

程序员文章站 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

题目分析

问题描述的很乱!!
我稍微整理一下思路:

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

结果

牛客网华为机试【字符串加密】