10.27算法(哈希表)
3.1有效字母的异位词
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};//创建哈希表,数组
int i = 0;
for(;i<s.size();i++)
record[s[i]-'a']++;//字符串s中ACSII直接减去a的ASCII可以得到本身的ASCII。就是找到对应的数组下标然后加一
for(i=0;i<t.size();i++)
record[t[i]-'a']--;//同样的找到数组下标减一
for(i=0;i<26;i++)
if(record[i]!=0)//如果遍历整个数组存在任意数值都需要判错
return false;
return true;
}
};
3.2数组的交集
for(int num : nums)
表示迭代器遍历,对于数组来说相当于
for(int i = 0;i<nums2.length;i++){
int num = nums2[i];
}

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());//begin代表首位,end代表末尾的后一个位置
for(int num : nums2){
if(nums_set.find(num)!=nums_set.end())//nums_set.end()应该是空的,因为它指的是最后元素的后一个位置
result_set.insert(num);
}
return vector<int>(result_set.begin(),result_set.end());//重新将哈希表转换成数组输出
}
};
3.3快乐数
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
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;//使用unorde可以有效的自动删除重复的元素,同时
while(1){//不断的循环
int sum = getSum(n);
if(sum==1)
return true;
if(set.find(sum)!=set.end())//如果找到重复的sum表示这个数肯定不是快乐数,因为一直在以某个周期不断的循环
return false;
else
set.insert(sum);//不重复则纳入set哈希表
n = sum;//n元素重新赋值为当前的sum值
}
}
};
3.4两数之和

auto的原理就是根据后面的值,来自己推测前面的类型是什么。
auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替。
map:{key关键字:value下标}
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> map;//创建不需要排好顺序的map表
for(int i = 0;i<nums.size();i++){
auto iter = map.find(target-nums[i]);//iter来保存目标值-当前遍历值=需要匹配的值
if(iter != map.end())//如果此时在map表中找到了匹配的值
return {iter->second,i};//返回iter中的value和当前下标
else
map.insert(pair<int,int>(nums[i],i));否则纳入map表中
}
return {};
}
};

浙公网安备 33010602011771号