一道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了)。
需求以上所示,望哪位高手给写个脚本,谢谢。
[解决办法]
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");
[解决办法]
#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(":)");
[解决办法]
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");
[解决办法]
吃完了看这行么?
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(":)");