算法
HankingHu
这个作者很懒,什么都没留下…
展开
-
笔试面试算法经典--最长公共子串(Longest Common SubString)
最长公共子串(Longest Common Substring): 是指两个字符串中最长连续相同的子串长度。例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2的最长公共子串为2345。解法1如果 str1 的长度为 N,str2 的长度为 M,生成大小为 N*M 的 数组 dp , dp[i][j]表示 str1[0…i] 与 str2[0…j] 的最长公原创 2017-04-06 20:53:09 · 43163 阅读 · 8 评论 -
笔试面试算法经典-未排序正整数数组中累加和为给定值的子数组
【题目】 给定一个数组 arr,该数组无序,但每个数均为正数,再给定一个正数 k 。求 arr 的所有子数组中所有元素相加为k的最长子数组长度。例如,arr=[1,2,1,1,1],k=3。累加和为3的子数组为[1,2] ,[2,3], [1,1,1]。解法1(时间复杂度O(N)空间复杂度O(1))思路:left,right来指向数组中的某一个区间,sum用来保存left和right区间中的值,由原创 2017-04-13 23:15:29 · 1383 阅读 · 0 评论 -
笔试面试算法经典--数组partition调整使数组的左部分单调有序
【题目】 给定一个有序数组arr,调整使得数组的左部分无重复元素且有序,右边部分不要求。如数组arr[]={1,2,2,2,3,3,4,5,6,9,9} ;调整过后可以为:[1, 2, 3, 4, 5, 6, 9, 2, 3, 2, 9] 。思路:使用标记 u 其中arr[0…u] 表示已经处理过的没有重复元素且有序的区间,从arr[u+1…i-1]表示有重复元素的部分。则算法主要分为下面两部分。原创 2017-04-14 16:06:42 · 984 阅读 · 0 评论 -
位运算(篇1)不使用任何其他的数据结构检查一个字符串中是否有重复字符
实现空间有效算法以确定(从‘a’到’z’的字符)字符串是否具有所有唯一字符。不允许使用数组,散列等附加数据结构。 时间复杂度:O(n)思路: 因为从‘a’-‘z’共有26个字符,一个int有32位,如果将‘a’对应到int的第一位,‘b’放到第二位,只要判断从0到31位没有重复,字符串字符串中的所有字符都是唯一的,否则不唯一。代码:static boolean areChareterUnique原创 2017-03-17 10:59:02 · 1331 阅读 · 0 评论 -
剑指offer-把数组排成最小的数(Java)
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路: 数组中所有的数拼接后有可能会超过整数的范围,因此本题必须要使用字符串来处理。 要对3,32 ,321 排序,不能直接比较32,3的大小,应该比较323,332的大小,即,3,32的大小应该有323,33原创 2017-03-26 22:28:56 · 4622 阅读 · 2 评论 -
剑指offer-反转链表
题目描述 输入一个链表,反转链表后,输出链表的所有元素。解法1: 遍历链表的时候依次将每个指针指向前一个节点,这样遍历完时,正好所有的指针都反转,链表也反转。 代码: public ListNode ReverseList(ListNode head) { ListNode pre=null,next; while(head!=null) {原创 2017-03-16 20:23:45 · 588 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解法1:增加一个n维的数组,从后往前和从前往后同时遍历,从后往前时把偶数放在新数组的后面,从前往后时把奇数放在新数组的前面。代码:public static void reOrderArray(int [] array原创 2017-03-16 19:35:18 · 224 阅读 · 0 评论 -
剑指offer-二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路: 本题有多种方法,这里只提供一种思路,从第一行开始由右向左找,第一个小于target值时就下一行从j开始向左找,因为j右边的肯定比target大所以不再找如果target值如果找到就返回,原创 2017-03-14 21:11:39 · 263 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1原创 2017-03-16 16:51:36 · 209 阅读 · 0 评论 -
快速排序QuickSort(Java)
快速排序思想 如上图:每趟快速排序开始时,设置一个key,key=array[low],然后由high向左,找到小于key的值,复制到low位置,然后再由low向右找到大于key的值,复制到high位置,直到low=high结束, 将key的复制到low位置。 上图中第一轮划分后找到32的位置,然后递归的对32左边和右边的进行排序。代码:package Sort;import原创 2017-03-31 09:43:45 · 17402 阅读 · 7 评论 -
Stack(篇3)设计一个栈能够在O(1)的时间内getMin
问题:设计一个数据结构SpecialStack,支持所有的栈操作,如push(),pop(),isEmpty(),isFull()和一个附加的操作getMin()它应该从SpecialStack返回最小元素。SpecialStack的所有这些操作必须是O(1)。要实现SpecialStack,你应该只使用标准的Stack数据结构,没有其他数据结构,如数组,列表,等等。 例:请考虑以下Special原创 2017-03-23 22:17:00 · 1147 阅读 · 0 评论 -
Stack(篇1)计算全排列大于等于其的自然数
有一些自然数,其所有排列大于或等于该数字,例如。123,其所有置换(123,231,321)都大于或等于123。 给定自然数n,任务是计数从1到n的所有这样的数。 例子:输入:N = 15 输出:14 1,2,3,4,5,6,7,8,9,11,12,13,14,15是其所有的数字排列比数大于本身。因此,输出14. 输入:n = 100. 输出:54解法1(暴力解法) 从1到n计算原创 2017-03-20 17:29:29 · 1023 阅读 · 0 评论 -
笔试面试算法经典--打印数组中相加和为给定值的二元组及三元组(Java)
【题目】给定一个递增的数组,要求打印数组中和为给定值的二元组,例如: arr[]={-8, -4, -1, 0, 1, 3, 4, 5, 6, 7, 9} , k=10,打印结果为: 1——9 3——7 4——61.打印二元组解法1(时间复杂度 O(N * N)空间复杂度 O(1)) 思路:利用双重循环遍历数组中的所有二元组,如果二元组相加的值为 k 打印。public static原创 2017-04-13 21:52:38 · 1785 阅读 · 0 评论 -
笔试面试算法经典-找到数组中出现次数大于N/k的数(Java)
【题目】 给定一个整型数组arr,再给定一个整数k,打印所有出现次数大于 N/K 的数。如果没有这样的数,打印提示信息。 【要求】 时间复杂度为O(N*K),额外空间复杂度为O(K)。【思路】 每次从数组中删除 K 个不同的数,如果某个数的次数大于 N/K ,这个数最后肯定会剩下来,数学证明:假设 X 的次数为 (N/k+1) > N/K ,如果每次删除 k个不同的数最后数组里面剩余的原创 2017-04-08 22:46:07 · 6345 阅读 · 4 评论 -
算法-动态规划 Dynamic Programming--从菜鸟到老鸟
前言最近在牛客网上做了几套公司的真题,发现有关动态规划(Dynamic Programming)算法的题目很多。相对于我来说,算法里面遇到的问题里面感觉最难的也就是动态规划(Dynamic Programming)算法了,于是花了好长时间,查找了相关的文献和资料准备彻底的理解动态规划(Dynamic Programming)算法。一是帮助自己总结知识点,二是也能够帮助他人更好的理解这个算法。后面的参原创 2017-07-15 22:58:29 · 466353 阅读 · 154 评论 -
Stack(篇2)设计一个栈能在O(1)的时间和O(1)的空间getMin()
在上一篇文章中实现了 使用O(1)时间和O(n)的额外空间的方法getMin()。在本文中,讨论了一种支持O(1)额外空间的最新方法。 我们定义一个变量minEle,它存储堆栈中的当前最小元素。现在的问题是如何处理最小元素被删除的情况。为了处理这个,我们将“2x-minEle”推入堆栈而不是x,以便可以使用当前的minEle检索先前的最小元素,并将其值存储在堆栈中。以下是工作的详细步骤和说明。P原创 2017-03-23 22:08:42 · 1872 阅读 · 0 评论 -
堆排序HeapSort(Java)
堆排序堆排序思想:堆排序分为三个过程:①建堆:使得任一个节点的值大于左右孩子节点的元素因此堆顶的元素最大(大根堆)。②调整堆:删除掉堆顶元素后,还要保持堆的性质就要对堆进行调整。③堆排序:每次选择堆顶元素,并将堆顶元素删除,调整堆后,再重复操作直至堆为空。下面是这三种操作的具体过程:①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性原创 2017-03-30 22:48:19 · 10219 阅读 · 3 评论 -
二叉树的遍历(Java)
树可以以不同的方式遍历。以下是遍历树的常用方法。深度优先遍历:(a)中序遍历(左、根、右):4 2 5 1 3 (b)先序遍历(根、左、右):1 2 4 5 3 (c)后序遍历(左、右、根) :4 5 2 3 1广度优先或水平顺序遍历: 1 2 3 4 5 先序遍历 算法Inorder(树) 1.遍历左子树,即调用Inorder(left-subtree) 2.访问根节点。原创 2017-03-15 11:09:59 · 776 阅读 · 0 评论 -
剑指offer-求数组中最小的k个数
题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解法1(冒泡排序)冒泡排序每循环一次能够选出一个最小的数,题目要求选出最小的k的数,因此时间复杂度为O(k*N)。import java.util.ArrayList; public class Solution { public ArrayList<Inte原创 2017-03-25 22:22:20 · 924 阅读 · 0 评论 -
归并排序MergeSort(Java)
归并排序思想:先将数组中的每两个进行合并并且在合并的过程中进行排序,然后每四个进行合并。一直到数组合并完成。 例如上图中:要对数组中的元素:80、30、60、20、10、60、50、70进行排序,先把数组分成8组先分别对这八组进行合并排序,(30,80),(20,60),(10,60),(50,70)这四组组内已经排好序。然后继续排序(20,30,60,80)(10,50,60,70)最后对这两组原创 2017-03-30 22:01:28 · 3827 阅读 · 0 评论 -
Levenshtein distance最小编辑距离算法实现
动态编程| (编辑距离) 给定两个字符串str1和str2以及可以对str1执行的操作。找出将“str1”转换为“str2”所需的最小编辑次数(操作)。插入删除代替所有上述操作具有相等的成本。例子:输入:str1 =“geek”,str2 =“gesek” 输出:1 我们可以通过插入一个's'将str1转换为s原创 2017-03-13 22:10:03 · 4111 阅读 · 3 评论 -
动态规划(篇3)最长公共子序列(LCS)
LCS问题陈述: 给定两个序列,找出它们中存在的最长子序列的长度。子序列是以相同的相对顺序出现但不一定是连续的序列。例如,“abc”,“abg”,“bdf”,“aeg”,“acefg”,…等是“abcdefg”的子序列。因此,长度为n的串具有2 ^ n个不同的可能子序列。 示例: 用于输入序列的LCS“ABCDGH”和“AEDFHR”是长度为3的“ADH”。 用于输入序列的LCS“AGGT原创 2017-03-14 15:37:22 · 2864 阅读 · 0 评论 -
动态规划(篇1)重叠子问题
动态规划是一种算法范例,通过将其分解为子问题来解决给定的复杂问题,并存储子问题的结果,以避免再次计算相同的结果。 以下是一个问题的两个主要属性,表明给定的问题可以使用动态规划来解决。 在这篇文章中,我们将详细讨论第一个属性(重叠子问题)。动态规划的第二个属性在下一篇文章即动态规划篇2中讨论。1)重叠子问题 2)最佳子结构 1)最佳子结构像分治法一样,动态规划包含了对子问题的解决。动态规划原创 2017-03-14 09:23:55 · 6637 阅读 · 1 评论 -
笔试面试算法经典--全排列算法-递归&字典序实现(Java)
全排列算法-递归&字典序实现全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 例如: 1 、2 、3三个元素的全排列为:{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。解法1(递归) 如下图:要对1、2、3、4进行排序,第一个位置上的元素有四原创 2017-04-01 09:48:42 · 39845 阅读 · 15 评论 -
笔试面试算法经典--矩阵的最短路径和(Java)
题目 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。 例子: 给定m如下: 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12。解法1思路:使用动态规划,定义 dp[M][N] , M ,原创 2017-04-07 17:11:17 · 16960 阅读 · 0 评论 -
Stack(4)判断数组是不是二叉搜索树的前序遍历(递归及非递归实现)
给定一个数组,如果给定的数组是二进制搜索树的先序遍历结果,则返回true,否则返回false。时间复杂度为O(n)。 例子:输入: pre[] = {2, 4, 3}输出: true下面是上面数组对应的二叉搜索树 2 \ 4 / 3输入: pre[] = {2, 4, 1}Output: false上面的数组不对应任何二叉搜索树.输入:原创 2017-03-24 16:40:00 · 1220 阅读 · 0 评论 -
Stack(5)对栈排序不用循环空间复杂度O(1)
对栈stack排序,不能使用循环while,for等,只能使用Stack的以下方法(Java版本)isEmpty():判断堆栈是否为空。push(S):将新元素添加到堆栈。pop(S):从堆栈中删除顶层元素。peek(S):返回顶元素的值。例输入:-3 <---顶部 14 18 -5 30 输出:30 <---顶部原创 2017-03-24 20:54:37 · 1696 阅读 · 0 评论 -
华为机试-简单错误记录
题目: 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理: 1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;3、 输入的文件可能带路径,记录文件名称不能带路径。输入描述: 一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。输出描述:原创 2017-03-01 16:40:20 · 784 阅读 · 0 评论 -
华为机试-称砝码
题目描述 现有一组砝码,重量互不相等,分别为m1,m2,m3…mn; 每种砝码对应的数量为x1,x2,x3…xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。注: 称重重量包括0方法原型:public static int fama(int n, int[] weight, int[] nums)输入描述: 输入包含多组测试数据。对于每组测试数据:第一行:n — 砝码数(范围[原创 2017-03-09 21:54:37 · 1926 阅读 · 1 评论 -
华为机试-迷宫问题
题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能原创 2017-03-10 22:04:53 · 2188 阅读 · 0 评论 -
华为机试-名字的漂亮度
题目描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。 每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。 给出多个名字,计算每个名字最大可能的“漂亮度”。输入描述: 整数N,后续N个名字输出描述: 每个名称可能的最大漂亮程度输入例子: 2 zhangsan lisi输出例子:原创 2017-03-10 22:51:05 · 623 阅读 · 0 评论 -
华为机试-按字节截取字符串
题目描述 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如”我ABC”4,应该截为”我AB”,输入”我ABC汉DEF”6,应该输出为”我ABC”而不是”我ABC+汉的半个”。 输入描述: 输入待截取的字符串及长度输出描述: 截取后的字符串输入例子: 我ABC汉DEF 6输出例子: 我ABC思路: 因为在Java中所有的字符都占两原创 2017-03-11 20:36:03 · 493 阅读 · 0 评论 -
华为机试-从单链表中删除指定值的节点
题目描述 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 详细描述: 本题为考察链表的插入和删除知识。 链表的值不能重复 构造过程,例如 1 -> 2 3 ->原创 2017-03-11 21:41:55 · 609 阅读 · 0 评论 -
华为机试-输出单链表的倒数第k个字节
题目描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。 输入描述: 输入说明 1 输入链表结点个数 2 输入链表的值 3 输入k的值输出描述: 输出一个整数输入例子: 8 1 2 3 4 5 6 7 8 4输出例子: 5思路: 两个指针,当第一个指针到链表的第k个位置时,第二个指针从头开始与第一个指针一起移动,这样当第一个指针知道链表的结原创 2017-03-13 20:49:18 · 517 阅读 · 0 评论 -
华为机试-找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符输入描述: 输入一个非空字符串输出描述: 输出第一个只出现一次的字符,如果不存在输出-1输入例子: asdfasdfo输出例子: o代码import java.util.Scanner;public class FirstSingleChar { public static void main(String[] args) {原创 2017-03-14 19:14:24 · 872 阅读 · 0 评论 -
华为机试-查找组成一个偶数最接近的两个素数
题目描述 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对 输入描述: 输入一个偶数输出描述: 输出两个素数输入例子: 20输出例子: 7 13代码import java.util.Scanner;public class MinPrimePair { public static void mai原创 2017-03-14 19:33:41 · 385 阅读 · 1 评论 -
华为机试-查找输入整数二进制中1的个数
题目描述 请实现如下接口 public static int findNumberOf1(intnum) { /* 请实现 */ return 0; } 譬如:输入5 ,5的二进制为101,输出2输入描述: 输入一个整数输出描述: 计算整数二进制中1的个数输入例子: 5输出例子: 2代码import java.ut原创 2017-03-14 20:13:57 · 590 阅读 · 0 评论 -
动态规划(篇2)最长递增子序列(LIS)
最长增加子序列(LIS)问题是找到给定序列的最长子序列的长度,使得子序列的所有元素以增加的顺序排序。例如,{10,22,9,33,21,50,41,60,80 }的LIS的长度为6,LIS为 {10,22,33,50,60,80}。最优子结构: 令arr [0..n-1]是输入数组,L(i)是以 i 结束的LIS的长度,使得arr [i]是LIS的最后一个元素。 然后,L(i)可以递归地写为:原创 2017-03-14 10:09:40 · 15260 阅读 · 0 评论 -
剑指offer-丑数(Java)
题目描述 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路: 使用一个数组将之前已经求出来的丑数保存起来,然后依次用2,3,5乘上数组中已经求出来的丑数,选出其中最小的一个保存到数组中。假设数组中存的最大丑数是Max,那么只要求出2,3,5乘以数组中的某一个数刚好原创 2017-03-27 22:11:43 · 2941 阅读 · 0 评论 -
华为机试-判断两个IP是否属于同一个子网
题目描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。 示例: I P 地址 192.168.0.1 子网掩码 255.255.2原创 2017-03-09 20:09:06 · 1564 阅读 · 0 评论