查找表1 LeetCode 349&350&242&202&290&205&451

#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;
    }
};
发布了86 篇原创文章 · 获赞 0 · 访问量 4076

猜你喜欢

转载自blog.csdn.net/qq_31965925/article/details/105474540
今日推荐