小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一道Java题目,是一道按照规则对字符串进行加密解密的问题。
题目是英文的,就不放原题了,在这里简单描述一下加密规则:
- 字符串仅包括空格和大写字母,空格不加密;
- 所有的字母首先会向后移动五步,例如A变成F,B变成G(靠后的字母移动后会回到开头部分,Z变成E);
- 所有字母会再次向后移动它在字母串的位置*2的步数,下标从0开始,例如AB变成FI;
- 在下表中的字母在字母串的加密需要按照下表加密,而不是用上述方法,例如AB变成1I;
- 如果一个字母前面的字母在上表中,那么他需要向前2x步,这个x的值是上一个字母翻译过来的数字,例如AB经过这些步骤变成1G
- 如果一个字母的前一个字母出现在上表,同时这个字母出现在下表,那么这个字母的加密遵循下表,例如YOU变成661
题目比较简单,按照步骤就行,就直接放代码了
1、首先是一些初始化操作
public class WesternCipher {
ArrayList<Character> letters = new ArrayList<>();
HashMap<Character, Character> encodermap1 = new HashMap<>();
HashMap<Character, Character> encodermap2 = new HashMap<>();
HashMap<Character, Character> decodermap1 = new HashMap<>();
HashMap<Character, Character> decodermap2 = new HashMap<>();
public WesternCipher(){
encodermap1.put('A','1');
encodermap1.put('E','2');
encodermap1.put('I','3');
encodermap1.put('O','4');
encodermap1.put('U','5');
encodermap1.put('Y','6');
encodermap2.put('A','3');
encodermap2.put('E','4');
encodermap2.put('I','5');
encodermap2.put('O','6');
encodermap2.put('U','1');
encodermap2.put('Y','2');
decodermap1.put('1','A');
decodermap1.put('2','E');
decodermap1.put('3','I');
decodermap1.put('4','O');
decodermap1.put('5','U');
decodermap1.put('6','Y');
decodermap2.put('3','A');
decodermap2.put('4','E');
decodermap2.put('5','I');
decodermap2.put('6','O');
decodermap2.put('1','U');
decodermap2.put('2','Y');
for (int i=0;i<26;i++)
letters.add((char)('A'+i));
}
}
2、然后是encode的操作
public String encode(String input)
{
boolean[] used = new boolean[input.length()];
char[] inputArray = input.toCharArray();
char[] resArray = input.toCharArray();
for (int i = 0;i<inputArray.length;i++)
{
if(encodermap1.containsKey(inputArray[i]))
{
resArray[i] = encodermap1.get(inputArray[i]);
used[i] = true;
}
}
for (int i = 1;i<inputArray.length;i++)
{
if(encodermap1.containsKey(inputArray[i-1]) && encodermap2.containsKey(inputArray[i]))
{
resArray[i] = encodermap2.get(inputArray[i]);
used[i] = true;
}
}
for (int i=0;i< inputArray.length;i++)
{
if (used[i]==true)
continue;
if (inputArray[i] == ' ')
continue;
int pianyi = 5+i*2;
if(i>0&&resArray[i-1]<='9'&&resArray[i-1]>='0')
{
pianyi = pianyi - (int)(resArray[i-1]-'0')*2;
}
resArray[i] = letters.get((pianyi+inputArray[i]-'A')%26);
}
return returnres(resArray);
}
3、然后是decode的操作
public String decode(String input)
{
boolean[] used = new boolean[input.length()];
char[] inputArray = input.toCharArray();
char[] resArray = input.toCharArray();
for (int i = 0;i<inputArray.length;i++)
{
if(decodermap1.containsKey(inputArray[i]))
{
resArray[i] = decodermap1.get(inputArray[i]);
used[i] = true;
}
if(inputArray[i] == ' ')
{
resArray[i] = ' ';
used[i] = true;
}
}
for (int i = 1;i<inputArray.length;i++)
{
if(decodermap1.containsKey(inputArray[i-1]) && decodermap2.containsKey(inputArray[i]))
{
resArray[i] = decodermap2.get(inputArray[i]);
used[i] = true;
}
}
for (int i=0;i< inputArray.length;i++)
{
if (used[i]==true)
continue;
int pianyi = -5-2*i;
if(i>0&&inputArray[i-1]<='9'&&inputArray[i-1]>='0')
{
pianyi += (int)(inputArray[i-1]-'0')*2;
}
pianyi = pianyi+inputArray[i]-'A';
while(pianyi<0)
pianyi += 26;
resArray[i] = letters.get(pianyi);
}
return returnres(resArray);
}
4、最后一个是输出操作
public String returnres(char[] resArray)
{
StringBuffer sb = new StringBuffer();
for (int i=0;i< resArray.length;i++)
{
sb.append(resArray[i]);
}
return sb.toString();
}