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