【问题标题】:Dictionaries and Maps in PHPPHP 中的字典和地图
【发布时间】:2017-04-04 06:53:16
【问题描述】:

这个问题是在解决 Hackerrank 中的一个问题时产生的。问题陈述是here。我们可以使用 Java(使用 Map 和 HashMap)或 Python 来解决这个问题。但是,当我尝试在 PHP 中解决问题时,我遇到了终止错误。这是因为代码执行时间过长。对于较小的文件大小,代码可以正常工作,但对于较大的文件,它会出错(由于超时而终止)。映射是如何在 PHP 中完成的?代码错了吗?有没有更好的方法来优化或让代码正常工作?

示例代码如下

<?php
$myFile = 'text1.txt'; 
$lines = file($myFile); //file as array
$n = (int)$lines[0];
$array = array();
$check = array();

foreach ($lines as $line)
{
    list($key, $value) = explode(' ', $line);
    if ($value !== NULL)
    {
        $array[$key] = $value;
    }
    else {
          $check[]=trim($line);
    }
}
$len=sizeof($check);

for($i=1;$i<$len;$i++) {
$flag=0;
    foreach ($array as $key => $value){
        if($key===$check[$i]) {
            $flag=1;
            echo $key.'='.$value.'<br />';
            break;
        }
    }
    if($flag===0)
    echo 'Not found <br />';
    $flag=0;
}

?>

文件的示例输入

档案一Download text1.txt file here
档案二Download text.text file here

注意:text1.txt 文件正在运行,问题出在 text.txt 文件(更大的文件)。

【问题讨论】:

  • 它将爆炸值 sam 99912222,sam 作为键,电话号码作为值。这工作正常

标签: php arrays dictionary


【解决方案1】:

对于任何想知道问题是什么的人:

你有这样的输入:

1
taha 1234567
paksu
sam
taha

并且询问者希望您用 n(第一个整数)记录填充您的电话列表,然后从输入中检查给定的键。查询计数是可变的。提问者要你写

name=number 

如果记录存在,或者

Not found

如果没有。


检查此代码:

<?php
$_fp = fopen("php://stdin", "r");
$n = intval(fgets(STDIN));
$dict = [];
for($i=0;$i<$n;$i++){
    $vars = explode(" ", fgets(STDIN));
    $dict[trim($vars[0])] = trim($vars[1]);
}
while(!feof(STDIN)){
    $str = trim(fgets(STDIN));
    if(isset($dict[$str])){
        echo $str . "=" . $dict[$str]."\n";
    }else{
        echo "Not found\n";
    }
}

?>

它通过了所有测试。这与 PHP 无关,而与您编写算法的方式有关。

【讨论】:

    【解决方案2】:
    <?php
    $_fp = fopen("php://stdin", "r");
    $n = intval(trim(fgets(STDIN)));
    $phoneBook = [];
    for ($i=0; $i<$n; $i++){
        $lines = trim(fgets(STDIN));
        $arr = explode(" ", $lines);
        $phoneBook[$arr[0]] = $arr[1] ;
    }
    $query=trim(fgets(STDIN));
    do{
    if(array_key_exists($query,$phoneBook)){
        echo $query,"=",$phoneBook[$query],"\n";
    }
    else{
        echo "Not found\n";
    }
    }while($query=trim(fgets(STDIN)));
    ?>
    

    这是我的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2015-08-21
      • 2023-03-30
      • 2014-10-10
      相关资源
      最近更新 更多