力扣L14--- 415.字符串相加(JAVA版)-2024年3月17日

1.题目
在这里插入图片描述

2.知识点
注1:你可以使用Integer.parseInt()或Double.parseDouble()等方法将字符串转换为整数或浮点数。

public class Main {
    public static void main(String[] args) {
        String str = "123";
        int num = Integer.parseInt(str);
        System.out.println("转换后的整数:" + num);

        String strDouble = "3.14";
        double doubleNum = Double.parseDouble(strDouble);
        System.out.println("转换后的浮点数:" + doubleNum);
    }
}
//运行结果
//转换后的整数:123
//转换后的浮点数:3.14

**注2:**在Java中,toString()方法用于将对象转换为字符串。然而,int是一个原始数据类型,而不是对象,因此它没有toString()方法。可以直接使用String.valueOf()方法将int转换为字符串。修改你的代码如下:
String.valueOf() 是一个静态方法,它接受各种类型的参数,并返回一个表示该参数的字符串。如果参数为一个对象,则调用该对象的toString()方法;如果参数为原始数据类型,则将其转换为相应的字符串表示。

int num = 123;
String str1 = String.valueOf(num); // 将整数转换为字符串

double pi = 3.14;
String str2 = String.valueOf(pi); // 将浮点数转换为字符串

boolean bool = true;
String str3 = String.valueOf(bool); // 将布尔值转换为字符串

char ch = 'A';
String str4 = String.valueOf(ch); // 将字符转换为字符串

Object obj = new Object();
String str5 = String.valueOf(obj); // 将对象转换为字符串,实际上会调用对象的 toString() 方法

注3:- ‘0’ 的作用是将字符转换为对应的数字。

在ASCII编码中,数字字符 ‘0’ 到 ‘9’ 的ASCII值是连续的,分别是 48 到 57。因此,将一个数字字符减去 ‘0’ 的ASCII值,就可以得到对应的数字。

例如:
‘0’ - ‘0’ 的结果是 0
‘1’ - ‘0’ 的结果是 1
‘2’ - ‘0’ 的结果是 2

‘9’ - ‘0’ 的结果是 9

注4:result.reverse() 是 StringBuilder 类中的方法,它用于反转 StringBuilder 对象中的字符序列。调用这个方法会将 StringBuilder 对象中的字符顺序颠倒过来。
结果是 “123”,反转后就变成了 “321”

**注5:**StringBuilder 是 Java 中的一个类,用于构建可变的字符串。与 String 类不同,StringBuilder 允许你修改字符串的内容,例如添加、删除或替换字符。这对于需要频繁修改字符串的情况非常有用,因为它避免了创建许多不必要的中间字符串,提高了性能。

以下是 StringBuilder 类的一些常用方法:

append(str):将指定的字符串添加到当前 StringBuilder 的末尾。
insert(index, str):在指定位置插入指定的字符串。
delete(start, end):删除指定范围内的字符。
deleteCharAt(index):删除指定位置的字符。
replace(start, end, str):用指定的字符串替换指定范围内的字符。
reverse():将当前 StringBuilder 中的字符序列反转。

3.思路与例子
(1)第一次思路如下,但是会抛出大整数异常,它表示当尝试将一个字符串转换为数字,但是该字符串不符合数字格式时所抛出的异常。

class Solution {
public String addStrings(String num1, String num2) {
int num11=Integer.parseInt(num1);
int num22=Integer.parseInt(num2);
int sum=0;
sum=num11+num22;
return String.valueOf(sum);

}

}
(2)

假设我们要计算以下两个数字的相加:num1 = "123" 和 num2 = "456"。

初始化: 我们从末尾开始逐位相加,并考虑进位。初始时,carry(进位)为0。

个位相加: 我们先从个位开始相加:

digit1 = 3(num1 的个位)
digit2 = 6(num2 的个位)
sum = digit1 + digit2 + carry = 3 + 6 + 0 = 9
result.append(sum % 10):将当前位的个位数(9 mod 10 = 9)添加到结果中,即 result = "9"
carry = sum / 10 = 9 / 10 = 0
十位相加: 然后我们移动到十位:

digit1 = 2(num1 的十位)
digit2 = 5(num2 的十位)
sum = digit1 + digit2 + carry = 2 + 5 + 0 = 7
result.append(sum % 10):将当前位的个位数(7 mod 10 = 7)添加到结果中,即 result = "97"
carry = sum / 10 = 7 / 10 = 0
百位相加: 最后,移动到百位:

digit1 = 1(num1 的百位)
digit2 = 4(num2 的百位)
sum = digit1 + digit2 + carry = 1 + 4 + 0 = 5
result.append(sum % 10):将当前位的个位数(5 mod 10 = 5)添加到结果中,即 result = "579"
carry = sum / 10 = 5 / 10 = 0
在每次迭代中,sum 是两个数字当前位的和,而 carry 是由前一位相加产生的进位。这样,我们可以确保正确处理进位,并得到正确的最终结果。

(3)

假设我们要计算以下两个数字的相加:num1 = "999" 和 num2 = "1"。

初始化: 我们从末尾开始逐位相加,并考虑进位。初始时,carry(进位)为0。

个位相加: 我们先从个位开始相加:

digit1 = 9(num1 的个位)
digit2 = 1(num2 的个位)
sum = digit1 + digit2 + carry = 9 + 1 + 0 = 10
result.append(sum % 10):将当前位的个位数(10 mod 10 = 0)添加到结果中,即 result = "0"
carry = sum / 10 = 10 / 10 = 1
十位相加: 然后我们移动到十位:

digit1 = 9(num1 的十位)
digit2 = 0(num2 的十位,因为已经遍历完了)
sum = digit1 + digit2 + carry = 9 + 0 + 1 = 10
result.append(sum % 10):将当前位的个位数(10 mod 10 = 0)添加到结果中,即 result = "00"
carry = sum / 10 = 10 / 10 = 1
百位相加: 最后,移动到百位:

digit1 = 9(num1 的百位)
digit2 = 0(num2 的百位,因为已经遍历完了)
sum = digit1 + digit2 + carry = 9 + 0 + 1 = 10
result.append(sum % 10):将当前位的个位数(10 mod 10 = 0)添加到结果中,即 result = "000"
carry = sum / 10 = 10 / 10 = 1
最终的结果是 "1000",即 "999 + 1 = 1000"。在每次迭代中,sum 是两个数字当前位的和,而 carry 是由前一位相加产生的进位。通过正确处理进位,我们得到了正确的最终结果。
在我们执行完第一次循环后,结果确实是 "000",而进位 carry 是 1。这意味着我们已经完成了一次相加,并且有了进位,但我们的循环还没有结束。我们需要继续循环,以确保我们处理了所有的位,并且正确处理了进位。

在下一次循环中,我们会发现所有的位都已经被遍历完了(因为 i 和 j 都小于 0 了),但进位 carry 仍然是 1。这表示我们需要在结果的最高位处添加一个额外的 1,来表示最终的进位。

所以,最终的输出应该是 "1000"。虽然结果字符串中的大部分位都是 0,但我们仍然需要将进位 1 添加到结果中,以得到正确的最终结果。

4.代码实现

class Solution {
    public String addStrings(String num1, String num2) {
        //因为不能调用大整数库(Biginteger),也不能将输入的字符串转成整数形式,所以我们直接用竖位相加的方法
      StringBuilder sb=new StringBuilder();//存计算结果
       int i=num1.length()-1;
       int j=num2.length()-1;
       int jinwei=0;//进位
       int digit1,digit2;

       while(i>=0||j>=0||jinwei!=0)
       {
       if(i>=0)
       {
        digit1=num1.charAt(i--)-'0';
        //-0  代表将字符转换成ASCII码 变成数字

       }
       else
       {
        digit1=0;//当i<0的时候,直接将该位置为0

       }
       if(j>=0)
       {
        digit2=num2.charAt(j--)-'0';
       }
       else{
        digit2=0;
       }
       
       
     int sum;
     sum=digit1+digit2+jinwei;
     sb.append(sum%10);//每次相加 从右往左  取余数  ;将当前位的个位数添加到结果中
     jinwei=sum/10;// // 更新进位,即取当前位的十位数


    }
    return sb.reverse().toString();
   
}
}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值