You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询数组并打印指定位次范围的最频繁整数?

如何根据频率位次范围获取数组中对应频率的整数?

这是个很实用的需求,我来一步步帮你实现这个方法,完全匹配你给出的示例要求。

首先明确核心需求:给定一个int数组,传入一个位次范围(比如[2,4]),需要按频率从高到低的顺序,输出这个范围内的元素及其频率。像你提供的示例数组[3,1,1,1,13,13,13,13,13,8,8,8,8,8,8],频率最高的8是第1位,13是第2位,1是第3位,3是第4位,所以范围[2,4]就需要输出这三个元素的对应信息。

实现步骤

我把整个流程拆成几个清晰的环节,方便理解和编码:

  • 步骤1:统计元素频率:用哈希表(比如Java的HashMap<Integer, Integer>)记录每个整数的出现次数,遍历数组一次就能完成统计。
  • 步骤2:按频率排序:把哈希表的键值对转换成列表,自定义排序规则——优先按频率降序排列;如果频率相同,可选择按元素值升序或保持原数组出现顺序(示例无此场景,这里先按频率降序处理)。
  • 步骤3:筛选位次范围:注意位次是从1开始计数的(最频繁的元素为第1位),所以要把传入的位次范围转换成列表的索引范围(比如[2,4]对应索引1到3,因为列表索引从0开始)。
  • 步骤4:格式化输出:按照要求的格式拼接并打印每个元素和它的频率。

Java代码示例

下面是完整的可运行代码,包含详细注释:

import java.util.*;

public class FrequencyRangePrinter {
    public static void printElementsByFrequencyRange(int[] arr, int[] range) {
        // 步骤1:统计每个元素的出现频率
        Map<Integer, Integer> frequencyMap = new HashMap<>();
        for (int num : arr) {
            frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
        }

        // 步骤2:将键值对转为列表,按频率降序排序;频率相同时按元素值升序(可按需调整)
        List<Map.Entry<Integer, Integer>> sortedEntries = new ArrayList<>(frequencyMap.entrySet());
        sortedEntries.sort((entry1, entry2) -> {
            int freqCompare = entry2.getValue().compareTo(entry1.getValue());
            if (freqCompare != 0) {
                return freqCompare;
            }
            return entry1.getKey().compareTo(entry2.getKey());
        });

        // 步骤3:检查位次范围的有效性,避免索引越界
        int startRank = range[0];
        int endRank = range[1];
        if (startRank < 1 || endRank > sortedEntries.size() || startRank > endRank) {
            System.out.println("Invalid rank range!");
            return;
        }

        // 步骤4:格式化输出结果
        StringBuilder output = new StringBuilder();
        for (int i = startRank - 1; i < endRank; i++) {
            Map.Entry<Integer, Integer> entry = sortedEntries.get(i);
            output.append(String.format("Value: %d. Frequency: %d ", entry.getKey(), entry.getValue()));
        }
        // 移除末尾多余空格后打印
        System.out.println(output.toString().trim());
    }

    // 测试示例场景
    public static void main(String[] args) {
        int[] sampleArr = {3, 1, 1, 1, 13, 13, 13, 13, 13, 8, 8, 8, 8, 8, 8};
        int[] rankRange = {2, 4};
        printElementsByFrequencyRange(sampleArr, rankRange);
        // 输出结果:Value: 13. Frequency: 5 Value: 1. Frequency: 3 Value: 3. Frequency: 1
    }
}

代码细节说明

  1. 频率统计:用HashMap的getOrDefault方法简化计数逻辑,无需额外判断元素是否已存在。
  2. 排序逻辑:自定义比较器实现按频率降序,频率相同时默认按元素值升序,你也可以改成按元素在原数组中首次出现的顺序(需要额外记录首次出现的索引)。
  3. 边界校验:加入了范围有效性检查,防止传入[0,5]或[5,3]这类无效范围导致程序报错。
  4. 输出优化:用StringBuilder拼接结果,避免频繁字符串拼接的性能损耗,最后移除末尾多余空格保证格式整洁。

内容的提问来源于stack exchange,提问作者0jnats3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:05:20