当前位置: 首页 > 知识库问答 >
问题:

计数未排序数组中的重复元素序列(Java)

咸疏珂
2023-03-14

我需要一个函数来接收arrayList并返回一个新的arrayList,其中包含大小相同的整数。His元素将表示原始数组中索引i中的值的重复序列数(外观数)。

1单个外观也将被视为一个序列。例如:arr[1,1,0,1]-

  • 输入:它不必是排序数组

函数示例:

arr[3,0,1,2,1,1,1,3]▪×输入:(arr)▪×输出:newArray[2,1,2,1,2,2,2,2]因为'3'在序列中出现2次,'0'出现1次,等等...

arr[1,0,1,2,1,3]▪×输入:(arr)▪×输出:newArray[3,1,3,1,3,1]

arr[1,0,0,2,1,3,0]▪︎ 输入:(arr)▪︎ 输出:newArray[2,2,2,1,2,1,2]

共有2个答案

艾志尚
2023-03-14

此任务类似于数组/列表中元素的常见计数频率,但相邻元素(子序列)应计为1。也就是说,当计数频率时,如果前一个元素与当前元素相同,则增量为0。

要使用Java流解决此任务,我们需要实现:

  • 类来累加最终值和索引列表,包括添加索引和频率的方法
static class CollectorList {
    int sum;
    List<Integer> indexes = new ArrayList<>();
    
    public CollectorList(List<Integer> h) {
        this.indexes.add(h.get(0));
        this.sum += h.get(1);
    }
    
    public CollectorList merge(CollectorList next) {
        this.sum += next.sum;
        this.indexes.addAll(next.indexes);
        return this;
    }
}

然后,获取自定义频率列表的方法可以实现如下:

public static List<Integer> getFrequencyList(int ... arr) {
    return new ArrayList<>(
        IntStream.range(0, arr.length)  // stream of indexes
                 .mapToObj(i -> Map.entry(
                     arr[i],            // key: current element
                     Arrays.asList(i, i > 0 && arr[i] == arr[i - 1] ? 0 : 1))) // store index and delta
                 .collect(Collectors.toMap(
                     Map.Entry::getKey, // for array elements
                     e -> new CollectorList(e.getValue()), // init collector of helper 
                     CollectorList::merge   // and merge
                 ))
                 .values() // get Collection<CollectorList>
                 .stream() // convert CollectorList back to index -> frequency
                 .flatMap(c -> c.indexes.stream().map(i -> Map.entry(i, c.sum)))
                 .collect(Collectors.toMap(
                     Map.Entry::getKey, 
                     Map.Entry::getValue, 
                     (i1, i2) -> i1, TreeMap::new // sort by index
                 ))
                 .values() // frequencies by index
        );
}

为了简洁起见,上面的代码使用Java9Map.entry,它可以替换为构建new AbstractMap。如果需要Java8兼容性,SimpleEntry()

测试:

int[][] tests = {
    {},
    {0},
    {1,2,1,2,1,3,1},
    {1,1,0,1},
    {3,0,1,2,1,1,1,3},
    {1,0,1,2,1,3},
    {1,0,0,2,1,3,0}
};
for (int[] arr : tests) {
    List<Integer> result = getFrequencyList(arr);
    System.out.println(Arrays.toString(arr) + " -> " + result);
}

输出

[] -> []
[0] -> [1]
[1, 2, 1, 2, 1, 3, 1] -> [4, 2, 4, 2, 4, 1, 4]
[1, 1, 0, 1] -> [2, 2, 1, 2]
[3, 0, 1, 2, 1, 1, 1, 3] -> [2, 1, 2, 1, 2, 2, 2, 2]
[1, 0, 1, 2, 1, 3] -> [3, 1, 3, 1, 3, 1]
[1, 0, 0, 2, 1, 3, 0] -> [2, 2, 2, 1, 2, 1, 2]
通京
2023-03-14

您可以在O(n)时间复杂度中执行此操作:

步骤1:使用变量“prev”检查前一个元素,并将其初始化为false/0。步骤2:每当您找到要检查的元素时,就在数组中移动(比如x),若prev为false,则增加count,否则在数组中向前移动。

 类似资料:
  • 我有下面的代码- 是包含int属性的类对象列表-参考号:即

  • 问题内容: 我有一个整数数组,我想计算重复出现的元素。首先,我读取数组的大小,并使用从控制台读取的数字对其进行初始化。在数组中,我存储了重复的元素。该数组存储元素连续出现的次数。然后,我尝试搜索重复序列并以特定格式打印它们。但是,它不起作用。 我希望输出看起来像这样: 例如: 如何找到重复的元素及其计数?如何如上所示打印它们? 问题答案: 字典(Java中的HashMap)可以轻松解决此类问题。

  • 我正在开发一个修改过的Mastermind游戏,我需要比较猜测和代码数组,并计算正确位数的数量。 它会一直工作,直到代码数组中有重复的数字。我知道这与第二个for循环和从正确的数字中减去有关。有没有办法只用循环和基本知识来修复它?

  • 我有一个问题,试图实现一个算法使用分而治之。 给定一个未排序的数组tv[]查找该数组的de v[k]元素,就好像该数组已排序,但没有对数组v排序一样。 例如,如果k=3且v={2,-1,-6,7,4},则该数组的k元素为2。 因为我无法编辑传递的数组,所以我无法想出另一种方法来对数组进行排序,而不将其保存在另一个局部变量上,或者尝试像快速排序一样分割数组,并返回v的最后一个元素的位置。 如果有帮助

  • 我做了一个代码,应该显示数组中元素排列的整个组合。 应该是什么: 123 213 231 132 312 321 但结果是这样的: 231 312 123 231 312 123 如何以应有的方式进行排列?