京东2015校园招聘技术类笔试题及答案
2017-08-12 14:48
369 查看
1、给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:” i am a little boy. “,变成”i am a little boy”,语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:
C++函数原型:
void FormatString(char str[],int len){
}
first, TreeNode* second) {}
第二道题的答案引用,刚开始没看懂,对原文稍加修改添加了一些注释,原文中还提及一种方法有兴趣可以一看http://blog.csdn.net/qianhen123/article/details/46778269
3、有n枚硬币按照0到n-1对它们进行编号,其中编号为i的硬币面额为Vi。两个人轮流从剩下硬币中取出一枚硬币归自己所有,但每次取硬币的时候只能取剩下的硬币中编号最小的硬币或者编号最大的硬币,在两个都采用最优策略的情况下,作为先手取硬币的你请编写程序计算出你能获得硬币总面额的最大值? (请简述算法原理,时间复杂度并实现具体的程序),语言不限。int MaxValue(int V[], int n) {}
在做这道编程题的时候想了到了另一种可能,存在全局最优的情况,而我这个算的是局部最优情况
比如说20,999,5,1 如果数组中存在这种情况,起手拿1就会拿到999,这才是全局最优
留着,等后续优化这种情况
C++函数原型:
void FormatString(char str[],int len){
}
#include "stdafx.h" #include <string.h> void FormatString(char str[],int len){ int i = 0; int j = 0; if(len>0) { while (str[i] != '\0') { if(str[i] ==' ') { ++i; str[j] = str[i]; } else { if(str[i-1] ==' ') {++j;} ++i; str[j] = str[i]; ++j; } } str[j]='\0'; } } int _tmain(int argc, _TCHAR* argv[]) { char a[] = " i am a little boy. "; int b = strlen(a); FormatString(a,b); printf("%d\n",strlen(a)); printf("%s\n",a); return 0; }2、给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小,描述你程序的最坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型:C++ 函数原型:struct TreeNode {TreeNode* left;//指向左子树TreeNode* right;//指向右子树TreeNode* father;//指向父亲节点};TreeNode* LowestCommonAncestor(TreeNode*
first, TreeNode* second) {}
int getHeight(TreeNode *node) { //这一段是为了确定当前节点的高度,一直查找父节点,节点存在+1,直到根 int height = 0; while (node) { height++; node = node->parent; } return height; } TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second) { int height1 = getHeight(first), height2 = getHeight(second), diff = height1 - height2;//找到高度差 if (diff < 0) { diff = -diff; while(diff--) { second = second->parent; } } else { while(diff--) { first = first->parent; } } //上边的的if就是为了找到同一高度的父节点 while (first != second) {//同步遍历,两个节点同时找父节点每次上升一层,相同时即找到父节点 first = first->parent; second = second->parent; } return first; }算法复杂度为O(n)。
第二道题的答案引用,刚开始没看懂,对原文稍加修改添加了一些注释,原文中还提及一种方法有兴趣可以一看http://blog.csdn.net/qianhen123/article/details/46778269
3、有n枚硬币按照0到n-1对它们进行编号,其中编号为i的硬币面额为Vi。两个人轮流从剩下硬币中取出一枚硬币归自己所有,但每次取硬币的时候只能取剩下的硬币中编号最小的硬币或者编号最大的硬币,在两个都采用最优策略的情况下,作为先手取硬币的你请编写程序计算出你能获得硬币总面额的最大值? (请简述算法原理,时间复杂度并实现具体的程序),语言不限。int MaxValue(int V[], int n) {}
#include "StdAfx.h" int MaxValue(int V[], int n) { int i = 0; int j = n-1; int win=0; while (i<j) { if(V[j] >= V[i]) { win += V[j]; j--; if(V[j]>=V[i]) j--; else i++; } else { win += V[i]; i++; if(V[j]>=V[i]) j--; else i++; } } if(i==j) win +=V[i]; return win; } int _tmain(int argc, _TCHAR* argv[]) { int V[]={8,3,1,5,7,1,4,0,9,2,6}; int k = sizeof(V)/sizeof(V[0]); int M = MaxValue(V,k); printf("%d\n",M); printf("%d\n",V); return 0; }
在做这道编程题的时候想了到了另一种可能,存在全局最优的情况,而我这个算的是局部最优情况
比如说20,999,5,1 如果数组中存在这种情况,起手拿1就会拿到999,这才是全局最优
留着,等后续优化这种情况
相关文章推荐
- 京东2015校园招聘技术类笔试题(笔试时间:2014-10-18)
- 阿里巴巴2015秋季校园招聘前端开发工程师在线笔试题及答案
- 数码视讯2015校园招聘JAVA笔试题及答案
- 360 校园招聘 2015 届技术类笔试题
- 阿里巴巴2015秋季校园招聘前端开发工程师在线笔试题及答案
- 百度2015校园招聘软件开发笔试题及答案
- 微软2015校园招聘 技术类职位在线笔试-题目1 : Browser Caching
- 腾讯2015校园招聘技术类研发笔试题
- 中科创达2015校园招聘Java卷的笔试题及附加题答案
- 中兴2015校园招聘笔试题 +部分 答案(自己做的)
- 京东2018年校园招聘笔试代码环节答案分享
- 京东2015校园招聘技术类笔试题
- 腾讯2015校园招聘技术类研发笔试题第七题
- 360校园招聘2015技术类笔试题
- 数码视讯2015校园招聘JAVA笔试题及答案
- 阿里巴巴2015秋季校园招聘前端开发工程师在线笔试题及答案
- 360校园招聘2015届技术类笔试题(一)
- 腾讯技术类校园招聘笔试试题
- 百度2013校园招聘笔试题(含自己整理的答案)
- 同花顺2015校园招聘笔试题