leetcode刷题笔记

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),断点打到这个临时语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值