数据结构 ——— 顺序表oj题:二进制求和

目录

题目要求

代码实现


题目要求

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和

示例 1:

复制代码
输入:a = "11", b = "1"
输出:"100"

示例 2:

复制代码
输入:a = "1010", b = "1011"
输出:"10101"

代码实现

代码演示:

复制代码
void reverse(char* s)
{
	int left = 0;
	int right = strlen(s) - 1;

	while (left < right)
	{
		char tmp = s[left];
		s[left] = s[right];
		s[right] = tmp;

		left++;
		right--;
	}
}

char* addBinary(char* a, char* b)
{
	int alen = strlen(a);
	int blen = strlen(b);

	// 考虑到进位和'\0',所以开辟的空间要加 2
	int slen = alen > blen ? alen + 2 : blen + 2;
	char* str = (char*)malloc(sizeof(char) * slen);

	// 判断是否开辟成功
	if (str == NULL)
	{
		perror("malloc");
		return NULL;
	}

	// 反转 a 和 b 字符串,便于计算
	reverse(a);
	reverse(b);

	int carry = 0; //判断是否进位
	int sum = 0; //每一位的和

	for (int i = 0; i < slen - 2; i++)
	{
		if (i < alen && i < blen)
			sum = (a[i] - '0') + (b[i] - '0') + carry;
		else if (i < alen)
			sum = (a[i] - '0') + carry;
		else
			sum = (b[i] - '0') + carry;
		
		if (sum < 2)
		{
			str[i] = sum + '0';

			carry = 0;
		}
		else
		{
			if (sum == 2)
				str[i] = '0';
			else
				str[i] = '1';

			carry = 1;
		}
	}

	if (carry == 1)
		str[slen - 2] = '1';
	else
		slen--;

	str[slen - 1] = '\0';

	reverse(str);
	
	return str;
}

代码解析:

先将 a 和 b 字符串反转,便于计算,而且计算的和要开的空间为 a 和 b 字符串中长度最大的再加 2 ,因为要考虑到进位和放置'\0'

创建变量 carry ,用于记录进位的状态,再利用 sum 把 a 和 b 对应数字和 carry 相加,再判断复制入 str 字符串中

最后再判断 carry 是否为 1 ,为 1 就再赋值,否则就 str 长度减1

代码验证:

算法的时间和空间复杂度:

for 循环执行了 N 次,每次内部常数次,额外开辟了 N + 2 的空间(去掉常数项)得出:

时间复杂度:O(N)

空间复杂度:O(N)

相关推荐
蛋先生DX26 分钟前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面1 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号1 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
马拉AI2 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
C++ 老炮儿的技术栈3 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客3 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
疯狂打码的少年3 小时前
【数据结构】队列:定义、顺序队列与链式队列
数据结构·笔记
地平线开发者3 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者3 小时前
【征程6】校准量化中HistogramObserver解析
算法
蔬菜_4 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list