There are n
students in a class numbered from 0
to n - 1
. The teacher will give each student a problem starting with the student number 0
, then the student number 1
, and so on until the teacher reaches the student number n - 1
. After that, the teacher will restart the process, starting with the student number 0
again.
You are given a 0-indexed integer array chalk
and an integer k
. There are initially k
pieces of chalk. When the student number i
is given a problem to solve, they will use chalk[i]
pieces of chalk to solve that problem. However, if the current number of chalk pieces is strictly less than chalk[i]
, then the student number i
will be asked to replace the chalk.
Return the index of the student that will replace the chalk.
Example 1:
Input: chalk = [5,1,5], k = 22 Output: 0 Explanation: The students go in turns as follows: - Student number 0 uses 5 chalk, so k = 17. - Student number 1 uses 1 chalk, so k = 16. - Student number 2 uses 5 chalk, so k = 11. - Student number 0 uses 5 chalk, so k = 6. - Student number 1 uses 1 chalk, so k = 5. - Student number 2 uses 5 chalk, so k = 0. Student number 0 does not have enough chalk, so they will have to replace it.
Example 2:
Input: chalk = [3,4,1,2], k = 25 Output: 1 Explanation: The students go in turns as follows: - Student number 0 uses 3 chalk so k = 22. - Student number 1 uses 4 chalk so k = 18. - Student number 2 uses 1 chalk so k = 17. - Student number 3 uses 2 chalk so k = 15. - Student number 0 uses 3 chalk so k = 12. - Student number 1 uses 4 chalk so k = 8. - Student number 2 uses 1 chalk so k = 7. - Student number 3 uses 2 chalk so k = 5. - Student number 0 uses 3 chalk so k = 2. Student number 1 does not have enough chalk, so they will have to replace it.
Constraints:
chalk.length == n
1 <= n <= 105
1 <= chalk[i] <= 105
1 <= k <= 109
PreSum and Binary search.
class Solution:
def chalkReplacer(self, chalk: List[int], k: int) -> int:
s = list(accumulate(chalk))
k %= s[-1]
return bisect_right(s, k)
class Solution {
public int chalkReplacer(int[] chalk, int k) {
int n = chalk.length;
long[] preSum = new long[n + 1];
for (int i = 0; i < n; ++i) {
preSum[i + 1] = preSum[i] + chalk[i];
}
k %= preSum[n];
int left = 0, right = n - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (preSum[mid + 1] > k) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
int n = chalk.size();
vector<long long> s(n, chalk[0]);
for (int i = 1; i < n; ++i) s[i] = s[i - 1] + chalk[i];
k %= s[n - 1];
return upper_bound(s.begin(), s.end(), k) - s.begin();
}
};
func chalkReplacer(chalk []int, k int) int {
n := len(chalk)
s := make([]int, n+1)
for i := 0; i < n; i++ {
s[i+1] = s[i] + chalk[i]
}
k %= s[n]
return sort.Search(n, func(i int) bool { return s[i+1] > k })
}
impl Solution {
pub fn chalk_replacer(chalk: Vec<i32>, k: i32) -> i32 {
let pre_sum: Vec<i64> = chalk
.into_iter()
.map(|x| x as i64)
.scan(0, |state, x| {
*state += x;
Some(*state)
})
.collect();
pre_sum
.binary_search(&(k as i64 % pre_sum.last().unwrap()))
.map_or_else(|e| e, |v| v + 1) as i32
}
}