首页 > 试题广场 >

n个数里出现次数大于等于n2的数

[编程题]n个数里出现次数大于等于n/2的数
  • 热度指数:21996 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入n个整数,输出出现次数大于等于数组长度一半的数。

输入描述:
每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2。


输出描述:
输出出现次数大于等于n/2的数。
示例1

输入

3 9 3 2 5 6 7 3 2 3 3 3

输出

3

//看到题目第一个想到的就是桶排序了---值的范围固定,然后出现重复数
import java.util.Scanner; public class Main{     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int n = 0;         int[] count = new int[100];         while (sc.hasNext()){             count[sc.nextInt()]++;             n++;         }         for (int i = 0; i < count.length; i++) {             if (count[i] >= n / 2){                 System.out.println(i);                 return;             }         }     } }


编辑于 2022-09-07 23:01:50 回复(0)
import java.io.*;
import java.util.*;
public class Main {

	public static void main(String[] args) throws Exception {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        
        String str[]=br.readLine().split(" ");
		Map<Integer,Integer> m=new HashMap<Integer,Integer>();
		int sz[]=new int[str.length];
		for(int i=0;i<str.length;i++){
			sz[i]=-1;
			if(m.get(Integer.parseInt(str[i]))!=null){
				m.put(Integer.parseInt(str[i]), m.get(Integer.parseInt(str[i]))+1);
			}else{
				m.put(Integer.parseInt(str[i]), 1);
				sz[i]=Integer.parseInt(str[i]);
			}
		}
		int max=0;
		int maxs=0;
		for(int i=0;i<str.length;i++){
			if(sz[i]!=-1){
				if(maxs<m.get(sz[i])){
					maxs=m.get(sz[i]);
					max=sz[i];
				}
			}
		}
		System.out.println(max);
	}
}

发表于 2021-04-24 08:41:55 回复(0)
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

//保证AC
public class Main {
   public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<String, Integer> map = new HashMap<>();
        String input = scanner.nextLine();
        String[] arr= input.split(" ");
        for (String s : arr) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }

        for (String key : map.keySet()) {
            if (map.get(key) >= map.size()/2) {
                System.out.println(key);
                break;
            }
        }
    }
}

发表于 2021-02-22 11:36:26 回复(0)
Java实现,已通过,暴力蛮解...... 排序后输出下标为length/2-1的数即可,代码如下:
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
       String[] dateStr=in.nextLine().split(" ");
       int[] date=new int[dateStr.length];
       for(int i=0;i<dateStr.length;i++)
       {
        date[i]=Integer.valueOf(dateStr[i]);
    }
        Arrays.sort(date);
       System.out.println(date[date.length/2-1]);
    
}}


发表于 2020-01-27 15:05:57 回复(0)
//做的时候没想到中间值的方法,使用map的方法如下
import java.util.Scanner;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            Map<Integer,Integer> map = new TreeMap<>();
            String[] strs = sc.nextLine().split(" ");
            for(int i=0;i<strs.length;i++){
                int s = Integer.valueOf(strs[i]);
                if(map.containsKey(s)){
                    map.put(s,map.get(s)+1);
                }else{
                    map.put(s,1);
                }
            }
            for(Map.Entry<Integer,Integer> entry : map.entrySet()){
                if(entry.getValue() >= strs.length/2){
                    System.out.println(entry.getKey());
                }
            }
        }
    }
}

发表于 2018-10-29 19:02:06 回复(0)
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner;  public class Main {  public static void main(String[] args) {
        // 输入测试用例
        Scanner in = new Scanner(System.in);    List<Integer> list = new ArrayList<Integer>();  while (in.hasNextInt()) {
            list.add(in.nextInt());    }
        // 利用工具类进行排序
        Collections.sort(list);
       // 打印值    System.out.println(list.get(list.size() / 2 - 1));  }
}

发表于 2018-10-19 15:12:33 回复(0)
public class Main {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        String line = scan.nextLine();
        String[] sp = line.split(" ");
        Arrays.sort(sp);
        int max=0;
        for (int i = 0; i < sp.length-1; i++) {
            if (sp[i].equals(sp[i+1])) {
                max++;                
                if (max+1==sp.length/2) {
                    System.out.println(sp[i]);
                }
            }else {
                max=0;
            }
        }
    }
}
发表于 2018-10-01 20:31:30 回复(0)

public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int[] d=new int[101];
int sum=0;
while (scanner.hasNextInt()){
    int n=scanner.nextInt();
    d[n]++;
     sum++;
}

for(int i=0;i<101;i++){ 
    if(d[i]>=sum/2){
    System.out.println(i);
    break;
}
}
}
编辑于 2018-08-13 22:52:56 回复(0)
class Main{
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            int n=scanner.nextInt();
            int[] a=new int[n];
            int count=0;//用来记录出现的次数
            int flag=n/2;
            int i=0;
            while(i<n){
                a[i++]=scanner.nextInt();
            }
            //利用map计算每个数字出现的个数
            Map<Integer,Integer> map=new HashMap<Integer, Integer>();
            for(int j=0;j<a.length;++j){
                if(map.containsKey(a[j])){
                    count=map.get(a[j]);
                    map.put(a[j], count++);
                }
                else{
                    map.put(a[j], 1);
                }
            }
            //迭代遍历,获取出现次数大于等于数组一半的数字
            Iterator<Map.Entry<Integer, Integer>> it=map.entrySet().iterator();
            while(it.hasNext()){
                Map.Entry<Integer, Integer> entry=it.next();
                int value=entry.getValue();
                if(value>=flag){
                    System.out.println(entry.getKey());
                }
            }
            
        }
    }
}

发表于 2018-07-25 19:01:05 回复(0)
import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        String arr[]=str.split(" ");
        int arr1[]=new int [arr.length];
        Arrays.fill(arr1, 1);
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[j].equals(arr[i])){
                    arr1[i]++;
                }
            }
        }
        for(int i=0;i<arr.length;i++){
            if(arr1[i]>=arr1.length/2){
                System.out.println(arr[i]);
                break;
            }
            
        }
    }
}

编辑于 2018-05-08 23:51:02 回复(0)
package hello;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;

public class Main{
    
    
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String st = br.readLine();
        String[] str = st.trim().split(" ");
        int value = 1;
        HashMap<String,Integer> hm = new HashMap<>();
        for (int i=0;i<str.length;i++) {
            if (!hm.containsKey(str[i])) {
                hm.put(str[i], value);
            } else {
                value = hm.get(str[i]);
                hm.put(str[i], ++value);
            }
        }
        ArrayList<String> arr = new ArrayList<>();
        for (int i=0;i<str.length;i++) {
            if (hm.get(str[i])>=str.length/2 && !arr.contains(str[i])) {
                arr.add(str[i]);
            }
        }
        for (int i=0;i<arr.size();i++) {
            System.out.print(arr.get(i));
        }
    }
}
发表于 2018-03-02 23:05:04 回复(0)
import java.util.*;
public class Main{
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String str=scan.nextLine();
            String[]sc=str.split(" ");
            int[]arr=new int[sc.length];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = Integer.valueOf(sc[i]);
            }
            Arrays.sort(arr);
            System.out.println(arr[arr.length/2-1]);
        }
        
    }
}
算法不太难,也是想了很久啊
发表于 2018-01-01 14:23:37 回复(1)
这个题目和我之前在编程之美上看见的id问题差不多。思路:首先将输入的数据分割得到String数组,在这个数组里面至多有一个数字出现的次数大于数组长度的一半,假设存在一个这样的数flag,并在这些数组里面每次选择两个不同的数丢弃,剩下的数中那个flag出现的次数一定还占数组长度的一半(举例:数组长度10,8出现的次数为6,不管丢弃的数有没有含8这个数,剩下的8个数中,8出现的次数一定大于它的一半)。按照这样的思路一直进行下去直到没有两个不同的数时,那么剩下的数中一定全是flag。(假设长度为100,flag出现的次数为51。最极端的情况下flag被丢弃49,剩下的2个相同,所以一定能的到flag的值)代码的实现就是设置一个flag一直比较下面的数比较,如果相同将temp++,不相同的将temp--,因为flag的出现的次数大于总长度的一半,所以总有一个位置上的flag会被留到最后,因为flag出现的后temp一定是大于1的.在判断后输出就好。

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String[] input = in.nextLine().split(" ");
        int n = input.length;
        int temp = 0;
        String flag=null;
        for(String s:input){
            if(temp==0){
                flag = s;
                temp=1;
            }else if(flag.equals(s)){
                temp++;
            }else{
                temp--;
            }
        }
        if(temp>1){
            System.out.println(flag);
        }
    }
}

发表于 2017-12-14 20:34:05 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        HashMap<Integer, Integer> map = new HashMap<>();
        while (in.hasNext()) {
            int num = in.nextInt();
            Integer count = map.get(num);
            map.put(num, count == null? 1: count + 1);
        }
        Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            if ((Integer)entry.getValue() >= map.size() / 2)
                System.out.println(entry.getKey());
        }
    }
}
----------------------------------------------------------------------
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int pre = -1;
        int res = 1;
        while (in.hasNext()) {
            int num = in.nextInt();
            if (pre == -1) {
                pre = num;
                continue;
            }
            if (pre != num) {
                if (res == 0) { res = 1; pre = num;}
                else res--;
            } else {
                res++;
            }
        }
        System.out.println(pre);
    }
}

编辑于 2017-12-07 22:28:50 回复(0)
import java.util.Scanner;  public class Main
{  public static void main(String args[])
    {
        Scanner scanner = new Scanner(System.in);  while (scanner.hasNext()) 
        {
            String[] numbers = scanner.nextLine().split(" ");  int n = numbers.length;  int count;  for (int i = 0; i < n; i++) 
            {
                count = 1;  for (int j = i + 1; j < n; j++) 
                {  if (numbers[j].equals(numbers[i]) && !numbers[j].equals("j")) 
                        {
                        numbers[j] = "j";   count++;   }
                } if (count >= n / 2) 
                  {
                    System.out.println(numbers[i]);  }
            }
        }
    }
}
这道题也好简单,就是计数嘛,需要注意的就是已经记过数的要进行标记,要不然容易重复计数重复输出


发表于 2017-11-21 20:20:43 回复(1)

import java.util.Scanner;
//输入n个整数,输出出现次数大于等于数组长度一半的数。
//输入描述:
//
//每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2。
//
//输出描述:
//
//输出出现次数大于等于n/2的数。
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        String[] strings = string.split(" ");
        for (int i = 0; i < strings.length; i++) {
            int sum = 0;
            for (int j = 0; j < strings.length; j++) {

                if (strings[i].equals(strings[j])) {
                    sum++;
                }
                }
              int s=strings.length/2;
                if (sum >= s) {
                    System.out.println(strings[i]);
                    break;
                }
            

        }
    }

}

发表于 2017-11-07 11:39:26 回复(0)
import java.util.*;

public class Main {

	public static void main(String[] args) {

		Scanner cin = new Scanner(System.in);

		ArrayList<Integer> list = new ArrayList<>();
		while(cin.hasNextInt()){
			list.add(cin.nextInt());
		}
		
		Collections.sort(list);
		
		System.out.println(list.get(list.size()/2-1));
		
	}
}

发表于 2017-09-06 02:47:36 回复(12)
题目已经简化了许多,在输入的时候已经确定好了只有一个数会出现大于等于长度的一般,因此我们最终只需要判断出一个就可以了,而不需要考虑对输出的结果进行排序。这里我使用map集合对输入的数据进行保存,每次输入的数据进行判断在集合中是否存在,如果存在,则刷新他的value值,如果不存在,则添加进行,并设置他的value值为1,最后通过map.keySet()方法对key进行遍历,判断对应的value值中的最大值,然后输出key即可
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class StringUtil {
	
	//n个数里出现次数大于长度的一般的数
	public static void main(String[] args ){
		
		Scanner in = new Scanner(System.in);
		int n = 0;
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		while(in.hasNext()){
			int num = in.nextInt();
			n++;
			if(map.containsKey(num)){
				int count = map.get(num);
				count++;
				map.remove(num);
				map.put(num, count);
			}
			else{
				map.put(num, 1);
			}
		}
		in.close();
		
		Set<Integer> keyset = map.keySet();
		for(Integer num: keyset){
			int count = map.get(num);
			if(count >= n/2){
				System.out.println(num);
				return ;
			}
		}
	}
	
}

发表于 2017-09-01 00:17:57 回复(0)
/**  
 * 本方法只适用于这个数超过n的一半。剑指offer原题。
 * 测试用例不完全,当这个数刚好等于n/2时,如1,2,1,2,3,1,正确答案为1,本代码输出3仍然通过
 * 
 * @author DanKo
 *
 */
public class Main{
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		ArrayList<Integer> list = new ArrayList<Integer>();
		while (input.hasNext()) {
			list.add(input.nextInt());
		}
		int num = list.get(0);
		int count = 1;
		for (int i = 1; i < list.size(); i++) {
			if (count == 0) {
				num = list.get(i);
				count = 1;
			} else if (list.get(i) == num)
				count++;
			else
				count--;
		}

		System.out.println(num);

	}
}

编辑于 2017-08-29 17:15:14 回复(0)