当前位置: 首页 > article >正文

leetcode:字符串相加

题目链接
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”

示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”

示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”

法一:暴力法(部分特别大的数字无法通过)

long long myStringLong(string s)//string->int
{
	long long i = 0;
	string::iterator it = s.begin();//反向迭代器
	while (it != s.end())
	{
		i *= 10;
		i += *it-48;//数字0-9对应的ascii码48-57
		it++;
	}
	return i;
}

string myLongString(long long i)//int->string
{
	//123
	string s1;
	while (i != 0)
	{
		int x = i % 10;
		char c = 48 + x;
		s1 += c;
		i /= 10;
	}
	//到这里得到321

	//再反向遍历回去
	string::reverse_iterator rit = s1.rbegin();
	string s2;
	while (rit != s1.rend())
	{
		s2 += *rit;
		rit++;
	}
	return s2;
}

class Solution {
public:
    string addStrings(string num1, string num2) {
        long long Num1 = myStringLong(num1);
        long long Num2 = myStringLong(num2);
        long long x=Num1 + Num2;//先获取int

        if (x == 0)
        {
	        return "0";
        }
        
        //最终需要把int转成string返回
        string y = myLongString(x);
        return y;
    }
};

在这里插入图片描述
法二:按位相加

string String1(string num1, string num2, int flag)//不等长情况,子串处理
{//num1长度大于num2
    if (flag == 1)//需要进位
    {
        int k = num1.size() - num2.size();//获取长度之差
        string s = num1.substr(0, k);//取子串
        //substr(i,j)从第i个位置取j个长度的子串

        if (s[k - 1] - '0' < 9)//不需要进位
        {
            s[k - 1]++;
        }
        else//需要进位
        {
            while (s[k - 1] - '0' == 9)
            {
                s[k - 1] = '0';
                k--;
                if (k == 0)
                {
                    string tmp = "1";
                    s = tmp + s;
                    break;
                }
                if (s[k-1]-'0' != 9)//防止是9+1
                {
                    s[k - 1]++;
                    break;
                }
            }
        }
        return s;
    }
    else//不需要进位,直接取剩余子串相加即可
    {
        int k = num1.size() - num2.size();
        string s = num1.substr(0, k);
        return s;
    }
}
class Solution {
public:
    string addStrings(string num1, string num2) {
    //从最后一位开始遍历
    string num;
    int i = num1.size() - 1;
    int j = num2.size() - 1;

    int flag = 0;//用于标记后面是否需要进位

    for (i, j; i >= 0, j >= 0; i--, j--)
    {
        if (i < 0 || j < 0)
        {
            break;
        }
        int c1 = num1[i] - '0';//获得对应位的数字
        int c2 = num2[j] - '0';
        int c3;
        if (flag == 0)//前面遍历的一位相加没有超过10
        {
            c3 = c1 + c2;
        }
        else
        {
            c3 = c1 + c2 + 1;
        }
        string tmp = to_string(c3);
        if (c3 >= 10)
        {
            //个位数最大就是9+9+1
            //相加最大是两位数
            num.insert(num.begin(), tmp[1]);//头插
            flag = 1;
        }
        else
        {
            num.insert(num.begin(), tmp[0]);
            flag = 0;
        }
    }
    if (num1.size() == num2.size())
    {
        if (flag == 0)//等长无进位
        {
            return num;
        }
        else//等长有进位
        {
            //等长进位最多进1位
            //比如91+92
            //1+2=3 个位取3
            //9+9=18 十位取8
            num.insert(0, 1,'1');
            return num;
        }
    }
    //防止两字符串不等长
    if (num1.size() > num2.size())
    {
        string s = String1(num1, num2, flag);
        s += num;
        num = s;
    }
    else
    {
        string s = String1(num2, num1, flag);
        s += num;
        num = s;
    }
    
    return num;
}
};

在这里插入图片描述


http://www.kler.cn/news/327716.html

相关文章:

  • leetcode每日一题day19(24.9.29)——买票需要的时间
  • 为啥数据需转换成tensor才能参与后续建模训练
  • Kafka学习笔记(一)Linux环境基于Zookeeper搭建Kafka集群、Kafka的架构
  • 生信名词|脱靶效应|表型药物发现|VAE|批次效应|基于表型|自监督学习
  • pdf怎么编辑修改内容?详细介绍6款pdf编辑器功能
  • 解决docker一直出现“=> ERROR [internal] load metadata for docker.io/library/xxx“的问题
  • 基于SpringBoot+Vue的服装销售管理系统
  • 技术周刊 | Express.js 5.0、Meta Connect 2024、字节发布两款视频生成大模型、OpenAI CEO 发长文预测超级人工智能
  • qlora原理
  • 基于SpringBoot+Vue的留学信息推荐系统
  • UNI-APP_iOS开发技巧之:跳转到TestFlight或者App Store
  • 鸿蒙NEXT开发-ArkUI(基于最新api12稳定版)
  • 城市轨道交通网络客流大数据可视化分析系统----以某市交通网络客流数据为例
  • 负载均衡架构解说
  • 【Vue】vue2项目打包后部署刷新404,配置publicPath ./ 不生效问题
  • 极狐GitLab 17.4 升级指南
  • 小米2025届软件开发工程师(C/C++/Java)(编程题AK)
  • 丹摩智算平台部署 Llama 3.1:实践与体验
  • linux文件编程_进程
  • 2024新淘宝镜像地址下载【vue-cli】
  • 浅析人脸活体检测技术的实现过程及其应用领域
  • MongoDB 用户管理
  • docker 部署minio
  • Webpack 打包后文件过大,如何优化?
  • Maven超详细教程(三):Maven依赖查找顺序
  • PHP中的时间和日期详解
  • 无人机之数据提取篇
  • 性能优化-数据库分区技术深入解析
  • Java爬虫抓取数据的艺术
  • 56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版