刷题疑惑2

Posted xuan01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题疑惑2相关的知识,希望对你有一定的参考价值。

1、整数除法:先转化为unsigned int ;通过逆向乘法,使除数左移至不大于被除数的最左位,再相减;此时的商就是1 左移对应的位数,继续循环判断左移,商 用或 逻辑相加,最终判断此值是否超过          INT_MAX INT_MIN;

2、只出现一次的数字,其余为三次:DFA,有限状态自动机,

3、单词长度的最大乘积:利用位运算,将原string都转化为 二进制位,相同的string则 相与之后不会为0,直接跳过;

4、前n 个数字二进制中1的个数:动态规划+最高有效位、动态规划+最低有效位、n&n-1若为0,则此时最高位为1,且只有一个1;

5、和为0的三个数:排序+双指针,注意去重操作------两层循环中都有判断,下一个数不与上一数相同,再者左指针一直小于右指针,若右指针所在下标已经大于目标值,则缩小右指针;

6、和大于等于target的最短子数组:前缀和判断(得益于数组都是非负整数,具有连续性)、或者 滑动窗口双指针,缩小左指针扩大右指针;

7、乘积小于k的子数组个数:双指针,从左往右遍历,不断累乘,若大于,则不断除去左指针所指的数,并且每次循环都 加上左右指针之间的个数不理解相 减的原理)

8、和为k的连续子数组: 使用unordered_map记录前缀和为 sum-k的键值,利用前缀和的性质,mp[ 0] = 1, i - j 区间和为 : sum[ i]  - k = sum[ j -1 ] 变换得: sum[ i] - k == sum[ j -1];(二刷还是没做出)

9、0和1个数相同的子数组:同上述问题8,将0记为-1,前缀和为0的最大下标差,初始时,mp[ 0] == -1;

10、二维子矩阵的和:使用二维前缀和,利用以(i,j)为下标的二维矩阵和相加减,减去左侧矩阵,上侧矩阵,加上一次以(i-1,j-1)结尾的矩阵数组和;

11、最长不包含重复字符的子串:动规+线性遍历;(三刷 不会);

12、API函数: isalnum:该字符是否包含字母或数字; toupper :转大写; tolower:转小写;

13、回文子字符串的个数:双循环、Manacher 马拉车算法(没看懂)(还没看):

14、含所有字符的最短字符串:滑动窗口 类型 多写写;

15、最多删除一个字符得到回文:有一个方法没通过(问题未解决);

16、链表中环的入口:边界判断条件 看看;

17、重排链表:思路一:线性表,使用vector存储节点,重构链表;思路二:快慢指针寻找链表中点 + 翻转链表后半段 + 合并链表

18、链表两数相加:方法一:翻转链表,循环边界判断条件;方法二:辅助栈使用,逆序相加;两种方法都新建节点构成链表;

19、回文链表:   使用 递归方法,很巧妙; 利用全局一个指针,多写写;

20、扁平化多级双向链表:多写写;dfs递归方法;

21、std::funtion包装类的使用;(41条消息) C++11 function类模板_c++ function模板_xqs_123的博客-CSDN博客

22、srand(unsigned int)time(NULL) :随机数种子, int ran  = random()%100;

23、插入、删除、随机访问都是O(1)的容器:vector和哈希;删除时将最后一个值赋值到删除的下标处;然后再pop_back();

24、最近最少使用缓存:哈希+链表,自己实现链表,该方法多写写,熟练 自己实现链表容器的操作,双端链表;

25、变位词组:使用 排序加哈希 或者 计数法:自建哈希函数,限制于单词长度,学习一下操作方法;

26、字典序排序 规则 : 哈希 + 排序;

27、后缀表达式: 使用栈操作;switch 操作,表达式只能是整形;   

28、小行星碰撞:使用vector操作,设置一个变量,判断行星是否爆炸;while条件判断,

29、直方图最大矩形面积使用单调栈,从左到右记录左边界,从右到左记录右边界;或者一次循环,记录左右边界;二刷的困难题;

30、矩阵中的最大矩形:(二刷题目,没想起来用上题的思路);按层遍历,我单独写一个api接口函数, 就不超时,但是写在一起会超时;官解用的按列遍历 写一起就不超时,不明白为什么

  思路:将矩阵按层遍历,每一行的值相当于上题中的矩形高度,求最大值;

31、往完全二叉树添加节点:使用队列添加节点,左右子树都存在的情况;规定节点的左右孩子均存在时才将它们一起先后压入队列;插入操作时,检查队列头部的节点的左右子节点,插入;

32、二叉树每层的最大值:方法一: dfs、先序遍历,深度与当前vector同样大小就入栈,然后遍历左右子节点,不相等时,比较当前节点和对应深度的已入栈的节点值,取大值;

               方法二:bfs、广度优先遍历、使用队列,先入先出的特性、先设置一个变量 = =当前深度的vector大小,循环出栈并将其子节点入栈;

33、二叉树最底层最左边的值:双端队列+bfs; 先右后左;   dfs遍历,先左后右;也是设置一个变量,记录当前深度,当大于根节点的深度时就开始赋值;赋值情况只会在叶子节点处;

34、二叉树的右侧视图:bfs、按层遍历好写,记录每一层最后一个节点的值;dfs、深度优先搜索、根结点之后,先右后左,当深度与当前vector大小相同时记录节点值;

35、二叉树剪枝:dfs+后序遍历;先处理左右子节点,再处理根节点;

36、子集的数目:递归解决,回溯解决、选或不选   、、或者枚举;(美丽子集的数目、<递推、动规没看>337周赛);这个题的边界判断,再想一想;78. 子集 - 力扣(LeetCode)

37、执行操作后的最大MEX(数组中缺失的最小非负整数):知识点:同余:若(x - y)mod m == 0;则称 x 与 y 对模m 同余,记作 x ≡ y (mod m) ;若为负数,则执行 ( mom); 

   用map记录同余的个数,map的键值范围肯定为 [ 0 ,  m  - 1]; 对于同处于一个类别的每一个数(可以统计为个数),可以变成 i + v、i + 2v、、对于非负整数,从零开始加,并对m取模,

     判断这个类别的数在map中 ,是否能够生成这个数;

38、从根节点到叶子节点的路径数字之和:无返回值的dfs已经能做,有返回值的dfs和bfs还没做;

39、

以上是关于刷题疑惑2的主要内容,如果未能解决你的问题,请参考以下文章

笔试刷题 | 贪心算法

README二叉树刷题框架

javascript console.log() 带来的疑惑

CDQ分治

《软件工程导论》读后感想与疑惑

CAN总线疑惑与解答