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

如何统计int数组中连续相等值并返回计数与值顺序数组

整数数组连续相等值分段统计实现方案

核心实现思路

整体逻辑为单次遍历数组完成分段标记,无嵌套循环,时间复杂度O(n),空间复杂度O(k)(k为连续分段的总数量),具体步骤如下:

  • 先做边界判断:如果输入数组为空或者长度为0,直接返回两个空int数组即可
  • 由于分段总数在遍历前无法确定,先用两个动态列表分别存储分段计数结果和分段对应值结果,遍历完成后再转成固定长度的int数组
  • 初始化当前段的基准值为数组第一个元素,当前段的计数器初始值设为1
  • 从数组下标为1的元素开始逐一遍历:
    • 若当前遍历元素和当前段基准值相等,直接给当前段计数器+1
    • 若不相等,说明当前段已经走到末尾:把当前段的计数值、基准值分别存入两个结果列表,再把基准值更新为当前遍历到的元素,计数器重置为1
  • 整个数组遍历完成后,必须把最后一段的计数值和基准值存入结果列表——循环判断逻辑只会在遇到不同值时存储上一段,最后一段没有后续不同值触发存储,是最容易遗漏的步骤
  • 最后把两个动态列表转为int数组返回即可

代码实现(Java版本,和示例语法对齐)

import java.util.ArrayList;
import java.util.List;

public class ContinuousCount {
    public static int[][] countContinuousValue(int[] arr) {
        // 边界处理:空数组返回两个空数组
        if (arr == null || arr.length == 0) {
            return new int[][]{new int[0], new int[0]};
        }

        List<Integer> countList = new ArrayList<>();
        List<Integer> valueList = new ArrayList<>();

        // 初始化第一段参数
        int currentValue = arr[0];
        int currentCount = 1;

        for (int i = 1; i < arr.length; i++) {
            if (arr[i] == currentValue) {
                currentCount++;
            } else {
                // 存储上一段的统计数据
                countList.add(currentCount);
                valueList.add(currentValue);
                // 更新为新段的初始参数
                currentValue = arr[i];
                currentCount = 1;
            }
        }
        // 补存最后一段的统计数据
        countList.add(currentCount);
        valueList.add(currentValue);

        // 列表转基础类型int数组
        int[] counts = countList.stream().mapToInt(Integer::intValue).toArray();
        int[] values = valueList.stream().mapToInt(Integer::intValue).toArray();

        return new int[][]{counts, values};
    }

    public static void main(String[] args) {
        int[] arr = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,0,0,0,1,1,1,2,2,2,2,0,0,0,0};
        int[][] result = countContinuousValue(arr);
        // 输出结果和预期完全一致:
        // 计数数组:[11,5,4,3,3,4,4]
        // 数值数组:[0,1,2,0,1,2,0]
    }
}

校验提示:将示例输入传入上述代码,输出的两个数组完全匹配预期结果,所有分段计数累加和等于原数组长度,不会出现统计遗漏。

内容的提问来源于stack exchange,提问作者Frederik Petri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:03:17