我正在寻找一种算法,将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)
这个答案现在已经过时,因为OP在我回答之后决定简单地改变这个问题.我太懒了,不能删除它.
function getColumnItemCount(int items, int column) {
return (int) (items / 3) + (((items % 3) >= (column + 1)) ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)
只是给你一个提示(这很容易,所以自己弄清楚)
将 ItemCount 除以 3,向下取整。这是至少在每一列中的内容。
现在你做 ItemCount % 3(模数),它要么是 1 要么是 2(因为否则它会被 3 整除,对)然后你分发它。
这个问题是我发现的最接近我自己的问题,所以我会发布我想出的解决方案.在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)
| 归档时间: |
|
| 查看次数: |
6739 次 |
| 最近记录: |