社区
数据结构与算法
帖子详情
两个看似简单的面试题
Sodier
2008-10-08 02:01:22
1.给定一个单链链表(节点域只包括指向下一个的指针和key value),找出从链尾倒数的第k个元素,要求尽可能高效
2.给定一个32bit的数值,如果输出比特位反转后的值,如对于4bit的二进制值1011,翻转后为1101。要求复杂度O(lgn),n
为比特位数
...全文
480
31
打赏
收藏
两个看似简单的面试题
1.给定一个单链链表(节点域只包括指向下一个的指针和key value),找出从链尾倒数的第k个元素,要求尽可能高效 2.给定一个32bit的数值,如果输出比特位反转后的值,如对于4bit的二进制值1011,翻转后为1101。要求复杂度O(lgn),n 为比特位数
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
31 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
runfriends
2008-10-10
打赏
举报
回复
第二个问题可做如下解答
int convert_32bit(int n)
{
int i,j,k,ret=0,m=0x1;
for(i=1;i<=16,i*=2)
{
k=(n>>i)&m;//把高i位移到低位
j=m|n;
k^=j;
j^=k;
k^=j;//位异或运算,把k和n的值交换,实际交换的是n的低i位。
m=(m<<i)|m;
ret=(ret<<(i*2))|((k<<i)|j);
}
return ret;//右移位低位置0,与n位或
}
1 2 4 8 16
O(5*7)
boxer_tony
2008-10-10
打赏
举报
回复
不知第一题的高效指的是时间效率还是包括空间效率?
如果两者都包括,那么1楼确实是很好的算法,时间复杂度是f(n)=2n-k;如果只是时间效率的话,那么可以损失空间的话可以达到f(n)=n的时间复杂度。
lyllm_117228
2008-10-10
打赏
举报
回复
我认为一楼的答案即简洁又高效
swf028
2008-10-10
打赏
举报
回复
参考8楼的思想,完成的程序.
有什么问题,大家多提下!
/////////////////////////////////////////////////////////////////////
struct node
{
int data;
node *next;
};
node *findK(node *head,int k)
{
node *p1,*p2,*p3;
int i,tmpk=1,scancount;
if (head==NULL) return NULL;
p1=head;
p2=p1;
scancount=k; //可K太小的话可以改大
while((p1=p1->next)!=NULL)
{
if (tmpk++==scancount)
{
tmpk=1;
p3=p2;
p2=p1;
}
}
if (tmpk<k)
{
for(i=0;i<tmpk+1;i++)
p3=p3->next;
return p3;
}
else if (tmpk>k)
{
for(i=0;i<tmpk-k+1;i++)
p2=p2->next;
return p2;
}
else return p2;
}
/////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
node *head=new node;
head->data=1;
head->next=NULL;
node *node1=head;
for (int i=2;i<100;i++)
{
node1->next=new node;
node1->next->data=i;
node1=node1->next;
}
node1->next=NULL;
node *ret=findK(head,1);
cout<<ret->data<<endl;
}
glacier3d
2008-10-10
打赏
举报
回复
第二个算法在FFT里就有用哎!很实用啊!
suwein
2008-10-10
打赏
举报
回复
第一题程序员面试宝典里有详细介绍
suwein
2008-10-09
打赏
举报
回复
19楼的解法复杂度O(nlogn),你这样的话交换太多次了,还不如直接第i位和n+1-i位直接交换,每两个位只需要进行1次交换操作,O(n)
如果基于交换的话绝对不会低于O(n),因为每位都得进行交换才能到达它应该待的位置
suwein
2008-10-09
打赏
举报
回复
18楼给的结果是m+n=2^32-1,不符合要求啊
test4ever
2008-10-09
打赏
举报
回复
2题
依照题目意图
使用分治法
1.首先 将高n/2位与低n/2位交换
2.然后分治处理高n/2位,和低n/2位
3.分治中的原子操作是将x位数,其高x/2位于低x/2位交换
最终算法的时间复杂度为O(lgn)
apollofsc2008
2008-10-09
打赏
举报
回复
阿2果然是牛人啊,实在是佩服
第二个题看来好半天才看懂啊
deng2000
2008-10-09
打赏
举报
回复
抱歉,我在18楼的解答误解题意了,此"反转"非彼"反转"。谢谢指正。
suwein
2008-10-09
打赏
举报
回复
n^FFFF FFFF只是各位取非吧
adrian_yang84
2008-10-09
打赏
举报
回复
18楼的同学提醒了我,可以用异或:n︿0xFFFFFFFF
deng2000
2008-10-09
打赏
举报
回复
第二题的一个简便做法是利用补码:
unsigned int reverse_32bit(unsigned int n)
{
int k = n;
k = -k - 1;
unsigned int m = k;
return m;
}
另:我觉得题目的说法“要求复杂度O(lgn),n 为比特位数”有问题. 在此题中比特位数就是一个常数32, 怎么能以它规定复杂度?
oo
2008-10-08
打赏
举报
回复
第一题:
用三个指针p1,p2,p3
p1,p2,p3先都指向head
1,先p1跑M步(M可以是k,如果k比较小,M可以是一个比k大的值),p2设置为p1
2,p1继续跑M步,如果p1没有到链表的尾,则p3设置为p2,p2设置为p1,继续第二步;
如果p1到了链表的尾,因为p1移动时记录了移动步数,所以从p3开始移动就可以到指定的节点。
这个方法如果链表比较长时比两个指针同时移动一步效率要高一些。
currenttt
2008-10-08
打赏
举报
回复
2楼的算法很赞……
zsxcn
2008-10-08
打赏
举报
回复
mark
viqbgee
2008-10-08
打赏
举报
回复
我认为一楼的答案即简洁又高效
wonture
2008-10-08
打赏
举报
回复
1楼高啊
DongloveRen
2008-10-08
打赏
举报
回复
学习
加载更多回复(11)
看似
简单
的hashCode和equals
面试题
,竟然有这么多坑!
作者:徐刘根,大家都喊我根哥! hashCode()方法和equals()区别与联系这到
面试题
,
看似
简单
,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要么抓不住重点,答非所问。从这个很小的
面试题
上我们就可以看出来,对于任何一个
面试题
来说,都是要清晰有条理的回答。那么如何才能回答到点子上并且让面试官觉得你的逻辑清晰哪? 首先,我们要介绍hashC...
Java系列(面试必备):
简单
的hashCode和equals
面试题
,有好多坑!
简单
的hashCode和equals
面试题
,有好多坑! 前言 今天博主将为大家分享:
简单
的hashCode和equals
面试题
,有好多坑!不喜勿喷,如有异议欢迎讨论! hashCode()方法和equals()区别与联系这道
面试题
,
看似
简单
,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要么抓不住重点,答非所问。从这个
面试题
上我们就可以看出来,对于任何一个
面试题
来说,都是要清晰...
C/C++程序员
面试题
本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析
面试题
的内涵。文中的大多数
面试题
来自各大论坛,部分试题解答也参考了网友的意见。 许多
面试题
看似
简单
,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最
简单
的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿
RabbitMQ消息队列常见
面试题
总结
RabbitMQ消息队列常见
面试题
总结; 1、什么是消息队列?消息队列的优缺点? 2、Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别? 3、如何保证消息不被重复消费? 4、如何保证消息不丢失,进行可靠性传输? 5、如何保证消息的有序性? 6、如何处理消息堆积情况? 7、如何保证消息队列的高可用?
vue
面试题
、react
面试题
大全、ES6等....
自己整理的一些
面试题
: 1、promise是用来做什么的? 答:它是一个对象,用来传递异步操作的信息。 2、promise三个状态? Pending:进行中,Resolved:已完成,Reject:已失败 3、promise优缺点? 优点:可以通过.then解决回调地狱的问题,通过try-catch解决问题捕获 数组去重的常用方法 1.es6的set方法 var arr = [1,1,8,8,12,12,15,15,16,16]; function unique (arr) { retu
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章