58同城笔试 58同城笔试题 1018
笔试时间:2024年10月18 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目
平均值是统计学中常用的指标之一,可以表示—组数据的中心趋势。然而,平均值容易受到极端值(异常值或离群点)的影响,导致结果失真。在数据集存在极端值或分布不均时,可以结合中位数等其他统计指标进行综合分析。中位数是指在一组有序数据中处于中间位置的数值,它将数据集分为两个部分,使得其中—半数据的数值小于等于它,另一半数据的数值大于等于它。对于奇数个数据:如果数据集的数量是奇数,则中位数是排序后处于中间位置的那个数。例如,对于数据集3,5,7,排序后中位数为5。对于偶数个数据:如果数据集的数量是偶数,则中位数是排序后位于中间的两个数中较小的那个数。例如,对于数据集2,4,6,8,排序后中位数为4。假设现在有两个长度均为N且元素不重复的有序数组(从小到大) array1和array2,请计算这两个有序数组合并后的中位数。要求:时间复杂度为O(logN),额外的空间复杂度O(1),不能使用sort函数。
样例输入一
[1.00000, 3.00000, 7.00000],[2.0000, 5.00000, 10.00000]
样例输出一
3.00000
样例输入二
[2.00000, 6.00000],[4.50000, 8.00000]
样例输出二
4.50000
参考题解
通过二分查找在两个有序数组中找到一个合适的分割点,使得合并后的左右两部分满足左边最大值小于等于右边最小值,从而确定合并后数组的中位数。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <limits>
class Solution {
public:
float find_median(const std::vector<float>& array1, const std::vector<float>& array2) {
int N = array1.size();
int low = 0, high = N;
while (low <= high) {
int i = (low + high) / 2;
int j = N - i;
float maxLeft1 = (i == 0) ? -std::numeric_limits<float>::infinity() : array1[i - 1];
float minRight1 = (i == N) ? std::numeric_limits<float>::infinity() : array1[i];
float maxLeft2 = (j == 0) ? -std::numeric_limits<float>::infinity() : array2[j - 1];
float minRight2 = (j == N) ? std::numeric_limits<float>::infinity() : array2[j];
if (maxLeft1 <= minRight2 && maxLeft2 <= minRight1) {
return std::max(maxLeft1, maxLeft2);
} else if (maxLeft1 > minRight2) {
high = i - 1;
} else {
low = i + 1;
}
}
return 0.0f;
}
};
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Solution {
public float find_median (float[] array1, float[] array2) {
int N = array1.length;
int low = 0;
int high = N;
while (low <= high) {
int i = (low + high) / 2;
int j = N - i;
float maxLeft1 = (i == 0) ? Float.NEGATIVE_INFINITY : array1[i - 1];
float minRight1 = (i == N) ? Float.POSITIVE_INFINITY : array1[i];
float maxLeft2 = (j == 0) ? Float.NEGATIVE_INFINITY : array2[j - 1];
float minRight2 = (j == N) ? Float.POSITIVE_INFINITY : array2[j];
if (maxLeft1 <= minRight2 && maxLeft2 <= minRight1) {
return Math.max(maxLeft1, maxLeft2);
} else if (maxLeft1 > minRight2) {
high = i - 1;
} else {
low = i + 1;
}
}
return 0.0f;
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
import math
class Solution:
def find_median(self, array1, array2):
N = len(array1)
low, high = 0,
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
