1.unordered_map用法
C++ STL unordered_map容器用法详解 (biancheng.net)
#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;
}
};