剑指offer chapter 2

Q3. 二维数组中查找指定的数

递归:  从右上角开始比较

Find(int* matrix, int col, int row)
	if matrix == NULL || col ==-1 || row == -1
		return 0;
	if matrix[col][row] == val
		return 1;
	else if val > matrix[col][row]
		return Find(matrix, col+1,row);
	else if val < matrixmatrix[col][row]
		return Find(matrix, col,row-1);
	


Q6. 重建二叉树

由前序和中序遍历结果重建二叉树。


Q 二分查找


Q 快速排序

与经典的快速排序对比;对各种排序的特点,时间空间烂熟于胸;


Q 计数排序
// 对大量的员工的年龄排序,数值范围有限,但数量可能很多,因此
// 用计数排序能在0(n)时间内完成
CountSort(int ages[], int len)
	if ages == NULL || len <= 0
		return
	const int oldestAge = 99;
	int ageSort[oldestAge+1];  // 用来对年龄计数,最大99岁
	memset(ageSort,0,(oldestAge+1)*sizeof(int));
	
	for int i = 0 to len
		if ages[i] < 0 || ages[i] > oldestAge
			return
		++ageSort[ages[i]];
	
	int j = 0;
	for int m =0 to oldestAge + 1
		for int n = 0 to ageSort[m]
			ages[j++] = m;
	


Q8


Q9 Fibonacci数列

// Fibonacci数列的0(n)算法当然是从F(0), F(1)...的顺序计算
long long Fibonacci(int n)
	if n <= 2
		return n
	int fbr0 = 0, fbr1 = 1;
	int fbrn = fbrnminusOne = fbrnminusTwo = 0;
	fbrnminusOne = fbr1; fbrnminusTwo = fbr0;
	for int i = 2 to n
		fbrn = fbrnminusOne + fbrnminusTwo;
		fbrnminusOne = fbrn;
		fbrnminusTwo = fbrnminusOne;
	
	return fbrn;


Q10 二进制中1的的个数

法1:用1依次与整数中的位进行与操作

NumOf1(int n)
	int a = 1;
	int count = 0;
	while(n)
		if a&n != 0
			++count;
		a<<1;
	return count;

法2:将数n与n-1相与;

分析:

如n = 1100, n - 1 = 1011;    因此,将数-1就是将其最右边的1变为0,1后面的0变成1,相与后有:n&n-1 = 1000;

因此,得到的结果是少了一个1;

NumOf1(int n)
	int count = 0;
	while(n)   // n>0则说明二进制含有1
		++count;
		n = n&(n-1);  // 化去最右边的1

	return count;



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值