将项目均匀分配到3列的算法

Bri*_*ton 4 algorithm

我正在寻找一种算法,将1到多个项目均匀分配到三列.没有列可以比任何其他列具有多一个项目.我打下了一个我正在寻找的例子.添加Col1,Col2和Col3应该等于ItemCount.

编辑:此外,项目是字母数字,必须在列中排序.列中的最后一项必须小于下一列中的第一项.

Items         Col1,Col2,Col3
A             A
AB            A,B
ABC           A,B,C
ABCD          AB,C,D
ABCDE         AB,CD,E
ABCDEF        AB,CD,EF
ABCDEFG       ABC,DE,FG
ABCDEFGH      ABC,DEF,GH
ABCDEFGHI     ABC,DEF,GHI
ABCDEFHGIJ    ABCD,EFG,HIJ
ABCDEFHGIJK   ABCD,EFGH,IJK
Run Code Online (Sandbox Code Playgroud)

Ric*_*dle 11

在这里,你用Python:

NumCols = 3
DATA = "ABCDEFGHIJK"

for ItemCount in range(1, 12):
    subdata = DATA[:ItemCount]

    Col1Count = (ItemCount + NumCols - 1) / NumCols
    Col2Count = (ItemCount + NumCols - 2) / NumCols
    Col3Count = (ItemCount + NumCols - 3) / NumCols

    Col1 = subdata[:Col1Count]
    Col2 = subdata[Col1Count:Col1Count+Col2Count]
    Col3 = subdata[Col1Count+Col2Count:]

    print "%2d   %5s  %5s  %5s" % (ItemCount, Col1, Col2, Col3)

# Prints:
#  1       A              
#  2       A      B       
#  3       A      B      C
#  4      AB      C      D
#  5      AB     CD      E
#  6      AB     CD     EF
#  7     ABC     DE     FG
#  8     ABC    DEF     GH
#  9     ABC    DEF    GHI
# 10    ABCD    EFG    HIJ
# 11    ABCD   EFGH    IJK
Run Code Online (Sandbox Code Playgroud)


Bom*_*mbe 8

这个答案现在已经过时,因为OP在我回答之后决定简单地改变这个问题.我太懒了,不能删除它.

function getColumnItemCount(int items, int column) {
    return (int) (items / 3) + (((items % 3) >= (column + 1)) ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*lph 5

只是给你一个提示(这很容易,所以自己弄清楚)

将 ItemCount 除以 3,向下取整。这是至少在每一列中的内容。

现在你做 ItemCount % 3(模数),它要么是 1 要么是 2(因为否则它会被 3 整除,对)然后你分发它。


gsf*_*gsf 5

这个问题是我发现的最接近我自己的问题,所以我会发布我想出的解决方案.在JavaScript中:

var items = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
var columns = [[], [], []]
for (var i=0; i<items.length; i++) {
  columns[Math.floor(i * columns.length / items.length)].push(items[i])
}
console.log(columns)
Run Code Online (Sandbox Code Playgroud)