首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

一道Google笔试题目,

2012-02-20 
一道Google笔试题目,求助。。。Google笔试题目(以前遇到过的):1-1.jpg1-2-1.jpg1-2-2.jpg1-2-3.jpg1-3.jpg1-4

一道Google笔试题目,求助。。。
Google笔试题目(以前遇到过的):
1-1.jpg
1-2-1.jpg
1-2-2.jpg
1-2-3.jpg
1-3.jpg
1-4-1.jpg
1-4-2.jpg
2-1.jpg
2-2.jpg
3.jpg
4-1.jpg
4-2.jpg
如上面所示,文件夹中存有很多图片。需要做一个脚本用来检证名称的正确性(名称是连续的,如上所示)。
错误的情况比如没有1-2-2.jpg或3.jpg,也就是说图片名称的命名方式应该是连续的。
还有一种情况要注意:如上面假如没有2-2.jpg时,那么文件夹中图片的名称只能用2.jpg(不能再用2-1.jpg了)。

需求以上所示,望哪位高手给写个脚本,谢谢。

[解决办法]

Perl code
use strict;use warnings;my @jpgs=("1-1.jpg","1-2-1.jpg","1-2-2.jpg","1-2-3.jpg","1-3.jpg","1-4-1.jpg","1-4-2.jpg","2-1.jpg","2-2.jpg","3.jpg","1.jpg","2.jpg");my $sample={};foreach my $item (@jpgs){    my @array=split(/-|\./,$item);    my $old=shift(@array);    pop(@array);    my $smpref=$sample;    $smpref->{$old}=undef if(!exists($smpref->{$old}));    foreach $item (@array)    {        $smpref->{$old}->{$item}=undef if(!exists($smpref->{$old}->{$item}));        $smpref=$smpref->{$old};        $old=$item;    }    #}sub varify{    my $smpref=shift;    return if(!defined($smpref));        my @sns=sort(keys(%$smpref));    if(@sns==1)    {        print "Error: 不该有的下一级序号\n";        return;    }        foreach my $i (0..$#sns)    {        if($i+1!=$sns[$i])        {            print("Error: 序号不正确,有跨越\n");            return;        }        varify($smpref->{$sns[$i]});    }}varify($sample);print("Done\n");
[解决办法]
Python code
#coding=utf-8import re;#从路径path下提取文件名并格式化def FormatFileNames(path):    #直接用files给出了,你可以改成读取目录    files = ["1-1.jpg", "1-2-1.jpg", "1-2-2.jpg", "1-2-3.jpg", "1-3.jpg",        "1-4-1.jpg", "1-4-2.jpg", "2-1.jpg", "2-2.jpg", "3.jpg", "4-1.jpg", "4-2.jpg"];    findall = re.findall;    formattedNames = [];    for _f in files:        all = findall(r"\d+", _f);        all = [int(_i) for _i in all];        formattedNames += [(_f, all)];    return formattedNames;#检查文件名合法性def CheckFileNames(formattedNames):    fn = formattedNames;    if(fn and fn[0][1].count(1) != len(fn[0][1])): return 0;    for _fni in range(1, len(fn)):        seqPre, seqCur = fn[_fni-1][1], fn[_fni][1];        seqPreLen, seqCurLen = len(seqPre), len(seqCur);        minSeqLen = min(seqPreLen, seqCurLen);        for _si in range(minSeqLen):            if(seqCur[_si] - seqPre[_si] == 1):                for _ci in range(_si + 1, seqCurLen):                    if(seqCur[_ci] != 1): return _fni;                if(_si != seqPreLen - 1 and seqPre[-1] == 1):                    return _fni - 1;                break;        else:            return _fni;    return None;formattedNames = FormatFileNames("your path");res = CheckFileNames(formattedNames);if(res != None):    print("invalid filename: ", formattedNames[res][0]);else:    print(":)");
[解决办法]
Perl code
use strict;use warnings;my @jpgs=("1-1.jpg","1-2-1.jpg","1-2-2.jpg","1-2-3.jpg","1-3.jpg","1-4-1.jpg",          "1-4-2.jpg","2-1.jpg","2-2.jpg","31.jpg","1.jpg","2.jpg");my $sample={};foreach my $item (@jpgs){    my @array=split(/-|\./,$item);    my $old=shift(@array);    pop(@array);    my $smpref=$sample;    $smpref->{$old}=undef if(!exists($smpref->{$old}));    foreach $item (@array)    {        $smpref->{$old}->{$item}=undef if(!exists($smpref->{$old}->{$item}));        $smpref=$smpref->{$old};        $old=$item;    }    #}sub varify{    my $smpref=shift;    return if(!defined($smpref));        my $stckref=shift;        my @sns=sort(keys(%$smpref));        if(@sns==1)    {        print "Error: 不该有的下一级序号(@$stckref $sns[0])\n";        return;    }        foreach my $i (0..$#sns)    {        if($i+1!=$sns[$i])        {            print("Error: 序号不正确,有跨越(@$stckref $sns[$i])\n");            return;        }        push(@$stckref,$sns[$i]);        varify($smpref->{$sns[$i]},$stckref);        pop(@$stckref);    }}my @stack;varify($sample,\@stack);print("Done\n"); 


[解决办法]
吃完了看这行么?

Python code
8import re;import os;import os.path;#从路径path下提取文件名并格式化def FormatFileNames(path):    files = [_f for _f in os.listdir(path) if os.path.isfile(os.path.join(path, _f))];    formattedNames = {};    for _f in files:        all = re.findall(r"\d+", _f);        all = [int(_i) for _i in all];        formattedNames[tuple(all)] = _f;    keys = sorted(formattedNames);    formattedNames = [(formattedNames[_i], _i) for _i in keys];    return formattedNames;#检查文件名合法性def CheckFileNames(formattedNames):    fn = formattedNames;    if(fn and fn[0][1].count(1) != len(fn[0][1])): return 0;    for _fni in range(1, len(fn)):        seqPre, seqCur = fn[_fni-1][1], fn[_fni][1];        seqPreLen, seqCurLen = len(seqPre), len(seqCur);        minSeqLen = min(seqPreLen, seqCurLen);        for _si in range(minSeqLen):            if(seqCur[_si] - seqPre[_si] == 1):                for _ci in range(_si + 1, seqCurLen):                    if(seqCur[_ci] != 1): return _fni;                if(_si != seqPreLen - 1 and seqPre[-1] == 1):                    return _fni - 1;                break;        else:            return _fni;    return None;mypath = "f:/testtest/";formattedNames = FormatFileNames(mypath);res = CheckFileNames(formattedNames);if(res != None):    print("invalid filename: ", formattedNames[res][0]);else:    print(":)"); 

热点排行