豆包MarsCode 刷题(四) | 豆包MarsCode AI刷题

96 阅读4分钟

本博客含有两道题目:二进制之和;小S的货船租赁冒险

二进制之和

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

我的思路

  • 从两个字符串的最右侧开始相加,将相加的结果放入新的字符串中
  • 相加的结果为两个字符串的相应位置与进位数值的和对2进行取余
  • 进位数值为上次相加的和对2进行地板除
  • 最后将字符串转换为数字
  • 算法复杂度为 O(n)

豆包思路

  1. 初始化

    • result 用于存储相加后的二进制结果。
    • carry 用于存储进位。
  2. 逐位相加

    • 使用 while 循环从两个字符串的末尾开始逐位相加。
    • bit1bit2 分别表示当前位的值,如果已经超出字符串长度则视为0。
    • total 是当前位的和,包括进位。
    • result 将当前位的结果添加到结果字符串的最前面。
    • carry 更新为 total // 2,表示进位。
  3. 处理剩余位

    • 如果一个字符串比另一个长,继续处理剩余的位。
  4. 处理最后的进位

    • 如果最后还有进位,将其添加到结果字符串的最前面。
  5. 转换为十进制

    • 使用 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 种货船的数量、租赁价格和每艘货船的最大载货量。

我的思路

通过循环遍历所有可能的情况,最终输出最大载货量。

豆包思路

  1. 初始化:创建一个二维数组 dp,大小为 (Q+1) x (V+1),初始值为 0。
  2. 遍历每一种货船:对于每种货船,获取其数量 m、租赁成本 v 和载货量 w
  3. 遍历每一种可能的预算:对于每种预算 j,考虑不选择当前货船和选择当前货船的情况。
  4. 选择当前货船的情况:对于每种货船,考虑选择 1 到 m 艘的情况,更新 dp[i][j]
  5. 返回结果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]