題目描述

尤利烏斯·凱撒藉由加密來保護他的機密資訊。凱撒的加密方式是用一個固定的數字K,來旋轉字串中的字母,讓他的字串沒有辦法被敵人給閱讀。給定一個字串S,和一個數字K,加密S並輸出加密後的結果字串。這個加密方法只能用來加密英文字母,若為符號(如「-」),則不進行加密。



原題網址

https://www.hackerrank.com/challenges/caesar-cipher-1

輸入格式

第一行包含一個整數N,範圍在1到100之間(包含1和100),表示要加密的字串長度。

第二行包含了要加密的字串S,由ASCII字元組成,不包含空格。

第三行包含一個整數K,範圍在0到100之間(包含0和100),做為加密要使用的金鑰,數字即為英文字母要旋轉的量(距離)。

範例輸出

分別在單獨的一行中輸出每個測試資料加密之後的字串。

範例輸入

11
middle-Outz
2

範例輸出

okffng-Qwvb

額外解釋

將每個還沒加密的英文字母取代為(旋轉至)字母排序K個之後字母。英文字母都是區分大小寫且可循環的,若在旋轉時遇到字母的結尾(z或Z),則從頭(a或A)開始接續。例如,z的下一個字母為a,Z的下一個字母為A。

所以範例中:

m (ASCII 109) 變成 o (ASCII 111)。
i (ASCII 105) 變成 k (ASCII 107)。
- 不變。
O (ASCII 79) 變成 Q (ASCII 81)。
z (ASCII 122) 變成 b (ASCII 98)。

解題概念

先將輸入的字串轉成字元陣列,接著走訪每個字元元素,判斷字元值落在大寫英文還是小寫英文的區間。將字元值轉成數值(大寫字母字元值要減掉A的字元值;小寫字母字元值要減掉a的字元值),加上K之後,因為要旋轉,確保字元值落在相同大小寫字母的區間內,所以還要再去除以26(A到Z或是a到z中字母的數量為26)取餘數。最後再加回剛才減掉的字元值,即是加密過後的英文字母。

參考答案

import java.util.Scanner;

public class Solution {

    public static void main(final String[] args) {
        final Scanner sc = new Scanner(System.in);

        final int N = Integer.parseInt(sc.nextLine());
        final char[] S = sc.nextLine().toCharArray();
        final int K = Integer.parseInt(sc.nextLine());
        for (int i = 0; i < N; ++i) {
            char c = S[i];
            if (c >= 'A' && c <= 'Z') {
                final int v = c - 'A';
                c = (char) ((v + K) % 26 + 'A');
            } else if (c >= 'a' && c <= 'z') {
                final int v = c - 'a';
                c = (char) ((v + K) % 26 + 'a');
            }
            System.out.print(c);
        }
        System.out.println();
    }
}