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

C语言Leetcode笔记涵盖多方面内容: - **意义**:是锻炼解决问能力的好方式,能接触新的解思路和数据结构,可将过的目、笔记、思路及数据结构进行整理分享 [^2]。 - **具体笔记**: - **C语言leetcode笔记2**:有关于移动零的目,可建立新数组把非0元素先放入,剩下位置赋0;也可优化为直接在原数组操作。如`moveZeroes`函数实现: ```c void moveZeroes(int* nums, int numsSize) { int count = 0; for(int i = 0; i < numsSize; i++) { if(nums[i] != 0) { nums[count++] = nums[i]; } } for(int i = count; i < numsSize; i++) { nums[count++] = 0; } } ``` 还涉及122.买卖股票的最佳时机Ⅱ等目 [^3]。 - **C语言leetcode笔记3**:包含876.链表的中间结点(可通过遍历数节点个数、快慢指针方法求解)、874.比较含退格的字符串、155.最小栈(有getMin内部实现查找和getmin直接返回值两种方法)等目,同时有栈的使用例子及相关优化,如传递指针、初始化、动态分配、释放等 [^1]。 - **通用注意事项**: - 力扣若返回数组指针,数组首元素不能为空,否则系统认为数组全为空。 - 输出数组末尾需写上`'\0'`,否则会报地址错误,可使用`msmset`或结束时加`'\0'`。 - 使用`memset`函数。 - 函数返回线性表结果时,要用`malloc`申请线性表内存,不能直接申请数组,因为函数结束数组会被销毁。 - 使用`strlen`函数。 - `int`型变量使用负值可能报错,类似地址溢出错误。 - 计算任意类型数组大小可用`sizeof(arr) / sizeof(arr[0])` 。 - `break`不能和其他代码放一行。 - 写少用循环尤其是嵌套循环,可用多个标志位处理。 - `sizeof(数组nums)`会计算`'\0'`大小,`sizeof`计算变量占用字节数;`strlen`不计算`'\0'`大小,计算以`'\0'`结尾的字符串个数;`malloc`申请内存返回指针,做`sizeof`参数返回指针大小,此时用`strlen`。 - `malloc`申请的内存即使不返回使用,末尾也需加`'\0'`,否则报错。 - `a[10]`定义有十个元素的数组,元素从0 - 9 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值