【小算法】Java中对不定长度的List,最大值为X,大于X的进行平均分组,如果不能平均分组的,每组相差不能超过1
- 算法刷题
- 时间:2023-06-06 23:56
- 3791人已阅读
🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号
题目:
请使用Java完成对不定长度的List,进行分组,假设list最大20,分组后,每组不能大于20.请平均分组,如果不能平均分的,每组长度相差,不能超过1.
例如:
有list的长度是x,如果长度不大于20,就不分割,如果大于20进行平均分配,但是每组长度相差不能超过1。比如长度21分割两组,一组长度11一组长度10;再比如长度55,分三组,每组长度分别是19,18,18
思路:
①:list的长度是size,判断长度如果小于等于20的,直接返回;
②:如果长度大于20的情况,要计算需要分多少组。分组的小算法:size/20 + (size % 20 >0?1:0)。变量名字:num_groups
③:计算每组的基本大小:size/ 分组的数量 = 每组的大小。变量名:group_size
④:计算剩余的元素数量:size % 分组数量 = 剩余元素的大小.变量名字:remaining
⑤:按照基本大小取出元素:使用到list进行分页处理
⑥:如果还有剩余的元素,则追加到当前组中
完整的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SplitListExample {
public static void main(String[] args) {
// Create a list with 25 elements
List<Integer> lst = new ArrayList<>();
for (int i = 0; i < 25; i++) {
lst.add(i);
}
// Split the list into sublists of at most 20 elements
List<List<Integer>> result = splitList(lst);
// Print out the sublists
for (List<Integer> sublist : result) {
System.out.println(sublist.toString());
}
}
/**
* Split a list into sublists of at most 20 elements.
* If the list has <=20 elements, returns a single-element list containing the input list.
*/
public static List<List<Integer>> splitList(List<Integer> lst) {
int size = lst.size();
if (size <= 20) {
return Arrays.asList(lst);
} else {
int numGroups = size / 20 + (size % 20 > 0 ? 1 : 0);
int groupSize = size / numGroups;
int remaining = size % numGroups;
List<List<Integer>> result = new ArrayList<>();
int index = 0;
for (int i = 0; i < numGroups; i++) {
int endIndex = index + groupSize;
if (remaining > 0) {
endIndex++;
remaining--;
}
List<Integer> group = lst.subList(index, endIndex);
result.add(group);
index = endIndex;
}
return result;
}
}
}首先,定义一个splitList()方法来接收一个List<Integer>类型的参数,表示需要分割的列表。
如果列表长度不大于20,直接将这个列表包装成一个只有一个元素的List<List<Integer>>并返回。
否则,计算需要分成多少组(numGroups),每组的基本大小(groupSize),还有剩余的元素数量(remaining)。因为需要对列表进行分割,所以这里使用了subList()方法从原列表中按照索引范围取出子列表。
接下来,使用一个循环依次处理每一组。由于每组元素数量可能不同,所以需要计算出每一组的结束索引,并根据剩余的元素数量来调整结束索引。最后,将每一组的元素存储到结果列表result中,并返回。
验证:
假设list的长度是81,最大不能超过20.运行后结果如下图:
