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;
}
相关推荐
luj_17684 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海7 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz8 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni8 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu8 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7989 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭9 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶9 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶9 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z9 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法