如何获取大小为 N 的数组?

How to take an array of size N?

我正在努力提高我的编码技能。
所以我加入了 hackerearth 来解决 PHP 语言的编码问题,因为我知道 PHP.
但是在第一个问题上我卡住了,因为我不知道如何将输入作为大小为 N 的数组。

下面给出了我卡住的问题-
编码挑战 -
Monk 喜欢对数组进行不同的操作,因此作为 Hackerearth School 的校长,他将一项任务分配给了他的新学生 Mishki。 Mishki 将获得一个大小为 N 的整数数组 A 和一个整数 K ,她需要在其中将数组按正确的方向旋转 K 步,然后打印结果数组。由于她是新来的学校,请帮助她完成任务。


我尝试解决的问题-
由于这个问题需要 3 个输入 - 首先是测试用例的数量(T)。
其次是数组的大小(N)和旋转次数(K)。
大小为 N.
的第三个数组 这样我就顺利通过了第一个测试用例(下面给出代码)-

fscanf(STDIN, "%s\n", $t);
fscanf(STDIN, "%s %s\n", $n, $k);
//taking 5 numbers seperated by space.
fscanf(STDIN, "%d %d %d %d %d\n", $item1,$item2,$item3,$item4,$item5);

$arr = [$item1,$item2,$item3,$item4,$item5];
for($i = 0; $i<$k; $i++){
    array_unshift($arr, array_pop($arr));
}
echo implode(' ', $arr);

Input for above code -  
1  
5 2  
1 2 3 4 5  

Output -  
4 5 1 2 3   

我的解决方案有什么问题--
如果用户给出 N= 6(5 除外),则代码将不起作用。因为数组的大小取决于 N.

请帮助我如何给出大小为 N 的数组?

一些想法:

首先,fscanf将return一个数组,如果你只传递流和格式,你不需要分配变量然后构造自己的数组。

鉴于这种情况,您应该能够通过添加基于从上面派生的 $n 的元素为 fscan 生成格式字符串来完成分配,所以这样应该可以工作:

fscanf(STDIN, "%s\n", $t);
fscanf(STDIN, "%s %s\n", $n, $k);

//taking $n numbers separated by space.
for( $i = 0; $i < $n, $i++ ){
    $inputFormat[] = "%d";
}
$format = implode( ' ', $inputFormat ) . "\n";
$arr = fscanf(STDIN, format);

for($i = 0; $i<$k; $i++){
    array_unshift($arr, array_pop($arr));
}
echo implode(' ', $arr);

正如另一个答案所说,如果您只传递流和格式,fscanf 将 return 一个数组。

此外,因为我们要处理多个测试用例,所以我们必须将其包装在 $t 周围的 for 循环中。

完成此操作后,我们使用 str_repeat 构建我们的 fscanf 字符串,并将其结果直接分配给 $arr。在此之后,我们可以使用您的其余代码。一个重要的添加是在末尾添加 "\n" 字符。

fscanf(STDIN, "%s\n", $t);
for($x = 0; $x < $t; $x++){
    fscanf(STDIN, "%s %s\n", $n, $k);

    //taking 5 numbers seperated by space.
    $arr = fscanf(STDIN, str_repeat("%d ", $n) . "\n\n");

    for($i = 0; $i<$k; $i++){
        array_unshift($arr, array_pop($arr));
    }

    echo implode(' ', $arr);
    echo "\n";
}

然而,虽然这对前 3 个测试用例有效,但它会超过最后 2 个测试用例的时间限制。因此您需要找到更好的算法来移动位置。也许看看 n 和 k 之间的区别,这样你就不会比需要的移动更多。