程序员面试宝典题目-基础篇

高效算法与技术实践

1、判断X是否为2^N,不能使用循环

解:2、4、8、16...对应的二进制分别为:10、100、1000、1000... 将X与(X-1)作位与运算,答案为0才是

答案:!(X&(X-1))

2、不使用if、switch、?:找出两个数中的最大值

答案:int max = (a+b+abs(a-b))/2

3、将a、b值交换,不使用中间变量

答案:a = a^b; b = a^b; a = a^b;   (^:按位异或)

4、使用预处理#define声明一个常数,表示一年有多少秒

答案:#define SECOND_PER_YEAR (365*24*60*60) UL

注:考察#define结尾无分号;365*24*60*60得使用无符号长整型存储

5、写一个标准宏,返回两个参数中较小的一个

#define MIN (A, B)  ( (A) <= (B) ? (A) : (B))

6、const与#define的区别

答:都可以定义常量。const有数据类型,编译器可以进行类型安全性检查;#define只进行字符串替换,无类型安全性检查

7、交换两个数

void swap(int *p, int *q)
{
	int tmp;
	tmp = *p;
	*p = *q;
	*q = tmp;
}
void swap(int &p, int &q)
{
	int tmp;
	tmp = p;
	p = q;
	q = tmp;
}

8、求N的阶乘

(1)递归

int Fact(int n)
{
	if(1 == n)
		return 1;
	else return n * Fact(n-1);
}

(2)循环

int Fact(int n)
{
	int var = 1;
	while(n>0)
	{
		var *= n;
		n --;
	}
	return var;
}

9、菲波那切数列

//菲波那切数列(n个)
void Fibonacci(int n)
{
	int c = 0;
	int a = 1, b = 1;
	if(n < 2)
		cout << a << endl;
	if(2 == n)
		cout << a << " " << b << endl;
	else
	{
		cout << a << " " << b << " ";
		for(int i=2; i<n; i++)
		{		
			c = a + b;
			cout << c << " ";
			a = b;
			b = c;
		}
		cout << endl;
	}
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值