每日一题——Python实现PAT乙级1073 多选题常见计分法(举一反三+思想解读+逐步优化)9千字好文

news2025/1/20 19:16:18


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

初次尝试

再次尝试

有何不同

版本一(原始版本):

版本二(优化版本):

总结:

代码结构和逻辑

时间复杂度分析

空间复杂度分析

总结

我要更强

优化方法

优化后的代码

优化说明

时间复杂度和空间复杂度分析

哲学和编程思想

1. 抽象和封装

2. 效率和优化

3. 简洁和清晰

4. 模块化和可扩展性

5. 防御性编程

6. 函数式编程思想

7. 面向对象编程思想

8. 敏捷开发思想

举一反三

1. 抽象和封装

2. 效率和优化

3. 简洁和清晰

4. 模块化和可扩展性

5. 防御性编程

6. 函数式编程思想

7. 面向对象编程思想

8. 敏捷开发思想

通用技巧


题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=994805263624683520&page=0

初次尝试

N_students_num, M_ques_num = map(int, input().split())  # 读取学生人数和题目数量
answers = {}  # 初始化答案字典
for i in range(M_ques_num):
    full_score, option_num, right_option_num, *right_options = input().split()
    full_score = int(full_score)
    option_num = int(option_num)
    right_option_num = int(right_option_num)
    #print(full_score, option_num, right_option_num, *right_options)
    #3 4 2 a c
    answers[i+1] = [right_option_num, ''.join(right_options), full_score, option_num]  # 将题目的正确选项和分数等信息存入字典

#print(answers)
#{1: [2, 'ac', 3, 4], 2: [1, 'b', 2, 5], 3: [2, 'bc', 5, 3], 4: [4, 'abde', 1, 5]}

options_wrong_times = {}  # 初始化错误选项次数字典

for i in range(N_students_num):
    student_options = input()
    student_options = student_options.replace(' ', '')
    student_options = student_options.replace(')', '')
    student_options = student_options[1:].split('(')
    #print(student_options)
    #['2ac', '2bd', '2ac', '3abe']
    for j in range(M_ques_num):
        student_options[j] = int(student_options[j][0]), student_options[j][1:]  # 将学生答案转换为元组列表,每个元组包含选项数量和选项字符串
    #print(student_options)
    #[(2, 'ac'), (2, 'bd'), (2, 'ac'), (3, 'abe')]
    this_student_score = 0
    for j in range(M_ques_num):
        if answers[j+1][0] == student_options[j][0] and answers[j+1][1] == student_options[j][1]:
            this_student_score += answers[j+1][2]  # 完全正确,加上全部分数
            continue
        elif set(student_options[j][1]) < set(answers[j+1][1]):
            this_student_score += 0.5 * answers[j+1][2]  # 部分正确,加上一半分数
            
        wrong_options = list(set(student_options[j][1]) ^ set(answers[j+1][1]))  # 计算错误选项
        wrong_options.sort()
        for option in wrong_options:
            if str(j+1) + '-' + option not in options_wrong_times:
                options_wrong_times[str(j+1) + '-' + option] = 1  # 记录错误选项次数
            else:
                options_wrong_times[str(j+1) + '-' + option] += 1

    print(f"{this_student_score:.1f}")  # 输出每个学生的得分

if len(options_wrong_times) == 0:
    print("Too simple")  # 如果没有错误选项,输出"Too simple"
else:
    tmp = max(options_wrong_times.values())
    output = [option for option in options_wrong_times if options_wrong_times[option] == tmp]
    for i in range(len(output)):
        print(tmp, output[i])  # 输出错误次数最多的选项及其错误次数

再次尝试

N_students_num, M_ques_num = map(int, input().split())  # 读取学生人数和题目数量
answers = {}  # 初始化答案字典
for i in range(M_ques_num):
    full_score, option_num, right_option_num, *right_options = input().split()
    full_score = int(full_score)
    option_num = int(option_num)
    right_option_num = int(right_option_num)
    answers[i+1] = [right_option_num, set(right_options), full_score]  # 将题目的正确选项和分数等信息存入字典

options_wrong_times = {}  # 初始化错误选项次数字典

for i in range(N_students_num):
    student_options = input().replace(' ', '').replace(')', '')[1:].split('(')
    student_options = [set(opt[1:]) for opt in student_options]  # 将学生答案转换为集合列表
    this_student_score = 0
    for j in range(M_ques_num):
        student_option_set = student_options[j]
        correct_option_set = answers[j+1][1]
        if student_option_set == correct_option_set:
            this_student_score += answers[j+1][2]  # 完全正确,加上全部分数
        elif student_option_set.issubset(correct_option_set):
            this_student_score += 0.5 * answers[j+1][2]  # 部分正确,加上一半分数
            
        wrong_options = student_option_set.symmetric_difference(correct_option_set)  # 计算错误选项
        for option in wrong_options:
            key = f"{j+1}-{option}"
            options_wrong_times[key] = options_wrong_times.get(key, 0) + 1  # 记录错误选项次数

    print(f"{this_student_score:.1f}")  # 输出每个学生的得分

if not options_wrong_times:
    print("Too simple")  # 如果没有错误选项,输出"Too simple"
else:
    max_wrong_times = max(options_wrong_times.values())
    for option, times in sorted(options_wrong_times.items(), key=lambda x: (int(x[0].split('-')[0]), x[0].split('-')[1])):
        if times == max_wrong_times:
            print(max_wrong_times, option)  # 输出错误次数最多的选项及其错误次数

有何不同

这两个版本的代码在功能上是相同的,都是为了计算每个学生的得分并找出错得最多的题目选项。然而,它们在实现上有一些差异,主要体现在代码的简洁性、效率和可读性上。以下是两个版本的主要差异分析:

版本一(原始版本):
  1. 字符串操作较多:
    • 使用多次字符串替换和分割操作,例如 student_options = student_options.replace(' ', '').replace(')', '') 和 student_options = student_options[1:].split('(')。
    • 将学生答案转换为元组列表,例如 student_options[j] = int(student_options[j][0]), student_options[j][1:]。
  2. 使用列表和集合操作:
    • 使用列表操作来处理学生答案和正确答案,例如 wrong_options = list(set(student_options[j][1]) ^ set(answers[j+1][1]))。
    • 使用集合操作来判断部分正确的情况,例如 set(student_options[j][1]) < set(answers[j+1][1])。
  3. 错误选项次数的记录:
    • 使用字典来记录错误选项次数,例如 options_wrong_times[str(j+1) + '-' + option] = 1。
  4. 输出错误次数最多的选项:
  • 使用列表推导式来找出错误次数最多的选项,例如 output = [option for option in options_wrong_times if options_wrong_times[option] == tmp]。
版本二(优化版本):
  1. 减少字符串操作:
    • 通过一次性的字符串替换和分割操作,减少了多次的字符串操作,例如 student_options = input().replace(' ', '').replace(')', '')[1:].split('(')。
  2. 使用集合操作:
    • 将学生答案和正确答案都转换为集合,利用集合的快速操作,例如 student_options = [set(opt[1:]) for opt in student_options] 和 correct_option_set = answers[j+1][1]。
  3. 错误选项次数的记录:
    • 使用字典的 get 方法来简​编辑文章化错误选项次数的更新,例如 options_wrong_times[key] = options_wrong_times.get(key, 0) + 1。
  4. 输出错误次数最多的选项:
  • 使用排序来确保输出顺序正确,例如 for option, times in sorted(options_wrong_times.items(), key=lambda x: (int(x[0].split('-')[0]), x[0].split('-')[1]))。
总结:
  • 优化版本在代码简洁性、效率和可读性上都有所提升。
  • 优化版本减少了不必要的字符串操作,利用集合操作提高了处理速度。
  • 优化版本使用字典的 get 方法简化了错误选项次数的更新,并使用排序确保输出顺序正确。

总体来说,优化版本在性能和代码质量上都有显著提升。

这段代码的主要功能是计算每个学生的得分,并找出错得最多的题目选项。下面是对这段代码的专业点评,包括时间复杂度和空间复杂度的分析。

代码结构和逻辑

  1. 输入处理:
    • 首先读取学生人数 N_students_num 和题目数量 M_ques_num。
    • 然后读取每个题目的详细信息(包括满分、选项数量、正确选项数量和正确选项)并存储在字典 answers 中。
  2. 学生得分计算:
    • 对于每个学生,读取其答案并转换为集合列表。
    • 计算每个学生的得分,并记录每个错误选项的出现次数。
  3. 输出结果:
  • 输出每个学生的得分。
  • 如果没有错误选项,输出 "Too simple"。
  • 否则,输出错误次数最多的选项及其错误次数。

时间复杂度分析

  1. 初始化答案字典:
    • 这部分的时间复杂度是 O(M),其中 M 是题目数量。
  2. 学生得分计算:
    • 对于每个学生,需要处理其答案并计算得分。这部分的时间复杂度是 O(N * M),其中 N 是学生人数,M 是题目数量。
    • 在计算得分时,需要比较学生答案和正确答案,这部分的时间复杂度是 O(M * K),其中 K 是每个题目的选项数量。
    • 记录错误选项的出现次数,这部分的时间复杂度是 O(M * K)。
  3. 输出结果:
  • 输出每个学生的得分,这部分的时间复杂度是 O(N)。
  • 输出错误次数最多的选项,这部分的时间复杂度是 O(M * K log(M * K)),因为需要对错误选项进行排序。

综合来看,整个代码的时间复杂度是 O(N * M * K + M * K log(M * K))。

空间复杂度分析

  1. 答案字典:
    • 存储每个题目的详细信息,空间复杂度是 O(M * K)。
  2. 错误选项次数字典:
    • 存储每个错误选项的出现次数,空间复杂度是 O(M * K)。
  3. 学生答案:
  • 存储每个学生的答案,空间复杂度是 O(N * M * K)。

综合来看,整个代码的空间复杂度是 O(N * M * K)。

总结

  • 时间复杂度:O(N * M * K + M * K log(M * K))
  • 空间复杂度:O(N * M * K)

这段代码在逻辑上是清晰的,但在处理大量数据时可能会面临性能问题。特别是当 N、M 和 K 都很大时,时间复杂度和空间复杂度都会显著增加。优化方向可以考虑减少不必要的字符串操作和集合操作,以及优化数据结构的使用。


我要更强

优化时间复杂度和空间复杂度的方法通常涉及减少不必要的计算和数据结构的使用。以下是一些可能的优化方法,并附上相应的代码和注释。

优化方法

  1. 减少字符串操作:减少不必要的字符串替换和分割操作。
  2. 使用高效的集合操作:利用集合的快速操作来减少比较时间。
  3. 避免重复计算:缓存一些计算结果以避免重复计算。
  4. 优化数据结构:选择合适的数据结构来存储和处理数据。

优化后的代码

from collections import defaultdict

# 读取学生人数和题目数量
N_students_num, M_ques_num = map(int, input().split())

# 初始化答案字典
answers = {}
for i in range(M_ques_num):
    full_score, option_num, right_option_num, *right_options = input().split()
    answers[i+1] = [int(right_option_num), set(right_options), int(full_score)]

# 初始化错误选项次数字典
options_wrong_times = defaultdict(int)

# 计算每个学生的得分并记录错误选项次数
for _ in range(N_students_num):
    student_options = input().replace(' ', '').replace(')', '')[1:].split('(')
    student_options = [set(opt[1:]) for opt in student_options]
    this_student_score = 0
    for j in range(M_ques_num):
        student_option_set = student_options[j]
        correct_option_set = answers[j+1][1]
        if student_option_set == correct_option_set:
            this_student_score += answers[j+1][2]
        elif student_option_set.issubset(correct_option_set):
            this_student_score += 0.5 * answers[j+1][2]
        
        wrong_options = student_option_set.symmetric_difference(correct_option_set)
        for option in wrong_options:
            key = f"{j+1}-{option}"
            options_wrong_times[key] += 1

    print(f"{this_student_score:.1f}")

# 输出错误次数最多的选项
if not options_wrong_times:
    print("Too simple")
else:
    max_wrong_times = max(options_wrong_times.values())
    for option, times in sorted(options_wrong_times.items(), key=lambda x: (int(x[0].split('-')[0]), x[0].split('-')[1])):
        if times == max_wrong_times:
            print(max_wrong_times, option)

优化说明

  1. 减少字符串操作:
    • 使用 input().replace(' ', '').replace(')', '')[1:].split('(') 一次性完成字符串替换和分割操作。
  2. 使用高效的集合操作:
    • 使用集合的 symmetric_difference 方法来计算错误选项,这比手动比较更高效。
  3. 避免重复计算:
    • 使用 defaultdict 来简化错误选项次数的更新,避免重复的 get 操作。
  4. 优化数据结构:
  • 使用 defaultdict 来存储错误选项次数,这样可以减少初始化字典时的复杂度。

时间复杂度和空间复杂度分析

  • 时间复杂度:O(N * M * K + M * K log(M * K)),与之前相比没有显著变化,但减少了不必要的操作。
  • 空间复杂度:O(N * M * K),与之前相比没有显著变化,但优化了数据结构的使用。

通过这些优化,代码在处理大量数据时会更加高效。


哲学和编程思想

这些优化方法体现了多种哲学和编程思想,具体包括:

1. 抽象和封装

  • 抽象:将问题的核心逻辑抽象出来,例如将题目的正确答案和学生的答案抽象为集合,便于进行集合操作。
  • 封装:将数据和操作数据的函数封装在一起,例如使用字典来存储题目的详细信息,并使用集合操作来处理答案。

2. 效率和优化

  • 效率:关注代码的执行效率,通过减少不必要的操作和选择合适的数据结构来提高效率。
  • 优化:不断寻找和实施优化措施,例如使用 defaultdict 来简化字典操作,减少重复计算。

3. 简洁和清晰

  • 简洁:追求代码的简洁性,避免冗余和复杂的代码结构,例如使用一行代码完成字符串的替换和分割。
  • 清晰:保持代码逻辑的清晰性,使代码易于理解和维护,例如通过合理的命名和注释来提高代码的可读性。

4. 模块化和可扩展性

  • 模块化:将代码分解为独立的模块,每个模块负责一个特定的功能,例如将输入处理、得分计算和结果输出分为不同的部分。
  • 可扩展性:设计代码时考虑未来的扩展需求,例如使用字典和集合来存储数据,便于未来添加新的功能或修改现有功能。

5. 防御性编程

  • 防御性编程:在代码中加入一些防御性措施,例如使用 defaultdict 来避免键不存在的错误,提高代码的健壮性。

6. 函数式编程思想

  • 不可变数据:尽量使用不可变数据结构,例如集合,避免数据被意外修改。
  • 高阶函数:使用高阶函数来简化代码,例如使用 sorted 函数来对字典进行排序。

7. 面向对象编程思想

  • 对象:将数据和操作数据的方法封装在对象中,例如使用字典来存储题目的信息。
  • 继承和多态:虽然在这个例子中没有直接体现,但面向对象编程中的继承和多态思想可以用于设计更复杂的系统。

8. 敏捷开发思想

  • 迭代和反馈:通过不断迭代和反馈来改进代码,例如在优化过程中不断测试和调整代码。
  • 持续集成:持续集成优化后的代码,确保代码的质量和稳定性。

通过这些哲学和编程思想的运用,代码不仅在性能上得到了优化,而且在可读性、可维护性和可扩展性上也得到了提升。


举一反三

根据上述哲学和编程思想,以下是一些通用的技巧,可以帮助你在解决类似问题时举一反三:

1. 抽象和封装

  • 抽象问题核心:识别问题的核心要素,并将其抽象为数据结构或对象。例如,将题目和答案抽象为字典和集合。
  • 封装逻辑:将相关的数据和操作封装在一起,形成模块或函数,提高代码的可读性和可维护性。

2. 效率和优化

  • 选择合适的数据结构:根据问题的特点选择最合适的数据结构,例如使用字典来快速查找,使用集合来进行高效的集合操作。
  • 避免重复计算:缓存计算结果,避免重复计算,例如使用 defaultdict 来记录错误选项的次数。

3. 简洁和清晰

  • 简化代码:尽量使用简洁的表达方式,减少冗余代码,例如使用一行代码完成多个字符串操作。
  • 清晰命名:使用有意义的变量和函数名,提高代码的可读性。

4. 模块化和可扩展性

  • 分解问题:将复杂问题分解为多个小问题,每个小问题由一个模块或函数处理。
  • 设计可扩展的接口:设计灵活的接口,便于未来添加新功能或修改现有功能。

5. 防御性编程

  • 处理异常情况:考虑并处理可能的异常情况,例如使用 defaultdict 避免键不存在的错误。
  • 验证输入:对输入数据进行验证,确保数据的正确性。

6. 函数式编程思想

  • 使用不可变数据:尽量使用不可变数据结构,避免数据被意外修改。
  • 利用高阶函数:使用高阶函数来简化代码,例如使用 sorted 函数对数据进行排序。

7. 面向对象编程思想

  • 设计对象:将数据和操作封装在对象中,形成清晰的类和对象结构。
  • 利用继承和多态:在设计复杂系统时,利用继承和多态来提高代码的复用性和灵活性。

8. 敏捷开发思想

  • 迭代改进:通过不断迭代和测试来改进代码,确保代码的质量。
  • 持续集成:将优化后的代码持续集成到项目中,确保代码的稳定性和一致性。

通用技巧

  • 阅读优秀代码:阅读和分析优秀的开源代码,学习其中的设计思想和编程技巧。
  • 实践和总结:通过实际编码实践,不断总结经验,形成自己的编程风格和技巧。
  • 参与社区讨论:参与编程社区的讨论,与他人交流经验,获取新的思路和技巧。

通过这些技巧的实践和应用,你将能够更好地理解和解决类似问题,并在编程实践中不断提升自己的技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1880679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明 本文所使用的一些源代码等内容已经上传至github&#xff0c;具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容&#xff1a; CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…

C# YoloV8 模型效果验证工具(OnnxRuntime+ByteTrack推理)

C# YoloV8 模型效果验证工具(OnnxRuntimeByteTrack推理) 目录 效果 项目 代码 下载 效果 模型效果验证工具 项目 代码 using ByteTrack; using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using Sys…

Knife4j 2.2.X 版本 swagger彻底禁用

官方文档配置权限&#xff1a;https://doc.xiaominfo.com/v2/documentation/accessControl.html#_3-5-1-%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E5%B1%8F%E8%94%BD%E8%B5%84%E6%BA%90 通常有时候我们碰到的问题如下&#xff1a; 在开发Knife4j功能时,同很多开发者经常讨论的问…

通用管理页面的功能实现

在Windows Forms&#xff08;WinForms&#xff09;应用程序中&#xff0c;创建一个通用的管理页面通常涉及对数据的增删改查&#xff08;CRUD&#xff09;操作&#xff0c;以及一些额外的功能&#xff0c;如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】

基于Spring Boot的在线医疗咨询平台的设计与实现 Design and implementation of the computer hardware mall based on Spring Boot Candidate&#xff1a; Supervisor&#xff1a; April 20th, 2024 学位论文原创性声明 本人郑重声明&#xff1a;所呈交的论文是本人在导师…

怎么找python的运行路径

1.命令行中执行&#xff1a; import sys print(sys.argv[0]) 执行后为空。 2. import os os.path.abspath(os.curdir) 3. import os os.getcwd()

深度势能生成器(DP-GEN)入门讲解

文章目录 1.原子间相互作用1.为什么研究原子间相互作用2.研究原子间相互作用的传统方法 2.深度学习研究原子间相互作用1.深度势能平滑模型(DeepPot-se)2.Deep Potential 模型训练3.同步学习→充足采样&筛选样本 3.DP-GEN操作及运行1.DP-GEN主流程2.DP-GEN基本命令3.生成初始…

HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注&#xff1a;…

用人工智能大模型预报气象,中国气象局示范计划公开征集火热报名中

近日&#xff0c;中国气象局发布了人工智能气象预报大模型示范计划&#xff08;以下简称“示范计划”&#xff09;&#xff0c;推进气象大模型标准规范和有序发展&#xff0c;引导解决预报业务实际难题&#xff0c;促进人工智能气象预报大模型业务的应用转化、准入&#xff0c;…

k8s笔记——helm chat与k8s Operator区别

k8s Operator Kubernetes 为自动化而生。无需任何修改&#xff0c;你即可以从 Kubernetes 核心中获得许多内置的自动化功能。 你可以使用 Kubernetes 自动化部署和运行工作负载&#xff0c;甚至 可以自动化 Kubernetes 自身。 Kubernetes 的 Operator 模式概念允许你在不修改…

10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

一、介绍 1、10位时间戳 2、13位时间戳 3、17位时间戳 4、时间戳转换工具 二、13位时间戳的转换 1、转标准日期 2、转格式化日期 三、10位时间戳的转换 1、转标准日期 2、转格式化日期 四、17位时间戳的转换 1、解析思路 2、解析过程 3、完整代码 4、新的问题 …

【学习笔记】Redis学习笔记——第5章 跳跃表

第5章 跳跃表 有序集合&#xff0c;ZSet关键组成部分&#xff0c;时间复杂度媲美平衡树&#xff0c;且实现简单。 5.1 跳跃表的实现 可以简单理解为每个节点会有一些指向后面跨越N个节点的指针&#xff0c;比如说Node1不仅有指向Node2的指针&#xff0c;还可以有Node5的&…

【分布式计算框架 MapReduce】高级编程—搜索日志数据分析

目录 一、对于 sogou_500w_utf 数据&#xff0c;使用 MapReduce 编程模型完成对以下数据的分析任务 1. 统计 2011-12-30 日搜索记录&#xff0c;每个时间段的搜索次数 &#xff08;1&#xff09;运行截图 &#xff08;2&#xff09; 源代码 2. 统计 2011-12-30 日 3 点至 …

SCCB协议介绍,以及与IIC协议对比

在之前的文章里已经介绍了IIC协议&#xff1a;iic通信协议 这篇内容主要介绍一下SCCB协议。 文章目录 SCCB协议&#xff1a;SCCB时序图iic时序图SCCB时序 VS IIC时序 总&#xff1a;SCCB协议常用在摄像头配置上面&#xff0c;例如OV5640摄像头&#xff0c;和IIC协议很相似&…

Kubernetes Artemis系列 | 使用 ArtemisCloud Operator 部署 artemis

目录 一、ArtemisCloud Operator 介绍二、部署ArtemisCloud Operator三、使用 ArtemisCloud Operator 部署 artemis四、管理队列五、缩减规模时消息迁移 一、ArtemisCloud Operator 介绍 ArtemisCloud Operator 是一个用于管理和部署云端基础设施的工具。它基于 Kubernetes 平…

ArtTS系统能力-通知的学习(3.1)

上篇回顾&#xff1a; ArtTS语言基础类库-容器类库内容的学习(2.10.2&#xff09; 本篇内容&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 一、 知识储备 1. 基础类型通知 按内容分成四类&#xff1a; 类型描述NOTIFICATION_CONTENT_BASIC_TEXT普通文…

大物3错题整理

平衡位置&#xff1a;在O点上的位置 相位&#xff1a; 当N很大的时候&#xff0c;wxwywz。因此&#xff0c;平均平动动能除以3&#xff0c;就是能量均分定理。 W F在x上的积分 Π时无单位 180&#xff0c;就是单位 1rad&#xff0c;rad就是单位 左手定则、右手定则、安培定…

金融科技如何多角度助力小微企业融资

一、引言 在全球化与数字化交织的时代背景下&#xff0c;金融科技&#xff08;FinTech&#xff09;作为新兴力量&#xff0c;正逐步改变传统的金融业态&#xff0c;尤其在助力小微企业融资方面&#xff0c;金融科技展现出了多元化的价值和优势。本文将从不同角度探讨金融科技如…

数据同步软件有哪些

数据同步软件有哪些呢&#xff1f;随着企业规模的扩大&#xff0c;企业数据也积累得越来越多&#xff0c;万一发生宕机风险&#xff0c;那么这个损失将不可估量。所以为了容灾备用&#xff0c;我们往往需要将数据同步到另一台备胎服务器上&#xff0c;进行冗余。 那么需要同步的…