- 博客(53)
- 资源 (2)
- 收藏
- 关注
转载 两道有趣的fork题
http://wenku.baidu.com/link?url=vP--ONvZRBvscgRIe7sn08HqizYzNzIjOthFbATlgruCmL1EX3VneG1Q7w37DvWoH6QTMYCvMewGJnjimTLffQ7XSIOsS6w73K7Bh46isG3
2016-09-01 16:03:59
414
原创 C++删除不完全类型数组
看智能指针的时候遇到一组函数蛮有意思的,即checked_delete(T* x)和checked_array_delete(T* x),这两个函数的作用是安全删除参数所指向的变量或数组。template inline void checked_delete(T* x){ typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
2016-03-17 00:18:48
783
原创 Effective C++笔记(六)
条款41:区分继承和模板"当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。"条款42:明智地使用私有继承”当私有继承是你可以使用的最合适的实现方法时,就要大胆地使用它。同时,广泛意义上来说,分层是应该优先采用的技术,所以只要有可能,就要尽量使用它。“条款43:明智地使用多继承不正确
2015-11-04 09:45:42
425
原创 LeetCode——Search a 2D Matrix II
这题《剑指offer》上有,可以从左下角开始搜索,根据当前值与目标值的关系决定向右走还是向上走,用二分搜索更快。知道了这个思路就很容易AC了,但如何优化效率是个问题。我很奇怪这题居然是用Java的普遍运行需时更短,几十毫秒甚至十几毫秒,用C的却普遍在100ms左右,C++就更慢了~
2015-11-02 20:48:44
347
原创 LeetCode——Peeking Iterator
先自己写了个简单粗糙的,然后又看了提示中给的参考答案,模仿着写了一个// Below is the interface for Iterator, which is already defined for you.// **DO NOT** modify the interface for Iterator.class Iterator { struct Data; Data*
2015-11-02 20:30:54
420
原创 Effective C++(四)
条款25:避免对指针和数字类型重载因为0既可以是一个整型值,也可以是空指针。条款26:当心潜在的二义性二义性当然要避免,本条款强调的是“潜在”二字。很多时候,二义性会隐藏得很深,所以要尽可能地小心。条款27:如果不想使用隐式生成的函数就要显示地禁止它有些函数,当你没有声明定义它们时,编译器会自动为你生成,但它们是基于默认语义的,所以如果这不是你想要的,就需要显示
2015-11-02 19:48:35
336
原创 Effective C++笔记(三)
条款18:争取使类的接口完整并且最小接口要完整毫无疑问,最小也好理解,本来一个接口可以完成的事,非要写一百个接口,不是浪费人力嘛~其实作者强调的是,接口小,用户容易理解,不容易混淆,且容易维护。
2015-11-01 00:00:10
290
原创 LeetCode——H-Index II
用得二分查找,但似乎还有更好的方法,没来得及琢磨。class Solution {public: int hIndex(vector& citations) { int n = citations.size(), result = 0;; int low = 0, high = n-1, mid = low/2+high/2;
2015-10-30 16:53:31
324
原创 LeetCode——H-Index
这题简单点就先对数据进行基于比较的排序,时间复杂度O(nlogn),空间复杂度O(1);如果想把时间复杂度将为O(n),就使用基数排序,但空间复杂度上升为O(n)。class Solution { public: int hIndex(vector &citations) { int n = citations.size(); int *num = ne
2015-10-30 14:26:15
449
原创 LeetCode——Minimum Path Sum
这题和Unique Path条件一样,每次只能向右走一格或向下走一格,因此思路也差不多,只不过本题不是把这两格的值加起来,而是选取较小的值,因为要求最小值。class Solution {public: int minPathSum(vector>& grid) { int row = grid.size(), col = grid[0].size(
2015-10-29 23:59:17
304
原创 Effective C++笔记(二)
条款9:避免隐藏标准形式的new在类里声明了一个带多个参数的operator new函数后,就无法以标准形式调用operator new,因为全局的operator new函数被成员函数遮蔽了。条款10:如果写了operator new就要同时operator delete这两个函数是成对使用的,它们之间要遵循一些共同的约定,如果重写了其中一个而不重写另一个,它们之间就难以保证
2015-10-29 17:20:07
331
原创 LeetCode——Unique Path
想知道从某个格子出发到达目标格子有多少种不同的路径,就需要知道其右边的格子和下边的格子到达目标格子有多少种不同的路径,然后相加即得总的路径数。但要知道其右边的格子和下边的格子到达目标格子有多少种不同的路径,又要如此递归下去。为了简化计算,采用自底向上的思想,想到达右下角的格子,就要先到达这个格子的上边或左边,知道了这两个格子到达目标格子的不同路径数,其和就为同时与这两个格子相邻的那个格子到达目标格
2015-10-29 00:20:00
412
原创 Effective C++笔记(一)
条款1:尽量使用const和inline而不要使用#defineC++从C继承来古老的预处理器,遗留了不少问题。预处理器更像是文本处理器,并不具有太多智能,编译器无法对预处理器的功能作过多检查和保障。过于依赖预处理器,就难以享受到编译器的强大智能。因此应该尽量使用编译器提供的机制,少用预处理器的功能。条款2:尽量使用而不是简单来说,就是比更新更高级,考虑的更多更全面,例如类
2015-10-28 17:44:29
361
原创 LeetCode——Missing Number
这道题的思路是将其转化为Single Number那道题,将原数组与0...n这n+1个数合并成一个新数组,是不是就是Single Number这道题了?当然,本题要求常数空间复杂度,不必合成一个新数组,迭代计算就可以了。class Solution {public: int missingNumber(vector& nums) { int
2015-10-28 14:53:38
333
原创 LeetCode——Product of Array Except Self
本题要求是不使用额外空间,但保存输出结果的空间是必须要有的,此空间不计入空间复杂度,因而我们可以利用这部分空间存储中间结果。先看代码:class Solution {public: vector productExceptSelf(vector& nums) { vector output; int curren
2015-10-28 10:39:00
311
原创 LeetCode——Single Number II
这道题有两种思路吧,一种是针对这道题的特定思路:class Solution {public: int singleNumber(int A[], int n) { int one=0, two=0, three=0; for(int i=0; i<n; i++){ two |= one&A[i]; on
2015-10-28 00:02:48
469
原创 LeetCode——Single Number III
Single Number III和Single Number都可以用异或做,当然这题的难度要更大些。基本思想是,数组中仅有两个数只出现一次,如果我们能把这两个数分到两组,使每组除了一个数字只出现一次,其余数字都出现两次,则题目转换为Single Number。为了达到这个目的,需要用一个数来区分这两个数字。我们可以这样做:先把数组中所有的数异或,根据异或的性质,(n ^ a) ^ a ==
2015-10-27 17:12:25
368
原创 hlist_head/hlist_node
这是Linux内核代码中常用的哈希链表的结构体定义。第一个结构体存放链表头指针,first指针指向一个由hlist_node节点组成的链表,声明一个struct hlist_head数组,每个元素都指向一条链表,就形成了一个哈希表中的很多哈希桶,类似于图的邻接表。struct hlist_node结构体中有前驱指针和后继指针,但不同于其他的数据结构,前驱指针并不是指向前一个节点,而是一个二级指
2015-10-26 22:38:48
770
转载 struct net
1 /* 2 * Operations on the network namespace 3 */ 4 #ifndef __NET_NET_NAMESPACE_H 5 #define __NET_NET_NAMESPACE_H 6 7 #include asm/atomic.h> 8 #include linux/workqueue.h> 9 #include
2015-09-17 15:10:01
964
原创 博文转载
http://www.cnblogs.com/felixfang/p/3814463.htmlhttp://blog.youkuaiyun.com/hcbbt/article/details/10454947http://www.cnblogs.com/zzzdevil/p/3651168.html
2015-07-31 15:34:53
1543
原创 LeetCode——Linked List Cycle II
若同时从一个环的某个点出发,fast指针每次走两步,slow指针每次走一步,则可证明slow指针走回起点时,fast指针也恰好到达起点。两种思路:一、fast指针每次比slow指针多走一步,fast指针想与slow指针同时到达某点,必须超过slow指针一圈,每次多走一步,假设环的节点数为N,则多走一圈需要走N次,此时slow指针恰好走完一圈指向出发点,fast指针亦然;二、fast指针的速度是sl
2015-07-22 16:54:45
483
原创 LeetCode——Word Break
class Solution {public: bool wordBreak(string s, unordered_set& wordDict) { int len = s.size(); if(len == 0) return false; set tmp; for(int i = 0; i < len; ++i) {
2015-07-09 15:11:34
315
原创 LeetCode——Count Complete Tree Nodes
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas
2015-07-09 15:07:44
446
原创 堆排序
堆是一种完全二叉树,分为小根堆和大根堆。大根堆中任意节点的值都不大于其父节点的值。有些类似于二叉搜索树,都是要求父节点和子节点的值满足某种关系。 堆排序的基本思想是,先用所给数据建立大根堆,堆顶元素即为最大值,将其与最后一个元素交换,此时最后一个元素为最大值;再对最大值之前的元素进行调整,使其恢复为大根堆。再如此将次大值取出排列在最大值之前,循环往复,直到所有元素都排好序。
2015-07-08 20:25:48
397
原创 Bitwise AND of Numbers Range——LeetCode
class Solution {public:/*mask的32位全为1,mask*/ int rangeBitwiseAnd(int m, int n) { int i = 0, mask= ~0; while ((m & mask { ++i
2015-06-29 23:50:02
333
原创 Best Time to Buy and Sell Stock——LeetCode
原题地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ 内容都在代码和注释里,就不罗嗦了。class Solution {public: int maxProfit(vector& prices) { /* 这类题目已经遇到过几次,都是要在一维数组中
2015-06-24 21:23:26
459
原创 Search in Rotated Sorted Array——LeetCode
这道题在LeetCode上是Hard类的,首先声明,代码是别人的,我只是解释一下。class Solution {public:/*如果数组是有序的,那么大家都会想到并使用二分搜索,但本题设置了这样一个障碍:数组是rotate过的。这样,原先有序的数组就变成了局部有序:(假设)分为两个有序的子数组,并且左边子数组中的元素都大于右边子数组中的元素。这时,采用二分搜索,需要判断数组nu
2015-06-24 21:01:08
363
原创 boost并发编程(三)——共享互斥量
前一篇介绍的条件变量可以进行进程间通信,用来实现生产者/消费者模型。今天介绍的共享互斥量用来实现缓冲区读写模型,与生产者/消费者模型不同的地方是,消费者消费产品后,被消费的产品就不存在了,所以消费者线程也要互斥运行;而缓冲区读取线程读取数据后不删除数据,多个线程可以并行读取。这时使用条件变量也不合适了,就要使用共享互斥变量了。 共享互斥量,顾名思义,既共享,也互斥,读线程之间共享
2015-06-17 23:40:17
1501
原创 boost并发编程(一)——互斥锁
这个系列其实是《Boost程序库完全开发指南》的读书笔记。按照书中的方法代码没跑起来,所以转到Ubuntu下学习了。boost库在Ubuntu下的安装,直接用apt-get install命令安装就可以了,需要安装libboost-dev libboost-system libboost-thread 我们直接上代码,通过讲解代码来学习。一方面,更详细的内容请参看原书,在此不作重
2015-06-16 23:23:30
3033
原创 gas station-Leetcode
这题还是比较有意思的,会用到一些结论和性质,代码并不复杂。自己懒得写证明了,转载了别人的文章。 主要利用的性质就是:1.如果∑gas[i] >= ∑cost[i],则一定存在解,且题目保证解唯一;2.若在某个区间上,∑gas[i] 第一个性质的大概证明(并非严格的数学证明)请看转载的这篇文章:http://blog.youkuaiyun.com/hh794362661/
2015-06-12 16:15:53
387
原创 Excel Sheet Column Number -LeetCode
这题是真的简单了,分分钟的事,所以本文当然不是讲这题的算法思路啥的。我想学python,所以这题是讲怎么用python实现的。实现的方法有很多,python应该也可以和C/C++一样,通过数组下标来操作字符数组,这样就没什么好说的了,所以我们这题用python独有的方法来做。class Solution: # @param {string} s # @return {int
2015-06-11 11:31:47
459
原创 Factorial Trailing Zeroes-Leetcode
本题仍然是考察思路,属于Easy级别,有了思路后只需几行代码即可实现:class Solution {public: /* 要想若干数字之乘积末尾出现0,则这些数字的因子中必须包含末尾为2和5的数字,如 10*2 = 20 = 2*5*2, 6*5 = 30 = 2*3*5 本题是求某个数的阶乘末尾之0的数量,某个数的阶乘就是小于等于这个数且大于1的所有整数之乘积,因
2015-06-10 15:41:23
338
原创 Jump Game-Leetcode
这题仍然是考察算法和思路的,有思路了实现并不难。class Solution {public: /* 若∃ index = nums.size()-1,意味着只要能到达第index个元素,就可以通过这个元素到达第 nums.size()-1个元素,此时,我们只需考虑能否从前面的元素到达第index个元素。据此逆序迭代,找到最小的出发点,判断下标是否为0即可。
2015-06-09 11:28:51
413
原创 排列组合与子集
Leetcode上有几道题比较类似,Permutation、Combination和Subsets等。说它们相似,是因为思路类似。要求出某个序列的排列组合和子集,初看起来,要对序列中的每个元素排列、取舍,初看起来,似乎要写一个循环层数正比于元素个数的大循环,而语言并没有提供这种功能。这时就要转变思路,先求部分解或子问题的解,再迭代求出原问题的解。
2015-06-05 11:27:38
622
原创 Remove Element -LeetCode
Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond the new length. 这道
2015-06-05 10:54:24
368
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人