这不是一个复杂的问题,但我不能无论出于什么原因想到一个简单的方法来使用模数运算符。基本上我有N个项目的集合,我想在网格中显示它们。
我最多可以显示3个条目,垂直无限;它们不是固定的宽度......所以如果我有2个项目,它们会显示为[1][2]
。如果我有4个项目,它们会显示如下:
[1][2]
[3][4]
如果我有5个项目,它应该是这样的:
[ 1 ][ 2]
[3][4][5]
七个项目稍微复杂一点:
[ 1 ][ 2]
[ 3 ][ 4]
[5][6][7]
这是其中一个问题,如果我睡在它上面,它会在早上脑死亡,但我能想到的只是复杂的循环和状态变量。必须有一个更简单的方法。
我在C#中这样做,但我怀疑语言是否重要。
答案 0 :(得分:3)
通过最大化具有三个项目的行数,可以最小化总行数。因此,六个项目将被分组为两行3而不是3行2:
[1][2][3]
[4][5][6]
并且十个项目将被分组为两行2行和2行3行而不是5行2:
[ 1 ][ 2 ]
[ 3 ][ 4 ]
[5][6][7 ]
[8][9][10]
如果您想要先包含两个项目的行,那么您将继续剥离两个项目,直到其余项目可被3整除。当您完成循环时,您需要使用索引跟踪剩余项目的数量或诸如此类的东西。
在循环中填充每一行,您可以检查以下条件:
//logic within loop iteration
if (remaining % 3 == 0) //take remaining in threes; break the loop
else if (remaining >= 4) //take two items, leaving two or more remaining
else //take remaining items, which will be two or three; break the loop
如果我们看一下10个项目的例子,那么过程将如下:
转到7个项目的示例:
以下是4项的结果:
我认为那会奏效。至少在凌晨12:30,它似乎应该有效。
答案 1 :(得分:2)
if ((list.Count % 2) == 0)
{
//Display all as [][]
[][]
}
else
{
//Display all as [][]
[][]
//Display last 3 as [][][]
}
答案 2 :(得分:1)
所以,鉴于:a)目标是最小化行数,b)行不能超过3个项目,c)如果可能,行应该有3个项目,d)你不能有一行除非它是唯一的项目,我会说算法如下:
此算法将产生与您想象的格式略有不同的格式(3项目行将位于顶部,2项目行将位于底部),但它满足约束条件。如果您需要将两项行放在顶部,则可以对其进行修改。
答案 3 :(得分:1)
伪代码怎么样
if n mod 3 = 1
first 2 rows have 2 items each (assuming n >= 4)
all remaining rows have 3 items
else if n mod 3 = 2
first row has 2 items
all remaining rows have 3 items
else
all rows have 3 items