66.加一/67.二进制求和

博客解析了两个问题:66.加一,提供了两种解决方法;67.二进制求和,重点在于字符串的转换和进位处理。对于二进制求和,通过补0使字符串长度相同,从后向前相加,处理进位情况。
摘要由CSDN通过智能技术生成
66.加一

解析:两种方法都有就是在数组必要时(如999)进行插入操作

方法一:

 class Solution {
 public:
	 vector<int> plusOne(vector<int>& digits) {
		 for (int i = digits.size() - 1; i >= 0; i--)
		 {
			 if (digits[i] == 9)
			 {
				 digits[i]=0;
			 }
			 else
			 {
				 digits[i] += 1;break;
			 }
			 if (digits[0] == 0)
				 digits.insert(digits.begin(), 1);
		 }
		 return digits;
	 }
 };

方法二:更慢一点

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        if (digits.empty()) return digits;
        int carry = 1, n = digits.size();
        for (int i = n - 1; i >= 0; --i) {
            if (carry == 0) return digits;
            int sum = digits[i] + carry;
            digits[i] = sum % 10;
            carry = sum / 10;
        }
        if (carry == 1) digits.insert(digits.begin(), 1);
        return digits;
    }
};
67.二进制求和

[1] :此题要注意的是如何将string和int之间互相转换,两个输入string的长度也可能会不同。

  • 这时我们需要新建一个string,它的长度是两条输入string中的较大的那个,并且把较短的那个输入string通过在开头加字符‘0’来补的较大的那个长度。
  • 这时候我们逐个从两个string的末尾开始取出字符,然后转为数字,相加,如果大于等于2,则标记进位标志carry,并且给新string加入一个字符‘0’。

方法一:

class Solution {
 public:
	 string addBinary(string a, string b) {
		 string res;
		 int aLen = a.size();
		 int bLen = b.size();
		 int n = max(aLen, bLen);
		 bool carry = false;//进位
		 if (aLen > bLen)
			 for (int i = 0; i < aLen - bLen; i++)
				 b.insert(b.begin(), '0');
		 else
			 for (int i = 0; i < bLen - aLen; i++)
				 a.insert(a.begin(), '0');
		 for (int i = n - 1; i >= 0; i--)
		 {
			 int temp = 0;
			 if (carry)temp = (a[i] - '0' + b[i] - '0' + 1);
			 else temp = (a[i] - '0' + b[i] - '0');
			 if (temp == 0)
			 {
				 res.insert(res.begin(), '0');
				 carry = false;
			 }
			 else if (temp == 1)
			 {
				 res.insert(res.begin(), '1');
				 carry = false;
			 }
			 else if (temp == 2)
			 {
				 res.insert(res.begin(), '0');
				 carry = true;
			 }
			 else if (temp == 3)
			 {
				 res.insert(res.begin(), '1');
				 carry = true;
			 }
		 }
		 if (carry == true)res.insert(res.begin(), '1');
         return res;
	 }
 };

方法二:
把之前的insert改成字符串直接相加。用余,除运算代替具体取值。

class Solution {
 public:
	 string addBinary(string a, string b) {
		 string res="";
		 int m = a.length()-1, n = b.length()-1,carry=0;
		 while (m>=0 || n>=0)//切忌while(m||n),因为可能都是负数那就死循环
		 {
			 int p = m >= 0 ? a[m--] - '0' : 0;
			 int q = n >= 0 ? b[n--] - '0' : 0;
			 int sum = p + q + carry;
			 carry = sum / 2;
			 res = to_string(sum%2)+res;
		 }
		 if (carry)res = "1" + res;
		 return res;
	 }
 };
 static const auto kSpeedUp = []() {
	 std::ios::sync_with_stdio(false);
	 std::cin.tie(nullptr);
	 return nullptr;
 }();

[1]https://www.cnblogs.com/grandyang/p/4079357.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值