在我们写代码的时候,其实无时不在做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的范围,如何处理;