C练题笔记之:Leetcode-1002. 查找常用字符

题目:

给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。

你可以按任意顺序返回答案。

示例 1:

输入:["bella","label","roller"]
输出:["e","l","l"]
示例 2:

输入:["cool","lock","cook"]
输出:["c","o"]

提示:

1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-common-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

解题思路:

1,首先既然是每个单词中都存在的字母,那么循环次数肯定小于第一个。并且只需要确定第一个单词的字母哪些是别的单子都有的就可以了。

2,对第一个单词循环的时候为了判断相同字母的个数,最好对第一个单词进行排序,这样可以明确相同字母的个数,在后面单词的循环中,只需要把该字母在每个单词中都存在的数量输出就可以了。

代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int compar (const void *a, const void *b)
 {
     return *(char *)a - *(char *)b;
 }
char ** commonChars(char ** A, int ASize, int* returnSize){
    int len = strlen(A[0]);
    int i ,j, n, count, temp, tempLen;
    char tempA[101] = {}; //用于存放第一个单词
    char retTemp[101] = {};//用于存放共有字母数量,等确定数量后再去堆中申请空间,减少空间的浪费。
    *returnSize = 0;
    strcpy(tempA, A[0]);

    qsort(tempA, len, sizeof(char), compar);
    for(i = 0; i < len; ) {
        //找出第一个单词中与tempA[i]相同的字符有多少个
        count = 1;
        for(j = i + 1; j < len; j++) {
            if(tempA[j] == tempA[i]) {
                count++;
            } else {
                break;
            }
        }
        //循环查找后面单词中该字母出现的次数
        for(j = 1; j < ASize; j++) {
            temp = 0;
            tempLen = strlen(A[j]);
            for(n = 0; n < tempLen; n++) {
                if(A[j][n] == tempA[i]) {
                    temp++;
                }
                if(temp == count) {
                    break;
                }
            }
            /如果当前单词中该字母数量不满足count,那么这个字母最多可能存在的数量就变成temp
            count = temp < count ? temp : count;
            if(count == 0) {
                break;
            }
        }
        for(n = 0; n < count; n++) {
            retTemp[*returnSize] = tempA[i];
            *returnSize += 1;
        }
        for(i += 1;i < len && tempA[i] == tempA[i-1]; i++);
    }
    char **retarr = (char **)malloc(sizeof(char *) * (*returnSize));
    for(i = 0; i < *returnSize; i++) {
        retarr[i] = (char *)malloc(sizeof(char) * 2);
        retarr[i][0] = retTemp[i];
        retarr[i][1] = '\0'; 
    }

    return retarr;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值