免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3882 | 回复: 5
打印 上一主题 下一主题

求数组重复数字最少的元素 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-11 00:06 |只看该作者 |倒序浏览
@r=( 353475 328937 354173 328937, 353475 404177 354173 404177, 166362 404178 009345 142784);

怎么才能得到此数组里面数字重复最少的元素??
第一个元素和第二个元素数字是有重复的,第三个是没有重复的,怎么判断得到第三个没有重复的数字?

那位能赐教下呢

论坛徽章:
0
2 [报告]
发表于 2015-04-11 01:24 |只看该作者
#!/usr/bin/perl -w

use strict ;

my @r= ([ '353475 328937 354173 328937', '353475 404177 354173 404177', '166362 404178 009345 142784']);

my %re_hash ;

for my $i ( 0 .. $#r ) {
    for my $j ( 0 .. $#{$r[$i]} ) {
        my @tmp_list = split / /,$r[$i][$j] ;
        my $i = 1 ;
        my %tmp_hash ;
        $re_hash{$j} = 0 ;
        foreach my $val (@tmp_list) {
            if( !defined($tmp_hash{$val}) ) {
                $tmp_hash{$val} = '1' ;
            }
            else{
                $re_hash{$j} = ++$i ;
            }
        }
    }   
}

print "元素 -- 重复次数\n" ;
#hash的key为元素号(0开始),值为重复次数,下面是按照重复次数排序
foreach my $key ( sort { $re_hash{$a} <=> $re_hash{$b} } keys %re_hash ) {
    print " $key   --  $re_hash{$key}\n" ;
}


##### 半夜有点不清醒,不知道有没有问题

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2015-04-12 02:10 |只看该作者
no dup
  1. #!/usr/bin/perl

  2. use 5.016;

  3. my @r = (
  4.     '353475 328937 354173 328937',
  5.     '353475 404177 354173 404177',
  6.     '166362 404178 009345 142784',
  7.     '166362 404177 009341 142781'
  8. );

  9. sub nodup {
  10.     my %dup;
  11.     $dup{$_}++ and return for split;
  12.     return 1;
  13. }

  14. my @nodup = grep nodup, @r;
  15. say for @nodup;


  16. __DATA__
复制代码
min dup
  1. #!/usr/bin/perl

  2. use 5.016;
  3. my @r = (
  4.     '353475 328937 354173 328937',
  5.     '353475 404177 354173 404177',
  6.     '166362 404178 009345 142784',
  7.     '166362 404177 009341 142781'
  8. );

  9. sub count {
  10.     ~~ keys %{ { map { $_, 1 } split } };
  11. }

  12. my @R = sort { $b->[0] <=> $a->[0] } map [ count, $_ ], @r;
  13. my ( $min, @min ) = $R[0][0];

  14. $_->[0] == $min ? push @min, $_->[1] : last for @R;
  15. say for @min;

  16. __DATA__
复制代码

论坛徽章:
0
4 [报告]
发表于 2015-04-12 14:02 |只看该作者
感谢,程序猿zy、rubyish两位热心大侠的精彩解答,两位的方法都是很棒的,学习了....

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
5 [报告]
发表于 2016-10-10 21:25 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @a = ([353475,328937,354173,328937],[353475,404177,354173,404177], [166362,404178,'009345',142784]);

  5. my ($cnt, %hStat, @aData) = 9999;
  6. for (@a){
  7.     my @aT = grep {$hStat{$_}++} @$_;
  8.     if ($cnt > @aT){
  9.         $cnt = @aT;
  10.         %hStat = @aData = ();
  11.         push (@aData, [@$_]);
  12.     }
  13. }

  14. print "@$_\n" for @aData;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP