const char*、char const*、char* const 的区别

2021年2月1日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. const char* 和 char const* 等价2. const char* 和 char* const 区别1. const char* 和 char const* 等价C++标准规定,const关键字放在类型或变量名之前是等价的,因此const char*和char const*是等价的。const char *p; //same as belowchar const *q; 2. co
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

printf(str) 和 printf(str,%s) 的区别

2021年2月1日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】printf(str): 由于printf支持可变参数,所以后续变量的个数就需要通过str中的格式化串来确定。当str串中包含%s,%d,%c等格式化串时,printf就会去栈中找这个格式化串对应的变量,但实际上,根本没有向printf压入更多的参数,因此就会出现打印失败或者程序崩溃的现象,如下图所示:因此,在写代码的时候,一定不要用printf(str),老老实实使用printf(str,%s)。参考文献https://
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指offer 52. 两个链表的第一个公共节点(彼此走对方走过的路,就能一起到达终点!)

2021年02月02日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】解题思路:侧面分析:从整体上把握,自己的路走完之后,就去走对方的路,当第二次走到终点的时候,两个人就都走了M+N步,倒推回去,则两个人第一次相遇的点即为所求。直接分析:当第二个人到达终点时,第一个人刚好走完了两者之差,所以后面再一起走的话,就会在第一个公共点处相遇了。class Solution {public: ListNode *getIntersectionNode(ListNode *headA, Lis
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 53 - I. 在排序数组中查找数字 I(二分查找变形,也就是手撸 lower_bound()、upper_bound())

2021年02月04日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 lower_bound 结合 upper_bound2.2 手撸 lower_bound()、upper_bound()参考文献1. 题目简介剑指 Offer 53 - I. 在排序数组中查找数字 I2. 题解2.1 lower_bound 结合 upper_boundlower_bound(): 返回 第一个大于或等于target 的元素位置,都小于的话返回 end()u
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 56 I. 数组中数字出现的次数(异或)

2021年02月06日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解参考文献1. 题目简介剑指 Offer 56 - I. 数组中数字出现的次数2. 题解如果只有一个数字只出现一次,那就很好办了,所有的数字异或起来,就是这个数字。但是有两个怎么办呢?下面给出解析。首先,异或满足交换律。第一步:所有数异或,相同的数都抵消了,剩下两个不同的数。这两个数异或的结果肯定至少有一位是1,不然都是0的话这两个数就是相同的了。通过逐位 & 操作找到其中
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 56 II. 数组中数字出现的次数 (位运算综合)

2021年02月06日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解参考文献1. 题目简介剑指 Offer 56 - II. 数组中数字出现的次数 II2. 题解如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 58 - I. 翻转单词顺序(双指针;多次翻转)

2021年02月07日 周日 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 开辟一个新数组,从后往前迭代2.2 空间复杂度为 O(1)的解法:先整体翻转,再局部翻转参考文献1. 题目简介剑指 Offer 58 - I. 翻转单词顺序2. 题解2.1 开辟一个新数组,从后往前迭代这种方法思路相对简单,代码比较容易实现,缺点就是需要开辟一个新的数组,空间复杂度为 O(n)。class Solution {public: string reve
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 59 - I. 滑动窗口的最大值(单调队列的典型应用)

2021年02月08日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 单调队列的应用参考文献1. 题目简介剑指 Offer 59 - I. 滑动窗口的最大值2. 单调队列的应用暴力法比较简单,但是时间复杂度为 O(nk),这里就不介绍了,说一下借助单调队列的解法,时间复杂度为 O(n)。总结来说就是:维护一个单调队列,队头为最大元素。维护的方式就是,队列中小于当前值的元素都弹出,然后把当前值加入队列。注意上一次最大元素可能是滑窗的首端,根据这个条件判断是否
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫问题:数学方法;模拟法)

2021年02月09日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 约瑟夫问题2. 题解2.1 计算索引法(超时)2.2 数学解法参考文献1. 约瑟夫问题剑指 Offer 62. 圆圈中最后剩下的数字本题就是著名的约瑟夫问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。2. 题解2.1 计算索引法(超时)这种方法就是用数组模拟整个过程,核心思路是计算下一个待删除数的索引: idx = (idx
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

关于C/C++是否支持定义不定长数组

2021年02月10日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】事实上,不定长数组的定义早在C的C99标准里就已经被提出,但是从来都没在C++标准(C++98、C++03、C++11)里存在过。因此,G++支持不定长数组完全是因为它同时支持C99和C++(对C99标准支持得最好的就是G++了),而VS不怎么支持C99标准那是人尽皆知的,也就理所当然不支持C99的不定长数组了。另外Turbo C 3.0不支持是因为它非常古老,本身就不支持C99。PS:目前没有编译器可以完全实现C99,而且为
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 65. 不用加减乘除做加法(位运算的应用)

2021年02月10日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介剑指 Offer 65. 不用加减乘除做加法2. 题解把 a+b 转换成 非进位 + 进位,因为不能用加法,所以要一直转换直到第二个加数变成0。这时,第一个加数就是最终结果。class Solution {public: int add(int a, int b) { // 当第二个加数 b 变成0时,第一个加数 a 就是最终结果
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 66. 构建乘积数组(左右开弓)

2021年02月11日 周四天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介剑指 Offer 66. 构建乘积数组2. 题解图源 Krahets ,侵删。如上图,可以用两轮循环,第一轮计算左下角的乘积,第二轮计算右上角的乘积,再乘以左下角乘积,就得到了最终结果。当然,也可以一轮计算解决问题,方法就是 左右开弓 ,同时计算左边和右边的乘积值,一轮循环解决问题。代码如下:class Solution {public: vect
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 68 - II. 二叉树的最近公共祖先(后序遍历 DFS)

2021年02月11日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 后序遍历 DFS参考文献1. 问题简介剑指 Offer 68 - II. 二叉树的最近公共祖先2. 后序遍历 DFS二叉树的后序遍历,分情况进行讨论,具体看注释,解释的比较清楚。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *
分类: 其他 发布时间: 03-31 09:53 阅读次数: 0

剑指 Offer 19. 正则表达式匹配(动态规划)

2021年02月11日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 动态规划参考文献1. 问题简介剑指 Offer 19. 正则表达式匹配2. 动态规划这道题还是非常有难度的,我是直接看这位大佬的题解,感觉只要花点时间仔细琢磨一下,思路还是可以捋清楚的,下面是代码:class Solution {public: bool isMatch(string s, string p) { int m = s.size();
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0

剑指 Offer 37. 序列化二叉树(前序遍历,后序遍历,层次遍历)

2021年02月12日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解2.1 前序遍历(或后序遍历)2.2 层序遍历参考文献1. 问题简介剑指 Offer 37. 序列化二叉树2. 题解2.1 前序遍历(或后序遍历)前序遍历在反序列化时应用递归比较简单,后序遍历在反序列化时,可以从后往前遍历,顺序就变成了 “根—>右—>左”,代码上和前序遍历只是略有区别。而中序遍历得到的二叉树不唯一,不能保证反序列化的二叉树为原来的树,如下图所示。图源
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0

剑指 Offer 51. 数组中的逆序对(归并排序的应用)

2021年02月12日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介剑指 Offer 51. 数组中的逆序对2. 题解做这道题之前要对归并排序掌握的十分熟练,这里推荐 图解排序算法(四)之归并排序,借助图解能够非常快速的理解归并排序的内涵。熟练掌握归并排序后,再仔细看下leetcode上 superkakayong 大佬的题解,这道题的解题思路也就比较清晰了。之后就是按照思路,一步步写出代码。由思路构建代码的过程一定充满了艰辛,但
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0

剑指 Offer 67. 把字符串转换成整数(情况复杂,考虑仔细)

2021年02月12日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 情况复杂,考虑仔细参考文献1. 问题简介剑指 Offer 67. 把字符串转换成整数2. 情况复杂,考虑仔细情况比较复杂,需要考虑周全,不多说了,直接看大佬的题解吧 面试题67. 把字符串转换成整数(数字越界处理,清晰图解)class Solution { public: int strToInt(string str) { int res = 0
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0

++i 和 i++ 是否为原子操作?

2021年02月22日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 操作系统的原子操作2. 从汇编代码看 ++i 和 i++ 是否为原子操作3. 常见问题:进程有一个全局变量i,还有两个线程。i++ 在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?3.1 多核CPU最小值为2,最大值2003.2 单核CPU最小值为100,最大值200参考文献1. 操作系统的原子操作原子操作是不可分割的,在执行完毕前不会被任何其它任务或事件中断:在单线程中, 能够在单条指令
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0

++i 和 i++ 的实现(自定义MyInt类模拟)

2021年02月22日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】用MyInt类实现 ++i 和 i++。class MyInt{public: int value; //实际的value值 MyInt(int value){ //方便初始化:MyInt i = 0; this->value = value; } /** * 重写前置式++运算符(++i时会自动调用本函数)
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0

IEEE 浮点表示(二进制浮点表示)

2021年02月23日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. IEEE 浮点表示——概念2. IEEE 浮点表示——示例参考文献1. IEEE 浮点表示——概念2. IEEE 浮点表示——示例参考文献《深入理解计算机系统》第三版...
分类: 其他 发布时间: 03-31 09:52 阅读次数: 0