2017-02-11 69 views
-2

对大小为n的数组执行左旋转操作会将数组元素的每个元素向左移动1个单位。例如,如果在数组[1,2,3,4,5]上执行2个左旋转,则该数组将变为[3,4,1,2,3]。 我正试图找到解决以下问题的最有效方法。第一行包含两个空格分隔的整数,表示n(整数数)和d(您必须执行的左旋转数)的相应值。 第二行包含n个空格分隔的整数,用于描述数组初始状态的各个元素。PHP数组 - 优化

例输入:

5 4 
1 2 3 4 5 

输出示例:

5 1 2 3 4 

在大多数情况下,我下面的代码工作得很好,但在执行时间方面,似乎有一定的提升空间 - 由于Timeout的原因,它目前正在通过非常大的输入文件(见下文)进行一次测试。

我的问题是,可以做些什么来减少下面的一段代码的执行时间?

<?php 

$file = file_get_contents ("php://stdin","r"); 
$file = explode("\n",$file); 

$meta = explode(" ", $file[0]); 
$rotations = $meta[1]; 

$nums = explode(" ", $file[1]); 

while($rotations > 0) { 
    $removed = array_shift($nums); 
    $nums[] = $removed; 
    --$rotations; 
} 

echo implode(" ", $nums); 

?> 

输入文件过大

Input File

+0

其中提出的解决方案是对你比较? – CodeCaster

+0

哪个建议由谁提出?你是指你以前的任何问题吗?你想问我们什么,“为我优化这个代码”? – CodeCaster

+0

@CodeCaster,见编辑。 – AnchovyLegend

回答

1

用户array_slice

array array_slice (array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]]) 

伪代码:

// you are given: $array_size, $rotation, $input_array; 
$rotation = $rotation % array_size; 
$slice_place = $array_size - rotation; 

$answer = [] 
if(rotation>0) { 
    $array1 = array_slice($input_array, $slice_place, $rotation) 
    $array2 = array_slice($input_array, 0, $slice_place) 
    $answer = array_merge($array1, $array2) 
} 
else { 
    $answer = $input_array 
} 
+0

这个测试用例没有回答这个问题,请解释 – AnchovyLegend

+0

@ GeorgeCastan100伪代码以上。 – laser

+0

感谢您的编辑。你能否解释为什么你的代码可能工作,为什么你提出的实现更有效率? – AnchovyLegend