继续:一道Google笔试题目

I_NBFA 2010-11-01 01:21:35
其实那个帖子都有错LZ没做认真测试就结了, perl比较怂也就举几个反例
至于我那个少处理一个情况:
1-1-1.jpg
1-1-2.jpg
2.jpg
脚本通过,但是第2个1的存在是非法的,因为同列中只存在1。
正确的应该是:
1-1-1.jpg
1-1-2.jpg
1-2.jpg
2.jpg
即同列中不可以只存在1,至少要到2。
但是下面的是正确的。
1-1-1.jpg
1-1-2.jpg
因为用户可以留着以后命名嘛,不然每次屁股后面都得跟个2= =

下面是修改后的脚本:

#coding=utf-8
import 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):
for _pi in range(_si + 1, seqPreLen):
if(seqPre[_pi] == 1): return _fni;
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(":)");


算法比较机械,期待另人大囧的奇淫意巧。
...全文
236 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_NBFA 2010-11-01
  • 打赏
  • 举报
回复

37,739

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧