力扣&PAT刷题总结(二)

本文探讨了C++11中nullptr的使用优势,包括消除NULL带来的二义性,并介绍了层序遍历的优化方法。还涵盖了常数次遍历思想、字符串操作、KMP算法等内容,展示了如何通过NULL与nullptr的区别提升代码清晰度和效率。
摘要由CSDN通过智能技术生成

①关于NULL&nullptr(C++11):

当涉及空指针判断时,写nullptr可以避免二义性,因此更好

(一)nullptr与NULL的区别

  1. NULL是一个宏定义,C++中通常将其定义为0,编译器总是优先把它当作一个整型常量(C标准下定义为(void*)0),但是也可以被看作整型常量0,所以在函数传参等时容易引起二义性

  2. nullptr是一个编译期常量,其类型为nullptr_t。它既不是整型类型,也不是指针类型。

  3. 在模板推导中,nullptr被推导为nullptr_t类型(是个类似于vector等的类?),仍可隐式转为指针。但0或NULL则会被推导为整型类型。

  4.要避免在整型和指针间进行函数重载。因为NULL会被匹配到整型形参版本的函数,而不是预期的指针版本,除非你传参是nullptr

(二)nullptr与(void*)0的区别

  1. nullptr到任何指针的转换是隐式的。(尽管nullptr不是指针类型,但仍可当指针使用)

  2.(void*)0只是一个强制转换表达式,其返回void*指针类型,只能经过类型转换到其他指针才能用。

②层序遍历中严格一层层地来遍历的经典处理:

 
③常数次遍历的处理思想:

       也就是说,往往这种从O(n2)的复杂度优化到O(n)形式,也就是修正为常数次遍历的处理,都是集中于“变化”来看的;O(n2)的处理,更像是枚举所有的情况种类,但是每一种情况都要重新计算它的值;而O(n)的处理,是先通过一次遍历得到一个“基准值”,然后在第二次遍历中,对于每个分割点所引起的变化,不断在基准值的基础上更新值的大小——也就是O(n2)是重新计算,而O(n)是借助前人来作微调

④一些杂碎的整理:

(1)s.substr(起始位置下标,长度)返回一个临时值,也就是右值

(2)初始化max&min一类的参量的便捷方法--INT_MAX&INT_MIN&LONG_MAX&LONG_MIN&LLONG_MAX&LLONG_MIN

(3)位运算的优先级要低于四则运算!!!!!!!!于是在使用位运算来进行更快捷的除以2的运算时,这样写是不符合预期结果(先除以2再加left)的:

于是第761行应当修改为:

int q=((right-left)>>1)+left;

(4)二分寻找插入位置时的初始化技巧:(如果比所有的都大就插在最右边)

ans初始化位置位于最右侧的好处即是当寻找不到比它大的元素时,能够正好插入到最右侧

(5)std::accumulate:头文件<numeric>,同样地,除了标准库容器,普通数组也可以使用:

vector<int>arr{1,2,3};
std::accumulate(arr.begin(),arr.end(),0);

int arr[3]={1,2,3};
std::accumulate(arr,arr+3,0);

(6)好活:生成每种字符都是奇数个的字符串:

 (7)隐式贪心思想:

在柠檬水找零的过程当中,很明显5块的比10块的更有用,因此优先花出去10块的思想,就是贪心思想:



⑤KMP:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值