首页 > 试题广场 >

找到 K 个最接近的元素

[编程题]找到 K 个最接近的元素
  • 热度指数:950 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。
返回的结果必须要是按升序排好的。
如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

输入描述:
第一行为排序好的数组arr
第二行为查找的个数k
第三行为基准值x


输出描述:
按升序排好的的数组
示例1

输入

1,2,3,4,5
4
3

输出

1,2,3,4

说明

k 的值为正数,且总是小于给定排序数组的长度
数组不为空,且长度不超过 104
数组里的每个元素与 x 的绝对值不超过 104
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
 
void dealStr(vector<int>& v, string s)
{
    int t=0;
    for(auto c:s)
    {
        if(c!=',')
        {
            t=t*10+c-'0';
        }
        else
        {
            v.push_back(t);
            t=0;
        }
    }
    v.push_back(t);
}
 
int main()
{
    vector<int> v;
    int m=0,n=0,k=0,l,r;
    string s1="";
    cin>>s1;
    cin>>k;
    cin>>n;
    dealStr(v, s1);
    m=v.size();
    auto it = lower_bound(v.begin(), v.end()-1, n);
    l = it - v.begin();
    if(l>=m)
        l--;
    r=l;
    while(r-l+1<k)
    {
        if(l==0)
            r++;
        else
        if(r==m-1)
        {
            l--;
        }
        else
        {
            if(v[r+1]-k<v[l-1]-k)
                r++;
            else
                l--;
        }
    }
    cout<<v[l];
    for(int i=l+1;i<=r;i++)
    {
        cout<<',';
        cout<<v[i];
    }
    cout<<endl;
    return 0;
}

发表于 2021-03-02 11:32:26 回复(0)
s=list(map(int,input().split(",")))
ls=[]
k=int(input())
x=int(input())
for i in range(len(s)):
  ls.append((i,s[i]-x))
ls.sort(key=lambda x:x[1])
for i in range(k-1):
    print(s[i],end=",")
print(s[k-1])


发表于 2021-03-01 21:08:22 回复(1)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb push_back
#define all(x) (x).begin(),(x).end()


int a,x,k;
vector<int> v,ans;
int main()
{
    while(1)
    {
        cin>>a;
        v.pb(a);
        if(getchar()!=',') break;
    }
    cin>>k>>x;
    vector<pair<int,int>> num;
    for(int i:v)
        num.pb({abs(i-x),i});
    sort(all(num));
    for(int i=0;i<k;i++) ans.pb(num[i].second);
    sort(all(ans));
    for(int i=0;i<ans.size();i++)
    {
        if(i) cout<<',';
        cout<<ans[i];
    }
}

发表于 2021-03-12 15:25:11 回复(0)
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
    int a,b,c;
    int num = 0;
    int i = 0;
    vector<int> vec1;
    vector<int> vec2;
    while(cin>>a)
    {
        vec1.push_back(a);
        if(cin.get() == '\n')//取出逗号,并判断当前是否到末尾
            break;
    }
    cin>>b;
    cin>>c;
   while(1)
   {
       for(auto it = vec1.begin(); it != vec1.end(); it++)
       {
           if(abs(*it - c) == i)
           {
               if(num < b)
               {
                 vec2.push_back(*it);
                 num ++;
               }
               else
                   break;
           }
             
       }
    if(num < b)
    {
    i++;
    }
       else
       {
           break;
       }
   }
    for(int i =1;i<= vec2.size()-1;i++)
    {
        for(int j = 1;j<= vec2.size()-i;j++)
        {
            if(vec2[j]<vec2[j-1])
            {
                int temp = vec2[j];
                vec2[j] = vec2[j-1];
                vec2[j-1] = temp;
            }
        }
    }
    
    for(auto it = vec2.begin(); it != vec2.end();it++)
    {
        if (it == vec2.end()-1)
		{
			cout << *it;
		}
		else
		{
			cout << *it << ",";
		}
    }
    
}

发表于 2021-09-12 15:54:57 回复(0)
双指针:先找最小值的小标,然后建立左指针+右指针
算法时间负责度: O(n) 
arr = map(int, raw_input().strip().split(','))
k = input()
x = input() 
delta = [abs(item-x) for item in arr]
# find the minmum #
midx = 0 
for i in range(1, len(arr)):
    if delta[i] < delta[midx]:
        midx = i 
    else:
        break 
if k == 1:
    print('%d'%arr[midx])
else:
    # find top k # 
    l = midx - 1
    r = midx + 1 
    lr = []
    rr = []
    k -= 1 
    while k > 0:
        if l > -1 and r < len(arr):
            if delta[l] <= delta[r]:
                lr.append(arr[l])
                l -= 1
            else:
                rr.append(arr[r])
                r += 1 
        elif l < 0 and r < len(arr):
            rr.append(arr[r])
            r += 1
        elif l > -1 and r >= len(arr):
            lr.append(arr[l])
            l -= 1 
        k -= 1 
    res = lr[::-1] + [arr[midx]] + rr 
    s = ''
    for i in res:
        s += ('%d,'%i)
    print(s[:-1])


发表于 2021-07-05 15:24:27 回复(1)
js代码:
let arr = readline().split(',')
let k = parseInt(readline())
let x = parseInt(readline())
while(arr.length>k) {
    let start = Math.abs(arr[0]-x)
    let end = Math.abs(arr[arr.length-1]-x)
    if (start>end) {
        arr.splice(0,1)
    } else {
        arr.splice(arr.length-1,1)
    } 
}
console.log(arr);


发表于 2021-04-27 10:50:24 回复(0)
import bisect
a=list(map(int,input().split(',')))
n=len(a)
k=int(input())
x=int(input())
p=bisect.bisect_left(a, x)
l=p
r=p
ans=[]

if l==0 :
    while l<0 :
        l=l+1
    r=l
    ans.append(a[r])

if r>0 :
    while r>n-1 :
        r=r-1
    l=r 
    ans.append(a[l])    

#print(ans)
while r-l+1<k :
    if l-1>=0 and r+1<=n-1:
        if  x-a[l-1]<=a[r+1]-x :
            l=l-1
            ans.insert(0,a[l])
        else :
            r=r+1
            ans.append(a[r])
    elif l==0 :
        r=r+1
        ans.append(a[r])
    elif r==n-1 : 
        l=l-1
        ans.insert(0,a[l])
        
        
#print(ans)
ans_str=''
ans_str=','.join(map(str,ans))
print(ans_str)
   





发表于 2021-04-10 23:10:02 回复(0)
    if(line=readline()){
        var lines = line.split(',');
        var arrlength=lines.length;
        var arr=new Array(arrlength);
        for(var arrnum=0;arrnum<arrlength;arrnum++){
            arr[arrnum]= parseInt(lines[arrnum]);
        }
    }
    //console.log(arr[0]+","+arr[1]+","+arr[2]+","+arr[3]+","+arr[4]);
    let k=4;
    if(line=readline()){
        var lines = line.split(' ');
        var i = parseInt(lines[0]);
        k=i;
    }
    let x=3;
    if(line=readline()){
        var lines = line.split(' ');
        var i = parseInt(lines[0]);
        x=i;
    }
    let minCost=Math.abs(x-arr[0]);
    let minCostIndex=0;
    for(let i=0;i<arr.length;i++){
        if(minCost>Math.abs(x-arr[i])){
            minCost=Math.abs(x-arr[i]);
            minCostIndex=i;
        }
        if(minCost==0){
            break;
        }
    }
    let leftIndex,rightIndex,leftCost,rightCost;
    if(arr.length>k){
        if(minCostIndex==0){
            let str="";
            for(let num=0;num<k;num++){
                if(num==k-1){
                    str=str+arr[num]
                }else{
                    str=str+arr[num]+",";
                }
            }
            console.log(str);
        }
        if(minCostIndex==arr.length-1)
        {
            let str="";
            for(let num=arr.length-1-k;num<=arr.length-1;num++){
                if(num==arr.length-1){
                    str=str+arr[num]
                }else{
                    str=str+arr[num]+",";
                }
             }
             console.log(str);
        }
        let All=1;
        if(minCostIndex!=0&&minCostIndex!=arr.length-1){
            leftIndex=minCostIndex-1;
            rightIndex=minCostIndex+1;
            for(;leftIndex>0,rightIndex<=arr.length-1;){
                leftCost=Math.abs(arr[leftIndex]-x);
                RightCost=Math.abs(arr[rightIndex]-x);
                if(leftCost<=RightCost){
                    All++
                    leftIndex--;
                }else{
                    All++;
                    rightIndex++;
                }
                if(All==k){
                    break;
                }
            }
            leftIndex++;
            rightIndex--;
            let str="";
            for(let num1=leftIndex;num1<=leftIndex+k-1;num1++)
            { 
                if(num1==leftIndex+k-1){
                    str=str+arr[num1]
                }else{
                    str=str+arr[num1]+",";
                }
            }
            console.log(str);
        }
    }
    else
    {
        console.log(arr);
    }

发表于 2021-03-19 19:56:36 回复(0)
依次枚举长度为k的区间即可,替换原则,区间右移一位,新增的右端点要比原有的左端点更接近。
#include <bits/stdc++.h>//ASI
typedef long long ll;
using namespace std;
int main()
{
    int i=0,j,n=0,k,x,a[100005],l,r;
    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);
    l=1,r=k;
    while(r+1<=n&&x-a[l]>a[r+1]-x)
            l++,r++;
    for(i=l;i<r;i++)
        cout<<a[i]<<",";
    cout<<a[r];
    return 0;
}


发表于 2021-03-17 08:58:31 回复(0)
import scala.io._

import scala.math._

object findElements {

  def find2 (inputArray: Array[Int],k:Int, x:Int): String = {
    var result: String = ""
    val len = inputArray.length
    val arr_x = inputArray.map(e => e - x)
    val arr_k = arr_x.sortBy(e => abs(e)).slice(0,k)
    arr_k.map(e => result += inputArray(arr_x.indexOf(e)))
    result
  }

  def main(args: Array[String])= {
    val inputArray = StdIn.readLine().split(',').map(e => e.toInt)
    val k = StdIn.readInt()
    val x = StdIn.readInt()

    val result = find2(inputArray,k,x).sorted

    println(result)
    result.foreach(e => if(result.indexOf(e) != result.length-1) print(s"$e,"))
    print(result.last)

  }
}

发表于 2021-03-13 23:00:45 回复(0)
arr = list(map(int, input().split(',')))
k = int(input())
x = int(input())

arr_x = [item - x for item in arr]
arr_k = sorted(arr_x, key=lambda x: abs(x))[:k]

result = []
for item in arr_k:
    result.append(arr[arr_x.index(item)])
result.sort()

print(','.join([str(item) for item in result]))


编辑于 2021-03-12 15:45:08 回复(0)
import java.util.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main{
    public List<Integer> find(int []arr, int k, int x){
        
        List<Integer> arrayList = new ArrayList<Integer>();
        for(int i = 0;i < arr.length;i++){
            arrayList.add(arr[i]);
        }
        Collections.sort(arrayList,(a,b) -> a == b ? a - b : Math.abs(a - x) - Math.abs(b - x));
        arrayList = arrayList.subList(0,k);
        Collections.sort(arrayList);
        Iterator<Integer> itr = arrayList.iterator();
          while(itr.hasNext()){
            System.out.print(itr.next());
            if(itr.hasNext()){
                System.out.print(",");
            }
        }
        return arrayList;
    }
    public static void main(String [] args){
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String []str = s.split(",");
        int [] array = new int[str.length];
        for(int i = 0;i < array.length;i++){
            array[i] = Integer.parseInt(str[i]);
        }
         int k = sc.nextInt();
         int x = sc.nextInt();
        main.find(array,k,x);
        
      
    }
}
发表于 2021-03-04 19:35:57 回复(0)
import java.util.Arrays;
import java.util.Scanner;
import java.util.function.IntPredicate;

public class Main {
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		String s = input.nextLine();
		String[] str = s.split(",");
		int[] array = new int[str.length];
		for(int i=0;i<str.length;i++){
			array[i]= Integer.parseInt(str[i]);
		}
		
		int k = input.nextInt();
		int x = input.nextInt();
		
		int min=10000;
		int position = 0;
		for(int i=0;i<array.length-k;i++){
			int sum=0;
			for(int j=0;j<k;j++){
				sum += Math.abs(array[i+j]-x);
			}
			if(sum < min){
				min = sum;
				position=i;
			}
		}
		int[] array2 = Arrays.copyOfRange(array, position,position+k);
		for(int i=0;i<array2.length;i++){
			System.out.print(array2[i]);
			if(i!=array2.length-1){
				System.out.print(",");
			}
		}
	}
}

发表于 2021-03-03 18:55:06 回复(0)