1. 题目
参考链接:
字节高频题补充——36进制加法
36进制由0-9,a-z,共36个字符表示。
要求按照加法规则计算出任意两个36进制正整数的和,如1b + 2x = 48 (解释:47+105=152)
要求:不允许使用先将36进制数字整体转为10进制,相加后再转回为36进制的做法
2. 题解
此题难度倒不是很大,实际上是
算法—LeetCode 415. 字符串相加
的扩展。
LC415是十进制的大数相加,而本题是36进制的大数相加。写法建议参考以上链接的写法
掌握十进制的大数相加后,那本题只需要注意将
10
变成
36
,以及36进制字符与数值的转换。
下面代码使用
getChar(int n)
和
getInt(char ch)
两个辅助函数来完成36进制字符与数值的转换
public class Add36Strings {
class Solution {
/**
* 代码与 LC 415 字符串相加 基本一致
* @param num1
* @param num2
* @return
*/
public String add36Strings(String num1, String num2) {
int i = num1.length() - 1, j = num2.length() - 1;
int carry = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0 || carry > 0) {
int x = i >= 0 ? getInt(num1.charAt(i)) : 0;
int y = j >= 0 ? getInt(num2.charAt(j)) : 0;
int sum = x + y + carry;
sb.append(getChar(sum % 36));
carry = sum / 36;
i--;
j--;
}
return sb.reverse().toString();
}
/**
* 将十进制整数转化为 36进制字符
*
* @param n
* @return
*/
public char getChar(int n) {
if (n <= 9) {
return (char) (n + '0');
} else {
return (char) (n - 10 + 'a');
}
}
/**
* 将36 进制字符转化为 10进制整数
*
* @param c
* @return
*/
public int getInt(char c) {
if (c <= '9') {
return c - '0';
} else {
return c - 'a' + 10;
}
}
}
public static void main(String[] args) {
Solution solution = new Add36Strings().new Solution();
String a = "1b", b = "2x", c;
c = solution.add36Strings(a, b);
System.out.println(c);
}
}
版权声明:本文为qq_35077107原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。