首页 > 试题广场 >

查找数组众数

[编程题]查找数组众数
  • 热度指数:5445 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个数组A[n], 定义数组的众数 ( Majority Element) 为数组中出现次数超过 n/2 次的元素, 假设数组A[n]非空且一定存在众数, 请设计算法找到该众数并输出.


输入描述:
一个非空且一定存在众数的整数数组,如: [1,2,2]


输出描述:
输出打印该众数,如: 2
示例1

输入

[1,2,2]

输出

2
示例2

输入

[3,1,-2,3,1,3,3]

输出

3
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // get input data
        Scanner input = new Scanner(System.in);
        String[] str = input.nextLine().replace("[", "").replace("]", "").split(",");
        int[] arr = new int[str.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(str[i]);
        }

        Arrays.sort(arr);
        int flag = arr[0]; int len = 0;
        for (int i = 0; i <= arr.length; i++) {
            if (len > (arr.length / 2)) {
                System.out.println(flag);
                break;
            } else {
                if (arr[i] == flag) {
                    len++;
                } else {
                    flag = arr[i];
                    len = 1;
                }
            }
        }
    }
}

发表于 2020-08-19 21:53:54 回复(0)
  • 牛客的字符统计题太多了,已经数不清,一律用map作统计

  • 把中括号去掉,再按逗号分隔成为数组

    import java.util.*;
    public class Main
    {
      public static void main(String [] args)
      {
          Scanner sc=new Scanner(System.in);
          while(sc.hasNext())
          {
              String str=sc.next();
              String a=str.replace("[","");
              String b=a.replace("]","");
              String [] array=b.split(",");
              HashMap<String,Integer> map=new HashMap<>();
              for(int i=0;i<array.length;i++)
              {
                  String s=array[i];
                  if(map.containsKey(s))
                  {
                      int value=map.get(s);
                      value+=1;
                      map.put(s,value);
                  }
                  else
                  {
                      map.put(s,1);
                  }
              }
              Set<String> set=map.keySet();
              String result=null;
              for(String key:set)
              {
                  int value=map.get(key);
                  if(value>array.length/2)
                  {
                      result=key;
                  }
              }
              System.out.println(result);
    
          }
      }
    }
发表于 2020-02-16 23:01:04 回复(0)
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] strings = in.nextLine().replace("[","").replace("]","").split(",");
        int[] a = new int[strings.length];
        for (int i=0;i<a.length;i++)
            a[i] = Integer.parseInt(strings[i]);
        int count = 1;
        int data = a[0];
        for (int i=1;i<a.length;i++){
            if (count == 0) {
                data = a[i];count++;
            }else {
                if (a[i] == data)
                    count++;
                else
                    count--;
            }
        }
        System.out.println(data);
    }
}

发表于 2019-08-15 15:40:14 回复(0)

时间复杂度为O(n),我们可以考虑在遍历数组的时候保存两个值,一个是数组中的一个数字,另一个是次数,
当我们遍历到下一个数字的时候如果下一个数字和我们之前保存的数字相同则次数加1,如果次数为零那么我们需要保

存下一个数字,并把次数设为1.
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        String arr[]=str.split("[\\[\\],]");
        int time=0;
        String result = null;
        for(int i=1;i<arr.length;i++){//从1开始遍历,因为arr[0]为换行
            if(time==0){
                result=arr[i];
            }
            if(arr[i].equals(result)){
               time++;
           }else{
               time--;
           }    
        }
        System.out.println(result);
    }
}

编辑于 2019-01-03 22:27:42 回复(3)