İstifadəçi Veb saytına daxil olun Pattern LeetCode Həllini təhlil edin

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon Audible Qapılar microsoft Spotify cuqquldamaq ArzuBaxılıb 13

Problem bəyanat

İstifadəçi vebsaytını təhlil edin Pattern LeetCode Həllini ziyarət edin - Sizə iki sətir massivi verilir username və website və tam ədəd massivi timestamp. Verilmiş bütün massivlər eyni uzunluqda və dəstdədir [username[i], website[i], timestamp[i]] istifadəçi olduğunu göstərir username[i] veb saytını ziyarət etdi website[i] vaxtında timestamp[i].

naxış üç veb-saytın siyahısıdır (mütləq fərqli deyil).

  • Misal üçün, ["home", "away", "love"]["leetcode", "love", "leetcode"]və ["luffy", "luffy", "luffy"] hamısı naxışlardır.

The hesab bir naxış naxışda göründükləri eyni ardıcıllıqla nümunədəki bütün vebsaytları ziyarət edən istifadəçilərin sayıdır.

  • Məsələn, naxış varsa ["home", "away", "love"], xal istifadəçilərin sayıdır x belə x ziyarət "home" sonra ziyarət etdi "away" və ziyarət etdi "love" ondan sonra.
  • Eynilə, əgər naxış varsa ["leetcode", "love", "leetcode"], xal istifadəçilərin sayıdır x belə x ziyarət "leetcode" sonra ziyarət etdi "love" və ziyarət etdi "leetcode" bir daha ondan sonra.
  • Həmçinin, əgər naxış varsa ["luffy", "luffy", "luffy"], xal istifadəçilərin sayıdır x belə x ziyarət "luffy" müxtəlif vaxt damğalarında üç fərqli vaxt.

Qayıtmaq bu naxış ən böyüyü ilə hesab. Eyni ən böyük xalı olan birdən çox nümunə varsa, leksikoqrafik cəhətdən ən kiçik belə nümunəni qaytarın.

İstifadəçi Veb saytına daxil olun Pattern LeetCode Həllini təhlil edinPin

misal

Test işi 1:

Input:

istifadəçi adı = [“joe”,”joe”,”joe”,”james”,”james”,”james”,”james”,”mary”,”mary”,”mary”],

vaxt damgası = [1,2,3,4,5,6,7,8,9,10],

vebsayt = [“ev”,”haqqında”,”karyera”,”ev”,”səbət”,”xəritələr”,”ev”,”ev”,”haqqında”,”karyera”]

Çıxış:

[“ev”,”haqqında”,”karyera”]

Izahat

Bu misaldakı dəstlər bunlardır: [“joe”,”ev”,1],[“joe”,”haqqında”,2],[“joe”,”karyera”,3],[“ceyms”,”ev ”,4],[“james”,”araba”,5],[“ceyms”,”xəritələr”,6],[“james”,”ev”,7],[“mary”,”ev”, 8],[“mary”,”haqqında”,9], və [“mary”,”karyera”,10].

Nümunə ("ev", "haqqında", "karyera") 2 xal (joe və mary) var.

Nümunə ("ev", "səbət", "xəritələr") 1 xal (james) var.

Nümunə ("ev", "səbət", "ev") 1 xal (james) var.

Nümunə ("ev", "xəritələr", "ev") 1 xal (james) var.

Nümunə (“səbət”, “xəritələr”, “ev”) 1 xal (james) var.

Nümunə (“ev”, “ev”, “ev”) 0 balı var (istifadəçi 3 dəfə evə baş çəkməyib).

Yanaşma:

Bu problemdə çoxlu tələlər var. Həllin məqsədi müxtəlif ardıcıllıqla 3 vebsayta daxil olan istifadəçi kimi istifadəçi davranışını təhlil etməkdir. Beləliklə, eyni istifadəçi üçün eyni 3 veb sayt ardıcıllığı yalnız bir dəfə sayılır. (bu məqam çox vacibdir).

Yuxarıda göstərilənlərə əsasən, mənim həllim buradadır

  1. bütün məlumatları bir yerə toplamaq üçün yeni sinif VisitRecord istifadə etmək, onları vaxt möhürləri ilə çeşidləmək
  2. hər bir istifadəçinin davranışını, istifadəsini təhlil edin DFS müxtəlif 3 veb-sayt ardıcıllığı əldə etmək üçün həll
  3. bütün istifadəçinin ziyarət ardıcıllığını xəritəyə daxil etmək və maksimum ziyarət vaxtlarını hesablamaq.
  4. maksimum ziyarət vaxtlarına cavab verən bütün qeydləri götürün və leksikoqrafik olaraq sıralayın.
  5. ilk rekordu qaytarın.

or

  1. Açar olaraq istifadəçi adı və dəyər kimi dəstlərin siyahısını (veb-sayt, vaxt damğası) olan lüğət yaradın.
  2. Hər bir istifadəçi adı üçün zaman damğasına əsaslanaraq dəstləri çeşidləyin.
  3. Zaman ştamplarını tuplelərdən çıxarın, sadəcə veb saytları siyahı kimi əlavə edin.
  4. Hər bir istifadəçi adı üçün geri izləmə ilə 3 veb-saytın bütün birləşmələrini əldə edin və onu açar kimi vebsaytlar dəstəsi və dəyər kimi istifadəçilərin siyahısı ilə lüğətdə saxlayın.
  5. Veb saytların hər bir dəstəsi üçün maksimum istifadəçi ölçüsü əldə edin
  6. Eyni saydırsa, veb-saytlar dəstinin aşağı leksik dəyərini əldə edin.

İstifadəçi Veb saytına Ziyarət Nümunəsini Analiz etmək üçün Kod

Python proqramı

from collections import defaultdict

class Solution:
    def mostVisitedPattern(self, username: List[str], timestamp: List[int], website: List[str]) -> List[str]:
        dic = defaultdict(list)
        for i in range(len(username)):
            dic[username[i]].append((website[i], timestamp[i]))
        for k, v in dic.items():
            v.sort(key=lambda x: x[1])
            new_v = []
            for web, time in v:
                new_v.append(web)
            dic[k] = new_v
        combs = defaultdict(list)
        for k, v in dic.items():
            self.get_all_combinations(v, combs, [], 0, k)
        max_size = -1
        for k, v in combs.items():
            max_size = max(max_size, len(v))
        max_list = []
        for k, v in combs.items():
            if len(v) == max_size and (not max_list or list(k) < max_list):
                max_list = list(k)
        return max_list
        
    def get_all_combinations(self, website, combs, comb, start, user):
        if user in combs[tuple(comb)]:
            return
        if len(comb) == 3:
            combs[tuple(comb)].append(user)
            return
        for i in range(start, len(website)):
            comb.append(website[i])
            self.get_all_combinations(website, combs, comb, i+1, user)
            comb.pop()

C ++ Proqramı

class Solution {
public:
    vector<string> mostVisitedPattern(vector<string>& name, vector<int>& timestamp, vector<string>& website) {
        unordered_map<string, vector<string>> map;
        unordered_map<string, int> freq;
        
        vector<tuple<int, string, string>> order;
        for(int i=0; i<timestamp.size(); i++){
            order.push_back(make_tuple(timestamp[i], name[i], website[i]));
        }
        
        sort(order.begin(), order.end());
        
        for(int i=0; i<name.size(); i++){
            map[get<1>(order[i])].push_back(get<2>(order[i]));
        }

        for(auto iter=map.begin(); iter!=map.end(); ++iter){
            int size=iter->second.size();
            if(size<3){
                continue;
            }
            
            unordered_set<string> set;
            for(int i=0; i<size-2; i++){
                string s=iter->second[i];
                s+=" ";
                for(int j=i+1; j<size-1; j++){
                    string s1=s+iter->second[j];
                    s1+=" ";
                    for(int z=j+1; z<size; z++){
                        set.insert(s1+iter->second[z]+" ");
                    }
                }
            }
            for(string temp:set){
                freq[temp]++;
            }
        }
        
        vector<string> s;
        int max=0;
        for(auto iter=freq.begin(); iter!=freq.end(); ++iter){
            if(iter->second>max){
                s.clear();
                max=iter->second;
                s.push_back(iter->first);
            }else if(iter->second==max){
                s.push_back(iter->first);
            }
        }
        
        sort(s.begin(), s.end());

        vector<string> ans;
        int start=0;
        for(int i=0; i<s[0].size(); i++){
            if(s[0][i]==' '){
                ans.push_back(s[0].substr(start, i-start));
                start=i+1;
            }
        }
        
        return ans;
    }
};

İstifadəçi Vebsaytını Təhlil etmək üçün Mürəkkəblik Analizi Pattern LeetCode Həllini ziyarət edin

Zamanın mürəkkəbliyi: O (N ^ 2)

Kosmik Mürəkkəblik: O (N)

Translate »