《剑指offer》
Hansionz
但愿一切
展开
-
《剑指offer》:1+2+3+....+n
【问题描述】:编程求1+2+3+…+n要求:不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句。【解决思路】: 这个题目如果没有加要求对每一个都比较熟悉,也都可以求解。我们能够想到的方法有 (1)递归 (2)循环累加 (3)等差数列求和公式 例如:#include<stdio.h>#include<windows.h>int...原创 2018-05-25 13:42:43 · 195 阅读 · 0 评论 -
【剑指offer】:将一颗二叉搜索树转换为一个排序的双向链表
0.题目 输入一颗二叉搜索树,将这棵树装换为一个排序的双向链表。要求不能创建新的结点,只能调整二叉搜索树中结点的指向。例如: 1.解题思路我们知道二叉搜索树的中序遍历是递增有序的,要想转换为有序的链表,我们可以利用中序遍历的路线装换简化这个问题,如果这颗树只有一个结点,那么这棵树转换为链表就只有一个结点,直接返回就可以了;假设这棵树为下面的样子,左右子树分别只有一个结点...原创 2018-09-05 18:53:50 · 657 阅读 · 1 评论 -
【剑指offer】:顺时针打印矩阵
0.题目 输入一个矩阵,按照从外到里以顺时针的方向依次打印出每一个数字。例如: 1.解题思路1.以上图为例,首先,从左到右打印1-5,从上到下打印10、15、20,其次从右到左打印20、19、18、17、16,最后打印11、6。这是打印最外边一圈的结果2.第二步,可以看出从外边向里边顺时针打印是一个循环的过程,但是循环的结束条件怎么确定?我们可以发现每一圈开始打印的位置...原创 2018-09-03 15:41:18 · 479 阅读 · 0 评论 -
求两个链表的第一个公共结点(既求两条单链表的交点)
题目:输入两条单链表,求它们的第一个公共结点。结点的定义如下:typedef struct Node{ DataType data; struct Node* next;}Node,*pLinkList;解题思路:方法一:暴力法。拿出一条链表中的一个结点,然后在另一条链表中从前向后扫描,如果存在相同的结点,则此节点为第一个公共结点,否则,继续向后遍历。假设两条链表...原创 2018-09-15 20:22:32 · 1175 阅读 · 0 评论 -
树中两个节点的最低公共祖先
一.树中两个节点的最低公共祖先题目一:输入两个二叉搜索树的结点,求两个结点的最低公共祖先,所谓的最低公共祖先是指距离两个节点最近的共同祖先。 例如: 解题思路:1.二叉搜索树具有一个很好的特点。以当前结点为根节点的左边结点的值都是小于根节点的值,右边结点的值都大于根节点的值。2.根据这个特点,如果给的两个节点的值都小于根节点,那么它们的最低公共祖先就一定在它左子树。...原创 2018-09-15 21:40:03 · 5063 阅读 · 0 评论 -
全排列问题以及扩展题目
0.题目 输入一个字符串,打印出该字符串中字符所有的排。例如:输入abc,屏幕需要打印出来abc、acb、bac、bca、cab、cba.1.解题思路首先我们固定a,求出bc的全排列,而bc的全排列bc、cb。而求bc的全排列是一个子问题,可以先固定b,求c的全排列,然后在交换继续求解。然后交换a和b得到bac,固定b,求ac的全排列,和1的求法一样。然后交换a和c,但是在...原创 2018-09-06 16:10:51 · 386 阅读 · 0 评论 -
求第n个丑数
一.求第N个丑数题目:我们把只包含因子2、3、5的数称作丑数(UglyNumber)。假设现在求从小到大排序的第1500个丑数。例如,6、8都是丑数,但是14不是丑数,因为它还包括素因子7。解题思路一:暴力枚举法。1.首先,我们应该了解什么是因子。所谓的数m是数n的因子,是指数n可以被数m整除,既n%m=0。2.要判断一个数是不是为丑数。就要判断这个数除了能被2、3、5整除,是否可...原创 2018-09-16 12:42:59 · 5515 阅读 · 0 评论 -
从1到N的整数中1出现的次数
题目:输入一个整数N,输出从1到N所有整数中1的个数。例如,输入数10,输出为2。解题思路一:遍历从1到N的所有数字,求出每个数中1的个数,然后累加起来,就是最终的结果。代码实现://求出每个数中1的个数int NmberOfI(unsigned int n){ int number = 0; while (n) { if (n % 10...原创 2018-09-16 19:32:16 · 469 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如,输入一个排序的数组1,2,3,4,4,4,4,4,5,6和数字4,则输出4出现的次数5。解题思路一: 我们可以根据二分查找找到要查找数字在数组中第一次和最后一次出现的位置,就可以确定总共出现过几次了。但是要怎么找呢?首先根据二分查找找到一个要查找的数字,然后在它的左右两边顺序查找到它们第一次和最后一次出现的位置。但是当要查找的数字在左边或者右边全...原创 2018-09-16 20:40:26 · 393 阅读 · 0 评论 -
判断一颗二叉树是否为平衡二叉树
一.判断一颗二叉树是否为平衡二叉树题目:输入一颗二叉树的根节点,判断该二叉树是否为平衡二叉树。所谓的平衡二叉树是指以当前结点为根结点的树,左右子树的深度不得超过1。 例如: 解决思路一:按照前序遍历的路线判断。1.判断以根结点的树是否为二叉平衡树。求出左右子树的高度,判断它们的高度差是否超过了1。2.递归判断根的左子树是否为平衡二叉树3.递归判断根的右子树是否...原创 2018-09-17 17:09:05 · 31331 阅读 · 10 评论 -
【剑指offer】:和为s的两个数字&&和为s的连续正数序列
一.和为s的两个数字题目:输入一个递增排序的数组和一个数s,在数组中查找两个数,使得他们的和正好等于s。如果存在一对,输出任意一组即可。解题思路:1.设置两个指针low,high,一个从数组最左边开始,一个从数组最右边开始2.比较low和high的和和s的大小3.如果low和high的和大于s,由于数组是递增有序的,所以要查找的俩个数必然在high指针的左边4.如果low和hi...原创 2018-09-13 20:03:12 · 190 阅读 · 0 评论 -
【剑指offer】:扑克牌的顺序
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,既这5张牌是不是连续的。2-10位数字本身,A为1,J为11,Q为12,K为13,大王和小王可以看出是任何数。解决思路:1.把大王和小王看做是02.对所给序列进行排序3.统计差值的个数(如果相邻的两个值差1,则差值为0,如果差大于1,则插入为n-1)4.统计0的个数5.比较。如果差值的个数大于0,则必然不是顺子,否则是顺子...原创 2018-09-13 20:20:58 · 2018 阅读 · 0 评论 -
不用加减乘除实现加法
一.不用加减乘除实现加法题目:实现一个函数,求两个数的和,但是要求在函数内不得使用+ - * /四个运算符。解题思路:不得使用四则运算符,我们只能考虑用位运算符。首先,我们先分析一般的加法是怎样去处理的:(假设求17+5)1.先求各个位上的加法值(先不算进位),1+0=1,7+5=2,既122.找出进位的数7+5=12存在进位,进位是103.将前两步的值相加12+10=22,...原创 2018-09-14 13:40:24 · 2691 阅读 · 1 评论 -
连续子数组的最大和
一.连续子数组的最大和题目:输入一个整型数组,数组里有整数,也有负数。数组中一个或多个连续整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)解题思路:假设求数组1,-2,3,6,9,-4,5,2的连续子数组的最大和。1.从1开始,1+(-2)=-1,-1+3=2小于3本身,说明前面的一个子数组1,-2不能算在最大和的连续子数组中。2.从3开始向后加3+6+9=18...原创 2018-09-14 22:15:15 · 302 阅读 · 0 评论 -
第一次只出现一次的字符(以及扩展题目)
题目:在字符串中找出第一个只出现一次的字符。例如,字符串avbdabkd,第一次出现的只有一个的字符为v。解题思路:方法一:常规思路O(n*n)的解法。从字符串的第一个字符开始,那出来一个字符和字符串的后边的字符比较,如果存在相同的则不是出现一次的字符,如果不存在,则找到返回。代码实现:char firstonechar(char *str){ if (str =...原创 2018-09-15 12:15:22 · 553 阅读 · 0 评论 -
【剑指offer】:二叉搜索树的后序遍历(给定一个序列,判断该序列是否为二叉搜索树的后序遍历)
0.题目 输入一个整数数组,判断该整数数组是不是一颗二叉搜索树的后序遍历。例如,[1,2,5,6,4]是一颗二叉搜索树的后序遍历,[1,7,5,2,6,4]不是二叉搜索树的后序遍历。如果是,返回1,不是返回0。1.解题思路第一步,确定根结点,对于一颗二叉搜索树的后序遍历,最后一个数一定是二叉搜索树的根。第二步,从头开始找到第一个大于根节点值的值,如果数组中的第一个数就大于根节...原创 2018-09-05 15:05:46 · 2153 阅读 · 0 评论 -
【剑指offer】:求旋转数组中最小的数字
0.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组,该数组的最小值为1。...原创 2018-08-29 22:35:46 · 182 阅读 · 0 评论 -
《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi
题目描述 编程实现字符串到整数的转换,例如输入字符串“123456”,输出整数12345函数atoi atoi 是把字符串转换成整型数的一个函数。包含在头文件stdlib.h中。 函数原型: int atoi(const char *nptr); 参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包...原创 2018-06-25 11:27:01 · 372 阅读 · 0 评论 -
查找一个数组中非成对的数字问题
前言:本篇文章介绍如何找出一个数组中非成对的一个数字,后边还拓展到求两个非成对的数字和三个非成对的数字中的任意一个。这几个题目主要考察的是我们对异或操作符的掌握程度。问题一:查找数组中一个非成对的数字假设找出数组arr[]={1,1,2,2,3,3,4}中不成对出现的数字,既4.异或的性质:a^a=0;b^0=b.将数组中的所以值安位异或起来就可以找到唯一一个不成对出现的数字,既...原创 2018-07-01 09:10:36 · 865 阅读 · 0 评论 -
【剑指offer】:从尾到头打印单链表(第5题)
定义链表结点typedef int datatype;typedef struct Node{ datatype data; struct Node *next;}Node, *pLinklist;思路一:递归实现 要想将链表从尾到头打印,我们首先想到的方法应该是递归,每次访问到一个结点的时候,递归访问后面结点,最后打印自己。代码实现voi...原创 2018-07-03 23:39:52 · 261 阅读 · 0 评论 -
【剑指offer】:替换空格(第四题)
题目描述 请实现一个函数,把字符串的每一个空格替换成“%20”。例如,输入“we are happy”,则输出“we%20are%20happy”。思路分析首先,我们能到的办法就是从头遍历字符数组,遇到一个空格,将空格后面的字符串向后移动两位(‘%’,’2’,’0’),然后将空格替换成%20这三个字符,然后继续向后遍历字符串,遇到空格则将后面的字符移动两位,然后将空格替换成...原创 2018-07-05 22:06:20 · 120 阅读 · 0 评论 -
【剑指offer】:在O(1)的时间删除链表结点(第13题)
题目描述 给定一个单向链表的头指真和结点指针,定义一个函数在O(1)的时间内删除该结点。链表,链表结点和函数定义如下://链表结点typedef struct ListNode{ int m_nValue; struct ListNode* next;}ListNode,*pListNode;//函数void DeleteNode(pListNode* pL...原创 2018-07-05 23:03:21 · 315 阅读 · 0 评论 -
【剑指offer】:复杂链表的复制(第26题)
问题描述 实现函数ComplexLinkNode* Clone(ComplexLinkNode* pHead)复制一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指针指向链表中任意一个结点或者是NULL。定义链表结点typedef struct Node{ datatype data; struct Node...原创 2018-08-12 23:36:43 · 197 阅读 · 0 评论 -
【剑指offer】:Fibonacci数列
0.什么是Fibonacci数列?例如:0 1 1 2 3 5 8 13.....它被定义为: 1.题目原创 2018-08-30 21:28:51 · 164 阅读 · 0 评论 -
【剑指offer】:青蛙跳台阶及变态跳台阶问题
0.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)原创 2018-08-30 22:58:12 · 531 阅读 · 0 评论 -
【剑指offer】:已知前序、中序序列,重建一颗二叉树
0.题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。1.思路2.代码实现//重建二叉树BTNode* ReplaceBuildBT(BTDataType* prev_start,...原创 2018-08-27 22:57:03 · 773 阅读 · 0 评论 -
【剑指offer】:二进制中1的个数
0.题目 实现一个函数,输入一个整数,输入该数二进制表示中1的个数。例如9的二进制表示是1001,有2的1,则输出2.1.解题思路方法一:int CountBitOne(unsigned int num){ int count = 0; while (num) { //判断最后一位是否为1 if (num % ...原创 2018-08-31 12:26:35 · 216 阅读 · 0 评论 -
【剑指offer】:数值的整数次方
0.题目 实现函数double Power(double base,int exponent),求base的exponent次方,不能使用库函数,不用考虑大数问题。1.解题思路需要实现的函数指数为整型,不用考虑指数为浮点型,可以分为下面几类:指数为正整数,不用考虑什么,直接计算结果指数为0时,这个时候要看底数base,如果base为0,则无意义,因为0的0次在数学上是没有...原创 2018-08-31 15:29:04 · 142 阅读 · 0 评论 -
反转链表(ReverseList)
0.题目 定义一个函数,输入链表的头结点,然后输出反转后链表的头结点,链表的结点定义如下:typedef struct Node{ DataType data; struct Node * next;}*pNode,*pLinkList;1. 解题思路方法一:重新开辟一条链表,然后依次取下原链表的每个结点头插入到新的链表中,新的链表就是逆置的结果...原创 2018-09-01 11:05:47 · 7373 阅读 · 0 评论 -
合并两个已排序的链表
0.题目 输入两个递增排序的链表,合并这两个链表并使得新的链表依然是递增有序的。 1.解题思路递归方法:首先比较给新链表接上一个结点,然后这个结点的next就是剩下的两条链表合并的结果。 pNode Merge_R(pLinkList list1, pLinkList list2){ //处理链表为空 if (list1 == NULL)...原创 2018-09-01 11:53:38 · 391 阅读 · 0 评论 -
树的子结构问题(判断一棵树root2是否是另一棵树root1的子结构)
0.题目 判断一棵树root2是否是另一棵树root1的子结构.子结构被定义为 1.解题思路第一步,遍历root1这棵树,寻找和root2根节点相同的结点第二步,如果找到相同的结点,判断以找到结点为根结点的子树是否和root2这颗树的结构相同//2.判断以找到结点为根节点的树的结构是否为和root2这棵树的结构相同int SubTreeIsSub(BTNod...原创 2018-09-01 16:09:00 · 218 阅读 · 0 评论 -
【剑指offer】:求最小的K个数
题目描述: 输入N个数,找出其中最小的K个数。例如,输入1,2,3,4,5,6,7,8,求最小的4个数,既输出1,2,3,4。解题思路一: 这道题我们最直接的想法就是将这些数按照升序排序,然后取前K个数,就是我们最终想要的到的结果,现在较好一点的排序方法时间复杂度是NlogN,我们还有更快的实现方法吗?代码实现:对于各种排序的总结见我的另一篇博客:https://blog.csdn.ne...原创 2018-09-28 23:55:57 · 5522 阅读 · 1 评论