
刷题
f2016913
一个专业小白的奋斗之路
展开
-
面试题之二维数组中的查找
实现在一个二维数组中查找一个数字,常规的思想是查找的数字刚好是关键值;查找的数字比关键值小,说明当前值在关键值的左边或者是上面;查找的数字比关键值大摸索名当前值在关键值的右边或者是上边;能不能有一种高效的方法呢? 思路: 首先我们从右上角的数字开始,如果此时查找的数字刚好是我们要找的目标数字,表明查找结束,停止查找;如果此时查找的数字比目标数字大,表明目标数字不在本列,在其左边;继续查找,如果查原创 2017-05-27 15:37:17 · 524 阅读 · 0 评论 -
查找数组中出现次数超过数组长度一半的数字
题目: 数组中一个数字出现的次数超过数组长度一半的次数,请找出这个数字,例如输入一个长度为9的数组{1,2,3,2,2,25,4,2},由于2出现的次数实际5次,超过数组的一半,因此输出的结果是2.思路:开始的时候想到用map,依次遍历这个数组,map会对这些数字排序,这种方法和Topk的问题很像,比较容易实现.但是时间复杂度是N(lgN),如果我们要求时间复杂度是O(N)呢?方案一:借助快排的部原创 2017-08-13 08:30:03 · 564 阅读 · 0 评论 -
求两个单链表的差集和并集
题目:- 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 思路:指针的指针pa遍历链表A,指针pb遍历链表B,当节点的值相等,删除,提前将删除位置的下一个节点保存,然后 继续遍历原创 2017-07-27 12:07:02 · 12991 阅读 · 0 评论 -
C语言如何模拟C++实现继承和多态
首先要明白c++的三大特性:封装,继承,多态 而这些C语言统统都没有,那么C语言如何实现继承和多态呢? C++的继承属性是通过访问限定符:public,protected,private来实现. 我们知道c++的多态必须满足两个条件:虚函数的重写已经父类的指着和引用指向子类的对象. 思路:我们知道在C语言中没有类的概念,但是却有结构体struct,默认C++中struct也是类,这样我们就可原创 2017-07-29 23:34:49 · 1829 阅读 · 0 评论 -
判断一个栈的弹出序列是否为合法序列
题目: 输出两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序,假设压入栈的苏偶偶数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列.序列4,5,3,2,1是该压栈序列的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 思路: 验证:#include<iostream>#include<stack>#include<assert.h>原创 2017-07-25 14:43:38 · 1572 阅读 · 0 评论 -
判断一颗树是不是完全二叉树
首先我们要明白完全二叉树的含义: 完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左 边,这就是完全二叉树 我们先来回顾下二叉树按层遍历,先将根节点进队列,然后判断每次这个队列是否为空,不为空,每次取队头的数据然后pop,最后再递归走其子问题,判断左子树是否为空,不为空直接入队,再判断右子树是否为空原创 2017-07-25 10:52:54 · 713 阅读 · 1 评论 -
刷题--二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像 那么什么是二叉树的镜像呢?我们其实可以从生活中得到启示,每个人早上起来都有找镜子的习惯,这样我们就会很容易想明白二叉树的镜像了, 如图两颗互为镜像的二叉树. 观察这颗二叉树我们会发现,这两颗二叉树的根节点相同,但是它们的左右两个子节点交换了位置. 步骤: 1:首先交换节点2和节点6 2:第二步:交换将节点1和节点3作为整体然后原创 2017-07-24 21:59:26 · 279 阅读 · 0 评论 -
统计第一个只出现两次的字符
方法一:在一个一维数组里面查询: 最直接的方法是从头到尾遍历这个字符数组的字符,当访问这个字符时,拿这个字符和后面的每个字符匹配,如果下次又找到一个字符再次出现,就表明是出现两次的字符,如果字符与n个字符,每个字符可能都会与后面的比较,这种思路的时间复杂度较高,O(N^2) 方法二:map加上排序; 思路是:将字符作为,键值,将出现的次数作为实值,那么如歌保证第一个出现的次数是两次我们需要加原创 2017-07-20 16:55:26 · 747 阅读 · 0 评论 -
判断链表是否带环?若带环求环的长度?求环的入口点?
一:判断链表是否带环 方法是快慢指针: 开始的时候,两个指针都指向开头,然后让快指针走两步,而慢指针每次走一步,当他们在某个点相遇则表明,这个链表带环,否则继续遍历这个链表bool IsCircle(ListNode*phead){ assert(phead); ListNode*fast =phead; ListNode*slow =phead; while(原创 2017-07-17 11:22:22 · 491 阅读 · 0 评论 -
反转链表和查找倒数第K个节点
一:链表的逆置(反转链表) 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点: 节点的结构struct ListNode{ ListNode(const int& val) :_val(val) ,next(NULL) {} int _val; ListNode*next;};这里面我们需要三个指针分别是cur,用来顺序遍原创 2017-07-14 16:23:19 · 697 阅读 · 0 评论 -
剑指offer--替换空格
题目:实现一个函数,把字符串中的每个空格替换成”%20”,例如输入”we are happy”则输出”we20%are20% happy”; 常规的思路: 我们遍历这个字符串,没遇到一个空格的时候我们把1个空格替换成3个空格,也就是空格后面的字符向后移两个字节,否则就会把后面的字符覆盖了; 如:我们从头打到尾把”we are happy”中的一个空格替换成两个空格 方案一:遇到空格向后挪两位原创 2017-06-06 16:55:16 · 652 阅读 · 0 评论 -
查找最小的K个数
输出最小的K个数 方案1:如果输入的数组可变,我们可以借助Partion部分排序的思想,随机选k值,经过排序后,k左边的数都比k小,k右边的数都比k大,这样经过排序后,在k左边的数字就是最小的K个数:int Partion(int*a, int n, int left, int right){ if (a == NULL || n <= 0) { return 0原创 2017-08-27 10:21:11 · 581 阅读 · 0 评论