zoukankan      html  css  js  c++  java
  • [Inside] What’s the assumptions you are making

    在我们写代码的时候,其实无时不在做assumption,这些assumption会引导我们使用不同的算法,不同的实现,如果我们能够意识到这些assumption,并能validate这些assumption,就可以得到一个好的assumption,好的assumption就可以引导我们设计出更好的算法,更好性能的实现。所以在设计一个算法、实现一份代码之前,一定要把问题搞清楚了,也就是clarify assumption,哪怕那些觉得理所当然的assumption也要拿出来validate/verify一下。

    作为练习的一部分,把前面的几个题目翻出来,看看我们在开始设计算法和写代码之前,都可以clarify哪些assumption:

    有一个链表,除了一个正常的next指针指向下一个节点外,还有一个random指针指向其他节点,向前、先后或者NULL,现在实现一个算法来Copy这个链表。开始问问题吧!

    1. random指针是否也需要保持正确的指向;

    2. random指针是否可能指向链表节点和NULL以为的地址;

    3. 如果链表中还有其他指针,是否需要把指针指向的对象也复制;

    4. 如果OutofMemory,是能复制多少就复制多少,还是不做任何复制;

    5. 如果碰到任何异常,是throw exception,还是返回错误代码;

    6. 计算复杂度和存储复杂度的要求是怎样的;

    7. 对节点进行复制时,是否有ID、CriticalSection、kernel handle等字段需要特殊处理,如果需要,如何处理;

    8. 对节点进行复制时,是否需要考虑线程安全(改变共享数据结构时需要特别考虑);

    9. 该函数的应用场景是怎样的,是否需要对error input做全面的处理,或者内部使用并可以assume其输入在限定范围内,可以用assert来避免非法输入?

    10. 是否允许duplicate的节点存在?

    11. 我是否可以临时修改原来的链表,在函数返回前使之恢复到原来的状态。

    还有哪些事情跟这个问题相关,需要clarify呢?想到了可以再加。下面开始下一个练习:

    题目要求实现strstr(在一个字符串中寻找另一个字符串出现的位置)

    1. 是否区分大小写;

    2. 在pattern字符串是空字符串时,应该返回什么;

    3. 这个函数不涉及写操作,所以不考虑线程安全问题,right?

    4. 是否有效率要求?

    String to Integer (atoi)

    1. 如何处理前导和后置的空格;

    2. 如何处理中间出现的空格

    3. 是否支持-,+或者其他的任何符合,比如*/.等

    4. 是否支持部分parse,比如123abc返回123,或者abc123,a34等

    5. 是否支持wide char;

    6. 如果输入的字符串是NULL,或者为空,如何处理?

    7. 错误处理是通过返回值还是抛出异常;

    8. 如果错误处理是有错误时返回0,那如果本身要转换的字符串代表0,如何处理;

    9. 如果字符串特别长,超出int或者unsigned int的范围,如何处理;

  • 相关阅读:
    你是一直认为 count(1) 比 count(*) 效率高么?
    php 判断是不是https链接
    php 版本比较
    php 执行效率
    redis 队列缓存 + mysql 批量入库 + php 离线整合
    php 高并发下数据同步的问题
    一个合格的工程师的知识结构
    php 代码编写的格式
    php 四种基础算法 ---- 快速排序法
    php 四种基础算法 ---- 插入排序法
  • 原文地址:https://www.cnblogs.com/whyandinside/p/2831887.html
Copyright © 2011-2022 走看看