软件工程课堂练习找水王s
Posted _Just
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程课堂练习找水王s相关的知识,希望对你有一定的参考价值。
题目:发现,“超级水王”没有了。统-计结-果表-明,有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4。你能从 ID列表中快速找出他们的ID吗?
思路:关联型容器可以很方便解决,php里的array就是关联型数组,php有很多方便的排序函数,所以本次用php实现。
首先对id列表进行遍历,以id为键值对数组$result进行赋值,
如果$result[$id]没有初始化,那么这就是第一次出现,即$result[$id]=1
如果$result[$id]已经初始化,那个发帖数加1,即$result[$id]++
最后最$result数组的值降序排序,取出前三个元素就是三个小水王。
先开始用的sort,未发觉键名都改了,然后看了一下手册:
Note: 此函数为
array
中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。
此处介绍一下php的排序函数:
sort() 函数用于对数组单元从低到高进行排序。
rsort() 函数用于对数组单元从高到低进行排序。
asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
ksort() 函数用于对数组单元按照键名从低到高进行排序。
krsort() 函数用于对数组单元按照键名从高到低进行排序。
1 <?php 2 $idlist = array(1,1,2,2,3,3,4); //id 列表 3 4 function validate($list) 5 { 6 $result=array(); 7 foreach ($list as $v) 8 { 9 if(!isset($result[$v])) //第一次出现 ,赋初始发帖数为1 10 { 11 $result[$v] = 1; 12 }else //再次出现 ,发帖数+1 13 { 14 $result[$v]++; 15 } 16 } 17 if(arsort($result)) //对每个id按发帖数降序排列 18 { 19 reset($result); 20 next($result); 21 next($result); 22 if(current($result) < (count($list)/4)) //确认三个小水王的发帖数都大于总帖数的1/4 23 { 24 die(‘ID list 非法!‘); 25 } 26 } 27 reset($result); 28 echo key($result) . ‘<br >‘; 29 next($result); 30 echo key($result) . ‘<br >‘; 31 next($result); 32 echo key($result) . ‘<br >‘; 33 } 34 35 validate($idlist); 36 37 ?>
第一次插入新键时时间复杂度是O(n)
查找时时间复杂度是O(1)
排序用的是快排 O(nlogn)~(n^s) 1<s<2
时间上应该慢一些
以上是关于软件工程课堂练习找水王s的主要内容,如果未能解决你的问题,请参考以下文章