面试笔记。

《程序员面试宝典》-学习笔记。



也许你现在还用不到它,先看看吧,指不定什么时候就用上了呢!这不是杞人忧天,而是未雨绸缪!


一般有3种,网络工程师,测试工程师,软件开发人员。


外企对设计模式,软件度量等方面试题的喜爱有增无减。


求职五部曲,笔试,电话面试,面试,签约,违约。


公司除了询问你的项目经验之外,最好的询问方式就是考量你的基本功,包括编程风格,赋值语句等等,


设计模式,是解决某一类问题的一般性解决方案,


35岁退休其实是一种误解,只要我们规划好我们的职业生涯,提高技术水平,沟通技巧,管理能力,完全可以像国外程序员一样工作到60再退休,


纸的简历相比于电子简历有一种亲切感,重视程序也高一些。


据统计,80%的简历都是不合格的。


一般来说学习经历从大学写起,再早的除非有特殊成就,就不用写,


对于荣誉证书,成绩单,列出即可,不用附图,企业感兴趣会要求你带上的,


不要为了一次面试机会编写虚假简历,


要写出自己的特点,否则会让HR认为你什么都合适,其实也就是什么都不合适,



针对性的简历,按照对方的要求,突出自己的相关经历,


一般不要写上资质要求,太高,企业雇不起;太低,容易让企业觉得你无足轻松,

而且对第一份工作来说,资质不重要,不要费太多脑经,



个人信息写必须的即可,国家单位要写上政治面貌,


不要用太多措辞表达工作业绩,


某方面知识的掌握程序,可以分为精通,掌握,熟悉,理解,让人一目了然,


简历模板,

姓名,电话,方便他人联系,

毕业学校,专业,时间,

项目,反应能力,

兴趣爱好,反应工作生活态度,


p21,一份具体的项目模板,

里面包含一份个人评价,



外企,出题,答题,都用英文,不一定要通过CET6,


智力测试,占比很少,3%~5%,有些甚至没有,


不同公司侧重不同,

偏硬件公司考C++,指针,数据结构多些,

偏软件公司考设计模式,模板多,


面试官,喜欢考你纸上写程序,



电话面试主要是对简历模糊信息的确认,验证,



一般的IT公司对技术人员的着装要求都不会太高,关键是精神状态好,


面试官针对某个项目反复提问,他可能特别精通,或者以后这方面的技术使用的较多,


架构师一般会考行业背景,UML建模及工具的使用,


不熟悉的内容,可以沉默,不要尴尬和紧张,


正式的offer会提供,

薪水(税前or税后),

补助(税前or税收),

工作职位,

工作时间,地点,

保险,公积金等福利,

签约前一定要弄清楚,

1,户口是否解决,跳巢后有些单位要看户口,结婚出国等也有影响,

如果不长呆北京,就不是很重要,



五险指的是,养老保险,医疗保险,失业保险,人身意外伤害保险,生育保险,

一金指的是,住房公积金,

工资扣得多,公司帮你缴费也越多,


从某种程度上来讲,良好的培训比优厚的待遇更有吸引力,


大公司,文档优先,


架构师,可能不知道很多技术细节,

一些,高手,也只是在他那个领域精通,


平均工资高的行业,平均压力也大,


其实选什么行业,真的不重要,事情是人做出来的,快乐是最重要的,



不会有一件事情,让大家都变成功,历史上不曾有,将来也不曾有,



好,不是少干活,多拿钱,



面试笔记。_第1张图片

我来给你加强下过程的理解,

开始count=0,

count=1,

10011100001111

&

10011100001110

=

10011100001110,


count=2,

10011100001110

&

10011100001101

=

10011100001100,

这么给你说吧,

十进制4用二进制表示为0100,

十进制4减1后,对应二进制要调位,0011,

两者相与,就为0,

后面不停这种循环,

结论就是,一次消灭一个二进制中的1,



5.2例题1,

!x++,

我想说的是,位!操作,并没有改变x的值,

至于后置++,没理解错误,做个简单总结,后置++,就是当前那一块操作,最后才进行,



5.2例题2,

面试笔记。_第2张图片

总结下,我去这个题,我又入坑了,

首先,后置++,比我想的还要后,

然后,printf函数,是从右到左输出的,

最终这个数组的状态是,129,7,8,9,10,

只有第一个改变了,




面试笔记。_第3张图片

第二种写法好,部分运算放到外面,提高效率,缺点是不够简洁,



面试笔记。_第4张图片

我的总结是,浮点和整数的存储不同,

第二个,还是很值得去分析下的,




面试笔记。_第5张图片

47page,例题2,

一个是不同数据类型,字节长度不同,发生截断,

一个是改变的是指针的类型,没有改变数据本身的意义,故结果没变,



51page,例题1,

感觉,有点超出我要用的了,

http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html

讲了char和unsigned的区别,可以学习,



面试笔记。_第6张图片

这个题,开拓思路,不错,



面试笔记。_第7张图片


面试笔记。_第8张图片

58page,和朱老师讲过的同类问题,



定义宏,返回两个参数中较小的一个,

#define MIN(A,B)( (A)<=(B) ? (A):(B) )




面试笔记。_第9张图片

这里,对结构体大小的讲解,挺全面,

sizeof(),A和B分别是6,8,

long,一般4字节,

short,一般2字节,

char,1字节,

面试笔记。_第10张图片

主要看后两段的讲解,




面试笔记。_第11张图片




double,在32位中也占用8个字节,这点倒是要注意,

其它就是与之前重叠的知识点了,

http://blog.csdn.net/lyl0625/article/details/7350045

这篇文章讲了16,32,64位环境下不同数据占用空间的大小,



page69,不想看了,



一个空类,占用空间是1,

单一继承的空类,占用空间也是1,

涉及虚继承的,由于有虚指针,所以大小为4,




面试笔记。_第12张图片



int *pi;

*pi = 5;

这是错误的,因为你不知道指向谁,



面试笔记。_第13张图片

这道题是错的,

我想说的是,

调用的函数申请的内存和str没有关系,具体自己理解,不多说,

然后strcpy函数第一个参数,需要有内存,

面试笔记。_第14张图片

指向指针的指针,这个例子不错,




char* strA()
{
	char str[] = "hello world";
	return str;
}
这样可能是错误的,

你可以在char *前面加const,

不用数组申请,用指针申请,




int main()
{
	int a[3];
	a[0] = 0;
	a[1] = 10;
	a[2] = 20;
	int *p, *q;
	p = a;
	q = &a[2];
	cout<
指针相减,也是用的少,

q-p的实际运算是,q的地址减去p的地址,再除以sizeof(int),即2,


page84,好恶心,





感觉这种复杂度的,不会用吧,




答案是 int (*a【10】)(int);

这个题和上面很想,感觉不是那么突兀了,





结果是2,5

数组名本身就是指针,再加上个&,就变成了双指针,这里的双指针就是指二维数组,加1,就是数组整体加一行,

这个解释方法也是挺新奇,



面试笔记。_第15张图片



空指针和迷途指针的区别,

当delete一个指针后,实际上仅仅是让编译器释放内存,指针本身依然存在,这时就是迷途指针,

为这个指针赋值0,就变为空指针了,

不同的是,迷途指针的值,带有随机性,因此似乎能访问,但是潜存危险,

而空指针,一般0地址,我没记错的话,是硬件级别不能访问的,




第8部分,循环,递归与概率,没怎么看,


page108,没看懂嘎,


面向对象的基本概念是什么,

对象,类和继承,


空类包含的成员函数,

除了有构造函数,析构函数,拷贝构造函数外,

还有一个赋值函数,这个好像不熟悉啊,


C++中的struct和class的区别是,默认权限不同,

struct的存在,是为了兼容以前的C项目,


停到119page,


位运算与嵌入式编程,

面试笔记。_第16张图片

这个题也是有意思,对printf认识,更深入了,

%f代表浮点数,

float是单精度浮点数,占4字节,

double是双精度浮点数,占8字节,



page,164,

C++中的强制类型转换,

问题是,题目好怪,好怪的转换,




这道题也是类型转换的,

我觉得,暂时对我有用的是这些话,


page,108的例二,非常重要,之前C++学习的内存分析,这里很典型,



109page,例三,迭代器移动特点,很重要,



111page,普通函数,变为泛型函数,


面试笔记。_第17张图片

有些时候,数据结构没变,就是数据变了,所以有容器,就省事多了,



一个空类,除了会产生,构造函数,析构函数,拷贝构造函数外,

还会产生赋值函数,应该就是=吧,




C++中的struct和class,差别不大,除了你熟悉的那些,



面试笔记。_第18张图片

这个错误挺有意思,跑了下,编译都报错,



如果想把静态成员变量私有(即权限是private:),可以通过共有静态成员函数返回其值实现,




类中,初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,




面试笔记。_第19张图片



面试笔记。_第20张图片

也挺经典的,



125page,是一个string类的实现,可以,挺全面,

面试笔记。_第21张图片

有点看不懂啊,


面试笔记。_第22张图片

这个调用的讲解,不错,

特别是这句,

面试笔记。_第23张图片




面试笔记。_第24张图片



关于继承,我觉得之前的理解是对的,

不过要补充说明一点的是,类中与类外,

比如私有继承基类的共有成员,那么在子类中可以访问这个继承过来的成员,但是在子类外部,就不能直接访问,



每个对象里有虚标指针,指向虚表,虚表里面存放了虚函数的地址,虚函数表是顺序存放虚函数地址的,不需要用到链表,



面试笔记。_第25张图片




面试笔记。_第26张图片




面试笔记。_第27张图片



面试笔记。_第28张图片





面试笔记。_第29张图片




数据结构,多敲几遍,还有我想说的是,这几个数据结构的题,正好就是我们要掌握的类型,可以,挺好,

这个是单链表的相关代码,

#include 
#include 
#include 
#include 

using namespace std;



typedef struct student
{
	int data;
	struct student *next;
}node;

void print( node *head);
node* del( node *head, int num);
node *create();
node *sort( node *head);
void print( node *head);
int length( node *head);
node *reverse( node *head);
void searchmid( node *head, node *mid);

int main()
{
	node *head, *mid;
	int x = 0;
	head = create();
	print( head);
	//printf("input you want delete");
	//scanf("%d", &x);
	//head = del( head, x);
	head = sort( head);
	print( head);
	head = reverse( head);
	print( head);
	searchmid( head, mid);
	printf("%d", mid->data);
	system("pause");
	return 0;
}

void searchmid( node *head, node *mid)
{
	node *temp = head;
	while( head->next->next !=NULL)	//这里有问题
	{
		head = head->next->next;
		temp = temp->next;
		mid = temp;
	}
}
node *reverse( node *head)
{
	node *p1, *p2, *p3;
	if( head ==NULL || head->next ==NULL)
	{
		return head;
	}

	p1 = head, p2 = p1->next;

	while( p2)	//这里稍微有点理解不过来,不过逆序是基础
	{
		p3 = p2->next;
		p2->next = p1;
		p1 = p2;
		p2 = p3;
	}
	head->next = NULL;
	head = p1;
	return head;
}
node* del( node *head, int num)
{
	node *p1, *p2;
	p1 =head;
	while( num!=p1->data && p1->next!=NULL)
	{
		p2 = p1;
		p1 = p1->next;
	}
	if( num == p1->data)
	{
		if( p1 = head)
		{
			head = p1->next;
			free( p1);
		}
		else
		{
			p2->next = p1->next;
		}
	}
	else
	{
		printf("\n %d could not been found", num);
	}
	return head;
}

node *create()
{
	node *head, *p, *s;
	int x = 0, cycle = 1;
	head = (node *)malloc( sizeof( node));
	p = head;
	while( cycle)
	{
		printf("\nplease input the data:");
		scanf("%d", &x);
		if( x!=0)
		{
			s = ( node *)malloc( sizeof( node));
			s->data = x;
			printf("\n %d", s->data);
			p->next = s;
			p = s;
		}
		else 
			cycle = 0;
	}
	head = head->next;
	p->next = NULL;
	printf("\n yyy   %d", head->data);
	return head;
}

node *sort( node *head)
{
	node *p, *p2, *p3;
	int n;
	int temp;
	n = length( head);
	if( head == NULL||head->next == NULL)
		return head;
	p = head;
	for( int j=1; jdata > p->next->data)
			{
				temp = p->data;
				p->data = p->next->data;
				p->next->data = temp;
			}
			p = p->next;
		}
	}
	return head;
}
int length( node *head)
{
	int n = 0;
	node *p;
	p = head;
	while( p!=NULL)
	{
		p = p->next;
		n++;
	}
	return n;
}
void print( node *head)
{
	node *p; 
	int n;
	n = length( head);
	printf("\n now, these %d record are:\n", n);
	p = head;
	if( head!=NULL)
		while( p!=NULL)
		{
			printf("\n uuu %d ", p->data);
			p = p->next;
		}
}



这个是双链表的相关代码

#include 
#include 
#include 
#include 

using namespace std;

typedef struct student
{
	int data;
	struct student *next;
	struct student *pre;
}dnode;
dnode *creat();
void print( dnode *head);
int length( dnode *head);
dnode *del( dnode *head, int num);
dnode *insert( dnode *head, int num);
int main()
{
	dnode *head =NULL;
	int x; 

	head = creat();
	print( head);
	printf("input you want to del ");
	scanf("%d", &x);
	head = del( head,x);
	print( head);
	head = insert( head, x);
	printf("%d is coming\n", x);
	print( head);
	system("pause");
	return 0;
}
dnode *insert( dnode *head, int num)
{
	dnode *p0, *p1;
	p1 = head;
	p0 = (dnode *)malloc( sizeof( dnode));
	p0->data = num;

	while( p0->data >p1->data && p1->next !=NULL)
	{
		p1 = p1->next;
	}
	if( p0->data <= p1->data)
	{
		if( head == p1)
		{
			p0->next = p1;
			p1->pre = p0;
			head = p0;
		}
		else
		{
			p1->pre->next = p0;
			p0->next  = p1;
			p0->pre = p1->pre;
			p1->pre = p0;
		}
	}
	else
	{
		p1->next = p0;
		p0->pre = p1;
		p0->next = NULL;
	}
	return head;
}
dnode *del( dnode *head, int num)
{
	dnode *p1, *p2;
	p1 = head;
	while( num!=p1->data && p1->next !=NULL)
	{
		p1 = p1->next;
	}
	if( num==p1->data)
	{
		if( p1 == head)
		{
			head = head->next;
			head->pre = NULL;
			free( p1);
		}
		else if( p1->next == NULL)
		{
			p1->pre->next = NULL;
			free( p1);
		}
		else
		{
			p1->next->pre = p1->pre;
			p1->pre->next = p1->next;
		}

	}
	else
	{
		printf("\n %d could not been found", num);
	}
	return head;
}
void print( dnode *head)
{
	dnode *p;
	int n;
	n = length( head);
	printf("\n now, these %d records are :\n", n);
	p = head;
	if( head!=NULL)
		while( p!=NULL)
		{
			printf("\n   %d ", p->data);
			p = p->next;
		}
}
int length( dnode *head)
{
	int n =0;
	dnode *p;
	p = head;
	while( p!=NULL)
	{
		p = p->next;
		n++;
	}
	return n;
}
dnode *creat()
{
	dnode *head, *p, *s;
	int x, cycle = 1;
	head = ( dnode *)malloc( sizeof( dnode));
	p = head;
	while( cycle)
	{
		printf("\n please input the data:");
		scanf("%d", &x);
		if( x!=0)
		{
			s = ( dnode *)malloc( sizeof( dnode));
			s->data = x;
			printf("\n %d", s->data);
			p->next = s;
			s->pre = p;
			p = s;
		}
		else
		{
			cycle = 0;
		}
	}
	head = head->next;
	head->pre = NULL;
	p->next = NULL;
	printf("\n  %d", head->data);
	return head;
}


面试笔记。_第30张图片
循环链表代码,
#include 
#include 
#include 

typedef struct LNode{
	int data;
	struct LNode *link;
}LNode, *LinkList;

void JOSEPHUS( int n , int k, int m);
int main()
{
	JOSEPHUS( 13, 0, 2);
	system("pause");
	return 0;
}
void JOSEPHUS( int n , int k, int m)
{
	LinkList p , r, list, curr;
	p = ( LinkList)malloc( sizeof(LNode));
	p->data = 0;
	p->link = p;
	curr = p;
	for( int i =1; idata = i;
		t->link = curr->link;
		curr->link = t;
		curr = t;
	}

	r = curr;
	while( k--) r=p, p=p->link;
	while( n--)
	{
		for( int s = m-1; s--;r=p, p = p->link);
		r->link = p->link;
		printf("%d->", p->data);
		free( p );
		p = r->link;
	}
}


队列的代码,

#include 
#include 
#include 
#include 

using namespace std;

typedef struct student
{
	int data;
	struct student *next;
}node;

typedef struct linkqueue
{
	node *first, *rear;
}queue;

queue *insert( queue *HQ, int x)
{
	node *s;
	s = ( node *)malloc( sizeof( node));
	s->data = x;
	s->next = NULL;
	if( HQ->rear == NULL)
	{
		HQ->first = s;
		HQ->rear = s;
	}
	else
	{
		HQ->rear->next = s;
		HQ->rear = s;
	}
	return HQ;
}

queue *del( queue *HQ)
{
	node *p;
	int x;
	if( HQ->first == NULL)
	{
		printf("\n yichu");
	}
	else
	{
		x = HQ->first->data;
		p = HQ->first;
		if( HQ->first==HQ->rear)
		{
			HQ->first = NULL;
			HQ->rear = NULL;
		}
		else
		{
			HQ->first = HQ->first->next;
			free( p);
		}
		return HQ;
	}
}


这是stack的代码,感觉有点问题啊,

#include 
#include 
#include 
#include 

using namespace std;

typedef struct student
{
	int data;
	struct student *next;
}node;

typedef struct stackqueue
{
	node *zhandi, *top;
}stack;

stack *push( stack *HQ, int x)
{
	node *s, *p;
	s = ( node *)malloc( sizeof( node));
	s->data = x;
	s->next = NULL;

	if( HQ->zhandi == NULL)
	{
		HQ->zhandi = s;
		HQ->top = s;
	}
	else
	{
		HQ->top->next = s;
		HQ->top = s;
	}
	return HQ;
}

stack *pop( stack *HQ)
{
	node *p;
	int x;
	if( HQ->zhandi ==NULL)
	{
		printf("\n yi chu");
	}
	else
	{
		x = HQ->zhandi->data;
		p = HQ->zhandi;
		if( HQ->zhandi == HQ->top)
		{
			HQ->zhandi = NULL;
			HQ->top = NULL;
		}
		else
		{
			while( p->next != HQ->top)
			{
				p = p->next;
			}
			HQ->top = p;
			HQ->top->next =NULL;
		}
		return HQ;
	}
}

面试笔记。_第31张图片

我来说下我对D的排除,1234跑后面了,说明进栈了,可是顺序是没有逆序,说明就是错的,除非它又倒回左出口



用两个栈实现一个队列,为什么结果出来是错的,p191



排序那块,那个排序算法,想不起来了,要看,


逆序那块,中间有个小细节要注意,


那个只遍历一次就出结果的,while判断应该是问题的,


在双链表中,head就正好指向第一个数据节点,晕,我发现这里,单链表的head也是指向第一个数据节点,




面试笔记。_第32张图片


面试笔记。_第33张图片






面试笔记。_第34张图片








字符串是重点,

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,

int main()
{
	//整数转换为字符串,
	int num = 12345,j=0, i=0;
	char temp[7], str[7];
	while( num)
	{
		temp[i] = num%10+'0';
		i++;
		num = num/10;
	}
	temp[i] = 0;
	cout<=0)
	{
		str[j] = temp[i];
		j++;
		i--;
	}
	str[j] = 0;
	cout<



void LoopMove( char *pStr, int steps)
{	//字符串右移函数
	int n = strlen(pStr) - steps;
	char tmp[100];
	memcpy( tmp, pStr+n, steps);
	memcpy( pStr+steps, pStr, n);
	memcpy( pStr, tmp, steps);
}
int main()
{
	char s[] = "34512";
	LoopMove( s, 2);//结果是123455
	cout<



操作系统部分,和我需要的,关系也不大,


数据库部分,如果你觉得sql语句有必要的话,再来看看,


网络部分,也不知道该怎么记,

对等实体在一次交互作用中传送的信息单位称为(协议数据单元),

它包括控制信息和用户数据,


new和delete是运算符,



电话面试的组织方可能是第三方中介,因此问题多半是格式化的,单调的问题,



面试经历总结,

对于毕业生,那些要求本科且两年以上工作经验的,也可以试试,


招聘有工作经验的公司,多半会让你马上去上班,


公司招人多的时候,要求就会比较轻松,

需要人少的时候,相反,



一般来说,公司越大,管理制度越健全,分工越细,自己学到的东西也相对有限,







你可能感兴趣的:(未定义)