1. 程式人生 > 其它 >LeetCode-補充題9. 36進位制加法

LeetCode-補充題9. 36進位制加法

題目來源

補充題9. 36進位制加法

題目詳情

36進位制由0-9,a-z,共36個字元表示。

要求按照加法規則計算出任意兩個36進位制正整數的和,如1b + 2x = 48 (解釋:47+105=152)

要求:不允許使用先將36進位制數字整體轉為10進位制,相加後再轉回為36進位制的做法

相似題目

415. 字串相加
43. 字串相乘
補充題9. 36進位制加法

題解分析

解法一:模擬加法

此題難度倒不是很大,實際上是LC415. 字串相加的擴充套件。LC415是十進位制的大數相加,而本題是36進位制的大數相加。

字串相加是有模板的,通過同時將n,m和進位carry放入邊界中進行考慮可以很好地解決這類問題,本題也是一樣。

這道題目的一個細節就是需要對36進位制進行轉換,這需要額外編寫兩個函式來實現進位制與字母之間的轉換。

package com.walegarrett.programming;

/**
 * @Author WaleGarrett
 * @Date 2022/4/1 16:29
 */

import org.junit.Test;

/**
 * 題目描述:
 *
 * 36進位制由0-9,a-z,共36個字元表示。
 * 要求按照加法規則計算出任意兩個36進位制正整數的和,如1b + 2x = 48  (解釋:47+105=152)
 * 要求:不允許使用先將36進位制數字整體轉為10進位制,相加後再轉回為36進位制的做法
 */
public class Addition_9 {
    public String add36String(String num1, String num2){
        int n = num1.length() - 1;
        int m = num2.length() - 1;
        int carry = 0;
        StringBuilder sb = new StringBuilder();
        while(n >= 0 || m >= 0 || carry > 0){
            int a = n >= 0 ? getInt(num1.charAt(n)) : 0;
            int b = m >= 0 ? getInt(num2.charAt(m)) : 0;
            int sum = a + b + carry;
            carry = sum / 36;
            sb.append(toChar(sum % 36));
            n--;
            m--;
        }
        return sb.reverse().toString();
    }

    private int getInt(char ch){
        if(Character.isDigit(ch)){
            return ch - '0';
        }else if(Character.isLetter(ch)){
            ch = Character.toLowerCase(ch);
            return 10 + ch - 'a';
        }
        return 0;
    }

    private char toChar(int num){
        if(num >= 0 && num < 10){
            return (char) (num + '0');
        }else if(num >= 10 && num < 36){
            return (char) (num - 10 + 'a');
        }
        return ' ';
    }

    @Test
    public void testAdd36String(){
        System.out.println(add36String("1b", "2x"));
    }
}