刷题
JNSimba
腹有诗书气自华,快叫我长胖一点吧~~~~~
展开
-
字符串的排列
剑指Offer第28题题目输入一个字符串,打印出该字符串中字符的所有排列,例如输入abc,则打印出由字符abc,acb,bac,bca,cab,cba。思路:我们可以把复杂的问题拆分成小问题: 首先:确定第一个字符a,然后剩下后面两个bc,bc在进行排列 递归深入:首先确定第一个字符b,然后剩下的c进行排列 递归深入:c是最后一个字符,输出。 递归原创 2015-08-11 10:27:16 · 850 阅读 · 0 评论 -
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.Note: Your algorithm should have a linear runtime complexity. Could you implement it without using ex原创 2015-04-19 15:40:32 · 677 阅读 · 0 评论 -
Majority Element
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.You may assume that the array is non-empty and the majority element always原创 2015-04-19 14:50:45 · 618 阅读 · 0 评论 -
Roman to Integer
Given a roman numeral, convert it to an integer Input is guaranteed to be within the range from 1 to 3999.罗马数字有七个 I V X L C D M 对应的数字 1 5 10 50 100 500原创 2015-04-01 14:39:21 · 643 阅读 · 0 评论 -
Number of 1 Bits
rite a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).For example, the 32-bit integer ’11' has binary representation 0000000原创 2015-03-28 20:27:27 · 736 阅读 · 0 评论 -
Linked List Cycle
Given a linked list, determine if it has a cycle in it.Follow up:Can you solve it without using extra space?看到题目思索好久,一直试图找到链表的尾指针,然后循环判断地址是否出现过最后以失败告终,因为链表无限长和带环链表最终都无法停止循环之前没见过快慢指针,最后无奈原创 2015-03-27 19:25:57 · 620 阅读 · 0 评论 -
Unique Binary Search Trees再谈
做完Unique Binary Search Trees,感觉自己递归有点复杂,于是百度了一下才感觉自己有多菜,都说这是典型的动态规划题,庆幸自己没有先百度,平时一看见动态规划几个字就软了静下心看了看代码,确实简单,方便,贴出来分享分享参考博文:http://www.2cto.com/kf/201312/262420.html{CSDN:CODE:628原创 2015-03-26 20:28:10 · 737 阅读 · 0 评论 -
牛客堂刷题之KMP
题目:给定两个字符串str和match,长度分别为N和M。实现一个算法,如果字符串str中含有字串match,则返回match在str中的开始位置,不含有则返回-1。【举例】str=“acbc”,match=“bc”。返回2。str=“acbc”,match=“bcc”。返回-1。【要求】如果match的长度大于str长度(M>N),str必然不会含有match,可直接原创 2016-01-07 17:31:40 · 689 阅读 · 0 评论 -
牛客堂刷题之Manacher算法
题目:给定一个字符串str,返回str中的最长回文子串的长度。str=“123”。其中的最长回文子串“1”或者“2”或者“3”,所以返回1。str=“abc1234321ab”。其中的最长回文子串“1234321”,所以返回7。思路:可以首先想到的办法就是,遍历数组,然后往每个元素的两边扩充,然后扩充的最长的就是最长回文子串。但是扩充的复杂度加上遍历数组的复杂度,整原创 2015-12-17 10:52:05 · 742 阅读 · 0 评论 -
牛客堂刷题之变态二分
笔者汇总了关于二分法的一些特殊用法,特地分享。题目1定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]最小;如果0给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。思路局部最小的概念如上所示,所以在一个数组中,局部最小的值并不限于一个,只需要遍历原创 2015-12-05 23:52:47 · 772 阅读 · 0 评论 -
牛客堂刷题之最大乘积
题目:给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。思路:关于求连续子序列的问题,都是前 i 个元素对第 i+1个元素的推测。那么在0~~~i~~~N-1中,0~~~i中间的最大值是Max,最小值是Min原创 2015-12-03 19:09:13 · 846 阅读 · 0 评论 -
牛客堂刷题(常见面试题精讲)之左右最大值之差
题目 最大的 leftMax 与 rightMax 之差的绝对值给定一个长度为N(N>1)的整型数组arr,可以划分成左右两个部分,左部分arr[0..K],右部分arr[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?例如[2,7,3,1,1],当左部分为[2,7],右部分为[3,1,1]时,原创 2015-12-02 00:10:37 · 917 阅读 · 0 评论 -
牛客堂刷题(常见面试题精讲)之最短子数组长度
题目给定一个无序数组arr,求出需要排序的最短子数组长度。例如:arr = [1,5,3,4,2,6,7]返回4,因为只有[5,3,4,2]需要排序。思路首先从左往右遍历,然后设定一个Max,如果遍历的过程中array[i]大于Max,则置换Max,若小于Max,则指定 k 记录该位置。然后再从右往左遍历,设定一个Min,在遍历的过程中a原创 2015-12-01 21:01:08 · 706 阅读 · 0 评论 -
牛客堂刷题(常见面试题精讲)之随机概率
题目1:给定一个等概率随机产生1~5的随机函数rand1To5如下: public int rand1To5() { return (int) (Math.random() * 5) + 1;}除此之外不能使用任何额外的随机机制,请用rand1To5实现等概率随机产生1~7的随机函数rand1To7。思路:1~5无法表示1~7,所以我们需要将1~5扩展,形成更大的原创 2015-12-01 00:24:46 · 1066 阅读 · 0 评论 -
牛客堂刷题(常见面试题精讲)之最长回文序列
题目 最长回文序列处理字符串。给定一个字符串str和他的最长回文子序列strLPS, 返回在字符串str任意位置添加最少的字符后整体都是回文串的结果。 输入: str=“AB1C2DE34F3GHJ21KL”; strLPS="1234321" 最终结果=“ABLK1C2DEJHG3F4F3GHJED2C1KLBA”思路剥洋葱~ .~从左边原创 2015-11-30 23:41:10 · 843 阅读 · 0 评论 -
由平衡树引发的思考
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.平衡树的算法以前研究过,可是因为没总结这次又忘了,思路往往是一瞬间的,不断总结还是程序员应该养成的一个习惯。平衡二叉树是特殊的二叉排序树,加了一个限定条件: 每个节点的左右子树不大于1; 二叉排序树是插入原创 2015-04-28 09:01:59 · 849 阅读 · 0 评论 -
Unique Paths
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).The robot can only move either down or right at any point in time. The robot is trying to reach the原创 2015-05-06 19:58:11 · 714 阅读 · 0 评论 -
Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1]原创 2015-05-08 19:51:51 · 859 阅读 · 0 评论 -
二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树中结点指针的指向。如图:思路:我们只需要在中序遍历二叉树的时候,改变链的方向,然后指定一个指针一直指向当前节点当中序遍历完成的时候,这个指针也就处于链表的尾端,若果要升序排列,只需要依次遍历,找到头结点即可。 //因为在java中传递的是地址原创 2015-08-12 10:27:54 · 851 阅读 · 0 评论 -
树的子结构
题目: 输入两棵树A和B,判断B是不是A的子结构 例如:右边的便是左边的子结构 8 4 / \ / \ 4 9 2 5 / \ 2 5二叉树我们很容易会想到递原创 2015-07-19 15:38:21 · 969 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这一个数字。输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},数字2在数组中出现的次数大于数组长度的一半,返回2。这道题类似以前做过的Maximum Subarray。按着以前的思路:确定某一个数字,遇到相同的数字加1,遇到不同的数字减1,当累加器为0时,我们重新开始计算即可。完成后继续判断这个数原创 2015-08-12 12:38:25 · 937 阅读 · 0 评论 -
把数组排成最小的数
题目:输入一个正整形数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中的最小的一个,例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字321323。思路:将数组转换成字符串,然后按照字符串的排序规则直接直接比较。也就是说"3"+"32" 和"32"+"3"比较,如果前者大于后者,则交换3和32的位置 public static void prin原创 2015-08-14 10:43:00 · 1002 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 拿到这道题的时候,首先想着是把所有的不可能的出栈序列找出来,然后寻找和出栈序列之间的规律,但是找了好久没找到。看了一下书上的原创 2015-08-02 11:32:32 · 1387 阅读 · 0 评论 -
二叉树的镜像
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义: 源二叉树 : 8 / \ 6 10 / \ / \ 5 7 9 11镜像二叉树: 8 / \ 10 6 / \ / \ 11 9 7 5思路: 所谓的镜像,就是交换原创 2015-07-22 23:58:39 · 950 阅读 · 0 评论 -
丑数
题目:我们把只包含因子2,3,5的数称作丑数,求按从小大到大的顺序的第1500个丑数。例如6,8都是丑数,14不是丑数,因为包含因子7.习惯上我们把1当做第一个丑数。思路:一般自己拿到这种题会下意识的想到暴力破解,即遍历所有的数,然后判断是否有除2,3,5以外的因子,如果有那就不是丑数,但是这种方法无疑效率是低下的。之所以低下是因为我们在当一个数不是丑数的时候,我们还对其在原创 2015-08-15 17:10:47 · 809 阅读 · 0 评论 -
数组中的逆序对
题目在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对,输入一个数组,求出这个数组中的逆序对的总数。例如:{7,5,6,4},一共存在5个逆序对,分别是(7,6)(7,5)(7,4)(6,4)和(5,4)思路本来是毫无思路的,一般习惯了暴力破解,剑指offer后面的归并排序的思想,让我想到归并排序是好多年前写过的(忘了......果然出来混总是要还原创 2015-08-18 09:55:42 · 1061 阅读 · 0 评论 -
两个链表中的第一个公共结点
题目输入两个链表,找出他们的第一个公共节点。下面第一个公共节点便是40。 1->2->3-----\ >40->5010->20->30----/思路看到栈就忽然恍然大悟,然后在看到类似快慢指针,更大悟。思路一:分别遍历第一条链表和第二条链表,将其每个节点分别存入两个栈,然后依次出栈,最后一个相同的的栈原创 2015-08-18 10:17:04 · 1204 阅读 · 0 评论 -
二叉树的深度相关问题
题目输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的结点形成树的一条路径,最长路径的长度为树的深度。思路简化一下题目,思考一个节点的时候二叉树的深度为 1,因为左右子树都为0;2个节点的时候二叉树深度为 2,左右子树的深度最大值加 1;3个节点分两种情况: 4 3 / \原创 2015-08-20 23:01:40 · 940 阅读 · 0 评论 -
数组在排序数组中出现的次数
题目统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输入4.思路首先第一种思路,必然是遍历数组,然后定义累加器,但是这种时间复杂度为O(n)我们注意到数组是排序的,我们可以利用而分查找的特点,首先将第一个3找到,然后找出最后一个3,相减即可。代码public static in原创 2015-08-19 23:38:51 · 881 阅读 · 0 评论 -
数组中只出现一次的数字
题目一个整型数组里除了两个数字之外,其他数字都出现了两次。请找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)思路我们知道如果把题目中的两个数字换成一个的话,整个数组内的元素连续异或,最终的数便是那个出现一次的数,因为异或的性质:相同为0,不同为1,所以有任何数字异或自己都是0。换成两个数字后,我们可以继续全局异或,得到的数必然不等于0,那么也就是说二进制中必然原创 2015-08-21 22:04:52 · 981 阅读 · 0 评论 -
和为s的两个数字VS和为s的连续正数序列
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和正好是s。如果有多对的和都等于s,输出任意一对即可。思路此题思路比较正常,头指针和尾指针,结合排序的特点,有头指针指向的元素+尾指针指向的元素 > s,那么尾指针前移头指针指向的元素+尾指针指向的元素 代码 public static void getSumOftwoNumber(i原创 2015-08-21 23:17:15 · 861 阅读 · 0 评论 -
Add Digits
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.For example:Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has on原创 2016-07-19 20:51:41 · 717 阅读 · 0 评论 -
牛客堂刷题(常见面试题精讲)之矩阵打印
题目: 实现转圈打印矩阵 1 2 3 4 10 11 12 5 9 8 7 6输出是1 2 3 4 5 6 7 8 9 10 11 12思路: 每次只需要打印一圈即可,然后左上角坐标都加1,右下角都减一,当两个的坐标错过去了就停止代码:public class CircleMatrix {原创 2015-10-31 15:59:22 · 724 阅读 · 0 评论