PHP编程竞赛问题:如何读取指定长度数组并实现右旋转
PHP 动态读取不定长输入数组及数组旋转题解
读取不定长数组的核心方法
你当前的问题在于写死了读取5个元素的逻辑,实际可以通过以下方式动态读取长度为N的数组:
- 先用
fgets(STDIN)读取一整行输入内容 - 用
trim()去除行首尾的换行、空格等冗余字符 - 用
explode(' ', $content)按空格分割为字符串数组 - 用
array_map('intval', $arr)将所有元素转为整数类型
对应代码片段:
// 已经通过fscanf拿到$n之后 $arr = array_map('intval', explode(' ', trim(fgets(STDIN))));
完整解题代码优化点
- 题目第一行是测试用例数量
t,需要循环处理每个测试用例 - 旋转步数
k可以先对n取模,避免k远大于n时的无效循环,提升执行效率 - 移除写死的固定长度数组读取逻辑,替换为动态读取
完整代码如下:
<?php // 读取测试用例数 fscanf(STDIN, "%d\n", $t); while ($t--) { // 读取当前用例的n和k fscanf(STDIN, "%d %d\n", $n, $k); // 动态读取长度为n的数组 $arr = array_map('intval', explode(' ', trim(fgets(STDIN)))); // 优化旋转步数,避免无效循环 $k = $k % $n; // 向右旋转k步 for ($i = 0; $i < $k; $i++) { array_unshift($arr, array_pop($arr)); } // 输出结果 echo implode(' ', $arr) . "\n"; } ?>
额外性能优化方案
如果要进一步降低时间复杂度,还可以用数组切片的方式替代循环旋转:
// 替换for循环的旋转逻辑 $arr = array_merge(array_slice($arr, $n - $k), array_slice($arr, 0, $n - $k));
内容的提问来源于stack exchange,提问作者diana
相关产品推荐
相关产品推荐

