2012-01-11 58 views
1

這不是一個複雜的問題,但我不能以任何理由想一個簡單的方法來使用模運算符來完成此操作。基本上我有一個N項目的集合,我想在網格中顯示它們。確定有多少行,每行有多少個項目

我最多可以顯示3個條目並且垂直無限;他們不是固定的寬度...所以如果我有2個項目,他們得到顯示那樣[1][2]。如果我有4個項目,他們得到顯示的堆疊是這樣的:

[1][2] 
[3][4] 

如果我有5個項目就應該是這樣的:

[ 1 ][ 2] 
[3][4][5] 

七品稍微複雜一些:

[ 1 ][ 2] 
[ 3 ][ 4] 
[5][6][7] 

這是其中的一種情況,如果我睡在上面,早上明顯會死掉,但我所能想到的所有事情都涉及複雜的循環和狀態變量。必須有一個更簡單的方法。

我在C#中這樣做,但我懷疑語言問題。

+3

是最後一行完全填充的另一個標準嗎?否則,爲什麼這7個項目不是 1 2 3 \ n 4 5 6 \ n 7 – SimonC 2012-01-11 04:35:29

+0

爲什麼不在每行中放3(mod 3一路下降),並將其餘的1或2在最後一行? – 2012-01-11 04:38:21

+0

@SimonC:是的想法是沒有稀疏的行。 – Mark 2012-01-11 04:42:47

回答

3

通過最大化有三個項目的行數,可以最大限度地減少行的總數。因此,六個項目將被歸爲3兩行,而不是三排2:

[1][2][3] 
[4][5][6] 

和十個項目將被分組爲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項例如行走,過程會去如下:

  1. 10個項目剩餘。 10%3!= 0。由於10> 4,請分兩項。
  2. 剩餘8件商品。 8%3!= 0.由於8> 4,需要兩個項目。
  3. 剩餘6件商品。 6%3 = 0.將這6個項目分成三組。

要轉到你的7個項目例如:

  1. 7個項目剩餘。 7%3!= 0。由於7> 4,請分兩項。
  2. 剩餘5件商品。 5%3!= 0.由於5> 4,需要兩個項目。
  3. 剩餘3件商品。 3%3 = 0。將這3項作爲一組。

而這裏的4項結果:

  1. 4項剩餘。 4%3!= 0。由於剩餘= 4,需要兩個項目。
  2. 剩餘2件商品。 2%3!= 0. 2 < 4.下降到其他狀態,取其餘項目。

我認爲這樣會起作用。至少在上午12點30分,它似乎應該起作用。

+1

謝謝。這是有道理的,並符合我原來的循環思想,但我有邏輯的東西都洗腦。這會成爲現在被黑客攻擊並且在明天不是12:30的時候被修復的問題之一;我在同一條船:)。 – Mark 2012-01-11 05:37:47

+0

不客氣。這是一個有趣的小問題。現在比凌晨4點更好如果是凌晨4點,我會將一些結合LINQ,泛型和相冊美學佈局的解釋放到一半。祝你好運! – Rethunk 2012-01-11 05:43:45

1

因此,考慮到:a)目標是最小化行數,b)一行不能超過3個項目,c)如果可能的話,一行應該有3個項目,以及d)不能有排除單個項目,除非它是唯一項目,我會說算法如下:

  1. 如果只有一個項目,它將單獨在其自己的行;完成。
  2. 通過將項目數除以3來計算'暫定'行數。
  3. 如果餘數(N%3)爲0,則所有行將有3個項目。
  4. 如果餘數爲1,那麼會有一個額外的行,最後兩行將只有兩個項目。
  5. 如果餘數爲2,那麼會有一個額外的行,它只會有2個項目。

這個算法會產生一個與你所設想的格式略有不同的格式(3項目的行將在最上面,2項目的行將在最下面),但它滿足約束條件。如果您需要將2項行放在頂部,則可以對其進行修改。

+0

如果我有8個項目,它應該去[1] [2] \ n [3] [4] [5] \ n [6] [7] [8]。我遇到的主要問題是我試圖找出第n個元素元素所在行的項目數量;所有的時候我遍歷n個元素。 – Mark 2012-01-11 04:52:33

+0

你現在困惑了我。爲什麼[1] [2] \ n [3] [4] [5] \ n [6] [7] [8]而不是[1] [2] \ n [3] [4] \ n [5] [6] \ n [7] [8]'?決定格式的規則是什麼?在任何人都能提供任何有用的答案之前,您需要建立規則並準確拼寫出來。 – 2012-01-11 04:56:04

+0

目標是儘量減少行數。一行不能超過3個項目,並應尋求每行最多的項目。 – Mark 2012-01-11 05:22:03

2
if ((list.Count % 2) == 0) 
{ 
//Display all as [][] 
        [][] 
} 
else 
{ 
//Display all as [][] 
        [][] 
//Display last 3 as [][][] 
} 
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