leetcode -- 67、989

67.二进制数求和

题目描述

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = “11”, b = “1”
输出: “100”

示例 2:

输入: a = “1010”, b = “1011”
输出: “10101”

解题方法

char * addBinary(char *a, char *b)
{
    int lenA = strlen(a), lenB = strlen(b);
    int i = lenA - 1, j = lenB - 1;
    int lenRes = lenA > lenB ? lenA+2 : lenB+2; // 设置返回数组的长度
    char * Res = (char *) malloc (sizeof(char) * lenRes);
    int carry = 0 , k = lenRes - 2;     // carry:进位;k:Res的下标
    int temp;   // 临时变量
    Res[0] = '0'; Res[lenRes - 1] = '\0';
    while ((i >= 0 || j >= 0 || carry == 1) && k >= 0)
    {
        temp = (i >= 0 ? a[i] - '0' : 0) + (j >= 0 ? b[j] - '0' : 0) + carry;
        carry = 0;          // carry记得清零
        if(temp >= 2)
        {
            carry = 1;
            temp -= 2;      // 二进制
        }
        Res[k--] = temp + '0';
        i --, j--;
    }
    if (Res[0] == '0')      // 说明进位没有到达第一位
        return Res+1;
    return Res;
}

在这里插入图片描述

989.数组形式的整形加法

题目描述

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

示例 1:

输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

示例 2:

输入:A = [2,7,4], K = 181
输出:[4,5,5]
解释:274 + 181 = 455

示例 3:

输入:A = [2,1,5], K = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021

示例 4:

输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1
输出:[1,0,0,0,0,0,0,0,0,0,0]
解释:9999999999 + 1 = 10000000000

提示:

  • 1 <= A.length <= 10000
  • 0 <= A[i] <= 9
  • 0 <= K <= 10000
  • 如果 A.length > 1,那么 A[0] != 0

解题方法

基本思路和67题一样的,67是二进制相加减,989是十进制相加减。我的第一反应是将A变成整数,和K相加,再将结果转换成数组形式。但是将A转换成整数时,有个测试案例中的A是[9,9,9,9,9,9,9,9,9,9],如果是乘十相加的话会越界;于是采用了和67题一样的方法。有些细节地方要注意,比如A是整形,K转换之和是字符,要区分。

int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
    char str[11];
    sprintf(str, "%d", K);  // 将K转化为字符串
    int lenRes = ASize > strlen(str) ? ASize + 1 : strlen(str) + 1;
    int * res = (int *) malloc (sizeof(int) * lenRes);
    int i = ASize - 1, j = strlen(str) - 1, carry = 0, k = lenRes - 1, num = 0;
    res[0] = 0;
    while((i >= 0 || j >= 0 || carry == 1) && k >= 0)
    {
        num = (i >= 0? A[i] : 0) + (j >= 0? str[j] - '0' : 0) + carry;
        carry = 0;
        if (num > 9)
        {
            carry = 1;
            num -= 10;		// 十进制
        }
        res[k--] = num;
        i --, j--;
    }
    if (res[0] == 0)
    {
        *returnSize = lenRes - 1;
        return res + 1;
    }
    *returnSize = lenRes;
    return res;
}

在这里插入图片描述

发布了184 篇原创文章 · 获赞 253 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/104356427