译者的译文 :我们正在为您发布由史蒂夫·梅里特(Steve Merrit)撰写的文章的翻译,史蒂夫·梅里特(Steve Merrit )是一位Google员工,他在谈论他如何解决典型的编程问题。 该帖子主要对新手程序员有用。在本文中,我将讨论从头到尾解决项目工作期间出现的问题的策略。 我在Google的日常工作流程中以及与各级编码人员(同事,训练营毕业生,大学生)一起工作时都使用它。 一种结构化的技术可以最大程度地减少调试时间,同时可以创建更好的代码。
顺便说一句,在大型技术公司的采访中,通常使用相同的策略。 三年前,多亏了她,我才在Google找到了一份工作。
我们提醒您: 对于所有“哈勃”读者来说,使用“哈勃”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。
Skillbox建议:在线教育课程“专业Java开发人员” 。
一步一步
我将以典型问题的形式显示示例,以揭示该主题。
问题:“鉴于sourceString和searchString两行,当sourceString出现在searchString中时,您需要返回第一个索引。 如果searchString不在sourceString中,则返回-1。
1.画
立即开始编写代码不是一个好主意。 首先,您需要概述解决问题的方法。 首先形成您的观点的假设和证据。 并且只有在您已经有明确的计划时才能开始工作。 如果不这样做,那么当工作已经开始时,您可能会遇到这样一个事实,即各个代码段不会相互对应。
即使任务看起来很简单,解决方案通常也很简单。 纸面计划可以帮助您找到正确的方法,并确保它在其他情况下仍然有效。 而且,即使在编写第一行代码之前,您都将学到所有这些内容。
因此,不要开始编写代码,甚至不要考虑它。 您将有很多时间工作。 您是人机,您就可以解决问题。
将求解算法放在纸上。 如果有什么方法可以使您的计划可视化,那就去做。 任务是用铅笔和纸来解决问题,而无需键盘。
提出简单的输入。 如果函数“传递字符串”,则“ abc”是第一个出色的示例。 尝试了解什么是正确的结果。 然后考虑一下您如何理解问题,采取了哪些步骤。
假设字符串具有以下值:
sourceString: "abcdyesefgh"
searchString: "yes"
因此,我们可以看到searchString在sourceString内部。 但是我们是怎么来的呢? 我们从sourceString的开头开始,一直读到结尾,查看每个三个字符的片段,看是否与单词“ yes”匹配。 例如,“ abc”,“ bcd”,“ cde”等。 当我们到达索引4时,我们发现“是”,因此确定存在匹配项,并且从索引4开始。
我在该研究所有一位老师,他负责制定有关制作花生酱三明治的说明。 为了提供详尽且易于理解的指导,他们向我们承诺了最高的评价。
我写了以下内容:
“打开花生酱,涂在面包上。 再放一块面包,就完成了。”
我以为我能做到这一点,直到老师把黄油涂在面包上,然后把面包涂在塑料袋里。
像我的老师一样,程序也需要非常详细的说明才能完成任务。 因此,在创建算法时,请确保提供所有内容-所有可能的方案。 当找到匹配项时返回正确答案是非常好的,但是即使没有找到匹配项也必须返回答案。
让我们再尝试另一对线:
sourceString: "abcdyefg"
searchString: "yes"
在这里,我们从sourceString的开头开始,一直读到结尾,查看每个三个字符的片段,看是否与单词“ yes”匹配。 当我们到达索引4时,我们发现yef几乎是一个巧合,但不完整,因为第三个字符不同。 因此,我们继续阅读直到到达行尾,然后确定没有匹配项,因此我们返回-1。
我们创建了解决问题的一系列步骤(在编程中称为算法),并且尝试执行几种方案,每次都获得正确的结果。 目前,我们可以确定我们的算法有效,现在是时候对其进行形式化了,这将使我们进入下一步。
2.我们用词写算法
这使步骤变得真实,这意味着我们稍后可以在编写代码时参考它们。
- 从该行的开头开始。
- 我们查看所有三个字符的组合(或searchString中指示了多少个字符)。
- 如果它们中的任何一个等于searchString,我们将返回当前索引。
- 如果我们没有找到匹配项而到达行尾,则返回-1。
3.我们编写一个伪代码
伪代码不是真正的代码,但伪装成代码。 给定我们的算法,我正在谈论的一个例子:
for each index in sourceString,
there are N characters in searchString
let N chars from index onward be called POSSIBLE_MATCH
if POSSIBLE_MATCH is equal to searchString, return index
at the end, if we haven't found a match yet, return -1.
我可以使它更像这样的真实代码:
for each index in sourceString,
N = searchString.length
POSSIBLE_MATCH = sourceString[index to index+N]
if POSSIBLE_MATCH === searchString:
return index
return -1
4.我们将一切都翻译成代码
现在,我们必须注意语法,函数参数和语言规则。 也许您无法编写所有内容,这很正常。 在代码中写下您肯定知道的信息!
function findFirstMatch (searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = <the LENGTH chars starting at index i> if (possibleMatch === searchString) { return index; } } return -1; }
请注意,我将这段代码留为空白。 这是故意的! 我不确定在JavaScript中处理字符串的语法,但稍后会介绍更多。
5.不要靠运气
一个特别常见的错误(尤其是对于新手程序员)是使用网络上发现的某些东西,希望它能正常工作。 找到的片段无需测试即可直接插入您自己的项目中。 您不了解程序的部分越多,成功完成工作就越不现实。
当您添加不确定的任何项目时,发生错误的可能性加倍。 结果,该过程变得一发不可收拾。
注释:可以使用Mersenne序列计算出错误的概率:a(n)=(2 ^ n)-1
测试您的代码。 在线查找内容很酷,但是在向程序添加代码段之前,请尝试将本节与其他内容分开。
在上一步中,我说过我不知道如何使用JavaScript选择字符串的特定部分。 让我们用谷歌搜索。
https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascript第一个结果是来自w3schools。 有点过时了,但是可以使用:
http://www.w3schools.com/jsref/jsref_substr.asp我假设我应该每次使用substr(index,searchString.length)突出显示sourceString部分。 但是到目前为止,这只是一个假设,仅此而已。 因此,我将首先对其进行检查。
let testStr = "abcdefghi"
let subStr = testStr.substr(3, 4); // simple, easy usage
console.log(subStr);
"defg"
subStr = testStr.substr(8, 5); // ask for more chars than exist
"i"
现在我确切地知道此功能的工作原理。 因此,当我将此片段添加到程序中时,我已经知道如果它不起作用,则问题不在添加的部分中。
最后,我添加了代码的最后一部分。
function findFirstMatch(searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = ( sourceString.substr(index, searchString.length)); if (possibleMatch === searchString) { return index; } } return -1; }
结论
如果您已读完末尾,请尝试提示。 找到您无法解决的问题。 我保证现在一切都会正常。
祝您好运,编码愉快!
Skillbox建议: