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;
}
相关推荐
tobias.b9 小时前
408真题解析-2010-7-数据结构-无向连通图
数据结构·算法·图论·计算机考研·408真题解析
良木生香10 小时前
【鼠鼠优选算法-双指针】003:快乐数 & 004:盛水最多的容器
算法
Cx330❀10 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
沃尔特。10 小时前
直流无刷电机FOC控制算法
c语言·stm32·嵌入式硬件·算法
CW32生态社区10 小时前
CW32L012的PID温度控制——算法基础
单片机·嵌入式硬件·算法·pid·cw32
Cx330❀10 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
漫随流水10 小时前
leetcode回溯算法(93.复原IP地址)
数据结构·算法·leetcode·回溯算法
燃于AC之乐11 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑11 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl
艾莉丝努力练剑11 小时前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法