每日一题 -- leetCode1002

169 阅读2分钟

image.png 「这是我参与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;
}
  • 跟方法一的区别就是遍历每个字符串的时候,直接比较代表出现字符数的数组各项的大小

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。