LeetCode-補充題9. 36進位制加法
阿新 • • 發佈:2022-04-01
題目來源
題目詳情
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")); } }