免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: teebye
打印 上一主题 下一主题

算法题哦 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-03-19 09:34 |只看该作者
原帖由 satoru 于 2009-3-19 09:26 发表


对不起
我刚才没有讲清楚
我的理解是:
  如果使用遍历一个长度为 n 的字串中的每一个字符
  并且对其中每个不重复的字符调用一次count,
  那么最坏的情况下(字串中所有字符都是不同的),
  复杂度就 ...

确实是这样,好事直接遍历一次好。

论坛徽章:
0
22 [报告]
发表于 2009-03-19 09:46 |只看该作者
LZ的题目本来是判断有没有满足条件的字符
而不是求出那个字符。
大多数人都看错题了 呵呵

通常对于求出在一个列表中出现次数大于总数一半的元素问题。 是可以用一个与快速排序相类似的算法的。

具体到本题 有一个特点不知道大家注意到没有。
这个列表是字符串而元素是字符~~~~
如果这个字符是ASCII字符的话那么一切就都简单了。 因为ASCII总共才128个。
我们可以建立一个长度为128的数组, 用字符的ASCII作为下标, 数组中的元素是出现的次数。

  1. #include <stdio.h>
  2. int main(){
  3.   int chr_count[128];
  4.   int len;
  5.   char str[] = "hellooooooo";
  6.   char *p = str;
  7.   memset(chr_count, 0, sizeof(chr_count));
  8.   while(*p){
  9.     chr_count[(int)*p]++;
  10.     p++;
  11.   }
  12.   len = p - str;
  13.   p = str;
  14.   while(*p){
  15.     if(chr_count[(int)*p] > (len + 1)/ 2){
  16.       printf("%c\n", *p);
  17.       return 0;
  18.     }
  19.     p++;
  20.   }
  21.   return 0;
  22. }

复制代码

论坛徽章:
0
23 [报告]
发表于 2009-03-19 10:29 |只看该作者
统计一个字符串里面出现次数最多的字符


  1. use List::Util qw(max);

  2. my $str = 'hellooloooooo';
  3. my (%h,%f);

  4. $f{++$h{$_}}=$_ for split //,$str;

  5. print $f{max keys %f};
复制代码

[ 本帖最后由 hitsubunnu 于 2009-3-19 10:31 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2009-03-19 10:56 |只看该作者
原帖由 hitsubunnu 于 2009-3-19 10:29 发表



use List::Util qw(max);

my $str = 'hellooloooooo';
my (%h,%f);

$f{++$h{$_}}=$_ for split //,$str;

print $f{max keys %f};


看不懂perl的,不妨看看ruby怎么实现的


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def count(a)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result =[]

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.uniq.each do|x|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result << [x,a.grep(x).length]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.max { |a, b| a[1]<=>b[1] }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = "aadddeegggggg"
str = s.scan(/w{1}/)
p count(str)

论坛徽章:
0
25 [报告]
发表于 2009-03-19 22:44 |只看该作者
原帖由 DQP 于 2009-3-19 09:01 发表


居然看到了传说中的shhgs。 审题不错,赞一个。
但你的签名实在让人讨厌。



真的不错吗?我觉得他的算法是错误的吧?Please advice..

论坛徽章:
0
26 [报告]
发表于 2009-03-19 23:22 |只看该作者
原帖由 dreamerx2004 于 2009-3-19 22:44 发表



真的不错吗?我觉得他的算法是错误的吧?Please advice..


是哈。 是错的。。。。。。。
我自杀了算了

[ 本帖最后由 DQP 于 2009-3-19 23:23 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2009-03-20 09:13 |只看该作者
人家楼主把题目改了。

论坛徽章:
0
28 [报告]
发表于 2009-03-20 09:17 |只看该作者

回复 #18 DQP 的帖子

正如真理总是赤裸裸的,真相也总是血淋淋的。我之所以不能再用shhgs这个名字,充分验证了我的签名的正确性。

论坛徽章:
0
29 [报告]
发表于 2009-03-20 09:39 |只看该作者
是错了。

如果要遍历就没有意思了。

论坛徽章:
0
30 [报告]
发表于 2009-03-23 12:16 |只看该作者

  1. s=raw_input();
  2. print s[s.index(max([s.count(i) for i in s])];
复制代码

手边没py也许不对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP