我需要一个函数来接收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]
此任务类似于数组/列表中元素的常见计数频率,但相邻元素(子序列)应计为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]
您可以在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 如何以应有的方式进行排列?