Embedded System Interview: MaxCounters

Hot

Hiển thị các bài đăng có nhãn MaxCounters. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn MaxCounters. Hiển thị tất cả bài đăng

Chủ Nhật, 19 tháng 1, 2020

MaxCounters

tháng 1 19, 2020 0
You are given N counters, initially set to 0, and you have two possible operations on them:

        increase(X) − counter X is increased by 1,
        max counter − all counters are set to the maximum value of any counter.

A non-empty array A of M integers is given. This array represents consecutive operations:

        if A[K] = X, such that 1 ≤ X ≤ N, then operation K is increase(X),
        if A[K] = N + 1 then operation K is max counter.

For example, given integer N = 5 and array A such that:
    A[0] = 3
    A[1] = 4
    A[2] = 4
    A[3] = 6
    A[4] = 1
    A[5] = 4
    A[6] = 4

the values of the counters after each consecutive operation will be:
    (0, 0, 1, 0, 0)
    (0, 0, 1, 1, 0)
    (0, 0, 1, 2, 0)
    (2, 2, 2, 2, 2)
    (3, 2, 2, 2, 2)
    (3, 2, 2, 3, 2)
    (3, 2, 2, 4, 2)

The goal is to calculate the value of every counter after all operations.

Write a function:

    vector<int> solution(int N, vector<int> &A);

that, given an integer N and a non-empty array A consisting of M integers, returns a sequence of integers representing the values of the counters.

Result array should be returned as a vector of integers.

For example, given:
    A[0] = 3
    A[1] = 4
    A[2] = 4
    A[3] = 6
    A[4] = 1
    A[5] = 4
    A[6] = 4

the function should return [3, 2, 2, 4, 2], as explained above.

Write an efficient algorithm for the following assumptions:

        N and M are integers within the range [1..100,000];
        each element of array A is an integer within the range [1..N + 1].


vector<int> solution(int N, vector<int> &A) {
    // write your code in C++11 (g++ 4.8.2)
    vector<int> res(N, 0);
    
    int base = 0;
    int maximum = 0;
    for (int i = 0; i < int(A.size()); i++) {
        if (A[i] != N + 1) {
            res[A[i] - 1] = max(base, res[A[i] - 1]) + 1;
            maximum = max(maximum, res[A[i] - 1]);
        } else {
            base = maximum;
        }
    }
    
    for (int i = 0; i < N; i++) {
        if (res[i] < base) {
            res[i] = base;
        }
    }
    return res;
}
Read More
Thường mất vài phút để quảng cáo xuất hiện trên trang nhưng thỉnh thoảng, việc này có thể mất đến 1 giờ. Hãy xem hướng dẫn triển khai mã của chúng tôi để biết thêm chi tiết. Ðã xong