#include <iostream>
#include <vector>
#include <set>
using namespace std;
/**
给定两个数组,编写一个函数来计算它们的交集。
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
*/
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> record(nums1.begin(),nums1.end());//使用vector创建set
set<int> result;
for(int i=0; i<nums2.size(); i++)
{
//查找nums2的元素是否存在于nums1中
if(record.find(nums2[i])!=record.end())
result.insert(nums2[i]);
}
vector<int> ret(result.begin(),result.end());
return ret;
}
};
#include <iostream>
#include <vector>
#include <map>
using namespace std;
/**
给定两个数组,编写一个函数来计算它们的交集。
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
*/
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
map<int,int> record;
//使用map统计nums1字符出现的个数 字符-个数
for(int i=0; i<nums1.size(); i++)
{
if(record.find(nums1[i])==record.end())
record.insert(make_pair(nums1[i],1));
else
record[nums1[i]]++;
}
vector<int> res;
for(int i=0; i<nums2.size(); i++)
{
if(record.find(nums2[i])!=record.end()&& record[nums2[i]]>0)
{
res.push_back(nums2[i]);
record[nums2[i]]--;
}
}
return res;
}
};
#include <iostream>
#include <map>
using namespace std;
/**
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
输入: s = "anagram", t = "nagaram"
输出: true
*/
class Solution {
public:
bool isAnagram(string s, string t) {
//遍历s 将s中出现的字符和个数用map存下来 字符-数量
map<char,int> record;
for(int i=0; i<s.size(); i++)
{
if(record.find(s[i])==record.end())
record.insert(make_pair(s[i],1));
else
record[s[i]]++;
}
//遍历t 存在则map中数量-1 在map中找不到或者数量为0 则false
for(int i=0; i<t.size(); i++)
{
if(record.find(t[i])!=record.end() && record[t[i]]>0)
{
record[t[i]]--;
}
else
return false;
}
//遍历map剩下的元素,是否都为0
for(map<char,int>::iterator iter=record.begin(); iter!=record.end(); iter++)
{
if(iter->second>0)
return false;
}
return true;
}
};
#include <iostream>
#include <set>
using namespace std;
/**
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果可以变为1,那么这个数就是快乐数。
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
*/
class Solution {
public:
bool isHappy(int n) {
set<int> tmp;//用set存值,看一下结果是否陷入了循环,就是有重复的值
while(true)
{
int r = sum(n);
if(tmp.find(r)!=tmp.end()) //陷入循环
{
return false;
}else if(r==1)
{
return true;
}else
{
tmp.insert(r);
}
n=r;
}
}
//计算一个数各位数的平方之和
int sum(int n)
{
int sum=0;
while(n>0)
{
int i=n%10;
sum+=i*i;
n=n/10;
}
return sum;
}
};
#include <iostream>
#include <map>
#include <vector>
#include<string>
using namespace std;
/**
给定一种规律 pattern和一个字符串str,判断 str 是否遵循相同的规律。
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
*/
class Solution {
public:
bool wordPattern(string pattern, string str) {
//切割str
vector<string> vec;
int begin=0;
int i=1;
for(i=1; i<str.size(); i++)
{
//分割字符
if(str[i]==' ')
{
string s=str.substr(begin,i-begin);
vec.push_back(s);
begin=i+1;
}
}
string s=str.substr(begin,i-begin);
vec.push_back(s);
if(vec.size()!=pattern.size()) return false;//长度不等
map<char,string> tmp;//存储单词对应的模式 dog-a
for(int i=0; i<pattern.size(); i++)
{
if(tmp.find(pattern[i])==tmp.end()) //当前模式不存在
{
tmp.insert(make_pair(pattern[i],vec[i]));
}else
{
if(!(tmp[pattern[i]]==vec[i])) //当前模式对应的单词不相同
return false;
}
}
//问题:"abba" "dog dog dog dog" 反向再匹配一次
map<string,char> tmp2;//存储模式对应的单词 a-dog
for(int i=0; i<pattern.size(); i++)
{
if(tmp2.find(vec[i])==tmp2.end()) //当前模式不存在
{
tmp2.insert(make_pair(vec[i],pattern[i]));
}else
{
if(!(tmp2[vec[i]]==pattern[i])) //当前模式对应的单词不相同
return false;
}
}
return true;
}
};
#include <iostream>
#include <map>
#include <vector>
#include<string>
using namespace std;
/**
给定两个字符串s和t,判断它们是否是同构的。
输入: s = "egg", t = "add"
输出: true
*/
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.size()!=t.size()) return false;
map<char,char> tmp;//存储单词对应的单词 e-a
for(int i=0; i<s.size(); i++)
{
if(tmp.find(s[i])==tmp.end()) //当前模式不存在
{
tmp.insert(make_pair(s[i],t[i]));
}else
{
if(!(tmp[s[i]]==t[i])) //当前模式对应的单词不相同
return false;
}
}
//反向再匹配一次 a-e
map<char,char> tmp2;//存储模式对应的单词 a-dog
for(int i=0; i<s.size(); i++)
{
if(tmp2.find(t[i])==tmp2.end()) //当前模式不存在
{
tmp2.insert(make_pair(t[i],s[i]));
}else
{
if(!(tmp2[t[i]]==s[i])) //当前模式对应的单词不相同
return false;
}
}
return true;
}
};
class Solution {
public:
string frequencySort(string s) {
//使用map将字符和出现的次数记录下来
map<char,int> tmp;
for(int i=0; i<s.size(); i++)
{
if(tmp.find(s[i])==tmp.end())
tmp.insert(make_pair(s[i],1));
else
tmp[s[i]]++;
}
//使用vector对字符数进行排序
vector< pair<char, int> > vec(tmp.begin(),tmp.end());
sort(vec.begin(),vec.end(),value_compare);
//输出结果
string ret;
for(int i=0; i<vec.size(); i++)
{
for(int j=0; j<vec[i].second; j++)
ret.push_back(vec[i].first);
}
return ret;
}
static bool value_compare(const pair<char, int>& p1, const pair<char, int>& p2)
{
return p1.second > p2.second;
}
};