编程珠玑第九章——习题

习题7 给定一个非常长的字节序列(假设有十亿或万亿),如何高效的统计1的个数

方法一:(算法的时间复杂度就是1的个数)
[html] view plaincopy
//& 按位与  只要两个相同位同时为 1 则该位为 1    
//7&5   0111 & 0101 = 0101 (5)  
int OneCount(unsigned int x)  
{  
  int count;  
  for(count=0; x>0; count++)  
    x&=x-1;//把最后面的1变0  
  return count;  
}  

               方法二:
[html] view plaincopy
const int idx[256]={0,1,1,……,8}//0~255中含1的个数  
int OneCount(unsigned int x)  
{  
  int count=0;  
  for(; x>0; x>>=8)  
     count+=idx[x&255];  
  return count;  
}  

上面方法1利用的是把一个整数减去1,再和原来的整数做与运算,会把整数最右边一个1变为0。那么一个整数的二进制表示中就会少一个1,可以进行多少次这样的操作,那么整数中就有多少个1.

上面方法2中利用的是查表法,但是如果是建立一个有字节序列那么长的表肯定是不可行的,所以采用了滑动窗口的方法。取滑动窗口为256位,那么我们只需构造一个有256位的表就可以 了。

习题8  在程序中如何使用哨兵找出数组中的最大元素

#include "stdio.h"
int main()
{
	int i;
	int max;
	int a[100];
	for(i=0;i<100;++i)
		a[i]=i;
	
	i=0;
	while(i<100)
	{
		max=a[i];
		a[100]=max;
		++i;
		while(a[i]<max)//直到找到比刚才的大的元素 
			i++;
	}
	
	printf("%d\n",max);
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值