考試平臺: 時習知
分值: 200分(第二題)
考試時間: 兩小時(共3題)
題目描述
業務模塊往外發送報文時,有時會出現網卡隊列滿而丟包問題,但從常規的秒級流量統計結果看,業務的流量并不大。
實際上可能是業務出現了毫秒級的流量突出,導致短時間內超過出了網卡的處理能力;而這種突發持續時間并不長,因此,秒級統計結果呈現不出異常。
現給出一段時間內各個時間點業務發送的報文數,請統計出此段時間內流量的毫秒級峰值,即1毫內業務發送的最大報文數 (時間戳相差小于1毫秒范圍的發送報文數,不含時間戳相差正好為1毫秒的時刻)
輸入
第1行:n,標示這段時間內有多少條記錄 (即后續還有n行數據),n的取值范圍為[1,1000000]
第2行開始,每行的數據格式為:t m,標示為某個時間點t(隨著行數的增加,t會隨之變大),業務發送的報文數m,
其中,t的單位為微秒,取值范圍為[1,268435455],1毫秒等于1000微秒;
m的取值范圍為[1,1000]
輸出
m,表示這段時間內流量的毫秒級峰值,即1毫秒內業務發送的最大報文數(時間戳相差小于1毫秒范圍的發送報文數,不含時間戳相差正好為1毫秒的時刻)
示例1
輸入:
3
1024 100
1050 100
2100 150輸出:
200解釋:
前兩條記錄在一個毫秒內,報文數為200,第2條和第3條記錄不屬于同個毫秒內
示例2
輸入:
3
1024 100
1050 100
2100 250輸出:
250解釋:
第3條記錄和前面的記錄不在一個時間點內,而它的值最大
Python 題解
統計一段時間內毫秒級流量峰值的程序。以下是代碼的一些解釋:
from collections import deque
引入雙端隊列(deque)來維護時刻和報文數的記錄。n = int(input())
獲取輸入,表示有多少條記錄。- 初始化
max_ans
為最大結果值,sum
為隊列中的總報文數,q
為雙端隊列。- 使用循環遍歷每一條記錄,獲取時刻
t
和報文數m
。- 將時刻和報文數添加到隊列中,并更新總報文數
sum
。- 使用
while
循環,判斷最早的報文是否和當前時刻相差大于等于1毫秒,如果是,則從隊列中移除,并更新總報文數sum
。- 在每次循環內都嘗試更新最大值
max_ans
,保留當前時刻1毫秒內的報文總數的最大值。- 循環結束后,輸出最終的結果
max_ans
。這個程序通過使用雙端隊列來維護1毫秒內的報文數,實時更新最大值。通過循環遍歷所有記錄,可以得到最終的結果。
Python 題解
from collections import dequen = int(input())# 最大的結果值, 隊列中的總報文數
max_ans, sum = 0, 0
q = deque()for _ in range(n):# 時刻t, 報文數mt, m = map(int, input().split())q.append((t, m))sum += m# 最早的報文和當前時間不在 1 毫秒內,因此拋棄while q and t - q[0][0] >= 1000:sum -= q.popleft()[1]# 嘗試更新最大值max_ans = max(max_ans, sum)print(max_ans)
🙏整理題解不易, 如果有幫助到您,請給點個贊 ???? 和收藏 ?,讓更多的人看到。🙏🙏🙏