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