编程珠玑笔记1

来源:互联网 发布:iphone远程控制mac 编辑:程序博客网 时间:2024/05/18 14:15
  1. 一个文件里有1千万(10000000)个7位的整数(小于1千万),给大约1M内存让排序

    • 位图(bitmap),长度10000000的bit数组a初始化为0,当数字x出现,a[x]=1,然后依次输出标志位为1的下标号。10000000bit == 1250000byte == 1220K == 1.19M。

    • 如果严格1M做成双通道程序,第一次标记前500万输出,第二次标记后500万输出。

  2. 向量旋转:abcdefgh(长度n为8),向左旋转i=3次

    • 3次反转法

      i = i % n #n次还原reverse(0, i-1) #cbadefghreverse(i, n-1) #cbahgfedreverse(0, n-1) #defghabc
    • 如果向右旋转:先取模,ii=i%n,向右旋转ii次,等于向左旋转n-ii次

  3. 某文件包含40亿个随机次序32位整数,其中有一个整数未出现,找出来。限制:内存几百字节,若干顺序文件。

    • 先把最高位为1的写入文件a,最高位为0写入文件b,并分别计数countA,countB.如果最高位为1的整数全部出现,那么countA>countB && countA==2^31,则去文件b中查找,缺失的必定是最高位为0的。同理,区分第二最高位,第三最高位,直到找到
  4. 一个词典有230000个单词,file和life是变位词,找出所有变位词的词集

    • 依次对每个单词进行签名,确保变位词拥有唯一的相同的签名,比如将单词字母排成升序,变位词排序后结果一致。然后按照签名排序,依次输出各个签名的变位词集
  5. 咖啡罐问题:一个成有一些黑色豆子和一些白色豆子的咖啡罐以及一大堆“额外”的黑色豆子,从罐子中随即选取两颗豆子,如果颜色相同,就将他们扔掉并却放入一个黑色的豆子;如果颜色不通,就将白色豆子放回罐子中,而将黑色的豆子扔掉。重复上述过程,直到罐子中只剩一颗豆子为止。证明该过程会终止,最后留下的豆子颜色跟初始状态时白豆和黑豆的数量有何关系?

    • 证明如下:设B个黑豆,W个白豆,总数S=B+W,取2个豆子
      if bb:#两黑豆    B=B-1; W=W; S=B-1+Welif ww: #两白色    B=B+1; W=W-2; S=B+1+W-2else: #bw异色    B=B-1; W=W;; S=B-1+w
      每次豆子总数都会减少1,所以过程必定终止。

    由于bw与bb相同,可以认为只有bb, ww两种情况。每次同色bb,ww,都会加入黑色,所以在白豆数量减少至1个或0个(0还是1取决于白豆奇数偶数)之前,黑豆不可能取完。所以我们简化为:直接先成对取白豆

    当白豆W=2n(偶数)时,先取完所有白豆,剩下的就是黑豆B=B+n,其实此刻黑豆数量没关系,全是黑豆,白豆没有加入途径,最后一轮必定黑豆

    当白豆W=2n+1(奇数)时,先成对取白豆至剩余1个白豆,黑豆B=B+n,在成对取出黑豆(记得回想上面的论证,可以认为只有bb,ww两类),最终必定剩余1黑1白(可以反证:剩余2黑1白,2黑成对取出,又加入1黑,得到1黑1白)。1黑1白,异色,白色回罐,黑色丢弃。最终是白色。

    结论:白豆偶数,最后一个是黑豆;白豆奇数,最后一个是白

  6. 最大子向量:一个向量,每个元素有正有负,求最大子向量的和

    • x = (31, -41, 59, 26, -53, 58, 97, -93, -23, 84)max_so_far = 0 #全局当前最大和max_ending_here = 0 #从下标0直到当前下标i最大和for i in x:     max_ending_here = max(max_ending_here+i, 0)#至少不为负     max_so_far = max(max_so_far, max_ending_here)
0 0
原创粉丝点击