手撕代码:统计1到n二进制数中1出现的总次数
2024-09-05 23:41:23
题目描述:
互娱手撕代码题。
统计从1到n这n个数的二进制表示中1出现的次数。
思路分析:
思路一:直接的做法是从1遍历到n,对于每个数和1做与操作,之后,对于这个数不断做右移操作,不断和1做与操作,直到当前数为0。这样的算法复杂度为O(nlogn)。
思路二:优化时间复杂度,那么考虑用空间换时间。利用n&(n-1)这个操作可以去掉末尾的1。利用递推f(n) = 1+f(n&(n-1))。这样就是利用空间来换时间,时间复杂度为O(n)。
代码:
思路一:
int numZeros(int n)
{
int res=;
for(int i=; i<=n; i++)
{
while(i>)
{
if(i&==)
res++;
i = i>>;
}
}
return res;
}
思路二:
int numZeros(int n)
{
vector<int>f(n+, );
int res=;
for(int i=; i<=n; i++)
{
f[i] = +f[i&(i-)];
res += f[i];
}
return res;
}
最新文章
- Centos挂载第二块硬盘
- Nova PhoneGap框架 第三章 页面
- ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015
- Django model.py表单的默认值 默认允许为空
- OpenSesame:一个能够攻击fixed-pin设备的工具
- php大力力 [024节]PHP中的字符串连接操作(2015-08-27)
- 静态HTML页面不缓存js文件的方法
- Adding Multithreading Capability to Your Java Applications
- 编译安装HTTPD 2.4.9版本
- BYTE、WORD与DWORD类型
- 分布式缓存BeIT Memcached简介
- java日期处理总结(二)
- Android Bug 记录
- 使用ORACLE SQL Tuning advisor快速优化低效的SQL语句
- C/S通信模型和相关技术要点
- Read The Docs搭建
- 基于springboot的SSM框架实现返回easyui-tree所需要数据
- Linux之ansible 常用模块
- bat如何实现多台android设备同时安装多个apk
- [Oracle]构筑TDE 环境的例子
热门文章
- .net core EF Core 视图的应用
- A Pattern Language for Parallel Application Programming
- C# MySQL,Dapper Trans,list
- ConsoleColor原来有16种, enumData.GetValue(i)
- Winform中设置ZedGraph的颜色填充使用Fill
- Effective Python 编写高质量Python代码的59个有效方法
- Winform中使用FastReport的PictureObject时通过代码设置图片源并使Image图片旋转90度
- React中的三大属性
- 英语JASPERITE碧玉Jasperite单词
- Android四大组件:BroadcastReceiver 介绍