一道华为的面试算法题
题目
计算1~n中每个数的二进制表示中1的个数之和,例如f(5)=7, f(6)=9
思路:
把n表示成二进制形式,从前往后考虑所有1出现的位置,
对于第i为为1,
如果选0,后面n位可以任选,1的个数:
如果选1,1的个数等于后缀的大小+1, 0~后面的值
当然,现实的时候,可以从低位往高位累加
应该用数位DP也能做吧
不到10行代码
int cal(int x) {
int res = 0;
for(int i = 0;i < 32;i++) {
if(x & (1<<i)) {
res += i*(1<<(i-1)) + (x&((1<<i)-1)) + 1;
}
}
return res;
}
个性签名:时间会解决一切
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-09-16 UVa10828 Back to Kernighan-Ritchie——概率转移&&高斯消元法
2019-09-16 高斯消元法【模板】
2019-09-16 转成p进制算法C语言
2018-09-16 迷宫问题——最短路
2018-09-16 用dfs遍历联通块(优化)
2018-09-16 用dfs求联通块(UVa572)