难题简单解法 | 豆包MarsCode AI刷题

54 阅读3分钟

这里想讲一些难度为困难的题目,但是写起来不难的题目

要给自己信心

让我们先来看第一题:

二进制之和

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

求解:

    x1=int(binary1,2)
    x2=int(binary2,2)
    return str(x1+x2)

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")

直接使用python自带函数int(x,2)即可完成由二进制转10进制
无需常规的按位求累计和

接下来我们来看第二题

小F的糖果工厂挑战

小F的糖果工厂能够生产nn种不同种类的糖果,糖果的编号从1到nn。每天,工厂可以生产编号为i的ci个糖果。今天,小F接到了一个特殊的订单,订单要求生产a包糖果,每包糖果都必须是同一种类的,并且每包糖果的数量不能少于b个。你能帮小F计算一下,工厂至少需要多少天才能完成这个订单吗?

求解:

    cnt=0
    for i in range(n):
        cnt+=candies[i]*day//b
    if cnt>=a:
        return 1
    return 0
def solution(n: int, a: int, b: int, candies: list) -> int:
    l=1
    r=10000
    while l<r:
        mid=(l+r)//2
        if check(mid,n,a,b,candies):
            r=mid
        else:
            l=mid+1
    return l


if __name__ == '__main__':
    print(solution(3, 10, 20, [7, 9, 6]) == 10)
    print(solution(4, 5, 15, [3, 10, 8, 4]) == 4)
    print(solution(2, 100, 5, [1, 10]) == 46)

这里我们采用了很基础的二分算法,对天数进行二分列举,就可以得到答案了
注意:

  • 有单调性一定可以二分,可以二分不一定有单调性
  • 二分的本质是边界不是单调性(单调一定可以二分,不单调的有的也可以二分)

    接下来我们来看第三题

序列的第k小数问题

给定一个长度为 n 的整数序列 a,你需要找到所有满足以下条件的整数对 (l, r)

  1. 区间 [l, r] 的长度不小于 k,即 r - l + 1 ≥ k
  2. 区间 [a_l, a_{l+1}, ..., a_r] 中的第 k 小的数等于 x

你的任务是计算所有满足条件的 (l, r) 对的数量。

    count = 0
    
    for l in range(n):
        # Initialize a list to collect the current window's elements
        window = []
        
        for r in range(l, n):
            window.append(a[r])  # Add the current element to the window
            
            if r - l + 1 >= k:  # Ensure the window size is at least k
                # Sort the window to find the k-th smallest element
                sorted_window = sorted(window)
                if sorted_window[k - 1] == x:  # Check the k-th smallest
                    count += 1  # Valid (l, r) pair found

    return count

if __name__ == '__main__':
    print(solution(n = 5, x = 3, k = 2, a = [1, 2, 3, 4, 5]) == 3)
    print(solution(n = 6, x = 2, k = 4, a = [4, 1, 5, 2, 4, 6]) == 0)
    print(solution(n = 7, x = 3, k = 5, a = [3, 5, 2, 7, 5, 6, 5]) == 0)

这一题要夸赞下Marscode AI,完美做出答案。
不过,这份代码在每个窗口中都进行了排序操作,导致时间复杂度较高。可以通过使用一个数据结构来维护窗口中的元素,从而避免每次都进行排序,提高算法效率。