- 20220602开始,在完成了一遍剑指offer之后在进行细化练习。
- 20220605周赛比较简单,第一次45分钟做对了3题,算是一大进步吧。虽然差距还挺大的。
172、背单词
英语 | 汉语 |
---|---|
acumulate | 总和 |
iterator | 迭代器 |
reverse | 反转 |
second | 第二 |
intervals | 间隔、区间 |
map | 地图 |
database | 数据库 |
ops | operations操作 |
173、回溯超时
可以考虑剪枝或者预先排序输入
174、STL算法
sort(matchsticks.begin(), matchsticks.end(), greater<int>());变成递减排序
int sum = accumulate(matchsticks.begin(), matchsticks.end(), 0);求和
175、生成一个范围内的随机数
cout << rand() << " ";//41 0.563585 -0.613392 5.23496 19169 0.479873 -0.299417 5.58385 26962 0.746605
cout << rand() / RAND_MAX << " ";//输出:0 0 0 0 0 0 0 0 0 0
cout<< (double)rand() / RAND_MAX << " ";//输出:[0, 1]
// 0.00125126 0.563585 0.193304 0.808741 0.585009 0.479873 0.350291 0.895962 0.82284 0.746605
cout << 2 * (double)rand() / RAND_MAX - 1 << " ";//输出:[-1, 1]
//-0.997497 0.127171 -0.613392 0.617481 0.170019 -0.0402539 -0.299417 0.791925 0.64568 0.49321
cout << 4 * (double)rand() / RAND_MAX + 2 << " ";//输出:[2, 6]
//2.00501 4.25434 2.77322 5.23496 4.34004 3.91949 3.40117 5.58385 5.29136 4.98642
以下两种写法的区别
rand() % 2 + 1;//输出1,2
rand() % (2 + 1)//输出0,1,2
176、vs2022怎么关闭参数提醒
system("pause");
连着按2次ctrl即可切换显示与否。
system(_Command:"pause");;
177、string对象之间即使长度不同也能互相赋值
string a = { "jing yu" };
string b = { "han xian qiang" };
string c = { "han xian qiang" };
cout << b << endl;//输出:han xian qiang
b = a;
cout << b << endl;//输出:jing yu
a = c;
cout << a << endl;//输出:jing yu
178、list迭代器的使用
vector<int> vec = { 1, 2, 3, 4, 5, 6};
vector<int>::iterator it1 = vec.begin();
cout << *it1 << endl;//输出:1
it1 = it1 + 1;//这样是可以的
//但是如果是list<int>就不能这样了,因为它不是连续的
cout << *it1<<endl;//输出:2
vector<int>::iterator it2 = vec.begin();
it2 = next(it2);//下一个迭代器,prev(it)前一个迭代器
cout << *it2 << endl;//输出:2
vec.insert(it2, 9);
cout << vec[1] << endl;//输出:9
179、遍历map
map<int, int> mp;
for(auto m : mp){
sum += m.second;
}
180、插旗法_典型代码
bool book(int start, int end) {
map<int, int> mp;
int sum = 0;
mp[start]++;
mp[end]--;
for(auto m : mp){
sum += m.second; //sum表示的是区间重复的数量
}
}
181、bug
division by zero
除0了,加一点限制条件,不要除0就好了。
182、bug
//long long tripNumber(vector<int>& time, int x){}
//long long tripNumber(vector<int>& time, long long x){}
当x是long long 的时候,传入的时候就会出错。
183、类型转换
int a = 10;
double b = 3.14 + a;//b为13.14 一生一世
long c = 1212;
long d = a + c;//+左右两侧不一样,把a也变成long在相加
总之,自动类型转换总是向着尽量避免精度损失的方向去做。
184、浮点数的相等判定
因为计算机不能精确表示浮点数,所以不能直接==判定
要写成下面这样
float a,b;
bool tmp = fabs(a - b) < 0.000001;
//等效于int情况下的 tmp = a == b;
185、子字符串和在序列的区别
abcde
- 子字符串:字符串中连续的字符组成的子串,bcd
- 子序列:字符串删除一定字符获得的子串,bce
186、代码写之前
可以先用测试用例自己手跑一下,可以避免很多的后期修改时间。
187、一直超时就很怪
题目6098,别人的就行,我真日了。
188、变量要给初始值
int ans = 0; ++ans;//要这样才行
int ans; ++ans;//一开始这样结果会出错
189、不改变会改变相等元素的顺序
那就是stable_sort,直接用sort就可能存在这个问题。
stable_sort(heights.begin(), heights.end());
190、极限效率bug
我吐了,找了半天的bug,原来问题出在这里。
ans += "null,";
//ans = ans + "null,";//下面这个会超时,因为上面这个效率高一些
191、二分找位置函数 lower_bound()
****lower_bound()返回值是一个迭代器,返回指向大于等于key的第一个值的位置
int i = lower_bound(nums.begin(), nums.begin() + j, nums[j] - mid) - nums.begin();
等效于下面这段代码
int lower_bound(vector<int> nums, int target, int j){
//左闭右闭的写法
int left = 0, right = j;
while(left <= right){
int mid = (right + left) / 2;
int tmp = nums[j] - nums[mid];
if(tmp > target) left = mid + 1;
else right = mid - 1;
}
return left;
}
int i = lower_bound(nums, mid, j);
//注意相等的情况下要right = mid - 1; 因为122227这种情况下,我们要找到的是第一个2。
192、牛客网ACM模式
193、ACM输入函数(另外单独开一篇博客吧)
1、scanf和printf(明天补上)
在另外一篇单独的博客里面。
2、cin和cout
194、 字符串和数字的转换
atoi()字符变数字
to_string()数字变字符串
195、 lletcode每日一题的含金量大幅度下降
我要开始看以前做过的经典题目了
196、不区分大小写的时候,有数字1的情况下会产生错误
牛客题目链接: link
197、isdigit
判断是否为数字
198、 遍历string的时候字符和数字的区别
- 注意字符‘2’和数字2的区别,
直接int a = s[2] - ‘0’; - 注意:stoi(b);//传入的参数必须为字符串