1、有效的字母异位词
#include <iostream>
using namespace std;
class Solution {
public:
bool isAnagram(const string& s, const string& t) {
int record[26] = {0};
for (char i : s) {
record[i - 'a']++;
}
for (char i : t) {
record[i - 'a']--;
}
for (int i : record) {
if (i != 0)
return false;
}
return true;
}
};
int main() {
string s = "abcd";
string t = "bdca";
Solution solution;
cout << solution.isAnagram(s, t);
}
2、两个数组的交集
利用set
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
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 {result_set.begin(), result_set.end()};
//vector<int>(result_set.begin(), result_set.end())
}
};
int main() {
vector<int> nums1 = {1, 2, 2, 1};
vector<int> nums2 = {2, 2};
Solution solution;
for (auto i: solution.intersection(nums1, nums2)) {
cout << i << " ";
}
}
利用数组
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,并去重
int hash[1005] = {0}; //因为数据的大小范围在0到1000
for (int num : nums1) {
hash[num] = 1;
}
for (int num : nums2) {
if (hash[num] == 1) {
result_set.insert(num);
}
}
return {result_set.begin(), result_set.end()};
}
};
int main() {
vector<int> nums1 = {1, 2, 2, 1};
vector<int> nums2 = {2, 2};
Solution solution;
for (auto i: solution.intersection(nums1, nums2)) {
cout << i << " ";
}
}
3、快乐数
理解这一题的关键是判断一个数是否为快乐数可以看其是否进入循环(1除外),如果进入循环那就一定不是快乐数。
#include <iostream>
#include <unordered_set>
using namespace std;
class Solution {
public:
// 取数值各个位上的数字平方之和
int getSum(int n) {
int sum = 0;
while (n) {
sum += (n % 10) * (n % 10); //先个位再十位后百位
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set; //unordered_set的特征为无序不重复
while(true) {
int sum = getSum(n);
if (sum == 1)
return true;
// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum; //更新n
}
}
};
int main() {
Solution solution;
cout << solution.isHappy(19);
}
4、两数之和
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
unordered_map<int, int> map; //unorder_map存和读的效率是最高的
for (int i = 0; i < nums.size(); ++i) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]); //iter是迭代器
if (iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert({nums[i], i});
//map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
int main() {
vector<int> nums = {2, 7, 11, 15};
int target = 9;
Solution solution;
for (auto i: solution.twoSum(nums, target)) {
cout << i << " ";
}
}