我有一堆数字,例如
[2872, 2997, 3121, 13055, 14178, 14302, 23134, 23382, 23507, 32832, 33677, 34017, 43415, 44246, 44374, 52866, 54035, 54158, 62835, 64243, 64936, 73110, 73890, 74014, 82809, 83771, 83899, 93436, 94765, 94891].
我想按如下方式分割它:
[[2872, 2997, 3121], [13055, 14178, 14302], [23134, 23382, 23507], [32832, 33677, 34017], [43415, 44246, 44374], [52866, 54035, 54158], [62835, 64243, 64936], [73110, 73890, 74014], [82809, 83771, 83899], [93436, 94765, 94891]].
要注意的是,组之间的距离可以彼此更近,组内的数字也可以更远。
答案 0 :(得分:0)
答案 1 :(得分:0)
您不能只创建大小为N / 3(N是总数的总数)的整数列表(或数组数组)的列表,然后仅在此长度上循环并将最小数放入其中?
这样的事情(我不知道您使用什么语言,所以我以c#为例):
int len = numbersStream.count();
List<List<int>> BigList = new List<List<int>>();
List<int> smallList = new List<int>();
for (int i = 0; i < len; ++i)
{
smallList = new List<int>();
for (int j = 0; j < 3; ++i)
{
int value = Math.Min(numbersStream);
smallList.Add(value);
numbersStream.remove(value);
}
BigList.Add(smallList);
}
BigList将是(2872、2997、3121),(13055、14178、14302)等...
*假设您始终总是有%3个数字,否则您只需对算法进行调整即可避免出现异常
答案 2 :(得分:0)
解决方案是在Java中进行的,但是基本上这样做是找到平均增量,并且如果两个元素之间的差小于该平均值,则将所有内容归为一个子集。您可以通过更改averageDelta的运行方式来调整此过程
ps。该解决方案假定您的输入至少为1,并且称为temp
int[] diffrence = new int[temp.length-1];
for (int i=1; i < temp.length; i++) {
diffrence[i-1] = temp[i]-temp[i-1];
}
int averageDelta = (int) Math.round(Arrays.stream(diffrence).average().orElse(1.0));
List<List<Integer>> resultList = new ArrayList<>();
List<Integer> currentList = new ArrayList<>();
currentList.add(temp[0]);
for (int i=1; i < temp.length; i++) {
if (temp[i]-temp[i-1] > averageDelta) {
resultList.add(currentList);
currentList = new ArrayList<>();
}
currentList.add(temp[i]);
}
resultList.add(currentList);
System.out.println(resultList.toString());