假设我有一个数字,让我们说5.现在让我们假设有5个成员。现在每个成员开始计数1到2.那些获得第二个号码的成员离开然后再次计数从下一个成员开始。所以最后在这种情况下,第三个成员停留在最后。
所以我试着像这样实现。首先将成员分配为数组$ v。
for($i=1 ; $i<=5 ; $i++)
{
$v[] = $i;
}
$v1 = array_flip($v);
for($i=0 ; $i<=5 ; $i += 2 )
{
unset($v1[$i]);
}
echo "<pre>";
print_r($v1);
输出
Array
(
[1] => 0
[3] => 2
[5] => 4
)
现在我想计算从键5(第5个成员)再到1个(第1个成员)的数字,依此类推。
所以最后一个键3(第3个成员)离开。
我想打印剩下的最后一个成员。
我怎样才能实现这个目标?
我无法理解然后看看这个 Survival Strategy
答案 0 :(得分:1)
这将删除数组中的所有其他项,直到只剩下一个项目为止。
$members = range(1, 5);
$i = 0;
while(count($members) > 1) {
$i++;
if($i == count($members)) $i = 0;
unset($members[$i]);
$members = array_values($members);
if($i == count($members)) $i = 0;
}
echo $members[0];
答案 1 :(得分:1)
这是一个面向对象的解决方案,具有易于遵循的简化方法和多个示例。
class CountByTwoArrayReducer {
public function __construct($array) {
$this->array = $array;
$this->size = count($array);
}
public function reduce() {
$this->initialize();
while($this->hasMultipleItems()) {
$this->next();
$this->removeCurrentItem();
$this->next();
}
return $this->finalItem();
}
protected function initialize() {
$this->current = 1;
$this->removed = array();
$this->remaining = $this->size;
}
protected function hasMultipleItems() {
return ($this->remaining > 1);
}
protected function next($start = null) {
$next = ($start === null) ? $this->current : $start;
do {
$next++;
} while(isset($this->removed[$next]));
if($next > $this->size)
$this->next(0);
else
$this->current = $next;
}
protected function removeCurrentItem() {
$this->removed[$this->current] = 1;
$this->remaining--;
}
protected function finalItem() {
return $this->array[$this->current - 1];
}
}
$examples = array(
array('A', 'B', 'C', 'D', 'E'),
range(1, 100),
range(1, 1000),
range(1, 10000)
);
foreach($examples as $example) {
$start = microtime(true);
$reducer = new CountByTwoArrayReducer($example);
$result = $reducer->reduce();
$time = microtime(true) - $start;
echo "Found {$result} in {$time} seconds.\n";
}
答案 2 :(得分:0)
嗯,我可以推荐两个功能:
http://php.net/manual/en/function.array-keys.php
这将重新索引您的数组,索引为:0,1,2
http://php.net/manual/en/control-structures.foreach.php
有了这个,您可以通过以下方式浏览任何数组:
foreach($ v1 as $ key =&gt; $ value){...选择最大值等...}
答案 3 :(得分:0)
<?php
function build_thieves($thieves)
{
return range(1, $thieves);
}
function kill_thief(&$cave)
{
if(sizeof($cave)==1)
{
$thief=array_slice($cave, 0, 1);
echo $thief.' survived';
return false;
}
$thief=array_slice($cave, 0, 1);
array_push($cave, $thief);
$thief=array_slice($cave, 0, 1);
echo $thief.' killed';
return true;
}
$cave=build_thieves(5);
$got_data=true;
while($got_data)
{
$got_data=kill_thief($cave);
}
调整到每2,而不是每3。从1开始不是0
答案 4 :(得分:0)
这个答案有点复杂,但效率更高。它不会创建项目数组,然后将其删除。它以一个值(例如1)开始,并计算尚未被删除的下一个项目。然后,它将其标记为已删除。如果您实际拥有一系列项目,则最终项目的索引将为$ current - 1.以下示例使用值1到10,000。在我的机器上,它只需要0.05秒。
define('SIZE', 10000);
/**
* Helper function to return the next value
*/
function get_next($current, &$removed) {
$next = $current;
do {
$next++;
} while(isset($removed[$next]));
return ($next > SIZE) ? get_next(0, $removed) : $next;
}
$current = 1;
$removed = array();
$remaining = SIZE;
$start_time = microtime(true);
while($remaining > 1) {
$current = get_next($current, $removed);
$removed[$current] = 1;
$remaining = SIZE - count($removed);
$current = get_next($current, $removed);
}
$total_time = microtime(true) - $start_time;
echo "Processed " . SIZE . " items\n";
echo "Winning item: {$current}\n";
echo "Total time: {$total_time} seconds\n";