无聊自己出一些算法题,方便日后工作使用。
题目:
有10个集合,每个集合里有一百个一百以内的随机数字。然后要统计这10个集合中出现次数最多的那个数字,并且按重复次数对这10个集合进行排序。
步骤:
生成10个集合,每个集合包含100个0到99或1到100的随机数。
统计这10个集合中所有数字的出现次数,找到出现次数最多的那个数字。例如,将所有集合中的数字合并到一个总的统计中,然后找出出现次数最多的那个数字。
然后,针对这10个集合中的每一个,统计该数字在每个集合中的出现次数。根据这个次数对这10个集合进行排序。
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
// 生成10个包含100个随机数的集合
List<List<Integer>> lists = generateLists();
// 统计所有数字的总出现次数
Map<Integer, Integer> totalCounts = getTotalCounts(lists);
// 找出出现次数最多的数字
int maxNumber = findMaxNumber(totalCounts);
System.out.println("出现次数最多的数字: " + maxNumber);
// 根据该数字的出现次数对集合进行排序
sortListsByCount(lists, maxNumber);
// 输出排序结果
System.out.println("\n排序后的集合(按出现次数降序):");
for (List<Integer> list : lists) {
int count = Collections.frequency(list, maxNumber);
System.out.println("出现次数: " + count + ", 集合: " + list);
}
}
// 生成10个集合,每个集合100个0-99的随机数
private static List<List<Integer>> generateLists() {
Random random = new Random();
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < 10; i++) {
List<Integer> list = new ArrayList<>();
for (int j = 0; j < 100; j++) {
list.add(random.nextInt(100));
}
lists.add(list);
}
return lists;
}
// 统计所有数字的总出现次数
private static Map<Integer, Integer> getTotalCounts(List<List<Integer>> lists) {
Map<Integer, Integer> counts = new HashMap<>();
for (List<Integer> list : lists) {
for (Integer num : list) {
counts.put(num, counts.getOrDefault(num, 0) + 1);
}
}
return counts;
}
// 找出出现次数最多的数字(次数相同时取数值较大的)
private static int findMaxNumber(Map<Integer, Integer> counts) {
int maxCount = -1;
int maxNumber = -1;
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
if (entry.getValue() > maxCount ||
(entry.getValue() == maxCount && entry.getKey() > maxNumber)) {
maxCount = entry.getValue();
maxNumber = entry.getKey();
}
}
return maxNumber;
}
// 根据指定数字的出现次数对集合进行降序排序
private static void sortListsByCount(List<List<Integer>> lists, final int targetNumber) {
lists.sort((list1, list2) -> {
int count1 = Collections.frequency(list1, targetNumber);
int count2 = Collections.frequency(list2, targetNumber);
return Integer.compare(count2, count1); // 降序排列
});
}
}
代码说明:
1、生成随机集合:使用Random类生成10个集合,每个集合包含100个0-99的随机数。
2、统计总次数:使用HashMap合并统计所有集合中每个数字的出现次数。
3、找出最多数字:遍历统计结果,找到出现次数最多的数字(次数相同时取数值较大的)。
4、排序集合:根据该数字在每个集合中的出现次数,使用自定义比较器对集合进行降序排序。