算法刷题| 豆包MarsCode AI 刷题

40 阅读5分钟

版本号比较

问题描述

在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1version2,判断哪个版本更新,或者它们是否相同。

例如,2.5.330.1 都是有效的版本号。

当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0

你需要根据以下规则返回比较结果:

  • 如果 version1 > version2,返回 1
  • 如果 version1 < version2,返回 -1
  • 如果两个版本相等,返回 0

测试样例

样例1:

输入:version1 = "0.1" , version2 = "1.1" 输出:-1

样例2:

输入:version1 = "1.0.1" , version2 = "1" 输出:1

样例3:

输入:version1 = "7.5.2.4" , version2 = "7.5.3" 输出:-1

样例4:

输入:version1 = "1.0" , version2 = "1.0.0" 输出:0

题解

这道题目是字符串比较,末尾补零不会影响大小,当长度相同后,通过逐位一次比较,即可得出大小。

from itertools import zip_longest
​
def solution(version1, version2):
    # 将版本号按点号分割成修订号列表
    v1 = version1.split('.')
    v2 = version2.split('.')
    
    # 使用 zip_longest 来处理不同长度的修订号列表
    for rev1, rev2 in zip_longest(v1, v2, fillvalue='0'):
        # 将修订号转换为整数并进行比较
        if int(rev1) < int(rev2):
            return -1
        elif int(rev1) > int(rev2):
            return 1
    
    # 如果所有修订号都相等,返回 0
    return 0if __name__ == "__main__":
    # 添加你的测试用例
    print(solution("0.1", "1.1") == -1)
    print(solution("1.0.1", "1") == 1)
    print(solution("7.5.2.4", "7.5.3") == -1)
    print(solution("1.0", "1.0.0") == 0)

游戏队友搜索

问题描述

在一款多人游戏中,每局比赛需要多个玩家参与。如果发现两名玩家至少一起玩过两局比赛,则可以认为这两名玩家互为队友。现在你有一份玩家(通过玩家ID标识)和比赛局次(通过比赛ID标识)的历史记录表,目标是帮助某位指定玩家找到所有符合条件的队友。

例如,已知以下比赛历史记录:

| 玩家ID | 游戏ID

测试样例

样例1:

输入:id = 1, num = 10, array = [[1,1], [1,2], [1,3], [2,1], [2,4], [3,2], [4,1], [4,2], [5,2], [5,3]] 输出:[4, 5]

样例2:

输入:id = 2, num = 6, array = [[2,1], [2,3], [1,1], [1,2], [3,1], [4,3]] 输出:[]

样例3:

输入:id = 3, num = 8, array = [[3,1], [3,2], [3,3], [4,1], [5,2], [6,3], [7,1], [7,2]] 输出:[7]

题解

数据结构选择: 使用一个HashMap<Integer, Integer>来存储每个潜在队友与指定玩家共玩过的游戏次数。键是队友的玩家ID,值是他们共玩游戏的次数。

遍历游戏记录: 遍历整个二维数组array。 对于每一个记录,检查它是否属于指定玩家。如果是,则继续处理同一局游戏中的其他参与者。

更新队友计数: 如果当前记录是关于指定玩家的,那么在同一个游戏ID下的其他所有玩家都是潜在队友。 更新这些玩家在HashMap中的计数。如果该玩家之前没有出现过,则初始化为1;否则,在原有基础上加1。

筛选符合条件的队友: 在遍历结束后,我们有了每个玩家与指定玩家共玩游戏的次数。 筛选出那些共玩游戏次数大于等于2的玩家,并将它们添加到结果列表中。

返回结果: 将结果列表转换成数组形式并排序后返回。

def solution(id, num, array):
    # 使用字典来存储每个玩家与指定玩家共同参与的游戏次数
    teammate_games = {}
    
    # 遍历游戏记录数组
    for record in array:
        p_id = record[0]
        g_id = record[1]
        
        # 如果当前记录是关于指定玩家的
        if p_id == id:
            # 检查同一场比赛中的其他玩家
            for other_record in array:
                other_p_id = other_record[0]
                other_g_id = other_record[1]
                
                # 确保不是同一个玩家,并且是在同一场比赛
                if other_p_id != id and other_g_id == g_id:
                    # 更新队友游戏次数
                    if other_p_id in teammate_games:
                        teammate_games[other_p_id] += 1
                    else:
                        teammate_games[other_p_id] = 1
    
    # 创建结果列表
    result = []
    for player_id, count in teammate_games.items():
        if count >= 2:
            result.append(player_id)
    
    # 将结果列表排序
    result.sort()
    
    return result
​
if __name__ == "__main__":
    # Add your test cases here
    print(
        solution(
            1,
            10,
            [
                [1, 1],
                [1, 2],
                [1, 3],
                [2, 1],
                [2, 4],
                [3, 2],
                [4, 1],
                [4, 2],
                [5, 2],
                [5, 3],
            ],
        )
        == [4, 5]
    )
  1. 使用字典存储共同参与的游戏次数:我们使用Python的字典 teammate_games 来存储每个玩家与指定玩家共同参与的游戏次数。
  2. 遍历游戏记录:我们遍历 array,检查每个记录是否是关于指定玩家的。
  3. 检查同一场比赛中的其他玩家:对于指定玩家参与的每场比赛,我们再次遍历 array,检查是否有其他玩家也参与了同一场比赛。
  4. 更新队友游戏次数:如果找到其他玩家参与了同一场比赛,我们更新字典中的计数。
  5. 筛选结果:我们遍历字典,筛选出与指定玩家共同参与至少两场比赛的玩家,并将结果排序后返回。