【小算法】Java中对不定长度的List,最大值为X,大于X的进行平均分组,如果不能平均分组的,每组相差不能超过1
- 算法刷题
- 时间:2023-06-06 23:56
- 3055人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
题目:
请使用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.运行后结果如下图: