摘要: 1、实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1要求:实现函数(实现尽可能高效) int func(unsign int n);n为输入,返回最小的运算次数。给出思路(文字描述),完成代码,并分析你算法的时间复杂度。答:int func(unsigned int n){ if(n == 1) return 0; if(n % 2 == 0) return 1... 阅读全文
posted @ 2012-08-26 16:49 freewater 阅读(1194) 评论(0) 推荐(0)
摘要: 一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:S(k, 1) = {A[i] | 1<= i <= k}S(k, k) = {A[1]+A[2]+…+A[k]}S(k, i) = S(k-1, i) U {A[k] + x | x属于S(k-1, i-1) }按照这个递推公式来计算,最后找出集合S(2N, N)中与SUM最接近的那个和,这便是答案。这个算法的时间复杂 阅读全文
posted @ 2012-08-23 19:18 freewater 阅读(10904) 评论(0) 推荐(0)
摘要: 十一、从头到尾彻底解析Hash 表算法作者:July、wuliming、pkuoliver出处:http://blog.csdn.net/v_JULY_v。说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。------------------------------------第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万 阅读全文
posted @ 2012-08-22 15:20 freewater 阅读(743) 评论(0) 推荐(0)
摘要: 面试中的Singleton引子 “请写一个Singleton。”面试官微笑着和我说。 “这可真简单。”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public: 4 static Singleton& Instance() 5 { 6 static Singleton singleton; 7 return singleton; 8 } 9 10 private:11 Singleton() { };12 }; “那请你讲解一下该实现的各组成。”面试官的脸上仍然... 阅读全文
posted @ 2012-08-19 13:48 freewater 阅读(265) 评论(0) 推荐(0)
摘要: 作者:小飞 原文地址:http://yishan.cc/blogs/nickledson/archive/2008/12/29/997.aspx 《编程之美》一书上有一道题:给定一个由N个整数元素组成数组a,写一个函数在其中找出连续子数组和的最大值。例如给定数组为{1, -2, 3, 5, -1, 2},则和最大的连续子数组是{3, 5, -1, 2},函数返回值是9。 这是一道典型的动态规划问题,书中循序渐进地通过分析给出了一个时间复杂度为O(N)空间复杂度为O(1)的最优解。我在面试时碰到了这道题的一道有趣变体,即同样给定一个数组,写一个在其中找出不连续子数组和的最大值,也就是说子数组.. 阅读全文
posted @ 2012-08-18 20:32 freewater 阅读(3194) 评论(0) 推荐(0)
摘要: int comlen(const char* str1,const char* str2){ assert((str1!=0)&&(str2!=0)); int len=0; while(*str1!='\0'&&*str2!='\0'&&*str1++==*str2++){ len++; } return len;}bool less(char* str1,char* str2){ return strcmp(str1,str2)<=0;}/*后缀数组法*/void longestRepeatedSubst 阅读全文
posted @ 2012-08-13 20:39 freewater 阅读(265) 评论(0) 推荐(0)
摘要: #ifndef PRIORITYQUEUE_H#define PRIORITYQUEUE_Htemplate <class T>class PriorityQueue{private: T *x; int size,capacity; void swap(int i,int j) { T t=x[i];x[i]=x[j];x[j]=t; }public: PriorityQueue(int initCapacity) { capacity=initCapacity; x=new int[capacity+1];... 阅读全文
posted @ 2012-08-13 20:07 freewater 阅读(138) 评论(0) 推荐(0)
摘要: 问题描述:程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内的m个随机整数,要求:每个数选择出现的概率相等,且按序输出。该题目是从《编程珠玑》的第12章看到的。 学习过概率统计的同学应该都知道每一个数字被抽取的概率都应该为m/n. 那么我们怎么构造出这样的概率呢?在《编程珠玑》上面是这样解析的: 依次考虑整数0,1,2,.....,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,我们可以保证输出结果是有序的。 假如我们考虑m = 2,n = 5的情况,那么选择的每一个数字的概率都应该是2/5,我们怎么样才能做到呢?不慌张,慢慢来。 下面给出我的分析过程 阅读全文
posted @ 2012-08-12 21:33 freewater 阅读(326) 评论(0) 推荐(1)
摘要: /*qsort1至qsort3都是同一种思路,只是变换了不变式invariant罢了*//*分割点a[u].invariant:a[l,m)<t && a[m,i)>=t, for each i in [l,u)*/void qsort1(int a[],int l,int u){ if(l>=u) return; int m=l; for(int i=l;i<u;i++){ if(a[i]<a[u]){ //a[i]<->a[m]; swap(a[i],a[m]); m++; ... 阅读全文
posted @ 2012-08-12 21:06 freewater 阅读(185) 评论(0) 推荐(0)
摘要: /*方案一:每次循环左移一位,移动k次。*/void rol(char str[],int n,int k){ assert(k<=n);//assume k is less than n, otherwise we can let k=k%n to meet this requirement. char tmp; for(int i=0;i<k;i++){ tmp=str[0]; memcpy(str,str+1,n-1); str[n-1]=tmp; }}/*方案二:将前k个数拷贝到临时数组中,然后移动后n-k个,再将前k个... 阅读全文
posted @ 2012-08-01 21:59 freewater 阅读(404) 评论(0) 推荐(0)
摘要: C语言中一般使用#define来定义常量,而C++中推荐使用const。因为#define定义的常量只是定义了名字和值的映射,存储在符号表中,在预处理阶段进行名值替换,不会进行类型检查操作。而const会进行类型检查。c++中const默认是内部链接的,也就说,const仅在const被定义过的文件里才是可见的,而在链接中不能被其他编译单元看到。这是因为const默认也是放到符号表中的,不会为其分配内存空间。但也有例外:当使用extern和取const变量的地址时,会强制为其分配内存空间。e.g. extern const int size=10; 或 const int size=10; c 阅读全文
posted @ 2012-07-30 12:33 freewater 阅读(541) 评论(0) 推荐(0)
摘要: 假设以年利率r%投资一笔钱y年,金融版本的“72法则”指出,如果r*y=72,那么你的投资差不多会翻倍。Little定律指出“系统中物体的平均数量等于物体离开系统的平均速率和每个物体在系统中停留的平均时间的乘积。(并且如果物体离开和进入系统的总体出入流是平衡的,那么离开速率也就是进入速率。)”假设你正在排队等待进入一个火爆的夜总会,你可以通过估计人们进入的速率来了解自己还要等待多长时间。依据Little定律,你可以推论:“这个地方可以容纳约60人,每个人在里面逗留的时间大约是3小时,因此我们进入夜总会的速率大概是每小时20人。现在队伍中我们前面还有20人,这也就意味着我们还需要等待大约一个小时 阅读全文
posted @ 2012-07-29 22:22 freewater 阅读(280) 评论(0) 推荐(0)
摘要: 文件是对I/O的抽象,虚拟存储器是对程序存储器的抽象,进程是对一个正在运行的程序的抽象,虚拟机是对整个计算机的抽象。并发和并行的区别就是一个处理器同时处理多个任务和多个处理器同时处理多个不同的任务的区别。并发指的是逻辑上同时发生,而并行是物理上同时发生。并发性指的是处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。并行是指同时发生的两个事件,并发不一定并行。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的来执行这个运算。e.g. -1 < 0U => false.扩展一个数的位 阅读全文
posted @ 2012-07-28 21:30 freewater 阅读(422) 评论(0) 推荐(0)
摘要: show privileges 显示可用的系统权限清单。 View Code mysql> show privileges;+-------------------------+---------------------------------------+-------------------------------------------------------+| Privilege | Context | Comment ... 阅读全文
posted @ 2012-07-28 21:29 freewater 阅读(2378) 评论(0) 推荐(0)
摘要: 在变量定义前加extern表示声明一个变量但不定义它,例如:extern int a;extern 也可用于函数声明。例如:extern int func(int, int);但对于函数声明extern不是必须的。对变量和函数进行声明后就可以使用别人的函数了,但是大部分的库包含众多的函数和变量。要使用多个,自己声明起来既麻烦也容易出错,这时可以使用包含头文件的方法。头文件是一个包含某个库的外部声明函数和变量的文件,其中已经包含了函数和变量的声明信息。因而,用户只需使用预处理指令#include包含由创建库的程序员提供的头文件就可以了。static member function 的主要特性就是 阅读全文
posted @ 2012-07-26 21:38 freewater 阅读(222) 评论(0) 推荐(0)
摘要: 辗转相除法int gcd1(int x,int y){ if(y==0) return x; else return gcd1(y,x%y);}但是取模运算的开销很大,可以考虑使用x-y替代,因为x,y,x-y一定具有相同的最大公约数。int gcd2(int x,int y){ if(x<y) return gcd2(y,x); if(y==0) return x; else return gcd2(y,x-y);}编程之美2.7节又提供了两种方法结合。gcd(x,y)=gcd(p*x1,y)... 阅读全文
posted @ 2012-07-18 20:49 freewater 阅读(302) 评论(0) 推荐(0)
摘要: //输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.//n=10, m=9output:/*9 18 27 37 2 16 46 3 15 4 15 3 24 3 2 1*/vector<int> factors; 1 void findFactor2(int sum,int n){ 2 if(sum<0||n<0) 3 return ; 4 if(sum==0){ 5 for(vector<int>::iterator iter=factors.begin();i... 阅读全文
posted @ 2012-07-16 10:55 freewater 阅读(1970) 评论(0) 推荐(0)
摘要: 递归生成排列和组合 1 void doPermute(char str[],char result[],bool used[],int length,int level){ 2 if(level==length){ 3 cout<<result<<endl; 4 return; 5 } 6 7 for(int i=0;i<length;i++){ 8 if(!used[i]){ 9 result[level]=str[i];10 used[i]=true;11 ... 阅读全文
posted @ 2012-07-15 23:19 freewater 阅读(243) 评论(0) 推荐(0)
摘要: 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中删除第m个元素。在参考代码中,我们用STL中std::list来模拟这个环形列表。由于list并不是一个环形的结构,因此每次跌代器扫描到列表末 阅读全文
posted @ 2012-07-15 21:25 freewater 阅读(359) 评论(0) 推荐(0)
摘要: 求二叉树中节点的最大距离...如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。ANSWER:This is interesting... Also recursively, the longest distance between two nodes must be either from root to one leaf, or between two leafs. For the former case, it’s the tree height. For th 阅读全文
posted @ 2012-07-15 10:14 freewater 阅读(222) 评论(0) 推荐(0)