黑马程序员技术交流社区
标题:
百度面试题,在一个数组中,找出出现次数最多且数值最...
[打印本页]
作者:
一碗小米周
时间:
2013-10-26 10:23
标题:
百度面试题,在一个数组中,找出出现次数最多且数值最...
本帖最后由 一碗小米周 于 2013-10-26 15:39 编辑
在网上看到一个百度的算法题,如题,
在一个数组中,找出出现次数最多且数值最大的一个数并输出。上次看视频的时候,突然想到可以通过map集合来做这题,将数值作为键存入map集合,而将出现的次数作为值存入map集合中。然后可以取出元素及元素出现的个数,那么请问各位怎么进行比较呢?取出那个出现次数最多且数值最大的元素。下面是我的代码,求高手指点一下啊。谢谢。
package test;
import java.util.*;
/*查找一个数组中出现次数最多且最大的数。
* int[] a={1,2,3,2,4,2,4,2}
* */
public class FindArray {
public static void main(String[] args) {
int[] in ={2,4,3,2,4,2,3};
findElement(in);
}
public static void findElement(int[] in){
Map<Integer,Integer> map =new TreeMap<Integer,Integer>();
for(int x = 0;x<in.length;x++){
Integer value = map.get(in[x]);
if(value==null){
map.put(in[x],1);
}
else
map.put(in[x], ++value);
}
Set<Integer> set = map.keySet();
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()){
Integer key = iterator.next();
int count = map.get(key);
System.out.println(key+"出现了"+count+"次");
}
}
}
复制代码
作者:
wenbaoxing
时间:
2013-10-26 12:38
请看我的代码,我有注释:
import java.util.*;
/*查找一个数组中出现次数最多且最大的数。
* int[] a={1,2,3,2,4,2,4,2}
* */
public class TestFindArray {
public static void main(String[] args) {
int[] in ={2,4,3,2,4,4,4,2,4,3,3,3,3};
findElement2(in);
}
public static void findElement(int[] in){
Map<Integer,Integer> map =new TreeMap<Integer,Integer>();
for(int x = 0;x<in.length;x++){
Integer value = map.get(in[x]);
if(value==null){
map.put(in[x],1);
}
else
map.put(in[x], ++value);
}
Set<Integer> set = map.keySet();
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()){
Integer key = iterator.next();
int count = map.get(key);
System.out.println(key+"出现了"+count+"次");
}
}
/*
需求:取出整型数组中那个出现次数最多且数值最大的元素
思路:
1、创建一个map集合
2、将int数组中的元素逐个添加进Map集合中,key存储元素,value存储次数,在添加过程中如果元素已经存在,则将该元素对应的value值自增后再存入
3、遍历集合取出出现次数最多,且数值最大的元素
*/
public static void findElement2(int[] arr){
Map<Integer,Integer> map=new LinkedHashMap<Integer,Integer>();
//逐个将数组中的元素添加进集合中
for (int i=0;i<arr.length ;i++ )
{
Integer value=map.get(arr[i]);
if (value!=null)
{
map.put(arr[i],++value);
}
else
map.put(arr[i],1);
}
//遍历map集合,同时记录符合条件的key和value
Integer keyMax=(Integer)arr[0];
Integer valueMax=(Integer)map.get(arr[0]);
//我用entrySet方式遍历的
for (Object obj:map.entrySet() )
{
Map.Entry me=(Map.Entry)obj;
Integer key=(Integer)me.getKey();
Integer value=(Integer)me.getValue();
System.out.println(key+":"+value);
//获取次数最多的元素及其出现次数记录下来,如果value相等再比较key值的大小,取出key值大的记录下来
if (value>valueMax)
{
valueMax=value;
keyMax=key;
}else if (value==valueMax)
{
if (key>keyMax)
{
keyMax=key;
}
}
}
System.out.println("出现次数最多的元素以及出现的次数为:");
System.out.println(keyMax+":"+valueMax);
}
}
复制代码
作者:
一碗小米周
时间:
2013-10-26 15:39
wenbaoxing 发表于 2013-10-26 12:38
请看我的代码,我有注释:
非常感谢。。
作者:
Cheers_for_CRAZ
时间:
2013-10-26 15:49
2楼的数组4出现了5次,3也出现了5次,似乎只是输出了4的次数,但没有输出3的次数!来瞧瞧我的代码
/*
* 想法:我没有用map集合存储,而是定义了两个ArrayList集合分别存储数组元素和出现的次数
* 这样可以更好的用值获取键。
* 由于数组中不同元素可能出现相同的次数(比如4可能出现2次,3也出现2次)
* 所以可以利用ArrayList的索引来获取键和值,只要让两个ArrayList集合的索引相同就可以了!
*/
import java.util.ArrayList;
public class GetMaxCount {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[] { 1, 4, 2, 2, 4, 6, 7, 8 };
getMaxCount(arr);
}
private static void getMaxCount(int[] arr) {
// 定义两个集合,一个存储键,一个存储值
ArrayList<Integer> listKey = new ArrayList<Integer>();
ArrayList<Integer> listValue = new ArrayList<Integer>();
// 如果数组为空,返回
if (arr == null)
return;
// 遍历arr数组,将数组元素和元素出现的次数分别存放在listKey和listvalue中
int arrNum;
int index;// 定义角标索引
int value;// 定义listValue需要存储的值
for (int i = 0; i < arr.length; i++) {
arrNum = arr[i];
if (listKey.contains(arrNum)) {
index = listKey.indexOf(arrNum);
value = listValue.get(index);
listValue.set(index, ++value);
} else {
listKey.add(arrNum);
index = listKey.indexOf(arrNum);
value = 1;
listValue.add(index, value);
}
}
//取出所有元素
System.out.println(listKey+"分别出现了"+listValue+"次");
// 遍历listValue,找出最大值
System.out.println();
System.out.println("元素中最大次数。。。。");
int maxValue = 0;
for (int i = 0; i < listValue.size(); i++) {
value = listValue.get(i);
maxValue = maxValue > value ? maxValue : value;
}
// 再次遍历listValue,找出与listKey对应的键
for (int i = 0; i < listValue.size(); i++) {
value = listValue.get(i);
if (maxValue == value) {
System.out.println(listKey.get(i) + "出现了" + maxValue +"次");
}
}
}
}
复制代码
作者:
liqiangwaini
时间:
2014-2-12 16:42
回复楼上,采用Map也实现了相同的功能,谢谢!
static int[] aa = {1, 7, 2, 4 , 7, 3, 5, 6, 7, 9 , 2, 5, 3, 7, 9, 9, 9};
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < aa.length; i++) {
if (map.get(aa[i]) == null) {
map.put(aa[i], 1);
} else {
map.put(aa[i], map.get(aa[i]) + 1);
}
}
int count = Integer.MIN_VALUE;
for (Integer k : map.keySet()) {
if (map.get(k) > count) {
count = map.get(k);
}
}
for (Integer k : map.keySet()) {
if (map.get(k) == count) {
System.out.println("values = " + k + " count = " + count);
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2