统计数字(求最接近的两个数字)

本文介绍了一种算法,用于从一组输入数字中找出最接近的两个数,并详细解释了实现过程。

题目: 输入一些数字,求哪两个数最接近?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 99
#define INF 1000000000
int num[MAXN];
int nun[MAXN];

int sort_function(const void *a, const void *b)
{
	//又小到大 
	return *(int *)a - *(int *)b;
 	//由大到小 
	//return *(int *)b - *(int *)b; 
}

int main(void)
{
	int n = 0, a, i;
	while(scanf("%d", &a) == 1)
	{
		num[n++] = a;
	}
	qsort(num, n, sizeof(int), sort_function);
	
	for(i = 1; i<n; i++)
	{
		if(num[i-1]==num[i])
		{
			printf("%d %d\n", num[i], num[i-1]);
			printf("\n");
		}
		else
		{
			nun[i-1]=num[i]-num[i-1];
		}
	}
	int min = INF;
	for(i = 0; i<n-1; i++)
	{
		if(nun[i]<min)
			min = nun[i];
		printf("%d ", nun[i]);
	}
	printf("\n");
	for(i = 0; i<n-1; i++)
	{
		if(min == nun[i])
			printf("%d %d\n", num[i], num[i+1]);
	}
	printf("\n");
	return 0;
}


在 Java 中统计一个数字列表中出现次多的两个,可以通过使用 `HashMap` 来记录每个数字的频率,并对频率进行排序以找出前两个高频的数字。以下是一个完整的实现示例: ### 示例代码 ```java import java.util.*; public class TopTwoFrequentNumbers { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 1, 5, 1, 2, 6, 2); Map<Integer, Integer> frequencyMap = new HashMap<>(); // 统计每个数字的出现次 for (int num : numbers) { frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1); } // 使用优先队列找出频率高的两个 PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>( (a, b) -> a.getValue().equals(b.getValue()) ? b.getKey().compareTo(a.getKey()) : a.getValue() - b.getValue() ); for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) { pq.offer(entry); if (pq.size() > 2) { pq.poll(); } } // 输出结果 System.out.println("出现次多的两个是:"); while (!pq.isEmpty()) { Map.Entry<Integer, Integer> entry = pq.poll(); System.out.println("数字: " + entry.getKey() + ", 次: " + entry.getValue()); } } } ``` ### 代码解析 1. **统计频率**: - 使用 `HashMap` 记录每个数字的出现次。 - 遍历输入列表,更新每个数字的频率。 2. **找出高频率的两个**: - 使用一个小堆(`PriorityQueue`)来保存频率高的两个。 - 自定义比较器,首先根据频率升序排列,如果频率相同则按值降序排列。 - 遍历频率映射,将条目插入堆中,并保持堆的大小不超过 2。 3. **输出结果**: - 从堆中取出两个条目,输出对应的数字及其频率。 ### 处理逻辑 - 如果列表中有多个数字具有相同的高频率,例如两个数字都出现多且频率相等,则程序会按照数字大小排序后输出。 - 如果列表中的唯一元素只有一个,则堆中只会保留一个条目。 ### 时间复杂度分析 - **统计频率**:遍历列表的时间复杂度为 $O(n)$,其中 $n$ 是列表长度。 - **堆操作**:对于每个条目,插入和删除堆的操作时间复杂度为 $O(\log k)$,其中 $k$ 是堆的大大小(这里为 2),因此这部分总时间为 $O(m \log k)$,其中 $m$ 是不同数字量。 - 总体时间复杂度接近 $O(n)$,适合处理大规模据集。 ### 注意事项 - 如果需要支持更复杂的场景,例如处理重复频率时的更多排序规则,可以进一步扩展比较器逻辑。 - 如果输入列表为空或所有数字的频率相等,则需添加额外判断来处理边界情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值