剑指leetcode—字符串相加

题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

算法分析:
设置i,j指针分别指向num1,num2的末尾元素,模拟加法

  1. 首先是计算是否有进位,count=tmp/10,表示进几位。
  2. 添加当前为,计算tmp=a+b+count;.并将此时的位tmp%10添加到res的头部
  3. 当指针i或者j走过数字首部以后,给n1,或者n2赋值为0,就是为数字较短的那部分前面填充0.
  4. 最后遍历结束num1,num2跳出循环,根据count的值决定是否在头部添加进位1,最终返回res就可以了。

java代码实现:

class Solution {
    public String addStrings(String num1, String num2) {
	StringBuilder res=new StringBuilder("");
        int len1=num1.length();
        int len2=num2.length();
        int i=len1-1;
        int j=len2-1;
        int count=0;
        while(i>=0||j>=0)
        {
            int a=(i>=0? num1.charAt(i)-'0': 0);
            int b=(j>=0? num2.charAt(j)-'0':0);
           int sum=a+b+count;
            count=sum/10;
            res.append(sum%10);
            i--;
            j--;
        }
        if(count>0)//可以自己画一下
        res.append(1);
        return res.reverse().toString();
    } 
}

C语言实现
C语言实现过程中也遇到一些问题

  1. 要注意char和int之间的转型
  2. 遇到报错leetcode报错:45ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000018 at pc 0x000 ,该错误的原因是在程序运行的过程中,导致数组的访问越界,一开始是因为我写成了res=(char*)malloc(sizeof(char)*(len1+5));导致的错误
  3. c语言中的字符串是以字符数组存储的,一般在末尾都会有一个结束标志’\0’,在自己定义一个字符数组的时候,如果要表示为字符串,应该这样写:

char num1[]={‘9’,’\0’};

  1. 返回res指针的时候,需要在res的末尾添加’\0’,表示字符串结束符。
char * addStrings(char * num1, char * num2){
    char * res;
	int k;
	int len;
	int len1=strlen(num1);
	int len2=strlen(num2);
	if(len1>=len2)
	len=len1;
	else
	len=len2;
	res=(char*)malloc(sizeof(char)*(len+5));
	k=len;
	res[0]='0';
	res[k+1]='\0';
	int count=0;
	int sum=0;
	len1=len1-1;
	len2=len2-1;
	while(len1>=0||len2>=0)
	{
		int a=(len1>=0? num1[len1]-'0':0);
		int b=(len2>=0? num2[len2]-'0':0);
		int sum=a+b+count;
		count=sum/10;
		res[k--]=(char)(sum%10+'0');
		len1--;
		len2--;
	}
	if(count==1)
	res[k]=(char)(res[k]+1);
	if(res[0]!='0')
	return res;
	else
	{
		res++;
		return res;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Devin Dever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值