zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第5章:位操作——题目7

    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
    ", tot_sum - sum);
    37         
    38         v.clear();
    39     }
    40     
    41     return 0;
    42 }
  • 相关阅读:
    Android 下载资源后刷新的方法,相关文章
    【Android】SDK和API Level版本的对应关系
    Android微信分享报错
    细解android之图片下载(无任何框架)
    约束布局ConstraintLayout
    Android 学习资料
    Android 相关库、工具
    Android 常见报错及解决
    Kotlin 学习资料
    Vue3.0 新特性以及使用经验总结
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3610490.html
Copyright © 2011-2022 走看看