博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

文章分类 -  编程之美读书笔记

摘要:没想到啊,没想到啊,写个二分查找竟然写的很不利索,主要是边界问题啊,特别是当mid元素等于待找元素的时候。反正不管怎么样吧,纠结了一下子之后还是把代码写好了,不知道还有没有BUG。通过这个题目,感觉到在写比较复杂的循环的时候,还是把循环的循环不变式写出来,比较有帮助,能让自己更加清楚的看清楚各个边界条件的处理和自己所写循环是否能完成既定的任务。#include "stdafx.h"#include <iostream>using namespace std;//求任意一个position使得datas[position]==num,找不到返回-1int Bina 阅读全文

posted @ 2011-09-14 21:07 各种不会 阅读(1084) 评论(0) 推荐(0)

摘要:直接按照书上所说代码实现的,就是把两个串连接起来,利用了KMP算法实现字符串的匹配,直接贴代码: 1 #include "stdafx.h" 2 #include <IOSTREAM> 3 4 using namespace std; 5 6 void ComputePrefix(const char *str, int *pi){ 7 if(NULL==str || NULL==pi) 8 return; 9 int len = strlen(str);10 pi[0] = 0;11 int k = 0;12 for (int i=... 阅读全文

posted @ 2011-09-14 20:57 各种不会 阅读(170) 评论(0) 推荐(0)

摘要:这一节有两个问题:给定一个整数N,那么N的阶乘N!末尾有多少个0?求N!的二进制表示中最低位1的位置。对于第一个问题,其实就是计算N!中有多少个质因子5,因为所有的0末尾的0都是5和偶数相乘产生的,而偶数出现的频率要远远高于5出现的频率,所以只要计算N!中又多少个5。最直接的向下面到的代码:int Func1(int n){ int count = 0; for (int i=n; i>0; i--) { int temp = i; while (temp % 5 == 0) { count++; temp /= 5; } } return count;}上面的代码复杂度很高,要降低复杂 阅读全文

posted @ 2011-05-14 16:30 各种不会 阅读(260) 评论(0) 推荐(0)

摘要:问题:求序列a1,a2......an的最长递增子序列复杂度为O(n2)的算法。最优子结构分析,假设以ai为最后一个元素的最长递增子序列S,其长度为L,ak为最长递增子序列中满足k<i且ak<ai的k最大的一个,也就是在递增序列中ai的前一个元素,那么以ak为最后一个元素的最长递增子序列必定是S-ai,其长度为L-1。用反证法证明:假设存在以ak为最后一个元素的递增子序列的长度大于L-1,那么肯定存在长度大于L的以ai为最后一个元素的子序列S1,产生矛盾。递归的定义最优解:假设L[i]表示以ai为最后一个元素的最长递增子序列的长度。L[i]=Max{L[k]+1, 1} 1=< 阅读全文

posted @ 2011-05-14 16:11 各种不会 阅读(508) 评论(0) 推荐(0)

摘要:这个问题是求一个数n的二进制中1的个数,《编程之美》这本书上写了有五种解法。解法一:其实最容易想到的办法就是这个方法,对于一个数来说除以2有两种情况,当n为偶数的时候,等于是把最右边一位0移除,当n为奇数的时候就会余1,同时将最右边的1移除。所以可以通过循环除2的方法来得到1的个数 1 int Func1(int data) 2 {//对于二进制来说每次除以2,如果是偶数就减少一个0,如果是奇数就会余1,对 3 //data循环除2统计1的次数就可以得到data的二进制中又多少个1 4 int count = 0; 5 while (data != 0) 6 { 7 if (data%2 == 阅读全文

posted @ 2011-05-14 15:09 各种不会 阅读(323) 评论(0) 推荐(0)