深圳火风山林公司高级游戏开发工程师面试题目
1 请简述您对面向对象编程的理解,使用原则和优缺点。不需要叙述面向对象是什么。
1)开闭原则:对修改关闭,对扩展开放。
2)里氏代换原则:任何基类出现的地方,子类一定可以出现。
3)依赖倒换原则:依赖抽象,不依赖实现。
4)合成聚合原则:在新的对象里面,使用已有的对象,达到复用的原则。
5)迪米特原则:一个实体应当尽可能少的和其他实体发生相互作用。(直接与你的朋友通信,不和陌生人说话,每一个软件单位对其他单位拥有最少知识)
6)接口隔离原则:使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖,应该建议在最小的接口上。(利用委托分离接口,利用多继承分离接口)
7)单一职责原则:不要把变化原因各不相同职责放到一起。
2 请实现一个函数:按指定位置交换字符串的两部分位置。比如:函数输入("abcdefg",2),输出"cdefgab";
1 // ConsoleApplication5.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <cstring> 7 8 9 using namespace std; 10 11 char* convert(const char *arr,int pos) 12 { 13 const size_t length = strlen(arr); 14 cout << "the length of the array is:" << length << endl; 15 char *arr1 = new char[length+1]; 16 for (size_t i = 0; i < length; ++i) 17 { 18 arr1[i] = arr[i]; 19 } 20 arr1[length] = '\0'; 21 char c; 22 for (int j = 0; j < pos; ++j) 23 { 24 c = arr1[0]; 25 for (size_t i = 0; i < length; ++i) 26 { 27 arr1[i] = arr1[i + 1]; 28 } 29 arr1[length - 1] = c; 30 } 31 32 return arr1; 33 } 34 35 int main() 36 { 37 char *pc = convert("helloworld1234321",5); 38 while (*pc) 39 { 40 cout << *pc; 41 ++pc; 42 } 43 pc = pc - strlen("helloworld1234321"); 44 delete [] pc; 45 46 system("pause"); 47 return 0; 48 }
这里需要注意如下几个地方:
1)因为传入了C风格字符串,但是C风格字符串不能修改,所以需要重新复制一份。
2)复制的时候不能忘记了结束符\0。
3)要返回这个数组,所以需要new 一个字符数组出来,并且需要在外面程序释放这个数组。
4)使用delete [] pc 的时候,需要注意,该指针的值必须是指向数组头部的。否则会引起异常。
5)留意一下,这里有更好的实现方法。
3 请实现一个函数:凑14:输入很多个整数(1<=数值<=13),任意两个整数相加等于14就可以从数组中删除这两个数,求剩余数(按由小到大排列)。比如:输入数组[9,1,9,7,5,13].输出数组[7,9]。
4 请阐述您对"优秀的代码" 的理解,什么样的代码才算优秀的代码。
5 加分题:请个出方案估计本城市一天中所有路由的直行车(次)和转弯车(次)的比值。(使用合理假设和估算来近似计算,最后需要算出一个具体数值)。