シンプルなアルゴリズムの告白文暗号化アルゴリズムをJavaで実現

質問:
       リー・レイとハン・メイメイは前列と後列に座っていましたが、先生に発見されるのを恐れてクラスで話したかったので、代わりに小さなメモを渡しました。ノートに書かれていることを先生に知られないように、情報を伝える方法として次のように合意しました: 英字 26 文字 (
     すべて大文字) にスペースを加えた合計 27 文字を 3 つのグループに分け、9 文字各グループで。つまり、ABCDEFGHI は最初のグループ、JKLMNOPQR は 2 番目のグループ、STUVWXYZ* は 3 番目のグループです (ここで * はスペースを表します)。
     次に、メモが配信された日付に応じて文字の位置を変更します。
     まず、月の数 m に従って、グループ全体を単位として循環左シフトを (m-1) 回実行します。
     次に、日付番号dに従って、各グループ内の文字を循環的に左にシフトし、(d-1)回移動する。
     例として 3 月 8 日を取り上げます。最初にグループを移動します。3 月は左に 2 回シフトする必要があり、
     STUVWXYZ*、ABCDEFGHI、JKLMNOPQRのようになります。

入力仕様:
       各入力は 2 行で構成されます。最初の行はスペースで区切られた 2 つの数字で、最初の数字は月、2 番目の数字は日です。合法であることが保証されている日付を入力してください。
       2 行目はエンコードする情報文字列で、A~Z とスペースのみで構成され、長さは 1024 文字を超えません。

出力仕様:
       入力ごとに、対応するコードを出力します。数字はスペースで区切り、各出力は 1 行を占めます。

入力例 1: 1 1 HI                        

                                        出力例 1: 18 19

入力例2:3 8 HAPPY

                                         出力例 2: 21 23 39 39 19

入力例 3: 2 14 I LOVE YOU        

                                        出力例 3: 35 25 18 12 29 31 25 23 12 28

この記事では、次の知識を習得します。

  1.  タイトルの問題を Java アルゴリズムの問​​題に変換する方法
  2.  Java を使用して、月、日、および元の文字を新しい文字に変換します
  3.  Java を使用して既知の大文字グループを月と日で並べ替えます

        コードは以下のように表示されます:

/**
 * @author tobiasy
 */
public class MessageEncryption {
    /** 问题:
       李雷和韩梅梅坐前后排,上课想说话怕被老师发现,所以改为传小纸条。为了不被老师发现他们纸条上说的是啥,他们约定了如下方法传递信息:
     将26个英文字母(全为大写),外加空格,一共27个字符分成3组,每组9个。也就是ABCDEFGHI是第一组,JKLMNOPQR是第二组,STUVWXYZ*是第三组(此处用*代表空格)。
     然后根据传递纸条那天的日期,改变字母的位置。
     先根据月份数m,以整个分组为单位进行循环左移,移动(m-1)次。
     然后根据日期数d,对每个分组内的字符进行循环左移,移动(d-1)次。
     以3月8日为例,首先移动分组,3月需要循环左移2次,变成:
     STUVWXYZ*,ABCDEFGHI,JKLMNOPQR
     然后每组内的字符,8日的话需要循环左移7次,最终的编码为:
     Z*STUVWXY,HIABCDEFG,QRJKLMNOP
     对于要传递信息中的每个字符,用组号和组内序号两个数字来表示。
     如果在3月8日传递信息“HAPPY”,那么H位于第2组的第1个,A位于第2组第3个,P位于第3组第9个,Y位于第1组第9个,所以纸条上会写成:
     21 23 39 39 19
     现在给定日期和需要传递的信息,请输出应该写在纸条上的编码。

     输入规范:
       每个输入包含两行。第一行是用空格分隔的两个数字,第一个数字是月份,第二个数字是日子。输入保证是一个合法的日期。
       第二行为需要编码的信息字符串,仅由A~Z和空格组成,长度不超过1024个字符。

     输出规范:
       对每个输入,打印对应的编码,数字之间用空格分隔,每个输出占一行。

       输入示例1:
       1 1
       HI
       输出示例1:
       18 19

       输入示例2:
       3 8
       HAPPY
       输出示例2:
       21 23 39 39 19

       输入示例3:
       2 14
       I LOVE YOU
       输出示例3:
       35 25 18 12 29 31 25 23 12 28

     本场 Chat 你将会获得以下知识:

     如何通过题目问题转化为Java算法问题
     使用Java实现通过月日和原始字符转化为新字符
     使用Java实现对已知大写字母组根据月日进行排序

     适合人群: Java 初中级开发
     * @param args
     */
    public static void main(String[] args) {
        //月份数
        int month = 2;
        //日
        int day = 14;
        //所需要转化的字符
        String text = "I LOVE YOU";
        start(month, day, text);
    }

    public static void start(int month, int day, String text) {
        char[] chars = text.toCharArray();
        for (char c : chars) {
            String value = getChar(month, day, c);
            System.out.print(value + ",");
        }
    }

    public static String getChar(int month, int day, char c) {
        month -= 1;
        day -= 1;
        char[][] chars = {
                {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'},
                {'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R'},
                {'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' '}};
        int monthFoward = month % chars.length;
        int dayFoward = day % chars[0].length;
        chars = sort(chars, monthFoward);
        for (int i = 0; i < chars.length; i++) {
            char[] arr = chars[i];
            sort(arr, dayFoward);
        }
        return getCharLocation(chars, c);
    }

    public static String getCharLocation(char[][] chars, char c) {
        String value = "";
        sys:
        for (int i = 0; i < chars.length; i++) {
            for (int j = 0; j < chars[i].length; j++) {
                char ch = chars[i][j];
                if (ch == c) {
                    value = ++i + "" + ++j;
                    break sys;
                }
            }
        }
        return value;
    }

    public static char[] sort(char[] chars, int dayFoward) {
        char[] arr = chars.clone();
        for (int i = 0; i < chars.length; i++) {
            int forward = i + dayFoward >= chars.length ? i + dayFoward - chars.length : i + dayFoward;
            chars[i] = arr[forward];
        }
        return chars;
    }

    public static char[][] sort(char[][] chars, int monthFoward) {
        char[][] arr = chars.clone();
        for (int i = 0; i < chars.length; i++) {
            int forward = i + monthFoward >= chars.length ? i + monthFoward - chars.length : i + monthFoward;
            chars[i] = arr[forward];
        }
        return chars;
    }
}


        

おすすめ

転載: blog.csdn.net/m0_37649480/article/details/127018387
おすすめ