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"));
    }
}