如何获取大小为 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 之间的区别,这样你就不会比需要的移动更多。
我正在努力提高我的编码技能。
所以我加入了 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 之间的区别,这样你就不会比需要的移动更多。