-'0'
是一种常见的将字符数字转换为对应数值的技巧,让我详细解释它的工作原理和为什么这样用。
基本原理
在Java(和许多其他编程语言)中:
- 每个字符都有对应的ASCII码值
- 数字字符’0’到’9’在ASCII表中是连续排列的
- '0’的ASCII码是48
- '1’是49
- …
- '9’是57
具体转换过程
当你有字符’0’或’1’时:
'0' - '0'
= 48 - 48 = 0'1' - '0'
= 49 - 48 = 1
为什么这样工作?
- 字符本质上是整数:在Java中,char类型可以隐式转换为int类型(即它的ASCII码值)
- 数学运算:当执行字符减法时,实际上是用它们的ASCII码值相减
- 连续排列:因为数字字符在ASCII表中是连续排列的,所以这种减法正好得到对应的数值
实际代码示例
char c = '3'; // 假设我们要转换这个字符
// 方法1:使用减法
int num1 = c - '0'; // 51('3'的ASCII码) - 48('0') = 3
// 方法2:使用Character类的方法
int num2 = Character.getNumericValue(c); // 也是3
为什么不用强制类型转换?
有些人可能会尝试这样做:
int wrongNum = (int)'3'; // 这会得到51(ASCII码),不是我们想要的3
直接强制转换得到的是ASCII码,不是数字值。
其他数字字符
这种方法适用于所有数字字符:
‘5’ - ‘0’ = 53 - 48 = 5
‘9’ - ‘0’ = 57 - 48 = 9
**
二进制求和(具体应用)
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = “11”, b = “1”
输出:“100”
示例 2:
输入:a = “1010”, b = “1011”
输出:“10101”
提示:
1 <= a.length, b.length <= 104
a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成
字符串如果不是 “0” ,就不含前导零
代码演示
class Solution {
public String addBinary(String a, String b) {
StringBuilder result=new StringBuilder();
int i=a.length()-1;
int j=b.length()-1;
int carry=0;
while(i>=0||j>=0||carry!=0){
int sum=carry;
if(i>=0){
sum+=a.charAt(i--)-'0';
}
if(j>=0){
sum+=b.charAt(j--)-'0';
}
result.append(sum%2);
carry=sum/2;
}
return result.reverse().toString();
}
}