博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试中变相考算法复杂度
阅读量:5899 次
发布时间:2019-06-19

本文共 1823 字,大约阅读时间需要 6 分钟。

一:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

链表结点与函数的定义例如以下:

struct ListNode{    int    m_nValue;	ListNode* m_pNext;};void delete_note(ListNode *head,ListNode *current){	// 空的	if(head == null || current==null)	{		return;	}	else if(current->m_pNext != null)	{// 非结尾		ListNode *tmp = current->m_pNext;		current->m_nValue = tmp->m_nValue;		current->m_pNext = tmp->m_pNext;		delete tmp;		tmp = null;	}	else if(head == current)	{// 仅仅有一个节点		delete current;		current = null;		head = null;	}	else	{// 尾节点,不是一个哦		ListNode *tmp = head;		while(tmp->m_pNext != current)			tmp = current->m_pNext;		tmp->m_pNext = null;		delete current;		current = null;	}}
分析:假设待删除节点为最后一个节点,则不能依照以上思路,没有办法,仅仅能依照常规方法遍历,时间复杂度为O(n),是不是不符合题目要求呢?可能非常多人在这就会怀疑

自己的思考,从而放弃这样的思路,最后可能放弃这道题,这就是这道面试题有意思的地方。虽看简单,可是考察了大家的分析推断能力,是否拥有强大的心理,充分自信。事实上

我们分析一下,仍然是满足题目要求的。假设删除节点为前面的n-1个节点。则时间复杂度为O(1),仅仅有删除节点为最后一个时,时间复杂度才为O(n),所以平均的时间复杂度

为:(O(1) * (n-1) + O(n))/n = O(1);仍然为O(1)

单向链表中删除一个结点,最常规的方法是从头到尾扫描一遍找到结点,然后删除结点。对于给定的是值得结点,没有办法仅仅能从头到尾扫描一个一个对照值得大小,假设链表

中存在。则删除结点。

本题给出的是一个结点的指针,我们无需扫描就能够得到结点的指针。在这个过程中。仅仅要把当前结点(p)的next结点(q)的值赋给当前结点。把q的

next结点连接到p的next域删,接下来删除结点q就满足题目的要求了。

可是这个题目中存在很多陷阱:首先是边界条件的考虑。然后是删除结点的位置,表头,表尾,和中间,不同的地方删除时处理不一样。

二:给定一个数组a[N],我们希望构造数组b[N],当中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。

在构造过程:

1、不同意使用除法;

2、要求O(1)空间复杂度和O(n)时间复杂度。

3、除遍历计数器与a[N] b[N]外,不可使用新的变量(包含栈暂时变量、对空间和全局静态变量等);

void makeArray(int a[],int b[],int len)    {        int i,j;        b[0] = 1;            for(i=1;i
0;j--) { b[j] *= b[0]; b[0] *= a[j]; } }
学习心得
1  对于这样的带要求的(要求苛刻的)问题,就要求我们不能应用常规的方法来思考它。
2  这样的题,一般有一些特点,里面的技巧性非常强。当然也比較easy发现,从递推公式中能够看出一些端倪;
3  你用常规的方法书写时 再加上 从递推公式中能够看出一些端倪 应该不难看出它的解法
4  平时一定要多多练习。在自己高速地写完一个算法题后,想一想有没有更优的方法,哪怕仅仅有一点点代码优化;
5 代码优化,也是在面试的时候面试官,在你写完代码后,最爱问的一个问题。

转载于:https://www.cnblogs.com/yutingliuyl/p/6941572.html

你可能感兴趣的文章
沙盒目录介绍
查看>>
260. Single Number III
查看>>
Hadoop生态圈-Kafka的完全分布式部署
查看>>
css的border的solid
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 1
查看>>
jQuery自动完成点击html元素
查看>>
[算法]基于分区最近点算法的二维平面
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
在 SELECT 查询中使用表表达式
查看>>
静态路由和默认路由
查看>>
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>