【发布时间】:2017-05-16 21:16:23
【问题描述】:
我正在尝试解决一本书中的一个问题。我在 Java 编程面试元素一书中发现了这个问题。
解决方案: 例如,如果 arraylist = [1, 2, 2, 0, 0, 0, 1, 1, 1, 1] 输出必须是 = [1, 1, 1, 1, 1]
我的代码不起作用:
public class SubArraySameEntry {
public static int subArr(List<Integer> arr) {
int count = 1;
int e=0;
for (int i = 1; i < arr.size(); i++) {
int m = 0;
if (arr.get(i - 1).equals(i)) {
count++ ;
}
if (count > m) {
m = count;
e = arr.get(i);
}
if (!arr.get(i - 1).equals(i)) count =1;
}
return count;
}
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>(Arrays.asList(1, 2, 2, 0, 0, 0, 1, 1, 1, 1));
System.out.println(arr.toString());
int newArr = subArr(arr);
for (int i = 0; i < newArr; i++) {
System.out.print(arr.get(i) + " ");
}
}
}
我尝试并花费了太多时间但无法解决。
【问题讨论】:
-
你能解释一下输出吗?我会从问题的标题中预料到
[1,2,3,4],因为这是具有相等连续数字的子数组的最大长度。为什么应该是[1,1,1,1,1]? -
标题说要查找最长子数组的长度,但示例返回子数组本身。
-
@Tunaki 我预计返回是
4,因为这是最长子数组的长度。 -
最快的解决方案(无排序):构建
element到count的映射。查找/记住element最高的count。构建结果为count的element副本。 -
只是为了好玩:
Map<Integer, Long> collect = arr.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); collect.entrySet().stream().max((e1, e2) -> e1.getValue().compareTo(e2.getValue())).ifPresent(v -> System.out.println("Value " + v.getKey() + " exists " + v.getValue() + " times."))-> 输出“值 1 存在 5 次。”。然后循环打印 1 五次。
标签: java arrays algorithm arraylist