我倒在了美团面试算法题:字符串大数相加

我倒在了美团面试算法题:字符串大数相加

话说之前换工作的时候,我经历了一次美团的视频面试。

不像腾讯面试有自家软件,美团面试是在第三方网页上进行的,长这样:


<span>我倒在了美团面试算法题:字符串大数相加</span>

看见中间的代码编辑区,我笑了,难道?真的?算法?

我的算法,有点差呀。而且没怎么刷过题。

默默祈祷不要考算法。

可就在我以为面试要结束的时候,该来的还是来了。

题目:

给定两个字符串形式的非负整数 num1 和 num2,计算它们的和。
注意,不能把 string 转换为 int 后直接相加。

面试官笑了,我也笑了,好,我写一下。

我隐约记得是模拟人工手算:


<span>我倒在了美团面试算法题:字符串大数相加</span>

一位一位来加,有进位就在左边那位加个 1。

因为没有刷过题,只能按我自己的思路去写,越写越乱,最后还是没能写出来。

面完后,我不禁陷入了沉思。

测试需要学算法?部分需要。

哪些需要?大厂、高级职位、测试开发。

怎么练?刷题。

哪里刷?力扣。

本文就跟大家讲一下字符串大数相加的算法。希望在面试时被问到了,能自信的写出来。

对这个算法,首先要考虑的是,怎么来遍历这 2 个数,可以用 2 个指针,分别指向这 2 个数的尾部,边计算边向左移动。

数的长度可能会不一样,短的那个数的指针就会先到达最左边的头部,为了能够继续计算,可以给缺失的位补 0。

加数长度不一致的问题就解决了。

指针的数相加后,可以通过除以 10 的余数,来算出当前位的结果。

进位,则可以通过对 10 的整除数,来算。

例如:


<span>我倒在了美团面试算法题:字符串大数相加</span>

指针指向的 2 个数是 5 和 6。

5 + 6 = 11,用 tmp 变量来存,tmp = n1 + n2 + carry,因为有可能右边有进位,需要加上。

11 对 10 的整除数是 1,用 carry 来存进位。

11 除以 10 的余数是 1,用 res 来存结果,需要在 res 最左边添加 “1”,把 “9084” 变为 “19084”。

最后分析代码:

class Solution:
    # 加法函数,入参num1和num2,返回计算结果,str类型
    def addStrings(self, num1: str, num2: str) -> str:
        res = ""
        # 定义i,j两个指针,分别指向两个数的尾部
        # 定义进位,默认0
        i, j, carry = len(num1) - 1, len(num2) - 1, 0
        # 循环,直到2个指针都到达头部
        while i >= 0 or j >= 0:
            # 如果没有到达头部,就通过-'0'转为int
            # 如果到达头部了,就补0
            n1 = num1[i] - '0' if i >= 0 else 0
            n2 = num2[j] - '0' if j >= 0 else 0
            # n1 + n2 + carry
            tmp = n1 + n2 + carry
            # 进位 = 对10的整除数
            carry = tmp // 10
            # 结果左边添加除以10的余数
            res = str(tmp % 10) + res
            # 每次计算后向左移动1位
            i, j = i - 1, j - 1
        # 2个指针都到达了头部,如果还有进位,就在res左边添加"1"
        # 否则直接返回res
        return "1" + res if carry else res

参考资料:力扣 415. 字符串相加

最后的最后,希望大家都能找到满意的工作,拿到超高的薪资。我也会继续向大厂努力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2662.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • acwing吧_并查集时间复杂度

    acwing吧_并查集时间复杂度小 A 和小 B 在玩一个游戏。首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。然后,小 B 向小 A 提出了 M 个问题。在每个问题中,小 B 指定两个数 l 和 r,小 A 回答 S[l∼r] 中有奇数个 1 还是偶数个 1。机智的小 B 发现小 A 有可能在撒谎。例如,小 A 曾经回答过 S[1∼3] 中有奇数个 1,S[4∼6] 中有偶数个 1,现在又回答 S[1∼6] 中有偶数个 1,显然这是自相矛盾的。请你帮助小 B 检查这 M 个答案,并指出在至少多少个回答之后可

    2022年8月9日
    2
  • Pytest(1)安装与入门「建议收藏」

    Pytest(1)安装与入门「建议收藏」pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

    2022年7月29日
    3
  • pytest 执行用例_python 分布式计算

    pytest 执行用例_python 分布式计算前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月31日
    4
  • Raid0、Raid1、Raid5及Raid10的区别

    Raid0、Raid1、Raid5及Raid10的区别一、概况Raid(RedundantArrayofIndepentDisk独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会对数据的访问造成影响而开发的数据保护技。raid就是由多块磁盘构成的冗余阵列,在操作系统下是作为一个独立的大型存储设备出现的。它可以充分发挥出多块硬盘的优势,可以提升硬盘的读写速度,提高硬盘的利用率,日工容错功能确保数据的安全性,易于管理等优点。在任何一块硬盘出现问题的情况下都可以继续工作,不受损

    2022年7月25日
    5
  • 使用admixture进行群体结构分析「建议收藏」

    使用admixture进行群体结构分析「建议收藏」使用admixture进行群体结构分析

    2022年10月25日
    0
  • phpstom 2022.01.13 激活[最新免费获取]2022.01.28[通俗易懂]

    (phpstom 2022.01.13 激活)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~G…

    2022年3月31日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号