【小算法】Java中对不定长度的List,最大值为X,大于X的进行平均分组,如果不能平均分组的,每组相差不能超过1

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 算法刷题
  • 时间:2023-06-06 23:56
  • 3055人已阅读
简介 题目:请使用Java完成对不定长度的List,进行分组,假设list最大20,分组后,每组不能大于20.请平均分组,如果不能平均分的,每组长度相差,不能超过1.思路:①:list的长度是size,判断长度如果小于等于20的,直接返回;②:如果长度大于20的情况,要计算需要分多少组。分组的小算法:size/20+(size%20>0?1:0)。变量名字:num_groups③:计算每组的基本大

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

题目:
请使用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.运行后结果如下图:

f8eb58124de2ed32995866bf6fd9dd0c.png

TopTop