![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
liyf__
这个作者很懒,什么都没留下…
展开
-
约瑟夫环问题
/*面试例题:已知n个人(以编号1,2,3,...n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列, 他的下一个人又从K开始报数,数到m的那个人出列;依此规律重复下去,知道圆桌周围的人全部出列。解析:约瑟夫环的问题----要通过输入n,m,k 3个正整数,求出列的序列,采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。核心原创 2017-05-19 17:37:23 · 333 阅读 · 0 评论 -
数组中出现次数超过一半的数字
/*面试题29:数组中出现次数超过一半的数字 :数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 */ /* 解题思路:1.首先需要判断输入的数组是否有效。 2.数组中有一个数字出现的次数超过数组长度的一半,说明它出现的次数比其他所有数字出现的次数的和还要多, 那么要找的数字肯定是最后一次把次数设为1时对应的数字。原创 2017-08-20 09:53:46 · 741 阅读 · 0 评论 -
删除链表结点
面试题13: 题目:给定单项链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。//链表结点struct ListNode{ int m_nvalue; ListNode* m_pNext;};//创建链表ListNode* CreateListNode(int value){ ListNode *pNode = new ListNode();原创 2017-08-13 11:04:17 · 251 阅读 · 0 评论 -
求链表中倒数第k个结点
/* 面试题15:输入一个链表,输出该链表中倒数第k个结点,本题从1开始计数,即链表的尾结点就是倒数第1个结点, 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点。 */struct ListNode{ int m_nvalue; ListNode* m_pNext;};原创 2017-08-13 11:44:38 · 211 阅读 · 0 评论 -
将一个链表进行反转
/* 面试题16:反转链表:定义一个函数,输入链表的头结点,反转该链表并输出反转后链表的头结点。 */struct ListNode{ int m_nvalue; ListNode* m_pNext;};//创建链表ListNode* CreateListNode(int value){ ListNode *pNode = new ListNode();原创 2017-08-13 12:27:48 · 360 阅读 · 0 评论 -
替换空格
/*面试例题4:替换空格 请实现一个函数,把字符串中的每个空格替换成“%20”。 例如输入“We are happy",则输出”We%20are%20happy"。转换的规则是在‘%’后面跟上ASCII码的两位十六进制的表示,比如空格的ASCII码是32,即16进制的0x20,因此空格被替换成“%20”,再比如‘#’的ASCII码为35,即十六进制原创 2017-05-19 16:30:57 · 315 阅读 · 0 评论 -
合并两个排序的链表
/* 面试题17:合并两个排序的链表 输入两个递增排序额的链表,合并这两个链表并使新链表中的结点任然是按照递增排序的。 */ /* 解题思路: 1.先判断链表为空的情况,如果链表1为空,则合并后的链表就是链表2,如果链表2为空,则合并后的链表就是链表2 2.当两个链表都不为空时,根据链表头结点比较大小,如果链表1的头结点的值小于链表2的头结点的值,则链表1的头结原创 2017-08-14 10:31:50 · 248 阅读 · 0 评论 -
二叉树的镜像
/* 面试题19:二叉树的镜像 输入一个二叉树,输出它的镜像。 */ 解题思路: 先前序遍历树的每一个节点,如果遍历到的结点有子节点,就交换它的两个子节点。当交换完所有非叶子结点的左右子节点之后,就得到了树的镜像。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode*原创 2017-08-14 15:12:46 · 139 阅读 · 0 评论 -
顺时针打印矩阵
/* 面试题20:顺时针打印矩阵 */void PrintNumber(int number){ printf("%d ",number);}//一步一步打印矩阵void PrintMatixInCircle(int** numbers,int columns,int rows,int start){ int endX = columns-1-start; in原创 2017-08-14 16:26:28 · 272 阅读 · 0 评论 -
树的子结构
/* 面试题18:树的子结构 :输入两棵二叉树A和B,判断B是不是A的子结构, */ /* 解题思路: **对树的遍历采取递归的方式 1.先在树A中查找和B的根节点的值一样的结点R 2.判断树A中以R为根节点的子树是不是包含和树B一样的结构 如果结点R的值和树B的根节点不相同,则以R为根结点的子树和树B肯定不具有相同的节点, 如果它们的值相同,则递原创 2017-08-14 14:45:31 · 200 阅读 · 0 评论 -
最小的k个数
if 0/* 面试题30:最小的k个数 :输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 解题思路: 1.在n个整数中找最小的k个数,我们可以创建一个大小为k的数据容器来存储最小的k个数字。 2.每次从输入的n个整数中读取一个数,此时如果容器中已有的数字小于k个,则直接将 读入的数字放入容器,原创 2017-08-22 16:19:58 · 263 阅读 · 0 评论 -
从上往下打印二叉树
/* 面试题23:从上往下打印二叉树 从上往下打印出二叉树的每一个节点,同一层的结点按照从左到右的顺序打印。 如图:从上往下依次打印数据为:8 3 10 1 6 14 4 7 13. /* 解题思路:1.从上往下打印,即按层依次打印,首先打印根结点,接下来打印它的两个子结点。 2.借助容器队列(先入先出),如果原创 2017-08-18 11:30:19 · 197 阅读 · 0 评论 -
排序算法--对公司员工年龄的排序
/*.................................//排序算法--对公司员工的年龄排序,要求时间效率O(n)解题思路: 公司员工的年龄有一个范围 这里规定0~99 用长度100的整数数组作为辅助空间换来了O(n)的时间效率。*/#include<stdio.h>#define N 10void SortAges(int ages[],int length)原创 2017-05-19 16:37:42 · 3730 阅读 · 0 评论 -
位运算--与,或,异或,左移,右移
位运算: 是把数字用二进制表示之后,对每一位上0或者1的运算。关于位运算的5种运算方式: 与,或,异或,左移,右移。 与,或,异或的运算规律与(&) 0&0 = 0 1&0 = 0 0&1 = 0 1&1 = 1或(|) 0|0 = 0 1|0 = 1 0|1原创 2017-05-16 15:03:11 · 607 阅读 · 0 评论 -
斐波那契数列——递归实现
#if 0/*斐波那契数列: 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项,斐波那契数列的定义如下: f(n) = 0 n = 0 =1 n = 1 =f(n-1)+f(n-2) n>1递归实现的时间复杂度是以n的指数的方式递增的。*/long long F原创 2017-05-19 16:16:27 · 656 阅读 · 0 评论 -
找出旋转数组中的最小数字
*面试题8: 旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3,4,5,1,2}位{1,2,3,4,5}得一个旋转,该数组的最小值为1.*/#if 0#include<stdio.h>#define N 8int MinInOrder(int* numbers原创 2017-05-19 16:24:15 · 346 阅读 · 0 评论 -
交换两个数的三种方法
#if 0 /* .....交换两个数的值: 方法1:通过临时变量交换 方法2:通过加减交换 方法3:通过异或来进行交换 */#include<stdio.h>//.....借用临时变量交换int main(){int a,b;int t = 0;printf("请输入两个数的值:a和b:");scanf("%d%d",&a原创 2017-05-19 16:26:35 · 543 阅读 · 0 评论 -
斐波那契数列——循环实现
#if 0/*斐波那契数列: 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项,斐波那契数列的定义如下: f(n) = 0 n = 0 1 n = 1f(n-1)+f(n-2) n>1递归实现的时间复杂度是以n的指数的方式递增的。*/#include<stdio.h>long long F原创 2017-05-19 16:28:43 · 1333 阅读 · 0 评论 -
二维数组中某一元素的查找
/*面试例题3:二维数组中某一元素的查找 :在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:首先选取数组中右上角的数字,如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数原创 2017-05-19 16:32:34 · 2292 阅读 · 1 评论 -
连续子数组的最大和
/* 面试题31:连续子数组的最大和 :输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n). */ /* 解题思路:1.例如一个数组{5,2,-10,7,2,-1},先初始化和为0,从第一个数字开始累加,此时的和就是第一个数字5, 2.此时再继续加,当加到第二个数字和为7,判断这个数原创 2017-08-22 17:21:25 · 231 阅读 · 0 评论