首页 > 其他分享 >NC1 大数加法

NC1 大数加法

时间:2023-04-07 11:55:05浏览次数:35  
标签:sindex string 大数 int NC1 tempSum 加法 carry tindex

NC1 大数加法

题目

描述:以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:s.length,t.length≤100000,字符串仅由'0'~‘9’构成

要求:时间复杂度 O(n)

示例1

输入:
"1","99"
返回值:
"100"
说明:
1+99=100

示例2

输入:
"114514",""
返回值:
"114514"

解题思路

  1. 从字符串的最后一个字符开始遍历,每次从两个字符串里分别取出一个字符,进行相加。
  2. 需要判断是否有下位数的进位,如果有需要加上进位。
  3. 如果结果 >= 10,需要进行取模运算,得到个位数的值,把个位数记录到结果字符串里,需要记录取模运算的结果。

第一版源码

    string solve_old(string s, string t) {
        // write code here
        // return std::to_string(std::stoi(s) + std::stoi(t));
        // string s = "999", t = "100";
        auto sit = s.rbegin();
        auto tit = t.rbegin();

        string res; // 考虑优先分配好空间?
        int carry = 0; // 记录进位

        // 考虑使用下标? 代码更简洁
        // 优先分配空间后,考虑从最后一个空间开始? 避免反转
        while (sit != s.rend() && tit != t.rend()) {
            int tempRes = (int)(*sit - 48) + (int)(*tit - 48) + carry;
            carry = tempRes / 10;
            sit++;
            tit++;
            res += (char)(tempRes % 10 + 48);
        }

        while (sit != s.rend()) {
            int tempRes = (int)(*sit - 48) + carry;
            carry = tempRes / 10;
            res += (char)(tempRes % 10 + 48);
            sit++;
        }

        while (tit != t.rend()) {
            int tempRes = (int)(*tit - 48) + carry;
            carry = tempRes / 10;
            res += (char)(tempRes % 10 + 48);
            tit++;
        }

        if (carry != 0) {
            res += (char)(carry + 48);
        }

        std::reverse(res.begin(), res.end()); // 反转

        return res;
    }

可以看出,代码有很多重复的地方,我们进一步优化

存在的问题

  • 如果字符串很长的话,会动态的修改存储结果的字符串的大小
  • 我们在第一版使用了三个while循环, 存在重复代码.
  • 我们最后是进行了字符串反转的

解决思路

  • 提前分配好空间
  • 使用索引来代替迭代器
  • 由于提前分配好了空间, 我们可以把结果从结果字符串的最后一位空间开始向前存储

第二版源码

    string solve_old1(string s, string t) {
        // 数组最后以一个元素的下标
        int sindex = s.size() - 1;
        int tindex = t.size() - 1;

        // 计算最大长度
        int maxLen = sindex > tindex ? sindex + 1 : tindex + 1;

        string str(maxLen + 1,'0'); // 提前分配好空间,比最长多一,考虑进位
        int carry = 0;               // 记录进位
        while (sindex >= 0 || tindex >= 0) {
            int tempSum = 0; // 记录临时和
            if (sindex >= 0) {
                tempSum += s[sindex--] - '0';
            }
            if (tindex >= 0) {
                tempSum += t[tindex--] - '0';
            }
            tempSum += carry;
            carry = tempSum / 10;
            str[maxLen--] = tempSum % 10 + '0';
        }

        if (carry != 0) {
            str[maxLen] = carry + '0';
        } else {
            str.erase(maxLen, 1);
        }

        return str;
    }

感觉空间利用率不高,我们复用参数字符串的空间,不在自己去重新创建空间。

最终版

    string solve(string s, string t) {
        // 数组最后以一个元素的下标
        int sindex = s.size() - 1;
        int tindex = t.size() - 1;
        // 计算最大长度
        int endIndex = sindex > tindex ? sindex : tindex;
        string str = sindex > tindex ? s : t; // 合理利用已经存在的空间

        // string str(maxLen + 1, '0'); // 提前分配好空间,比最长多一,考虑进位
        int carry = 0;               // 记录进位
        while (sindex >= 0 || tindex >= 0) {
            int tempSum = 0; // 记录临时和
            if (sindex >= 0) {
                tempSum += s[sindex--] - '0';
            }
            if (tindex >= 0) {
                tempSum += t[tindex--] - '0';
            }
            tempSum += carry;
            carry = tempSum / 10;
            str[endIndex--] = tempSum % 10 + '0';
        }

        // 最高位进位
        if (carry != 0) {
            str.insert(str.begin(), carry + '0'); // 在最前面插入
        }

        return str;
    }

标签:sindex,string,大数,int,NC1,tempSum,加法,carry,tindex
From: https://www.cnblogs.com/muzhipin/p/17295659.html

相关文章

  • 大数据经典论文解读 - Metastore
    MetastoreMegastore:Providingscalable,highlyavailablestorageforinteractiveservices在Bigtable上支持SQL,实现分布式数据库:跨数据中心的多副本同步数据复制支持为多数据表的字段建立Schema,且通过SQL接口访问支持数据库的二级索引支持数据库的事务Megastore是......
  • 大数据公司如何结合AI技术
    大数据和人工智能(AI)是当今最热门的技术领域,它们之间有着密切的联系和互动。利用AI技术,大数据公司可以对海量数据进行快速处理、分析、挖掘和应用,从而提升数据价值和商业竞争力。那么,大数据公司是如何使用AI技术的呢?本文将从以下四个方面进行介绍:一、数据采集和清洗要进行大数据分析......
  • 你被大数据“杀熟”了么?
    前两天,有星球球友问我一个问题,说:他在某电商平台看上了iPadPro,准备买,其实已经有优惠了,但是一想到双十一了,于是就想着等双十一再买,肯定更优惠,然而到了双十一当天,他懵了,256g双十一价格反而涨了50,64g的涨了200。他百思不得其解,问我难道双十一都是套路么?......
  • 华为OD机试 卡片组成的最大数字
    本期题目:卡片组成的最大数字题目小组中每位都有一张卡片卡片是6位以内的正整数将卡片连起来可以组成多种数字计算组成的最大数字输入,分割的多个正整数字符串不需要考虑非数字异常情况小组种最多25个人题解地址......
  • 力扣619(MySQL)-只出现一次的最大数字(简单)
    题目:MyNumbers 表:单一数字是在MyNumbers表中只出现一次的数字。请你编写一个SQL查询来报告最大的单一数字。如果不存在单一数字,查询需报告null。查询结果如下例所示。示例1: 示例2: 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/biggest-single-num......
  • 利用人工智能和大数据,宠物app为宠物提供更全面的健康管理
    人们对宠物的关注和重视程度不断提高,越来越多的人开始选择养宠物。然而,宠物的健康管理一直是宠物主人们关注的重点。如何更好地管理宠物的健康,让宠物生活更加健康和幸福,成为了宠物主人们需要思考的问题。近年来,随着人工智能和大数据技术的迅速发展,宠物app已经成为了宠物健康管理的......
  • 宠物app如何借助大数据分析提供更贴心的宠物养护
    宠物越来越成为了人们生活中不可或缺的一部分。越来越多的人开始养宠物,而宠物的养护也变得越来越重要。为了更好地照顾宠物,宠物app应运而生。但是,如何利用大数据分析来提供更贴心的宠物养护呢?一、宠物健康监测宠物健康监测是宠物app的一个重要功能。通过在app中记录宠物的体重......
  • Springboot 系列 (29) - Springboot+HBase 大数据存储(七)| Springboot 项目通过 Phoeni
    Phoenix是HBase的开源SQL皮肤,通过Phoenix可以使用标准JDBCAPI代替HBase客户端API来创建表,插入数据和查询HBase数据。Phoenix会把SQL编译成一系列的Hbase的scan操作,然后把scan结果生成标准的JDBC结果集,其底层由于使用了Hbase的API,协处理器,过滤器。Pho......
  • 科技大数据:如何利用科普信息来更好地理解技术
    科技在不断的发展,我们的生活方式也在不断地改变。从最初的人工智能到现在的云计算、大数据等,科技的发展已经成为了我们日常生活中不可或缺的一部分。然而,对于大多数人来说,这些新兴技术可能是非常难以理解的。因此,科普信息的传播和普及变得越来越重要,这不仅可以让人们更好地了解和......
  • 掌握数据,畅享旅途——大数据在旅游App中的应用
    现在,越来越多的人选择用手机应用程序来规划和预订旅行计划,旅游App不仅提供旅游信息,还可以通过大数据分析用户行为、旅游偏好等信息,为用户提供更加个性化的服务,让用户的旅行更加顺利、愉快。一、大数据在旅游App中的应用用户行为分析旅游App通过收集用户行为数据,如用户搜索关......