Leetcode刷题40-1002. 查找常用字符(C++详细解法!!!)

题目来源:链接: [https://leetcode-cn.com/problems/find-common-characters/].

1.问题描述

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

你可以按任意顺序返回答案。
示例1:

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

示例2:

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

注意:

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

2.我的解决方案

easy 类型题目
利用 空间 换取 时间。
1.首先 计算每个字符串中 每个字母 出现的频率。
2.分别 计算 26个字母在 每个 字符串 中出现的频率,取最小的那个。
3. 存入容器中,以此打印
暴力法代码如下:

class Solution {
public:
    vector<string> commonChars(vector<string>& A) {
        int vec[A.size()][26] = {0};
        for(int i = 0; i < A.size(); ++i)
        {
            for(int j = 0; j < A[i].size(); ++j)
            {
                ++vec[i][A[i][j] - 'a']; //计算每个字母出现的频率,并存入对应的下标
            }
        }
        
        vector<string> res;
        for(int j = 0; j < 26; ++j)
        {
            int maxCount = INT_MAX;
            for(int i = 0; i < A.size(); ++i)
            {
           		 //分别 计算 26个字母在 每个 字符串 中出现的频率,取最小的那个。
                maxCount = min(maxCount, vec[i][j]);
            }
            char t = j + 'a';
            char buffer[2] = {t};
            while(maxCount--)
            {
                res.push_back(buffer);
                //res.emplace_back(string(buffer));
            }
        }
        return res;
    }
};

3.大神们的解决方案

利用 hash_map 容器。
代码如下:

class Solution {
public:
    vector<string> commonChars(vector<string>& A) {
        vector<unordered_map<int,int>>v;
        vector<string>s;
        for(int i=0;i<A.size();i++)
        {
            unordered_map<int,int>m;
            for(auto a:A[i])
                ++m[a];
            v.push_back(m);
        }
        for(int i=0;i<A[0].size();i++)
        {
            int c=0;
            for(int j=0;j<v.size();j++)
            {
                if(v[j][A[0][i]]>0)
                {
                	c++;
                	v[j][A[0][i]]--;
				}
            }
            c=c/v.size();
            if(c)
            {
                string str;
                str.push_back(A[0][i]);
                s.push_back(str);
            }
        }
        return s;
    }
};

4.我的收获

INT_MIN 在标准头文件 limits.h 中定义。

#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)

在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。

C中int类型是32位的,范围是-2147483648到2147483647 。

(1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN; 
(2)最严重的上溢是INT_MAX + INT_MAX :结果是-2; 
(3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX; 
(4)最严重的下溢是INT_MIN + INT_MIN:结果是0 。

2019/3/31 胡云层 于南京 40

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值