- xiaohanyu xiaohanyu:@flyinghearts: 关于源代码,我觉得在书不必要全盘给出。书上给出代码的关键部分,完整的源代码可以放在网上,供读者自行下载。如果每个问题都给出完整的源代码的话,太浪费版面了。

- flyinghearts flyinghearts:我先提两个建议:一个是代码,希望在第二版中,每一个问题尽可能都给出完整的程序代码(包括测试例子),这样既可以减少源代码存在的错误,读者修改编译源代码也能进一步加深对相应算法的理解;另一个是“动态规划”方法,书中一些题目(比如:饮料供应、电梯调度扩展题、编辑距离)已经涉及到使用“动态规划”方法,希望新版中能多增加些“动态规划”的资料(比如:“动态规划”的适用范围、多重背包、母函数,平行四边形优化),让读者了解到用“动态规划”方法解决问题的实用之处。

- flyinghearts flyinghearts:看了编程之美10年05月重印 中的代码, 希望改版后,书中的代码能尽量遵守C++标准风格,符合C++风格:
主函数原型用int main() 而不是 int _tmain() 或者 void main()
C标准库头文件是用 cstdio 而不是 stdio.h
包含头文件顺序是 C++标准库、 C标准库、系统库、用户自定义库
include非用户自定义库,使用<> 而不是""
代码不放在主函数中,而是封装到一个函数,方便读者写测试代码
尽可能不用宏

- miloyip miloyip: 關於範例代碼,問題確是比較多。有些程序裡的變數會混合Camel、Pascal和Underscore case (如4-4),有些又會有Hungarian命名。if/while/for後的單行statement是否用{}也是不統一。

- firewoods firewoods:Wiki的页面内容太多了, 编辑起来比较麻烦, 特别是注释的人多了以后, 会很长. 建议1或者少量几个题目一个页面,
- lispython lispython: 谢谢建议,稍后研究一下怎么修改比较合适。

- firewoods firewoods:沒有紙質書, 只能在CSDN上下載了一本盜版的pdf, 解壓開來一看以後, 發現只有19個題目的......
- lispython lispython: 我发清样文档给您,您告诉我email地址吧,我的lispython@gmail.com

- firewoods firewoods
從數學建模的角度來講, 當我們遇到一個不知道的問題時, 最好的辦法是往一個已知的問題的靠.
算法問題也一樣, 有很多的問題都可以歸結到一些常見的算法,
所以可以適當的介紹一些常見的算法問題,並且對應的常用解法.
比如 排序問題: 冒泡, 快排, 哈希等等
背包問題: DP(整數), 分支定界(非整數)
同時, 還可以介紹一些常見的算法, 以及可以採用的前提.
比如 貪婪, DP, 分支定界 等等.

而一般的面試題的解法, 可以總結為3步.
1. 理解問題.
2. 嘗試轉換到一個已知的問題.
3. 選擇最優的算法解決限定條件下的已知問題.

- jun_zhou jun_zhou:一、确实要统一一下代码规范,一般是用C或C++吧。将代码统一刻入到一个光盘里,以利于读者自己动手。
二、可以试着按 所用算法或数据结构 来划分章节,目前这个章节看似很散,虽然也有一定的划分。

- huangkun huangkun: 我觉得完整的代码实现不是最重要的,其实也许用伪代码更加能够清晰的说明问题。而把完整的代码实现放到附录中去。

- flyinghearts flyinghearts:
1.一些题目需要修改下,把问题描述清楚。
2.一些解法中,可有可无的内容比较多,希望能精简掉,并将解法的重点部分能加粗显示。
3.对最优的解法和最容易书写的解法,写得详细些,其它可以写得简略点。
4.代码无论是用伪码还是简短的C++代码,对关键部分的实现,都要说清楚。
比如P234“3.5最短摘要的生成”的isAllExisted函数,isAllExisted怎么实现,本身就是一道算法题。
5.代码所采用的算法,既使很简单,解法中也应该提到。比如“3.2 电话号码对应英语单词”的直接循环解法。
6.有些问题要求设计数据结构,原始数据采用这种结构存储。题目应该明确说明这种要求
比如“1.5 快速找出故障机器”,题目应该明确指出,要求设计一个方案,解决丢失两种相同的备份的情况。
7.有几道题没有给出解法,最好能补上。
- gaopeng gaopeng:@flyinghearts
关于第4条建议,个人觉得取决于这个题目的主题思想,isAllExisted如果不是重点可看做“黑盒”

- uniquestudio uniquestudio
关于好题目的标准
吸引人的题目:通过不同于常规思路的提问,打破你对某一事物或现象的固有局限认识,让你有兴趣去利用既有的知识去解释一个有趣的现象。如果解释不了,又让你能意识到自己的不足,有动力去搞清楚隐藏在有趣背后的理论依据与知识。

关于第一题
第一题虽然堪称龙头,但感觉和后面绝大多数题目涉及到的内容还是有很大区别的。原因在于第一题的考察点是对操作系统、CPU工作原理的理解,而不是算法或数据结构。这就造成一种“不和谐”,让读者有“受骗”的感觉——以为是舞台的主角,实际上只是暖场的嘉宾。
所以,我们觉得如果能收集一定数量的基于操作系统、网络、数据库等计算机科班生必修课的有趣问题,独立出一章,也许是个不错的选择。毕竟,微软技术面试也不仅仅是算法和数据结构。
- gpww gpww恩,这道题目的风格确实和其他有所不同——知识型 V.S. 技巧型

- flyinghearts flyinghearts
个人认为,本书的定位是一本算法书,注重的是算法的思想和考虑问题的严谨性,书中不应该出现太多平台相关的内容,但有些这方面的知识(比如CPU缓存、内存分页大小对程序性能的影响)对算法设计很重要的,应该补充。
- firewoods firewoods@flyinghearts
如果說要講CPU緩存, 內存分頁之類的, 估計會涉及到平台的內容, 不過如果從"美"字來看,速度性能其實也是一種美, 我們在討論時間複雜度的時候, 其實就是在討論算法性能問題, 而講CPU緩存, 內存分頁之類則更側重於代碼的性能.


- flyinghearts flyinghearts
个人觉得,《让CPU占有率曲线听你指挥》不适合做为第一篇文章,该文的内容与操作系统太紧密相关,不说window和linux的差异,光 win98和win xp就有不小的区别(计时函数的精度等),过多的平台相关的内容,也和本书的定位(侧重于算法)相左。第一章的题目是“游戏之乐——游戏中碰到的题目”,第一篇文章最好与游戏设计相关、有点难度但难度又不是太大的游戏题,因为出的是新版,最好是采用新题目,以突出“新”。
- firewoods firewoods@flyinghearts
關於這個問題, 我的看法干好和flyinghearts相反.《让CPU占有率曲线听你指挥》這個題目涉及到系統, 算法等各個方面, 而且問題的本身給讀者留出了很多想想的空間, 看到題目的時候忍不住會想去自己嘗試畫一下, 或成功, 或失敗, 再來看後面的解答, 彼此參照, 還是很有意味的.放在第一題確實能抓住讀者的眼球, 讓讀者有繼續讀下去的興趣.

- flyinghearts flyinghearts
《中国象棋将帅问题》有点太沉闷,不应该做为前三篇文章之一,应该移到后面去。《光影切割问题》和NIM游戏等几篇,容易引起读者的兴趣,可以挪到前面。
- firewoods firewoods@flyinghearts
//這個題目倒不沉悶, 主要是後面的解答確實羅嗦沉悶了點, 個人感覺可以從解答部分入手, 能夠言簡意賅的把如何解決這個問題, 用到的是什麼想法解釋清楚就可以了.

- xuedi xuedi薛笛@flyinghearts
flyinghearts的反馈我仔细看了一下。经过工作这几年,我对这本书的看法和认识有了新的变化,更能了解本书的定位,题目的设置这方面的问题。
(1)关于本书的定位和平台相关内容的问题:
看本书本书副标题“微软技术面试心得”就知道本书是针对在校学生的“面试题集”而不是纯粹的“算法书”,侧重于用算法解决问题,用程序描述解法。所以书中(第一版)会出现的不同类型的程序(C++、C#、python)和平台相关的东西(WinAPI),我觉得只要对解决问题合适、读者能读懂就OK。对不同平台和语言可以起到抛砖引玉,让读者举一反三的作用即可。但是那些过细的东西,如flyinghearts提到的CPU缓存、内存分页对程序性能的影响这类的问题反倒不大适合本书的定位和风格,同时对这些东西大多数学生没什么经验,也比较枯燥。
(2)关于题目的安排问题:
我觉得题目的安排应该本着由易到难、循序渐进的原则,当然问题的趣味性也可以作为考量范围。至于CPU的那道题我觉得作为第一篇文章没啥问题,因为毕竟比较简单有趣,又有图挺直观的。《象棋》问题是否“沉闷”我觉得每个人感觉不同吧,位置也没啥必要非往后调,因为题目本身是简单的。
(3)关于原题和扩展问题难度和相关性的问题
我觉得从面试角度讲,问题当然都是环环相扣的,扩展问题难于原题才能显示出面试的梯度,问题越到后面越难是当然得:)。至于原题的解法不能用于扩展问题,我觉得这是很有可能的啊,毕竟即便看是看起来很像的两个问题,其背后所蕴含的真实原理可能完全不同,当然不能简单套用之前的方法,毕竟这又不是教科书的书后练习。
(4)其他
在本书第一版里第一章的题里面最后两个“俄罗斯方块”和“扫雷游戏”只有问题没问题分析和解法,我觉得这么好玩的问题没下文比较可惜,不知道第二版是不是也是这种情况。我觉得这两道题是相当有趣的,如果能有和“NIM问题”一样精彩的分析的话对本书应该会是一个亮点。

- pluskid pluskid
书的定位,这个我想应该是由作者和编辑来把握的,读者应该有自己的理解,不过最终应该是出书人的决定吧。就我个人理解,这本书并不是像 flyinghearts 说的那样算法书,据我所知这个里面全部都是面试题吧?相当于是一个合集,包含了各种有趣的题目,我并没有觉得平台相关的内容不适合本书,其实平台相关的具体代码只是呈现题目的一个工具吧,换成不同的平台并不会影响问题的主要部分,而且我觉得既然本身就并不强调特定的平台,就没有必要给出各个平台的版本。

我觉得书的特点是题目有趣,又有一定的实践内容。如果说是定位为算法书的话,我并没有觉得这本书相对于世面上那些经典的系统的讲算法的书有什么优势。但这只是我的理解而已,关键还是要看你们出这本书的人是怎么想的吧。如果想要面面俱到的话那可能是很困难的。

- flyinghearts flyinghearts:本书标题有“面试”二字,但是书中的内容主要侧重于讲算法,
个人觉得这也是本书的卖点之一,从题目讲算法, 不像一般的算法书那么枯燥。书中出现C/C++/C#/ Python的代码, 则恰恰说明本书在代码组织方面做得还不够好,像C#/ Python的代码,对那些不了解它们的读者,根本毫无用处。

对一些硬件知识有些基础了解,有助于编写程序。 网上流传着这样一道题“不用临时变量交换两个数”,只有明白了, 数的运算都要经过CPU寄存器, 才会了解这道题根本没任何实际意义(只能算脑筋急转弯题目), 不用临时变量,代码又难看,又妨碍编译器进行优化,效率差。 对CPU一级缓存/内存分页等知识有个基本了解, 实际解决问题时, 就会考虑选用的数据结构的大小会不会对性能有太大的影响。

本书标题有“面试”二字,扩展题本应该侧重于选取面试题,有些扩展题就是让面试官做,也很难在几个小时内给出解答的。

另外,本书的纯粹的数学题,不要太多吧。 有些基本的数学知识可以结合到程序题中。“奇偶性一致”、“ 鸽笼原理”(其本质是反证法)最常用到。“奇偶性一致” 经常用于判断是否可能从一个状态到达另一个状态(像数独问题), 而“鸽笼原理”可用于证明是否有解、减少搜索的状态数。 像那道找出最小的M使N*M只含0和1,可以将10^k(k = 0, 1, 2, ...),这无穷多个数,根据除以N的余数,放到编号0, 1, ... N-1这N个笼子中,显然有一个笼子中的数字数目必然大等于N, 从中随便取N个,这N个数的和,恰好只含有0、1, 且能被N整除,因而一定存在使N*M只含有0和1的数字M。