【问题标题】:How to take an array of size N?如何获取大小为 N 的数组?
【发布时间】:2021-08-22 03:21:22
【问题描述】:

我正在努力提高我的编码技能。
所以我加入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 的数组?

【问题讨论】:

    标签: php stdin


    【解决方案1】:

    一些想法:

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

    鉴于这种情况,您应该能够通过添加基于从上面派生的$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);
    

    【讨论】:

    • 非常感谢您的朋友。你是第一个解决我问题的人。谢谢!。
    • 现在我知道了,如何使用 PHP 语言进行输入。所以我可以练习更多的问题而不必担心输入。只因你。 !!!
    【解决方案2】:

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

    此外,因为我们要处理多个测试用例,所以我们必须将其包装在一个围绕 $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 之间的区别,这样你就不会超出需要的范围。

    【讨论】:

    • 非常感谢您的朋友。你是第一个为我的问题提供完整解决方案的人。谢谢!。
    • 你能告诉我吗,我已经将@wetmarble 代码包装在 for 循环中,用于$t。但它仍然只适用于一个测试用例。为什么?
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多