1. 67. 二进制求和 - 力扣(LeetCode)
//思路:将两个字符串的内容先逆置,然后分别从头开始遍历,如果当前位置两个字符串内容都为1,则说明要进位,使用carry变量来判断是否进位,动态开辟一块内存ans用于存放求和后每个位置的值
void reserve(char* s)//逆置函数
{
int len = strlen(s);
for (int i = 0; i < len / 2; i++)
{
char t = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = t;
}
}文章来源地址https://www.toymoban.com/news/detail-850255.html
char* addBinary(char* a, char* b)
{
reserve(a);//将a、b字符串逆置
reserve(b);
int len_a = strlen(a), len_b = strlen(b);
int n = fmax(len_a, len_b);//两个字符串中较长的即为循环次数
int carry = 0;//用于判断是否进位
int len = 0;//ans下标
char* ans = (char*)malloc(sizeof(char) * (n + 2));//动态开辟空间,需要多开辟两个因为可能最终会多一个数,并且最后要存放'\0'
for (int i = 0; i < n; ++i)//循环遍历a、b
{
//根据carry的值来判断是否进位,同时考虑进位后的下一位是否进位,如此递推
carry += i < len_a ? (a[i] == '1') : 0;
carry += i < len_b ? (b[i] == '1') : 0;
ans[len++] = carry % 2 + '0';//将当前位置求和后的值记录到ans中
carry /= 2;//carry只要≥2就说明进了1位,进的1位需要保留到下次循环中加上
}
if (carry)//当出了循环后carry还为1的话,说明字符串中的数全部都进了位,并且此时ans中全为0
{
ans[len++] = '1';//直接在最后一位数据加上'1'
}
ans[len] = '\0';//最后放入'\0'
reserve(ans);//将数组逆置后返回
return ans;文章来源:https://www.toymoban.com/news/detail-850255.html
}
到了这里,关于【每日刷题】Day12的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!