数组中数目最多的三个数 2.3

是数组中超过一半数目问题的升级版,但万变不离其中

声明一个time数组和candidate数组,长度为3,分别存放三个数的次数和数字

首先次数声明为0,数字声明为不存在的数,这里暂时声明为-1,其实应该声明为一个不存在的数字

然后遍历数组

如果该数是第一个candidate,第一个candidate的time++

如果是第二个,那么第二个time++;

然后也判断三个candidate的time是否达到0,如果达到,将更新candidate,更新为当前数字

最后返回candidate数组

package moreThanHalfNum29;

public class MostThreeNum29 {

static int[] Find(int[] a) {

int N = a.length;

int ID_NULL = -1;

;// 定义一个不存在的ID

int[] nTimes = new int[3];

int i;

nTimes[0] = nTimes[1] = nTimes[2] = 0;

int[] candidate = new int[3];

candidate[0] = candidate[1] = candidate[2] = ID_NULL;

for (i = 0; i < N; i++) {

if (a[i] == candidate[0]) {

nTimes[0]++;

} else if (a[i] == candidate[1]) {

nTimes[1]++;

} else if (a[i] == candidate[2]) {

nTimes[2]++;

} else if (nTimes[0] == 0) {

nTimes[0] = 1;

candidate[0] = a[i];

} else if (nTimes[1] == 0) {

nTimes[1] = 1;

candidate[1] = a[i];

} else if (nTimes[2] == 0) {

nTimes[2] = 1;

candidate[2] = a[i];

} else {

nTimes[0]--;

nTimes[1]--;

nTimes[2]--;

}

}

return candidate;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

int[] a = { 2, 2, 3, 3, 4, 5, 5, 6 };

int[] result = Find(a);

for (int i = 0; i < result.length; i++) {

System.out.println(result[i]);

}

}

}

时间: 2024-10-14 15:24:24

数组中数目最多的三个数 2.3的相关文章

js方式找出数组中重复数最多的那个数,并返回该数以及重复次数

function findNum(a){ var result = [0,0]; for (var i = 0; i < a.length; i++) { for (var j = 0,count = 0; j < a.length; j++) { if (a[i]==a[j]) { ++count; }; }; if(count>result[0]) { result[0] = count; result[1] = a[i]; }else if(count==result[0]&

获取在一个数组中出现最多的字符及其所在的位置

获取在一个数组中出现最多的字符.个数及其所在的位置 <!DOCTYPE html> <html> <head> <title>一个数组中,出现次数最多的字符,及其位置</title> </head> <body> <script type="text/javascript"> var arr=["a","x","b","d

JAVA基础(数组)数组排序和查找数组中是否还有某一个数

数组排序和数组中含有某一个数 import java.util.Arrays;class Demo4 { public static void main(String[] args) { //数组中的使用工具:Arrays int[] arr = {1,2,4,5}; //查找数组中是否还有某一个数 int num = 3; //有 : 对应索引位置 int result = Arrays.binarySearch(arr,num); System.out.println(result); //

算法试题 - 找出一个序列中出现频率最高的三个数

题目 找出一个序列中出现频率最高的三个数 解析 思路一 创建一个新字典, k 为 序列的值, 然后 v 的初始值 0, 然后循环序列进行计数, 然后进行新字典的处理..... 不行, 不好处理了. 此思路不行 思路二 利用 colletctions 的 Counter 模块, 内部有个方法可以解决 k 值问题 答案 答案一 可以往下继续实现, 但是有点麻烦了 li = [2, 5, 3, 4, 1, 8, 1, 2, 6, 6, 1, 5, 1, 5] d = dict.fromkeys(li,

数组中出现最多的数,以及接口 Map.Entry&lt;K,V&gt;

1 package test.tools; 2 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.HashMap; 6 import java.util.Map; 7 8 public class TestArr { 9 10 public static void MaxCount(int[] arr) { 11 Map<Integer, Integer> map = new Ha

查找数组中单独出现的两个数

一个数组中,只有两个数单独出现,其他数都是成对出现的,找出这两个数. 方法一:利用位运算 #include<stdio.h> int find_one_bit(int num) { int i=0; while(num) { if(num%2==1) { return i; } else { i++; } num/=2; } } void find_two_num(int arr[],int len) { int i=0; int ret=0; int pos=0; int num1=0; i

删除数组元素 功能描述:有一个有序整数数组,要求输入一个数字, 在数组中查找是否有这个数,如果有,将该数从数组中删除, 要求删除后的数组仍然保持有序;

public static void main(String[] args) { int[] a={23,34,56,7,8,9}; int[] b = new int[a.length]; Scanner scan = new Scanner(System.in); System.out.println("请输入一个整数:"); int num = scan.nextInt(); boolean flag = true; int i = 0; for( ; i < a.leng

【算法】求两个数组中相同的元素及其个数(C语言、Java实现)

简介: 方法1:(时间复杂度O(n^2)) public void getNum(String arr1, String arr2) { for (int i = 0; i < arr1.length; i++) { for () { } } }

数组中单个出现的一个数

#include <stdio.h> int find(int *p,int len ) {  int i = 0;  int ret = 0;  for (i = 0; i < len; i++)  {   ret ^= p[i];  }  return ret; } int main() {  int arr[10] = { 10, 3, 3, 4, 4, 5, 5, 6, 6 };  int len = sizeof(arr) / sizeof(arr[0]);  find(arr