要习惯手写程序。
![《程序员面试宝典》读书笔记2](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![《程序员面试宝典》读书笔记2](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![《程序员面试宝典》读书笔记2](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![《程序员面试宝典》读书笔记2](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![《程序员面试宝典》读书笔记2](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
1)如果题目改为连打1000枪,得分为900的可能性,估计这种写法的要哭了
2)考虑不周全,如果第一次打靶得分为0,还有9次机会,这9次机会,就要求枪枪都是满分,如果第二枪,得分不是10,那第三枪不用打就知道可能没有可能性了。就比如乒乓球比赛一样,5局3胜制,如果进行了3局都是一个人胜利的话,比赛这时候就可以宣告结束。而继续下去就是浪费时间和精力
2。采用第归的方法来解决上述问题
要实现上述功能,递归函数要完成的功能主要有:
1)当传入的当前打靶次数为小于1,或者大于规定次数的时候,应该退出递归函数的执行
2)当余下的打靶次数中每次都得满分,但能无法达到目标分数的时候,应该退出递归
3)如果没有上述两种情况,就应该执行第归
实现代码:
using namespace std;
int sum=0;
int store[10];
compute(int score,int num)
{
}
int main()
{
}
程序结果 sum=92378
还有一种用到了类:
public class ShotScore
{
//总共有多少种可能性
int SumRate = 0;
//每次可能命中的几率范围
int[] ScoreArray;
//总共需要多少分
int totalScore=0;
//一共能打多少次
int totalShot=0;
//当前共打中环数
public ShotScore(int[] sa,int ts,int t)
{
this.ScoreArray = sa;
this.totalShot = ts;
this.totalScore = t;
}
public int GetSum()
{
return SumRate;
}
public void Compute(int currentShot,int cNum) //currentShot代表已经打过的次数。cNum代表环数。
{
//打多打少都不行
if(currentShot<0||currentShot>totalShot)
{
return;
}
//以后枪枪都中10都不能满足条件,game over
if(((totalShot-currentShot+1)*10)<(totalScore-cNum))
{
return;
}
//打够次数了并且总共达到了预期环数
if(currentShot==totalShot)
{
//这种可能性成立
SumRate++;
return;
}
for(int i=0;i<ScoreArray.Length;i++)
{
Compute(currentShot+1,cNum+ScoreArray[i]);
}
}
}
}
56最后结果为:92378
九皇后问题太复杂了,先没研究!
0-1背包问题
九、STL模板与容器暂时跳过。
十、面向对象
对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。
类和结构体的区别是:类的变量默认是private的,而结构体默认是public的。
类的静态成员变量在一个类的所有实例间共享数据,如果想限制对静态成员变量的访问,应该声明城保护型或者私有型。不允许用静态成员变量存放某一个对象的数据。
常量必须在构造函数的初始化列表里面初始化或者将其设置成static。
析构函数可以是内联函数。
MFC将Cobject类的析构函数设置成呢个virtual的原因是因为这样的话它的派生类的析构函数都会自动变成virtual,这就保证了在任何情况下不会出现由于析构函数未被调用而导致的内存泄露。
何为虚调用?
虚函数需要维护一个V表?
字符串赋值:
If (str==NULL)
{
m_data=new char(1);
*m_data=’\0’;
}
Else
{
Int length=strlen(str);
M_data=new char(length+1);
Strcpy(m_data,str);
}
多态性可以简单概括为“一个接口,多种方法”,在程序运行过程中才决定调用的函数。
覆盖是指子类重新定义负累的虚函数的做法,而重载是指允许存在多个同名函数,而这些函数的参数表不同。重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称进行修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。重载与多态无关,真正和多态相关度的是“覆盖”,当子类重新定义了父类的虚函数后,父类指针根据赋给他的不同的子类指针,动态地调用属于子类的该函数,这样的函数调用是在编译期间无法确定的,因此,这样的函数地址是在运行期间绑定的(晚绑定),结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关。
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已经存在的代码模块;他们的母的都是代码重用,而多态则是为了实现另一个目的——接口重用!而实际上的情况往往是:要实现代码重用很难,而真正最有加之的重用是接口重用。多态的本质是将子类类型的指针赋值给负累类型的指针。
重载与覆盖是有本质区别的!
十一、继承与接口
虚函数会被子类覆盖,而普通函数不会,当出现Parent *p = new Son()时候,p指向的是父类。
私有继承使父类中所有元素无法与子类联系。
一个私有的或者保护的派生类不是子类,因为非公共的派生类不能做基类能做的事。
公有集成就像是三口之家的小孩,饱受父母的温暖,享有父母的一切(public和protected的成员),其中保护的成员不能被外界所享有,但可以为小孩所拥有,只是父母还有一点点隐私(private成员)不能为小孩所知道。
私有继承就像是离家出走的小孩,一个人在外面漂泊,不能拥有父母的住房和财产,在外面也不能代表父母,甚至他不算是父母的小孩,但是在他的身体李,流淌着父母的血液,在其自己的行为中有与其父母相似的成分。注意:虽然私有继承的类不可以使用父类的方法,但是可以在自己的行为中调用父母的方法。保护继承则不能在公共场合使用基类的成员。
三种继承方式:P135
公有继承时,派生类的对象可以访问基类的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。
私有继承时,基类的成员只能由直接派生类类访问,无法在往下继承(因为已经转化为私有了)。
保护继承时,与私有继承相同,唯一不同是对于派生类的成员而言,都变成了保护类型。
保护继承和私有继承只是在技术上讨论时有一席之地。
虚继承?虚表?
虚继承是为了解决多重继承的问题的,比如B,C都继承于A,然后D继承于B和C,这样A就出现了两次,即所谓“菱形继承”,可以设置B和C虚继承于A来解决。
鸵鸟和鸟的问题:鸵鸟has some kind of鸟的特性,而不是a kind of鸟。因此继承时候可以将适合鸵鸟的函数挑选出来。重载一下。
注意:如果不指定继承方式,默认的是私有继承。
若是逻辑上A是B的一部分,则不允许B从A派生,而是要用A和其他东西组合出B,即在A中选用那些元素类的对象作为成员。P144
注意:子类的初始化要包含负累的初始化,如derived(int x,int y):base(x)
含有纯虚函数的类是不可以实例化一个对象的。所谓纯虚函数是指:virtual void Draw()=0这样的,改成vortual void Draw(){}就变成了普通虚函数,就可以实例化对象了。P146
虚指针或虚函数指针是一个虚函数的实现细节,带有虚函数的类中每一个对象都有一个虚指针指向该类的虚函数表。
COM是什么?
十二、位运算与嵌入式编程
#include <stdio.h>
int main()
{
}
居然第一个是0.000000,第二个是一个大数,出乎意料啊!
八进制转十进制:P153
书上是oct/10*8+oct%10;
这个显然只是适合两位的八进制数,而要扩展到任意位数,可以用:
Int r=1;
While(oct!=0)
{dec+=(oct%10)*r;
Oct/=10;
R*=8;
}
这里的思路是:首先从低位算起,然后幂升级,直到位数算完。
四种casting算符:完全不懂!
Static_cast数制转换
Dynamic_cast用于执行向下转换和在继承之间的转换。
Const_cast去掉const
Reinterpret_cast用于执行并不安全的implementation_dependent类型转换。
ISR(中断服务子程序)
1、
2、
3、
4、
Volatile的作用:
当一个对象的值可能会在编译器的控制或监测之外被改变时,例如一个被系统时钟更新的变量,那么该对象应该被声明成volatile。主要母的是提示编译器该对象的值可能在编译器未检测到的情况下被改变,因此编译器不能武断地对这些对象的代码做优化处理。
Static的作用:
在C语言中,static有三个明显的作用:
1、
2、
3、
Const int *a :a是一个指向常整型数的指针(数不可以修改,但指针可以)
Int * const a: a是一个指向整型数的常指针(数可以修改,但指针不可以)
Int const* a const: a是一个指向常整型数的常指针(两者皆不可以修改)
访问一个绝对地址的方法是将绝对地址整型数强制转化为一个指针:
Int * ptr;
Ptr=(int *) 0x67a9;
*ptr=0xaa55;
#define dPS struct s*
Typedev struct s* tPS
两者相比后者更佳,因为当dPS p1,p2时,仅仅将第一个定义为指针,后者定为普通结构。
十三、数据结构基础
单链表
双链表
循环链表
以上操作分为:创建,测长,插入节点,删除节点,逆置,打印。相应算法要熟悉。
如何证明一个表是循环链表:
可以设置两个步长不等的游标,一个步长为1,一个步长为2,两个游标同时触发若能再次相遇则证明该表是循环链表。
Heap和stack的区别:P184
Heap是堆,stack是栈。Stack的空间由操作系统自动分配和释放,而heap的空间手动分配和释放。
Stack空间有限,而heap是很大的自由存储区。
C中的malloc函数分配的内存空间在堆上,而C++对应的是new操作符。
程序在编译期间对变量和函数分配内存都在栈上进行,而程序运行过程中函数调用时参数的传递也在栈上进行。
平衡二叉树是一棵空树或者具有下列特点的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树深度之差不超过1。
排序的稳定性:当待排记录的关键字存在相同记录,经过排序后这些关键字之间相对顺序不变的,称为是稳定的,如果发生了变化称为不稳定的。
若在排序过程中,整个文件都是放在内存中处理的,称之为内排序,若涉及到内外存的交换,称之为外部排序。
快速排序:
冒泡排序:
希尔排序:
对于已经接近有序的情况,冒泡是最快的。
哈希表是什么?
霍夫曼编码是什么?
十四、字符串
整数转化为字符串,可以采用加’0’,在逆序的办法,整数加’0’后隐形转化为char类型的数,反过来也是一样,要将字符串转化为整数,可以采用减’0’乘十然后累加的形式。P203
字符串拷贝函数:
Char *strcpy(char *strDest,const char* strSrc)
{
While((*strDest++=*strSrc++)!=’\0’)
NULL;
Return address;
}
这里的返回值是为了实现链式表达式。
动态内存分配:
用到两个函数,一个是void *malloc(unsigned int size),这个函数分配size长度的连续空间,返回的是指向这个地址的指针,如果分配失败,返回NULL。分配的内存也需要释放,用到void free(void *p)函数,注意这里的指针p必须是先前用malloc分配时候返回的那个,否则将引起不可预料的结果。重要的是指针所指向的地址,而非指针本身!
Strcpy()和memcpy()的区别:前者是拷贝字符串的,遇到\0则删去该字符,结束拷贝。而memcpy可以拷贝任意类型的数据,需要执行要拷贝的字节数。
通常在拷贝字符串时候用strcpy()函数,而拷贝其他的用memcpy()函数。
自己写memcpy函数也是跟strcpy()差不多:
Void * memcpy2(char *pvTo,char *pvFrom,size t_size)
{
}
字符数组并不要求最后一个字符为’\0’,是否需要加入’\0’,完全由系统需要决定,但是字符数组的初始化要求最后一个字符必须为’\0’,否则会出错,因此,插入char c[5]={‘C’,’h’,i’,’n’,’a’}
不允许建立空数组,int a[]是错误的。
字符串操作部分是比较有难度的,要多看几遍。
十五、设计模式(跳过)
十六、操作系统
进程和线程的差别
进程是程序的一次执行。
线程可以理解为进程执行的一段程序片段。
进程是独立的,这表现在内存空间、上下文环境上;线程运行在进程空间中。
一般而言,进程无法突破进程边界存取其他进程内的存储空间,而线程由于出于进程空间中,所以统一进程所产生的线程共享统一内存空间。
统一进程中的两段代码不能够同时执行,除非引入线程。
线程是属于进程的。
进程间通信的方式:信号,信号量,消息队列,共享内存。
Windows中互斥器mutex可以用于进程之间互斥,临界区critical section用于线程之间的互斥。
进程进入等待状态的方式:1、CPU调度给了优先级更高的线程,原来的线程就进入等待状态。2、阻塞的Thread获得资源或信号,进入等待状态。3、在时间片轮转的情况下,如果时间片到了,也进入等待状态。
垃圾回收(内存管理)问题?
操作系统中的缓存是快表——用来存放当前访问最频繁的少数活动页面的页号。
CPU中的缓存——高速缓冲存储器——介于CPU和内存之间。
十七、数据库与SQL语言
数据库范式:
1NF:每一个值都是不可分解的。
2NF:第一范式的基础上,如果R中每一个非主属性完全函数依赖于R中的某个候选键。
3NF:第二范式的基础上,每个非主属性不传递依赖于某个候选键。
BCNF:第一范式的基础上,每个属性都不传递依赖于R的候选键
4NF:D是R上的多值依赖集合,如果D中成立非平凡多值依赖X->->Y时,X必是R的超键,那么称R是第四范式的模式。
存储过程与函数的区别:
存储过程是一系列SQL语句的集合,涉及特定表或者对象的任务,函数不涉及特定用户表。
事务是什么?ACID?p274
SQL注入性攻击?
SQL查询语句:
找出表ppp中num最小的数,不用min
Select * from ppp where num<=all(select num from num)
或者:
Select top 1 num from ppp order by num
找出表中最小的数,可以用min
Select * from ppp where num=(select min(num) from ppp)
选出ppp中num重复的记录
Select * from ppp
Where num in (select num from ppp group by num having(count(num)>1))
十八、计算机网络及分布式系统
OSI模型中,物理层的作用是透明的传输比特流。
对等实体在一次交互作用中传送的信息单位称为协议数据单元,包括控制信息和用户信息两部分。
七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
物理层设计到在信道上传输的原始比特流。
数据链路层主要任务是加强物理层传输原始比特流的功能,封装成帧。
网络层关系到子网的运行控制,其中一个关键问题就是确认从源端到目的端如何选择路由。
传输层的基本功能是从会话层接收数据而且将其分成较小单元传递给网络层。
会话层允许不同的及其的用户建立会话关系。
表示层用来完成某些特定的功能。
应用层包含着大量人们普遍需要的协议。
交换和路由的区别?P287
让主网分成两个网段,子网掩码分别是0xff 0xff 0x80 0x00和0xff 0xff 0x00 0x00
FTP是基于TCP协议的。
一个C类网络最多容纳254台主机。
SNMP?P292
没有细看!
十九、英语面试
May I coming?
Excuse me, Is this personel department?
Excuse me for interrupting you. I’m here for an interview as requested.
-Heavy traffic?
-Yes, it was heavy but since I came here yesterday as a rehearsal, I figured out a direct bus line from my school to your company, and of course, I left my school very early so it doesn’t matter to me.
Sorry, I beg your pardon.
Thank you sir!
Yes, As you mentioned just now….As far as I know…..As is shown in my resume…. As my previous experience shows…
-Can you sell yourself in two minutes?
-With my qualifications and experience, I fell I am hardworking, responsible and diligent in any project I undertake. Your organization could benefit from my analytical and interpersonal skills.
I will try to present my ideas in a more clear and civilized manner in order to get my points across.
I will stay as long as I can continue to learn and to grow in my field.
Perhaps, an opportunity at a management position would be exciting.
二十、电话面试
I was admitted by xxx university. My field of study is xxx which is a famous one in China. My undergraduate study gave me a wide range of vivison, I fulfilled the courses like English, Network and Programming, I have a deep understanding in Programming. I developed several professional interests, like Histrory and microeconomics at my spare time. The several years working experiece give me full play to my creativity, diligence and interlligence , I believe I can do my job well.
Idea job :P326
END