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] 是小写字母

思路:

根据题目的要求,如果字符 cc 在所有字符串中均出现了 kk 次及以上,那么最终答案中需要包含 kk 个 cc。因此,我们可以使用 minfreq[c]存储字符 cc 在所有字符串中出现次数的最小值。

我们可以依次遍历每一个字符串。当我们遍历到字符串 ss 时,我们使用 freq[c]统计 ss 中每一个字符 cc 出现的次数。在统计完成之后,我们再将每一个 minfreq[c] 更新为其本身与 freq[c] 的较小值。这样一来,当我们遍历完所有字符串后,minfreq[c] 就存储了字符 cc 在所有字符串中出现次数的最小值。

由于题目保证了所有的字符均为小写字母,因此我们可以用长度为 26,26 的数组分别表示 minfreq[c] 以及freq[c]。

在构造最终的答案时,我们遍历所有的小写字母 c,并将 minfreq[c] 个 c 添加进答案数组即可。
代码如下:

class Solution {
    public ArrayList<String> commonChars(String[] A) {
        int[] minfreq = new int[26];
        Arrays.fill(minfreq, Integer.MAX_VALUE);
        for (String word: A) {
            int[] freq = new int[26];
            int length = word.length();
            for (int i = 0; i < length; ++i) {
                char ch = word.charAt(i);
                ++freq[ch - 'a'];
            }
            for (int i = 0; i < 26; ++i) {
                minfreq[i] = Math.min(minfreq[i], freq[i]);
            }
        }

        ArrayList<String> ans = new ArrayList<String>();
        for (int i = 0; i < 26; ++i) {
            for (int j = 0; j < minfreq[i]; ++j) {
                ans.add(String.valueOf((char) (i + 'a')));
            }
        }
        return ans;
    }
}


知识点小结:

1,

在使用Math.min()方法时,源代码为:
public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
意思是:
if(a<=b){
return a;
}
else{
return b;
}

2,

在使用Arrays.fill()方法时,
Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647
Integer.MIN_VALUE表示int数据类型的最小取值数:-2 147 483 648
对应:
Short.MAX_VALUE 为short类型的最大取值数 32 767
Short.MIN_VALUE 为short类型的最小取值数 -32 768

补充:
Integer.MAX_VALUE+1=Integer.MIN_VALUE

因为:
Integer.MAX_VALUE的二进制是0111 1111 1111 1111 1111 1111 1111 1111
Integer.MIN_VALUE的二进制是 1000 0000 0000 0000 0000 0000 0000 0000

0111 1111 1111 1111 1111 1111 1111 1111+1=1000 0000 0000 0000 0000 0000 0000 0000
注意:第一位是符号位

Arrays.fill(a,b)方法的意思为用b填充a数组的所有空间。

3,

i++++i:
示例:
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++;  
System.out.println(k);  // 结果:8

//解释
i++ 即后加加,原理是:先自增,然后返回自增之前的值
++i 即前加加,原理是:先自增,然后返回自增之后的值
一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
***********************************************************
1、先算i++,i++之后i的值为2,并返回++之前的值1,所以整个表达式可以变为:

   1 + ++i + ++j + j++; // 此时的i值为2

2、再计算++i,++i之后i的值为3,并返回3,所以整个表达式可以变为:

   1 + 3 + ++j + j++; // 此时i的值为3

3、再计算++j,++j之后j的值为2,并返回2,所以整个表达式可以变为:

   1 + 3 + 2 + j++; // 此时j的值为2

4、再计算j++,j++之后 j的值为3,并返回2,所以整个表达式可以变为:

   1 + 3 + 2 +2; // 结果为8,此时j的值为3
还不太懂的小盆友可以看https://blog.csdn.net/android_cai_niao/article/details/106027313
这位大佬的解释喔😊

4,

"back".charAt(0)为b,String.valueOf((char) (i + 'a'))可以获得String类型的小写英文字母
"back".charAt(1)为a,那么"back".charAt(1)-'a'值就为0
"back".charAt(0)-'a'1,即'b'-'a'输出为1(char)('b'+1)输出为char类型 c;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值