百度面试题

百度面试题

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

本人博客: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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值