iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
1

今天要解的題目是凱薩密碼,凱薩密碼也稱為凱撒加密,它會將一串明文的所有字母順序經過一定數字的偏移後轉為密文。

例如有一串字母 ABCD,分別是英文26個字母中的第1, 2, 3, 4個字母,經過數字3的偏移後,變成 DEFG 的一串密文,分別是英文26個字母中的第4, 5, 6, 7個字母。

可以參考維基百科的凱薩加密:
https://zh.wikipedia.org/wiki/%E5%87%B1%E6%92%92%E5%AF%86%E7%A2%BC

因此這次的問題就是輸入一個字串明文和要偏移的數字,最後回傳加密後的字串密文。

理解題目後我們就來實作吧!

  1. 先宣告 caesarCipher() 函式,帶入 str, num 兩個參數,並宣告一個字串用於存密文,然後由於字母只有26個,因此我們會先將 num 除以26,讓 num 在0~25的範圍做偏移。然後再加上 for 迴圈,針對明文進行遍歷。
function caesarCipher(str, num) {
  let newString = '';
  num %= 26;

  for (let i = 0; i < str.length; i++) {

  }
}

  1. 接著我們會用到一個語法 charCodeAt(index),它可以將字母轉為 ASCII Code,然後我們根據這個 ASCII Code 判斷字母是否為大小寫並進行偏移。偏移之後我們再將數字用 String.fromCharCode(num) 轉為字母。

  2. String.fromCharCode(num) 裡面的一連串運算是使大小寫字母經過偏移後都還能在合理的 ASCII Code 範圍內。

  • 大寫英文字母的 ASCII Code 範圍: 65 ~ 90
  • 小寫英文字母的 ASCII Code 範圍: 97 ~ 122
function caesarCipher(str, num) {
  let newString = '';
  // num %= 26;

  for (let i = 0; i < str.length; i++) {
    let c = str.charCodeAt(i);

    // 大寫
    if (c >= 65 && c <= 90) {
      newString += String.fromCharCode((c - 65 + num) % 26 + 65);
    } else if (c >= 97 && c <= 122) { // 小寫
      newString += String.fromCharCode((c - 97 + num) % 26 + 97);
    } else { // 非字母就直接加到輸出的密文
      newString += str.charAt(i);
    }
  }
  return newString;
}

最後我們來執行完成的程式吧!

console.log(caesarCipher("Hello World!", 12));

印出結果如下:

這次的程式碼在以下連結:
https://github.com/a90100/javascript-data-structure/blob/master/day27-caesar-cipher.js

明天我們將來實作"Ransom Note"的問題!


上一篇
Day26-解題-Armstrong number 阿姆斯壯數
下一篇
Day28-解題-Ransom Note
系列文
使用JavaScript學習資料結構與演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言