剑指offer
哈哈哈哈哈哈丶
花有重开日,人无再少年。
展开
-
剑指offer--赋值运算符函数
简单模拟实现String类原创 2017-03-18 21:48:06 · 416 阅读 · 0 评论 -
面试题:合并两个有序链表
题目:合并两个有序链表,合并以后的链表依旧有序。 思路我们合并一个有序的链表,首先我们要找出两个链表中头结点小的那个。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点。 在剩余的链表中,我们要继续寻找头街点较小的那一个,继续连接在1后面。 当我们得到两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的结点依然是排序的,因此合并的步骤和原创 2017-07-14 19:42:49 · 457 阅读 · 0 评论 -
反转链表
题目:定义一个函数,输入一个链表的头街,反转该链表并输出反转后链表的头结点。思路:假如我们已经把a,b两个节点反转完了,现在想反转c节点。我们可以从图中看到,如果把c的next结点直接指向b结点,那么c后面的结点就断开了,以后就找不到了。所以我们可以定义三个指针,分别指向当前遍历到的结点,它的前一个结点,它的后一个结点。当我们反转c结点时,防止链表断开可以先把d结点保存下来。当原创 2017-04-26 09:54:44 · 225 阅读 · 0 评论 -
链表中倒数第K个节点
题目:输入一个链表,输出链表中倒数第K个节点。为符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个节点。例如,一个链表有6个节点,从头结点开始他们的值依次是1,2,3,4,5,6,。这个链表的倒数第3个节点是值为4的结点。struct Node{ int _value; Node* _next; Node(const int x) :_value(x) ,原创 2017-04-26 09:32:47 · 488 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
思路:利用两个分别指向数组头尾的指针。假如:first指向数组的第一个元素,end指针指向数组的最后一个元素。向后移动first指针直到它指向偶数,向前移动end指针直到它指向奇数。交换两个指针指向的内容。继续移动,符合条件就继续交换。直到end指针在first指针前,表明所有的奇数全都位于偶数的前面。void ReOrderArray(int* arr, int len){ if (原创 2017-04-26 09:15:14 · 209 阅读 · 0 评论 -
二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树节点的定义如下:struct Node{ int _value; Node* _left; Node* _right;};我们刚看到这个题目时,肯定感觉一头雾水。不知道镜像是什么意思,我们可以画一个图来观察一下:原创 2017-04-28 13:36:06 · 407 阅读 · 0 评论 -
在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。思路:找到要删除的结点i 的下一个结点j ,把后面的结点j 的内容复制到要删除结点i,i->next = j->next, delete j;注意: 删除尾结点时,只能从头到尾遍历链表再进行删除。 只有一个节点,删除头结点。(不要忘记删除把头结点设置成NULL)struct Node{ in原创 2017-04-24 17:25:49 · 452 阅读 · 0 评论 -
数值的整数次方
题目:实现 double Power(double base,int exponent),求base的exponent次方。注意:要考虑0的0次方,没有意义。0没有倒数,0的-1次方错误。其他数的-exponent,可以先算base的exponent次方,在求倒数。float,double类型的数据比较是否相等,不能直接用==判断。因为他们在计算机中存储的规则不一样,如若两个数差的原创 2017-04-15 19:55:37 · 338 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的 数字。例如,输入前序遍历{ 1, 2, 4, 7, 3, 5, 6, 8 },后序遍历{ 4, 7, 2, 1, 5, 3, 8, 6 },重建二叉树。思路:我们可以利用递归思想。利用前序遍历我们不难发现前序遍历的首元素就是树的根节点。而中序遍历是先访问左子树,根,右子树。我们就可以在原创 2017-04-05 14:57:07 · 221 阅读 · 0 评论 -
二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。方法一:一个数与1相与,如果结果是1,表示该数的最右边以为是1,否则是0;把这个数向右移一位,继续与1原创 2017-04-13 16:03:18 · 398 阅读 · 0 评论 -
斐波那契数列
#includeusing namespace std;//0,1,1,2,3,5,8,13//非递归long long Fib(long long n){ if (n <= 0) return 0; if (n == 1 || n == 2) return 1; long long x1 = 1; long long x2 = 1; long long sum =原创 2017-04-12 22:30:50 · 329 阅读 · 0 评论 -
旋转数组的最小元素
题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。原创 2017-04-11 10:39:21 · 268 阅读 · 0 评论 -
剑指offer--两个栈实现一个队列
栈:先进后出; 队列:先进先出。思路:我们可以利用两个栈,s1,s2。首先入队时,在s1入栈。如果想要出队,首先判断栈s2是否为空,如为空,把s1的元素压入s2;即,s1栈底的元素就到了s2的栈顶,就可以pop出去。若不为空,直接s2 pop;若入队,直接入栈s1,当出队时,如果s2不为空就pop s2,如果s2为空,就把s1的元素导入s2。例如: 1)入队1,2,3:队列:1原创 2017-04-05 22:36:28 · 393 阅读 · 0 评论 -
两个队列实现一个栈
两个栈实现一个队列链接:两个栈实现一个队列两个队列实现一个栈 思路:插入时:插入不为空的队列里。始终保持一个队列为空。删除时:假如不为空的队列叫q1,空队列为q2. 需要先把q1除最后一个元素,全部导入q2中,然后pop出q1中最后的一个元素。q1此时为空,q2不为空。如果此时想插入,就插入在q2中,删除就重复上述步骤。这样就实现了栈的后进先出。#includeusing n原创 2017-04-11 09:14:52 · 365 阅读 · 0 评论 -
剑指offer--二维数组的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的 顺序递增。请完成一个函数,输入一个二维数组和一个整数,判断数组中是否含有该整数。我的思路是,首先拿这个数字与二维数组的右上角的数进行比较,如果这个数大于右上角的数,排除当前这一行(右上角的数是它所在行最大的数),如果这个数小于右上角的数组,排除这一列(右上角的数是所在列最小的).不断缩小行列,最终就会得到结果!原创 2017-03-21 19:44:42 · 302 阅读 · 0 评论 -
剑指offer--替换空格
请实现一个函数,把字符串中的每个空格替换成%20.例如:输入"We are happy." 输出"we are%20are%20happy."。要想实现这个函数,我们最容易想到的是,从头往前遍历,遇到空格就把空格替换换成%20,这种方法最容易想到。但他有一个缺陷,他的时间复杂度为O(n^2).每遇到空格就要把空格以后的字符往后面移,但是后面的字符也可能还有空格。这样就使有的字符多次移动,这样效原创 2017-03-21 19:33:30 · 235 阅读 · 0 评论 -
面试题:螺旋队列
下面是一个螺旋队列: 问题: 看清以上数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如:7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字;或输入任意数字,输出该数字的坐标。解析: 我们从图片中可以观察到,这个螺旋队列是顺时针螺旋向外扩展的。我们可以把它看成一层一层向外延伸,第0层为中间的那个1原创 2017-07-09 11:48:51 · 1876 阅读 · 1 评论