1. 题目链接: 242.有效的字母异位词
个人题解如下:创建一个数组哈希表,对s和t出现的频次分别做一次+1和-1统计,最后看有没有不是0的情况。
class Solution
{
public:
bool isAnagram(string s, string t)
{
vector<int> hash(26, 0);
int i = 0;
if (s.size() != t.size())
{
return false;
}
for(i = 0; i < s.size(); i ++)
{
hash[s[i] - 'a'] ++;
}
for(i = 0; i < t.size(); i ++)
{
hash[t[i] - 'a'] --;
}
for(i = 0; i < 26; i ++)
{
if (hash[i] != 0)
{
return false;
}
}
return true;
}
};
2. 题目链接: 349. 两个数组的交集
个人题解1如下:使用数组哈希表。由nums1生成hash,再按nums2在hash里查找,最后由unordered_set转成vector.
class Solution
{
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
vector<int> hash(1001, 0);
unordered_set<int> result_set;
int i;
for (i = 0; i < nums1.size(); i ++)
{
hash[nums1[i]] = 1;
}
for (i = 0; i < nums2.size(); i ++)
{
if (hash[nums2[i]] == 1)
{
result_set.insert(nums2[i]);
}
}
return vector<int> (result_set.begin(), result_set.end());
}
};
个人题解2如下:使用unordered_set,自动去重。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for(int num:nums2)
{
if (nums_set.find(num) != nums_set.end())
{
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
3. 题目链接: 202. 快乐数
个人题解如下:继续使用unordered_set,查找之前是否出现过,是则返回false,是1返回true.
class Solution
{
public:
int getSum(int num)
{
int sum = 0;
while (num > 0)
{
sum += ((num % 10) * (num % 10));
num = num / 10;
}
return sum;
}
bool isHappy(int n)
{
int sum;
unordered_set<int> set;
while(1)
{
sum = getSum(n);
if (sum == 1)
{
return true;
}
if (set.find(sum) != set.end())
{
return false;
}
else
{
set.insert(sum);
}
n = sum;
}
}
};
4. 题目链接: 1. 两数之和
个人题解如下:使用map, key是数组的值,value是数组的值的下标。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map <int, int> map;
for(int i = 0; i < nums.size(); i++)
{
auto iter = map.find(target - nums[i]);
if (iter != map.end())
{
return {iter->second, i};
}
map.insert(pair <int, int>(nums[i], i));
}
return {};
}
};