随笔分类 -  剑指offer

摘要:题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。分析:排成最小的数,那么这些数组元素肯定有个最佳的排序,所以我们需要对数组元素进行排序,排序之后数组元素顺序连接即可组成最小的数所以这些数排序的规则是什么?字典序!假如x1x2x3和y1y2y3两个数,组成的数x1x... 阅读全文
posted @ 2019-09-24 11:39 西*风 阅读(416) 评论(0) 推荐(1) 编辑
摘要:题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析:由于链表存在一个随机指针,所以不能按照普通的方法复制,按照如下方法复制:我们可以把这种方法叫做借腹生子法。。。。。。1.先对原链表的每个结点ai复制一个结点bi,插入到ai... 阅读全文
posted @ 2019-09-24 11:27 西*风 阅读(141) 评论(0) 推荐(0) 编辑
摘要:题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析:经典的异或技巧题两个相同的数字异或的结果为0,一个数和0异或的结果是其本身,假设现在那两个不同的数字是A和B,那么将整个数组的元素依次异或得到的结果ans就是A和B的异或结果ans的二进制中第k位的1代表A的第k位和B的第k位不同,我们现在按照第k位是否相同将原数组分成两个子数组,那么必定A和... 阅读全文
posted @ 2019-09-24 11:12 西*风 阅读(156) 评论(0) 推荐(0) 编辑
摘要:题目描述 统计一个数字在排序数组中出现的次数。 分析:数组有序,采用二分查找无疑 两种方法,时间复杂度差不多,都是利用二分查找,不过统计k出现的次数有所不同而已 方法1:二分查找k,找到任意一个k的下标index,index向两边扩展即可 方法2:二分查找k+0.5和k-0.5的插入位置index1 阅读全文
posted @ 2019-09-24 10:12 西*风 阅读(271) 评论(0) 推荐(0) 编辑
摘要:题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。分析:不需要采用辅助空间,用原数组的空间充当Hash数组即可,因为所有元素都处于0到n-1的范围内以数组元素值充当数组下标进行... 阅读全文
posted @ 2019-09-24 09:37 西*风 阅读(239) 评论(0) 推荐(0) 编辑
摘要:题目描述输入两个链表,找出它们的第一个公共结点。分析:双指针法假设现在存在两个链表L1和L2,先遍历L1和L2得到链表长度n和m,现在有两个指针p1和p2分别指向L1和L2的头结点,假设现在n>m,那么先让p1先走n-m步,然后两个结点一起走,当p1和p2指向的结点是同一个结点的时候,那么该结点就是双链表的第一个公共结点时间复杂度:O(N+M)ListNode* FindFirstCommonNo... 阅读全文
posted @ 2019-09-24 09:11 西*风 阅读(116) 评论(0) 推荐(0) 编辑
摘要:题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。分析:可以使用递归!class Solution {public: int Sum_Solution(int n) { int sum=n; (n>0)&&(sum+=Sum_Solution(n-1)); retur... 阅读全文
posted @ 2019-09-23 17:29 西*风 阅读(144) 评论(0) 推荐(0) 编辑
摘要:题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的... 阅读全文
posted @ 2019-09-23 16:28 西*风 阅读(140) 评论(0) 推荐(0) 编辑
摘要:最小的K个数 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 分析:要求的的最小的k个数,那么我们可以采用最大堆 先往最大堆里面存储k个数,然后剩下的数和堆顶元素比较,小于堆顶元素则替换堆顶元素,最后堆中剩下的k个 阅读全文
posted @ 2019-09-23 16:16 西*风 阅读(143) 评论(0) 推荐(0) 编辑
摘要:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析:采用阵地攻守的思想先找到出现次数最多的元素,然后统计该元素的出现次数,判断是不是超过数组长度的一半阵地攻守思想:第一个数字作为第一个士兵,守阵地,c=1,遇到相同元素,c++,遇到不同... 阅读全文
posted @ 2019-09-23 15:14 西*风 阅读(392) 评论(0) 推荐(0) 编辑
摘要:题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析:采用栈模拟其压入顺序,当栈顶元素为当前出栈元素的话,将当前栈顶元素出栈,否则一直压入... 阅读全文
posted @ 2019-09-23 11:07 西*风 阅读(118) 评论(0) 推荐(0) 编辑
摘要:题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5分析:dfs遍历交换其左右子树即可/*... 阅读全文
posted @ 2019-09-23 10:12 西*风 阅读(126) 评论(0) 推荐(0) 编辑
摘要:输入一个链表,反转链表后,输出新链表的表头。 分析: 方法1: 可以利用栈来做,其实递归也是一个栈,叫做递归栈 方法2: 双指针迭代法,分别指针节点的前驱和后继 func reverseList(head *ListNode) *ListNode { var p1 *ListNode p1=nil 阅读全文
posted @ 2019-09-23 10:04 西*风 阅读(121) 评论(0) 推荐(0) 编辑
摘要:剑指offer-数值的整数次方(快速幂) 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x = 2.10000, n = 3 输出 阅读全文
posted @ 2019-09-23 09:46 西*风 阅读(185) 评论(0) 推荐(0) 编辑
摘要:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析: 1.前序遍历的第一个为根结点,在中序遍历中找到根结点的 阅读全文
posted @ 2019-09-22 17:18 西*风 阅读(149) 评论(0) 推荐(0) 编辑
摘要:剑指offer-旋转数组的最小数字(二分) 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2, 阅读全文
posted @ 2019-09-22 17:09 西*风 阅读(123) 评论(0) 推荐(0) 编辑
摘要:输入一个链表,输出该链表中倒数第k个结点。分析:定义两个结点p1和p2都指向头节点,p1先走k-1步,然后p1和p2一起走,当p1走到链表尾部时,p2指向的结点就是倒数第k个结点遍历一遍链表即可,时间复杂度O(N)ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){ if(pListHead==NULL||k==0) ... 阅读全文
posted @ 2019-09-22 15:31 西*风 阅读(134) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。class Solution {public:int NumberOf1(int x){ int c=0; while(x!=0) { c++; x=x&(x-1);//把x最右边的1变成0 } return c;}};分析:如果一个整数不为0,那么这个整数至少有一个位是1,如果我们... 阅读全文
posted @ 2019-09-22 15:04 西*风 阅读(138) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示