百度面试题
个人信息:就读于燕大本科软件工程专业 目前大三;
本人博客:google搜索“cqs_2012”即可;
个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;
博客时间:2014-5-14;
编程语言:C++ ;
编程坏境:Windows 7 专业版 x64;
编程工具:vc++ 6.0;
制图工具:office 2007 powerpoint;
硬件信息:7G-3 笔记本;
真言
题目与其当观众,就不如上舞台。
思路实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数
,则对n除以2;否则进行加一或者减一。一直得到1为止。
例如对于 5
5-1 得到 4
4 除以2 得到 2
2 除以2 得到 1
一共三次操作。
1.严格解法
// 函数定义 // 方法1: int Number(int n) { int m,l; // 异常出入 if( ! (n>0)) return -1; // n 为偶数 if(n%2 == 0) { return Number(n/2)+1; } // n 为奇数 else{ // 出口 if(n == 1) return 0; m = Number(n+1); l = Number(n-1); if(m<l) return m+1; else return l+1; } }
时间复杂度 O(log n)2.动态规划方法,建立一维表进行预处理,适合对大量数据进行查找操作
预处理操作,把预处理数据存在data数据表里,size为数组的长度
实验预处理时间为 O(n),// 函数定义 // 方法二 void _PreDeal(int * data,int size) { int i,j; if(data != NULL && size > 0) { // 头处理一下 data[1] =0; data[2] =1; //循环处理 for(i =4,j=3;i<=size;i= i+2,j=j+2) { //处理偶数: m = m/2 +1; data[i] = data[i/2]+1; //处理奇数: m = min(min+1,min-1)+1; data[j] = (data[j+1]<data[j-1])?data[j+1]+1:data[j-1]+1; } // 处理最后一个数据 if(j<=size) //处理奇数: m = min(min+1,min-1)+1; data[j] = (data[j+1]<data[j-1])?data[j+1]+1:data[j-1]+1; } }
查表时间 O(1)
方案一
对于1-1000,000数据操作,时间处理为 187186 ms
方案二
对于1-1000,000数据操作,时间处理为 12698 ms