2009-08-03 67 views
2

假設我有一些序列號爲1-n的物件,需要按行顯示。每行是m個單位寬。我需要一些僞代碼來輸出行,對我來說,這樣就可以保持m-width的限制。這不是一個揹包問題,因爲這些項目必須保持序列號順序 - 行末處的空白空間沒有問題。用於貨架堆棧的僞代碼

我一直在追我的尾巴了這一點,部分原因是因爲我需要在這兩個PHP和jQuery/JavaScript的,因此對於僞代碼的請求....

回答

3
while (!items.isEmpty()) { 
    rowRemain = m; 
    rowContents = []; 
    while (!items.isEmpty() && rowRemain > items[0].width) { 
    i = items.shift(); 
    rowRemain -= i.width 
    rowContents.push(i); 
    } 
    rows.push(rowContents); 
} 

運行時間爲Θ(件數)

+0

啊哈 - 比我自己的回覆更清潔的解決方案!這就是我正在尋找的東西...謝謝... – Dycey 2009-08-03 16:07:23

0

Modulus是你的朋友。我會做這樣的事情:

$items = array(/* Your list of stuff */); 
$count = 0; 
$maxUnitsPerRow = 4; // Your "m" above 

while ($item = $items[$count]) { 
if ($count % $maxUnitsPerRow == 0) { 
    $row = new row(); 
} 
$row->addItemToRow($item); 
$count++; 
} 
+0

當項目的寬度不是1時,這不起作用。 – bdonlan 2009-08-03 15:48:08

+0

也許我很密集,但我不明白爲什麼它不適用於寬度不等於1的項目。 如果項目是必須在所有行中進行的所有事情的列表,並且您創建了每次計數與行寬度的模數爲零時,都會有一個新行,您將始終擁有正確計數的行。 如果序列號中有跳過的序列號不起作用,除非您爲這些序列號添加空的佔位符,或者使用其他方法遍歷列表。 – Bryan 2009-08-03 15:54:36

0

對於它的價值,我覺得我有什麼,我一直在尋找,爲PHP - 但不知道是否有更簡單的方法...

<?php 
// working with just a simple array of widths... 
$items  = array(1,1,1,2,1,1,2,1); 
$row_width = 0; 
$max_width = 2; 

echo "Begin\n"; // begin first row 
foreach($items as $item=>$item_width) { 
    // can we add item_width to row without going over? 
    $row_width += $item_width; 
    if($row_width < $max_width) { 
    echo "$item_width "; 
    } else if($row_width == $max_width) { 
    echo "$item_width"; 
    echo "\nEnd\nBegin\n"; // end last row, begin new row 
    $row_width = 0; 
    } else if($row_width == 2* $max_width) { 
    echo "\nEnd\nBegin\n"; // end last row, begin new row 
    echo "$item_width"; 
    echo "\nEnd\n"; // end new row 
    $row_width = 0; 
    if($item < count($items)) echo "Begin\n"; // new row 
    } else if($row_width > $max_width) { 
    echo "\nEnd\nBegin\n"; // end last row, begin new row 
    echo "$item_width"; 
    $row_width = $item_width; 
    } 
} 
echo "\nEnd\n"; // end last row 

?> 
0

這裏是一個替代的PHP代碼...

function arrayMaxWidthString($items, $maxWidth) { 
    $out = array(); 
    if (empty($items)) { 
     return $out; 
    } 

    $row = $maxWidth; 
    $i = 0; 

    $item = array_shift($items); 
    $row -= strlen($item); 
    $out[0] = $item; 

    foreach ($items as $item) { 
     $l = strlen($item); 
     $tmp = ($l + 1); 
     if ($row >= $tmp) { 
      $row -= $tmp; 
      $out[$i] = (($row !== $maxWidth) ? $out[$i] . ' ' : '') . $item; 
     } elseif ($row === $maxWidth) { 
      $out[$i] = $item; 
      ++$i; 
     } else { 
      ++$i; 
      $row = $maxWidth - $l; 
      $out[$i] = $item; 
     } 
    } 
    return $out; 
}