您的位置:首页 > 编程语言 > C语言/C++

京东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){ 
}

#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,这才是全局最优

留着,等后续优化这种情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息