力扣基础知识掌握
今天我练习了力扣的一些题目,感觉收获很多。
基础掌握(更新中)
1 心里有数
$\bigstar$的几次方是$1s$?
$\bigstar$在写题的时候要注意特殊的数字,如$0、1$等。
$\bigstar$对二维数组$arr$怎么遍历呢?
1 | for (int i = 0; i < arr.size(); i++) { |
二维数组$arr$初始化:
1 | vector<vector<int>>arr(n,vector<int>(m,0)); |
$\bigstar$注意,在分割字符串的时候,若一定要将字符串s分割成两个字符串,那么遍历的时候$i<n-1,j=i+1$。像这样,而不是$i<n$,是$i<n-1$,这个千万不能忽略,很重要!!!
1 | for(int i=0;i<n-1;i++){ |
$\bigstar$double类型的数字与整型、double类型等不同类型的数字比大小,直接用大于小于等于号即可,不用担心有什么偏差。
$\bigstar$求一个题目的一些数字的和$sum$的时候,请把$sum$设置为long long类型!
2 一些固定数字
$2^{31}-1=2147483648-1$
3 数据结构范围
int的取值范围是$[-2^{31},2^{31}-1],2^{31}=2147483648$,大概是$2 \times10^9$。
long long的取值范围在$10^{18}$,具体多少就不说了。
4 返回一个数组
1 | return [1,2]; |
5 问句表达式
1 | a==b+c? true:false; |
6 位运算
异或^
7 计算一段数据中不重复数字的个数
7.1 用set
1 | set<int>st; |
7.2 用unordered_map
1 | unordered_map<int>mp; |
7.3 常见应用
**注意!有时候set好用一点,有时候unordered_map好用一点!不一定只用set。**例如2841. 几乎唯一子数组的最大和(详细题解在leetcode-practice-0727的博客里面),因为可能涉及到删除元素,set只能删除所有值为$x$的元素(插入很多个值为$x$的元素,但set里只会显示一个,因此删除也是删除所有值为$x$的元素),但是这一题只要删除一个就行;因此,用map更好一点!
8 常见函数
8.1 绝对值函数
1 | abs(x) |
8.2 大写字母转小写字母函数
1 | tolower(char x) |
8.3 sort函数的用法
$\bigstar$可参考博客C++/C sort函数用法(详细),cmp的构造
$\bigstar$cmp的构造:
1 | bool cmp(int i,int j){ |
$\bigstar$结构体构造
8.4 reduce函数
$\bigstar$默认求和:
1 | vector<int> nums = {1, 2, 3, 4, 5}; |
$\bigstar$求乘法:
1 | std::vector<int> nums = {1, 2, 3, 4, 5}; |
9 字符串相关
$\bigstar$小写$a:97$
大写$A:65$
即小写字符的$ASCII$码大于大写字符
$\bigstar$大小写之间的$ASCII$码相差$32$;
则若想将字符$x=A$变成小写的$a$,那么可以这样
1 | char x='A'; |
$\bigstar$遍历字符串$s$
1 | for(auto c:s) |
$\bigstar$一共有$26$个字母,则第$i$个大写字母的$ASCII$码表示为$65+i-1$
$\bigstar$一堆字符中,我只想找出大写字母,怎么办?
1 | if(c>=65&&c<=65+26-1) |
虽然$c$是字符,但是可以直接和数字相比,可能它可以直接转换为$ASCII$码吧。
10 STL相关
10.1 string
10.1.1 函数
设字符串为$s$。
$\bigstar$s.length()复杂度为$O(1)$
$\bigstar$s.back()返回字符串最后一个字符,复杂度为$O(1)$
$\bigstar$s.find()最坏时间复杂度是$O(n)$
$(1)$查找字符$’c’$:
1 | size_t pos = str.find('c'); // 查找字符 'c'首次出现的位置 |
size_t就是unsigned long long
时间复杂度是$O(n)$。
$(2)$查找子字符串:
1 | size_t pos = str.find("ll"); // 查找子字符串 "ll" |
时间复杂度是$O(nm)$。
$(3)$从指定位置开始查找:
1 | size_t pos = str.find('o', 5); // 从索引 5 开始查找 'o' |
时间复杂度是$O(n)$。
$(4)$从字符串末尾开始寻找:
1 | std::string str = "hello world"; |
时间复杂度是$O(n)$。
$(5)$查找字符集合中的任意字符:
1 | std::string str = "hello"; |
时间复杂度是$O(nm)$。
$\bigstar$pop_back函数:移除字符串的最后一个字符,时间复杂度为$O(1)$。
$\bigstar$push_back函数:将一个字符附加到字符串尾部,时间复杂度为$O(1)$.
10.1.2 由函数衍生出来的可能会用到的东西
$\bigstar$string::npos:
1 | if(s.find(a) != string::npos) |
string::npos 是 C++ 中 std::string 类的一个静态常量,表示 “未找到” 或 “无效位置”。它是 size_t 类型的最大值,通常用于字符串查找函数(如 find()、rfind() 等)的返回值,表示搜索失败。
若能找到,则 !=string::npos 成立,否则将=string::npos 。
10.2 vector
10.2.1 构造
10.2.2 函数
$\bigstar$求数组中的最大的数:
1 | max(arr) |
$\bigstar$求数组中某个数的下标:
1 | arr.index(3) //求数3在数组arr中的下标 |
10.3 set
10.3.1 构造
1 | set<int> s1;// 升序 |
1 | set<int> s = { 3,1,2,4,5 }; |
10.3.2 函数
$\bigstar$插入函数:
1 | vector<int> v = { 1,2,5 }; |
$\bigstar$清空函数:
1 | std::set<int> mySet = {1, 2, 3}; |
时间复杂度为$O(n)$。
$\bigstar$记录当前元素的数量:
1 | set<int> st = {1,2,3}; |
时间复杂度是$O(1)$。
10.4 multiset
10.4.1 初始化
$\bigstar$能用set初始化multiset,反过来也一样!
1 | std::set<int> s = {1, 2, 3, 4, 5}; |
10.4.2 函数
$\bigstar$插入:
1 | std::multiset<int> ms; |
时间复杂度:$O(log N)$,$N$ 为当前元素数量。
$\bigstar$删除所有值为$x$的元素:
1 | std::multiset<int> ms = {1, 2, 2, 3, 3, 3}; |
时间复杂度:$O(M + log N)$,其中 $M$ 是删除的元素数量,$N$ 是总元素数量。
注意,是删除了所有值为$x$的元素,不是只删除一个!!!解题的时候一定要注意了!!!
$\bigstar$删除一个值为$x$的元素:
1 | std::multiset<int> ms = {1, 2, 2, 3, 3, 3}; |
10.5 map
10.5.1 构造
1 | map<int,int>mp; |
构造函数包含了两个参数,第一个参数是关键字Key,第二个参数是关键字的值Key_Value。这两个参数可以是任意类型。
10.5.2 函数
$\bigstar$插入:
1 | mp[x]=1; //说明插入了一个关键字为x的数,关键字值为1 |
$\bigstar$删除:
1 | mp.erase(x); //删除Key=x的元素 |
时间复杂度为$O(logN)$,$N$是mp所存储元素的个数。是删除Key=x的元素,不是删除Key_value=x的元素哦!