2014-03-19 06:27
题目:有一个数组里包含了0~n中除了某个整数m之外的所有整数,你要设法找出这个m。限制条件为每次你只能用O(1)的时间访问第i个元素的第j位二进制位。
解法:0~n的求和有公式可循,只要把所有数都加起来就能知道缺少的m是几了。书本提供了一种比较高效的解法,我仔细读了以后觉得书上给的优化算法实际上需要额外的空间来支持,coding难度偏高,临场的话我估计挺难写出来的。
代码:
1 // 5.7 Find the missing integer from 0 to n, you may only access one bit at a time. 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 inline int getBit(vector<int> &v, int i, int j) 7 { 8 return !!(v[i] & (1 << j)); 9 } 10 11 int main() 12 { 13 int n; 14 int mis; 15 int i, j; 16 long long int sum; 17 long long int tot_sum; 18 vector<int> v; 19 20 while (scanf("%d%d", &n, &mis) == 2) { 21 tot_sum = (1ll + n) * n / 2; 22 sum = 0; 23 for (i = 0; i <= n; ++i) { 24 if (i == mis) { 25 continue; 26 } 27 v.push_back(i); 28 } 29 30 sum = 0; 31 for (i = 0; i < n; ++i) { 32 for (j = 0; j < 32; ++j) { 33 sum += (getBit(v, i, j) << j); 34 } 35 } 36 printf("%lld\n", tot_sum - sum); 37 38 v.clear(); 39 } 40 41 return 0; 42 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)