首页 > 试题广场 >

在数组中找到出现次数大于nk的数

[编程题]在数组中找到出现次数大于n/k的数
  • 热度指数:3088 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个整型数组arr,再给定一个整数k,打印所有出现次数大于n/k的数,如果没有这样的数,请打印”-1“。

输入描述:
输入包含两行,第一行输入包含两个整数n和k,第二行包含n个整数,代表数组arr


输出描述:
输出所有出现次数大于n/k的数,如果没有这样的数,请输出”-1“。
示例1

输入

7 7
1 2 3 1 2 3 4

输出

1 2 3
示例2

输入

4 1
1 1 2 3

输出

-1

备注:
时间复杂度,额外空间复杂度
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, k, x;
    scanf("%d%d", &n, &k);
    map<int, int> M;
    for(int i=0;i<n;i++){
        scanf("%d", &x);
        M[x]++;
    }
    bool flag = false;
    for(auto &p: M){
        if(p.second > n/k){
            flag = true;
            printf("%d ", p.first);
        }
    }
    if(!flag)
        puts("-1");
    return 0;
}

发表于 2020-06-01 01:03:18 回复(0)
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
		int k  = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = scanner.nextInt();
        }
       
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		for(int i=0;i<n;i++) {
			if(map.containsKey(arr[i])) {
				map.put(arr[i], map.get(arr[i])+1);
			}else {
				if(map.size() == k-1) {
					minusMapEle(map);
				}else {
					map.put(arr[i], 1);
				}
			}
		}
		
		Map<Integer, Integer> resMap = new HashMap<Integer, Integer>();
		for(int i=0;i<n;i++) {
			if(resMap.containsKey(arr[i])) {
				resMap.put(arr[i], resMap.get(arr[i])+1);
			}else {
				if(map.containsKey(arr[i])) {
					resMap.put(arr[i], 1);
				}
			}
		}
		
		int count=0;
		for(Map.Entry<Integer, Integer> entry:resMap.entrySet()) {
			int value = entry.getValue();
			if(value > n/k) {
				count++;
				System.out.print(entry.getKey() + " ");
			}
		}
		if(count==0) System.out.println(-1);
	}
	
	
	public static void minusMapEle(Map<Integer, Integer> map) {
		List<Integer> removeList = new ArrayList<Integer>();
		for(Map.Entry<Integer, Integer> entry:map.entrySet()) {
			int value = entry.getValue();
			entry.setValue(value-1);
			if(value==1) {
				removeList.add(entry.getKey());
			}
		}
		
		for(Integer i:removeList) {
			map.remove(i);
		}
	}
}

发表于 2019-10-24 11:46:55 回复(0)
还是不整花里胡哨的快啊
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().split(" ");
        int n = Integer.parseInt(params[0]), k = Integer.parseInt(params[1]);
        String[] strArr = br.readLine().split(" ");
        long[] arr = new long[n];
        HashMap<Long, Integer> counter = new HashMap<>();
        for(int i = 0; i < n; i++) {
            arr[i] = Long.parseLong(strArr[i]);
            counter.put(arr[i], counter.getOrDefault(arr[i], 0) + 1);
        }
        boolean flag = false;
        for(long key: counter.keySet()){
            if(counter.get(key) > n / k) {
                flag = true;
                System.out.print(key + " ");
            }
        }
        if(!flag) System.out.println(-1);
    }
}

发表于 2021-11-14 17:14:46 回复(0)
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] s = in.nextLine().split(" ");
        int n = Integer.parseInt(s[0]);
        int k = Integer.parseInt(s[1]);
        int a = n / k;
        String[] s2 = in.nextLine().split(" ");
        int[] array = new int[s2.length] ;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int j = 0; j < s2.length; j++) {
            array[j] = Integer.parseInt(s2[j]);
            map.put(array[j], map.getOrDefault(array[j], 0) + 1);
        }
        int count = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() > a) {
                System.out.print(entry.getKey()+" ");
                count++;
            }
        }
        if(count==0){
            System.out.print("-1");
        }
       
    }
}
发表于 2023-09-14 18:02:27 回复(0)
import java.util.*;

public class Main{
    
    public static void main (String [] args){
        
        Scanner s = new Scanner (System.in);
        int n = s.nextInt();
        int k = s.nextInt();
        
        int [] num = new int[n];
        Map<Integer,Integer> map = new HashMap<Integer,Integer>(); 
        for(int i=0;i<n;i++){
            num[i] = s.nextInt();
            if(map.containsKey(num[i])){
                map.put(num[i],(map.get(num[i])+1));
            }else{
               map.put(num[i],1); 
            }
        }
        boolean flag = true;
        for(Map.Entry<Integer,Integer> en: map.entrySet()){
            if(en.getValue() >(n/k)){
                System.out.print(en.getKey()+" ");
                flag = false;
            }
        }
        if(flag){
            System.out.print(-1);
        }
    }
}
发表于 2021-11-08 11:34:24 回复(0)
import java.util.*;
import java.util.Map.Entry;
public  class Main {
   public static void main(String[] args)  {
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        int []arr=new int[n];

        HashMap<Integer, Integer> map =new HashMap<>();
        for (int i=0;i<n;i++){
            arr[i]=sc.nextInt();
            if (map.size()<k){
                if (map.containsKey(arr[i])){//如果map中已经有arr[i],则将其次数加1
                    map.put(arr[i],map.get(arr[i])+1);
                }else{//如果map中没有
                    map.put(arr[i],1);
                }
            }
            if(map.size()==k ){//当map中出现k个不同的数字时,则其个数减1,如果减1之后为0,则直接删除
                Iterator<Entry<Integer, Integer>> it = map.entrySet().iterator();//因为需要在遍历的过程中,删除元素,所以用迭代器
                while (it.hasNext()) {
                    Entry<Integer, Integer> entry = it.next();
                    if (entry.getValue() == 1) {//减1之后,为0
                        it.remove();// 使用迭代器的remove()方法删除元素
                    }else{
                        map.put(entry.getKey(),entry.getValue()-1);
                    }
                }
            }
        }

        for (Entry<Integer,Integer> set: map.entrySet()){
            map.put(set.getKey(),0);
        }
        boolean flag=false;
        for (int i = 0; i <n; i++) {
            if (map.containsKey(arr[i])){
                map.put(arr[i],map.get(arr[i])+1);//重新统计map中剩余元素,出现的次数是否满足要求
                if (map.get(arr[i])>n/k){
                    flag=true;
                    System.out.print(arr[i]+" ");
                    map.remove(arr[i]);//如果已经输出一个,则可以直接移除
                }
            }
        }
        if (flag==false){//没有打印-1
            System.out.println(-1);
        }
    }
}

发表于 2020-03-29 23:35:56 回复(0)
#include<bits/stdc++.h>
using namespace std;
void process(map<int,int>& mp)
{
    vector<int>tmp;

    for(auto& item : mp)
    {
         // 找到所有计数为一的键
        if(item.second==1)
                tmp.push_back(item.first);
        item.second -= 1;
    }
    // 删除
    for(auto i : tmp)
        mp.erase(i);
}
int main()
{
    int n,k;
    cin>>n>>k;
    //k = n/k;
    vector<int>v(n);
    for(int i=0;i<n;++i) cin>>v[i];
    // 存所有候选数字
    map<int,int>mp;
    for(int i=0;i<n;++i)
    {
        if(mp.find(v[i])!=mp.end())
            ++mp[v[i]];
        else
        {
            // 消去k个不同的候选
            if(mp.size()==k-1)
                process(mp);
            // 不满k个,继续插入
            else mp.insert(make_pair(v[i],1));
        }
    }
    // 判断剩下的候选是否为所求
    map<int,int>ans;
    for(int i=0;i<n;++i)
    {
        if(mp.count(v[i]))
        {
            if(ans.count(v[i]))
                ++ans[v[i]];
            else ans.insert(make_pair(v[i],1));
        }
    }
    bool find = false;
    for(auto item : ans)
        if(item.second>n/k)
        {
            cout<<item.first<<" ";
            find = true;
        }
    if(!find) cout<<-1<<endl;
    return 0;
}
发表于 2020-02-09 12:33:29 回复(0)
#include<iostream>
#include<map>
using namespace std;
int main()
{
    int n,k;
    while (cin >> n >> k)
    {
        int temp=0;
        map<int, int>v;
        v.clear();
        for (int i = 0; i < n; i++)
        {
            cin >> temp;
            v[temp]++;
        }
        int p = n / k;
        bool flag = false;
        for(auto ptr=v.begin();ptr!=v.end();ptr++)
        {
            if(ptr->second>p)
            {
                cout<<ptr->first<<" ";
                flag = true;
            }
        }
        if(flag)
        {
            cout<<endl;
            return 0;
        }            
        cout<<"-1"<<endl;
    }
    return 0;
}
把上一个题目的代码稍微改动了几行....懒得新申请空间直接加了一个判定
发表于 2019-08-16 11:20:14 回复(0)

问题信息

上传者:小小
难度:
8条回答 4766浏览

热门推荐

通过挑战的用户

查看代码