TA的每日心情 | 开心 2015-10-14 21:28 |
---|
签到天数: 31 天 连续签到: 1 天 [LV.5]常住居民I
|

楼主 |
发表于 2008-4-3 18:05:45
|
显示全部楼层
GameLoft面试题目
1、 求下列代码执行以后expr的值
a) int a = 8,b = 4;
int expr = a++%++b*2
答案:6
注意:++运算符在变量前后的区别
b) int expr = 20 / 8 * 8;
答案:16
注意:整数和整数运算结果还是整数
c) int expr = 4 << 2 + 1;
答案:32
注意:+的优先级高于<<
d) int expr = -4321 >>>30;
答案:3
e) int expr = 123 ^ 321 ^ 123;
答案:321
注意;换算成int进行位运算
f) int a = 255;
int expr = (byte)a + (((byte)a) & 0xff);
答案:254
注意:byte运算的结果是int类型
g) int expr = “123454321”.charAt(4) + 2;
答案:55
注意:字符进行四则运算时是使用字符编码进行运算
h) Integer a = new Integer(1234);
Integer b = new Integer(1234);
boolean expr = a == b;
答案:false
注意:==比较的是是否指向同一内存地址
i) String func(String s){
return s.length() > 0 ? func(s.substring(1)) + s.charAt(0) : “”;
}
String expr = func(“Gameloft”);
答案:tfolemaG
注意:这是一个递归实现
2、 知识题
a) 什么是**回收?什么时候触发**回收?如何降低**回收的触发频率?它能保证程序有足够的可用内存吗?
答案:**回收(GC)是Java语言的一个重要特性,作用是释放不再被使用的内存。**回收由系统进行管理。在系统认为需要的时候自动启动一个线程进行处理。
尽量减少**内存,也就是新建对象,的数量,可以降低**回收的频率。
**回收机制无法保证有足够的内存。
b) 请写出short的取值范围。
答案:-215~215-1
c) 什么是混淆(obfuscate)?有什么好处?有哪些工具可以混淆jar文件?
答案:混淆是指通过对class文件中的变量名和部分方法名进行处理,来提高代码反编译的难度。
好处主要有2个:1、提高反编译以后代码阅读的难度 2、降低class文件的大小。
常见的混淆器有Proguard和RetroGuard两种。
d) 什么是状态机?游戏开发中有那些地方能用到状态机?
答案:状态机(State Machine)是根据对应状态进行处理的一种机制,在游戏开发中最典型的应用是游戏人工智能(AI)等地方。
e) 请根据你的知识,对以下计算机名次进行尽量简单的描述:
i. J2ME
J2ME是一种使用Java语言进行嵌入式设备开发的技术。
ii. Python
Python是一种语法简单的面对对象的程序设计语言
iii. Ant
Ant是一种简化和统一项目编译的工具软件。
iv. Javac
Javac是Java语言的编译程序
v. Subversion
Subversion是新一代的版本工具
vi. OpenGL
OpenGL是一套开发的图形界面开发库标准
f) 请列出你心目中一名优秀员工所应该具备的品质,并按重要程度排序
略
3、 分析以下程序:
const [j2me1]SCREEN_WIDTH = 176;
const [j2me2]TEXTWORD_SPACE = 3;
public static void DrawString(String strText,int posX,int posY,int flagX){
int width = GetTextWidth(strText);
int x,int [j2me3]y = posY;
if(flagX > 0){
x = 0;
}
else if(flagX == 0){
x = (SCREEN_WIDTH – width) / 2;
}
else{
x = SCREEN_WIDTH – width;
}
x += posX;
byte [j2me4]charTemp;
for(int i = 0;i <=[j2me5] strText.length();i++){
charTemp = strText.charAt(i);
if(charTemp < ‘!’ | charTemp > ‘z’){
x += TEXTWORD_SPACE;
continue;
}
x += DrawCharacter(charTemp,x,y);
}
}
问题:
1) 请尽量找出程序中的错误,直接标注在上面。
2) 请解释参数flagX的作用
flagX的作用是决定对齐方式,大于0左对齐,等于0居中,小于0右对齐
3) 请推测函数DrawCharater的返回值有什么意义?
字符charTemp的宽度
4、 应用题
a) 写一个函数判断两个圆是否相交,并尽量优化运行速度。
bool IsOverlapped(int x1,int y1,int r1,int x2,int y2,int r2)
/**
* 判断两个圆是否相交
* @param x1 第一个圆圆心的x坐标
* @param y1 第一个圆圆心的y坐标
* @param r1 第一个圆的半径
* @param x2 第二个圆圆心的x坐标
* @param y2 第二个圆圆心的y坐标
* @param r2 第二个圆的半径
* @return
*/
boolean IsOverlapped(int x1,int y1,int r1,int x2,int y2,int r2){
//两个圆心之间的距离的平方
int l = (x1 - x2)*(x1-x2) + (y1 - y2) * (y1 - y2);
if(l < (r1 + r2) * (r1 + r2)){
return true;
}else{
return false;
}
}
b) 写一个函数去掉一个字符串中单词间多余的空格,使得相邻两个单词间有且只有一个空格。例如当输入字符串是“Hello!_ _Game_programming_ _world!”时,调用该函数后字符串变为“Hello!_Game_programming_world!”。
/**
* 去除字符串中多余的空格
* @param s 需要处理的字符串
* @return 处理后的字符串
*/
String doString(String s){
String temp = "" + s.charAt(0);
for(int i = 1;i < s.length();i++){
char c = s.charAt(i);
//如果当前字符是空格
if(c == ' '){
//判断前一个不是是空格则添加,否则不添加
if(s.charAt(i- 1) != ' '){
temp += c;
}
}else{
temp += c;
}
}
return temp;
}
c) 假定屏幕的像素宽度为screenWidth,写一个函数计算一个字符串需要分成几行显示。
要求:
1、每行应尽可能多地显示字符,但不能有字符部分或完全显示在屏幕外。超过部分的字符换下一行显示。
2、每个字符的像素宽度不一样,每个字符的像素宽度不一样。用int GetCharWidth(char c)获得每个字符的像素宽度。
/*
* 计算一个字符串可以分多少行进行显示
* @param s 原始字符串
* @param screenWidth 屏幕宽度
* @return 行数
*/
int calcLineNum(String s,int screenWidth){
int length = 0;
//行数
int n = 0;
//统计长度
for(int i = 0;i < s.length();i++){
//当前字符的宽度
int charLen = GetCharWidth(s.charAt(i));
//总长度增加
length += charLen;
//如果达到屏幕宽度
if(length > screenWidth){
n++; //行数+1
length = charLen; //重新计算长度
}
}
//最后一行处理
if(length > 0){
n++;
}
return n;
}
5、 把以下段落翻译成中文
a) An integral approach to code documentation is to write the code so that it documents itself.In other words,the code should be naturally readable in such a way as to make it easy to understand .This is accomplished by proper naming conventions and statement formatting.
一份完整的代码文档是编写可以说明自身的代码。换句话说,代码应该是可读性好,便于理解的,这些是由恰当的命名规则和语句格式实现的。
b) Collections are the data structures that are most easily altered for performance-tuning purposes. Using the correct or most appropriate collection class can improve performance with little change to code. For example, if a large ordered collection has elements frequently deleted or inserted throughout it, it usually can provide better performance if based on a linked list rather than an array. On the other hand, a static(unchanging) collection that needs to be accessed by index performs better with an underlying implementation that is an array.
集合是为了性能调整目的很容易进行更改的数据结构,使用恰当的集合类可以在对代码进行很小更改的前提下改变程序的性能。例如如果有一个需要经常添加和删除的有序集合,使用链表可以比数组提供更好的性能,在另一方面,一个需要通过索引进行访问的静态集合,使用数组实现将更好一些。[j2me1]final static int
[j2me2]final static int
[j2me3]删除int
[j2me4]char
[j2me5]去掉=号 |
|