leetcode_811. 子域名访问计数

题目链接:https://leetcode.cn/problems/subdomain-visit-count/description/

涉及知识点:库函数atoi,库函数strstr,库函数strchr,库函数sprintf,UT_hash

解法一:自己构造结构体

objectivec 复制代码
#define LEN 100

typedef struct {
    char str[LEN];
    int cnt;
} MARK_S;

char ** subdomainVisits(char ** cpdomains, int cpdomainsSize, int* returnSize){
    int i ,j;
    MARK_S mark[300] = {0};
    char temp[LEN];
    int mark_size = 0;
    for (i = 0; i < cpdomainsSize; i++) {
        char *p = strstr(cpdomains[i], " ");
        int space_index = p - cpdomains[i];
        char rep[LEN] = {0};
        memcpy(rep, cpdomains[i], sizeof(char) * space_index);
        int count = atoi(rep);
        strcpy(temp, cpdomains[i] + space_index + 1);
        for (j = 0; j < mark_size; j++) {
            if (strcmp(mark[j].str, temp) == 0) {
                mark[j].cnt += count;
                break;
            }
        }
        if (j == mark_size) {
            strcpy(mark[mark_size].str, temp);
            mark[mark_size++].cnt = count;
        }
        p = strstr(cpdomains[i], ".");
        while (p) {
            strcpy(temp, p + 1);
            for (j = 0; j < mark_size; j++) {
                if (strcmp(mark[j].str, temp) == 0) {
                    mark[j].cnt += count;
                    break;
                }
            }
            if (j == mark_size) {
                strcpy(mark[mark_size].str, temp);
                mark[mark_size++].cnt = count;
            }
            p = strstr(p + 1, ".");  
        }
    }

    *returnSize = mark_size;
    char **ans = (char **)malloc(sizeof(char*) * mark_size);
    for (i = 0; i < mark_size; i++) {
        ans[i] = (char*)malloc(sizeof(char) * 110);
        sprintf(ans[i], "%d %s", mark[i].cnt, mark[i].str);
    }
    return ans;
}

解法二:哈希表

objectivec 复制代码
typedef struct {
    char *key;
    int cnt;
    UT_hash_handle hh;
} HASH_S;

HASH_S *usrs = NULL;

char ** subdomainVisits(char ** cpdomains, int cpdomainsSize, int* returnSize) {
    HASH_S *cur, *next;
    for (int i = 0; i < cpdomainsSize; i++) {
        int count = atoi(cpdomains[i]);
        int space_index = strchr(cpdomains[i], ' ') - cpdomains[i];
        HASH_FIND_STR(usrs, cpdomains[i] + space_index + 1, cur);
        if (!cur) {
            cur = (HASH_S*)malloc(sizeof(HASH_S));
            cur->key = cpdomains[i] + space_index + 1;
            cur->cnt = count;
            HASH_ADD_STR(usrs, key, cur);
        } else {
            cur->cnt += count;
        }

        int len = strlen(cpdomains[i]);
        for (int j = space_index + 1; j < len; j++) {
            if (cpdomains[i][j] != '.') {
                continue;
            }
            HASH_FIND_STR(usrs, cpdomains[i] + j + 1, cur);
            if (!cur) {
                cur = (HASH_S*)malloc(sizeof(HASH_S));
                cur->key = cpdomains[i] + j + 1;
                cur->cnt = count;
                HASH_ADD_STR(usrs, key, cur);
            } else {
                cur->cnt += count;
            }  
        }
    }

    char **ans = (char**)malloc(sizeof(char*) * HASH_COUNT(usrs));
    *returnSize = 0;
    HASH_ITER(hh, usrs, cur, next) {
        ans[*returnSize] = (char*)malloc(sizeof(char) * 110);
        sprintf(ans[(*returnSize)++], "%d %s", cur->cnt, cur->key);
        HASH_DEL(usrs, cur);
        free(cur);
    }
    return ans;
}
相关推荐
浅念-2 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
做cv的小昊3 小时前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
贾斯汀玛尔斯4 小时前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index
小e说说4 小时前
打破偏科困境:这些学习软件助孩子重燃学习热情
算法
月昤昽4 小时前
autoCAD二次开发 4.正多边形与collection区分
算法·c#·二次开发·autocad二次开发
休息一下接着来5 小时前
C++ 固定容量环形队列实现
c++·算法
im_AMBER5 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿5 小时前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发
风萧萧19996 小时前
问答样例如何在RAG问答中使用?
算法