华为OJ——字符串加密

题目描述

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

	public static void main(String[] args) {

		Scanner scan=new Scanner(System.in);
		StringBuilder sb=new StringBuilder();
		while(scan.hasNext())
		{
			char[] letter1=new char[26];//大写字母数组
			char[] letter2=new char[26];//小写字母数组
			for(int i=0;i<26;i++){
				if(i==0){
					letter1[i]='A';
					letter2[i]='a';
				}
				else{
					letter1[i]=(char)(letter1[i-1]+1);
					letter2[i]=(char)(letter2[i-1]+1);
				}
			}

			char[] str1=scan.nextLine().toCharArray();//密钥
			char[] str2=scan.nextLine().toCharArray();//明文
			for(char ch:str1)
			{
				if(sb.toString().indexOf(ch)<0)
					sb.append(ch);
			}
			for(int i=0;i<26;i++){
				if(sb.toString().indexOf(letter1[i])<0){
					if(sb.toString().indexOf(letter2[i])<0){
						sb.append(letter2[i]);
					}
				}
			}
			char[] letter_key=sb.toString().toCharArray();//含密钥的字符串

			//加密操作
			StringBuilder pwd=new StringBuilder();
			for(int i=0;i<str2.length;i++){
				if(str2[i]>='a' && str2[i]<='z'){
					for(int j=0;j<26;j++){
						if(letter2[j]==str2[i])
							pwd.append(letter_key[j]);
					}
				}
				else if(str2[i]>='A' && str2[i]<='Z'){
					for(int j=0;j<26;j++){
						if(letter1[j]==str2[i])
							pwd.append(letter_key[j]);
					}
				}
				else if(str2[i]==' '){
					pwd.append(" ");
				}
			}
			System.out.println(pwd.toString());
		}
	}
}
时间: 2024-08-06 07:50:51

华为OJ——字符串加密的相关文章

华为OJ:字符串反转

很简单,逆向输出就好了. import java.util.Scanner; public class convertString { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); StringBuffer l=new StringBuffer(); for(int i=s.length()-1;i>=0;i--){ l.append

华为初级——字符串加密

描述:有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理:首先,选择一个单词作为密匙,如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 上面其他用字母表中剩余的字母填充完整.在对信

[华为oj]字符串通配符

该程序只满足匹配第一个相同的字符串,对于出现第二个相同字符的字符串无法解决. #include <iostream> #include <string> #include <algorithm> using namespace std; int IsMatch(string rule,string sub) { int k=0; int c=0; while(k<rule.length()&&c<sub.length()) { if(rule

华为OJ—字符串排序

http://career-oj.huawei.com/exam/ShowProblemInfo?id=2168 编写一个程序,将输入字符串中的字符按如下规则排序. 规则1:英文字母从A到Z排列,不区分大小写. 如,输入:Type 输出:epTy 规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列. 如,输入:BabA 输出:aABb 规则3:非英文字母的其它字符保持原来的位置. 如,输入:By?e 输出:Be?y 样例: 输入: A Famous Saying: Much Ado Ab

华为OJ——字符串合并处理

题目描述 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为'0'--'9'或者'A'--'F'或者'a'--'f',则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为'4',为0100b,则翻转后为0010b,也就是2.转换后的字符为'2': 如字符为'7',为0111b,则翻

华为OJ 字符串排序

写完之后,总觉得有点复杂.. 要求: 编写一个程序,将输入字符串中的字符按如下规则排序. 规则1:英文字母从A到Z排列,不区分大小写. 如,输入:Type输出:epTy 规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列. 如,输入:BabA输出:aABb 规则3:非英文字母的其它字符保持原来的位置. 如,输入:By?e输出:Be?y 样例: 输入: A Famous Saying: Much Ado About Nothing(2012/8). 输出: A aaAAbc dFgghh:

【华为OJ】【026-字符串加密】

[华为OJ][算法总篇章] [华为OJ][026-字符串加密] [工程下载] 题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理: 首先,选择一个单词作为密匙,如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

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli

【华为OJ】【083-计算字符串的相似度】

[华为OJ][算法总篇章] [华为OJ][083-计算字符串的相似度] [工程下载] 题目描述 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"travelling"变为"traveling"