链接:https://leetcode.cn/problems/subdomain-visit-count/solution/-by-xun-ge-v-i3sb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目![](https://i-blog.csdnimg.cn/blog_migrate/2d9ea45c37bb6faddaa7ad2825e3a6b9.png)
示例![](https://i-blog.csdnimg.cn/blog_migrate/45edeb093587cad19844cf13c55667df.png)
思路
对于本题,题目其实已经说的非常清楚了,直接按题目意思模拟即可,但是在模拟过程中存在一个难点
- 那就是怎么保存每个子域名对应的 计数配对域名 ,其中还有对重复的进行去重
说到这里应该不难发现,对于保存子域名还要进行去重肯定是哈希表的强项,对于C语言也有很好的库函数实现->C语言库实现哈希表
具体实现
按照题意,我们对每一个字符串进行分解出对应的子域名,并入哈希表,加入存在两种情况:
- 如果之前存在相同的子域名
- 那么就将相同子域名出现的次数相加
- 如果之前不存在相同的子域名
- 那么就创建对应的键并加入哈希表
处理完字符串之后,遍历枚举哈希表中所有存在的键并进行保存即可
代码注释超级详细
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct my_struct {
//这里使用指针为键是很方便的,不需要再额外申请空间
const char *name; /* key */
int conut;
UT_hash_handle hh; /* makes this structure hashable */
};
char ** subdomainVisits(char ** cpdomains, int cpdomainsSize, int* returnSize){
char ** str = (char **)malloc(sizeof(char *) * 300);
*returnSize = 0;
struct my_struct *s, *users = NULL;
int conut;//初始化
for(int i = 0; i < cpdomainsSize; i++)//遍历字符串
{
sscanf(cpdomains[i], "%d", &conut);//提取前面数字
char * tmp = cpdomains[i];//利用指针方便后序操作
while(*tmp != ' ') tmp++;//去除前面数字
while(*tmp != '\0')//枚举所有子域名
{
tmp++;//这里很细节,需要仔细看,是用来去除 ' ' 和 '.'
HASH_FIND_STR(users, tmp, s);//先判断是否存在相同子域名
if(s)
{
s->conut += conut;//存在,加出现次数
}
else//不存在,入哈希表
{
s = (struct my_struct *)malloc(sizeof(*s));
s->name = tmp;
s->conut = conut;
HASH_ADD_KEYPTR(hh, users, s->name, strlen(s->name), s);
}
while(*tmp != '\0' && *tmp != '.') tmp++;//去除'.'前面的字符,下一个子域名
}
}
for (s = users; s != NULL; s = s->hh.next) {//枚举哈希表中所有键并保存
//printf("user id %d: name %s", s->conut, s->name);
int len = strlen(s->name);
str[(*returnSize)] = (char *)malloc(sizeof(char) * (len+10));
sprintf(str[*returnSize], "%d %s", s->conut, s->name);
//printf(": str %s\n",str[*returnSize]);
(*returnSize)++;
}
//销毁哈希表
/* free the hash table contents */
struct my_struct * tmp;
HASH_ITER(hh, users, s, tmp) {
HASH_DEL(users, s);
free(s);
}
return str;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/subdomain-visit-count/solution/-by-xun-ge-v-i3sb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。