我最近接受了当地科技公司Java开发人员角色的采访,并被要求编写一个Java程序来检查python代码中缩进的正确性(至少找到第一个缩进错误)。
处理def
,while
和for
可能更容易。但是处理if...elif...else
之类的事情很棘手。有不同的情况,例如,只有if
没有else
或elif
;嵌套if
。如果它是配对的,也许我可以使用堆栈,但你不知道它们是否配对。
我真的可以在这里使用一些建议。
答案 0 :(得分:1)
我看待它的方式,有两种不同的方法可以解决这个问题。
前者更优雅,围绕编译器理论,或者至少是Automata理论。虽然这个过程可以保证工作并建立了人们可以参考的某种语言,但对时间敏感的东西来说可能是非常繁琐的。这是一个复杂的解决方案,看起来似乎是一个简单的任务。这种技术的优点是,如果我们正在寻找一个“hacky”解决方案,比如找到“:”,然后检查下一行是否缩进,这可能不适用于python中的某些内联命令使用“:”。一个示例可以是print("Enter your name:")
或subprocess.Popen
命令。这种情况将确保避免这样的错误。
def if elif else class etc
可以存储在一个公共位置。为了解决这个问题,我们将声明一些变量(让我们称之为i
,然后读入逐行写入并检查第一个(或第0个字符)。如果字符不是空格,我们将读取直到下一个空格并检查该单词是否存在于定义缩进块的一些单词中(您可以使用哈希同样,没有区别。)如果它在一个块中,你将i
增加4并继续到下一行。在随后的行中,你会读到第i个角色并确保它们是空间。基本上,你会重复这个过程,直到你发现一些与正在寻找的东西相矛盾的东西。现在,如果某些东西与我们正在寻找的东西相矛盾,我们可能必须阅读前一行。考虑
long_sequence = [1,2,3,4,1,2,3,4,1,2,3,4,
5,6,7]
现在,这在技术上会抛出一个错误,所以我们必须考虑这种情况和几个类似的情况,其中有一条线比一条线长,但命令在一条线上没有完成。
所以,如前所述,解决方案2将是非常繁琐和调试的噩梦,1优雅,但很难构建。它确实取决于你必须构建它的时间线。