字符串处理
2.1)字符串加密
题解:
输入一个单词作为密匙,如果单词中包含有重复的字母,只保留第1个,其余几个丢弃,然后用字母表其他未出现过的字母按顺序接在后面,作为密钥,由A-Z对应这串密钥
保证输入的字符串中仅包含小写字母
多组输入
方法一:暴力
借助ArrayList,将key和字母表的其他字母依次放入list中,如果有相同的值保留第一个,最后遍历需要加密的字符串,在list中查找对应的加密密码。最终输出结果即可。
代码如下:
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String key = sc.next().toLowerCase();
String s = sc.next();
ArrayList<Character> list = new ArrayList<>();
for (int i = 0; i < key.length(); i++) {
//如果list中不存在就放入
if (!list.contains(key.charAt(i))) {
list.add(key.charAt(i));
}
}
//将a-z放入到list中
for (int i = 97; i <= 122; i++) {
char c = (char) i;
if (!list.contains(c))
list.add(c);
}
String result = "";
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= 97 && s.charAt(i) <= 122) {
result += list.get(s.charAt(i) - 97);
} else {
result += Character.toUpperCase(list.get(s.charAt(i) - 97));
}
}
System.out.println(result);
}
}
}
方法二:借助HashMap
将方法一中得到的list存入到Map中,在遍历需要加密的字符串时,可以直接从Map中获得当前字符加密后的字符。
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
String key = sc.next().toLowerCase();
String s = sc.next();
ArrayList<Character> list = new ArrayList<>();
for(int i=0;i<key.length();i++){
//如果list中不存在就放入
if(!list.contains(key.charAt(i))){
list.add(key.charAt(i));
}
}
//将A-Z放入到list中
for(int i= 97;i<=122;i++){
char c = (char) i;
if(!list.contains(c))
list.add(c);
}
Map<Character,Character> map = new HashMap<>();
int begin = 97;
for (int i=0;i<list.size();i++) {
map.put((char)(begin+i),list.get(i));
}
StringBuilder result = new StringBuilder();
for (int i=0;i<s.length();i++){
char c = s.charAt(i);
Character character = map.get(c);
if(s.charAt(i)>=97 && s.charAt(i)<=122){
result.append(character);
}else {
result.append(Character.toUpperCase(character));
}
}
System.out.println(result.toString());
}
}
}