242 有效的字母异位词
题目描述:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。
若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路
本题主要是记录 s 和 t里面字符出现的次数,关键在于如何尽可能高效。哈希表做这件事就很擅长,通过映射,例如,将小写字母a映射成0,小写字母b映射成1,只需遍历一次字符串,将字符对应数组位置的值++,即可完成统计。之后,按照同样的思路,统计 t 中字符出现的次数,将字符对应数组位置的值--。最后遍历该数组,如果所有值均为0,说明 s 和 t 互为异位词,否则,不是。
代码
class Solution {
public:
bool isAnagram(string s, string t) {
int arr[26] = {0}; // hash table
for (int i = 0; i < s.length(); i++)
{
arr[s[i] - 'a']++;
}
for (int j = 0; j < t.length(); j++)
{
arr[t[j] - 'a']--;
}
for (int k = 0; k < 26; k++)
{
if (arr[k] != 0)
return false;
}
return true;
}
};
349 两个数组的交集
题目描述:给定两个数组 nums1 和 nums2,返回他们的交集。
要求:输出结果中的每个元素是唯一的,可以不考虑输出结果的顺序。
思路
首先利用set对nums1和nums2中的内容进行去重,之后判断nums2中的元素是否在nums1中出现,若出现,则将该元素push到result中,否则,忽略。
代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// nums1、nums2中都可能有重复元素
unordered_set<int> uset1; // unordered_set:O(n) 哈希表
unordered_set<int> uset2;
vector<int> result;
for (int i = 0; i < nums1.size(); i++) // 去重
{
uset1.insert(nums1[i]);
}
for (int i = 0; i < nums2.size(); i++)
{
uset2.insert(nums2[i]);
}
// nums2(去重后)中的元素是否在nums1中出现
for (auto it = uset2.begin(); it != uset2.end(); it++)
{
if (uset1.count(*it) != 0)
{
result.push_back(*it);
}
}
return result;
}
};
202 快乐数
题目描述:编写一个算法来判断一个数 n 是不是快乐数。
思路
关键:在于是否会无限循环,所谓无限循环就是平方和结果 sum 会重复出现,因此只需要记录每次平方和结果,如果下一次平方和结果出现过,说明陷入死循环,不是快乐数;而如果sum等于1,说明是快乐数。
代码
class Solution {
public:
/** 返回 n 各位的平方和 */
int getSum(int n)
{
int sum = 0;
while (n != 0)
{
int k = n % 10;
sum += k * k;
n /= 10;
}
return sum;
}
bool isHappy(int n) {
/** 是否出现死循环,即sum值是否会重复出现 */
unordered_set<int> record;
while (1)
{
n = getSum(n);
if (n == 1)
break;
if (record.count(n) != 0) // 结果重复,陷入死循环
return false;
else
record.insert(n);
}
return true;
}
};
1 两数之和
题目描述:给定一个整数数组 nums 和一个整数目标值 target,在该数组中找出和等于target 的那两个整数,并返回它们的数组下标。
思路
参考:mp.weixin.qq.com/s/fSyJVvggx…
代码
1. 暴力搜索
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
for (int i = 0; i < nums.size(); i++)
{
int del_num = target - nums[i];
for (int j = i + 1; j < nums.size(); j++)
{
if (nums[j] == del_num)
{
result.push_back(i);
result.push_back(j);
return result;
}
}
}
return {};
}
};
时间复杂度:O(n2)