c++
LNGOD
寻找一流人才的聚集地
展开
-
宏函数
宏函数首先它是一种宏,然后它是一种类似于函数的宏,但它与正规函数不同的是,正规函数生成的是汇编代码,而宏函数生成的是高级编程语言。因此,宏函数在使用时总会有与直观不符的情况。 OK,下面我们来看一个例子:(来自于《程序员面试宝典》)#define SUB(x,y) x-y#define ACCESS_BEFORE(element,offset,value) *SUB(&elemen...原创 2018-07-03 10:00:04 · 2460 阅读 · 0 评论 -
汇编器和链接器的区别
1.2程序被其它程序翻译成不同的格式 hello程序的生命周期是从一个源程序(hello.c)(称为高级c语言)开始,被其它程序转化为一系列的低级机器语言指令,这些指令按照一种称为可执行目标程序的格式打包好,以二进制磁盘文件的形式保存。 例:unix> gcc -o hello hello.c可以实现源文件向目标文件的转化,该过程由编译程序完成。 hello.c —-&g...原创 2018-07-10 22:31:15 · 2327 阅读 · 0 评论 -
LeetCode 115 Distinct Subsequences
题目如下:Given a string S and a string T, count the number of distinct subsequences of T in S.A subsequence of a string is a new string which is formed from the original string by deleting some (can b...原创 2018-07-17 14:58:58 · 155 阅读 · 0 评论 -
leetcode 632. Smallest Range
今天做了一到算法题 You have k lists of sorted integers in ascending order. Find the smallest range that includes at least one number from each of the k lists.We define the range [a,b] is smaller than range ...原创 2018-07-04 23:54:07 · 234 阅读 · 0 评论 -
多重继承的优缺点
C++阵营中有两派:一种是认为多重继承不好用,一种认为多重继承好用。实际上,多重继承有时候效果比单一继承更好,但是比较复杂;如标准库的iostream实际就是一个多重继承得到的类。 多重继承的特点 在继承树只有一层的情况下,多重继承几乎等同于按顺序单一继承了若干个类。但是,在继承树比较长的情况下,多重继承的情况会很复杂。 1. 多重继承的类分为public、private、protecte...原创 2018-07-04 23:56:44 · 1947 阅读 · 0 评论 -
leet code 416. Partition Equal Subset Sum
Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.Note: Each of the array eleme...原创 2018-07-11 21:28:58 · 168 阅读 · 0 评论 -
leetcode 130. 被围绕的区域
这道题我用的逆向思维法,用DFS判断和边上’O’连接的’O’,然后将他们标记为星号,标记完全部之后,再遍历一次数组,将’O’换为‘X’,’*‘换为O,即可完成。 这个算法可圈点的地方在于,DFS用的是栈实现的,以前实现DFS总是用递归,没想过非递归如何实现,如今又是一个进步。不过我很奇怪为什么我第一次用同样思路,但是用BFS写的算法会超时,有大神帮我看一下吗? DFS 20msstruc...原创 2018-07-17 23:42:08 · 905 阅读 · 0 评论 -
leetcode 671. Second Minimum Node In a Binary Tree
Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactly two or zero sub-node. If the node has two sub-nodes, then this node’s va...原创 2018-07-05 21:51:30 · 192 阅读 · 0 评论 -
leetcode 137. 只出现一次的数字 II
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?这种纯数字计算的问题,如果我们只用加减乘除就能做出来,那leetcode就太low了,这种问题,应该深入到位级别运算。 思考,将int数分为32位,那么按该题的要求,这32位的每一位,所出现过的数目必定是3N或3...原创 2018-07-18 16:36:51 · 1672 阅读 · 0 评论 -
sizeof() 类大小,空类大小
一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小.首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于...转载 2018-07-10 22:25:13 · 258 阅读 · 0 评论 -
leetcode 667. Beautiful Arrangement II
Given two integers n and k, you need to construct a list which contains n different positive integers ranging from 1 to n and obeys the following requirement: Suppose this list is [a1, a2, a3, … , a...原创 2018-07-10 21:25:25 · 174 阅读 · 0 评论 -
typedef和*的混合应用
今天看大了一个而有趣的语法,typedef int,INTR,*PINTR; 我很费解,PINTR到底是个什么类型?如果它是int*,星号不应该紧跟写在int的后面吗?于是做了几个小小的测验。typedef int NIU,*LEI;int a;NIU num=a;//正确NIU num=&a;//错误,int*无法转换为int类型LEI num=a;//错误,int无法转换...原创 2018-07-10 18:36:49 · 608 阅读 · 0 评论 -
leetcode 413. Arithmetic Slices
A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.For example, these are arithmetic sequence:...原创 2018-07-09 22:40:27 · 158 阅读 · 0 评论 -
STL源码剖析之vector
vector容器概述 vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,...原创 2018-07-09 23:46:03 · 114 阅读 · 0 评论 -
如何将交换两个数并且不使用任何中间变量
方法一: a=a+b; b=a-b; a=a-b; 证明:b=a+b-b=a; a=a+b-b=a+b-a=b; 该方法的缺点是如果a和b都是比较大的数,a=a+b的时候就会溢出。方法二: a=a^b; b=a^b; a=a^b; 证明:异或具有对称性,假如a=a^b^b;相当于a=a;所以b=a^b^b=a;a=a^b^a=b; 异或的对成性即是连续异或两个相同的数相...原创 2018-06-27 23:03:33 · 642 阅读 · 0 评论 -
c++的对象模型探测(一)
面向对象编程的时候总会好奇,成员变量存放在哪里,成员函数存放在内存的哪里,static变量又存放在哪里?都是在声明的object里吗?通过阅读《深度探索C++对象模型》,该类的问题都能找到答案。 C++的设计者从简至繁是提出过几个对象模型,我在此一一介绍: 简单对象模型 第一个模型十分简单,它最大地减低了C++编译器的设计复杂度,但牺牲了空间和执行期的效率。在这个简单模型中,一个object...原创 2018-06-27 23:19:33 · 191 阅读 · 0 评论 -
template元编程初识
今天在阅读effective c++这本书的时候,接触到了TMP即模板元编程这个知识点,真心觉得发现了新大陆一样。 TMP是编写template-based C++程序并执行于编译器的过程,它可以将程序的执行从运行期转移到编译期,也就是说,编译完成之后,即可得到你想要的结果!很多传统编程做不到的事情,只有TMP可以实现,而且本来运行期才能发现的错误,也可以提前在编译期就被发现,TMP的发展,将是...原创 2018-06-27 23:34:59 · 198 阅读 · 0 评论 -
C++的显式类型转换
C++的显式类型转换共分为四种: static_cast 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_castint i=10;double f=static_cast<float>(i);int *p=&i;double *q=static_cast<float*>(p);其他的类型转换类似了,只要不是转换底层c...原创 2018-06-28 00:23:29 · 544 阅读 · 0 评论 -
C++默认实参
默认实参就是函数里参数的缺省值,但是C++使用默认实参也不是随意的,需要遵守一定的顺序规则。void set(string name="niulei",int age=24,string sex="man"){}//通过这就是默认实参void set(string name="niulei",int age,string sex="man"){}//报错void set(st...原创 2018-06-28 00:48:01 · 1188 阅读 · 0 评论 -
operator new和placement new
(1)new expression :不能被重载,其行为总是一致的。它先调用operator new分配内存,然后调用构造函数初始化那段内存。new 操作符的执行过程: 1. 调用operator new分配内存 ; 2. 调用构造函数生成类对象; 3. 返回相应指针。(2)operator new:要实现不同的内存分配行为,应该重载operator new,而不是new。ope...原创 2018-07-10 15:42:31 · 205 阅读 · 0 评论 -
论空间换时间
在解决算法问题的时候,空间换时间是最容易看的到,也容易达到效果的一种手段,那么下面就来总结一下有哪些情况可以用来空间换时间。 1.双重循环。 复杂度是O(N)*O(M)for(auto i:vector1) for(auto j:vector2) if(j==i) ...这种情况就可以把vector1里的数存到一个unordered_set里,这...原创 2018-07-06 23:55:43 · 1360 阅读 · 0 评论 -
leetcode 188 Best Time to Buy and Sell Stock IV
Best Time to Buy and Sell Stock IV Description: Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complet...原创 2018-07-13 23:22:21 · 227 阅读 · 0 评论 -
C++常用设计模式介绍
1.观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都要得到通知并自动更新。 主要解决:一个对象更新,其它对象也要更新。 如何解决:目标类通知函数通知所有观察者自动更新。 关键代码:在目标类中增加一个ArrayList来存放观察者们。//数据模型为目标类,视图为观察者类。当数据模型发生改变时,通知视图类更新clas...原创 2018-07-21 18:05:16 · 1363 阅读 · 0 评论 -
leetcode 365. 水壶问题
题目: 有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。你允许:装满任意一个水壶 清空任意一个水壶 从一个水壶向另外一个水壶倒水,直到装满或者倒空这道题的解法在于证明Z可以被X和Y的最大公倍数整除,下面是该定理的证明:假设最终体积z = m *...原创 2018-08-01 23:03:28 · 1281 阅读 · 2 评论 -
leetcode 363. 矩形区域不超过 K 的最大数值和
题目: 给定一个非空二维矩阵 matrix,和一个整数 k,找到这个矩阵中矩形区域不超过 k 的最大数值和。示例:给定 matrix = [ [1, 0, 1], [0, -2, 3] ] k = 2 结果是 2,因为矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。这道题是最大矩形面积问题的一个变种,我...原创 2018-08-02 00:21:19 · 2999 阅读 · 4 评论 -
数字中找前K大/小的元素的几种方法
方法一:根据快速排序划分的思想 :(1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 ; (2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。 注意[a,b)区间不用划分 ;因为[a,b)区间一定小于(b,d]区间;(3) 返回上一个区间,并返回此区间的数字数目。 如果个数大于100,对(b,d]重复...原创 2018-08-06 23:37:14 · 953 阅读 · 0 评论 -
程序的链接的三种方式
程序的链接有以下三种方式: 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。 装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,釆用边装入边链接的链接方式。 运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接。其优点是便于修改和更新,便于实现对目标模块的共享。内存的装入模块在装入内...原创 2018-08-06 23:49:06 · 14512 阅读 · 2 评论 -
leetcode 423. 从英文中重建数字
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9。按升序输出原始的数字。注意:输入只包含小写英文字母。 输入保证合法并可以转换为原始的数字,这意味着像 “abc” 或 “zerone” 的输入是不允许的。 输入字符串的长度小于 50,000。 示例 1:输入: “owoztneoer”输出: “012” (zeroonetwo) 示例 2:输入: “f...原创 2018-08-11 15:17:17 · 1327 阅读 · 0 评论 -
前缀树
前缀树的功能很强大,比如有一个字符串数据,我们要从查找其中以“hell”开头的,或者以”ive”结尾的字符的个数等等操作。我们只需要在定义前缀树的时候加上相应得数据项就OK了。下面来简单通俗易懂的解释一下前缀树。假设刚开始我们,有一个空节点,现在我们有一个操作,往这个空的节点上insert字符串“abc”, 那么我们按照下面的步骤insert:process: 1、首先看当前节点有没有指向...原创 2018-08-17 23:03:25 · 817 阅读 · 0 评论 -
leetcode 440. 字典序的第K小数字(精)
题目: 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。注意:1 ≤ k ≤ n ≤ 109。示例 :输入: n: 13 k: 2输出: 10解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。 解题思路: 艰难的一题,从昨晚9点开始脑子就一直在想这道题的做法...原创 2018-08-13 22:30:55 · 9752 阅读 · 1 评论 -
策略模式与工厂模式的区别
定义:工厂模式的思想主要为:多个类似的子类继承同一个父类,对其父类中的变量进行操作;工厂类负责判断、控制哪个子类被执行,而工厂类调用子类完成后,返回的结果是该子类的父类,该父类中的变量已经被操作过了,访问该父类,得到我们想要的结果。 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。在软件开发中也常常遇到类似的情...原创 2018-08-17 11:23:13 · 3326 阅读 · 0 评论 -
红黑树与AVL树的比较
AVL是严格的平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多;红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低开销;所以简单说,如果你的应用中,搜索的次数远远大于插入和删除,那么选择AVL树,如果搜索,插入删除次数几乎差不多,应选择红黑树。即,有时仅为了排序(建立-遍历-删除),不查找或查找次数很少,R-B树合算一些。红黑树与AVL树的调整平衡的实...原创 2018-08-10 13:50:47 · 1164 阅读 · 0 评论 -
STL的lower_bound和upper_bound
先贴代码 STL的二分查找的精巧体现在它用len而不是end来进行二分操作,这样可以用移位操作代替除2操作。以提高速度。STL中lower_bound和upper_bound的区别在于,lower_bound将mid元素等于target的情况与大于的情况归为一类,因此它会在等于target的这个区间尽量向左找,最终找到的自然是&gt;=target的第一个数值。而upper_bound则将m...原创 2018-08-05 17:56:43 · 218 阅读 · 0 评论 -
leetcode 417. 太平洋大西洋水流问题
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。提示:输出坐标的顺序不重要 m 和 n 都小于150一道DFS的变种题,这种题...原创 2018-08-09 17:09:46 · 1705 阅读 · 0 评论 -
VISUAL C++根据父窗口变化调整控件大小
如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽 控件是从CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()来改变其大小,应在父窗口的WM_SIZE消息中使用MoveWindow()来进行调整。VC++之根据对话框大小调整控件大小 1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小; 2...原创 2018-07-26 22:40:12 · 701 阅读 · 0 评论 -
[leetcode] 375. Guess Number Higher or Lower II 解题报告
题目链接: https://leetcode.com/problems/guess-number-higher-or-lower-ii/We are playing the Guess Game. The game is as follows:I pick a number from 1 to n. You have to guess which number I picked.Eve...原创 2018-08-03 16:50:42 · 130 阅读 · 0 评论 -
leetcode 386. 字典序排数
给定一个整数 n, 返回从 1 到 n 的字典顺序。例如,给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。这道题直观的想法是,建一个vector<int>,和一个vector<string>,int转换到string,排序后...原创 2018-08-03 21:02:54 · 1761 阅读 · 0 评论 -
记编程之美的一道经典问题,最长上升子序列问题。
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。这个问题,是我在刷leetcode的时候碰到的,我一回想,在编程之美上遇到过,果断翻开手机的PDF,按上面的方法一步步码出了我的代码。 编程之美的思路分三步: 1.提出最基本的算法 ...原创 2018-07-22 22:48:10 · 801 阅读 · 0 评论 -
auto_ptr和shared_ptr的区别
标题中提到的auto_ptr和shared_ptr以及unique_ptr都是智能指针,其中auto_ptr是C++98提供的解决方案,后两个是C++11提供的另外两种解决方案。智能指针是行为类似于指针的类对象,但我们一般用他们来管理动态内存分配的智能指针模板。智能指针模板都定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象,当智能指针过期时,其析构函数将使用delet...原创 2018-07-22 23:02:53 · 3176 阅读 · 1 评论 -
为什么要把父类的析构函数设置为virtual
如果我们想通过基类的指针去释放子类的对象(这里必须是new出来的对象),就需要基类将基类的虚函数设置为virtual,看下面的例子:#include<iostream>using namespace std;class Parent{private: int m_a;public: Parent(int a = 0) { th...原创 2018-07-30 23:15:26 · 970 阅读 · 0 评论