遇到问题怎么办?还能怎么办,解决呗。那到底怎么解决呢?你是有什么惯用的逻辑模式、解决策略,还是全靠直觉手感?

本文中,一位 Google 程序员将“现场”演示其解决编程问题的始末,看看有套路的问题解决模板,是否能帮到你。

作者 | Steve Merritt

译者 | 弯月

责编 | 仲培艺

出品 | CSDN(ID:CSDNNews)

人工智能到底有多惊人?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

以下为译文:

我将通过本文向你介绍解决编程问题的策略及始末,我会在 Google 的日常工作中用到这些策略,而且各个级别的程序员(包括参加培训的学生、大学生和实习生等)都会通过这些策略学习以及成长。应用这种结构化流程可以最大限度地减少令人沮丧的调试过程,并在较短的时间内实现清晰正确的代码。

具体步骤

我将通过如下练习来说明具体的步骤。

问题:“假设有两个字符串 sourceString 和 searchString,要求你返回 sourceString 中出现的第一个 searchString 的索引。如果 sourceString 中不包含 searchString,则返回 -1。”

1)画出来

坦白来说,立即开始写代码是一个荒谬且偷懒的想法。在动手撰写一篇文章之前,首先你要想清楚论点和论据,还要确保你的论证有意义。否则你就是在浪费时间,过不了多久你就会意识到自己写的内容无法紧密地融合在一起。编程亦是如此,而且编程的情况会更糟,就好象洗发水不慎滴入了眼睛一般,痛苦难耐。

通常,即使看上去似乎很简单的问题,其解决方案也并非微不足道。在纸上把问题画出来可以帮助你找到解决方案,并通过几种不同的情况验证解决方案,在这之前最好一行代码都不要写

不要写代码,连写代码的想法都不能有。你有足够的时间来写那一堆的分号和括号。你需要做的是从一台人类计算机的角度出发思考如何解决这个问题。

画画、使用箭头、把数字写到小方框中等等,无论是什么形式,只要可以帮助你通过图形的方式将问题表示出来就可以。你的目标是解决问题,你可以自由使用纸和笔,不要让键盘局限你的思维。

首先画出一些简单的输入。如果你的函数“接受一个字符串”,那么完全可以用 "abc" 做例子,然后想清楚正确的结果是什么。最后,试着考虑“如何”才能解决问题,以及所涉及的步骤有哪些。

让我们假设有如下字符串:

sourceString: "abcdyesefgh"
searchString: "yes"

我具体的想法是:

好的,我在 sourceString 看见了 searchString。但是我是如何看到的?我从头到尾查看了 searchString 中的字符,并检查连续的 3 个字符是否匹配单词 "yes"。例如,"abc","bcd","cde",以此类推。直到我看到第 4 个时,我找到了 "yes",所以我知道这是一个匹配成功的地方,索引从 4 开始。

在写算法的时候,我们需要确保可以表达清楚所有的内容,还要处理好所有可能出现的情况。如果我们找到了匹配,则返回正确的答案;但是找不到匹配时,我们也需要返回正确的答案。

我们再来试一试另一对字符串:

sourceString: "abcdyefg"
searchString: "yes"

对于这一对字符串,我从头到尾查看了一遍 sourceString,检查连续的 3 个字符是否匹配单词 "yes"。当我看到第 4 个时,发现了 "yef",这个单词已经很接近了,但没能匹配成功,因为第三个字符不匹配。所以我继续往下找,一直到字符串末尾,仍然没有找到匹配成功的单词,所以需要返回 -1。

我们已经确定了解决该问题的一系列步骤(在编程中,我们称之为算法),而且我们已经尝试了几种不同的情况,每次都能得到正确的结果。到此为止,我们可以确信我们的算法可行,所以现在可以写算法了,请看下一步。

2)用文字表达出来

在这一步中,我们需要思考步骤1)中确定的算法,并尝试用文字表达出来。这样做可以让我们的实现步骤更加具体化,供我们稍后在写代码的时候参考。

1. 从字符串开头开始;

2. 查看每组的  3 个字符(或者说每个 searchString 中包含的所有字符)

3. 如果找到与 searchString 匹配的单词,则返回当前索引;

4. 如果已经到达字符串 sourceString 的末尾,却没有任何匹配成功,则返回 -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)不要猜

编程新手最常见的一个错误就是在互联网上寻找具体的实现方法,遇到“似乎可行”的东西,连测试都不做就放到自己的程序中。你不理解的程序越多,就越不可能找到正确的答案。

不确定的新代码每增加一处,你的程序出问题的可能性就会加倍。你不确定的地方只有一处?那很好啊,如果你的代码出了问题,那么罪魁祸首也只有一个。

如果你不确定的地方有两个?那么出问题的可能性就有 3 种:A 出了问题、B 出了问题、A 和 B 同时出了问题!如果你不确定的地方有三处呢?那么情况情况很快就失控了。

备注:你的程序出问题的可能性呈梅森素数序列:a(n) = (2^n) - 1

首先测试你的新代码。通过互联网查找代码的实现很好,但在放到程序之前,你需要做一次单独的小测试,确保这些代码的工作方式与你料想的一致。

在上一步中,我不确定 JavaScript 中选择字符串的部分语法。所以,我去 Google 了一下:

https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascript

第一个搜索结果来自 w3schools。虽然有点过时,但一般都很可靠。

https://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;
}

结论

如果你坚持读到了最后,那么我想说:赶快尝试一下这种做法吧。回头看看你最近遇到的编程问题,我敢保证你已经有所提高了。

祝你好运,快乐编程!

你的颜值及格没?人工智能测试?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

原文:https://blog.usejournal.com/how-a-googler-solves-coding-problems-ec5d59e73ec5

作者:Steve Merritt,软件开发@Google。

本文为 CSDN 翻译,如需转载,请注明来源出处。


 热 文 推 荐 

☞ “5G 将是一个彻底的失败通信技术”

☞ 你还没听过 CynosDB 吗?不来这场数据库技术沙龙就要 OUT 了!

☞ 叫板苹果谷歌,微软将开发者应用分成上调至 95%

互联网没有春天

☞13 岁少女因几行 JS 代码被逮了!

云漫圈 | 如何给女朋友解释什么是HTTP

这份“插件英雄榜Top20”才是Chrome的正确打开方式!

剧情反转! 创始人去世事件再爆新料, 1.8亿美元难道去了天堂?

☞没有一个人,能躲过程序员的诱惑!

System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

喜欢就点击“好看”吧!

Google 程序员消灭 Bug 的 5 大法宝!相关推荐

  1. 【有三吐槽】程序员改BUG的六重境界,你,第几重了?

    文章首发于微信公众号<有三AI> [有三吐槽]程序员改BUG的六重境界,你,第几重了? 作为一个程序员,我们也有丰富多彩的bug人生啊,咱们又开新专栏了(实在是有感于最近大家问我的问题), ...

  2. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  3. Java程序员必备的10个大数据框架

    当今IT开发人员面对的最大挑战就是复杂性,硬件越来越复杂,OS越来越复杂,编程语言和API越来越复杂,我们构建的应用也越来越复杂.根据外媒的一项调查报告,小千列出了Java程序员在过去12个月内一直使 ...

  4. python免费开源工具推荐_年薪200万的程序员,推荐这10大Python免费开源工具!

    原标题:年薪200万的程序员,推荐这10大Python免费开源工具! 毫无疑问,Python是最流行的语言之一,其成功的原因之一是它为科学计算提供了广泛的报道. 在这里,我们仔细研究用于机器学习和数据 ...

  5. 原创 | 2020年Java程序员应该学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  6. 2020年Java程序员应该学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  7. 关于PHP程序员技术职业生涯规划--swool大神韩天峰

    关于PHP程序员技术职业生涯规划–swool大神韩天峰 看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些, ...

  8. 老程序员解Bug的通用办法

    程序员在很多人的印象里是一份严(ku)谨(bi)的职业,也是一个被搞怪吐槽乐此不疲的职业,程序员们面对复杂的代码敲打电脑时连眉头都不会皱一下,但是有一个词却是他们痛苦的根源,它就是Bug. 记得刚毕业 ...

  9. python免费开源工具推荐_年薪200万的程序员,推荐的10大Python开源免费工具!

    原标题:年薪200万的程序员,推荐的10大Python开源免费工具! 毫无疑问,Python是最流行的语言之一,其成功的原因之一是它为科学计算提供了广泛的报道. 在这里,我们仔细研究用于机器学习和数据 ...

最新文章

  1. 身份验证——《跟我学Shiro》
  2. 小程序mysql+php测试,分享微信小程序的一些常见辅助测试功能:chance
  3. nyoj--891--找点(贪心)
  4. wordpress Oops! That page can’t be found.
  5. 一文读懂GaussDB(openGauss) 的六大关键技术特性
  6. Angular5.0之 安装指定版本Angular CLI
  7. Terracotta - 分布式共享对象
  8. ubuntuQQ、微信安装
  9. 圆锥曲线中的存在性探索性问题
  10. 初学C语言的感受(张森)
  11. 工程初始化:报错... ...is exceeding the 65535 bytes limit
  12. Java *2.8(当前时间)程序清单2-7给出了显示当前格林尼治时间的程序。修改这个程序,提示用户输入相对GMT的时区偏移量,然后显示在这个特定时区的时间。
  13. 腾讯web引用skey g_tk bkn和日期显示分析
  14. 新版的ARMv9到底牛在哪?
  15. 计算机原理形考3,计算机组成原理A形考作业3参考解答
  16. Simple polygon
  17. IE和firefox上传文件mime类型的设置
  18. 助力智慧医疗|解析i.MX8MM在麻醉系统中的应用方案
  19. python异常处理时所使用的保留字_下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是...
  20. chrome浏览器背景色更改

热门文章

  1. java script 调用c_用vs2008调试Javacscript
  2. python可以做科学计算吗_用 Python 做科学计算之最小二乘
  3. Flutter实战一Flutter聊天应用(八)
  4. 中国女性灭菌装置行业市场供需与战略研究报告
  5. 中国喷漆室保护膜市场趋势报告、技术动态创新及市场预测
  6. 体重控制补品行业调研报告 - 市场现状分析与发展前景预测
  7. 2021年中国中端婴儿车和婴儿车市场趋势报告、技术动态创新及2027年市场预测
  8. idea怎么设置选中文件时,自动在左侧弹出文件所在位置及文件
  9. input time设置24小时制_python-time、datetimme模块
  10. linux 内核模块 proc,Linux 内核模块 proc文件系统.pdf