京东2015校园招聘技术类笔试题及答案

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

留着,等后续优化这种情况


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值