WesternCipher 加密解密

142 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一道Java题目,是一道按照规则对字符串进行加密解密的问题。

题目是英文的,就不放原题了,在这里简单描述一下加密规则:

  1. 字符串仅包括空格和大写字母,空格不加密;
  2. 所有的字母首先会向后移动五步,例如A变成F,B变成G(靠后的字母移动后会回到开头部分,Z变成E);
  3. 所有字母会再次向后移动它在字母串的位置*2的步数,下标从0开始,例如AB变成FI;
  4. 在下表中的字母在字母串的加密需要按照下表加密,而不是用上述方法,例如AB变成1I;

在这里插入图片描述

  1. 如果一个字母前面的字母在上表中,那么他需要向前2x步,这个x的值是上一个字母翻译过来的数字,例如AB经过这些步骤变成1G
  2. 如果一个字母的前一个字母出现在上表,同时这个字母出现在下表,那么这个字母的加密遵循下表,例如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();
    }