您的位置:首页 > 其它

华为OJ——字符串加密

2017-07-06 20:02 281 查看
题目描述

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如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。

输入描述:

先输入key和要加密的字符串

输出描述:

返回加密后的字符串

示例1

输入

nihao

ni

输出

le

代码实现:

思路:

①先将key中字符不重复的添加到sb中

②此时,sb中存在26个字母中的部分(实际上就是key中不重复的字符),然后将26个字母其余部分,添加进sb

③根据data中的每个字符的相对‘A’位置,来读取sb中的字符,即为加密的字码

package cn.c_shuang.demo36;

import java.util.Scanner;

/**
* 字符串加密
* @author Cshuang
*
*/
public class Main {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
while(in.hasNext()){
String key=in.nextLine();
String data=in.nextLine();
StringBuilder sb=new StringBuilder();
key=key.toUpperCase();
sb.append(key.charAt(0));
char temp;
for (int i = 1; i < key.length(); i++) {
//下面的循环可直接用if(!sb.toString().contains(String.valueOf(key.charAt(i))))
//来判断sb中是否包含
for (int j = 0; j < sb.length(); j++) {
if(key.charAt(i)==sb.charAt(j)){
break;
}
if(j==sb.length()-1)
sb.append(key.charAt(i));
}
}
for (int i = 0; i < 26; i++) {
temp=(char) ('A'+i);
for (int j = 0; j < sb.length(); j++) {
if(temp==sb.charAt(j)){
break;
}
if(j==sb.length()-1)
sb.append(temp);
}
}
StringBuilder result=new StringBuilder();
for (int i = 0; i < data.length(); i++) {
temp=sb.charAt(data.toUpperCase().charAt(i)-'A');
if(String.valueOf(data.charAt(i)).matches("[A-Z]")){
result.append(temp);
}else{
result.append(String.valueOf(temp).toLowerCase());
}
}
System.out.println(result.toString().trim());
}
in.close();
}
}


注意:

牛客oj平台在输出时,若不加上trim(),出现乱七八糟的东西,但是在本地调试时,木有任何问题,但是咧,没办法,还是加上比较好!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 加密