刷题记录
飞飞_鱼
这个作者很懒,什么都没留下…
展开
-
剑指offer: 二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示思路:正整数十进制转二进制:用n除以2,得到一个商和一个余数,再用这个商去除以2,直到商小于0,最后得到的余数作为二进制表示的最高位有效位,最先得到的余数作为低位有效位。统计1的个数。 负整数十进制转二进制:先去掉负号,再减1;然后再按照正数的方法算;最后按位取反。负数要先去掉负号减1,按照正数的方法...原创 2019-06-01 11:48:24 · 99 阅读 · 0 评论 -
剑指offer35: 数组中的逆序对 java
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路: 归并思想 把数组分成前后两部分,逆序对数就等于前面的逆序对数 + 后面的逆序对数 + 前面和后面组合的逆序对数(一个前面的数一个后面的数)...原创 2019-07-30 15:00:48 · 123 阅读 · 0 评论 -
剑指offer28: 数组中出现次数超过一半的数字 java
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路1: 如果长度是偶数,要想长度超过一半,一定有两个相同的数挨着 如果长度是奇数,有两种情况,一种是从第一个数到最后一个数隔一个是一个相同的...原创 2019-07-21 16:32:55 · 82 阅读 · 0 评论 -
剑指offer32: 把数组排成最小的数 java
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路: 假设本来顺序是i,j,a代表数字i的字符串表示,b代表数字j的字符串表示,如果ab组成的数字大于ba组成的数字,则交换i和j的位置,如果ab组成的数字小于ba组成的数字,i和j不动。...原创 2019-07-26 10:56:00 · 190 阅读 · 0 评论 -
剑指offer30: 连续子数组的最大和 java
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2019-07-22 20:52:38 · 96 阅读 · 0 评论 -
剑指offer33: 丑数 java
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:(思路有可能借鉴了网上的文章加了自己理解,如有侵权请及时联系) 题意:求从1开始的第index个丑数(开始没读懂题) 质因子:质因子(或质因数)在数论里是指能整除给...原创 2019-07-27 08:45:45 · 128 阅读 · 0 评论 -
剑指offer34: 第一个只出现一次的字符 java
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路1:暴力法,i从前向后遍历,j从i+1向后遍历,找到和当前字符str.charAt(i)=temp相同的,将此字符串中的此字符全部替换成‘&’,如果j一直到最后,没有找到和当前字符temp相同的,则返回当前字...原创 2019-07-27 21:50:39 · 114 阅读 · 0 评论 -
剑指offer: 和为S的连续正数序列 java实现
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路://和为s的等差数列,等差数列求...原创 2019-08-08 14:03:31 · 128 阅读 · 0 评论 -
剑指offer48:不用加减乘除做加法 java
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路: //十进制相加:5+7,个位是2,进位是1,十位上是0加上进位的1,十位上的结果是1*10=10 //个位的值加上十位上的值:2+10 = 12,百位上是0,所以5+7的结果就是12 //可以拆解成,不考虑进位的加法和计算进位的加法 ...原创 2019-08-18 16:42:53 · 90 阅读 · 0 评论 -
剑指offer51:构建乘积数组 java
题目:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。思路: 如果用暴力算法的话,求数组B的每一个位置上的数都要遍历整个A数组,时间复杂度为n方,当数组长度非常大时,效率很低 假设A = [A0,A1,A2,A3] ...原创 2019-08-19 13:47:03 · 124 阅读 · 0 评论 -
剑指offer47: 求1+2+3+...+n java
题目:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:最先想到等差数列求和公式,sum = a1n+n(n-1)d/2=n+n(n-1)/2,但是用到了乘法。想到用递归:sum=n+Sum_Solution(n-1),递归的结束条件是n=0,不能用if判断,&&是短路与运...原创 2019-08-16 10:43:47 · 114 阅读 · 0 评论 -
剑指offer: 删除链表中重复的结点 java
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路: 定义3个指针,前一个pre,当前cur, 后一个lat,如果cur和lat相同,cur和lat都向后走,直到lat不等于cur,将pre的n...原创 2019-08-27 10:45:36 · 158 阅读 · 0 评论 -
剑指offer: 二叉树的下一个结点 java实现
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路: 画图 有两种情况:当前结点有右子树和当前结点没有右子树 当前结点有右子树的情况:下一个结点就是右子树的最左结点 当前结点没有右子树的情况,分为两种: (1...原创 2019-08-28 10:39:32 · 116 阅读 · 0 评论 -
剑指offer59: 按之字形顺序打印二叉树 java实现
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路: //定义两个栈,stack1存奇数行,stack2存偶数行, //奇数行栈stack1每一个出栈节点x,以x.left,x.right的顺序入偶数行栈stack2,直到stack1空 ...原创 2019-08-30 15:22:24 · 117 阅读 · 0 评论 -
小米OJ 9: 移除k位得到最小值 java
题目:有一行由 N 个数字组成的数字字符串,字符串所表示的数是一正整数。移除字符串中的 K 个数字,使剩下的数字是所有可能中最小的。假设:字符串的长度一定大于等于 K,字符串不会以 0 开头输入:1432219 3输出:1219思路:因为字符串是变化的,用StringBuffer存储。如果str[i]大于等于str[i+1],则把str[i]去掉。 去掉后,去掉个数的记录n...原创 2019-09-07 20:13:22 · 235 阅读 · 0 评论 -
剑指offer31: 整数中1出现的次数(从1到n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路1:(37ms)从前向后一个一个的判断,累加代码:pu...原创 2019-07-25 10:45:56 · 134 阅读 · 0 评论 -
剑指offer24: 二叉树中和为某一值的路径 java
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:代码:public class Solution { public ArrayList<ArrayList<Integer>> Find...原创 2019-07-17 15:48:05 · 88 阅读 · 0 评论 -
剑指offer26: 二叉搜索树与双向链表 java
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:二叉搜索树,左,根,右的大小顺序是小,中,大。从而想到中序遍历。1.遍历根节点的左子树,形成双向链表,返回左子树链表的头;2.若左子树不空,找到左子树链表最右边的节点,连到根节点的左边;3.遍历根节点的右子树,若右子树不空,将右子树链表的头连在根节点...原创 2019-07-19 14:35:42 · 93 阅读 · 0 评论 -
LeetCode49:字母异位词分组,java实现
题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。 不考虑答案输出的顺序。思路:(以下有...原创 2019-05-06 08:54:47 · 344 阅读 · 0 评论 -
LeetCode46:全排列,java实现
给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]解法1:字典排序思路:1.先对nums进行从小到大排序,否则答案会缺失,同时先把排序后的数组放到result中 2.接下来进行字典排...原创 2019-04-28 20:43:58 · 863 阅读 · 0 评论 -
LeetCode34:在排序数组中查找元素的第一个和最后一个位置,java实现
题目:给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是O(logn) 级别。如果数组中不存在目标值,返回[-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例2:输入: nums = [5,7,7,...原创 2019-04-20 20:08:25 · 221 阅读 · 0 评论 -
LeetCode33:搜索旋转排序数组,java实现
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是O(logn) 级别。示例 1:输入: nums = [4...原创 2019-04-19 20:27:37 · 225 阅读 · 0 评论 -
LeetCode31:下一个排列,java实现
根据字典排序思想:(1) 遍历i(i>=0 && i <= length-2):从后向前找到第一个左边小于右边的数;(2)找到后再从数组的最后向前比较(j>i && j <= length-1),找到第一个比i对应的数大的数,调换i和j对应的数;(3) 对i后面的数进行从小到大排序(快速排序)class Solution31...原创 2019-04-16 09:02:49 · 463 阅读 · 0 评论 -
LeetCode10正则表达式匹配java实现
一、递归第二个字符如果是*,第一个字符可以不匹配(因为*前面的数可以为0次),如果第二个字符不是*,如果第一个字符不匹配就返回flase 所以分为第二个字符是不是*两种情况 :(1)第二个字符是*时: 如果第一个字符能匹配上,str向后移1位,pattern不动,继续向后匹配 如果第一个字符不能匹配,str不动, pattern向后移2位,继续向后匹配 ;(2)第二个字符不是*时(或者...原创 2019-04-07 20:41:34 · 518 阅读 · 1 评论 -
剑指offer: 树的子结构
(思路参考了网上的帖子,如有侵权请及时联系)题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:比较A和B的根节点是否相同,若相同比较它们的左右子树是否相同,直到比较完B的所有叶子节点,若都相同,返回true;若A的跟节点和B的根节点不同,则A向左右子树滑动继续和B比较。步骤: 如果A和B根节点相同,左右节点相...原创 2019-06-20 20:12:35 · 113 阅读 · 0 评论 -
剑指offer: 二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树: 8 / \ 6 10 / \ / \ 5 7 9 11镜像二叉树: 8 / \ 10 6 / \ / \ 11 9 7 5思路:交换6和10下面的...原创 2019-06-20 21:22:09 · 94 阅读 · 0 评论 -
剑指offer: 顺时针打印矩阵 java
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:从左上到右上,右上到右下,右下到左下,左下到左上,依次打印,注意确定打印的圈数(min(行数,列数)/2+...原创 2019-07-10 21:11:00 · 108 阅读 · 0 评论 -
剑指offer: 包含min函数的栈 java
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:题目的目的是不管当前的栈弹出多少,压入多少,总能以时间复杂度O(1)找到栈内当前最小值。minstack和stack里面的数的个数是一样的,minstack的top总是保存的是stack里当前最小的值,使它们是一一对应的,这样就能以O(1)时间复杂度找到最小值。要注...原创 2019-07-10 21:17:56 · 129 阅读 · 0 评论 -
剑指offer: 栈的压入、弹出序列 java实现
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:新建一个栈,根据入栈顺序依次入栈,每入一个和出栈顺序比较,应该出栈就出栈,...原创 2019-07-11 21:29:06 · 122 阅读 · 0 评论 -
剑指offer23: 二叉搜索树的后序遍历序列 java实现
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路: 后续遍历,最后一个数是根节点 //从前向后找第一个大于根节点的数,这个数前面是左子树,从这个数开始的后面是右子树 //若后面有小于根节点的数,返回false //否则递归遍...原创 2019-07-16 15:27:22 · 96 阅读 · 0 评论 -
剑指offer22: 从上往下打印二叉树 java实现
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:把树上的节点按题目顺序摘下来,依次放到队列中,依次取队列的头add到ArrayList中步骤: //定义一个队列和一个ArrayList //先把跟节点放到队列中, //当队列不为空时,取队列的头对应的值放到ArrayList中, //若队列头节点对应...原创 2019-07-15 21:09:43 · 113 阅读 · 0 评论 -
剑指offer25: 复杂链表的复制 java
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空思路:(借鉴网上其他人的思路)1.每一个节点在此节点后面复制一个,例如:A,A1,B,B1.......,2.不复制random,因为原链表的random指向的...原创 2019-07-19 09:07:18 · 92 阅读 · 0 评论 -
股票最大收益 java
题目:股票价格起伏不定,如何保证最高收益是每个投资人的追求,现在模拟给定一个数组,它的第i个元素是一支给定股票第i天的价格,如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你能获取的最大利润输入:一个数组,里面包含整型数字,用来模拟价格的起伏输出:算出价格区间内的最高收益,如果没有收益,则按照0计算样例输入:[7,1,4,3,1]样例输出:3思路:...原创 2019-09-08 09:18:09 · 1101 阅读 · 0 评论