2022/1/20笔记

1.unordered_map用法

C++ STL unordered_map容器用法详解 (biancheng.net)

C++中的unordered_map用法详解

#include<string>    
#include<iostream>  
#include<unordered_map>
using namespace std;  
  
int main()
{
	unordered_map<string, int>  dict; // 声明unordered_map对象
	
	// 插入数据的三种方式
	dict.insert(pair<string,int>("apple",2));
	dict.insert(unordered_map<string, int>::value_type("orange",3));
	dict["banana"] = 6;
	
	// 判断是否有元素
	if(dict.empty())
		cout<<"该字典无元素"<<endl;
	else
		cout<<"该字典共有"<<dict.size()<<"个元素"<<endl;
	
	// 遍历
	unordered_map<string, int>::iterator iter;
	for(iter=dict.begin();iter!=dict.end();iter++)
		cout<<iter->first<<ends<<iter->second<<endl;
	
	// 查找
	if(dict.count("boluo")==0)
		cout<<"can't find boluo!"<<endl;
	else
		cout<<"find boluo!"<<endl;
	
	if((iter=dict.find("banana"))!=dict.end())
		cout<<"banana="<<iter->second<<endl;
	else
		cout<<"can't find boluo!"<<endl;
	
	return 0;
}

题目:求众数:解法1:unordered_map<int,int>

//时间复杂度:O(n)O(n),其中 nn 为数组的长度。空间复杂度:O(n)O(n),其中 nn 为数组的长度,
//使用哈希表需要开辟额外的空间。
class Solution {
public:
    vector<int> majorityElement(vector<int>& arr) {
        vector<int> res;
        unordered_map<int,int> a;
        for(int p:arr) 
            a[p]++;
        for(auto i=a.begin();i!=a.end();i++){
            if(i->second>arr.size()/3) res.push_back(i->first);
        }
        return res;
    }
};
//一般模板
        int n = nums.size();
        vector<int> ans;
        unordered_map<int, int> cnt;
        for (auto & v : nums) {
            cnt[v]++;
        }
        for (auto & v : cnt) {
            if (v.second > n / 3) {
                ans.push_back(v.first);
            }
        }

 题目:求众数:解法2:摩尔投票

解题思路
摩尔投票
看成1/n就要最多有n-1个可能结果,都列出进行长度的判断得到最终结果。
看成有n-1个部队当n=3时
初始化前两个队伍A,B A,B和平发展,其余都是C
碰见A:则A队伍人数+1;B队伍人数不动
碰见B:则B队伍人数+1;A队伍人数不动
碰见C:则A、B队伍都人数-1
A、B队伍人数减到0,A、B的队伍名字也不改变
当A、B队伍人数减到0之后,再碰见C队伍则换名字队伍人数变成1

class Solution {
public:
    vector<int> majorityElement(vector<int>& arr) {
        vector<int> res;
        int res1=0,res2=0,count1=0,count2=0;
        for(int a:arr)
        {
            if((count1==0&&a!=res2)||res1==a) {res1=a;count1++;}
            else if((count2==0&&a!=res1)||res2==a) {res2=a;count2++;}
            else {count2--;count1--;}
        }
        count1=count2=0;
        for(int a:arr) 
        {
            if(a==res1)  count1++;
            else if(a==res2)  count2++;  //加上else为了res1=res2的情况
        }
        if(count1>arr.size()/3) res.push_back(res1);
        if(count2>arr.size()/3) res.push_back(res2);
        return res;
    }
};

题目:回文数--整数反转

class Solution {
public:
    bool isPalindrome(int x) {
    主要是要记住这个整数反转公式
    while(x>=y)时反转一半
    //反转整数公式
    long long y=0;
    int mus=x;
    if(x<0) return false;
    while(x>0)
    {
        y=y*10+x%10;
        x/=10;
    }
    if(y==mus) return true;
    return false;
    }
};
int main()
{
    int x=14158;
    int y=0;
	int muns=x;
	while(x>=y)
	{y=y*10+x%10;
	 x=x/10;}
    cout<<y<<" "<<x;
      //851      14
}

 set取元素操作

#include <set>          取元素不能用a.begin()+2可以用a.begin()++
#include <string>
#include <time.h>
#include <iostream>
using namespace std;
void iteratorOperator()
{
    set<int> set1 = {12, 7, 5, 93, 67};
    cout << "set1.size = " << set1.size() << " set1.empty = " << set1.empty() << " set1.max_size = " << set1.max_size() << endl;
    cout << "set1的值为:" << endl;
    for(auto &val: set1)
    {
        cout << val << "\t";
    }
    cout << endl;
    //1.begin 返回指向起始的迭代器
    set<int>::iterator iter1 = set1.begin();
    cout << "set1.begin() ==== " << *iter1 << endl;
    //*iter1 = 55;//不能通过迭代器修改值
 
    //2.cbegin 返回指向起始的常量迭代器,不能通过迭代器修改值
    set<int>::const_iterator iter2 = set1.cbegin();
    cout << "set1.cbegin() === " << *iter2 << endl;
    //*iter1 = 65;//不可以修改值
    //注:不能通过set的迭代器去修改set元素,原因是修改元素会破坏set组织,所以其实begin和cbegin是一样的效果
    //3.end 返回指向末尾的迭代器,即最后一元素的下一个位置
    set<int, string>::iterator iter3 = set1.end();
    iter3--;
    cout << "set1.end() ====== " << *iter3 << endl;
    //4.cend 返回指向末尾的迭代器,即最后一元素的下一个位置,不能通过迭代器修改它的值
    set<int, string>::const_iterator iter4 = set1.cend();
    --iter4;//指向最后一个元素
    cout << "set1.cend() ===== " << *iter4 << endl;
    //5.rbegin 返回指向起始的逆向迭代器,即最后一个元素
    set<int>::reverse_iterator iter5 = set1.rbegin();
    cout << "set1.rbegin() === " << *iter5 << endl;
    //6.crbegin 返回指向起始的逆向迭代器,即最后一个元素,不能通过迭代器修改它的值
    set<int, string>::const_reverse_iterator iter6 = set1.crbegin();
    cout << "set1.crbegin() == " << *iter6 << endl;
    std::set<int, string>::reverse_iterator rit;
    for (rit = set1.rbegin(); rit != set1.rend(); ++rit)
        std::cout << *rit << "\t";
    cout << endl;
    //7.rend 返回指向末尾的逆向迭代器,即第一个元素的前一个位置,可以通过迭代器修改它的值
    set<int, string>::reverse_iterator iter7 = set1.rend();
    --iter7;//指向第一个元素,   这里不能用++iter7
    cout << "set1.rend() ===== " << *iter7 << endl;
    //8.crend 返回指向末尾的逆向迭代器,即第一个元素的前一个位置,不能通过迭代器修改它的值
    set<int, string>::const_reverse_iterator iter8 = set1.crend();
    --iter8;//指向第一个元素,   这里不能用++iter8
    cout << "set1.crend() ==== " << *iter8 << endl;
}
int main()
{
    iteratorOperator();
    cout << "Hello, world!" << endl;
    return 0;
}

使用set的集合性和排序性
set取值不好操作可以使用set.begin()++不能直接加数
可以将set复制到vector中取元素
也可以使用*set.begin()取元素
class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> res;
        for(int a:nums) res.insert(a);
        for(auto a:res) nums.push_back(a);   set不好取元素将值复制到vector中
        if(res.size()<3) return nums[nums.size()-1];
        else return nums[nums.size()-3];
    }
};
class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> a;
        for(int res:nums) a.insert(res);
        while(a.size()>3) a.erase(a.begin());
        if(a.size()<3) return *(a.rbegin());
        else return *(a.begin());
    }
};

字符串前面补零方便直接+
到长度相同直接加法进位
class Solution {
public:
    string addStrings(string num1, string num2) {
        int len1=num1.size(),len2=num2.size();
        int maxlen=len1>=len2?len1:len2;
        //补全 短数组在前面加0
        while(num1.size()<maxlen) num1='0'+num1;
        while(num2.size()<maxlen) num2='0'+num2;
        //加和进位
        for(int i=maxlen-1;i>0;i--)
        {
            char arr=num1[i]+num2[i]-'0';
            if(arr>'9') {num1[i]=arr%'9'+'0'-1;num1[i-1]++;}
            else num1[i]=arr;
        }
        //最左边可能多出一位单独考虑
        num1[0]=num1[0]+num2[0]-'0';
        if(num1[0]>'9') {num1[0]=num1[0]%'9'+'0'-1;num1='1'+num1;}
        return num1;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值