08 2012 档案
摘要: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...
阅读全文
摘要:一、题目概述:有一个没有排序,元素个数为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最接近的那个和,这便是答案。这个算法的时间复杂
阅读全文
摘要:十一、从头到尾彻底解析Hash 表算法作者:July、wuliming、pkuoliver出处:http://blog.csdn.net/v_JULY_v。说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。------------------------------------第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万
阅读全文
摘要:面试中的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 }; “那请你讲解一下该实现的各组成。”面试官的脸上仍然...
阅读全文
摘要:作者:小飞 原文地址: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)的最优解。我在面试时碰到了这道题的一道有趣变体,即同样给定一个数组,写一个在其中找出不连续子数组和的最大值,也就是说子数组..
阅读全文
摘要: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
阅读全文
摘要:1 public static void insertSort(int[] a){ 2 for(int j=1;j<a.length;j++){ 3 int key=a[j]; 4 int i=j-1; 5 while(i>=0&&key<a[i]){ 6 a[i+1]=a[i]; 7 i--; 8 } 9 a[i+1]=key; 10 } 11 } 1...
阅读全文
posted @ 2012-08-13 20:08
freewater
摘要:1 char* myitoa(int x,char* str){ 2 assert(str!=0); 3 4 int negPos=-1; 5 if(x<0){ 6 negPos=0; 7 str[negPos]='-'; 8 x*=-1; 9 } 10 11 int i,j; 12 i=j=negPos+1; 13 do{ 14 str[j++]=x%10+'0'; 15 x/=10; 16 }while(x!=0); 17 ...
阅读全文
posted @ 2012-08-13 20:07
freewater
摘要:#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];...
阅读全文
摘要:问题描述:程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内的m个随机整数,要求:每个数选择出现的概率相等,且按序输出。该题目是从《编程珠玑》的第12章看到的。 学习过概率统计的同学应该都知道每一个数字被抽取的概率都应该为m/n. 那么我们怎么构造出这样的概率呢?在《编程珠玑》上面是这样解析的: 依次考虑整数0,1,2,.....,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,我们可以保证输出结果是有序的。 假如我们考虑m = 2,n = 5的情况,那么选择的每一个数字的概率都应该是2/5,我们怎么样才能做到呢?不慌张,慢慢来。 下面给出我的分析过程
阅读全文
摘要:/*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++; ...
阅读全文
摘要:/*方案一:每次循环左移一位,移动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个...
阅读全文

浙公网安备 33010602011771号