字符串字符完成hash 整数数组用set完成hash
有效的字母异位词
法1: 创建2个vector 并比较
bool isAnagram(string s, string t) {
if(s.length() != t.length()) return false;
vector<int> sv(26,0);
vector<int> tv(26,0);
//s 和 t 仅包含小写字母
for (int i = 0; i < s.length(); ++i) {
sv[s[i] - 'a']++;
tv[t[i] - 'a']++;
}
//比较两个vector中元素
int i;
for (i = 0; i < 26; ++i) {
if (sv[i]!=tv[i]){
return false;
}
}
//条件
return true;
}
两个数组的交集
349. 两个数组的交集
法1: 创建2个set存放数组的值 在长的set中查找短set中的元素 找到则放入vector
vector<int> ans;
set<int> s1;
for (int i = 0; i < nums1.size(); ++i) {
s1.insert(nums1[i]);
}
set<int> s2;
for (int i = 0; i < nums2.size(); ++i) {
s2.insert(nums2[i]);
}
int minLen=min(s1.size(),s2.size());
if (minLen==s1.size()){
//迭代器取值
set<int>::iterator it;
for(it = s1.begin();it != s1.end();it++) {
if ((s2.find(*it)!=s2.end())){
cout << *it << endl;
ans.push_back(*it);
}
}
} else{
//迭代器取值
set<int>::iterator it;
for(it = s2.begin();it != s2.end();it++) {
if ((s1.find(*it) !=s1.end())){
ans.push_back(*it);
}
}
}
return ans;
法2:创建2个set set01存放vector01元素 在set01中查找vector02元素 存在则放入ansSet
//set使用不熟练
set<int> s1(nums1.begin(), nums1.end());
set<int> ansSet;
for (int i = 0; i < nums2.size(); ++i) {
if(s1.find(nums2[i]) != s1.end()){
ansSet.insert(nums2[i]);
}
}
return vector<int>(ansSet.begin(),ansSet.end());
快乐数
法1: 常规思路 数值裂解 求平方和 放入set 平方和在set中已经存在->no_happy 反之 happy
class Solution {
public:
//获取数位上的数值 返回值按从低位到高位
vector<int> splitNum(int i){
vector<int> num;
while (i)
{
int u = i % 10;
num.push_back(u);
i = i / 10;
}
return num;
// reverse(num.begin(), num.end());
}
bool isHappy(int n) {
//if happy else no_happy
//要么可以转到1要么无限循环
set<int> storeNum;
//进行循环 条件
int flag = n;
while (flag != 1) {
//存入set
storeNum.insert(flag);
//各位置上的数值
vector<int> number;
number = splitNum(flag);
//经过运算出现的数值 (不确定set中是否存在)
int newN = 0;
for (int i = 0; i < number.size(); ++i) {
newN += number[i] * number[i];
}
if ((storeNum.find(newN)) != storeNum.end()) {
return false;
}
flag = newN;
}
return true;
}
};
上面是自己写的代码 将求平方和逻辑混在其中,容易死循环
借鉴代码随想录思路,将求平方和逻辑分离出去
int getSum(int n){
int sum = 0;
while (n)
{
int u = n % 10;
sum += u * u;
n /= 10;
}
return sum;
}
bool isHappy(int n) {
//求平方和逻辑也分离出去 只有n sum 和set在改变
set<int> storeNum;
while(1){
if (n == 1)
return true;
int sum = getSum(n);
if (storeNum.find(sum) != storeNum.end()){
return false;
}else{
storeNum.insert(sum);
}
n = sum;
}
}
两数之和
法1:
思路 map<number,position> 遍历 判断条件:map内存在target - nums[i] 否则向map填充数据
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
//hash
// multiset<int>storeNum();
//不存在重复数值
// set<int> storeNumber;
map<int,int> storeNumber;
for (int i = 0; i < nums.size(); ++i) {
if (storeNumber.find(target-nums[i]) != storeNumber.end()){
ans.push_back(storeNumber[target-nums[i]]);
ans.push_back(i);
}
storeNumber.insert(make_pair(nums[i],i));
}
return ans;
}
上述是参考之前的java hashMap改写过来的,有好的思路再完善。