百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。
这种类似的题很多,今天之所以写出来,主要是实际体验一下这么多数据的情况下,到底速度怎么样。如果不考虑空间,其实最简单的就是利用计数排序的方法进行,时间复杂度为N+M.下面是我的实现:
private const uint Nums = 10000000;
private const uint MaxNum = 100000000;
private void button2_Click(object sender, EventArgs e)
{
//保存32位基数1,2,4,8,16.....,不必每次都进行位移.
UInt32[] theBases = new UInt32[32];
UInt32 theDigit = 1;
for(int i=0;i<32;i++)
{
theBases[i] = theDigit;
theDigit = theDigit << 1;
}
TimeSpan theTS1 = new TimeSpan(DateTime.Now.Ticks);
//读取文件,二进制比文本格式要快很多,而且空间需求也小。
System.IO.FileStream theFS = new System.IO.FileStream("D:\\tempnum.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.StreamReader theBR = new System.IO.StreamReader(theFS);
UInt32 theNum, theTmp;
UInt32 theIndex = 0;
//计算总共需要的数组空间,因为每个无符号整数代表32个数,则总共需要N/32+1个无符号整数.
UInt32 theArrayTop = (MaxNum >> 5) + 1;
UInt32[] theNumbers = new UInt32[theArrayTop];
UInt32 iPos = 0;
try
{
//读文件,直到结束.
while (theBR.EndOfStream==false)
{
theNum = uint.Parse(theBR.ReadLine());
iPos = (theNum - 1) & (uint)31;//计算在一个表示整数中的位置。
theIndex = (theNum - 1) >> 5;//计算在第几个无符号整数,数组下标.
theTmp = theNumbers[theIndex];//获取theIndex指向的无符号整数.
theTmp = theTmp | theBases[iPos];//设置当前表示位置为1,存在.
theNumbers[theIndex] = theTmp;
}
}
catch
{
}
finally
{
theBR.Close();
theFS.Close();
theFS.Dispose();
}
//遍历,并把不存在的数写入文件.
System.IO.FileStream theFS1 = new System.IO.FileStream("D:\\tempnum1.txt", System.IO.FileMode.CreateNew, System.IO.FileAccess.Write);
System.IO.StreamWriter bw1 = new System.IO.StreamWriter(theFS1);
for (UInt32 i = 0; i < MaxNum; i++)
{
//计算当前整数所在整数和整数中的位置.
iPos = i & 31;//(===i%32)
theIndex = i >> 5;//(=== i / 32 整除)
theNum = theNumbers[theIndex];
//测试代表位如果为0,表示不存在,则输出.
if ((theNum & theBases[iPos]) == 0)
{
bw1.WriteLine(i + 1);
}
}
bw1.Flush();
bw1.Close();
theFS1.Close();
theFS1.Dispose();
TimeSpan theTS2 = new TimeSpan(DateTime.Now.Ticks);
this.textBox1.Text = theTS2.Subtract(theTS1).Seconds.ToString();
}
我用二进制输入和输出,对于1亿个随机数的情况下在我的机器上花费的时间是26秒,用文本输入和输出,1千万随机数用了接近1分钟。
分享到:
相关推荐
1. 数据结构与算法面试准备:文章提到的是微软和百度的面试题,这提示我们对于准备面试,特别是那些知名的科技公司,需要对数据结构和算法有深入的了解和准备。这包括但不限于对二元查找树、双向链表等基本数据结构...
**总结**:本篇文章详细介绍了百度最新面试题集锦中的三道典型题目及其解答过程,包括到达1的最短步骤数、查找不可生成的数以及URL重叠问题。通过这些题目的解答,我们可以看到算法设计和优化的重要性。在实际面试中...
本书《算法面试题100道for阿里、百度、腾讯、京东、美团、今日头条.pdf》是一份面向希望进入中国顶尖互联网公司(如阿里、百度、腾讯、京东、美团、今日头条等)工作,尤其是软件开发岗位的求职者,所准备的面试材料...
### 百度持续交付项目组面试题解析 #### 计算机基础 ##### 数据结构、算法 **代码实现快速排序** 快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子...
### 百度历年面试题答案解析 ...通过以上分析,我们可以看到,百度面试题涵盖了从概率题到数据库索引、再到Session管理等多个领域的问题,旨在全面考察应聘者的逻辑思维能力、计算机基础知识以及对实际应用场景的理解。
### 百度INF面试题库知识点总结 #### 1. 长方形个数计算 - **题目背景**:此题考察的是对于二维空间中坐标点的理解和处理能力。 - **核心知识点**: - 二维空间中的点坐标表示方法。 - 如何通过点坐标确定矩形。 ...
### 百度面试题集锦解析 #### 题目一:重叠区间长度计算 **题目描述**: 本题要求实现一个函数`size_t foo(unsigned int *a1, size_t al1, unsigned int *a2, size_t al2)`,该函数接收两个无符号整数数组`a1`与`...
### j2ee面试题大汇总知识点解析 #### 一、面向对象的基本特征 1. **抽象** 抽象是面向对象编程的核心概念之一,指的是在设计阶段仅关注对象的关键特性和行为,忽略不必要的细节。它可以帮助我们构建更加简洁、...
在Java中,DCL(Double Check Locking)是一种常见的实现方式,但在多线程环境下,如果不使用volatile,可能存在指令重排导致线程安全问题。通过将instance声明为volatile,可以避免指令重排,确保线程安全。 总结...
这只是部分问题的解答,面试题涵盖了Python基础、高级特性、文件操作、错误处理、数据结构、面向对象编程等多个方面。通过深入理解和实践这些知识点,能够提升Python编程能力,并在面试中表现出色。
【百度面试题】是互联网公司百度在招聘过程中用于考察应聘者技术能力与综合素质的一系列问题。面试过程通常包括电面(电话面试)和现场面试,旨在了解候选人的专业技能、解决问题的能力以及对技术的热情。 在描述中...
5. **数学问题**:涉及到数学计算,如整数除法的实现、判断一个数是否为另一个数的平方、计算阶乘末尾零的数量等,这考验的是基本数学理论的应用和算法的巧妙设计。 ### 编程基础 1. **内存管理**:题目要求实现...
根据提供的文件信息,我们可以整理出以下关于C/C++的一些经典问题和面试题的知识点: ### 1. 关于指针的常量限定符 - `const char *`:指向字符的指针,所指向的数据不可修改。 - `char const *`:同上,这种写法...
微软面试题中经常出现涉及树结构的问题,递归是解决这类问题的常用方法之一。文件中提出了两种递归思路: - 思路一:先递归地将左子树和右子树分别转换为双向链表,然后将左右链表与根节点连接起来。 - 思路二:...
5. **查找中位数问题**: - 当数据量极大时,需要通过有效的算法来减少内存使用,比如使用快速选择算法。 ### C/C++基础知识点 1. **智能指针原理和实现**: - 智能指针是一种资源管理类,它使得手动管理内存变...
1. **面试环境**:面试当天感受到百度办公环境的繁忙与紧张,但也存在前台接待人员态度不佳的情况,这可能会影响应聘者对公司的整体印象。 2. **面试文化**:从面试过程中可以看出,百度注重技术能力和解决问题的...