算法生疏了?來一道筆試題:用字母a-z表示26進制,26進制的加法

沒找到原題的話術,這裏就憑藉印象來描述一下:

題目

用字母a-z表示26進制,編程26進制的加法(a代表0,b代表1,以此類推)
輸入:(2行)

abcdefg
mvp

輸出:(1行)

bcdrav

分析:

無非就是把2進制的算法移植到26進制中,再運用一個字母與數字的換算即可。

步驟:

  1. 計算26進制的字符串所代表的十進制數
  2. 兩個十進制數相加求和
  3. 將十進制數的和再轉化爲26進制數

代碼邏輯(java實現)

爲了方便閱讀,關鍵步驟都寫在註釋上了。

import java.util.Scanner;
import java.util.Stack;

public class q {
    public static void main(String[] args) {
        //獲取26進制字符串
        Scanner input = new Scanner(System.in);
        String str1 = input.nextLine();
        String str2 = input.nextLine();

        //反轉字符串,方便後面從個位取值
        str1 = new StringBuilder(str1).reverse().toString();
        str2 = new StringBuilder(str2).reverse().toString();

        //拆分26進制字符串的每個字符,爲char數組
        char[] c1 = str1.toCharArray();
        char[] c2 = str2.toCharArray();

        //定義兩個十進制數的累加器
        long addNum1 = 0;
        long addNum2 = 0;

        //得出十進制數
        for (int i = 0; i < c1.length; i++) {
            //同2進制一樣,(當前位數字*進制的i次方)的累加和
            addNum1 += ((int) c1[i] - 97) * Math.pow(26, i);
        }
        //得出另一個十進制數
        for (int i = 0; i < c2.length; i++) {
            addNum2 += ((int) c2[i] - 97) * Math.pow(26, i);
        }

        //得出十進制總數
        long sum = addNum1 + addNum2;

        //考慮a+a=a的特殊情況
        if (sum == 0) {
            System.out.println('a');
            return;
        }

        //用棧來保存每個26進制上每一位所代表的十進制數字
        Stack<Long> stack = new Stack<Long>();
        while (sum != 0) {
            stack.push(sum % 26);
            sum /= 26;
        }

        String str = "";
        while (!stack.isEmpty()) {
            //將int轉char,併合併到字符串上
            str += (char) (stack.pop() + 'a' - 0);
        }

        System.out.println(str);
    }
}

小結

我覺得,其實這道題是很容易想到思路的,但是綜合了很多常用的解題知識點:

  1. 字符串的反轉
  2. 字符串的拆分
  3. 字母相關的ASCII
  4. char轉int
  5. int轉char
  6. 二進制轉十進制思路
  7. 十進制轉二進制思路
  8. 棧、出棧、入棧、棧的遍歷
  9. 模運算
  10. Math.pow()次方運算

對於java生疏的同學來說,這道題可以作爲不錯的複習鞏固試題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章