2013网易实习生招聘笔试题

选择题:

1、二维数组int a[3][4],下列能表示a[1][2]的是?

A.*(*(a+1)+2)    B.*(a+3)    C.(&a[0]+1)[2]    D.(a[0]+1)

2、short a[100],则sizeof(a)的值是?

A.2     B.4    C.200    D.400

问答题:

1、解释说明static、const和volatile两个关键字的作用?

关键字static有三个明显的作用:
1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2、 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

const 有什么用途?
1、可以定义 const 常量
2、const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

volatile问题:

volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。。。
volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自作出有关数据的任何假设——在优化起家这是特别重要的。如果编译器说:“我已经把数据读入寄存器,而且在没有与寄存器接触。”在一般情况下,它不需要再读入这个数据。但是,如果数据是volatile修饰的,编译器则是不能做出这样的假定,因为数据可能被其他进程改变了,编译器必须重新读这个数据而不是优化这个代码。就像建立const对象一样,程序员也可以建立volatile对象,甚至还建立const volatile对象。这个对象不能被程序员改变,但可通过外面的工具改变。
volatile对象每次被访问时必须重新读取这个变量的值,而不是用保存在寄存器中的备份。下面时volatile变量的几个例子:
.并行设备的硬件寄存器(如状态寄存器);
.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
.多现成应用中被几个任务共享的变量。
一个参数可以const同时也是volatile,一个指针也是可以为volatile的,但是具体编程时要小心,要保证不被意外修改。

1、static关键字的作用,个人经验主要有以下几种:1)函数局部static变量,第一次函数调用被初始化,后续每次调用将使用上次调用后保存的值;2)全局变量中static变量,可以防止被其他文件的代码使用这个变量,有点将这个全局变量设置为private的意味;3)对于static函数来说,效果和2中的变量相同;4)C++类中static方法,不需要实例化访问;5)C++定义static类成员变量,不需要实例化访问,不过需要先定义,定义的时候可以初始化数组。

2、volatile用来声明一个变量,并强制程序在每次使用变量的重新从变量地址读取数据,这是为了防止变量在其他地方被改变,而程序仍然使用没有更新的数据。

 2、说明C++内存分配方式有几种?每种使用都有哪些注意项?

1.从静态存储区域分配内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   
2.在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配内存容量有限。   
3.从堆上分配,亦称动态内存分配程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
----------------------------------------
一般所说的堆栈(stack)往往是指栈,先进后出,它是一块内存区。用以存放程序的局部变量,临时变量,函数的参数,返回地址等。在这块区域中的变量的分配和释放由系统自动进行。不需要用户的参与。   
   而在堆(heap,先进先出)上的空间则是由用户进行分配,并由用户负责释放

编程题:

1、给定一个升序排列的自然数数组,数组中包含重复数字,例如:[1,2,2,3,4,4,4,5,6,7,7]。问题:给定任意自然数,对数组进行二分查找,返回数组正确的位置,给出函数实现。注:连续相同的数字,返回第一个匹配位置还是最后一个匹配位置,由函数传入参数决定。

分析:既然是二分查找的变形,那么先写个正确的二分查找吧:

#include<iostream>
using namespace std;
int bin_search(int arr[],int n,int value)
{if(arr==NULL||n<1)return -1;int left=0;int right=n-1;while(left<=right){int mid=left+((right-left)>>1);if(arr[mid]>value){right=mid-1;}else if(arr[mid]<value){left=mid+1;}elsereturn mid;}return -1;
}
int main()
{int arr[]={1,2,3,4,5,6,7,8,9};int b=bin_search(arr,9,9);cout<<b<<endl;system("pause");return 0;
}

代码如下:

/*
* 测试样例
* 11
* 1 2 2 3 4 4 4 5 7 7 7
*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
int n;
int sets[MAX];
enum MATCH_POS{PRE,POST};//分别为第一个匹配和最后一个匹配int bi_search(int *arr,int b,int e,int v,MATCH_POS pos)
{int left,right,mid;left=b-1;right=e;while(left+1 < right){mid=left+(right - left)/2;if(v < arr[mid]){right = mid;}else if(v > arr[mid]){left=mid;}else{if(pos==PRE){//如寻找第一个匹配,right向左移动right = mid;}elseleft = mid;}}if(arr[right] == v)return right;else if(arr[left] == v)return left;return -1;
}int main(){int i;int sets[]={1, 2, 2, 3, 4, 4, 4, 5, 7, 7, 7};int t=bi_search(sets,0,10,7,PRE);printf("%d\n",t);system("pause");return 0;
}

2、一个无序自然数数组,比如[100,2,1,3]求在0(n)时间复杂度内求出最大的连续自然数个数:输出应该是3,要求算法的时间复杂度为O(n)
方法一:排序
可以采用一些排序方法比如基数排序、桶排序、记数排序等先进行排序。然后遍历一遍所有元素即可。当前这些排序有一些限制条件的。

方法二:维持一个hash表
维持一个hash表,大小为最大整数。遍历一次数组,用hash表记录出现在原始数组中的数。
然后设置四个个指示变量start,end,length,bestLength = 0。初始,start = end = 数组中第一个数,length = 1。然后不断执行下列操作:
end = end + 1.然后ziahash表中寻找end,如果能够找到,说明end存在原始数组中。一直到找不到end位置。
然后设置length = end - start。如果length大于bestLength,则更新:bestLength = length。
然后将start和end都设置为刚才为查找到的那个数,length = 1,接着重复上面的操作,最终的bestLength 便是最大的连续自然数个数。
由于hash的查找等操作都能在O(1)时间复杂度内完成,因此hash方法能够满足O(n)时间复杂度。

方法三:位图
用位图。类似方法二。
位图大小和最大的整数有关。位图中每一位为0或者1。位图某个位置index上为1表示index出现在原始数组中,反之不存在。遍历一遍原始数组建立位图之后,采用类似方法二中遍历hash表的方法遍历位图,找出最大的连续自然数个数。
位图的方法存在一个问题就是:可能最大的数很大,但是数的数目有很小,这时候要申请的位图的空间依然是很大,时候复杂度不是O(n)。

方法四:维持两个hash表

维持两个hash表tables:
Start表,其中的条目都是如下格式(start-point,length),包含的某个连续序列起始数以及序列长度。
End表,其中的条目都是如下格式(end-point,length),包含的某个连续序列结束数以及序列长度。

扫描原始数组,做如下操作:
对于当前值value,
判断value + 1是否存在于start表中。
如果存在,删除相应的条目,创建一个新条目(value,length + 1),同时更新end表相应条目,结束数不变,该对应长度加一。
判断value - 1是否存在于end表中。
如果存在,删除相应的条目,创建一个新条目(value,length + 1),同时更新start表相应条目,开始数不表,该对应长度加一。
如果在两个表中都存在,则合并两个已经存在的连续序列为一个。将四个条目删除,新建两个条目,每两个条目代表一个连续序列。
如果都不存在,则只需要在两个表中创建一个新的长度为1的条目。

一直这样等到数组中所有元素处理完毕,然后扫描start表寻找length值最大的那个即可。

这里要达到O(n)时间复杂度,start表和end表都用hash表实现,而且必须满足相关操作查找/添加/删除能够在O(1)时间复杂度内完成。

实例分析:
int[] input = {10,21,45,22,7,2,67,19,13,45,12, 11,18,16,17,100,201,20,101};

初始化状态:
Start table:{}
End table:{}
开始遍历数组:
10:两个数组中都不存在,添加条目。
Start table:{(10,1)}
End table:{(10,1)}
21:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,1)}
End table:{(10,1),(21,1)}
45:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,1),(45,1)}
End table:{(10,1),(21,1),(45,1)}
22:22-1=21存在于end表中需要进行更新。
Start table:{(10,1),(21,2),(45,1)}
End table:{(10,1),(22,2),(45,1)}
7:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1)}
End table:{(10,1),(22,2),(45,1),(7,1)}
2:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1)}
67:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1)}
19:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1),(19,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1),(19,1)}
13:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
45:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
End table:{(10,1),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
12:12+1=13存在start表中,更新。
Start table:{(10,1),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(12,2)}
End table:{(10,1),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,2)}
11:11+1=12都存在,合并。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1)}
18:18+1=19存在start表中,更新。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(18,2)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,2)}
16:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(18,2),(16,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,2),(16,1)}
17:都存在,合并。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4)}
100:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4),(100,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4),(100,1)}
201:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4),(100,1),(201,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4),(100,1),(201,1)}
20:都存在,合并。
Start table:{(10,4),(16,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1)}
End table:{(13,4),(22,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1)}
101:都存在,合并。
Start table:{(10,4),(16,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1),(101,1)}
End table:{(13,4),(22,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1),(201,1)}

最后搜索start表,找到length值最大的,为7.连续自然数序列是:(16,17,18,19,20,21,22).
结束。

 

#include <stdio.h>int array[]={100, 2, 1, 3, 8, 5, 4};
int size = sizeof(array) / sizeof(int);//构造两个简陋的hash表,一个是用来查询数字是否存在,一个用于标记数字是否使用过
char hash_exist[1024];
char hash_used[1024];int main()
{int i, j, n, max = 0, maxnum = array[0], minnum = array[0];for(i = 0; i < size; i++){//标记数字存在hash_exist[array[i]] = 1;//找出数组最大元素if(maxnum < array[i]) maxnum = array[i];//找出数组最小元素if(minnum > array[i]) minnum = array[i];}for(i = 0; i < size; i++){j = array[i];//如果已经统计过,就跳过if(hash_used[j])continue;//标记本身n = 1;hash_used[j] = 1;//比array[i]大的连续元素统计while(++j <= maxnum){if(hash_exist[j]){n++;hash_used[j] = 1;}elsebreak;}//比array[i]小的连续元素统计j = array[i];while(--j >= minnum){if(hash_exist[j]){n++;hash_used[j] = 1;}elsebreak;}//更新最大连续数字if(n > max) max = n;}printf("%d\n", max);return 0;
}

 

转载于:https://www.cnblogs.com/sooner/p/3279429.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

插入排序---希尔插入排序算法(Javascript版)

取一个小于n的整数作为第一个增量&#xff0c;把序列分组。所有距离为增量的倍数的元素放在同一个组中。先在各组内进行直接插入排序&#xff1b;然后&#xff0c;取第二个增量&#xff08;第二个<第一个&#xff09;重复上述的分组和排序&#xff0c;直至所取的增量1&#…

“视频编码”的相关概念

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 1、视频编码是什么意思&#xff1f; 视频编码&#xff0c;就是指通过特定的压缩技术&#xff0c;将某个视频格式的文件转换成另一种视频格式文件。 &#xff08;能否这样理解&#xff0c;视频编码&#xff0c;约…

常量和字段

常量是一个特殊的符号&#xff0c;它有一个从不变化的值。定义常量符号时&#xff0c;它的值必须能在编译时确定。确定之后&#xff0c;编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。在C#中一下类型都是基元类型&#xff0c;可用于定…

简单实用的二级树形菜单hovertree

原创 hovertree是一个仿京东的树形菜单jquery插件&#xff0c;暂时有银色和绿色两种。官方网址&#xff1a;http://keleyi.com/jq/hovertree/欢迎下载使用查看绿色效果&#xff1a;http://keleyi.com/jq/hovertree/hovertreegreen.htm可以设置菜单宽度(width)&#xff0c;还可以…

分析根文件系统中的目录结构

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 我们利用Busybox制作根文件系统&#xff0c;就是为了创建下面的这些目录和各文件。其中有些目录和文件不是构建最小根文件系统所必需的&#xff0c;有些却是必需的。 1、/linuxrc文件 这是最重要的文件&#xff0c…

xp系统一直跳出宽带连接服务器,XP系统网络问题解决方案

XP系统网络问题解决方案随着国内 Internet 的普及和信息产业的深化&#xff0c;近几年宽带网络的发展尤为迅速。下面是小编整理的一些生活上Windows XP网络故障的解决方案&#xff0c;希望对你有帮助!故障1&#xff1a;本地连接受限制或无连接很多用户发现&#xff0c;当每次进…

装逼的翻译,害死多少人,你同意吗?到底什么是非终止状态,终止状态

http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx 很久以前对这段翻译就很不爽了&#xff0c;为啥一直都要把non-signaled的翻译成“非终止状态”&#xff0c;为…

SQL Server 错误18456

第一步、 错误发生的场景 第二步、 找到引起错误的原因 第1步、 查看windows日志文件。 运行中输入 eventvwr (event viewer)打开日志文件查看器, 第三步、 解决方案&#xff0c;由第二步我们可以看出是SQL Server的认证模式引起了问题&#xff0c;所以只要把它改一下就可以…

数组面试

1.数组求和 如果只是普通求和会简单&#xff0c;但是只能使用一行代码该怎么办呢&#xff1f; int sum(int *a,int n) {return n 0 ? 0 : sum(a,n-1) a[n-1]; }2.寻找发帖水王 int Find(int *a,int n) {int times 0;int value;for (int i 0;i < n;i){if (times 0){val…

分析根文件系统中的etc/init.d/rcS文件

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、文件简介 &#xff08;1&#xff09;由博文分析根文件系统中的/etc/inittab文件可知&#xff0c;etc/inittab文件的第一行配置项一般是“::sysinit:/etc/init.d/rcS”&#xff0c;这说明控制台…

拼多多显示内部服务器错误是怎么回事,拼多多提现出现错误怎么办?拼多多提现常见问题...

拼多多提现是每个店家都会去操作的&#xff0c;不过提现时总会遇到很多问题&#xff0c;例如手机号码换了收不到验证码、提现资金到账时间、提现出现错误等等&#xff0c;当然还有很多。当这些问题出现时我们应该如何去解决呢?1、如果出现银行提现手机号非现使用手机号&#x…

分析根文件系统中的用户登录(主要涉及/etc/profile、/etc/intttab、/etc/passwd和/etc/shadow等文件)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、简单分析/etc/profile文件 1、何时被调用 这个文件直接或者间接地被/linuxrc文件调用。 2、文件简介 &#xff08;1&#xff09;busybox源码中的/examples/bootfloopy/etc/profile文件内容过于简…

VirtualBox 扩展虚拟硬盘容量

为什么80%的码农都做不了架构师&#xff1f;>>> 扩展步骤&#xff1a;第一步&#xff1a;修改硬盘镜像文件 1、虚拟机关机. 2、确认虚拟机使用文件(后缀为.vdi的文件)路径不带中文字符&#xff0e; 3、Windows 下按&#xff1a;Windows R&#xff0c;调出命令行工具…

jquery控制css的display(控制元素的显示与隐藏)

使用jquery控制div的显示与隐藏: $("#div的id").show()表示display:block, $("#div的id").hide()表示display:none; $("#id").toggle()切换元素的可见状态&#xff1a;如果元素是可见的&#xff0c;切换为隐藏的&#xff1b;如果元素是隐藏的&am…

制作ext2格式的根文件系统镜像

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、首先验证文件夹形式的rootfs是否可用 设置bootargs为nfs启动方式&#xff0c;然后使用在ubuntu中做好的文件夹形式的rootfs来启动&#xff0c;查看启动效果&#xff0c;作为将来用ext2格式的root…

技术和赚钱真的冲突吗?

前几天在微信上看到篇文章&#xff0c;讲述的是大悲寺和少林寺的对比。原文的大意是大悲寺如何如何清苦&#xff0c;烧香不许客户投钱。而少林寺如何的肥头大耳&#xff0c;尤其是方丈释永信是多么多么的会“敛财“。&#xff08;注意&#xff1a;我们这里抛去一些“确实是敛财…

构造和运行模块

作者&#xff1a;蔡伦辉写在前面作者一直支持GPL的精神。允许任何人自由使用、转载、复制和再分发&#xff0c;但必须保留作者署名&#xff0c;必须保证全文完整转载&#xff0c;包括完整的版权声明。由于作者水平有限&#xff0c;因此不能保证文章内容准确无误&#xff0c;请批…

分析与构建根文件系统中的/lib目录

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 由根文件系统的目录结构_天糊土的博客-CSDN博客可知&#xff0c;/lib目录在根文件系统中也是不能省略的。该目录存放着操作系统中的动态和静态链接库文件。我们构建/lib目录&#xff0c;主要工作是是…

优化小技巧——复杂属性对象的read模式

本帖最后由 Aone 于 2013-7-27 12:23 编辑想必Rectangle或者Point这样的数据类在我们的程序中特别是当前的游戏中是非常常用的类型。那么一些类中获取这些属性的时候为了封装&#xff0c;往往会写一个get函数return一个复制的Rectangle对象给外部。目的是为了防止被获取内部rec…