如何从字符串中获取最大的char

时间:2011-09-01 10:43:53

标签: perl

如何从字符串中获取具有最大ascii值的char?

$str = 'abcb'
# extract biggest char somehow
# as a result $char contains "c"

3 个答案:

答案 0 :(得分:9)

use List::Util 'maxstr';

my $maxChar = maxstr split //, 'abcb';  # 'c'

答案 1 :(得分:7)

这些事情的诀窍是知道你的其他限制。您需要多久在程序中执行此操作以及字符串有多大?使用单发短弦,您可以摆脱浪费。如果你不得不重复或大字符串,那么浪费就更重要了。

我测试了5秒CPU(Mac Pro,OS X.6.8,Perl 5.14.1),以增加字符串长度的数量级:

                  +-------------------------------------------------+
                  |                    Iterations                   |
+-----------------+---------+---------+---------+---------+---------+
| Sub name        |   10**1 |   10**2 |   10**3 |   10**4 |   10**5 |
+-----------------+---------+---------+---------+---------+---------+
| iterate_foreach |  983840 |  141997 |   16333 |    1686 |     168 |
| iterate_for     | 1041713 |  146608 |   15370 |    1538 |     155 |
| sorter          | 1194656 |  120608 |   10490 |     888 |      82 |
| maxstr          | 1505280 |  180923 |   19764 |    2120 |     202 |
| control         | 8019246 | 8019246 | 7719377 | 5041132 |  710027 |
+-----------------+---------+---------+---------+---------+---------+

List :: Util的maxstr在所有情况下都占主导地位。对于第一个订单,一个10个字符的字符串,sorter可以。在此之后,sorter变得越来越糟,正如您所期望的那样。 iterate_foreachiterate_for降级得更好。

代码:

use 5.010;
use strict;
use warnings;

use Benchmark;
use List::Util;

my $count = -5;

foreach my $order ( 1 .. 5 ) {
    say "-" x 50, "\nTiming for order $order";

    my $string = make_string( $order );

    timethese( $count, {
        'sorter'          => sub { my $c = sorter( $string ) },
        'maxstr'          => sub { my $c = maxstr( $string ) },
        'iterate_for'     => sub { my $c = iterate_for( $string ) },
        'iterate_foreach' => sub { my $c = iterate_foreach( $string ) },
        'control'         => sub { my $c = control( $string ) },
    });
    }

sub make_string {
    my $order = shift;
    my $string;

    for( my $i = 0; $i < 10**$order; $i++ ) {
        $string .= chr int rand 256;
        }

    $string;
    }

sub sorter {
    my $str = shift;
    my $char = (sort split //, $str)[-1];
    }

sub maxstr {
    my $str = shift;
    my $char = List::Util::maxstr( split //, $str );
    }

sub iterate_for {
    my $str = shift;
    my $length = length $str;
    my $max = '';
    for( my $i = 0; $i < $length; $i++ ){
        my $chr = substr( $str, $i, 1 );
        $max = $chr if $chr gt $max;
        }
    return $max;
    }

sub iterate_foreach {
    my $str = shift;
    my $max = '';
    foreach ( split //, $str ){
        $max = $_ if $_ gt $max;
        }
    return $max;
    }

sub control {
    my $str = shift;
    return 'a';
    }

答案 2 :(得分:5)

$str = 'abcb';
@a = sort split(//, $str);
$char = pop(@a);