18965 找到 K 个最接近的元素

Description

远景智能-2021秋季招聘软件技术笔试题(第二批) 给定一个数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

输入格式

第一行为数组arr,数组不为空,且长度不超过 10000,数组里的每个元素与 x 的绝对值不超过 10000。第二行为查找的个数k。第三行为基准值x。注意题目并没有给出数组的长度,因此要把整个数组当成一行字符串读入,再从字符串中依次解析出数字。

输出格式

按升序排好的的数组

输入样例

1,5,3,2,4
4
3

输出样例

1,2,3,4
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int k, x, n = 0;
int a[100005];
vectorv;
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];
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部