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,
String.valueOf((char) (i + 'a'))可以获得小写英文字母,
"back".charAt(0)-'a'为一个值,word.charAt(i)为b,值为1;
同理,"back".charAt(1)为a,那么"back".charAt(0)-'a'值就为0哦.