技术面试题目及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时间有限公司技术部面试试题
游戏开发类:
编程题:
1 请写代码打印100之内的素数,讲求效率(请做你的解法的效率分析)
2 求m,n的最大公约数
3 输入10个字符串,打印出其中重复的字符串以及重复的次数
4 请画图例(UML最好),给出windows下的文件目录的设计模式
5用多种方法对数据进行排序。
(选择排序、插入排序、冒泡排序、快速排序等)
技术问答题:
1 什么是单元测试?你用过哪些单元测试工具?他们的区别和好处各有哪些?你主要倾向于哪一种?
2 什么是编程规范?你倾向于什么样的规范?他的好处在哪?
3 什么是头文件依赖?你注意过这些问题吗?你注意过编译的时间吗?你怎么改进编译时间?
4 什么是面向对象?你在哪些方面用过面向对象?带来了什么好处?又有什么弊端?
5 什么是设计模式?使用设计模式有什么好处?列举你使用过的设计模式知识。
6 什么是“引用”?申明和使用“引用”要注意哪些问题?
7 面向对象的三个基本特征,并简单叙述之?
8 请尽可能举出你所知道的数据库备份与还原的方法
9 中断是什么?CPU在中断的时候做了些什么?
10 多任务系统里面,一个任务可以在占有资源的同时申请资源,这会导致什么情况?并简述发生这种情况的必要条件。
数学题
1 1-9这9个数字中,选3个出来,其和为奇数的组合有几个?
2 请把16进制数270F转化为十进制数
游戏策划类:
关于游戏的了解:
1.您从什么时候开始接触游戏的(不论是街机或者是电视游戏,还是电脑游戏)?第一眼见到游戏的时候,您感觉如何?您觉得现在的游戏怎么样?
2.游戏的哪些因素是您最关注的,画面、剧情、音乐、整体流畅感和平衡性?哪些类型的游戏您最喜欢玩?
3.在您玩游戏的时候,突然游戏出现某个漏洞,您的感觉是?
4.请问你使用过何种游戏修改工具,特别擅长哪种,请就你熟悉的一款单机游戏把里面一段数据完整的分析出来
5.请问您知道BUG一次的含义吗?游戏中的致命BUG一般频繁出现在什么地方?所谓致命BUG:就是能让一款游戏玩家人数锐减的那种啦,如:游戏金钱方面的,游戏平衡方面的等等。
6.如果您玩网络游戏的话,举几个你曾经在网络游戏中发现的BUG,最好是你站在玩家的立场上看,觉得可利用价值最高的BUG,然后简述一下当时发现的情景和过程。
7.在熟悉或者通关游戏之后您会为您付出的这段游戏时间写点东西吗?或者会下其余时间研究研究您玩过的这款游戏?
8.您关注游戏市场上的行情吗?请就你熟悉的游戏类型对现在的游戏市场简要说明一下。
分为以下三方面:手机游戏市场,电视游戏和单机市场,网络游戏市场。
Web前端开发类:
1、CSS+DIV开发Web页面的优势有哪些?
2、两种跳转方式分别是什么?有什么区别? 有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp”>
3、搜索引擎如何抓取网页和如何索引网页
4、简述列举文档对象模型DOM里document的常用的查找访问节点的方法
5、在IE中,HTML对象的ID 可以作为document 的下属对象变量名直接使用,在FF中不能,此兼容性问题如何解决?
6、引入样式表的方式有几种?
7、JavaScript是一门基于解释性的语言,它和java语言的区别?
8、JS中的三种弹出式消息提醒(警告窗口、确认窗口、信息输入窗口)的命令是什么?
游戏美术类:
考查对于PS,3DsMax(或MAYA),AE等软件的熟悉程度
答案:
编程题:
1 考察数据结构的知识点,这里可使用筛选法,该方法是大部分数据结构书籍都有讲解的算法,当然还有时间复杂度更低的算法(空间复杂度),但是因为求值范围为1 -100 ,故综合来看,筛选法的效率是最高的。
int main()
{
int *sieve;
int n;
int iCounter=2, iMax, i;
printf(“Please input max number:”);
scanf(“%d”, &n);
sieve=(int*)malloc((n-1)*sizeof(int));
for(i=0;i<n-1;i++)
sieve[i]=i+2;
iMax = (int)sqrt(n);
while (iCounter<=iMax) {
for (i=2*iCounter-2; i<n-1; i+=iCounter)
sieve[i] = 0;
iCounter++; }
for(i=0; i<n-1; i++)
if (sieve[i]!=0) printf(“%d ”,sieve[i]);
return 0;
}
2、考察数据结构的知识点,求公约数的算法很多,可考虑效率较高的欧几里德递归算法, int gcd(int m,int n){
int temp = 0;
if(m < n){
temp = m;
m = n;
n = temp;
}
if(n == 0)
return m;
else
return gcd1(n, m%n);
}
3、考察C ++容器的知识,这里考察的MAP
int main()
{
string str;
map<string, int> content;
for( int cnt = 0; cnt < 10; cnt++ ){
cin >> str;
(content.insert(make_pair(str, 0)).first)->second++;
}
map<string, int>::iterator it = content.begin();
for( ; it != content.end(); ++it )
cout << it->first << ”: ” << it->second << endl;
return 0;
}
4、考察数据结构,文件目录是一个树
5、考察基础编程能力
#include<iostream>
using namespace std;
template<class T>
void Swap(T *a, T *b)
{
T temp;
temp = *a;
*a = *b;
*b = temp;
}
/**************************************** 简单排序算法 begin
****************************************/
/*
* 简单选择排序
* A: 以数组存放的无数数
* n: 数组A中从位置0到n排序(从小到大)
*/
template<class T>
void SelectSort(T A[], int n)
{
int small;
for( int i = 0; i < n - 1; i++) { // 执行 n-1 趟
small = i; // 先假定待排序序列中第一个元素最小
for( int j = i + 1; j < n; j++ ) { // 每趟扫描待排序序列n-i-1次
if( A[j] < A[small] ) { // 如果扫描到一个比最小值元素还小的,则记下其下标
small = j;
}
}
Swap(&A[i],&A[small]); // 最小元素与待排序序列中第一个元素交换
}
}
/*
* 直接插入排序
* A: 以数组存放的无数数
* n: 数组A中从位置0到n排序(从小到大)
*/
template<class T>
void InsertSort(T A[], int n)
{
for(int i = 1; i < n; i++) { // 执行 n-1 趟
int j = i;
T temp = A[i]; // 待插入元素存入临时变量 while(j > 0 && temp < A[j-1]) { // 从后往前查找插入位置 A[j] = A[j-1]; // A[j-1]元素后移
j--; // j指针前移
}
A[j] = temp; // 待插入元素存入找到的插入位置
}
}
/*
* 冒泡排序
* A: 以数组存放的无数数
* n: 数组A中从位置0到n排序(从小到大)
*/
template<class T>
void BubbleSort(T A[], int n)
{
int i,j,last;
i = n - 1;
while( i > 0 ) { // 最多进行n-1躺
last = 0; // 将last赋值为0
for( j = 0; j < i; j++) { // 从前往后进行相邻元素的两两比较
if(A[j+1] < A[j]) {
Swap(&A[j],&A[j+1]); // 后者小,则交换
last = j; // 有交换,last置为j
}
}
i = last; //如果一趟没有元素交换,则last为0
}
}
/**************************************** 简单排序算法 end
****************************************/
/**************************************** 快速排序 begin
****************************************/
/*
* 快速排序
* A: 以数组存放的无数数
* left和right: A[left] 和 A[right] 之间的元素排序
*/
template<class T>
void QuickSort(T A[], int left, int right)
{
int i,j;
if(left < right) { // 若待排序序列多于一个元素,则继续快速排序
i = left; // 游动指针i,j
j = right + 1;
Swap(&A[left],&A[(left + right)/2]); // 避免最坏境况发生
do{ // 开始一趟快速排
序,A[left]做为分割元素
do i++; while(A[i] < A[left]); // i指针从左往右找第一个大于等于分割元素的元素
do j--; while(A[j] > A[left]); // j指针从右往左找第一个小于等于分割元素的元素
if( i < j ) Swap(&A[i],&A[j]); // 若 i < j,则交换两个元素
} while(i<j); // 若 i < j,则继续本趟排序
Swap(&A[left],&A[j]); // 交换分割元素A[left]和A[j]的位置
QuickSort(A,left,j-1); // 对低端序列快速排序
QuickSort(A,j+1,right); // 对高端序列快速排序
}
}
/**************************************** 快速排序 end
****************************************/
/*对上面的几种排序算法,进行简单的测试*/
int main() {
int a[5] = {2,1,6,8,3};
// SelectSort(a,5);
// InsertSort(a,5);
// BubbleSort(a,5);
QuickSort(a,0,4);
for(int i = 0; i < 5; i++) {
cout << a[i] << " ";
}
cout << endl;
return0;
}
技术问答题:
1、单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。
通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
主要单元测试工具:QTP:quicktest Professional.,C++ TEST
2、规范编程内容:标识符规则---类,方法,变量,同时也是包名的规范
由字母(汉语中的一个汉字是一个字母),数字,下划线和$组成,不能以数字开头。
大小写敏感
没有长度限制,不能有空格
不能使用Java的关键字和保留字
java中的关键字
goto和const在java中虽然不再使用但是还作为保留字存在
java中没有sizeof这个关键字了,java中的boolean类型的值只能用true和false,且这两个也是关键字
enum 枚举assert 断言
一个标识符尽量符合语义信息,提高程序可读性
类名:每个单词首字母大写,
变量和方法:第一个单词小写,后边的每个单词首字母大写
包名:全部小写
常量:全部大写以下划线分词
局部变量:定义在方法中的变量
(1)先赋值后使用
(2)从定义变量的代码块开始到代码块结束
(3)在同一范围内不允许两个局部变量发生命名冲突
3、简单点说,对于一个vector<int>的函数,比如size(),如果在不同的cpp中出现,在这些文件编译的时候都要把vector<int>::size()编译一遍。
然后在链接的时候把重复的函数去掉。
很显然增加了编译时间。
模板的声明是不编译的,更没有空间,它根本不是实际的类型或函数,编译器根本不管它。
只有实例化的时候,才生成真正的类型、函数,而实例化的地方不在一起,必然造成同一个类型、函数被编译了多次。
反观类的编译,只在它的cpp中编译一次,其他地方都使用它的头文件得到声明。
4、面对对象就是:
把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。
对同类对象抽象出其共性,形成类。
类中的大多数数据,只能用本类的方法进行处理。
类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
程序流程由用户在使用中决定。
5、设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
好处:(1)、复用解决方案——通过复用已经公认的设计,能够在解决问题时取得先发优势,而且避免重蹈前人覆辙。
可以从学习他人的经验中获益,用不着为那些总是会重复出现的问题再次设计解决方案。
(2)、确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。
设计模式在项目的分析和设计阶段提供了共同的基准点。
(3)、提高观察高度--模式还提供了观察问题、设计过程和面向对象的更高层次的视角,这将可以从“过早处理细节”的桎梏中解放出来。
(4)、大多数设计模式还能使软件更容易修改和维护。
其原因在于,它们都是久经考验的解决方案。
所以,它们的结构都是经过长期发展形成的,比新构思的解决方案更善于应对变化。
而且,这些模式所用代码往往更易于理解——从而使代码更易维护。
6、引用就是对某个变量其别名。
对引用的操作与对应变量的操作的效果完全一样。
2. 申明一个引用的时候,切记要对其进行初始化。
引用声明完毕后,相当于目标变量名有两个
名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。
声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。
3.不能建立数组的引用。
// 切记不能建立数组的引用
7、面向对象是一种程序设计的思想,简单的讲,就是封装,继承,多态;当然,也可以说抽象。
封装这个概念简单的说,对于简单的数据类型,有它自己的封装类(通常我们说的打包);对于引用类型,类就是一个封装体的一个表现.
继承:子类继承父类(也就是派生类继承基类),它具有可扩展性,便于程序代码的重用性。
继承可以实现多态:通过重写(覆写),通过对象上传可以实现
多态:通过重写和重载实现
抽象:面向接口编程
8、(1).打开块检查(block checking)
(2).用rman备份时打开块跟踪(10g以上)
(3). 镜像日志组成员。
(4). 备份时使用check logical 选项这会让rman检查块中的逻辑损坏以及头尾校验,这是获得良好备份的最好方式。
(5). 测试你的备份做任何操作都不如实际恢复一次数据库。
(6). 每个数据文件在一个单独的备份片中做部分恢复时rman必须读取整个备份片和必须的归档日志。
(7). 维护rman 的恢复目录和控制文件仔细选择你的保留政策。
(8). 预防控制文件丢失这将确保您始终具备最新controlfile的可用。
(9). 测试你的恢复在恢复场合,会让你知道恢复将怎样执行。
(10). 在备份归档时不要使用delete all input DELETE INPUT 将从第一个归档位置删除日志。
9、CPU工作方法分为中断模式和查询模式.
查询模式就是说CPU轮翻的对外设顺序访问,比方说它先看看键盘有没被按下有的话处理,没的话继续往下看鼠标有没有移动再看看打印机印的怎么样了,再看...等等..显然查询方式的效率低.但稳定可靠.
中断模式时就是说CPU不主动访问这些设备,,只管处理自己的任务,没任务就闲着.也就是说在那等着.如果有设备要与CPU联系,或要CPU处理一些事情,他会给CPU发一个中断请求信号.一种情况是这时CPU就会放下正在进行的工作而去处理这个外设的要求.这叫做响应中断.处理完中断后,CPU返回去继续执行中断以前的工作.还有一种情况如果CPU这时正在做更重要的事情他就会让这个设备先在那等着.有空时响应他.如果同时有好几个设备都要CPU来处理,CPU就会从按重要程度来逐个处理.这就是中断和中断的优先级
10、死锁
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
数学题:
1、采用分类讨论的方法,首先,要是三个数字的和是奇数.那么共有
1 奇数+奇数+奇数=奇数
2 偶数+偶数+奇数=奇数
第一种情况是在5个中取出3个奇数.共有10方法.(这是一个组合)
第二种情况是在这九个数字中取出两个偶数,即在4个偶数中取出2个偶数.共有4×3/2!=6种方法.忘记了还有五个奇数中再选取一个.5×6=30
所以一共有40种方法.
2、9999
Web前端开发类:
1、(1)div+css,这个网页设计模式中,div承担了网页的内容,css承担了网页的样式。
这样就使网页的内容和样式的分离开来。
有利于页面的维护升级。
(2)有助于提高搜索引擎亲和力(快速找到需要的数据,而不是像在table中一层层的查找)
(3)有助于页面的重构(换皮肤如blog,直接套用另外一套样式就可以实现,而不用改动网页脚本。
)
2、在JSP中,跳转页面有两种方式:1.forward跳转:<jsp:forward page="跳转页面地址" />2.response跳转:response.sendRedirect("跳转页面地址");两种跳转的区别如下:1.forward跳转:a.服务器端跳转,地址栏不改变;b.执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源);c.request设置的属性在跳转后的页面仍可以使用;d.使用<jsp:param name="参数名" value="参数值" />传递参数。
2.response跳转:a.客户端跳转,地址栏改变;b.所有代码执行完毕后跳转;c.跳转后的页面不能使用上一个页面的request属性;d.使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。
3、每个独立的搜索引擎都有自己的网页抓取程序(spider)。
Spider顺着网页中的超链接,连续地抓取网页。
被抓取的网页被称之为网页快照。
由于互联网中超链接的应用很普遍,理论上,从一定范围的网页出发,就能搜集到绝大多数的网页。
抓取网页信息需要有高性能的“网络蜘蛛”程序(Spider)去自动地在互联网中搜索信息。
一个典型的网络蜘蛛工作的方式,是查看一个页面,并从中找到相关信息,然后它再从该页面的所有链接中出发,继续寻找相关的信息,以此类推,直至穷尽。
网络蜘蛛要求能够快速、全面。
网络蜘蛛为实现其快速地浏览整个互联网,通常在技术上采用抢先式多线程技术实现在网上聚集信息。
通过抢先式多线程的使用,你能索引一个基于URL链接的Web页面,启动一个新的线程跟随每个新的URL链接,索引一个新的URL起点。
当然在服务器上所开的线程也不能无限膨胀,需要在服务器的正常运转和快速收集网页之间找一个平衡点。
在算法上各个搜索引擎技术公司可能不尽相同,但目的都是快速浏览Web 页和后续过程相配合。
目前国内的搜索引擎技术公司中,比如百度公司的网络蜘蛛采用了可定制、高扩展性的调度算法使得搜索器能在极短的时间内收集到最大数量的互联网信息,并把所获得的信息保存下来以备建立索引库和用户检索。
4、1. 通过ID,使用getElementById() 获得标签节点
2. 通过标签的名称,使用getElementsByTagName() 获得元素节点或标签节点
注意:以上的查找方式都会忽略文档的结构
3. 通过使用一个元素节点的parentNode、firstChild 以及lastChild 属性
4. 节点名称nodeName
(a) 如果节点是标签,nodeName是标签名称
(b) 如果节点是属性,nodeName是属性名称
(c) 如果节点是文本节点,nodeName是#text
(d) 如果节点是文档,nodeName是#document
5. 节点值nodeValue
6. 节点类型nodeType
5、HTML 对象的id 作为对象名的问题
(1)现有问题
在IE 中,HTML 对象的ID 可以作为document 的下属对象变量名直接使用。
在火狐中不能。
(2)解决方法
用getElementById("idName") 代替idName 作为对象变量使用。
6、1.最常用的,引入样式表,在样式表中编写样式,引入方式如下:
<link href="css/style.css" rel="stylesheet" type="text/css">
2.在Html头部用<style></style>包起来,在这里面编写样式:
<style type="text/css">
*{
padding: 0;margin: 0
}
</style>
3.在标签里面直接编写行内样式。
<div style="color: #333"><div>
7、JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动。
使用它的目的是与HTML超文本标识语言、Java 脚本语言一起实现在一个网页中链接多个对象,与网络客户交互作用,从而可以开发客户端的应用程序。
它是通过嵌入或调入在标准的HTML语言中实现的。
8、1、警告框alert,在js中直接运用alert("警告");
2、确认框confirm。
confirm() 方法用于显示一个带有指定消息和OK 及取消按钮的对话框,根据用户点击确认框上的按钮返回true与false。
用法:
if(confirm("确定要清空数据吗?"))
{
document.main.text1.value="";
}
3、信息输入框prompt。
prompt() 方法用于显示可提示用户进行输入的对话框。
如果用户单击提示框的取消按钮,则返回null。
如果用户单击确认按钮,则返回输入字段当前显示的文本。
用法:
var name = prompt('请输入数字','');。