2018携程校招笔试编程题?

qufayudao 2017-09-21 10:24:24
程旅行网 2018校招 研发类在线考试

编程题|20.0分2/3

合并数组的的中位数

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB

题目描述:

两个已排好序的数组,找出两者合并后的数组的中位数。

例如:

给出A=[1,2,3,4,5,6]和B=[2,3,4,5],它们合并后的数组是[1,2,3,4,5,6],合并后数组的中位数是3.5(注:(3+4)/2)。

给出A=[1,2,3]和B=[4,5],它们合并后的数组是[1,2,3,4,5],合并后数组的中位数是3。

输入

第一行读入一个正整数n,表示第一个数组的元素个数,第二行读入n个递增整数,表示第一个排好序的数组,第三行读入一个正整数m,表示第二个数组的元素个数,第四行读入m个递增整数,表示第二个排好序的数组

样例输入

6

1 2 3 4 5 6

4

2 3 4 5

样例输出

3.5

——————————————————————————————————

以上是题目,下面是我的代码,不知道为什么通过率只有11%.
——————————————————————————————————
using System;
using System.Linq;
namespace Ctrip
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
var first = changeInt(Console.ReadLine().Split(' '));
int m = int.Parse(Console.ReadLine());
var second = changeInt(Console.ReadLine().Split(' '));
int i = 0;
int j = 0;
var result = new int[m + n];
int index = 0;
while (i < n && j < m)
{
if (first[i] < second[j])
{
result[index] = first[i];
i++;
}
else if (first[i] == second[j])
{
result[index] = first[i];
i++;
j++;
}
else
{
result[index] = second[j];
j++;
}
index++;
}
if (i < n)
{
for (; i < n; i++)
{
result[index] = first[i];
index++;
}
}
if (j < m)
{
for (; j < m; j++)
{
result[index] = second[j];
index++;
}
}
if (index % 2 == 0)
{
var middle = index / 2;
var r = float.Parse((result[middle - 1] + result[middle]).ToString());
r = r / 2;
Console.WriteLine(r);
}
else
{
int middle = index / 2;
Console.WriteLine(result[middle]);
}
}
static int[] changeInt(string[] input)
{
var arr = new int[input.Length];
for (int i = 0; i < input.Length; i++)
{
arr[i] = int.Parse(input[i]);
}
return arr;
}
}
}
...全文
942 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨何方 2017-10-04
  • 打赏
  • 举报
回复
我的操作是:调用for循遍历数组B,并判断数组B的元素在数组A中是否存在,如果不存在,则将该无素添加到数组A中,最后进行一下数组的排序。
  • 打赏
  • 举报
回复
首先,你没有达到人家要求的输入界面要求。(用户交互界面软件)编程要首先从界面要求出发,人家要求输入4行内容然后输出结果,而你做了什么?如果是我,我给你通过率 1%,而不是11%。 这类程序体现的算法非常简单(小学知识即可),大致是这样
using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var n = int.Parse(Console.ReadLine());  //出题中这里纯粹是多余
            var ns = Console.ReadLine()
                .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Take(n)
                .Select(x => int.Parse(x));
            var m = int.Parse(Console.ReadLine());  //出题中这里纯粹是多余
            var ms = Console.ReadLine()
                .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Take(m)
                .Select(x => int.Parse(x));
            var 合并 = ns.Concat(ms).Distinct().ToArray();
            Console.WriteLine(合并.Skip(合并.Length / 2 - 1).Take(合并.Length % 2 == 1 ? 1 : 2).Average());
            Console.WriteLine("...........按任意键结束");
            Console.ReadKey();
        }
    }
}
这里的合并集合的 .Length/2-1 得到了中位数的位置(下标从0开始,所以需要-1),而中位数个数根据总的单元是偶数还是奇数而定,如果合并单元个数是偶数则中位数有2个,如果是奇数则只有1个中位数。
  • 打赏
  • 举报
回复
比如说对于 StringSplitOptions.RemoveEmptyEntries 参数和 Take(n)、Take(m) 处理,比如说让人家根本没有要你去排序(而是输入时就是已经排好序的),这些可能都是审题的要求。至于说携程出这个题有什么真正意义,假设你是计算机软件相关专业的,那么我觉得其实也考不了什么能力(只对纯业余爱好编程的人才应该出这种题目),因为这类题目不能考察出来学过哪些重要专业知识。
  • 打赏
  • 举报
回复
嗯,哈哈!我只是看到你的代码写了一大堆,感觉你没有突出输出部分,没有运行你的代码。sorry,有点武断了。 我想携程的人估计也是看到这个代码很不喜欢吧,所以才说它通过率 11%。通常在代码中要能一眼看出输入输出,而你可能习惯于写一些计算的小例子,不习惯于把输入输出突出在主程序部分。
xuzuning 2017-10-04
  • 打赏
  • 举报
回复
通过率只有11% 式什么意思?
xiaoxiaotank 2017-10-04
  • 打赏
  • 举报
回复
感觉这道题适合用字典
qufayudao 2017-10-04
  • 打赏
  • 举报
回复
当时考试人的讨论帖子: http://discuss.acmcoder.com/topic/59c3a76f90e156aa5dffd107
qufayudao 2017-10-04
  • 打赏
  • 举报
回复
这么多天过去了,携程也没有回复,估计是被刷掉了吧
qufayudao 2017-10-04
  • 打赏
  • 举报
回复
谢谢各位。 首先,通过率只有11%是在赛码网站上面点击提交后,后台自动判断的结果, 个人猜测应该是在后台有一组测试数据,11%的通过率应该是只有11%的测试数据合格。因为这个测试的平台已经关闭了,所有我也无法再次的修改代码提交。 其次,题目的描述是直接拷贝当时的题目的,在排序后应该是没有重复数据的,而且输入输出都是严格的,不需要对输入的数据做额外的处理,输出也只能输出中位数。 最后,各位给的解题思路都很棒,但是我最想知道的是为什么我的代码通过率只有11%,即输入哪些测试数据会导致我的程序输出不了正确的结果。
xuzuning 2017-10-04
  • 打赏
  • 举报
回复
中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
并未说集合中的元素不可重复 应该说 给出A=[1,2,3,4,5,6]和B=[2,3,4,5],它们合并后的数组是[1,2,3,4,5,6],合并后数组的中位数是3.5(注:(3+4)/2)。 这个描述是有问题的,应该是: 给出A=[1,2,3,4,5,6]和B=[2,3,4,5],它们合并后的数组是[1,2,2,3,3,4,4,5,5,6],合并后数组的中位数是3.5(注:(3+4)/2)。 将长度分别为 m 和 n 的两个数组合并成长度为 m+n 的数组进行计算,是最差的算法O(m+n),并且需要大量内存 其实这个题是很经典的了(搜索 两个有序数组求合并后,求其中位数)接近 O(log(min(m,n))) 的算法实现代码有很多

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧