给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
用数组实现哈希表
我们可以定义一个大小为26的数组arr(题目说只包含小写字母),先遍历字符串s,将字符串s里的每个字符出现的次数用数组arr记录一下,然后我们再遍历一遍字符串t,将字符串t中出现的字符出现的次数从数组arr中减去,最后判断数组arr是否全为0,如果全为0,则字符串s和字符串t是有效的字母异位词,否则不是。
O(n)
class Solution {
public:
bool isAnagram(string s, string t) {
int arr[26]={0};
for(int i = 0;i
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
哈希表用到的数据结构是unordered_set
我们可以定义两个unordered_set
用另一个数组里的所有元素分别来与myset进行查找,如果在myset里有这个元素,我们把它放到结果集result里。
O(mn)
class Solution {
public:
vector intersection(vector& nums1, vector& nums2) {
unordered_set set;
unordered_set ret(nums2.begin(),nums2.end());
for(int num:nums1)
{
if(ret.find(num)!=ret.end())
{
set.insert(num);
// result.push_back(num);
}
}
return vector(set.begin(),set.end());
}
};
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
哈希表用到的数据结构是unordered_set
首先,处理n的各个位上的数字的平方的和,我们可以编写一个函数int recount()实现求n的各个位的平方的和。
其次我们可以写一个while循环,将n带入recount()函数,用一个整型变量sum接收,判断sum是否等于1,如果是,则return true; 否则将sum插入到myset中去,令n = sum,再次进行上述操作。再操作过程中可能会出现sum的值再myset里出现过,这说明这个数字n再函数recount()中出现了数字的循环,说明这个数字n不是快乐数,return false即可。
O(logn)
class Solution {
public:
int recount(int n)
{
int sum = 0;
while(n)
{
sum += (n%10) * (n%10);
n = n/10;
}
return sum;
}
bool isHappy(int n) {
unordered_set set;
while(1)
{
int sum = recount(n);
if(set.find(sum)!=set.end())
{
return false;
}
else if(sum==1)
{
return true;
}
else
{
set.insert(sum);
}
n = sum;
}
}
};
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
哈希表用unordered_map
本题涉及到根据数组本身的值返回数组的下标,所以我们考虑用map。
我们可以用一个for循环遍历数组中的元素,用 auto iter = map.find(target-nums[i]);,判断map中是否有iter这个值,如果有则返回{iter.second,i},否则将{nums[i],i}插入到map中。
O(n)
class Solution {
public:
vector twoSum(vector& nums, int target) {
unordered_map map;
for(int i = 0;isecond,i};
}
else
{
map.insert(pair(nums[i],i));
}
}
return {};
}
};
还有很多瑕疵,还需继续坚持!