算法通关村-----数组实现加法专题问题解析

这篇具有很好参考价值的文章主要介绍了算法通关村-----数组实现加法专题问题解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数组实现整数加法

问题描述

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。详见leetcode66

问题分析

可以从数组的末尾,即length-1下标处开始向前遍历,末尾元素➕1,如果没有进位,直接返回该数组(例如 123+1->124),如果有进位,前一位继续加一,直至没有进位(例如 19+1->20),如果循环结束,仍有进位,则需要创建一个比原数组长度增加1的数组,将首元素置为1,进行返回(例如 99+1->100)。

代码实现

public int[] plusOne(int[] digits) {
    for(int i=digits.length-1;i>=0;i--){
        digits[i]++;
        digits[i]%=10;
        if(digits[i]!=0){
            return digits;
        }
    }
    digits = new int[digits.length+1];
    digits[0] = 1;
    return digits;
}

字符串加法

问题描述

给定两个字符串形式的非负整数,计算他们的和并仍然以字符串的形式返回。

问题分析

从两个字符串末尾字符依次向前遍历,取对应位的字符进行加法,设置进位标识,结果可通过StringBuilder进行存储。最后反转即可。

代码实现

public static String plusString(String str1, String str2) {
    int i = str1.length() - 1;
    int j = str2.length() - 1;
    int add = 0;
    int x;
    int y;
    StringBuilder sb = new StringBuilder();
    while (i >= 0 || j >= 0 || add != 0) {
        if (i >= 0) {
            x = str1.charAt(i) - '0';
        } else {
            x = 0;
        }
        if (j >= 0) {
            y = str2.charAt(j) - '0';
        }else {
            y = 0;
        }
        int result = x + y + add;
        sb.append(result%10);
        if(result/10 == 1){
            add = 1;
        }else{
            add = 0;
        }
        i--;
        j--;
    }
    return sb.reverse().toString();
}

二进制加法

问题描述

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。详见leetcode67

问题分析

仍然是两个字符串末尾字符依次向前遍历,取对应位的字符进行加法,设置进位标识,结果可通过StringBuilder进行存储。最后反转即可。只是结果取模和判断进位与十进制有所不同,详见代码实现

代码实现

public String addBinary(String a, String b) {
   int i = a.length() - 1;
    int j = b.length() - 1;
    int add = 0;
    int x;
    int y;
    StringBuilder sb = new StringBuilder();
    while(i>=0 || j>=0 || add!=0){
        if(i>=0){
            x = a.charAt(i)-'0';
        }else{
            x = 0;
        }
        if(j>=0){
            y = b.charAt(j)-'0';
        }else{
            y = 0;
        }
        int sum = x + y + add;
        sb.append(sum%2);
        add = sum / 2;
        i--;
        j--;
    }
    if(add == 1){
        sb.append(1);
    }
    return sb.reverse().toString();
}

总结与拓展

数组和字符串(本质上是字符数组)的加法其实只需要尽心遍历相加即可,但是数字是从低位到高位相加,而字符串是从高位到低位存储。所以需要反响遍历,并且注意进位,通过十进制与二进制的加法,可以拓展到任意进制的加法,只是在结果取模和判断进位时有所不同。

文章来源地址https://www.toymoban.com/news/detail-695891.html

到了这里,关于算法通关村-----数组实现加法专题问题解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第二关——指定区间反转问题解析

    Leetcode92有这样一道题:给你单链表的头指针head和两个整数left、right,其中left=right,请你反转从位置left到位置right的链表结点,返回反转后的链表,如图所示: 这道题呢,有两种不同的解法,分别是头插法和穿针引线法,头插法就是我们前面说过的带头结点的反转,而穿针引

    2024年02月14日
    浏览(31)
  • 算法通关村第十二关——字符串反转问题解析

    字符串反转是关于字符串算法里的重要问题,虽然不是太难,但需要考虑到一些边界问题。本篇文章就对几道字符串反转题目进行分析。 力扣344题,编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,

    2024年02月10日
    浏览(33)
  • 算法通关村——删除元素专题

    LeetCode27.给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。要求:不要使用额外的数组空间,你必须仅使用  O(1)  额外空间并  原地 修改输入数组 。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例

    2024年02月13日
    浏览(26)
  • 算法通关村第三关——数组

    从语言实现的角度: 分为顺序型和链表型,顺序型就是将数据存储在一段固定的空间内,这样访问的效率很高,但是如果要删除和增加元素的话代价比较高。 而在链表型里,元素之间是通过地址依次连接的,因此访问时必须从头开始逐步向后找,因此查找效率低,而删除和

    2024年02月11日
    浏览(34)
  • 算法通关村——不简单的数组增删改查

    数组作为最基础,最常用的数据结构,大多数人可能会觉得它很简单,但是,你真的了解数组吗?看完这篇文章,带你认识更深层次的数组。 首先我们要知道,数组是什么呢?数组是存放相同数据类型元素的集合,我们可以通过索引来访问数组,需要注意的是,数组中第一个

    2024年02月12日
    浏览(27)
  • 【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法

    👑作者主页:@进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:每日挠头算法题 如果无聊的话,就来逛逛 我的博客栈 吧! 🌹 今天为大家带来的是力扣上的一道简单题:数组形式的整数加法。这道题我在2个月前就尝试过,但是没有解答出来。两个月后

    2024年01月25日
    浏览(31)
  • 【数据结构】数组和字符串(十):稀疏矩阵的链接存储:十字链表的矩阵操作(加法、乘法、转置)

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月08日
    浏览(41)
  • 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)

    承接上一篇文章【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)】我们基本上对层级时间轮算法的基本原理有了一定的认识,本章节就从落地的角度进行分析和介绍如何通过Java进行实现一个属于我们自

    2023年04月08日
    浏览(26)
  • 数据结构与算法之数组: Leetcode 605. 种花问题 (Typescript版)

    种花问题 https://leetcode.cn/problems/can-place-flowers/ 描述 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包