16、有效的字母异位体
题目简介:
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的 字母异位词。
初见思路:
这道题用的是哈希表来写,如果要判断两个词是不是字母异位词,应该就是判断一个词中的字母是不是全部都出现在另一个词中,一定不可以从顺序上思考,因为我又不知道两个词是不是字母异位词的规律。一定是这样的,我先存一个单词的所有字母到一个表里,然后再检查另一个单词。
算法思路:
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()){
return false;
}
bool flag =true;
unordered_map<char,int> wordList1;
unordered_map<char,int> wordList2;
for(auto &a : s){
wordList1[a]++;
}
for(auto &b : t){
wordList2[b]++;
}
for(auto &c : s){
if(wordList1[c] != wordList2[c]){
flag = flag && false;
}
else{
flag = flag && true;
}
}
return flag;
}
};
果然还是有问题,不能只是看有没有,还要看数量才行,所以还是得用map
来写才行。
17、两个数组的交集
题目简介:
给定两个数组 nums1
和 nums2
,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
初见思路:
我看了一下,这道题就是交集而已,而不在乎有多少个,数量是不重要的,那指定就是用set来判断有没有了。
算法思路:
18、快乐数
题目简介:
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
初见思路:
啊我不会呀,我不知道怎么算出各位的平方和。而且我也没想到要用set
来检查重复,最没有思路的一集。
算法思路:
class Solution {
public:
int sum(int n){
int sum =0;
while(n){
sum += (n % 10) *(n % 10);
n = n/10;
}
return sum;
}
bool isHappy(int n) {
int temp=n;
unordered_set<int> setList;
while(1){
temp = sum(temp);
if(temp == 1){
return true;
}
if(setList.find(temp) != setList.end()){
return false;
}
else{
setList.insert(temp);
}
}
return true;
}
};
19、两数之和
题目简介:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
初见思路:
我的想法是,先把数组存起来,然后按照key是本值,然后value是索引的情况。这样子,我每次循环的时候我将target减去元素得到差,我找一下差在不在我的map里,这样我就能够返回他的索引,我就能够输出了。我是天才。
算法思路:
果然还是有问题,我直接把数都存在了map里,但是这样是不行的,因为可能会造成重复,无法去重。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> numList;
vector<int> result;
for(int i =0 ;i<nums.size();i++){
if(numList.find(target-nums[i]) != numList.end()){
result.push_back(numList[target-nums[i]]);
result.push_back(i);
}else{
numList[nums[i]] = i;
}
}
return result;
}
};