【算法技巧】字符数字转换为数值的详细解释

-'0' 是一种常见的将字符数字转换为对应数值的技巧,让我详细解释它的工作原理和为什么这样用。

基本原理

在Java(和许多其他编程语言)中:

  1. 每个字符都有对应的ASCII码值
  2. 数字字符’0’到’9’在ASCII表中是连续排列的
    • '0’的ASCII码是48
    • '1’是49
    • '9’是57

具体转换过程

当你有字符’0’或’1’时:

  • '0' - '0' = 48 - 48 = 0
  • '1' - '0' = 49 - 48 = 1

为什么这样工作?

  1. 字符本质上是整数:在Java中,char类型可以隐式转换为int类型(即它的ASCII码值)
  2. 数学运算:当执行字符减法时,实际上是用它们的ASCII码值相减
  3. 连续排列:因为数字字符在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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值