方向三:实践记录|饭馆菜品选择问题| 豆包MarsCode AI刷题

131 阅读12分钟

方向三:实践记录以及工具使用——刷题实践选题

功能亮点:

在AI技术迅猛发展的今天,AI刷题工具凭借其强大的功能和便捷性,逐渐成为广大学习者,特别是程序员和算法爱好者的重要学习辅助工具。其中,个性化题目推荐作为AI刷题工具的一大功能亮点,对学习者的学习效率和效果提升具有显著影响。

个性化题目推荐通过智能分析学习者的历史答题记录、能力水平和学习偏好,为学习者精准推送符合其当前学习需求的题目。这一功能不仅避免了传统题海战术中的盲目性和重复性,还确保了学习者能够在有限的时间内接触到最适合自己的题目,从而有效提升学习效率。同时,个性化推荐还能帮助学习者逐步突破自身瓶颈,通过不断挑战适度难度的题目,实现能力的稳步提升。

个性化题目推荐对学习的重要性在于,它能够根据每个学习者的实际情况,量身定制学习路径,使得学习更加针对性和高效。此外,这一功能还能激发学习者的学习兴趣和动力,因为学习者能够感受到自己的进步和成就,从而更加积极地投入到学习中去。

刷题实践:

AI刷题工具在实践中展现出了诸多优势,其中最为突出的包括高效反馈、精准定位弱点和系统化学习。以下通过具体的实践案例,对这些优势以及个性化题目推荐功能如何帮助学习进行详细分析。

实践案例:

问题描述

小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i = '1',那么第 ii 道菜含有蘑菇,否则没有。

小C希望点 kk 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 mm 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1。 初始代码:

def solution(s: str, a: list, m: int, k: int) -> int:
    # write code here
    pass
if __name__ == '__main__':
    print(solution("001", [10, 20, 30], 1, 2) == 30)
    print(solution("111", [10, 20, 30], 1, 2) == -1)
    print(solution("0101", [5, 15, 10, 20], 2, 3) == 30)
    
``def solution(s: str, a: list, m: int, k: int) -> int:
    # 获取含蘑菇和不含蘑菇的菜品
    mushroom_dishes = []
    no_mushroom_dishes = []
   
for i in range(len(s)):
    if s[i] == '1':
        mushroom_dishes.append(a[i])
    else:
        no_mushroom_dishes.append(a[i])

# 排序:优先选最便宜的菜品
mushroom_dishes.sort()
no_mushroom_dishes.sort()

# 如果总的菜品数不足 k,直接返回-1
if len(mushroom_dishes) + len(no_mushroom_dishes) < k:
    return -1

# 分别选择mushroom_dishes和no_mushroom_dishes
total_price = 0
mushroom_count = 0
no_mushroom_count = 0

# 使用双指针或循环来选择菜品
# 这里需要实现具体的逻辑,确保总价格最小且满足蘑菇菜品数量的限制
# 提示:可以使用一个循环来选择菜品,优先选择价格较低的菜品
# 同时确保蘑菇菜品数量不超过 m

# 返回总价格
return total_price
测试样例

if name == 'main': print(solution("001", [10, 20, 30], 1, 2) == 30) # 输出: 30 print(solution("111", [10, 20, 30], 1, 2) == -1) # 输出: -1 print(solution("0101", [5, 15, 10, 20], 2, 3) == 30) # 输出: 30 AI解析: 好的,我会帮你检查编辑区的代码,并提供一些改进建议。以下是你当前的代码:

def solution(s: str, a: list, m: int, k: int) -> int:
    # 获取含蘑菇和不含蘑菇的菜品
    mushroom_dishes = []
    no_mushroom_dishes = []
    
    for i in range(len(s)):
        if s[i] == '1':
            mushroom_dishes.append(a[i])
        else:
            no_mushroom_dishes.append(a[i])
    
    # 排序:优先选最便宜的菜品
    mushroom_dishes.sort()
    no_mushroom_dishes.sort()
    
    # 如果总的菜品数不足 k,直接返回-1
    if len(mushroom_dishes) + len(no_mushroom_dishes) < k:
        return -1
    
    # 分别选择mushroom_dishes和no_mushroom_dishes
    total_price = 0
    mushroom_count = 0
    no_mushroom_count = 0
    
    # 使用双指针或循环来选择菜品
    # 这里需要实现具体的逻辑,确保总价格最小且满足蘑菇菜品数量的限制
    # 提示:可以使用一个循环来选择菜品,优先选择价格较低的菜品
    # 同时确保蘑菇菜品数量不超过 m
    
    # 返回总价格
    return total_price

# 测试样例
if __name__ == '__main__':
    print(solution("001", [10, 20, 30], 1, 2) == 30)  # 输出: 30
    print(solution("111", [10, 20, 30], 1, 2) == -1)  # 输出: -1
    print(solution("0101", [5, 15, 10, 20], 2, 3) == 30)  # 输出: 30
问题与改进建议
  1. 未实现菜品选择逻辑

    • 代码中注释部分提到需要实现具体的逻辑来选择菜品,但目前这部分代码是空的。
  2. 未处理蘑菇菜品数量限制

    • 需要确保选择的蘑菇菜品数量不超过 m
  3. 未计算总价格

    • 需要累加所选菜品的价格,并返回总价格。
改进后的代码
def solution(s: str, a: list, m: int, k: int) -> int:
    # 将菜品分类
    with_mushroom = []
    without_mushroom = []
    
    # 根据 s 中的值将 a 划分为两部分
    for i in range(len(s)):
        if s[i] == '1':
            with_mushroom.append(a[i])
        else:
            without_mushroom.append(a[i])
    
    # 对两部分菜品分别按价格排序
    with_mushroom.sort()
    without_mushroom.sort()
    
    # 检查边界情况,如果无论如何都凑不齐 k 道菜
    if len(with_mushroom) + len(without_mushroom) < k:
        return -1

    # 用于记录含蘑菇和不含蘑菇菜品的前缀和
    prefix_with = [0] * (len(with_mushroom) + 1)
    prefix_without = [0] * (len(without_mushroom) + 1)

    # 计算含蘑菇和不含蘑菇菜品的前缀和数组
    for i in range(1, len(with_mushroom) + 1):
        prefix_with[i] = prefix_with[i - 1] + with_mushroom[i - 1]
    for i in range(1, len(without_mushroom) + 1):
        prefix_without[i] = prefix_without[i - 1] + without_mushroom[i - 1]

    # 初始化最小总价格为正无穷
    min_cost = float('inf')
    
    # 遍历可能选择的含蘑菇菜品数量
    for x in range(min(m, len(with_mushroom)) + 1):
        y = k - x  # 不含蘑菇的菜品数量
        
        # 检查是否有足够的菜品满足条件
        if y >= 0 and y <= len(without_mushroom):
            # 计算当前选择下的总价格
            cost = prefix_with[x] + prefix_without[y]
            # 更新最小总价格
            min_cost = min(min_cost, cost)
    
    # 如果最小价格没有被更新,说明无法满足条件,返回 -1
    return min_cost if min_cost != float('inf') else -1

# 测试用例
if __name__ == '__main__':
    print(solution("001", [10, 20, 30], 1, 2) == 30)  # 应输出 True
    print(solution("111", [10, 20, 30], 1, 2) == -1)  # 应输出 True
    print(solution("0101", [5, 15, 10, 20], 2, 3) == 30)  # 应输出 True


# 测试样例
if __name__ == '__main__':
    print(solution("001", [10, 20, 30], 1, 2) == 30)  # 输出: 30
    print(solution("111", [10, 20, 30], 1, 2) == -1)  # 输出: -1
    print(solution("0101", [5, 15, 10, 20], 2, 3) == 30)  # 输出: 30
解释
  1. 菜品选择逻辑

    • 使用循环来选择菜品,优先选择价格较低的菜品,同时确保蘑菇菜品数量不超过 m
  2. 计算总价格

    • 在选择菜品的过程中,累加总价格,并确保满足所有条件。
  3. 边界条件

    • 如果无法满足条件(例如蘑菇菜品数不足或非蘑菇菜品数不足),则返回 -1

实例分析Marscode AI

‌问题理解和分析‌:

Marscode AI可以帮助学习者理解问题的需求。在这个例子中,问题是要根据给定的条件(字符串s,价格列表a,最大蘑菇菜品数m,和需要的总菜品数k)来计算最小的总价格或者确定无法满足条件。 AI可以解释每个输入参数的意义,以及它们如何影响最终的输出结果。

‌代码结构和逻辑‌:

Marscode AI可以分析代码的结构,解释各个部分的功能。例如,代码首先根据字符串s将菜品分为含蘑菇和不含蘑菇两类,然后对这两类菜品按价格排序。 AI可以指出代码中的关键逻辑点,如使用前缀和数组来优化价格计算,以及如何通过遍历所有可能的含蘑菇菜品数量来找到最小总价格。

‌边界情况处理‌:

AI可以强调处理边界情况的重要性,比如在这个问题中,如果总的菜品数量不足k,则直接返回-1。 通过解释这些边界情况的处理,AI可以帮助学习者更好地理解如何在实际编程中考虑和应对各种特殊情况。

‌性能优化‌:

Marscode AI可以分析代码的性能,并指出优化点。例如,使用前缀和数组来避免重复计算,从而提高代码的效率。 AI可以解释为什么这种优化是必要的,以及它是如何工作的。

‌测试和验证‌:

AI可以帮助学习者编写测试用例来验证代码的正确性。在这个例子中,有三个测试用例,每个都检查了不同的输入情况。 通过分析这些测试用例,AI可以解释它们是如何覆盖问题的不同方面,以及如何确保代码在各种情况下都能正确工作。

‌错误处理和调试‌:

如果代码存在错误或不符合预期的输出,Marscode AI可以帮助学习者定位问题所在,并提供调试建议。 AI可以分析代码的执行过程,指出可能的错误来源,如逻辑错误、边界条件处理不当等。

‌学习和改进‌:

基于上述分析,Marscode AI可以为学习者提供个性化的学习建议,帮助我们更好地理解问题、优化代码和提高编程技能。

综上所述,Marscode AI通过深入分析代码的结构、逻辑、性能、边界情况处理等方面,为学习者提供了全面的学习支持。这不仅有助于学习者理解当前的问题,还能帮助我们提高编程能力和解决问题的能力。

AI 刷题的优势

AI 在编程学习和刷题过程中具有显著的优势,尤其是在自动化、个性化和效率提升方面。以下是 AI 刷题的一些主要优势,并通过实践案例展开分析相关功能是如何帮助我们学习的。

1. 自动化代码生成与调试

优势

  • AI 可以根据题目描述自动生成代码框架,减少手动编写代码的时间。
  • AI 可以自动检测代码中的错误,并提供调试建议。

实践案例

  • 代码生成:当面对一个复杂的算法问题时,AI 可以生成一个初步的代码框架,帮助快速理解问题的解决方案。例如,AI 可以根据题目描述生成一个排序算法的基本框架,只需在此基础上进行微调。
  • 代码调试:当在编写代码时遇到错误,AI 可以自动检测并指出错误的位置和原因。例如,如果在实现二分查找时忘记更新中间值,AI 可以提示你检查相关代码行。
2. 个性化学习路径

优势

  • AI 可以根据的学习进度和掌握程度,推荐适合的题目和学习资源。
  • AI 可以记录学习历史,分析你的弱点,并提供针对性的练习。

实践案例

  • 个性化推荐:如果在动态规划问题上表现不佳,AI 可以推荐一系列相关的动态规划题目,帮助逐步掌握该知识点。例如,AI 可以根据的答题记录,推荐从简单的动态规划问题开始,逐步过渡到更复杂的问题。
  • 弱点分析:AI 可以分析在刷题过程中的错误模式,识别出你经常犯的错误类型,并提供相应的练习。例如,如果经常在边界条件处理上出错,AI 可以推荐一些专门练习边界条件的题目。
3. 即时反馈与解释

优势

  • AI 可以即时提供代码运行结果和错误信息,帮助快速了解代码的正确性。
  • AI 可以解释代码的执行过程,帮助理解算法的原理。

实践案例

  • 即时反馈:当提交代码后,AI 可以立即给出运行结果和错误信息,帮助你快速定位问题。例如,如果在实现深度优先搜索时忘记标记已访问的节点,AI 可以提示检查相关代码行。
  • 代码解释:AI 可以解释代码的执行过程,帮助理解算法的原理。例如,当实现一个递归算法时,AI 可以逐步解释递归调用的过程,帮助你理解递归的原理。
4. 多语言支持与跨平台学习

优势

  • AI 可以支持多种编程语言,帮助不同语言之间切换学习。
  • AI 可以跨平台使用,无论是在电脑、平板还是手机上,都可以进行刷题练习。

实践案例

  • 多语言支持:如果熟悉多种编程语言,AI 可以根据需求生成不同语言的代码框架。例如,可以选择用 Python 或 Java 实现同一个算法问题,AI 可以生成相应的代码框架。
  • 跨平台学习:无论是在家、在学校还是在旅途中,AI 都可以随时随地提供刷题练习。例如,可以在手机上使用 AI 刷题应用,利用碎片时间进行练习。

总结

AI 在刷题过程中的优势主要体现在自动化、个性化、即时反馈和多语言支持等方面。通过实践案例,我们可以看到 AI 如何帮助你快速生成代码、调试错误、个性化学习、理解算法原理以及跨平台练习。这些功能不仅提高了学习效率,还增强了学习的深度和广度。