字符串加密
字符串加密
http://www.nowcoder.com/questionTerminal/e4af1fe682b54459b2a211df91a91cf3
我们用一个长度为26的int数组,记录key中每个字母第一次出现的位置,为了与没出现的字母做出区分,记录的位置从1开始算。假设key中有i个不重复的字母,那在新的字典中,没出现的字母一定是从i位开始依次排列,前面的0到i-1是key中出现的字母。构造出新字典后,直接对data中的字符一个个转换就可以了。
代码如下
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
char[] key = sc.nextLine().toLowerCase().toCharArray();
char[] data=sc.nextLine().toCharArray();
int dlen=data.length;
char[] encrypt=new char[dlen];
int[] zidian=new int[26];
int[] realKey=new int[26];
int klen=key.length;
int newLen=klen;
for(int i=0;i<klen;i++){
if(zidian[(int)key[i]-97]==0){
zidian[(int)key[i]-97]=i+1-(klen-newLen);
}else{
newLen--;
}
}
int other=newLen;
for(int i=0;i<26;i++){
if(zidian[i]==0){
realKey[other++]=i;
}else{
realKey[zidian[i]-1]=i;
}
}
for(int i=0;i<dlen;i++){
char c=data[i];
if(c==' ') {
encrypt[i]=' ';
continue;
}
if(c>='A'&&c<='Z'){
encrypt[i]=(char)(realKey[(int)c-65]+65);
}else{
encrypt[i]=(char)(realKey[(int)c-97]+97);
}
}
System.out.println(encrypt);
}
}
}