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;
}