百度的一道试题…
下面是百度招聘的一道试题,有兴趣的同学可以研究一下,要求用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..真真涉及到算法的语句很少…= =||
不说了.直接贴给大家把..谁有更好的方法欢迎提供..:)
- <?php
- class BaiduTest {
- protected $fileName = "";
- protected $num;
- protected $array = array();
- public function __construct($fileName, $num) {
- if (is_file($fileName)) {
- $this->fileName = $fileName;
- $this->num = $num;
- $this->readFile();
- } else {
- $this->throwException('找不到文件');
- }
- }
- protected function readFile() {
- $handle = fopen($this->fileName, "r");
- if ($handle) {
- for ($i=1;$i<=6 && !feof($handle);$i++) {
- if ($buffer = fgets($handle)) {
- if (strlen($buffer) > 15) {
- $this->throwException('字符长度超过15个字节');
- } else {
- list($key, $value) = sscanf($buffer, "%s\t%d");
- if (emptyempty($key) || $value > 100) {
- $this->throwException('格式不正确');
- }
- $array[] = array($key => $value);
- }
- }
- }
- if (!feof($handle) && fgets($handle) && $i>6) {
- $this->throwException('文件超过6行');
- }
- //重点是这里.组合数组
- foreach ($array as $v) {
- foreach ($v as $k => $v2) {
- for ($i=1; $i<=$v2; $i++) {
- $this->array[] = $k;
- }
- }
- }
- if (count($this->array) != 100) {
- $this->throwException('总概率不等于100');
- }
- fclose($handle);
- } else {
- $this->throwException('无法打开文件');
- }
- }
- public function outPut() {
- //这个地方不能使用array_rand的第二个参数.不然出来的都是连续的
- while ($this->num--) {
- echo $this->array[array_rand($this->array)]."\n";
- }
- }
- protected function throwException($str) {
- throw new Exception($str);
- }
- }
- $bt = new BaiduTest('a.txt', 10);
- $bt->outPut();
还有一个a.txt..我直接打包给大家下载吧..
7 Comments to “ 百度的一道试题… ”
Post comment
分类目录
- ActionScript (2)
- CSS (25)
- Java (3)
- JavaScript (41)
- PHP (108)
- 心情杂谈 (34)
- 收集整理 (77)
- 本站原创 (57)
最近文章
- 在sae中利用SaeFetchurl进行豆瓣的OAuth授权
- OAuth 1.0a与1.0协议的改进…
- 深入理解OAuth与豆瓣OAuth test
- include_path+__autoload与数组+__autoload的比较
- 将google ssl设置为IE8的默认搜索引擎..
- 我们来做一个会呼吸的菜单吧!!
- 在编译php-fpm0.6的时候需要注意的一些问题
- 使用PHP将大文件导入到数据库中..
- 关于用PHP调用WebService中参数为complexType的问题
- 神奇的两次按位非运算符
- 百路推免费短网址服务..首创”收藏夹获取短网址”..
- 哥学社正式上线..
- jQuery中getJSON跨域原理详解
- Web辅助工具条(原名:河蟹工具条CrabBar)0.1发布
- 腾讯微博PC端发图教程
近期评论
- 老飞的小窝 在 jQuery中getJSON跨域原理详解 上的评论
- Jackie.Hamos 在 将google ssl设置为IE8的默认搜索引擎.. 上的评论
- Elmer Zhang 在 在sae中利用SaeFetchurl进行豆瓣的OAuth授权 上的评论
- 茶叶蛋 在 一个PHP+AJAX留言板的完整例子.非常简单! 上的评论
- 9527 在 我们为什么要抛弃模板引擎?? 上的评论
- hikurasai 在 Flash TagCloud中文版. 上的评论
- lx 在 PHP上传进度条深度解析 上的评论
- lx 在 使用PHP将大文件导入到数据库中.. 上的评论
- nflauthentic 在 哥学社正式上线.. 上的评论
- uggsale 在 有三个主题的CSS导航菜单 上的评论
文章归档
- 2010 年八月 (4)
- 2010 年七月 (3)
- 2010 年六月 (4)
- 2010 年五月 (2)
- 2010 年四月 (9)
- 2010 年三月 (12)
- 2010 年二月 (1)
- 2010 年一月 (3)
- 2009 年十二月 (2)
- 2009 年十一月 (3)
- 2009 年十月 (3)
- 2009 年九月 (5)
- 2009 年八月 (4)
- 2009 年七月 (6)
- 2009 年六月 (8)
- 2009 年五月 (8)
- 2009 年四月 (16)
- 2009 年三月 (19)
- 2009 年二月 (22)
- 2009 年一月 (20)
- 2008 年十二月 (38)
- 2008 年十一月 (22)
- 2008 年十月 (7)
- 2008 年九月 (3)
- 2008 年八月 (24)
标签
.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
上传
加密
图标
本站原创
模板
模板引擎
源码
登录
短网址
石家庄
算法
类
编译
面向对象
魔术方法

Jessica

不错不错,期待楼下更好的方法- -
代码贴上后换行被去掉了~~~
先说一下这种算法的问题,题目并没有说每行里的字符串部分都是不相同的,也没有说概率部分不存在小数点,那么这种处理方式就有问题了。
还有读取文件部分可以考虑用file,因为里面有换行符。
如果继续用这种算法,感觉循环的太多了,可以考虑或用php数组函数
另外,array_rand的第二个参数不会引起连续问题,除非你用的Php版本比较老,那样的话,需要初始化随机数种子
回楼上..不可能出现相同的..出现相同的也没关系..概率相加到一起..数组的个数也想加到一起了..关于小数我确实没考虑到..不过稍微改进下就可以了..几位小数就加几位的数组个数..
另外..你说的很对..用file很简单..想复杂了..哎..
还有那个array_rand..你没懂我的意思.我说的不是函数的本身..而是在这里会使结果连续.不信你可以试下..
http://vipzhicheng.com/node/173
恩,经过一早上的实践,我承认我没太看仔细,请看看我写的两个算法。其中一个用了和你一样的思路。
另外,关于连续问题确实存在,我shuffle一下,解决了这个问题。
俺用3循环。哎!TANK。这题是俺给你的!
你这个坏蛋!做出来不告诉我!