华为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中的字符,即为加密的字码
注意:
牛客oj平台在输出时,若不加上trim(),出现乱七八糟的东西,但是在本地调试时,木有任何问题,但是咧,没办法,还是加上比较好!!!
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如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(),出现乱七八糟的东西,但是在本地调试时,木有任何问题,但是咧,没办法,还是加上比较好!!!