「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:查找共用字符
难度:简单
题目要求:
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。
分析题目:
举个例子
输入: words = ["bella","label","roller"]
输出: ["e","l","l"]
:解题
理清思路:
分析:
首先,要判断当前字符是否在单词列表中所有单词中包含;
其次,就要判断每一个单词中包含的当前字符是否等量;最大的等量就是含当前字符最少的单词,所以每次用1判断后,再遍历删除每个单词的一个当前字符;
编辑代码:
方法一
var commonChars = function(A) {
let arrayList = [];
for (let str of A) {
let arr = new Array(26).fill(0);
for (let i = 0; i < str.length; i++) {
arr[str[i].charCodeAt() - 'a'.charCodeAt()]++;
}
arrayList.push(arr);
}
let res = [];
for(let i = 0; i < 26; i++){
let min = 100;
for (let j = 0; j < arrayList.length; j++) {
if (arrayList[j][i] < min) {
min = arrayList[j][i];
}
}
for(let k = 0; k < min; k++){
res.push(String.fromCharCode(i + 'a'.charCodeAt()));
}
}
return res;
};
- 用数组存每个字符串各字符出现的次数,把数组放在list中,最后比较list中数组代表各字符出现次数的最小值
方法二
var commonChars = function(A){
let arr = new Array(26).fill(100);
for (let str of A) {
let tmpArr = new Array(26).fill(0);
str.split("").forEach((v) => {
tmpArr[v.charCodeAt() - 'a'.charCodeAt()]++;
})
for(let i = 0; i < 26; i++){
arr[i] = Math.min(arr[i], tmpArr[i]);
}
}
let res = [];
for (let i = 0; i < 26; i++) {
for (let k = 0; k < arr[i]; k++) {
res.push(String.fromCharCode(i + 'a'.charCodeAt()));
}
}
return res;
}
- 跟方法一的区别就是遍历每个字符串的时候,直接比较代表出现字符数的数组各项的大小
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。