远景智能-2021秋季招聘软件技术笔试题(第二批)
给定一个数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。
返回的结果必须是按升序排好的。
如果有两个数与 x 的差值一样,优先选择数值较小的那个数。
输入格式
第一行为数组arr,数组不为空,且长度不超过 10000,数组里的每个元素与 x 的绝对值不超过 10000。
第二行为查找的个数k。
第三行为基准值x。
注意题目并没有给出数组的长度,因此要把整个数组当成一行字符串读入,再从字符串中依次解析出数字。
输出格式
按升序排好的的数组
输入样例
1,5,3,2,4
4
3
输出样例
1,2,3,4
#include<iostream>
#include<algorithm>
#include<sstream>
#include<math.h>
#include<vector>
#include<queue>
#include<list>
#include<map>
#include<set>
#include<string>
#include<stdio.h>
#include<ctype.h>
#include<cstring>
#include<cstdlib>
#include<iomanip>
using namespace std;
int k, x, n = 0;
int a[100005];
vector<int>v;
int get_close()
{
int i = 1;
int j = n;
int close = a[n] - x;
int index = n;
while (i <= j)
{
int mid = (i + j) / 2;
if (a[mid] == x)
{
close = 0;
return mid;
}
if (abs(a[mid] - x) < close)
{
close = abs(a[mid] - x);
index = mid;
}
else if (abs(a[mid] - x) == close && a[mid] > a[n])
{
close = abs(a[mid] - x);
index = mid;
}
if (a[mid] > x)
{
j = mid - 1;
}
else
{
i = mid + 1;
}
}
return index;
}
int main()
{
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(0);
int i = 0;
string s;
getline(cin, s);
while (i < s.length())
{
int sum = 0;//处理连续的数字字符
while (isdigit(s[i]))
sum = sum * 10 + s[i++] - '0';
a[++n] = sum;
i++;
}
cin >> k >> x;
sort(a + 1, a + n + 1);
int index = get_close();
v.push_back(a[index]);
int b = index - 1;
int j = index + 1;
int cnt = 1;
while (cnt < k&&b>=1&&j<=n)
{
if (abs(a[b] - x) > abs(a[j] - x))
{
v.push_back(a[j]);
j++;
}
else
{
v.push_back(a[b]);
b--;
}
cnt++;
}
while (cnt < k && b >= 1)
{
v.push_back(a[b]);
b--;
cnt++;
}
while (cnt < k && j<=n)
{
v.push_back(a[j]);
j++;
cnt++;
}
sort(v.begin(), v.end());
for (i = 0; i < v.size()-1; i++)
{
cout << v[i] << ",";
}
cout << v[i];
}