假設我有一些序列號爲1-n的物件,需要按行顯示。每行是m個單位寬。我需要一些僞代碼來輸出行,對我來說,這樣就可以保持m-width的限制。這不是一個揹包問題,因爲這些項目必須保持序列號順序 - 行末處的空白空間沒有問題。用於貨架堆棧的僞代碼
我一直在追我的尾巴了這一點,部分原因是因爲我需要在這兩個PHP和jQuery/JavaScript的,因此對於僞代碼的請求....
假設我有一些序列號爲1-n的物件,需要按行顯示。每行是m個單位寬。我需要一些僞代碼來輸出行,對我來說,這樣就可以保持m-width的限制。這不是一個揹包問題,因爲這些項目必須保持序列號順序 - 行末處的空白空間沒有問題。用於貨架堆棧的僞代碼
我一直在追我的尾巴了這一點,部分原因是因爲我需要在這兩個PHP和jQuery/JavaScript的,因此對於僞代碼的請求....
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);
}
運行時間爲Θ(件數)
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++;
}
對於它的價值,我覺得我有什麼,我一直在尋找,爲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
?>
這裏是一個替代的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;
}
啊哈 - 比我自己的回覆更清潔的解決方案!這就是我正在尋找的東西...謝謝... – Dycey 2009-08-03 16:07:23