巨人网络面试题

来源:互联网 发布:教你如何在ty店里盘js 编辑:程序博客网 时间:2024/04/28 13:53
软件工程师笔试试题
笔试时间:三小时内 姓名: 开始时间: 完成时间: 余文瑛 08:10 11:10

(解题前,请首先写设计思路。 ) (请自行解答,一旦发现抄袭,笔试成绩取消。 ) 第一题:写一个函数,交换两个变量的值,不使用第三个变量。 第一题:写一个函数,交换两个变量的值,不使用第三个变量。 如 a=3,b=5,交换之后 a=5,b=3; 答: 描述:不使用新的空间,那么只能使用原来的变量‘记忆’旧的数据,由

void swap(int *a,int *b) { *a=*a+*b; *b=*a-*b; *a=*a-*b; } 第二题: 编程求两个矩形的相交矩形 第二题: 编程求两个矩形的相交矩形

//C++语言描述 语言描述

分别输入两个空间中两个矩形的左上角坐标 x,y,以及宽(width)高(height), 如果两个矩形有相交,输出相交的矩形左上角,右下角坐标,x1,y1,x2,y2 例如: 键盘输入: 0,0,100,100 20,20,100,40 输出: 20,20,100,60

算法描述: 我们将平面上的两个矩形分为左右两边,将左上角的横坐标较小的那个矩形 看成’左边’矩形,较大的为右边矩形。对于输入的 rect1 和 rect2,如果 rect2.p1.x 大于 rect2.p1.x 则交换他们的位置. 我们用 R1 表示左边巨型,R2 表示右边矩形 那么他们的相对位置有 4 种情况: (1) R1 右部上下两个顶点均 被包含在 R2 中 右部上下两个顶点均//被包含在 (2) R2 左部上下两个定点均被包含在 R1 中 (3) R1 右上方顶点被包含在右部矩形中,而右下角不在 右上方顶点被包含在右部矩形中, 包含, (4) R1 的右下角顶点被 R2 包含,而右上角不在 其中在(3)(4)种,还要分两种情况计算 其中在 种 还要分两种情况计算.

#include <iostream> using namespace std; //为了保证安全性,一般将类的成员访问属性设置为 private,通过相关的属性 函 为了保证安全性, 通过相关的属性(函 为了保证安全性 通过相关的属性 数进行访问), 数进行访问 ,但本例中 //为了简便,将部分成员直接设置为 public 访问属性 为了简便, 为了简便 class Point //定义点类 定义点类 { public: int x,y; public: Point() { } Point(int a,int b)

{ x=a; y=b; } }; class Rect //矩形类 矩形类 { public: Point p1; //左上角点坐标 左上角点坐标 int height; // 高 int width;//长 长

public: Rect(Point a,int w,int h) { p1=a; height=h; width=w; } Rect() {} }; class Intersect //处理相交情况类 处理相交情况类 { private: Rect R1,R2; //2 个矩形 public: Point p1; bool b_inter;//指示是否相交 指示是否相交 bool b_include;//指示是否包含 约定:包含必相交 指示是否包含(约定 指示是否包含 约定:包含必相交) public: Intersect(Rect rect1,Rect rect2 ) { R1=rect1; R2=rect2; b_inter=false;//指示两矩形是否相交,初始值为 false,在构造函数中初始化 指示两矩形是否相交, 指示两矩形是否相交 在构造函数中初始化 b_include=false; } void { slove() //求相交 求相交

if(R1.p1.x+R1.width>=R2.p1.x) // { include(); if(!b_include) shuzhifangxiang(); } else { swap(&R1,&R2); //使得 rect1 是"左边 图形 左边"图形 使得 左边 include(); if(!b_include) shuzhifangxiang(); } } void swap(Rect *r1,Rect *r2) //矩形交换位置, 矩形交换位置 目的是获得相对位置在左边 矩形交换位置, 的矩形为参照 {Rect temp; temp=*r1; *r1=*r2; *r2=temp;}

void include() //判断并求包含的相交 判断并求包含的相交 { if((R2.p1.x>=R1.p1.x)&&(R2.p1.y>=R1.p1.y)&&((R2.p1.x+R2.width)<=(R1. p1.x+R1.width))&&((R2.p1.y+R2.height)<=(R1.p1.y+R1.height))) {Point p11(R2.p1.x,R2.p1.y); Point p22(R2.p1.x+R2.width,R2.p1.y+R2.height); b_inter=true; b_include=true; p1=p11; p2=p22; cout<<"包含 包含"<<endl; 包含 }

} void shuzhifangxiang() //求非包含的相交 求非包含的相交 {

if(R1.p1.y>=R2.p1.y&&(R1.p1.y+R1.height)<=R2.p1.y+R2.height) //(1)R1 右部上下两个顶点均 被包含在 R2 中 右部上下两个顶点均//被包含在 { Point p11(R2.p1.x,R1.p1.y); Point p22(R1.p1.x+R1.width,R1.p1.y+R1.height); b_inter=true; p1=p11; p2=p22; cout<<"情况 1"<<endl; 情况 } //(2)R2 左部上下两个定点均被包含在 R1 中 if((R1.p1.y<=R2.p1.y)&&((R1.p1.y+R1.height)>=(R2.p1.y+R2.height))) { Point p11(R2.p1.x,R2.p1.y); Point p22(R1.p1.x+R1.width,R2.p1.y+R2.height); b_inter=true; p1=p11; p2=p22; cout<<"情况 2"<<endl; 情况 } //(3) if((R1.p1.y<=(R2.p1.y+R2.height))&&(R1.p1.y>=R2.p1.y)&&((R1.p1.y+R1. height)>=(R2.p1.y+R2.height)))//R1 右上方顶点被包含在右部矩形中,而右下角 右上方顶点被包含在右部矩形中, 不在 { //依然有两种情况 依然有两种情况 //1 只包含右侧矩形的 1 个端点 //2 包含右侧图形的 2 个端点 if(R2.p1.x+R2.width>=R1.p1.x+R1.width) { Point p11(R2.p1.x,R1.p1.y); Point p22(R1.p1.x+R1.height,R2.p1.y+R2.height); p1=p11; p2=p22; cout<<"情况 3.1"<<endl; 情况 } else {

Point p11(R2.p1.x,R1.p1.y); Point p22(R2.p1.x+R2.width,R2.p1.y+R2.height); p1=p11; p2=p22; cout<<"情况 3.2"<<endl;} 情况 b_inter=true; } if(((R1.p1.y+R1.height)>=R2.p1.y)&&((R1.p1.y+R1.height)<=(R2.p1.y+R2.h eight))&&(R1.p1.y<=R2.p1.y))//R1 的右下角顶点被 R2 包含,而右上角不在 包含, { //依然有两种情况 依然有两种情况 //1 包含右侧矩形的两个端点 //2 至包含右侧图形的 1 个端点 if(R1.p1.x+R1.width<=R2.p1.x+R2.width) { Point p11(R2.p1.x,R2.p1.y); Point p22(R1.p1.x+R1.width,R1.p1.y+R1.height); p1=p11; p2=p22; cout<<"情况 4.1"<<endl; 情况 } else { Point p11(R2.p1.x,R2.p1.y); Point p22(R2.p1.x+R2.width,R2.p1.y+R2.height); p1=p11; p2=p22; cout<<"情况 4.2"<<endl;} 情况 b_inter=true; } } }; int main() { //测试情况二 测试情况二 //Point p1(0,0); //Point p2(20,20); //Rect Rect1(p1,100,100); //Rect Rect2(p2,100,40); //测试情况一,三 测试情况一, 测试情况一 //..... Intersect inter(Rect1,Rect2);

inter.slove (); cout<<inter.p1 .x <<","<<inter.p1 .y <<endl; cout<<inter.p2 .x <<","<<inter.p2 .y <<endl; return 0;s } 第三题: 第三题:模拟实现乘法运算 A*B = C,A 和 B 最大值为 9999. 要求输出如下 1234 * 121 -------------1234 2468 1234 = -------------14 9 3 1 4 算法描述; 分别存储 2 个四位整数(注意在输入的时候 123 应当输入 0123, (1) 开辟两个数组, 即应该输入四位数) (2) 用第二个乘数的个位数分别乘以第一个乘数的个位,十位,百位和千位,并 处理进位问题 (3) 分别用第二个数的十位,百位,千位重复(2)的步骤 ,然后该和的个 (4) 将乘法中间数组 temp[4][8],竖直方向求和(并处理进位问题) 位数即是最终答案的对应为数值 (5) 输出最终答案数组 product[8]; #include<iostream> #include<math.h> using namespace std; class Help { public: int a[4],b[4]; //两个数组,分别存储两个乘数 两个数组, 两个数组 int product[8]; //存储成绩 存储成绩 int temp[4][8]; //存储中间乘法过程 存储中间乘法过程 public: void cout_1array(int A[]) //输出一维数组 输出一维数组 { int i; for(i=0;i<4;i++) cout<<A[i];

} void cout_2array(int A[][8]) //输出二维数组 输出二维数组 {int i,j; for(i=0;i<4;i++) { for(j=0;j<8;j++) { cout<<A[i][j]<<" ";} cout<<endl; } }

接受键盘输入, void cin_Aarray() //接受键盘输入,初始化一维数组 接受键盘输入 { for( int i=0;i<4;i++) cin>>a[i]; } void cin_Barray() //接受键盘输入,初始化一维数组 接受键盘输入, 接受键盘输入 { for( int i=0;i<4;i++) cin>>b[i]; }

void show_Multiplication() { int i,j,k=7,g,jinwei=0,l=0;

//模拟显示计算过程 模拟显示计算过程

for(i=3;i>=0;i--,k--,l++) { g=k; for(j=3;j>=0;j--,g--) { temp[l][g]=(jinwei+a[j]*b[i])%10 jinwei=(jinwei+a[j]*b[i])/10; } jinwei=0; }

;//

cout<<endl;

} void Multiplication() //计算两数的乘积 计算两数的乘积 { show_Multiplication(); int i,j,k,jinwei=0,sum; for(k=7,j=7;j>=0;j--,k--) { sum=0; for(i=0;i<=3;i++) { sum=sum+temp[i][j]; } sum=sum+jinwei; product[k]=sum%10; jinwei=(jinwei+sum)/10; } } private: void init_2array() //将二维数组中的初始化为 0 将二维数组中的初始化为 { for(int i=0;i<4;i++) for(int j=0;j<8;j++) temp[i][j]=0;

} public: Help() { init_2array() ;//将二维数组中的初始化 将二维数组中的初始化 }

};

int main() { Help help; help.cin_Aarray (); help.cin_Barray (); help.cout_1array (help.a ); cout<<"*"; help.cout_1array (help.b ); cout<<"="<<endl; //help.show_Multiplication (); help.Multiplication (); help.cout_2array (help.temp ); cout<<endl; for(int i=0;i<8;i++) cout<<help.product [i]; cout<<endl;

} 让它具备如下特性: 第四题:请设计一个 KString 类,让它具备如下特性 让它具备如下特性 1) KString str1 = "Hello"; 2) KString str2 = str1; 3) str += "world";在执行 1)之后,str1 的内容是 "Hello";在执行 2)之后,str2 的内容是 "Hello"; 但 是 str2 内部未给"Hello"分配新空间; 在执行 3) 之后, str2 的内容是 "Helloworld", str1 的内容是"Hello"而未改变; 请下载者自己搞定

问答题 第五题: 第五题 1、请问作完以上四题后,你对自已或对题目本身有如何的评价或体会。

答:第一题看起来简单,但是要求不使用新的变量,所以变成了一个简单的算法 题 第二题,其实考察的目的是游戏中的一个碰撞系统(两个图像均是矩形,如 果相交,则发生碰撞),因为时间限定在 3 小时内,所以很多注释和算法描述没 有时间写出来,抱歉。也因为时间的问题,所以很多地方没有使用 OOP 的方法 和思想,代码中也没有反应出设计模式思想(这本是我想显现的地方) 。 第三题和第四题都是偏算法的,本来以为会遇到 DirectX 3D 相关的题型,结 果没有,所以估计公司对游戏人工智能(AI)看的重些,觉得很支持,个人也觉得 解决问题的能力和思想,显得重要一些。 2、你理想中的优秀的软件开发师应该具备哪些特点 (1)喜欢软件开发行业,喜欢思考和对技术的热爱。当然着要建立在一些理工 科的教育背景之下。如果是游戏程序员,还要有对数学和游戏的喜爱。 (2)自主学习能力。在新工具和新领域不断出现的 e 时代,如果不肯学习,很 快就要 OUT,所以学习能力是程序员保持”青春”的药剂 (3)严谨的工作态度。如思维,编码习惯,和当下任务当下解决的毅力和习惯 (很多年轻人,喜欢把工作都往后推迟,就像学生在周日晚上补写下周一交的作 业一样,结果往往导致代码问题多多) (4)团队合作精神。软件,再也不是搭建和设计一个鸡窝那样简单,而是一个 庞大的软件工程,个人的英雄时代几乎已经结束,需要的是更多的来自各个行业 的人一起协作完成一个作品,只有建立一个高效的沟通,最终完成的才是当初设 计蓝图的作品。荣誉,应该属于团队。 等等更多。 3、你觉得哪些是你具备潜力的,哪些是你最希望突破的。 潜力: (1) 对软件行业的喜爱和对开发的激情 (2) 良好的数学基础和敏捷的思维(包括一些‘不切实际’的想法,比如开发 一款多人在线社区情感游戏等等) (3) 学习的激情 希望突破的地方:
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 4岁宝宝半夜发烧怎么办 四岁宝宝免疫力低下怎么办 两岁宝宝咳嗽流鼻涕怎么办 小婴儿流清鼻涕怎么办 14个月宝宝流鼻涕怎么办 小孩一直流黄鼻涕怎么办 咳嗽有痰 浓鼻涕怎么办 儿童鼻窦炎总反复流脓鼻涕怎么办? 宝宝感冒咳嗽流黄鼻涕怎么办 哺乳期感冒流清鼻涕怎么办 哺乳期打喷嚏流清鼻涕怎么办 哺乳期妈妈感冒流清鼻涕怎么办 哺乳期严重流清鼻涕怎么办 小孩每天都是脓鼻涕怎么办 夏天小孩咳嗽流黄脓鼻涕怎么办? 受凉了流清鼻涕怎么办 宝宝50多天鼻塞怎么办 50多天孩子咳嗽怎么办 2岁宝宝伤风鼻塞怎么办 2个月伤风鼻塞怎么办 3个月宝宝鼻塞怎么办 感冒治好后咳嗽一直不好怎么办 天气太热感冒了怎么办 3个月的婴儿鼻塞怎么办 四个月宝宝感冒鼻塞严重怎么办 4个月小孩鼻塞怎么办 4个多月的宝宝流鼻涕怎么办 4个月大的宝宝流鼻涕怎么办 两岁宝宝着凉了怎么办 7岁儿童晚上鼻塞怎么办 儿童感冒鼻塞怎么办速效办法 7岁儿童感冒鼻塞怎么办 七个月婴儿感冒流鼻涕怎么办 婴儿感冒流鼻涕怎么办速效办法 三个月婴儿感冒咳嗽流鼻涕怎么办 五个月婴儿感冒咳嗽流鼻涕怎么办 两个多月的宝宝鼻塞怎么办 3个月宝宝感冒鼻塞怎么办 2个月宝宝感冒鼻塞怎么办 5个月宝宝鼻塞怎么办 6个月宝宝鼻塞怎么办