如何做这一道面试程序员面试题库题

眼眸深邃、轮廓分明、身材颀长,活生生的一幅画。
这在监狱民警看来,那么令人不可思议。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  结果是:0 1 2 3 3 3
  很多公司面试都爱出这道题,此题考察的知识点还是蛮多的。
  为了防止初学者栽在此问题上,此文稍微分析一下。
  都考察了那些知识点呢?
  异步、作用域、闭包,你没听错,是闭包。
  我们来简化此题:
  先打印2,后打印1。
  因为是setTimeout是异步的。
  正确的理解setTimeout的方式(注册事件):
  有两个参数,第一个参数是函数,第二参数是时间值。
  调用setTimeout时,把函数参数,放到事件队列中。等主程序运行完,再调用。
  没啥不好理解的。就像我们给按钮绑定事件一样:
  这么写完,会弹出1吗。不会!!只是绑定事件而已!
  必须等我们去触发事件,比如去点击这个按钮,才会弹出1。
  setTimeout也是这样的!只是绑定事件,等主程序运行完毕后,再去调用。
  setTimeout的时间值是怎么回事呢?
  比如:
  我们可以理解为2000之后,再放入事件队列中,如果此时队列为空,那么就直接调用fn。如果前面还有其他的事件,那就等待。
  因此setTimeout是一个约会从来都不准时的童鞋。
  继续看:
  程序会不会报错?
  不会!而且还会准确得打印1。
  为什么?
  因为真正去执行console.log(i)这句代码时,var i = 1已经执行完毕了!
  所以我们进行dom操作。可以先绑定事件,然后再去写其他逻辑。
  这么写,完全是可以的。因为异步!
  es5中是没有块级作用域的
  也就说i可以在for循环体外访问到。所以是没有块级作用域。
  但此问题在es6里终结了,因为es6,发明了let。
  这回我们再来看看原题。
  原题使用了for循环。循环的本质是干嘛的?
  是为了方便我们程序员,少写重复代码。
  让我们倒退50年,原题等价于:
  因为setTimeout是注册事件。根据前面的讨论,可以都放在后面。
  原题又等价于如下的写法:
  这回你明白了为啥结果是0 1 2 3 3 3了吧。
  那个,老姚你说它是闭包,又是怎么回事?
  为了很好的说明白这个事情,我们把它放到一个函数中:
  上面的函数跟我们常见另一个例子(div绑定事件)有什么区别:
  点击每个div都会弹出3。道理是一样的。因为alert(i)中的i是fn作用越中的,因而这是闭包。
  《java忍者秘籍》书里把一个函数能调用全局变量,也称闭包。
  因为作者认为全局环境也可以想象成一个大的顶级函数。
  怎么保证能弹出0,1, 2呢。
  解决之道:以毒攻毒!
  再创建个闭包!!
  或者如下的写法:
  因此原题如果也想setTimeout也弹出0,1,2的话,改成如下:
@IMWeb前端社区  本文由作者老姚授权转发  /notes/1ce8f863e8b5abba158/page/.html
微信ID:IMWebTech
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:解一道面试题
问题描述:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里
请找出丢失的数字,最好能有程序,最好算法比较快
假设n=10000
我的解题思路:
我用bitmap法实现的。思路如下:
一个[1,m]的bitmap(求简单,每个元素都是bool类型),全部初始化为false。
便利目标数组,用每一个值作下表,找到bitmap中对应位置,置true。
扫描bitmap中为true的节点,记录下来,这就是答案
只需要便利两次数组即可。
c代码如下:
关键解题函数:
void FindLostNum(int* pData, int nTotalNum, int* pResult, int nLost)&
参数解释: pData 指向一个整型数组,里面有nTotalNum个乱序数据元素,元素取值[1,nTotalNum+nLost] pResult 指向一个结果整型数组,里面有nLost个节点,用来接收返回结果代码在vs2010下调试通过
#include &iostream&&
#include &math.h&&
#define N&& (4000)&
#define LOST &span style=&white-space:pre&&&& &/span&(3)&
typedef struct _NODE_NUM&
&&& bool bU&&&& //是否被用过&
}NODE_NUM, *PNODE_NUM;&
//生成数表,[1,n]乱序。 参数:表头指针,总数,丢失的个数&
bool GenerateRandomNumSet(PNODE_NUM pData, int nTotalNum, int nLostNum);&
//找出丢失的数字&
void FindLostNum(int* pData, int nTotalNum, int* pResult, int nLost);&
bool GenerateRandomNumSet(int* pData, int nTotalNum, int nLostNum)&
&&& PNODE_NUM pList& = NULL;&
&&& int index = 0;&
&&& int temp = 0;&
&&& int loc = 0;&
&&& if(pData==NULL || nTotalNum&=0)&
&&& //初始化1-n数码顺序表&
&&& pList = new NODE_NUM[nTotalNum];&
&&& if(pList == NULL)&
&&& for(index=0; index&nTotalN index++)&
&&&&&&& (pList+index)-&bUsed =&
&&& /*初始化[1,n-lost]乱序数码表*/&
&&&&&&& for(index=0; index&nTotalNum-nLostN index++)&
&&&&&&& {&
&&&&&&&&&&&&&
&&&&&&&&&&& loc = rand()%nTotalN&
&&&&&&&&&&& while(1)&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&& if((pList+loc)-&bUsed)&
&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& loc++;&
&&&&&&&&&&&&&&&&&&& if(loc &= nTotalNum)&
&&&&&&&&&&&&&&&&&&&&&&& loc=0;&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& else&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&&&&&& *(pData+index) =&
&&&&&&&&&&& (pList+loc)-&bUsed =&
&&&&&&& }&
&&& catch(exception e)&
&&&&&&& cout&&&参数错误&;&
&&& delete pL&
void FindLostNum(int* pData, int nTotalNum, int* pResult, int nLost)&
&&& PNODE_NUM pList = NULL;&
&&& int index=0;&
&&& int count = 0;&
&&& if(pData==NULL || nTotalNum&=0 || pResult==NULL || nLost&=0)&
&&& //初始化1-n数码顺序表&
&&& pList = new NODE_NUM[nTotalNum+nLost];&
&&& if(pList == NULL)&
&&& for(index=0; index&nTotalNum+nL index++)&
&&&&&&& (pList+index)-&bUsed =&
&&& //扫描给出数列,在pList中标记&
&&& for(index=0; index&nTotalN index++)&
&&&&&&& (pList+*(pData+index))-&bUsed =&
&&& for(index=0; index&nTotalNum+nL index++)&
&&&&&&& if(!(pList+index)-&bUsed)&
&&&&&&& {&
&&&&&&&&&&& *(pResult+count) =&
&&&&&&&&&&& count++;&
&&&&&&& }&
int main()&
&&& int* pData = NULL;&
&&& int* pResult = NULL;&
&&& pData = new int[N];&
&&& if(pData==NULL)&
&&&&&&& return -1;&
&&& pResult = new int[LOST];&
&&& if(pResult==NULL)&
&&&&&&& delete pD&
&&&&&&& return -1;&
&&& GenerateRandomNumSet(pData, N, LOST);&
&&& FindLostNum(pData, N-LOST, pResult, LOST);&
&&& //输出结果&
&&& for(int index=0; index&LOST; index++)&
&&&&&&& cout&&*(pResult+index)&&&\t&;&
&&& //检验结果&
&&& for(int index=0; index&N-LOST; index++)&
&&&&&&& for(int c=0; c&LOST; c++)&
&&&&&&& {&
&&&&&&&&&&& if(*(pData+index) == *(pResult+c))&
&&&&&&&&&&&&&&& cout&&endl&&&结果检验错误&;&
&&&&&&& }&
&&& delete pD&
&&& delete pR&
&&& return 1;&
摘自 shyandsy的无边海洋今天做的一道数据库面试题,求高人进来看下,顺手解答了哈 - 自学it网-公益PHP培训! - Powered by Discuz!
自学it网-公益PHP培训!
标题: 今天做的一道数据库面试题,求高人进来看下,顺手解答了哈
作者: zgp3297299& & 时间:
22:28:28 & & 标题: 今天做的一道数据库面试题,求高人进来看下,顺手解答了哈
&&一个新闻系统,有一张名为message的新闻表,有如下字段
  id 文章id
  title 文章标题
  content 文章内容
  category_id 文章分类id
& && & hits 点击量
& && &&&另一张表comment记录用户回复内容,字段如下
  comment_id 回复id
  id 文章id,关联message表中的id
  comment_content 回复内容
  现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
  文章id 文章标题 点击量 回复数量
  用一条SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
哪位高人来指点下啊
作者: 时时处处看看& & 时间:
select message.a_id,title,hits,temp.m from message left join (select a_id,count(a_id) as m from b group by b.a_id) as temp on message.a_id=temp.a_id order by temp.
没回复的显示0没做出来
作者: 临江仙& & 时间:
菜鸟是怎么做这道题目的:
create table news(
id int primary key auto_increment,
title varchar(20),
content varchar(80),
catrgory_id int ,
hits int
)charset utf8;复制代码
我先创建一个新闻表,create table comment(
comment_id int primary key auto_increment,
id int,
comment_content varchar(80)
)charset utf8;复制代码我再创建一个回复表,
insert into news
(title,content,catrgory_id,hits)
values
('aaa','aaaaa',1,1),
('bbb','bbbbb',2,1),
('ccc','sdkas',3,1),
('ddd','fdlas',4,1),
('eee','fsdls',5,1);复制代码我把辛辛苦苦创建的五条新闻插入news表,
insert into comment
(id,comment_content)
values
(1,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(2,'bbbbb'),
(2,'aaaaa'),
(2,'bbbbb'),
(2,'aaaaa'),
(2,'bbbbb'),
(2,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(1,'bbbbb'),
(1,'aaaaa'),
(3,'bbbbb'),
(3,'aaaaa'),
(4,'bbbbb');复制代码再请了15个大牛来回复我的新闻,顺便把回复插入了回复表,
select count(*)复制代码我查一下一共有多少条回复,好像是24条,
select count(*) from comment where id=1;复制代码我再看一下第一条新闻有多少条回复,15条,
我想知道每条新闻的回复数,select count(*) from comment where id=&&xxx应该是每一条新闻的id。
我从新闻表里查新闻,select *再加上回复,select * ,(select count(*) from comment where comment.id=news.id)
再加个排序,
所以,select * ,(select count(*) from comment where comment.id=news.id) as c from
最后,再筛选所需的字段。变成:
select news.id,title,hits,(select count(*) from comment where comment.id=news.id) as c from
作者: zgp3297299& & 时间:
临江仙 发表于
菜鸟是怎么做这道题目的:
我先创建一个新闻表,我再创建一个回复表,
厉害啊,可是还有一步啊
没回复的显示0怎么做啊
作者: besile& & 时间:
zgp3297299 发表于
厉害啊,可是还有一步啊
没回复的显示0怎么做啊
你自己不动手么。
菜鸟都做出来了。
你看到没回复的不显示0了?
作者: & & 时间:
直接搞个两表联查不就完了吗 搞这么复杂干啥?
还是上面的两张表:
select&&m.id, m.title, m.hits, count(c.id)
from message as m left join comment as c
where m.id = c.id order by count(c.id)
作者: zhichen570& & 时间:
select message.id,title,hits,sum(comment_content is not null) as a from
message left join comment on message.id=comment.id
group by comment.
能显示回复数为0
欢迎光临 自学it网-公益PHP培训! (http://www.zixue.it/)
Powered by Discuz! X2扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
一道面试题,请在空白处写出100个1
zuibhouy1314
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
以5×5的阵列写,写4个阵列,好处是一目了然,考官好数,自己不会遗漏,显现自身的条理性以及与人方便的合作思想.以10×10的阵列写,好处整洁好看.不过这是要看空白的大小了.如果是个很小的空白,就当成是脑筋急转弯来处理.
为您推荐:
其他类似问题
字不够什么的最烦了
你写就是了,一个答案,1.。。
第二。。。。“100个1”。。
‍下面是i=0,上面是99,后面是10的i次幂这个式子的结果是100个1,我也不清楚你那题属于什么类型
工工整整的写
考你的是有规律
遵守单位的管理
扫描下载二维码

我要回帖

更多关于 公务员面试测试题 的文章

 

随机推荐