Dizayn Hit Counter LeetCode Həll

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon alma Atlassian Bloomberg Cisco Dropbox google microsoft Netflix Kahin Pinterest Snapchat cuqquldamaq Über
RedditBaxılıb 25

Problem bəyanat

Design Hit Counter LeetCode Həlli – Keçmişdə alınan hitlərin sayını hesablayan hit sayğacını dizayn edin 5 dəqiqə (yəni keçmiş 300 saniyə).

Sisteminiz a qəbul etməlidir timestamp parametr (saniyədə dənəvərlik) və siz güman edə bilərsiniz ki, sistemə xronoloji ardıcıllıqla zənglər edilir (yəni, timestamp is monoton olaraq artır). Təxminən eyni vaxtda bir neçə hit gələ bilər.

Həyata keçirir HitCounter sinif:

  • HitCounter() Vuruş sayğac sisteminin obyektini işə salır.
  • void hit(int timestamp) Baş verən bir hiti qeyd edir timestamp (saniyədə). Eyni anda bir neçə hit baş verə bilər timestamp.
  • int getHits(int timestamp) Son 5 dəqiqədə olan hitlərin sayını qaytarır timestamp (yəni keçmiş 300 saniyə).

    Dizayn Hit Counter LeetCode HəllPin

misal

Test işi 1:

Input:

[“HitCounter”, “vuruş”, “vur”, “vur”, “getHits”, “vur”, “getHits”, “getHits”]

[[], [1], [2], [3], [4], [300], [300], [301]]

Çıxış:

[null, null, null, null, 3, null, 4, 3]

Izahat

HitCounter hitCounter = yeni HitCounter();

hitCounter.hit(1); // vaxt möhürünə vurun 1.

hitCounter.hit(2); // vaxt möhürünə vurun 2.

hitCounter.hit(3); // vaxt möhürünə vurun 3.

hitCounter.getHits(4); //zaman damgası 4-də vurulur, 3-ü qaytarır.

hitCounter.hit(300); // vaxt möhürünə vurun 300.

hitCounter.getHits(300); //zaman damgası 300-də vurulur, 4-ü qaytarır.

hitCounter.getHits(301); //zaman damgası 301-də vurulur, 3-ü qaytarır.

Izahat

O(lar) s verilmiş vaxt intervalında cəmi saniyələrdir, bu halda 300-dür.
əsas fikir vedrələrdən istifadə etməkdir. Hər saniyə üçün 1 vedrə, çünki son hitlər haqqında məlumatı yalnız 300 saniyə saxlamalıyıq. hit[] massivi mod əməliyyatı ilə ətrafa bükülür. Hər vuruş qutusu cari vaxtı qeyd edən dəfə[] kovası ilə əlaqələndirilir. Əgər cari vaxt deyilsə, bu o deməkdir ki, 300 və ya 600 s... əvvəldir və 1-ə sıfırlanmalıdır.

Dizayn Hit Counter kodu

Java Proqramı

class HitCounter {

    private int[] times;
    private int[] hits;
    /** Initialize your data structure here. */
    public HitCounter() {
        times = new int[300];
        hits = new int[300];
    }
    
    /** Record a hit.
        @param timestamp - The current timestamp (in seconds granularity). */
    public void hit(int timestamp) {
        int index = timestamp % 300;
        if (times[index] != timestamp) {
            times[index] = timestamp;
            hits[index] = 1;
        } else {
            hits[index]++;
        }
    }
    
    /** Return the number of hits in the past 5 minutes.
        @param timestamp - The current timestamp (in seconds granularity). */
    public int getHits(int timestamp) {
        int total = 0;
        for (int i = 0; i < 300; i++) {
            if (timestamp - times[i] < 300) {
                total += hits[i];
            }
        }
        return total;
    }
}

/**
 * Your HitCounter object will be instantiated and called as such:
 * HitCounter obj = new HitCounter();
 * obj.hit(timestamp);
 * int param_2 = obj.getHits(timestamp);
 */

C ++ Proqramı

class HitCounter {
    struct Hit {
        int timestamp;
        int count;
    };
    vector<Hit> hits;
public:
    /** Initialize your data structure here. */
    HitCounter() {
    }
    
    /** Record a hit.
        @param timestamp - The current timestamp (in seconds granularity). */
    void hit(int timestamp) {
        if (hits.empty())
            hits.push_back(Hit{timestamp, 0});
        else
            hits.push_back(Hit{timestamp, hits.back().count + 1});
    }
    
    /** Return the number of hits in the past 5 minutes.
        @param timestamp - The current timestamp (in seconds granularity). */
    int getHits(int timestamp) {
        int l = timestamp - 60*5;
        
        auto lb = upper_bound(hits.begin(), hits.end(), Hit{l, {}}, [](const auto &a, const auto &b) {
            return a.timestamp < b.timestamp; 
        });
                
        if (lb == hits.end()) 
            return 0;
        
        auto ub = upper_bound(lb, hits.end(), Hit{timestamp, {}}, [](const auto &a, const auto &b) {
            return a.timestamp < b.timestamp;
        });
        
        ub -= 1;
        return ub->count - lb->count + 1;
    }
};

Dizayn Hit Counter LeetCode Həlli üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi olacaq 

Kosmik Mürəkkəblik olacaq

Referans: https://en.wikipedia.org/wiki/hit_counter

 

 

Şərh yaz

Translate »