百度面试题

来源:互联网 发布:you don t know js 编辑:程序博客网 时间:2024/06/05 08:14

百度面试题

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客: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为数组的长度


// 函数定义// 方法二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(n),

查表时间 O(1)

实验

方案一

对于1-1000,000数据操作,时间处理为 187186 ms


方案二

对于1-1000,000数据操作,时间处理为 12698 ms



0 0
原创粉丝点击