🖍情境模擬: 找到需要補充粉筆的學生_Leetcode #1894

更新於 2024/09/02閱讀時間約 1 分鐘

題目敘述


一個班級裡有 n 個學生,編號為 0 到 n - 1 。

每個學生會依序回答問題,編號為0 的學生先回答,然後是編號為1 的學生,以此類推,直到編號為n - 1 的學生,然後老師會重複這個過程,重新從編號為0 的學生開始回答問題。

給定一個長度為 n,而且索引從 0 開始的整數陣列 chalk 和參數 k 。一開始粉筆盒裡總共有 k 支粉筆。
當編號為 i 的學生回答問題時,他會消耗 chalk[i] 支粉筆。如果剩餘粉筆數量 嚴格小於 chalk[i] ,那麼學生 i 需要 補充 粉筆。


請找出需要補充粉筆的學生的學生編號


測試範例

Example 1:

Input: chalk = [5,1,5], k = 22
Output: 0
Explanation:
- 編號 0 的學生使用 5 支粉筆,然後 k = 17
- 編號 1 的學生使用 1 支粉筆,然後 k = 16
- 編號 2 的學生使用 5 支粉筆,然後 k = 11
- 編號 0 的學生使用 5 支粉筆,然後 k = 6
- 編號 1 的學生使用 1 支粉筆,然後 k = 5
- 編號 2 的學生使用 5 支粉筆,然後 k = 0
編號 0 的學生沒有足夠的粉筆,所以他需要補充粉筆。

Example 2:

Input: chalk = [3,4,1,2], k = 25
Output: 1
Explanation:
- 編號 0 的學生使用 3 支粉筆,然後 k = 22
- 編號 1 的學生使用 4 支粉筆,然後 k = 18
- 編號 2 的學生使用 1 支粉筆,然後 k = 17
- 編號 3 的學生使用 2 支粉筆,然後 k = 15
- 編號 0 的學生使用 3 支粉筆,然後 k = 12
- 編號 1 的學生使用 4 支粉筆,然後 k = 8
- 編號 2 的學生使用 1 支粉筆,然後 k = 7
- 編號 3 的學生使用 2 支粉筆,然後 k = 5
- 編號 0 的學生使用 3 支粉筆,然後 k = 2
編號 1 的學生沒有足夠的粉筆,所以他需要補充粉筆。



約束條件

Constraints:

  • chalk.length == n

輸入陣列的長度為n

  • 1 <= n <= 10^5

n介於1~十萬之間。

  • 1 <= chalk[i] <= 10^5

每個學生消耗的粉筆數量介於1~十萬之間。

  • 1 <= k <= 109

粉筆總數k介於1~十億之間。


觀察


學生消耗粉筆的過程是重複的,每一位同學消耗的粉筆數量都是固定的

因此可以先將粉筆總數k 直接對 每回合粉筆消耗總數做除法取餘數,提升模擬的效率。


演算法 模擬消耗粉筆的過程


每經過一名學生,就扣掉對應消耗掉的粉筆數量。

最後,當粉筆不足時,
該名同學的index(代表需要補充粉筆的同學的學號)就是最終答案。


程式碼 模擬消耗粉筆的過程

class Solution:
def chalkReplacer(self, chalk: List[int], k: int) -> int:

k %= sum(chalk)

for i in range(len(chalk)):

if chalk[i]>k:
return i

# Comsume chalk[i] by student_i
k -= chalk[i]

return -1

複雜度分析

時間複雜度: O(n)

掃描每位同學消耗的粉筆數量,最多掃描一輪可以知道答案。

空間複雜度: O(1)

所用到的變數都是固定尺寸的臨時變數,所需空間為O(1)。


Reference

[1] Find the Student that Will Replace the Chalk - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Convert 1D Array Into 2D Array 給定一個一維輸入陣列,請轉換成高度為m*寬度為n的二維陣列, 以二維陣列的形式輸出。 如果無法轉換,請輸出空陣列。
題目敘述 624. Maximum Distance in Arrays 給定一個輸入二維陣列arrays。 請計算的陣列距離是多少? 陣列距離的定義 = max | a - b | 其中 a, b 來自不同的一維陣列
題目敘述 860. Lemonade Change 假想一個經營檸檬水小舖的情境。 一杯檸檬水都賣$5 顧客付錢時只有三種可能,$5, $10 或 $ 20 初始時,檸檬水小舖沒有零錢。 給定一個顧客買檸檬水的付錢陣列bills,請問能不能滿足每一筆交易,並且找開零錢。 如果可以
題目敘述 149. Max Points on a Line 給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上? 落在同一條直線也就是數學上所謂的"共線" colinear
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
Convert 1D Array Into 2D Array 給定一個一維輸入陣列,請轉換成高度為m*寬度為n的二維陣列, 以二維陣列的形式輸出。 如果無法轉換,請輸出空陣列。
題目敘述 624. Maximum Distance in Arrays 給定一個輸入二維陣列arrays。 請計算的陣列距離是多少? 陣列距離的定義 = max | a - b | 其中 a, b 來自不同的一維陣列
題目敘述 860. Lemonade Change 假想一個經營檸檬水小舖的情境。 一杯檸檬水都賣$5 顧客付錢時只有三種可能,$5, $10 或 $ 20 初始時,檸檬水小舖沒有零錢。 給定一個顧客買檸檬水的付錢陣列bills,請問能不能滿足每一筆交易,並且找開零錢。 如果可以
題目敘述 149. Max Points on a Line 給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上? 落在同一條直線也就是數學上所謂的"共線" colinear
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
這天,孩子們午休起床後,開啟了下午的流程和活動, 在孩子們喝完水後,老師依序讓孩子來拿取點心的餅乾。 這時,老師給了孩子一個指令,請每位孩子數五個餅乾放到自己的杯子裡面再到位置上享用。 過程中,孩子們練習從1數到5, 有些孩子可以很快的數好五個放到杯子裡面,有些孩子會不小心數超
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
這天,孩子們午休起床後,開啟了下午的流程和活動, 在孩子們喝完水後,老師依序讓孩子來拿取點心的餅乾。 這時,老師給了孩子一個指令,請每位孩子數五個餅乾放到自己的杯子裡面再到位置上享用。 過程中,孩子們練習從1數到5, 有些孩子可以很快的數好五個放到杯子裡面,有些孩子會不小心數超