【发布时间】:2015-05-30 08:46:13
【问题描述】:
给定一个电话号码列表,确定它是否一致,即没有一个号码是另一个号码的前缀。假设电话目录列出了这些号码:
紧急 911 爱丽丝 97 625 999 鲍勃 91 12 54 26
在这种情况下,您无法拨打 Bob 的电话,因为一旦您拨打了 Bob 电话号码的前三位,中心就会将您的电话转至紧急电话。所以这个列表是不一致的。
输入
输入的第一行给出一个整数,1≤t≤40,测试用例的数量。每个测试用例都以电话号码 n 开头,单独一行,1≤n≤10000。然后跟随 n 行,每行有一个唯一的电话号码。电话号码是最多十位数字的序列。
输出
对于每个测试用例,如果列表一致则输出“YES”,否则输出“NO”。
该程序应该从标准输入读取,并写入标准输出。我们还可以假设输入将遵守规范。这是我的代码:
<?php
fscanf(STDIN, "%d", $numOfTestCases);
for ($i = 0; $i < $numOfTestCases; $i++) { //Loop for reading test cases
fscanf(STDIN, "%d", $numOfPhoneNumbers);
$phoneNumbers = array();
$isConsistent = true;
for ($j = 0; $j < $numOfPhoneNumbers; $j++) { //Loop for reading phone numbers of each test case
fscanf(STDIN, "%d", $newNumber);
if ($isConsistent != false) { //If list already inconsistent, we dont need to check further input
if (empty($phoneNumbers)) { // If the array of phone numbers is empty, we just add the new one
$phoneNumbers[$j] = $newNumber;
} else {
foreach ($phoneNumbers as $k => $testNumber) { //Loop for checking if new number is consistent or not
$newNumLen = strlen($newNumber);
$testNumlen = strlen($testNumber);
$newBeginning = substr($newNumber, 0, $testNumlen);
$testBeginning = substr($testNumber, 0, $newNumLen);
if ($newNumber == $testBeginning || $testNumber == $newBeginning) {
$isConsistent = false;
break;
}
}
if ($isConsistent == true) $phoneNumbers[$j] = $newNumber;
}
}
}
$newAnswer = ($isConsistent) ? "YES" : "NO";
$ansString = ($i == 0) ? $newAnswer : $ansString."\n".$newAnswer;
}
fwrite(STDOUT, $ansString);
exit(0);
?>
我的问题是有一个测试程序正在运行它,它的超时时间为 4 秒。第二个测试文件总是超时。我无权访问测试程序或文件,但我认为文件很长,甚至可能有 40 个测试用例,每个用例都有 10000 个电话号码。
谁能看到我怎样才能让这段代码运行得更快?
这是一个示例运行:
Sample Input:
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
Sample Output:
NO
YES
【问题讨论】:
-
使用分析器。 xdebug 很棒。你可以看到大部分时间都花在了哪里
-
我会使用完全不同的方法:目前您基本上是将每个数字与其他数字进行比较,这会产生 O(n^2) 的复杂度。相反,您可以使用每个级别的数字构建已知数字的树。当您在树中输入一个新号码并在途中遇到一个已知号码时,请拒绝它。这导致了几乎线性的复杂性。
-
或许慢的部分是慢,阻塞,等待输入,STDIN读取
-
你应该使用树,而不是数组
-
[php] 和 [performance] 从来都不是有效的组合。 ;)
标签: php performance