【问题标题】:Right rotation on array in phpphp中数组的右旋转
【发布时间】:2020-07-30 19:49:54
【问题描述】:

例如,我有一个数组

$a = [1,2,3,4,5]; 

从这个$a,如何取最后一个并设置它第一个像[5,1,2,3,4] 以及如何将最后两个数组变成[4,5,1,2,3]

【问题讨论】:

标签: php arrays


【解决方案1】:

您可以结合使用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]

【讨论】:

    【解决方案2】:

    如果你想避免几个array_unshiftarray_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]
    

    demo

    请注意,rotate() 生成器使用引用来避免数组复制,但不会修改原始数组:它仅将数组指针从所选位置移动 n 次(其中 n 是数组长度)。当数组指针不在数组中时(key() 返回null),数组指针被重置。换句话说,即使有一个大数组和许多旋转(我在代码中称为“步骤”),它也能保持高效。

    【讨论】:

      【解决方案3】:

      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];
      

      【讨论】:

        【解决方案4】:

        您实际上是在向右旋转,而不是向左旋转。无论如何,这里有两个功能。它们可能不是最有效的,但它们的代码很短且不言自明:

        <?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);
        ?>
        

        【讨论】:

          【解决方案5】:

          //$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;}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-01
            • 2021-12-03
            • 2021-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多