Leetcode刷题总结和心得(6)

  • 20220602开始,在完成了一遍剑指offer之后在进行细化练习。
  • 20220605周赛比较简单,第一次45分钟做对了3题,算是一大进步吧。虽然差距还挺大的。

172、背单词

英语汉语
acumulate总和
iterator迭代器
reverse反转
second第二
intervals间隔、区间
map地图
database数据库
opsoperations操作

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);//传入的参数必须为字符串

199、

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值