30
7

百度的一道试题…

Author Jessica     Category PHP     Tags ,

下面是百度招聘的一道试题,有兴趣的同学可以研究一下,要求用PHP,shell或c完成

输入:N(整数)
输入:数据文件A.txt,不超过6条记录,字符串长度不超过15个字节
文件格式如下:
字符串\t数字\n

说明:
每行为1条记录;字符串中不含有\t。
数字描述的是该字符串的出现概率,小于等于100的整数。
多条记录的出现概率之和为100,如果A.txt不满足该条件,程序则退出;
如果文件格式错误,程序也退出。

要求:
编写一个程序,输入为N(正整数),读入文件A.txt,按照字符串出现概率随机地输出字符串,输出N条记录

例如:
输入文件A.txt
abc20
a30
de50
输入为:10

即 abc有20%的概率输出,a有30%的概率输出,de有50%的概率输出,输出10条记录
以下为一次输出的结果,多次输出的结果可能不相同。
abc
a
de
de
abc
de
a
de
a
de

下面是我的算法..其实说不上算法..还是那个有概率的随机数而已..比较简单..

思路就是把所有的字符串放到一个线段上..后面的数字就是线段的长度..这样组合成一个很长的线段.在从这个线段上随机取出某个地方..就是由概率的随机数了.

算法不难..但是我觉得得判断的地方非常多..所以写程序的时候写了N多的if..真真涉及到算法的语句很少…= =||

不说了.直接贴给大家把..谁有更好的方法欢迎提供..:)

  1. <?php  
  2. class BaiduTest {  
  3.     protected $fileName = "";  
  4.     protected $num;  
  5.     protected $array = array();  
  6.     public function __construct($fileName$num) {  
  7.         if (is_file($fileName)) {  
  8.             $this->fileName = $fileName;  
  9.             $this->num = $num;  
  10.             $this->readFile();  
  11.         } else {  
  12.             $this->throwException('找不到文件');  
  13.         }  
  14.     }  
  15.  
  16.     protected function readFile() {  
  17.         $handle = fopen($this->fileName, "r");  
  18.         if ($handle) {  
  19.             for ($i=1;$i<=6 && !feof($handle);$i++) {  
  20.                 if ($buffer = fgets($handle)) {  
  21.                     if (strlen($buffer) > 15) {  
  22.                         $this->throwException('字符长度超过15个字节');  
  23.                     } else {  
  24.                         list($key$value) = sscanf($buffer"%s\t%d");  
  25.                         if (emptyempty($key) || $value > 100) {  
  26.                             $this->throwException('格式不正确');  
  27.                         }  
  28.                         $array[] = array($key => $value);  
  29.                     }  
  30.                 }  
  31.             }  
  32.             if (!feof($handle) && fgets($handle) && $i>6) {  
  33.                 $this->throwException('文件超过6行');  
  34.             }  
  35.             //重点是这里.组合数组  
  36.             foreach ($array as $v) {  
  37.                 foreach ($v as $k => $v2) {  
  38.                     for ($i=1; $i<=$v2$i++) {  
  39.                         $this->array[] = $k;  
  40.                     }  
  41.                 }  
  42.             }  
  43.             if (count($this->array) != 100) {  
  44.                 $this->throwException('总概率不等于100');  
  45.             }  
  46.             fclose($handle);  
  47.         } else {  
  48.             $this->throwException('无法打开文件');  
  49.         }  
  50.     }  
  51.  
  52.     public function outPut() {  
  53.         //这个地方不能使用array_rand的第二个参数.不然出来的都是连续的  
  54.         while ($this->num--) {  
  55.             echo $this->array[array_rand($this->array)]."\n";  
  56.         }  
  57.     }  
  58.  
  59.     protected function throwException($str) {  
  60.         throw new Exception($str);  
  61.     }  
  62. }  
  63. $bt = new BaiduTest('a.txt', 10);  
  64. $bt->outPut(); 

 还有一个a.txt..我直接打包给大家下载吧..

点我下载

7 Comments to “ 百度的一道试题… ”

  • loki 2009年06月30日 于 06:31

    不错不错,期待楼下更好的方法- -

  • Gabri 2009年06月30日 于 08:14

    代码贴上后换行被去掉了~~~

  • 勤奋的懒汉 2009年07月1日 于 23:59

    先说一下这种算法的问题,题目并没有说每行里的字符串部分都是不相同的,也没有说概率部分不存在小数点,那么这种处理方式就有问题了。

    还有读取文件部分可以考虑用file,因为里面有换行符。

    如果继续用这种算法,感觉循环的太多了,可以考虑或用php数组函数

  • 勤奋的懒汉 2009年07月2日 于 00:01

    另外,array_rand的第二个参数不会引起连续问题,除非你用的Php版本比较老,那样的话,需要初始化随机数种子

  • Jessica 2009年07月2日 于 01:24

    回楼上..不可能出现相同的..出现相同的也没关系..概率相加到一起..数组的个数也想加到一起了..关于小数我确实没考虑到..不过稍微改进下就可以了..几位小数就加几位的数组个数..
    另外..你说的很对..用file很简单..想复杂了..哎..
    还有那个array_rand..你没懂我的意思.我说的不是函数的本身..而是在这里会使结果连续.不信你可以试下..

  • 勤奋的懒汉 2009年07月2日 于 02:13

    http://vipzhicheng.com/node/173

    恩,经过一早上的实践,我承认我没太看仔细,请看看我写的两个算法。其中一个用了和你一样的思路。

    另外,关于连续问题确实存在,我shuffle一下,解决了这个问题。

  • LANYE 2009年08月14日 于 02:00

    俺用3循环。哎!TANK。这题是俺给你的!
    你这个坏蛋!做出来不告诉我!

Post comment

分类目录

最近文章

近期评论

文章归档

标签

.net AJAX button Comet CSS Discuz! DIV+CSS Flash Form Google HTML编辑器 IE8 Java JavaScript jQuery JSP md5 MySQLReback OAuth Oracle PHP php-fpm PNG Punny SkiyoTabs tab TagCloud Vista Web2.0 Windows7 上传 加密 图标 本站原创 模板 模板引擎 源码 登录 短网址 石家庄 算法 编译 面向对象 魔术方法

链接表