sqrt()函数得到的结果是浮点型
int a=10;sqrt(a)=3.168…
int b=(int)sqrt(a)
求整数位数
int m=(int)log10(n)+1
char转换为int
char c='9';int a=(int)(c-'0');
//此时a=9
int n=1;char c=(char)(n+'0');
//此时c=‘1’
reserve函数
reserve(s.begin(),s.end())
//反转字符串
关于map和string的一个使用
int sum(string prefix) {
int n=prefix.size();
int temp=0;
for(auto x:m)//用x去遍历map<string,int>m;
{
if(x.first.compare(0,n,prefix)==0)//对比第一个字符串从0到n位是不是和第二个字符串相同
temp+=x.second;//用for(auto x:m)此时x是一个迭代器,用的.而不是->
}
return temp;
}
for(auto x : v)
会创建v中元素的拷贝赋给x,所以如果在for循环体内修改x,是不会影响到v的。
如果想避免拷贝的话,可以这么写:for(auto & x : v)
如果只想读v中的元素,但不想修改v的话,可以这么写:for(const auto & x : v)
isdigit(char c)函数:判断c是不是一个数字
包含头文件ctype.h
char c='1';
if(isdigit(c))==1;//当c是一个数字时,返回非零值
当c是一个数字时,返回非零值,如果不是一个数字,返回0
通过洗牌算法打乱一个数组
leetcode,384题,打乱数组
class Solution {
public:
Solution(vector<int>& nums) {
this->nums=nums;
}
vector<int> reset() {
return nums;
}
vector<int> shuffle() {
vector<int>temp(nums);
for(int i=0;i<nums.size();i++)
{
int j=rand()%nums.size();
swap(temp[i],temp[j]);
}
vector<int>res(temp);
temp=nums;
return res;
}
private:
vector<int>nums;
};
- 利用
rang()%
n生成[0,n)
之间的随机数 - 函数可能会被多次调用,因此temp的值最终要保持不变
map 和unordered_map的区别
map
map的底层实现是一棵红黑树实现的,因此map内部所有的数据都是有序的,map的查询、插入、删除操作的时间复杂度都是O(logn)。此外,map的key需要定义operator <,对于一般的数据类型已被系统实现,若是用户自定义的数据类型,则要重新定义该操作符。
unordered_map
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的。unordered_map的底层是一个防冗余的哈希表(开链法避免地址冲突)。unordered_map的key需要定义hash_value函数并且重载operator ==。
哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,时间复杂度为O(1);而代价仅仅是消耗比较多的内存。哈希表的查询时间虽然是O(1),但是并不是unordered_map查询时间一定比map短,因为实际情况中还要考虑到数据量,而且unordered_map的hash函数的构造速度也没那么快,所以不能一概而论,应该具体情况具体分析。
set
set初始化
使用构造函数
(_iter &left , _iter &right)
,左闭右开。这里的left和right可以是地址、迭代器。
①数组地址
int a[] = {1,2,3,4,5};
set<int> s(a,a+5);
②迭代器
vector<int> v={1,2,3,4,5};
set<int> s(v.begin(),v.end());
使用insert
void insert(_Iter)(_Iter _First, _Iter _Last)
如果是预先声明好的set,可以采用insert。
使用方法基本同构造函数。
①数组地址
set<int> s;
int a[] = {1,2,3,4,5};
s.insert(a,a+5);
②迭代器
注意,跟顺序容器vector不同,set的insert不需要指定插入位置。
set<int> s;
vector<int> v={1,2,3,4,5};
s.insert(v.begin(),v.end()); //如果是vector的话,第一个参数会是插入位置。
从set还原到vector
通过assign()
函数来进行分配
vec.assign(set.begin(), set.end());
如何打断点到第几次循环
可以设置一个临时判断条件,if(i>20)
,断点打到这个临时语句。