备战春招——12.04 算法

哈希表

哈希表主要是使用 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

相应地址

刷题

多数元素

备战春招——12.04 算法_第1张图片
最朴素的方法,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;
    }

};

罗马数字转整数

备战春招——12.04 算法_第2张图片
只根据规定的格式进行匹配

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;
    }
};

整数转罗马数字

备战春招——12.04 算法_第3张图片
直接暴力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;
    }
};

电话号码的字母组合

备战春招——12.04 算法_第4张图片
就是暴力,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;
    }
};

存在重复元素

备战春招——12.04 算法_第5张图片
就一个集合解决

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

备战春招——12.04 算法_第6张图片

用一个映射存储数据,直接遍历,可能某个元素会出现多此,所以需要进行一个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;
    }
};

你可能感兴趣的:(算法)