加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

高效的perl或python算法

发布时间:2020-12-15 21:52:16 所属栏目:大数据 来源:网络整理
导读:采访者在一次采访中问了一个问题,快速写了一个问题.以下功能的有效算法, 问题:编写一个函数来解析给定的字符串以获得以下给定的规则生成最终解析的字符串作为输出 写一个接受字符串作为输入的函数,字符串长度将在[0..2000000000]之间 string should be made
采访者在一次采访中问了一个问题,快速写了一个问题.以下功能的有效算法,

问题:编写一个函数来解析给定的字符串以获得以下给定的规则&生成最终解析的字符串作为输出

写一个接受字符串作为输入的函数,字符串长度将在[0..2000000000]之间

string should be made from only ‘A’,’B’ & ‘C’ characters like ‘AAA’,’ABCABC’,’AAAABBBBABAAACCCA’

转型规则:

1)’AB’ – > ‘AA’
2)’AC’ – > ‘AA’
3)’AA’ – > ‘一个’
4)’CC’ – > ‘C’
5)’BC’ – > ‘BB’
6)’BB’ – > ‘B’

每次在给定字符串上随机应用以上6条规则,并将最终转换后的字符串作为输出

例如,对Function的输入是:’ABCAAB’字符串

ABCAAB – > AACAAB [AB = AA]
AACAAB – > ACAAB [AA = A]
ACAAB – > AAAAB [AC = AA]
AAAAB – > AAAB [AA = A]
AAAB – > AAB [AA = A]
AAB – > AB [AA = A]
AB – > AA [AB = AA]
AA – > A [AA = A]

最终结果:’A’

因为我们现在无法对字符串应用任何其他规则.

我的答案就像(伪代码):

sub myFunc {
my $str = @_;
flag = 1
while(flag ==1) {
    if ($str =~ /AB/){
    $str =~ s/AB/AA/;
    next;
    }
    elsif($str =~ /AC/){
    $str =~ s/AC/AA/;
    next;
    }
    elsif($str =~ /AA/){
    $str =~ s/AA/A/;
    next;
    }
    elsif($str =~ /CC/){ 
    $str =~ s/CC/C/;
    next;
    }
    elsif($str =~ /BC/){ 
    $str =~ s/BC/BB/;
    next;
    }
    elsif($str =~ /BB/){ 
    $str =~ s/BB/B/;
    next;
    }
    else
    {
        flag = 0
    }
} //while
 return $str;
} //func

有人可以建议更好的算法&处理上述问题?

解决方法

规则1到3将丢弃A之后的任何字符.
规则5和6将丢弃B之后的任何B和C.
规则4将丢弃C之后的任何C.取代的顺序无关紧要.

因此在处理之后,字符串将是C,CB,CA,CBA,B,BA,A之一.

单次扫描字符串就足够了.如果你看到C,请保留它并跳过下一个C;然后,如果你看到B,保留它并跳过下一个B;然后,如果你看到A保持并停止.

给出的例子ABCAAB立即产生A.

明确应用规则和多次通过的解决方案是不可接受的,因为它们的行为可以是O(N2)或甚至是O(N3),而N = 2000000000.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读