2
\$\begingroup\$

Problem statement

A zero-indexed array A consisting of N integers is given. Rotation of the array means that each element is shifted right by one index, and the last element of the array is also moved to the first place.

For example, the rotation of array A = [3, 8, 9, 7, 6] is [6, 3, 8, 9, 7]. The goal is to rotate array A K times; that is, each element of A will be shifted to the right by K indexes.

My Solution

function solution($A, $K) {
 // when array is empty or has only one element 
 if(count($A) == 0 || count($A) == 1){
 return $A;
 }
 //runs k times
 for($j=1; $j<=$K; $j++){
 $last_element = $A[count($A)-1];
 //runs for each element
 for($i=(count($A)-1); $i>0; $i--){
 $A[$i] = $A[$i-1];
 }
 $A[0] = $last_element; 
 }
 return $A;
}
$A = [1, 2, 3, 4];
$K = 4;
$result = solution($A, $K);
print_r($result);

Output

Array
(
 [0] => 1
 [1] => 2
 [2] => 3
 [3] => 4
)
200_success
145k22 gold badges190 silver badges478 bronze badges
asked Mar 16, 2018 at 7:48
\$\endgroup\$
2
  • \$\begingroup\$ How about rotating the 4-element A array K=4 million times...? \$\endgroup\$ Commented Mar 16, 2018 at 8:07
  • \$\begingroup\$ Welcome de CodeReview.SE! Please add a link to the original problem in your question. \$\endgroup\$ Commented Mar 16, 2018 at 16:54

3 Answers 3

3
\$\begingroup\$

You could use array functions. They simplify and speed up the handling of arrays. See: http://php.net/manual/en/ref.array.php

So your code could become:

function rotateArray($inputArray,$rightShiftCount)
// shift all elements of the array to the right a number of times
{
 // extract the part of the array to move to the front
 $partToMove = array_splice($inputArray,-($rightShiftCount % count($inputArray)));
 // return extract part followed by what was left of the array
 return array_merge($partToMove,$inputArray);
}

This function does not check its arguments, if needed you can add that.

Notice that I have used sensible names for my variables instead of $A and $K. This is intentional.

answered Mar 17, 2018 at 16:23
\$\endgroup\$
2
\$\begingroup\$
  1. solution may be an acceptable function name in a one-off coding challenge, but in a real application try to give your functions an intuitive name that describes its functionality.
  2. Use type declarations with your input parameters and return values to enforce stable coding practices in your application.
  3. Perform as many early returns as possible to reduce time complexity and improve efficiency.
  4. An array with a size of zero or one cannot possibly be rotated, so return early.
  5. If the number of popShifts required has a remainder of zero after dividing it by the array size, then return early because whether you call the rotating functions or not, the output will be identical to the input.
  6. Avoid declaring single-use variables.
  7. Cut off the appropriate number of elements from the back of the array and prepend them to what is left.

Code: (Demo)

function popUnshift(array $indexedArray, int $popShiftsCount): array
{
 $count = count($indexedArray);
 if ($count < 2) {
 return $indexedArray;
 }
 $remainder = $popShiftsCount % $count;
 if (!$remainder) {
 return $indexedArray;
 }
 return array_merge(
 array_splice($indexedArray, -$remainder),
 $indexedArray
 );
}
Toby Speight
87.1k14 gold badges104 silver badges322 bronze badges
answered Jun 17, 2022 at 13:57
\$\endgroup\$
1
\$\begingroup\$

Actually, you don't need to rotate the initial array K times:

<?php
function solution($A, $K)
{
 // when array is empty or has only one element 
 if (count($A) == 0 || count($A) == 1) {
 return $A;
 }
 // The number of rotations needed
 $rotateTimes = $K % count($A);
 //runs `$rotateTimes` times
 for ($j = 1; $j <= $rotateTimes; $j++) {
 $last_element = $A[count($A) - 1];
 //runs for each element
 for ($i = (count($A) - 1); $i > 0; $i--) {
 $A[$i] = $A[$i - 1];
 }
 $A[0] = $last_element;
 }
 return $A;
}
answered Mar 17, 2018 at 12:59
\$\endgroup\$
1
  • 1
    \$\begingroup\$ This review is rather "light" on the "review" part. \$\endgroup\$ Commented Jun 14, 2022 at 22:13

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.