每天一道LeetCode-----将用数组表示的整数加一,两个用字符串表示的(二进制)数相加

Plus One

原题链接Plus One
这里写图片描述
用数组表示一个整数,返回这个整数加一后的数组

其实只要从后面开始找,直到找到第一个不为9的位置,将其值加一然后就可以返回了,之前的9都变为0。
因为后面都是9,加一都变成0,然后向高位进位,使高位加一,只要当高位不是9时才会停止继续向高位进位,所以从后面开始找到第一个不为9的位置即可。
如果所有数字都是9,就说明需要增加一个高位1,比如999变为1000,但是数组只有3位,一种方法是在开头插入一个数字1,但是这就需要移动后面的元素了。仔细观察发现后面的元素都是0,那么可以将第一个0变为1,然后在数组后面追加一个0即可,不需要移动元素。

代码如下

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        if(digits.empty())
            return digits;

        for(int i = digits.size() - 1; i >= 0; --i)
        {
            /* 如果一直是9,就一直变0 */
            if(digits[i] == 9)
            {
                digits[i] = 0;
            }
            /* 直到找到第一个不是9的,此时不再向高位进位,加一返回 */
            else
            {
                ++digits[i];
                return digits;
            }
        }
        /* 如果一直是9,那么digits将全变为0,此时需要在高位添加一个1 */
        digits[0] = 1;
        digits.push_back(0);
        return digits;
    }
};

Add Strings

原题链接Add Strings
这里写图片描述
直接从后往前加即可
代码如下

class Solution {
public:
    string addStrings(string num1, string num2) {
        string res("");
        int idx1 = num1.size() - 1;
        int idx2 = num2.size() - 1;
        int n = 0;
        while(idx1 >= 0 || idx2 >= 0 || n > 0)
        {
            n += (idx1 >= 0) ? (num1[idx1--] - '0') : 0;
            n += (idx2 >= 0) ? (num2[idx2--] - '0') : 0;
            res = static_cast<char>(n % 10 + '0') + res;
            n /= 10;
        }
        return res;
    }
};

Add Binary

原题链接Add Binary
这里写图片描述
将两个用字符串表示的二进制数相加。
从低位开始相加,并考虑进位,如果到达最高位时仍然有进位,需要增加一位。
代码如下

class Solution {
public:
    string addBinary(string a, string b) {
        string res("");
        int a_idx = a.size() - 1;
        int b_idx = b.size() - 1;
        /* n可以既表示当前值,也可以表示进位,省去了单独用一个变量记录进位的麻烦 */
        int n = 0;
        /* 进位也可以放在while循环的条件中,省去了循环外面单独判断是否仍有进位的麻烦 */
        while(a_idx >= 0 || b_idx >= 0 || n > 0)
        {
            n += (a_idx >= 0) ? a[a_idx--] - '0' : 0;
            n += (b_idx >= 0) ? b[b_idx--] - '0' : 0;
            res = static_cast<char>(n % 2 + '0') + res;
            n /= 2;
        }
        return res;
    }
};

上述两道题都是整数加法,不过都是用数组或者字符串表示的整数,需要一位一位求解。数组加一的题中找到第一个不为0的位置的技巧可以减少循环次数。二进制相加的题中将当前位相加的值和进位用一个变量表示,同时判断是否有进位也放在循环中,省去了不少麻烦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值