【发布时间】:2020-07-30 19:49:54
【问题描述】:
例如,我有一个数组
$a = [1,2,3,4,5];
从这个$a,如何取最后一个并设置它第一个像[5,1,2,3,4]
以及如何将最后两个数组变成[4,5,1,2,3]
【问题讨论】:
例如,我有一个数组
$a = [1,2,3,4,5];
从这个$a,如何取最后一个并设置它第一个像[5,1,2,3,4]
以及如何将最后两个数组变成[4,5,1,2,3]
【问题讨论】:
您可以结合使用array_pop(),将数组的最后一个元素弹出,并使用array_unshift() 将其推到数组的前面。您可以为此创建一个简单的函数,
function array_pop_unshift($array) {
array_unshift($array, array_pop($array));
return $array;
}
然后将其用作
$a = [1,2,3,4,5];
$new = array_pop_unshift($a);
print_r($new); // [5,1,2,3,4]
要继续移动它,只需再次调用该函数直到完成,例如通过for 循环,
$a = [1,2,3,4,5];
for ($i = 0; $i < 2; $i++) {
$new = array_pop_unshift($a);
}
print_r($new); // [4,5,1,2,3]
【讨论】:
如果你想避免几个array_unshift 和array_pop 的开销,你可以构建一个使用数组内部指针的生成器。
如果确实需要结果数组,请使用iterator_to_array() 创建它:
$a = range(1,5);
function rotate(&$array, $step = 1) {
$length = count($array);
end($array);
while ($step--)
prev($array);
while ($length--) {
next($array);
if (key($array) === null)
reset($array);
yield current($array);
}
}
print_r(iterator_to_array(rotate($a, 2))); // [4,5,1,2,3]
请注意,rotate() 生成器使用引用来避免数组复制,但不会修改原始数组:它仅将数组指针从所选位置移动 n 次(其中 n 是数组长度)。当数组指针不在数组中时(key() 返回null),数组指针被重置。换句话说,即使有一个大数组和许多旋转(我在代码中称为“步骤”),它也能保持高效。
【讨论】:
to take last one and set it first 这称为右旋。
并且
$k 是移位的单位数。 $a 是数组。
for($x=0; $x < $k; $x++){
//remove last element
$last = array_pop($a);
//push last element to the beginning
array_unshift($a, $last);
}
array_pop() 弹出并返回数组最后一个元素的值,将数组缩短一个元素。
https://www.php.net/manual/en/function.array-pop.php
array_unshift() 将传递的元素添加到数组的前面
https://www.php.net/manual/en/function.array-unshift.php
您可以创建一个函数,它接受两个参数$k(旋转次数)、$a(数组),并在执行右旋转$k 次后返回数组。
function rotateRight($a, $k){
for($x=0; $x < $k; $x++){
//remove last element
$last = array_pop($a);
//push last element to the beginning
array_unshift($a, $last);
}
return $a;
}
然后相应地调用它。
示例:
$a = [1,2,3,4,5];
$a_one_shift = rotateRight($a, 1);
// [5,1,2,3,4];
$a_two_shift = rotateRight($a_one_shift, 1);
// [4,5,1,2,3];
或者你也可以通过 2 直接得到右转两次后的数组。
$a_new = rotateRight($a, 2);
// [4,5,1,2,3];
【讨论】:
您实际上是在向右旋转,而不是向左旋转。无论如何,这里有两个功能。它们可能不是最有效的,但它们的代码很短且不言自明:
<?php
function rotateLeft($array, $times) {
for($i=0; $i<$times; $i++){
$array[] = array_shift($array);
}
return $array;
}
function rotateRight($array, $times) {
for($i=0; $i<$times; $i++){
array_unshift($array, array_pop($array));
}
return $array;
}
$a = [1,2,3,4,5];
$a = rotateRight($a, 1);
print_r($a);
?>
【讨论】:
//$A输入数组,$K旋转次数
function solution($A, $K) {
$new = array();
for($j=1;$j<=$K;$j++)
{
if(count($new)>0)
$A = $new;
for($i=0;$i<count($A);$i++)
{
if($i==0)
$new[$i] = $A[count($A)-1];
else
$new[$i] = $A[$i-1];
}
}
return $new;}
【讨论】: