文章目录
前言
刷题坚持每一天,以下题目引用自:力扣(LeetCode)
💎一、题目一
🏆1.题目描述
原题链接:442. 数组中重复的数据
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
🏆2.解题思路
🔑思路:
hash记录每个值的出现次数,当有值出现两次时记录这个值。
🏆3.代码详解
int* findDuplicates(int* nums, int numsSize, int* returnSize){
int hash[100001] = {0};
int* ans = (int*)malloc(sizeof(int)*numsSize);
int idx = 0;
for(int i = 0; i < numsSize; ++i){
++hash[nums[i]];
if(hash[nums[i]] == 2){
ans[idx++] = nums[i];
}
}
* returnSize = idx;
return ans;
}
💎二、题目二
🏆1.题目描述
原题链接:2068. 检查两个字符串是否几乎相等
如果两个字符串 word1 和 word2 中从 ‘a’ 到 ‘z’ 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。
给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。
一个字母 x 的出现 频率 指的是它在字符串中出现的次数。
示例 1:
输入:word1 = “aaaa”, word2 = “bccb”
输出:false
解释:字符串 “aaaa” 中有 4 个 ‘a’ ,但是 “bccb” 中有 0 个 ‘a’ 。
两者之差为 4 ,大于上限 3 。
🏆2.解题思路
🔑思路:
两个hash分别记录两个字符串里的字符出现的次数。然后,判断这两个字符串里的值出现次数的绝对差是否超出三个。
🏆3.代码详解
bool checkAlmostEquivalent(char * word1, char * word2){
int hashw1[26] = {0};
int hashw2[26] = {0};
for(int i = 0; word1[i] != '\0'; ++i){
++hashw1[word1[i]-'a'];
++hashw2[word2[i]-'a'];
}
for(int i = 0; i < 26; ++i){
if(abs(hashw1[i] - hashw2[i]) > 3) return false;
}
return true;
}
💎三、题目三
🏆1.题目描述
原题链接:2283. 判断一个数的数字计数是否等于数位的值
给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。
如果对于 每个 0 <= i < n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true ,否则返回 false 。
示例 1:
输入:num = “1210”
输出:true
解释:
num[0] = ‘1’ 。数字 0 在 num 中出现了一次。
num[1] = ‘2’ 。数字 1 在 num 中出现了两次。
num[2] = ‘1’ 。数字 2 在 num 中出现了一次。
num[3] = ‘0’ 。数字 3 在 num 中出现了零次。
“1210” 满足题目要求条件,所以返回 true 。
🏆2.解题思路
🔑思路:
hash记录每个字符出现的次数,每个下标对应的hash值就是下标值应该出现的次数。然后和字符值比较,不相等代表出现次数少或者多,返回false。如果循环完毕返回true。
🏆3.代码详解
bool digitCount(char * num){
int hash[11] = {0};
for(int i = 0; num[i] != '\0'; ++i){
++hash[num[i]-'0'];
}
for(int i = 0; num[i] != '\0'; ++i){
if(hash[i] != num[i] - '0')
return false;
}
return true;
}
💎四、题目四
🏆1.题目描述
原题链接:884. 两句话中的不常见单词
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。
示例 1:
输入:s1 = “this apple is sweet”, s2 = “this apple is sour”
输出:[“sweet”,“sour”]
🏆2.解题思路
🔑思路:
用C++
unordered_map
,这个没有排序功能。键做索引值,值就是hash计数值。先把两个字符串合成一个字符串,遍历这个字符串统计单词出现的次数。然后遍历hash,找出出现一次的单词。
🏆3.代码详解
class Solution {
public:
vector<string> uncommonFromSentences(string s1, string s2) {
unordered_map <string, int> hash;
vector <string> ans;
s1 += " ";
s1 += s2;
s1 += " ";
char tem[201];
int idx = 0;
for(int i = 0; i < s1.size(); ++i){
if(s1[i] == ' '){
tem[idx] = '\0';
hash[tem]++;
idx = 0;
} else tem[idx++] = s1[i];
}
for(auto i = hash.begin(); i != hash.end(); ++i){
if(i->second == 1){
ans.push_back(i->first);
}
}
return ans;
}
};
💎五、星球推荐
星球链接:英雄算法联盟
星球里有什么?
【朋友圈】一个极致精准的自律、编程、算法的小圈子。
【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
目前星球人数达到520+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。