我给了一个数字列表,给了一个数字N,从列表的中心切出N个数字。因此,如果列表为:
1 2 3 5 7 11 13 17 19
并且N = 3,输出将是:
5 7 11
或者如果列表是:
1 2 3 5 7 11 13 17
并且N = 4,则输出将是:
3 5 7 11
我当前的解决方案是O(N ^ 2)(或者至少我认为是?Idk,如果嵌套的for循环意味着这是O(N ^ 2)),则在数字数组上进行迭代直到从开始到i的数字数量==从(数组的大小-(i +剪切大小))开始的数字数量。因为中间的切口意味着切口的左侧与右侧的切口数量相同。
“ nums”是我在中间找到切线的数字数组。
int rightof = 0;
ArrayList<Integer> cut = new ArrayList<Integer>();
for (int i = 0; i < nums.size(); i++) {
rightof = nums.size() - (i + cutsize);
if (i == rightof && i != 0) {
for (int j = i; j < (cutsize + i); j++) {
cut.add(nums.get(j));
}
break;
}
}
让这种情况变慢的是将适当的数字添加到“ cut”数组中。因此,我不确定如何优化该步骤。
答案 0 :(得分:3)
Java 8流api使此操作相当容易。要跳过的元素数是大小减去n
除以2,并限制为n
个元素。
List<Integer> cut = Arrays.asList(1, 2, 3, 5, 7, 11, 13, 17, 19);
int n = 3;
int sk = (cut.size() - n) / 2;
List<Integer> al = cut.stream().skip(sk).limit(n).collect(Collectors.toList());
System.out.println(al);
答案 1 :(得分:2)
了解sublist()
的力量:
List<T> result = arr.subList((arr.size()+1)/2 - arr.size()/4, arr.size()/2 + arr.size()/4);
arr
是您的List
示例:
List<Integer> arr = Arrays.asList(1, 2, 3, 5, 7, 11, 13, 17);
arr.subList((arr.size()+1)/2 - arr.size()/4, arr.size()/2 + arr.size()/4)
.forEach(System.out::println);
输出:
3
5
7
11
如果您只想通过简单的循环来做到这一点:
List<Integer> list = new ArrayList<>();
int size = arr.size();
for(int i = (size+1)/2-size/4; i < size/2+size/4; i++) {
list.add(arr.get(i));
}