这里想讲一些难度为困难的题目,但是写起来不难的题目
要给自己信心
让我们先来看第一题:
二进制之和
小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):
- 区间
[l, r]的长度不小于k,即r - l + 1 ≥ k。 - 区间
[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,完美做出答案。
不过,这份代码在每个窗口中都进行了排序操作,导致时间复杂度较高。可以通过使用一个数据结构来维护窗口中的元素,从而避免每次都进行排序,提高算法效率。