08 2015 档案
摘要:单例模式很好理解,就是只允许创建该类的一个实例。 经典版 构造函数声明为private,则只有Singleton类的代码才能调用构造函数。 利用局部静态变量达到实例只有一个的要求。 局部静态变量的另一个优点是lazy initialization,只有在第一次调用getInstance()时才创建该
阅读全文
摘要:题目描述:You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stoppi...
阅读全文
摘要:题目描述:Given a binary tree, return all root-to-leaf paths.For example, given the following binary tree: 1 / \2 3 \ 5All root-to-leaf paths are:...
阅读全文
摘要:问题: 给定一个已排序的双向链表,向其中插入一个元素。solution:struct ListNode { int val; ListNode *prev; ListNode *next;};int insert(ListNode *head, int value){ Li...
阅读全文
摘要:工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory)、工厂方法(factory method)、抽象工厂(abstract factory)。简单工厂包括3种组成元素:抽象产品、具体产品、具体工厂(简单工厂),结构图如下:C++实现://抽象产品class Car...
阅读全文
摘要:装饰者模式: 能够动态地往一个类中添加新的行为。相比继承是在编译时添加行为,装饰模式是在运行时添加行为。星巴克咖啡是讲述装饰者模式的一个很好的例子。 假设现在有两种咖啡:HouseBlend、DarkRoast,同时有两种调料:Milk、Mocha。那么此时我们可以给顾客提供以下咖啡:House...
阅读全文
摘要:观察者模式: 定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。结构图:C++实现:class Observer;class Subject {public: virtual void attach(Observer *o...
阅读全文
摘要:策略模式: 定义了一个算法族,分别把每个算法封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。结构图:C++实现:class calculateStrategy {public: virtual int calculate(int value1, int value2...
阅读全文
摘要:问题定义: 现有一块共享内存,多个读进程和多个写进程。多个读进程可以同时读,但是当有一个写进程正在写时,其他任何读进程或写进程都不能执行。该问题有3种变种。第一种称为“读者优先”(readers-preference)。在此情况下,只要有进程在读,写进程就得等待。实现如下:#include #in...
阅读全文
摘要:信号量是什么?简单来说,信号量就是一个计数值,假设记为S。S > 0时,表示当前可用资源的数目;S = 0 continue;else blocked;V操作:S = S + 1;if S > 0 continue;else wakeup a blocked proces...
阅读全文
摘要:条件变量是线程同步的另一种手段,主要逻辑就是等待和唤醒。条件不满足时,线程等待;条件满足,线程被(其他线程)唤醒。条件变量一般和互斥量一起使用,因为需要保证多线程互斥地修改条件。涉及到的函数有:int pthread_cond_init(pthread_cond_t *restrict cond...
阅读全文
摘要:谈到多线程编程,同步是一定要讲的。给个例子: #include <stdio.h> #include <stdlib.h> #include <pthread.h> int count = 0; #define N 100000 void* fun() { int i; for (i = 0; i
阅读全文
摘要:linux下的多线程通过pthread实现,下面给个简单的例子。#include #include #include void* thr_fn(){ printf("this is a thread, tid = %d\n", pthread_self()); printf("thr...
阅读全文
摘要:本文主要整理一些常见的海量数据处理面试题。1. 海量id,找出出现次数最多的id情况1: 直接hash table统计,hash table包含N个(id, count)对,遍历求最值。情况2: 内存受限,海量id通过hash函数(id看做整数,hash函数取%1000)映射到1000个文件...
阅读全文
摘要:首先了解一下linux中进程的5大状态: 状态转换关系图: 僵尸进程是指一个已经结束运行,但是其父进程尚未对其进行善后处理的进程。那么为什么一个进程结束运行之后,父进程要对它进行善后处理呢?善后处理做了什么事呢? 具体来说就是,一个进程结束运行之后,该进程并没有被彻底销毁,内核仍然为该进程维护了一些
阅读全文
摘要:问题描述: 给定两个序列 X=, Y,求X和Y长度最长的公共子串。(子串中的字符要求连续) 这道题和最长公共子序列(Longest common subsequence)很像,也可以用动态规划定义。公式如下:这里c[i,j]表示以Xi,Yj结尾的最长公共子串的长度。程序实现:int longes...
阅读全文
摘要:问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续)。 这道题共3种解法。1. 动态规划 动态规划的核心是状态的定义和状态转移方程。定义lis(i),表示前i个数中以A[i]结尾的最长递增子序列的长度。可以得到以下的状态转移方程:d(i) = max(1, d(j)...
阅读全文
摘要:给定两个字符串S、P,如何判断S中包含P?(假设S为较长字符串,要求P中字符在S中要连续出现) 这就是经典的字符串匹配问题。暴力匹配略去不说,一种较好的解法就是KMP。对于一个新手来说,想学习KMP,建议看如下两篇文章:字符串匹配的KMP算法(阮一峰)从头到尾彻底理解KMP(2014年8月22...
阅读全文
摘要:问题描述: 给定两个序列 X=, Y,求X和Y长度最长的公共子序列。(子序列中的字符不要求连续) 这道题可以用动态规划解决。定义c[i, j]表示Xi和Yj的LCS的长度,可得如下公式:伪代码如下:C++实现:int longestCommonSubsequence(string x, strin...
阅读全文
摘要:题目描述:Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−...
阅读全文
摘要:快速排序是相当重要的一种排序方法。它的特点有:1. 平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)。2. 平均空间复杂度为O(logn),最坏空间复杂度为O(n)。3. 不稳定 快排的实现方法有多种,这里只列出常用的两种。单向扫描版:int partition(int arr[...
阅读全文
摘要:题目描述:Given two strings s and t, write a function to determine if t is an anagram of s.For example,s = "anagram", t = "nagaram", return true.s = "rat",...
阅读全文
摘要:traits编程技法利用了“内嵌型别”的编程技巧与编译器的template参数推导功能。 下面主要看看利用traits编程技法实现的迭代器萃取机制。 5种迭代器类型定义: std::iterator的定义 如果想和STL协同工作,自行定义的迭代器必须定义iterator_category、value
阅读全文
摘要:STL以泛型思维为基础,提供了6大组件:容器(containers)、算法(algorithms)、迭代器(iterators)、仿函数(functors)、适配器(adapters)、分配器(allocators)。 容器: vector、list、deque、set、map等,用来存放数据。从实
阅读全文