(一)有效的字母异位词
大概的方法就是将所有出现的字母先转换为数字都放在数组当中,然后再遍历另一个字母的时候,我们再从原来的字母减掉
class Solution {
public:bool isAnagram(string s, string t) {int record[26]={0};for(int i=0;i<s.size();i++){record[s[i]-'a']++;}for(int i=0;i<t.size();i++){record[t[i]-'a']--;}for(int i=0;i<26;i++){if(record[i]!=0){return false;}}return true;}
};
(二)、寻找两个数组的交集
使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
(1)、使用set来解决
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set;unordered_set<int> find_set(nums1.begin(),nums1.end());for(int num:nums2){if(find_set.find(num)!=find_set.end()){result_set.insert(num);}}return vector<int>(result_set.begin(),result_set.end());}
};
(2)、使用数组解决问题
因为leetcode到了后面对数据进行了改版,所以现在我们可以直接定义一个大概大小为1005的数组进行操作就行了
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set;int arrary[1005]={0};for(int i:nums1){arrary[i]=1;}for(int i:nums2){if(arrary[i]==1){result_set.insert(i);}}return vector<int>(result_set.begin(),result_set.end());}
};
(三)、快乐数
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
class Solution {
public:int get_sum(int n){int sum=0;while(n){sum+=(n%10)*(n%10);n/=10;}return sum;}
public:bool isHappy(int n) {int sum=0;unordered_set<int> result_set;while(1){sum=get_sum(n);if(sum==1){return true;}if(result_set.find(sum)!=result_set.end()){return false;}else{result_set.insert(sum);}n=sum;}}
};
(四)、两数之和
在这里我们主要是要注意用map的思想来解决问题
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 item=map.find(target-nums[i]);if(item!=map.end()){return {item->second,i};}else{map.insert(pair<int,int>(nums[i],i));}}return {};}
};