二进制之和;英雄决斗的最大胜利次数 题解

54 阅读3分钟

英雄决斗的最大胜利次数(中)

问题描述 小U和小F正在进行一场由 nn 轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序 1,2,3,…,n1,2,3,…,n 安排了他的英雄出场顺序。 小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小 F 确定一个最佳的出场顺序,以获得最多的胜利。 输入说明 number: 一个整数,表示比赛的总轮数 nn。 heroes: 一个长度为 n 的正整数数组,表示小 F 的每个英雄的能力值。 输出 返回一个整数,表示小 F 可以获得的最大胜利轮数。

测试样例 样例1: 输入:number = 7, heroes = [10, 1, 1, 1, 5, 5, 3] 输出:4 样例2: 输入:number = 5, heroes = [1, 1, 1, 1, 1] 输出:0 样例3: 输入:number = 6, heroes = [9, 4, 7, 3, 2, 6] 输出:6

思路:本题已知小U派出的英雄的能力值是递增的,所以我们可以尽可能的选自身英雄能力值与小U英雄能力值之差最小的那个英雄对战。做法就是先给小F的英雄按能力值从大小到大排序(但是我为了节省pop()函数的时间,就用了从大到小的排序,实际是一个意思);然后就是while循环,循环number次或者小F的英雄全部派完即可停止,然后比较能力值大小。

代码:

def solution(number, heroes):
    heroes.sort(reverse=True)
    ans = 0
    i = 1
    while i <= number and heroes:
        a = heroes.pop()
        if a > i:
            ans += 1
            i+=1
    # Please write your code here
    return ans

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution(7, [10,1,1,1,5,5,3]) == 4 )
    print(solution(5, [1,1,1,1,1]) == 0 )
    print(solution(10, [1,2,3,4,5,6,7,8,9,10]) == 9 )

二进制之和(难)

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

测试样例 样例1: 输入:binary1 = "101" ,binary2 = "110" 输出:'11' 样例2: 输入:binary1 = "111111" ,binary2 = "10100" 输出:'83' 样例3: 输入:binary1 = "111010101001001011" ,binary2 = "100010101001" 输出:'242420' 样例4: 输入:binary1 = "111010101001011" ,binary2 = "10010101001" 输出:'31220' 样例5: 输入:binary1 = "11" ,binary2 = "1" 输出:'4'

思路:本题用py有个很便捷的方法,就是直接用函数将二进制转十进制,用十进制求和然后再转二进制输出即可。

代码:

def solution(binary1, binary2):
    a = int(binary1, 2)
    b = int(binary2, 2)
    ans = a+b
    # Please write your code here
    return str(ans)

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("101", "110") == "11")
    print(solution("111111", "10100") == "83")
    print(solution("111010101001001011", "100010101001") == "242420")
    print(solution("111010101001011", "10010101001") == "31220")