面试街挑战中存在问题。也许是所有挑战中最容易的。"不友好的数字",是这样的名称和问题。
有一个友好号码和 N 个不友好号码。我们想找出有多少个数字可以精确地除以友好数字,但不划分任何不友好的数字。
输入格式:输入的第一行包含两个数字 N 和 K,用空格分隔。N 是不友好数字的数量,K 是友好数字。输入的第二行包含 N 个空格分隔的不友好数字。
输出格式:在一行中输出答案。
我做了一个这样的PHP编程:
<?php
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
$handle = fopen ("php://stdin","r");
$input = fgets($handle);
$num_unfriendly_number=substr($input,0,1);
$friendly_number=substr($input,2,1);
$input2=fgets($handle);
for($i=0;$i<=($num_unfriendly_number); $i=$i+2){
$unfriendly_numbers[$i]=substr($input2,$i,1);
}
//truncates additional input
//now getting divisiors of given friendly numbers
$check_num=1;
//one is always a divisor of any number
$divisior[0]=1;
$arrayindex=1;
for($check_num; $check_num<=$friendly_number; $check_num++){
$hold_var=$friendly_number%$check_num;
if($hold_var==0){
$divisor[$arrayindex]=$check_num;
$arrayindex++;
}
}
$index=0;
foreach($divisor as $test_div){
$output=true;
foreach($unfriendly_numbers as $test_unfrnd){
if($test_unfrnd%$test_div){
$output=false;
}
}
if ($output){
$outputarray[$index]=$test_div;
$index++; //edited afterwards after @Boris's suggestion but didn't work :(
}
}
$num_of_output=count($outputarray);
define('STDOUT',fopen("php://stout","r"));
fwrite(STDOUT,$num_of_output);
?>
上述程序适用于 2 个测试用例,但不适用于其他测试。我做了一些研究,但没有发现任何错误。请帮忙。提前谢谢。
首先我想提一下,我不懂php。但是,我认为这很简单,我可以尝试提供帮助。
我看到的几个错误:
for($i=0;$i<=($num_unfriendly_number); $i=$i+2){
$unfriendly_numbers[$i]=substr($input2,$i,1);
}
在这里你使用substr($input2,$i,1);
,但是假设你所有不友好的数字都是数字,这可能并不总是如此。最好在 php 中使用拆分函数。将整个 while 替换为以下内容:
$unfriendly_numbers = explode(" ", $input2);
然后:
$index=0;
foreach($divisor as $test_div){
$output=true;
foreach($unfriendly_numbers as $test_unfrnd){
if($test_unfrnd%$test_div){
$output=false;
}
}
if ($output){
$outputarray[$index]=$test_div;
}
}
在这里,您永远不会增加$index
变量。这不是意味着您将一个接一个地覆盖除数吗?使用运营商[]=
。它附加到 php 中的数组:
if ($output){
$outputarray []= $test_div;
}
编辑 我看到的另一个错误是,您也指望友好号码是一个数字。您也可以解决此问题:
$friendly_number=substr($input,2,1);
->
$friendly_number=explode(" ", $input)[0];
我有同样的问题,我不明白为什么这段代码不能在不到 16 秒的时间内完成!我想听听你的把戏
a = raw_input()
# 这将读取此行:8 16 b = raw_input()
# 这将读取此行:2 5 7 4 3 8 3 18
al = a.split()
bl = b.split()
blint = []
fn = int(al[1])
fnlist = [fn]
half_fn = fn / 2
#只有我去一半的数字以节省一些时间
k = 1
while k <= half_fn:
if fn % k == 0:
fnlist.append(k)
k += 1
plist = []
for j in bl:
blint.append(int(j)) # here I changed the bl list elements which are string to int
for i in fnlist:
for j in blint: #I have the int elements so I don't need every time bring the string and change it to int
if j % i == 0:
plist.append(i)
break
counter = len(fnlist) - len(plist)
print counter