学习笔记C++(链表、二分法--常见面试题分析)

链表:

无意间发现的一个面试总结感觉不错

剑指offer习题总结

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。

链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。

常见的基础操作是插入、删除等,详细代码参考


1、链表中倒数第k个结点分析及代码参考


2、链表的中间节点

分析:我们可以定义两个指针,一个每次移动一步,另一个每次移动两步。当每次移动两步的指针指向了链表的尾节点时,每次移动一步的指针正好处于中间位置,即我们要找的中间节点位置。当然,这是在不知道链表的长度,且为了减少时间复杂度的解法。

代码:

/*

    求链表的中间节点

*/  

pNode getCenterPoint(pNode head)  

{  

if (head == NULL || head->next == NULL) //如果链表为空,或仅有头节点  

    {  

return head;  

    }  


    pNode pA = head;  

    pNode pB = head;  


while(pB != NULL && pB->next != NULL)  

    {  

        pA = pA->next;  

        pB = pB->next->next;        

    }  

return pA;  

}  


3、链表是否存在环

分析:判断一个链表是否存在环,可以定义两个指针,一个每次移动一步,另一个每次移动两步。如果每次移动两步的指针指向了NULL,则说明不存在环;如果两个指针相遇,则说明存在环。

代码:

/*

    判断链表是否存在环

*/  

bool isExitCycle(pNode head)  

{  

if(head == NULL)  

    {  

return false;  

    }  

    pNode pA = head;  

    pNode pB = head;  

while(pB->next != NULL && pB != NULL)  

    {  

        pB = pB->next->next;  

        pA = pA->next;  

if(pA == pB)  

{// 若两个指针相遇,则存在环  

return true;  

        }  

    }  

return false;  

}


4、两个链表的第一个公共结点

分析参考


5、反转链表:

分析参考(这个没太理解有时间再看下)


6、输入n个整数,找出其中最小的K个数

PS:补充点构造函数知识

概念:

简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据

C++ Vectors可以使用以下任意一种参数方式构造:

vector();//1. 无参数 - 构造一个空的vector,

vector( size_type num, const TYPE &val );//2. 数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector 

vector( const vector &from );// 3. vector(from) - 构造一个与vector from 相同的vector

vector( input_iterator start, input_iterator end );// 4. 迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).

vector和list的区别:

vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。list对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要改变指针的指向就可以了。另外对于新添加的元素,Vector采用的是从尾部追加,而List可以任意加入,同时可以高效的插入删除元素。list不支持随机访问。所以没有 at(pos)和operator[]。

vector 中参数可执行常用函数:

1.push_back          在数组的最后添加一个数据

2.pop_back           去掉数组的最后一个数据 

3.at                 得到编号位置的数据

4.begin              得到数组头的指针

5.end                得到数组的最后一个单元+1的指针

6.front              得到数组头的引用

7.back               得到数组的最后一个单元的引用

8.max_size           得到vector最大可以是多大

9.capacity           当前vector分配的大小

10.size            当前使用数据的大小

11.resize          改变当前使用数据的大小,如果它比当前使用的大,者填充默认值12.reserve       改变当前vecotr所分配空间的大小

13.erase          删除指针指向的数据项

14.clear           清空当前的vector

15.rbegin         将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend           将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty         判断vector是否为空

18.swap          与另一个vector交换数据  

回到题目(输入n个整数,找出其中最小的K个数)分析主要做个排序然后取出最小的k个数就可以了,参考代码

好奇时间复杂度怎么算出来的可以看看这块

比如1题:

Sum1( int n )

{ int p=1, sum=0, m ; //1次

for (m=1; m<=n; m++) //n+1次

{ p*=m ; //n次

sum+=p ; } //n次

return (sum) ; //1次

}

最后总的次数为

1+(n+1)+n+n+1+1=3n+3

所以时间复杂度f(o)=n;(时间复杂度只管n的最高次方,不管他的系数和表达式中的常量)不过要注意时间复杂度的f(x)在有限次时就用具体数值表示,无限次时就用n,n的平方,log以2为底n的对数,其实很简单就是看n的最高次方,看n的最高次方等于几,f(x)就等于几。


二分法:

首先说一下二分法排序的原理,算法思想简单描述: 

1、将low=0,值为1;high=9,值为10(因为数组下标从0开始);mid=(low+high)/2

2、将mid的值与查找的数作比较,如果mid<n,即n在mid的右边,所以左边界变为low = mid+1,相反如果mid>n,即n在mid的左边,即右边界要变成high=mid-1

常见面试例子参考


感觉自己数学思想欠缺,这种题最好的办法是先据几个数(1、2、多)基本上算法思想就出来了,然后可以尝试些伪代码,再详细点是代码具体函数

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容