目录
66. 加一
思路
代码
67. 二进制求和
思路
代码
66. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:输入:digits = [0]
输出:[1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/plus-one
思路
我们要先理解题意,这个就是把传上来的数组看成一个数,
比如 [4,3,2,1],就是4321,然后在这个数的基础上加一,变成4322,然后再把加一后的数再转为数组,变成[4,3,2,2]
那这样的话我们就不得不考虑进位情况了(如[9,9] --> 99 --> +1 --> 100 --> [1,0,0])
一.
1.那我们就要先创建一个空间来存放新数组了 ,因为存在进位情况(如99),所以位置要比原数组多一个位置(digitsSize + 1)
2.然后别忘记敲上此时的返回个数(先来进位情况)
3.那我们先把整体数组赋到新的空间里,记得把p[0]位留出来(留着放进位)(下边两种循环都可)
ps:(i 要从0开始哦,因为是把digits数组放到p里,i 主要代表digits的下标)
二.
1.p[0] 处先赋值上0
2.因为是从后面加,所以下标从后来(i = digitsSize)
3.p[i] = (p[i] + 1)%10 这一步完成题目要求的加一,
解释:
如果p[i] < 9,那(p[i] + 1)%10就大于0,直接结束循环(没进位),
如果p[i] == 9,p[i] + 1 = 10 % 10 == 0; 然后p[i]就得0,往下判断,继续进行循环(i --),直到循环结束或break跳出循环。
(如果是类似99这样的情况,那就会一直走到p[0]那位,(p[0]+1)%10==1; 这就是进位占了多出的那位(p[0]这位放的0别忘了))
三.
1.现在考虑一下没进位占p[0]位的情况(p[0]处依旧得0时)
2.返回个数变了(如下代码图)
3.就是把p数组整体往前挪一位
4.p最后多出的那一位保险起见放上‘\0’(不放不影响你过)
代码
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
int* p = (int*)malloc(sizeof(int)*(digitsSize + 1));
int i = 0;
*returnSize = digitsSize + 1;
for(i = digitsSize - 1; i >= 0; i--)
{
p[i + 1] = digits[i];//新数组把原数组整体都向后挪一位,p[0]==0;因为有99这样的可能,变100;
}
p[0] = 0;
for(i = digitsSize; i >= 0; i--)
{
p[i] = (p[i] + 1)%10;//如果是类似99这样的情况,那就会一直走到p[0]那位,
//(p[0]+1)%10==1;
if(p[i] == 0)
{
continue;
}
else
{
break;
}
}
if(p[0] == 0)
{
*returnSize = digitsSize;
for(i = 0; i < digitsSize; i++)
{
p[i] = p[i+1];//没进位时,就把数组挪回来,把p[0]占了,不空0了
}
p[i] = '\0';
}
return p;
free(p);
p = NULL;
}
67. 二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:输入:a = "1010", b = "1011"
输出:"10101"
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-binary
思路
上边的能懂的这个基本能懂,代码里都有注释 ,有看不懂的可以在评论区里问,或者私信,我都会回哦
代码
char* addBinary(char* a, char* b)
{
int len1 = strlen(a);
int len2 = strlen(b);
int L = (len1 > len2) ? len1 : len2;
int max = L + 2;//包括了进位和'\0'
int ai = len1 - 1;//都从末位开始
int bi = len2 - 1;
int k = max - 2;//新数组有多进位(比原来的多一位时)时的下标(最后面的数的下标)
char* p = (char*)malloc(sizeof(char) * max);//给新数组创位置
p[max - 1] = '\0';//末位赋'\0'
p[0] = '0';
int flag = 0;//控制进位
while (ai >= 0 || bi >= 0)
{
//转成整型计算
int num1 = (ai >= 0) ? (a[ai] - '0') : 0;
int num2 = (bi >= 0) ? (b[bi] - '0') : 0;
int sum = num1 + num2 + flag;
p[k] = sum % 2 + '0';//形成新数组了
flag = sum / 2;//二进制得2进1
ai--;
bi--;
k--;
}
if (flag != 0)//此时就还得进位
{
p[k] = '1';
}
if (p[0] == '1')
{
return p;//p[0]是1,就表明进位了,把p空间占满了,从头返回就行
}
else//否则就从p下标1位开始返回(因为没进位,p[0]空的,不要)
{
return p + 1;
}
free(p);
p = NULL;
}
╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯