论坛首页 入门技术论坛

1000个0-9的数字,查找出现次数最多的3个数字.并求这他们出现的次数.

浏览 7716 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-04-07   最后修改:2011-04-07
有些细节问题要注意下的。例如:
如下表,1、2、3、4,排名前4位的数,出现的次数是相同的(只要存在排在第3位和第4位数字的次数相同就满足条件),怎么取3个呢?
数字次数
1101
2101
3101
4101


如不考虑以上问题,第一反应是这么玩:
sort -n t.dat | uniq -c | sort -rn | head -n 3
0 请登录后投票
   发表时间:2011-04-07   最后修改:2011-04-07
    public static void main(String[] args) {
    }
0 请登录后投票
   发表时间:2011-04-07  
咋能把算法写成这样呢....find这么写就可以了
    public static void find(int[] nums){
        int sum [] = new int[10];  
        for (int i : nums) {  
            sum[i]++;
        }  
        findMax(sum);  
    }  
0 请登录后投票
   发表时间:2011-04-07   最后修改:2011-04-07
这样行不行

List zero = new ArrayList();
zero.add(0);

targetList.removeAll(zero);
int countZero = 100 - list.size();

0 请登录后投票
   发表时间:2011-04-20  

#include "stdafx.h"

#include "stdafx.h"
#include"iostream"
#include "time.h"


#define NUM 20

typedef int type  ;
using namespace std;

struct All
{
int data;
int num;
};


int _tmain(int argc, _TCHAR* argv[])
{
int a[NUM];
All c[10];
for(int i=0;i<10;i++)
{
c[i].data=i;
c[i].num=0;
}
cout<<"数组为"<<endl;
for(int i=0;i<NUM;i++)
{
a[i]=rand()%10;
}

for(int i=0;i<NUM;i++)
{
cout<<"a["<<i<<"]="<<a[i]<<endl;
c[a[i]].num++;
}
    cout<<"统计每个字符出现的位置:"<<endl;
    for(int i=0;i<10;i++)
{
cout<<c[i].data<<":"<<c[i].num<<endl;
 
}
   
return 0;
}
0 请登录后投票
   发表时间:2011-05-24   最后修改:2011-05-24
把数字和个数加入到Map中
然后对Map进行倒序排序,输出前3个
import java.util.*;
import java.util.Map.*;

public class FindMore {
	public static void main(String[] args) {
		int nums[] = new int[1000];
		// 初始化数据,产生1000个0~9的数字.
		for (int i = 0; i < nums.length; i++) {
			Random m = new Random();
			nums[i] = m.nextInt(10);// 随即产生0-9的数字,然后放入到数组中
		}
		Map<Integer, Integer> maps = new HashMap<Integer, Integer>();
		for (int i = 0; i < nums.length; i++) {
			int num = nums[i];
			if (maps.get(num)==null) {
				maps.put(num, 1);
			}else{
				maps.put(num, maps.get(num)+1);
			}
		}
		List<Map.Entry<Integer, Integer>> li = new ArrayList<Map.Entry<Integer,Integer>>(maps.entrySet());
		Collections.sort(li, new Comparator<Map.Entry<Integer, Integer>>() {

			@Override
			public int compare(Entry<Integer, Integer> o1,
					Entry<Integer, Integer> o2) {
				// TODO Auto-generated method stub
				return o2.getValue()-o1.getValue();
			}

		});
		for (int i = 0; i < 10; i++) {
			System.out.println(li.get(i));
		}
	}
}



结果:
1=112
0=110
6=106
8=103
7=99
3=97
9=97
2=95
5=92
4=89
0 请登录后投票
   发表时间:2011-05-26  
为什么不在生成1000个随机数(读取1000个随机数)的时候就做点手脚?而非要查找呢?
0 请登录后投票
   发表时间:2011-05-27  
hubeen 写道
稍微改进一下吧,查找的时候没必要双重循环
public static void find(int[] nums){   
        int times[] = {0,1,2,3,4,5,6,7,8,9};   
        //存放出现的次数数组,数组的下标为0~9中数字.比如: sum[0]=5 表示0出现5次.sum[1]=8 表示1出现8次.依次类推.   
        int sum [] = new int[times.length];   
        for (int i = 0; i < times.length; i++) {   
            int k = 0;   
            for (int j = 0; j < nums.length; j++) {   
                if(times[i] == nums[j]){   
                    k++;   
                }   
            }   
            sum[i] = k;   
        }   
        findMax(sum);   
    } 
 

用一次循环就OK了
public static void find(int[] nums){  
   //存放出现的次数数组,数组的下标为0~9中数字.比如: sum[0]=5 表示0出现5次.sum[1]=8 表示1出现8次.依次类推.  
        int sum[] = new int[10];  
           for (int j = 0; j < nums.length; j++) {   
                sum[nums[i]]++;
         }   
   
         findMax(sum);   
    } 




应该是sum[nums[j]]++;
0 请登录后投票
   发表时间:2011-06-16  
public class Test {
public static void main(String[] args) {
Random random = new Random();
int[] num = new int[1000];
for (int i = 0; i < 1000; i++) {
int result = random.nextInt(10);
num[i] = result;
}

int count = 0;
int[] max = new int[10];
for (int j = 0; j < 10; j++) {
for (int z = 0; z < num.length; z++) {
if (num[z] == j) {
count++;
max[j] = count;
}
}
System.out.println(j + "出现过" + count + "次");
count = 0;
}

for (int i = 0; i < max.length - 1; i++) {
for (int j = 0; j < max.length - i - 1; j++) {
if (max[j] < max[j + 1]) {
int temp = max[j];
max[j] = max[j + 1];
max[j + 1] = temp;
}
}
}

for (int k = 0; k < 3; k++) {
System.out.println(max[k] + " ");
}
}
}

也写了一个,不知道对不对。忘了注释!
0 请登录后投票
   发表时间:2011-10-04  

public class Practice {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int[] nums = getNums(1000);
		int[] times = new int[]{0,0,0,0,0,0,0,0,0,0};
		
		for (int i = 0; i < nums.length; i++) {
			System.out.print(nums[i] + ", ");
			
			switch (nums[i]) {
			case 0: times[0]++; break;
			case 1: times[1]++; break;
			case 2: times[2]++; break;
			case 3: times[3]++; break;
			case 4: times[4]++; break;
			case 5: times[5]++; break;
			case 6: times[6]++; break;
			case 7: times[7]++; break;
			case 8: times[8]++; break;
			case 9: times[9]++; break;
			}
		}
		System.out.println();
		
		getThreeMax(times);
		
	}
	
	public static void getThreeMax(int[] times){
		//做一个计算次数验证
		int maxCount = 0;
		
		//打印各个数字出现的次数
		for (int i = 0; i < times.length; i++) {
			maxCount += times[i];
			System.out.println("数字\""+i+"\"出现的次数:"+ times[i]);
		}
		System.out.println("已经计算的次数:" + maxCount);
		
		//求出出现最多次数的三个数字
		for(int i = 1; i<4; i++){
			int maxKey = 0, maxValue = times[0];
			for (int j = 0; j < times.length; j++) {
				if (maxValue < times[j]) {
					maxKey = j;
					maxValue = times[j];
				}
				if (j == times.length-1) {
					times[maxKey] = 0;
					System.out.println("出现第" + i + "多的数为:" + maxKey + ",次数:"
							+ maxValue);
				}
				
			}
		}
	}
	
	/*
	 * 获得0-9范围内的n个随机数
	 */
	private static int[] getNums(int n){
		int[] results = new int[n];
		//Random random = new Random(1);
		for (int i = 0; i < results.length; i++) {
			results[i] = (int) Math.round(Math.random()*9);
		}
		return results;
	}

}


这是我的一个做法,欢迎大家指教。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics