免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liqingfang
打印 上一主题 下一主题

0618百度C/C++平台开发工程师二面试题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-06-22 10:27 |只看该作者
2.2 用bitmap做。

如果是32位整数,则耗费0xffff*8 = 512K 内存,遍历第一个数组,在相应的位置上置1;然 ...
noword2k 发表于 2011-06-21 13:27


bitmap只能讲数据缩小32倍,也就是 说 32位整数 要耗的内存是0x111ff =  2^(27) = 128M 内存

论坛徽章:
0
22 [报告]
发表于 2011-06-22 10:35 |只看该作者
第一题随手做了下,欢迎大家指正交流
  1. #include <stdio.h>

  2. #define BASE 26

  3. int revert(const char*);
  4. int pow(int, int);

  5. int main(int argc, char** argv)
  6. {
  7.     if(argc != 2)
  8.     {
  9.         printf("Args not correctly supplied\nUsage:revert message\n");
  10.         exit(1);
  11.     }

  12.     int res = revert(argv[1]);

  13.     if(res != -1)
  14.     {
  15.         printf("Revert of %s is:%d\n", argv[1], res);
  16.     }
  17.     else
  18.     {
  19.         printf("Illegal message string\n");
  20.     }

  21.     return 0;
  22. }

  23. int revert(const char* message)
  24. {
  25.     int res = 0;
  26.     char* pch = message;
  27.    
  28.     while(*pch != '\0')
  29.     {
  30.         pch++;
  31.     }
  32.     pch--; //pch now point to the last character of message

  33.     int bitCount = 0;
  34.     int tmpval;
  35.     while(1)
  36.     {
  37.         if( *pch >= 'a' && *pch <= 'z')
  38.         {
  39.             tmpval = *pch - 'a' + 1;
  40.         }
  41.         else if(*pch >= 'A' && *pch <= 'Z')
  42.         {
  43.             tmpval = *pch - 'A' + 1;
  44.         }
  45.         else
  46.         {
  47.             printf("Message String contain illegal char, return error!\n");
  48.             return -1;
  49.         }


  50.         res += tmpval*pow(BASE, bitCount);
  51.         bitCount++;

  52.         if(pch == message)
  53.         {
  54.             break;
  55.         }
  56.         else
  57.         {
  58.             pch--;
  59.         }
  60.     };

  61.     return res;
  62. }

  63. /**
  64. *  Ugly pow function, DO NOT use it anywhere else
  65. */
  66. int pow(int base, int index)
  67. {
  68.     if(index == 0)
  69.     {
  70.         return 1;
  71.     }
  72.     else
  73.     {
  74.         return base*pow(base, index-1);
  75.     }
  76. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2011-06-22 10:41 |只看该作者
回复 17# snowpinex


    可以唯一确定,那好不好恢复呢? 恢复费事吗

论坛徽章:
0
24 [报告]
发表于 2011-06-22 12:51 |只看该作者
回复 23# goldenfort

我只是将我的第一想法给写出来,那时还没考虑效率;恢复时可以用递归算法,之前写过一个

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
25 [报告]
发表于 2011-06-22 15:06 |只看该作者
bitmap只能讲数据缩小32倍,也就是 说 32位整数 要耗的内存是0x111ff =  2^(27) = 128M 内存
ydfgic 发表于 2011-06-22 10:27



    我算错了,应该是4G/8 = 512M内存。

论坛徽章:
0
26 [报告]
发表于 2011-06-22 16:12 |只看该作者
第一题:
//暂不考虑size <0
int power(int size,int base)
{
        int i = 0;
        int result = 1;
        printf("%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
        while(i < size)
        {
                result = result*base;
                i++;
        }
        printf("%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
        return result;
}
int  strToInt(char *string)
{
        int len = strlen(string);
        int result = 0;
        int i = 0;
       
        if(string == NULL)
        {
                return -1;
        }
        printf("%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
        printf("strlen(string)=%d\n",strlen(string));
        printf("string=%s\n",string);
        while(string[i] != '\0')
        {
                //'A'=65,26进制
                result += (string[i]-64)*power(len - i - 1,26);
                i++;
                printf("%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
        }
        printf("%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
        return result;
}

int main()
{
        char str[4] = "ABC";
        int result = 0;

        printf("%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
        result = strToInt(str);
        printf("result=%d\n",result);
        return 0;
}

论坛徽章:
0
27 [报告]
发表于 2011-06-22 16:14 |只看该作者
第二题2)
先对两个数组分别快排
int   merge(int *a,int asize,int *b,int bsize,int *c)
{
        int i = 0;
        int j = 0;
        int        k = 0;
        int times = 0;
       
        for(; i<asize; i++)
        {       
                while(a[i] > b[j])
                {
                        j++;
                }
               
                if(a[i] < b[j])
                {
                        continue;
                }
                else
                {
                        c[k] = a[i];
                        k++;
                        j++;

                }
        }


        return 0;
}

论坛徽章:
0
28 [报告]
发表于 2011-06-22 16:18 |只看该作者
2(1):
<parent>
      <lchild>
          <>
              <>
              <>
          <>
      <lchild>
      <rchild>
          <>
              <>
              <>
          <>
      <rchild>
<parent>

论坛徽章:
0
29 [报告]
发表于 2011-06-22 16:44 |只看该作者
百度果然猛!敢想不敢写……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
30 [报告]
发表于 2011-06-22 16:51 |只看该作者
回复 1# liqingfang


   关于写二叉树 那个,  遍历时直接 记录从根 到 当前节点的 左右左。。。。序列就可以了, 每个左右只要一个bit. 恢复也非常快速。

不过保存二叉树 到 disk,  比 保存数据,用程序构建  二叉树  好处在哪里呢?  

这就是个专门考人的题目吧,实用价值比较小
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP