GOOD DAY

天天向上<< High一下!

程序员面试题集

11 Mar 2015 - NanJing


###巨人的肩膀###

程序员之路】分享:程序员面试——电话面试问答40个问题

C++应用程序性能优化

http://blog.csdn.net/v_july_v/article/details/6543438/

小知识点

linux命令:man;touch;cat and less;sort and grep ;cut ;sed;tar ;find ;diff ;uniq ;chmod ;grep工具【该工具用于匹配】 ;sed 工具 【该工具用于行间的内容操作,如增删改,查找替换】 ;awk 工具【该工具用于处理有字段规则的行内内容,并支持格式化输出】wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

字符串匹配:KMP算法、BM算法、正则表达式

cout cout是一个输出流对象,实现对«重载

主键(保持数据完整)、外键(与其它表建立联系):约束作用(插入禁止空);级联(主键记录删除、外键记录也删除)

int to string: stringstream ss; ss « timeCount « i; reutrn ss.str();

Keep-Alive模式
我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
修改Hosts为何不生效,是DNS缓存?:因为隐私模式下不会复用 TCP 连接,新开连接的时候,会重新解析 DNS 域名,自然也生效了。

类型安全 CPP:new 返回确切对象类型;malloc返回的是(void *), 需显示转化,(chat *)行,但(int *)有问题

数据库范式: 一范式:需要保持每一列的原子性。例:电话号码:86-010-11111111 如果要符合一范式,那么需要把电话号码拆分为国家号码、区号、电话号码进行存储,达到每一列不能够再拆分。符合原子性的标准即为一范式。 二范式:首先必须符合一范式。另外需要满足,每一个表必须有主键,除主键外其他的列必须和主键相关,不能只与主键的某一个部分相关。例如一个表有一个联合主键,而部分数据是与联合主键相关而不与主键相关,那么这时需要把表拆开,使得每一列都与主键相关。 三范式:首先必须符合二范式,另外需要满足,每一个非主键列必须直接依赖主键,而不能存在传递依赖。 一原子二相关三依赖

数据库实例
数据库如何读入内存呢?
这个时候,就是我们要介绍的instance(实例)了.实例就是内存结构和一组后台进程.
实际上,正常的数据库读入内存的过程是,由实例中一组后台进程从磁盘上将数据文件读入到实例的内存中,然后经过在内存中对数据的操作再从实例的内存中经过一组后台进程写到数据库中.
那实例相对与数据库而言,应该就是数据库的运行环境(随不准确但也很贴切).

SQL优化(索引)
http://www.vaikan.com/what-do-you-know-about-sql-performance/
当表字段放到函数里执行查询时,索引将不起作用;
like对应的查询字符如果是以通配符开头的,索引将无法发挥效能
1.mysql嵌套子查询效率确实比较低
2.可以将其优化成连接查询
3.连接表时,可以先用where条件对表进行过滤,然后做表连接 (虽然mysql会对连表语句做优化)
4.建立合适的索引
5.学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要

泊松分布: (1)顾客购买水果罐头是小概率事件。 (2)购买水果罐头的顾客是独立的,不会互相影响。 (3)顾客购买水果罐头的概率是稳定的。

1、::是c++域操作符,C中不能编译通过。
2、避免float、double用“==”或“!=”与数字比较,应设法转化为“>=”或“<=”的形式(精度范围内允许的误差)。表达式中存在有符号数和无符号数时,自动转为无符号类型。数在内存中以补码存在。
3、extern “C”:以C的编译习惯编译文件,解决名字匹配问题。例如重载函数C++中可能是_foo_int_int和_foo_int_float,而C不支持重载,只是_foo。
4、stdlib.h中的atexit(void(*) (void))函数用来注册程序正常终止时要调用的函数,并且调用顺序与注册顺序相反。
5、宏中使用#将宏参数变为字符串,##把两个宏参数连接起来。#define STR(s) #s,则STR(string)则打印string。#define CON(a,b) (int)(a##e##b),则CON(2,3)表示2000。
6、static:用来控制变量的存储方式和可见性(静态存储和内部连接)。全局变量只初始化一次,防止在其他文件中被引用,局部变量初始化一次,下一次依据上一次的值,static函数内存中只一份。类的static属于类不属于类的实例,可在所有类的实例间共享。类名::静态方法()。起源:http://www.jb51.net/article/41629.htm
7、inline放在函数定义处方能发挥作用。
8、变量声明与定义区别:是否分配了内存。int a是定义式声明,分配内存;extern int a是非定义式声明,不分配内存
9、vector ivec; vector::const_iterator citer1 = ivec.begin(); const vector::iterator citer2 = ivec.begin(); *citer1 = 1; //error *citer2 = 1; //right ++citer1; //right ++citer2; //error 10、const成员函数内不能改变成员变量

瀑布模型:前一阶段完成后,才能开始后一阶段;开始需要把需求做到最全
原型模型:克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险。
类方法就是static方法,实例方法就是一般的非static方法,类方法中不能直接调用实例方法,可间接调用(通过对象参数)。static类方法无this指针
c++不能重载::
const char *p1 = “hello”;char *const p2 = “world”;p2[2]=”s”(不对,字符串常量不能修改,字符数组可以)
二分查找只支持有序数组,O(lgn)
除了整型,枚举类型,字符型,其他的都不行。譬如:字符串,浮点型这些都不可以作为switch的参数类型。
float一位符号位(x),8位偏移位(2^x),23位尾数(1.xxxx)

DLL调用一个DLL中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。 2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。

构造函数顺序
当派生类中含有对象成员时,在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;

lamda表达式
auto cnt = 0; auto foo = &cnt{ ++cnt; return x>y; } foo(1,2);

海量数据处理:http://blog.csdn.net/v_july_v/article/details/7382693 [所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树,针对空间,无非就一个办法:大而化小,分而治之(hash映射),你不是说规模太大嘛,那简单啊,就把规模大化为规模小的,各个击破不就完了嘛。] 无非就是分而治之/hash映射 + hash统计 + 堆/快速/归并排序,说白了,就是先映射(一次可装进内存则跳过),而后统计,最后排序:

堆排序:在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆,比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大)

STL:序列式容器(vector/list/deque/stack/queue/heap);关联式容器。关联式容器又分为set(集合)和map(映射表)两大类,也就是说,set/map/multiset/multimap都内含一个RB-tree,而hash_set/hash_map/hash_multiset/hash_multimap都内含一个hashtable

这两个函数是差不多的,但由于优化方案不同,通常NOT Exists要比NOT IN要快,因为NOT EXISTS可以使用结合算法二NOT IN就不行了,而EXISTS则不如IN快,因为这时候IN可能更多的使用结合算法。
Select * from tableA Where exists(Select * From tableB Where tableB.ID=tableA.ID)
这句相当于:Select * from tableA Where id in (Select ID From tableB)
对于表tableA的每一条数据,都执行Select * From tableB Where tableB.ID=tableA.ID的存在性判断,如果表tableB中存在表tableA当前行相同的ID,则Exists为真,该行显示,否则不显示。
IN? EXISTS:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况 In确定给定的值是否与子查询或列表中的值相匹配 Exists指定一个子查询,检测行的存在

临界存储区是一段代码,同一时间只允许一个线程访问执行,通过信号量或互斥锁实现线程安全。
死锁:互斥条件、请求和保持条件、不剥夺条件、环路等待
共享(读锁)、排他锁(写锁)。

尾递归:如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。。尾递归是极其重要的,不用尾递归,函数的堆栈耗用难以估量,需要保存很多中间函数的堆栈。比如f(n, sum) = f(n-1) + value(n) + sum; 会保存n个函数调用堆栈,而使用尾递归f(n, sum) = f(n-1, sum+value(n)); 这样则只保留后一个函数堆栈即可,之前的可优化删去。是一种变形迭代。

int a[2][3];  
int (*p)[3] = a;

++,–这两种操作符要求作用于左值,所以i++合法,(-i)++不合法

三元表达式“?:”问号后面的两个操作数必须为同一类型

OPP设计原则(高内聚、低耦合),SOLID:
单一责任原则:换句话说就是让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。低耦合。
开放封闭原则:类、方法/函数应当是对扩展(新功能)开放,对修改闭合。封装变化,抽象扩展。为应对服务器改换而引起客户端变化的解决:抽象!为服务器端的代码(类型)抽象出一个抽象基类(定义一组完成服务职责的最小接口)。
里氏替换原则:(父类出现的地方可以用子类替代,即派生类或子类(相对父类比较)必须增强功能,而非减少)。优先使用组合(委托)而不是继承”或者说“只有在确定是 is-a 的关系时才能使用继承”,因为继承经常导致”紧耦合“的设计。鸟飞
依赖倒置原则:这个原则的意思是:高层模块不应该依赖底层模块,两者都应该依赖其抽象。其实又是”面向接口编程,不要面向实现编程“的内在要求。引擎和车轮是可插拔的,因为汽车能接受任何实现了声明接口的对象,并且Car类不需要做任何改动。
接口分离原则:如果不需要一个接口的功能,那么就不要实现此接口。不会飞的鸟实现了带有fly方法的接口,就显得多余了。

类间关系
类主要有属性和方法构成。比如商品属性有:名称、价格、高度、宽度等;商品的方法有:计算税率,获得商品的评价等等。
一、继承关系:继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
二、实现关系:实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。
三、依赖关系:简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。
四、关联关系 关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。
五、聚合关系:聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。
六、组合关系:组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。

网站优化,静态化处理:静态网页的资源基本是不会发生变化的。减少http请求(合并精简css、js文件、图片预加载)、浏览器缓存(http协议之cache-control)、脚本放页面底部、传输数据压缩、CDN。但是动态网页不易缓存,这是应该拆分网页了,把网页做一个动静分离,让静态的部分(菜单、页首和页尾)当做不变的静态资源进行处理,动态的内容还是动态处理,然后在合适的地方将动静内容合并在一起。

http状态码
消息(1字头)、成功(2字头)、重定向(3字头)(304请求内容未改变,可以去读浏览器缓存)、请求错误(4字头)(401权限、404未找到)、服务器错误(5字头)。http://www.cnblogs.com/loveyakamoz/archive/2011/09/03/2165266.html

shell

//存储 统计
#!/bin/bash
while true
do
read -p "Phone number: " phone
now=`date "+%Y.%m.%d %H:%M:%S"`
read -p "Name: " name
read -p "Issue: " issue
echo "$now/$phone/$name/$issue">>data.txt
echo "===== We got calls from ====="
cat data.txt | cut -d"/" -f2 | sort | uniq -c
echo "--------------------------------"
done

单例模式注意:在多线程的情况下,需要让方法互斥,才能保证只会创建一个实例,如果不加synchronized,当多个线程同时获取实例时,就有可能创建多个实例。(可以测试一下)

TCP三次握手建立连接(socket中connect)
(1)第一次握手:Client将标志位SYN(新连接)置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP四次挥手断开连接(socket中close)
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

三次?四次?这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

类中默认生成的函数有:无参构造函数、拷贝、赋值(=)和析构函数。不需要可将其声明为private。

析构函数内不调用虚函数
总结来说:基类部分在派生类部分之前被构造,当基类构造函数执行时派生类中的数据成员还没被初始化。如果基类构造函数中的虚函数调用被解析成调用派生类的虚函数,而派生类的虚函数中又访问到未初始化的派生类数据,将导致程序出现一些未定义行为和bug。

为防止资源泄漏,使用RAII(资源取的便初始化),智能指针(shared_ptr计数和auto_ptr替换).,且前者支持定制删除器,可用来自动解除互斥锁等。使用shared_ptr时应注意:资源管理类中提供对原始数据的访问15;以独立语句将new对象置入智能指针17。

转型:const_cast:去吃常量;dynamic_cast:安全向下转型,唯一无法由旧语句完成;reinterpret_cast:pointer to int;static_cast:

接口继承和实现继承:在public继承之下,derived classes总是继承base class的接口;virtual函数一般需要覆盖(动态):pure virtual 函数总是只具体制定接口继承;impure virtual函数具体指定接口继承和缺省实现继承;non-virtual函数具体指定接口继承以及强制性实现继承。

private继承:不能自动将一个derived class对象转换为base claass
继承而来的皆为private属性。可以将对象尺寸最小化。

多重继承:虚继承消除共享继承带来的副本二义性。

多态:通过virtual函数发生在运行期。Shape *ptr = new Rectangle();ptr的动态类型是Rectangle.

HAVING支持所有where操作,但前者可用于分组过滤,而后者仅指定行。

sql语句顺序:SELECT FROM WHERE GROUP HAVING ORDER LIMIT

视图:虚拟表,包装sql语句

索引:数据库查询时,会为查询条件加一个索引并缓存建立索引查找树,因此对经常查询的字段加上索引是个好习惯。B树:多叉查找树。
如果表用于经常查询可建索引,但是如果修改频繁,维护索引将给数据库加大负担。

B+

B-:

#define:语义流畅清晰、方便修改、提高了程序的执行效率,由于使用了预编译器进行值替代,并不需要为这些常量分配存储空间,所以执行的效率较高。预处理语句虽然有以上的许多优点,但它有个比较致命的缺点,即,预处理语句仅仅只是简单值替代,缺乏类型的检测机制。这样预处理语句就不能享受C++严格类型检查的好处,从而可能成为引发一系列错误的隐患。

const:只读!代替预处理阶段的#define常量式宏定义,C++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,有数据类型,可进行安全性检查。常用于变量和函数参数,以及限定函数的返回值或限定类的成员函数。。

inline:替代C中表达式形式的宏定义,inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。。编译、类型检查、函数、二义性;但以代码膨胀为代价,代码较长或循环时慎用

引用、指针初始化、可修改、可空值

int* a[10] int (a)[10] int(a)(int) = fun(int)

编译程序产生目标代码,解释程序逐句输入、翻译、执行

大端、小端 很多情况下我们都是用一小段测试代码来判断CPU的大小端模式的。 程序1:

int checkEnd()
{
int i=0x12345678;
char *c=(char *)&i; 
return(*c==0x12)
}
//返回值:大端返回1,小段返回0
//程序2:
int checkEnd()
{
union
{
long a;
char b
}u;

u.a = 1;
if (u.b == 1) return 0;
else return 1;
}
//返回值:大端返回1,小段返回0

堆、栈:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。

fork一个进程将执行与父进程相同的代码,只是在不同内存空间,而生成一个线程会产生新的代码执行,同时共享内存。
线程共享的内容包括:
1.进程代码段
2.进程的公有数据、堆(利用这些共享的数据,线程很容易的实现相互之间的通讯)
3.进程打开的文件描述符、
4.信号的处理器、
5.进程的当前目录和
6.进程用户ID与进程组ID
线程独有的内容包括: 1.线程ID
2.寄存器组的值
3.线程的栈
4.错误返回码
5.线程的信号屏蔽码

堆内存被所有线程共享,而每个线程都有自己的栈。每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆。

强类型语言只能将兼容的值存入相应的类型中。不变类:String

大数据:在于数据之大,更在于全。即多维度、多角度数据进行交叉对比以预测某些不确定性。汽车保险公司手机汽车行车记录、智能电表用电特征匹配、商品RFID记录(购买、试衣)分析、推荐系统

qsort: void qsort(void base,int nelem,int width,int (fcmp)(const void *,const void *))

子串 素数相乘;

编译原理:预处理、编译、链接。其中编译过程包括:词法分析(识别)、语法分析(结构)、语义分析(逻辑)

内存错误
内存泄漏、错误分配,包括大量增加 free() 释放的内存和未初始化的引用、悬空指针、数组边界违规。debugnew.h检测内存泄露(未释放)。

内存池
http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html
利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销,池的做法是:在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升。链表实现。

虚拟链表
虚拟链表是只包含链表指针的链表。对象存储在链表结构背后。这一点是这样实现的,首先为链表节点分配内存,接着为对象分配内存,然后将这块内存分配给链表节点指针。注意指针类型转换:

pLIST AddToList( pLIST Head, void * data, size_t datasize )
{
pLIST newlist=NULL;
void *p;
    // 分配节点内存和数据内存
    newlist = (pLIST) malloc( datasize + sizeof( LIST ) );
    // 为这块数据缓冲区指定一个指针
    p = (void *)( newlist + 1 );
    // 复制数据
    memcpy( p, data, datasize );
    // 将这个节点指定给链表的表头
    if( Head )
    {
    newlist->next = Head;
    }
    else
    newlist->next = NULL;
    Head = newlist;
    return Head;
}

红黑树
红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。二叉查找树最坏O(n),而红黑树,能保证在最坏情况下,基本的动态几何操作的时间均为O(lgn)。特征:1)每个结点要么是红的,要么是黑的。2)根结点是黑的。3)每个叶结点,即空结点(NIL)是黑的。4)如果一个结点是红的,那么它的俩个儿子都是黑的。5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

redia: Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。提供五种数据类型:string,hash,list,set及zset(sorted set)。

算法分类

排序:选择、快速、堆、希尔 |前述不稳定| 归并、插入、冒泡、基数、位图、多路归并
搜索:顺序、二分、散列、二分搜索树、索引
字符串、向量和矩阵、随机、数值算法

代码调优

空间换时间:修改数据结构、存储预先算好的结果、高速缓存、避免不必要求值
时间换空间:堆积(稀疏数组、压缩算法) 循环:代码移出循环、合并测试条件(哨兵使用多一位来存目标值以检测退出循环时idx位置)、展开循环、删除肤质、消除无条件分支、循环合并
逻辑:重新排序测试条件
过程:打破函数层次(内联函数)、递归函数转换(迭代、尾递归)
表达式:编译时初始化(变量初始化)、消除公共字表达式

###项目### Java:arrayList(动态数组)、linkList;
C++/Java

最难的部分
网站:离线消息,即时通讯,
MFC:状态信息不断更新,记录选择条目和位置,更新时载入选中状态。
APP:定位显示、画圈(开始想的是载入图片,以图片做背景,再在图片上画圈;二是实现画好所有圈,再显示位置圈)、缩放(开始准备触摸缩放,后面用seekbar进行缩放1.25×0.8)

For a better user experience, the first method to realize map zoom coming to my mind is by touching, but it doesn’t work somehow, Because time limited, then i decide to adopt the seekbar and let the zoom index be 0.8.

Because the AP selection function is called freauently, when there are considerable APs in our scene, and traversing method can lead to a poor performance, so we store the nearby APs in a hashtable for a faster reaction.

有什么收获
学习新技术、看技术文档、开拓眼界、入门的了解、有助于开发更高大上的东西。

最有意思的部分
网站:网站爬虫对wisegeek每日更新的冷门知识doyouknow模块截取并显示;音乐按键并显示效果;基于论坛增加了HTML5看书和Video服务和第三方评论、世界杯期间爬虫显示数据统计
MFC:加入定时关机等功能、一键关闭所有应用程序和摘要状态信息显示首页
APP:根据学生专业提供推荐馆藏

最难解的bug
we design this indoor localization project based on the idea that the user’s position can be indicated by the nearby wifi hotspot named access point(AP), and the static AP ‘s location is available. it starts periodically wifi scanning(RSSI measuring) of the neighbor APs in the indoor localization field. Then it selects the AP with the largest (signal strength)RSSI; Finally it finds the location of the selected AP and presents the place on the map. The most hard part to me is the way how we handle the situation where the signal affect by the environment. At last, we try to filter some ap whose singal changes dramatically and use modified triangulation location for further position estimation.

最享受的过程
将想法一步一步实现的过程和解决bug的时候。

书籍的影响 历史科幻:明朝那些事儿、三体等
计算机:浪潮之巅、数学之美、编程珠玑等
网上资源:极客头条、IBM developerWork、博客(ruanyifeng)等

寻找是否存在,开始使用普通扫描,然后改用哨兵方法,最后使用hashMap(定位位置变化)查找多,一次载入。
区域内很多节点,找到某一移动节点通信范围内的其他所有节点,普通算法是用欧式距离公式每个都要算。用坐标轴投影法减少计算次数。

拿来主义、完美主义、极简主义。借鉴兼创新、功能要实现、界面要精简、结构要清晰。适应性、责任心、有始有终、乐于助人。

软件设计步骤
需求分析、软件设计、程序编码、软件测试、运行维护

并发、并行 parallel(并行):一起。together
concurrent(并发):交替。alternately

事务/Transaction execution unit:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
atomic, consistent, isolated and durable
原子性、一致性、隔离性、持续性

类和对象
类和对象的区别类是对象的抽象,对象是类的具体实例(specific instance)。类是抽象的,不占用内存,而对象是具体的,占有内存空间。例如:类就是水果,对象就是苹果。A is to B what C is to D
封装(wrap)、继承(inheritance)、重载(override)还是多态(polymorphism)
多态:一个接口interface(基类base),多种实现implement(派生类derived)
封装:良好的封装能减少耦合;类内部的实现可以自由修改;类具有清晰的对外接口。
继承:使得所有子类公共接口部分都放在了父类,避免重复,便与修改,可以扩展父类没有的属性功能,也可以重写方法。父类的构造方法不能被继承只能被调用【fish():Animal(fishname){}】。 然而,父类破坏了本身的封装性,增加了类之间的耦合关系,父类的改变将引起子类的变化。
多态:多态表示不同对象可以执行相同的动作,但要通过它们自己的实现代码来执行。

quicksort
Quicksort (sometimes called partition-exchange sort) is an efficient sorting algorithm, serving as a systematic method for placing the elements of an array in order. Quicksort is a divide and conquer algorithm

Binary search algorithm
In computer science, a binary search or half-interval search algorithm finds the position of a specified input value (the search “key”) within an array sorted by key value.

饥饿Starvation&deadlock死锁
In computer science, starvation is a problem encountered in multitasking where a process is perpetually denied necessary resources.
In concurrent programming, a deadlock is a situation in which two or more competing actions are each waiting for the other to finish, and thus neither ever does.

同步(synchronization)、异步(asynchronization)
同步:进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。call
异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。message
普通B/S模式(同步)AJAX技术(异步)
同步是指两个线程的运行是相关的,其中一个线程要阻塞等待另外一个线程的运行(锁)。异步的意思是两个线程毫无相关,自己运行自己的。

英文自我介绍
I am Jean, born in XinYu City in JiangXi province. I will be graduated from SouthEast university in the next year. My major is Computer technology, and i got my bachelor degree from Nanjing University of Aeronautics and Astronautics in the year of 2013. I spend most of my time on study, and i have also acquired basic knowledge of other Information Technology such as website and linux during my school time.
In July 2012, I began work for a small private company as a software engineer intern in NanJing and develop a task manager- like program with MFC.
In spare time, i usually do some sport like basketball and football with friends, also i like to go to the gym before having supper.
I’ve always had an interest in some new stuff. I think I’m a good team player and I’m a person of great honesty to others. That is the reason why I come here to compete for this position. That’s all. Thank you for your listening.

职业规划
I am in favour of Information Technology and i have learnt many basic knowledges about it, digging wide makes hole deeper, and now i need a deeper understanding of one or more specific field. So in the first few years, i am willing to do some coding job and try to learn some experiences from the mentors in company. After that, i am honored to be a project leader to guide my member well and make a contribution to the company.