给定一个数组,将数组中元素向右移动k个位置,k是非负数。例如:[1,2,3,4,5,6] 和 k=2 。输出:[5,6,1,2,3,4]要求使用空间复杂度O(1)的原地算法。
//***旋转数组*** rorate=>旋转 $arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]; function rorate(array $arr,$k) { $len = count($arr); if($k>=$len){ //$k%$len,那就只需要移动余数次即可 $k = $k % $len; }else{ $tmp = array_slice($arr,-$k); // print_r($arr); // print_r($tmp); //还要把截取的那一段删除 for($i=$len-$k;$i<$len;$i++){ unset($arr[$i]); } //再把截取的数字插入到数组开头 // array_unshift($arr,$tmp);//这样是吧数组插入开头了 for($j=$k-1;$j>=0;--$j){ array_unshift($arr,$tmp[$j]); } print_r($arr); } } rorate($arr,10);
//不知道空间复杂度为1 是什么情况。但是如果说不考虑空间复杂度的话,我想到的方法是:1.从数组末尾截取k个数字,然后插入到开头。
// 2.for循环k次,从末尾弹出一个数字放在开头
原文:https://www.cnblogs.com/bneglect/p/10986845.html