leetcode 1002. 查找常用字符 C语言+IDE测试用例(哈希)

一、设计思路自己很快能想到 缺少编码能力

1、使用哈希表的方式解答 key 为字符串中的字母 value为字母出现的次数
2、使用两个辅助数组完成字符串的各个字符都出现的最小值
A数组先保存第一个字符串的各个字母出现的次数
B数组 遍历全部的字符串 并且每遍历一个字符串的各个字母出现的次数之后就要对A更新一次
3、将统计出来的每个字符串各字母共同出现最小值 value的大小 等于key 在准备返回数组中出现的次数加粗样式

在别人答案基础上修改也是一种成长,添加测试用例(IDE中测试)也是一种成长,对二维指针以及返回值进一步了解

二、实际代码:


#include<stdio.h>
#include<stdlib.h>
char ** commonChars(char ** A, int ASize, int* returnSize);
void compare(int *A, int *B, int *count);
void main(){
	//保存字符串数组的二维函数
	char *p[] = { "bella", "label", "roller","hello" };
	int num;
	//需要一个二维数组保存 --  为什么不能使用双指针
	char **a = {commonChars(p, 4, &num)};
	printf("%d\n", num);

	for (int i = 0; i < num; i++){
		//每一个字符串都只有一个字符为什么会错
			printf("%c", (*a)[0]);
			a++;

	}
	system("pause");
}
//比较两个数较小的保留下来
void compare(int *A, int *B, int *count)
{
	//和的作用是什么
	int sum = 0;
	for (int i = 0; i<26; i++)
	{
		if (A[i]>B[i])
			A[i] = B[i];
		sum += A[i];
	}
	*count = sum;
	return;
}
//对第一个字符串每个字符进行个数统计
char ** commonChars(char ** A, int ASize, int* returnSize){
	int  S[26] = { 0 };
	char *p = A[0];
	while (*p != '\0')
	{
		//不可以直接存入吗  先计算是方便输出吗
		int k = *p - 'a';
		S[k]++;
		//指针的级别和自己使用的是一致的
		p++;
	}
	int num; //num为出现字符个数总和------需要返回输出的数组的大小吗 
	//分别对每个字符串进行字符个数统计,结果保存在R中
	for (int i = 0; i<4; i++)
	{
		int R[26] = { 0 };
		p = A[i];
		while (*p != '\0')
		{
			int k = *p - 'a';
			R[k]++;
			p++;
		}
		//对二维数组中的每一个元素进行统计 比较得到相对小的值  -- 也没见num 的统计值
		//
		compare(S, R, &num);//每得到一个R与S进行去交必须是每个字符在每个字符串出现的最小次数 
	}
	//统计的num个字符,生成num个字符串,每个字符串只有一个字符(字符串结尾不要忽略'\0')二维数组。

	char **B = (char**)malloc(num*sizeof(char*));//指针类型分配空间 保存需要返回的值
	char **q = B;
	//需要打印的数组: int类型转化为字符类型
	for (int i = 0; i<26; i++)
	{
		while (S[i]>0)
		{
			//需要给指针分配空间
			*q = (char*)malloc(2 * sizeof(char));
			(*q)[0] = 'a' + i;
			(*q)[1] = '\0';//
			q++;
			S[i]--;
		//	printf(*q[0]);
		}
	}

	*returnSize = num;
	return B;
}

}

发布了212 篇原创文章 · 获赞 32 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_42664961/article/details/104291920