题解 | #字符串加密#
字符串加密
http://www.nowcoder.com/practice/e4af1fe682b54459b2a211df91a91cf3
输入描述:
先输入key和要加密的字符串
输出描述:
返回加密后的字符串
1 其实难点就是,如何构造一个新的key, 原key要去重后, 再和26个字母拼接, 去重后形成新的key,
因此用set
2 最后就是考虑原串会出现大小写 以及空格的情况,目前 密钥是全大写, 将set转化成list, 可以根据下标去直接查值,下标就是字符之间的ASCII码差值,小写的情况就要考虑再转化成大写
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String key =sc.nextLine().toUpperCase();
String str = sc.nextLine();
char[] cKey = key.toCharArray();
char[] c2 = str.toCharArray();
LinkedHashSet<Character> set = new LinkedHashSet<>();
//先把key 放进去,set自动去重
for(int i=0;i<cKey.length;i++){
set.add(cKey[i]);
}
//再把26个字母放进去,形成新的key,set自动去重
int k = 0;
while(set.size()<26){
char ch = (char)('A'+k);//从A一个个往后加 自动去重
set.add(ch);
k++;
}
//得到新的密钥后 将它转化成list, 再用原串去匹配密钥之后的加密串
ArrayList<Character> listKey = new ArrayList<>(set);
StringBuffer sb = new StringBuffer();//存放加密后的字符串
for(int i=0;i<c2.length;i++){
//判断是不是空格 是的话直接添加进去
if(c2[i]==' '){
sb.append(c2[i]);
}else if(c2[i]<'a'){
//如果是大写,则直接匹配下标 找到对应的值
int n = (int)(c2[i]-'A');
sb.append(listKey.get(n));
}else{
//最后是小写,要将原来大写key转化成小写
int n =(int)(c2[i]-'a');
char c = (char)(listKey.get(n)+'a'-'A');//转换成小写
sb.append(c);
}
}
System.out.println(sb.toString());
}
}
}
查看16道真题和解析