通过将字母移回来解码字符串

时间:2019-02-17 23:09:02

标签: java

在为CCC进行加拿大大赛练习时,我遇到了如下问题(https://dmoj.ca/problem/ccc12j4)。但是,当我使用官方评分器提交时,我无法得分。我知道一个事实,那就是分级机是合法的,并且我的代码没有超出时间或内存限制。

public static void main(String[] args) {
    // TODO code application logic here
    Scanner oIn = new Scanner(System.in);
    int k = oIn.nextInt();

    oIn.nextLine();
    String word = oIn.nextLine();
    word = " " + word;
    char[] dCode = new char[word.length()];
    char[] alphabet = {'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A',};

    for (int i = 1; i < word.length(); i++) {

        char cur = word.charAt(i);
        int s = (i * 3) + k;

        for (int j = 1; j < 27; j++) {

            if (alphabet[j] == cur) {

                dCode[i] = alphabet[j + s];

            }

        }

    }

    for (int i = 0; i < word.length(); i++) {

        System.out.print(dCode[i]);

    }

}

我用给定的示例运行了代码,它运行良好。我有缺少的测试用例吗?

2 个答案:

答案 0 :(得分:1)

word = " " + word;

您要在每个单词前面添加一个空格,并且该空格会显示在输出中。

您似乎正在这样做,因此可以从i=1开始循环播放。最好不要从0循环并调整s的计算,而不是修改输入的单词。

for (int i = 0; i < word.length(); i++) {
//           ^    
    int s = ((i+1) * 3) + k;
//           ^^^^^    

答案 1 :(得分:-1)

糟糕。语言错误。这是一个例子,这次是用Java:

public class x {

    public static void main(String ...args) {
        int K = 5;
        String encoded = "JTUSUKG";
        StringBuffer decoded = new StringBuffer();
        K = K % 26;
        for (int i = 0 ; i < encoded.length() ; i ++)
            decoded.append((char)('A' + ((encoded.charAt(i) - 'A') - 3 * (i + 1) - K + 260000) % 26));
        System.out.println(decoded.toString());
    }
 }

努力找出额外的“ + 260000”。 Java的模运算符的工作方式与Python的不同。它可以保留负数。如果单词可能太长,那么您可能需要对此做更严格的操作。

力求了解此代码。它会教给您很多有关如何将字符作为数值处理的知识。如果您愿意的话,我可以为您做些注释。