本博客含有两道题目:二进制之和;小S的货船租赁冒险
二进制之和
问题描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
我的思路
- 从两个字符串的最右侧开始相加,将相加的结果放入新的字符串中
- 相加的结果为两个字符串的相应位置与进位数值的和对2进行取余
- 进位数值为上次相加的和对2进行地板除
- 最后将字符串转换为数字
- 算法复杂度为 O(n)
豆包思路
-
初始化:
result用于存储相加后的二进制结果。carry用于存储进位。
-
逐位相加:
- 使用
while循环从两个字符串的末尾开始逐位相加。 bit1和bit2分别表示当前位的值,如果已经超出字符串长度则视为0。total是当前位的和,包括进位。result将当前位的结果添加到结果字符串的最前面。carry更新为total // 2,表示进位。
- 使用
-
处理剩余位:
- 如果一个字符串比另一个长,继续处理剩余的位。
-
处理最后的进位:
- 如果最后还有进位,将其添加到结果字符串的最前面。
-
转换为十进制:
- 使用
int(result, 2)将二进制字符串转换为十进制整数。 - 使用
str()将结果转换为字符串形式。
- 使用
思路融合并编程
与豆包的思路进行融合后发现,我的思路存在问题,也就是最后的进位并没有处理,因此接受豆包的提议。
代码如下:
def solution(binary1, binary2):
result = ""
carry = 0
i, j = len(binary1) - 1, len(binary2) - 1
while i >= 0 or j >= 0:
bit1 = int(binary1[i]) if i >= 0 else 0
bit2 = int(binary2[j]) if j >= 0 else 0
total = bit1 + bit2 + carry
result = str(total % 2) + result
carry = total // 2 # 更新进位
i -= 1
j -= 1
if carry:
result = "1" + result
decimal_result = str(int(result, 2))
return decimal_result
小S的货船租赁冒险
问题描述
小S在码头租用货船,有 Q 种不同类型的货船可供选择。每种货船有固定的数量 m[i]、租赁成本 v[i] 和最大载货量 w[i]。小S希望在预算 V 元内,租用能够承载最大总货物的货船组合。每种货船的具体信息包括数量、租赁价格和载货量。小S需要你帮忙计算在给定预算下,她能租用的货船的最大总载货量是多少。
Q: 货船的种类数量。V: 李华可用的总预算(单位:元)。ships: 一个列表,其中每个元素是一个元组[m[i], v[i], w[i]],分别表示第i种货船的数量、租赁价格和每艘货船的最大载货量。
我的思路
通过循环遍历所有可能的情况,最终输出最大载货量。
豆包思路
- 初始化:创建一个二维数组
dp,大小为(Q+1) x (V+1),初始值为 0。 - 遍历每一种货船:对于每种货船,获取其数量
m、租赁成本v和载货量w。 - 遍历每一种可能的预算:对于每种预算
j,考虑不选择当前货船和选择当前货船的情况。 - 选择当前货船的情况:对于每种货船,考虑选择 1 到
m艘的情况,更新dp[i][j]。 - 返回结果:
dp[Q][V]即为在预算V内所能获得的最大载货量。
思路融合并编程
与豆包的思路进行融合后发现,我的思路与豆包思路相对一致。
def solution(Q, V, ships):
# 初始化一个二维数组 dp,大小为 (Q+1) x (V+1),初始值为 0
dp = [[0] * (V + 1) for _ in range(Q + 1)]
# 遍历每一种货船
for i in range(1, Q + 1):
m, v, w = ships[i - 1] # 获取当前货船的数量、租赁成本和载货量
# 遍历每一种可能的预算
for j in range(V + 1):
# 不选择当前货船的情况
dp[i][j] = dp[i - 1][j]
# 选择当前货船的情况
for k in range(1, m + 1):
if j >= k * v:
dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v] + k * w)
# 返回在预算 V 内所能获得的最大载货量
return dp[Q][V]