哈希表
哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_,完成映射操作,主要是相应的函数。map和set是有序的,使用的是树的形式,unordered_map和unordered_set使用的是散列比表的,无序。
相应函数
set multiset
相应的地址
map multimap
相应地址
unordered_map unordered_multimap
相应位置
unordered_set unordered_multiset
相应地址
刷题
多数元素
最朴素的方法,map统计,绷不住了,嘎嘎嘎
class Solution {
public:int majorityElement(vector<int>& nums) {map<int,int> d;for(int i=0;i<nums.size();i++){d[nums[i]]++;if(d[nums[i]]>nums.size()/2){return nums[i];}}return 0;}};
罗马数字转整数
只根据规定的格式进行匹配
class Solution {
public:int romanToInt(string s) {map<char,int> d;d['I'] = 1;d['V'] = 5;d['X'] = 10;d['L'] = 50;d['C'] = 100;d['D'] = 500;d['M'] = 1000;char last;int sum = 0; for(int i =0;i<s.length();i++){sum += d[s[i]];if(last == 'I'&&(s[i]=='V'| s[i]=='X')){sum-=2;last = ' ';} else if(last == 'X'&& (s[i]=='L'| s[i]=='C')){sum-=20;last = ' ';}else if(last=='C'&&(s[i]=='D'| s[i]=='M')){sum-=200;last = ' ';}else{last = s[i];}}return sum;}
};
整数转罗马数字
直接暴力if eiseif,绷不住了
class Solution {
public:string intToRoman(int num) {map<int,char> d;d[1] = 'I';d[5] = 'V';d[10] = 'X';d[50] = 'L' ;d[100] ='C';d[500] = 'D';d[1000] = 'M' ;string s;int n=num;while(n>0){if(n/1000){s.push_back(d[1000]);n-=1000;}else if(n/500){if(n>=900){s.push_back(d[100]);s.push_back(d[1000]);n-=900;}else{s.push_back(d[500]);n-=500;}}else if(n/100){if(n>=400){s.push_back(d[100]);s.push_back(d[500]);n-=400;}else{s.push_back(d[100]);n-=100;}}else if(n/50){if(n>=90){s.push_back(d[10]);s.push_back(d[100]);n-=90;}else{s.push_back(d[50]);n-=50;}}else if(n/10){if(n>=40){s.push_back(d[10]);s.push_back(d[50]);n-=40;}else{n-=10;s.push_back(d[10]);}}else if(n/5){if(n>=9){s.push_back(d[1]);s.push_back(d[10]);n-=9;}else{n-=5;s.push_back(d[5]);}}else{if(n>=4){s.push_back(d[1]);s.push_back(d[5]);n-=4;}else{n-=1;s.push_back(d[1]);}}}return s;}
};
电话号码的字母组合
就是暴力,emm,题解挺简单的,用一个map存储映射,然后开始暴力操作。
class Solution {
public:vector<string> letterCombinations(string digits) {map<int,string> m;m['2']="abc";m['3']="def";m['4']="ghi";m['5']="jkl";m['6']="mno";m['7']="pqrs";m['8']="tuv";m['9']="wxyz";vector<string> data;for(int i=0;i<digits.length();i++){vector<string> d;d=data;data.clear();string digi = m[digits[i]];for(int j=0;j<digi.length();j++){if(d.empty()){string aaa;aaa+=digi[j];data.push_back(aaa); }else{for(int h=0;h<d.size();h++){data.push_back(d[h]+digi[j]);}} }}return data;}
};
存在重复元素
就一个集合解决
class Solution {
public:bool containsDuplicate(vector<int>& nums) {set<int> data;for(int i=0;i<nums.size();i++){if(data.find(nums[i])==data.end()){data.insert(nums[i]);}else{return true;}}return false;}
};
重复元素2
用一个映射存储数据,直接遍历,可能某个元素会出现多此,所以需要进行一个map位置的实时更新。
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {map<int,int> m;for(int i=0;i<nums.size();i++){if(m.find(nums[i])!=m.end()){if((i-m[nums[i]])<=k){return true;}else{m[nums[i]]=i;}}else{m[nums[i]]=i;}}return false;}
};