2014-05-12 07:44

题目链接

原题:

  1. Given an array having unique integers, each lying within the range <x<, how do u sort it. U can load only numbers at a time in memory.

题目:一个数组里有16000个不重复的整数,所有元素都在1和20000之间。如果你一次至多能在内存里放1000个整数,你要如何排序整个数组?

解法1:这个题目表述是不是有问题?数组本身就是内存的数据吧?内存装不下还叫数组?既然所有元素都是不重复的,就可以用位向量了。用位向量标记,就可以通过一次扫描来排序所有元素了。如果按照一个整数4字节的话,1000个整数有4000字节,总共32000个位,是足够覆盖数据范围的。如果按照16位整数来算,这个算法就不可行了。《编程珠玑》和《Cracking the Coding Interview》上都有类似的题目。内存限制是任何时候都要考虑的实际问题。如果资源总是无限的,这个世界也就没问题需要解决了。

代码:

  1. // http://www.careercup.com/question?id=23123665
  2. // all numbers are unique.
  3. #include <cstdio>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9. const int MAXN = ;
  10. FILE *fin, *fout;
  11. unsigned bit[MAXN >> ];
  12. int i;
  13.  
  14. memset(bit, , MAXN / );
  15.  
  16. fin = fopen("in.txt", "r");
  17. while (!feof(fin)) {
  18. fscanf(fin, "%u", &i);
  19. bit[i >> ] |= ( << (i & ));
  20. }
  21. fclose(fin);
  22. fin = nullptr;
  23.  
  24. fout = fopen("out.txt", "w");
  25. for (i = ; i < MAXN; ++i) {
  26. if (bit[i >> ] & ( << (i & ))) {
  27. fprintf(fout, "%u\n", i);
  28. }
  29. }
  30. fclose(fout);
  31. fout = nullptr;
  32.  
  33. return ;
  34. }

解法2:如果元素存在重复的话,就不能用位向量了。可以用数组来分段统计每个数据范围元素出现的个数,这样能通过多次扫描达到排序的效果。

代码:

  1. // http://www.careercup.com/question?id=23123665
  2. // may contain duplicates.
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10. const int MAXN = ;
  11. const int n = ;
  12. FILE *fin, *fout;
  13. int count[n];
  14. int i, j;
  15. int offset;
  16.  
  17. fin = fopen("in.txt", "r");
  18. fout = fopen("out.txt", "w");
  19. if (fin == nullptr || fout == nullptr) {
  20. printf("File doesn't exist.\n");
  21. exit();
  22. }
  23.  
  24. offset = ;
  25. while (offset < MAXN) {
  26. memset(count, , n * sizeof(int));
  27.  
  28. fseek(fin, , SEEK_SET);
  29. while (!feof(fin)) {
  30. fscanf(fin, "%d", &i);
  31. if (i >= offset && i < offset + n) {
  32. ++count[i - offset];
  33. }
  34. }
  35.  
  36. for (i = ; i < n; ++i) {
  37. for (j = ; j < count[i]; ++j) {
  38. fprintf(fout, "%d\n", i + offset);
  39. }
  40. }
  41.  
  42. offset += n;
  43. }
  44. fclose(fin);
  45. fin = nullptr;
  46. fclose(fout);
  47. fout = nullptr;
  48.  
  49. return ;
  50. }

Careercup - Microsoft面试题 - 23123665的更多相关文章

  1. Careercup - Microsoft面试题 - 6314866323226624

    2014-05-11 05:29 题目链接 原题: Design remote controller for me. 题目:设计一个遥控器. 解法:遥控什么?什么遥控?传统的红外线信号吗?我只能随便说 ...

  2. Careercup - Microsoft面试题 - 6366101810184192

    2014-05-10 22:30 题目链接 原题: Design database locks to allow r/w concurrency and data consistency. 题目:设计 ...

  3. Careercup - Microsoft面试题 - 24308662

    2014-05-12 07:31 题目链接 原题: I have heard this question many times in microsoft interviews. Given two a ...

  4. Careercup - Microsoft面试题 - 5700293077499904

    2014-05-12 00:02 题目链接 原题: For a given map (ie Bing map) given longitude/latitude/ how would you desi ...

  5. Careercup - Microsoft面试题 - 5204967652589568

    2014-05-11 23:57 题目链接 原题: identical balls. one ball measurements ........ dead easy. 题目:9个看起来一样的球,其中 ...

  6. Careercup - Microsoft面试题 - 5175246478901248

    2014-05-11 23:52 题目链接 原题: design an alarm clock for a deaf person. 题目:为聋人设计闹钟? 解法:聋人听不见,那么闪光.震动都可行.睡 ...

  7. Careercup - Microsoft面试题 - 5718181884723200

    2014-05-11 05:55 题目链接 原题: difference between thread and process. 题目:请描述进程和线程的区别. 解法:操作系统理论题.标准答案在恐龙书 ...

  8. Careercup - Microsoft面试题 - 5173689888800768

    2014-05-11 05:21 题目链接 原题: Complexity of a function: int func_fibonacci ( int n) { ) { return n; } el ...

  9. Careercup - Microsoft面试题 - 6282862240202752

    2014-05-11 03:56 题目链接 原题: Given an integer array. Perform circular right shift by n. Give the best s ...

随机推荐

  1. oracle中查找与已知表的数据库对象

    在此次情况中,业务顾问就给我提供了一张客户公司客户化的Form,然后让找出界面上的数据是怎样生成的. 首先我们从EBS form 界面上找到了界面的数据来源于一张表ks_so_line_margin_ ...

  2. js对jsonArray的操作

    上一篇写了关于java中Gson对jsonArray的排序处理,这里介绍js中对jsonArray处理, <!DOCTYPE html> <html> <head> ...

  3. 转:ZedGraph 各属性含义(中文)

    简介:ZedGraph 是一个开源的.NET图表类库, 全部代码都是用C#开发的.它可以利用任意的数据集合创建2D的线性和柱形图表. 属性名称 属性值.作用 MasterPane 一个类对象管理多个G ...

  4. 跨平台移动开发phonegap/cordova 3.3全系列教程-目录

    目录(更新完成后会附上源码供参考) 第一章 android平台开发 phonegap/cordova简介 1.开发环境搭建 2.helloworld 3.启动画面 4.结合asp.net/jqmboi ...

  5. 《Unity預計算即時GI》笔记:三、Clusters和总结

    Clusters 叢集,透過修改叢集(Clusters)也是一個降低Unity預計算流程所需要執行的工作數量的好方法.降低叢集數量也能提高執行時的效能. 當採用PRGI來計算場景光照時,Unity會簡 ...

  6. F5-WAF-12.0

    平台: CentOS 类型: 虚拟机镜像 软件包: f5bigip basic software security waf 服务优惠价: 按服务商许可协议 云服务器费用:查看费用 立即部署 产品详情 ...

  7. LeetCode Rotate Array 翻转数组

    题意:给定一个数组,将该数组的后k位移动到前n-k位之前.(本题在编程珠玑中第二章有讲) 思路: 方法一:将后K位用vector容器装起来,再移动前n-k位到后面,再将容器内k位插到前面. class ...

  8. Linux学习记录(二)

    1.远程连接工具的使用 实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH ...

  9. Linux下Jenkins与GitHub自动构建NetCore与部署

    今天我们来谈谈NetCore在Linux底下的持续集成与部署.NetCore我就不多介绍了,持续集成用的是Jenkins,源代码管理器用的是GitHub.我们就跟着博文往下走吧. 1.Linux环境 ...

  10. 【搜索】【入门】洛谷P1036 选数

    题目描述 已知 n个整数x1​,x2​,…,xn​,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...