一、设计思路自己很快能想到 缺少编码能力
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;
}
}