剑指offer
Jerry-Rulai
这个作者很懒,什么都没留下…
展开
-
关于数组和指针的sizeof问题
在C/C++中,当我们声明一个数组时,数组的名字也是一个指针,该指针指向数组的第一个元素。因此,我们也可以用指针访问数组。数组和指针的区别,先看下面代码:int GetSize(int data[]){ return sizeof(data);}int main(){ int data1[]={1,2,3,4,5}; int size1=sizeof(data1); in...原创 2019-01-31 16:26:11 · 272 阅读 · 0 评论 -
逆序对问题(归并排序)--c++实现
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size&l...原创 2019-03-22 16:41:56 · 907 阅读 · 0 评论 -
删除链表中重复的结点
题目:在一个排序的链表中,如何删除重复的结点?所有重复的节点都被删除,不保留。思路:首先可能有多个重复,还要考虑到头结点就是重复的情况,所以函数的参数为ListNode** head而不是ListNode *head。我们只需要维持一个preNode,即当前节点的上一个节点,一旦发现重复,我们连续删除重复的节点,直到不重复或结尾。然后再让preNode指向第一个不重复的节点即可。void ...原创 2019-02-26 11:09:45 · 124 阅读 · 0 评论 -
剪绳子
题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n&gt;1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1]…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。思路:动态规划:把最优解储存在一个product数组里,设f(n)为长度为n的绳子的最大乘积(n&gt;...原创 2019-02-13 17:26:25 · 115 阅读 · 0 评论 -
机器人的运动范围
题目:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?思路:回溯问题,我们让机器人从(0,0)开始走,将所...原创 2019-02-13 10:57:35 · 97 阅读 · 0 评论 -
矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入 该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个...原创 2019-02-12 17:46:20 · 108 阅读 · 0 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。思路:若直接用O(n)的顺序查找,显然不是最优解因为经过旋转的数组也是由两个排好序的数组组成,要充分利用这一性质。我们采取类似二分查找的方法,用p1指向开...原创 2019-02-12 14:31:08 · 77 阅读 · 0 评论 -
快速排序QuickSort
#include &lt;iostream&gt;#include &lt;exception&gt;#include &lt;random&gt;#include &lt;ctime&gt;using namespace std;int RandomInRange(int start, int end){ if (start &原创 2019-02-12 11:58:57 · 128 阅读 · 0 评论 -
斐波那契数列
题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。思路:无非两种思路,一种是递归,一种是循环。由于n较大时,递归容易引起栈溢出,导致结果不正确或时间效率低下,所以还是首选循环。另外有种基于生僻数学公式的矩阵算法,时间效率可达到O(logn),在这里就不介绍这种算法了完整代码包含测试代码:#include <iostream>using names...原创 2019-02-12 10:09:15 · 127 阅读 · 0 评论 -
用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。思路:stack1和stack2是两口井,stack1是一直保持着有水(有元素)的状态,而stack2是一个temp量,stack1导入stack2,stack1的井底的的元素就到了stack2井顶template <type...原创 2019-02-11 21:24:53 · 123 阅读 · 0 评论 -
二叉树的下一个节点
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。思路:如果该节点含有右子树,那么他中序遍历的下一个节点就是他右子树的 “最” 左节点如果他没有右子树,但是有父节点:1.他是父节点的左子树,那么下一节点就是父节点2.他是父节点的右子树,那么继续向上遍历,直到找到一个是自己父节点的左子树的...原创 2019-02-11 17:50:26 · 121 阅读 · 0 评论 -
在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除结点。思路:一般的想法是从头开始遍历,直到找到要删除的节点p的前一个节点temp,然后让temp->next指向p->next即可这种思路时间复杂度是O(n)的我们分情况考虑,如果要删除的节点p不是尾部节点,我们可以让p拷贝p->next节点的信息,然后删除p->next节点即可,这种时间复杂...原创 2019-02-16 10:26:02 · 101 阅读 · 0 评论 -
打印从1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。思路:首先注意这是个大数问题,n很大的时候c++的int和long long都吃不消,所以数字的存储要用字符串这里我模拟了大数相加,只不过每次都是加1另外要注意打印的问题,cout比较慢,要用printf,还有打印的时候要从第一个非0数字开始打印#include &lt;io...原创 2019-02-15 15:45:43 · 187 阅读 · 0 评论 -
数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。思路:注意把指数和底数的各个情况考虑到就好了double Power(double base, int exponent){ if (base == 0 && exponent == 0) retu...原创 2019-02-15 11:17:08 · 77 阅读 · 0 评论 -
字符串数组与指针的问题
在c++中常量字符串放在单独的一个内存区域,当几个指针赋值给相同的常量字符串时,他们实际上会指向相同的内存地址。但是用常量内存来初始化数组,情况却有所不同。参考下面代码#include <iostream>#include <string.h>using namespace std;int main(){ char str1[]="hello world"...原创 2019-02-01 10:19:27 · 236 阅读 · 0 评论 -
二维数组的查找
若已知一个二维数组每一行从左到右是递增的,每一列从上到下是递增的,那么可以采用一种时间复杂度为O(n)的算法,其中n为数组的列数或行数,从而取代了遍历一遍查找(O(n*n))算法:二维数组是个矩形状,每次我们要目标数字与矩形右上角的数比较,若目标数字大,则矩形最上面一行砍掉,若目标数字小,则把矩形最右边一列砍掉。直到矩形消失。代码如下:bool Find(int (*matrix)[4],...原创 2019-01-31 20:41:02 · 89 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路:解这题需要把题意仔细研究清楚,反正我试了好多次才明白的。首先,考虑特殊情况:1>两...原创 2019-04-05 15:39:10 · 164 阅读 · 0 评论