编程算法
gloomysnow
这个作者很懒,什么都没留下…
展开
-
京东2016实习笔试糖果因子最大组合
import java.util.Scanner;import java.util.Stack;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) {原创 2016-04-08 21:30:37 · 289 阅读 · 0 评论 -
迷宫问题
定义一个二维数组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表示可以走的路,只能横着走或竖着走,不能斜着原创 2016-04-17 19:42:49 · 506 阅读 · 0 评论 -
字符串变形
题目描述: 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像”Hello World”一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如”Hello World”变形后就变成了”wORLD hELLO”。/** * * @author 过路的守望 * */public class T原创 2016-04-20 17:11:47 · 515 阅读 · 0 评论 -
拓扑排序
拓扑排序: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。原创 2016-04-21 13:36:47 · 517 阅读 · 0 评论 -
无权最短路径
问题的描述是这样的:有一个有向无权图G,指定一个特定的顶点s作为起点,要求找出从s出发到G中的每一个其它顶点的最短路径。 package com.gloomy.graph;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.List;import java.util.Queue;/** * 无权最原创 2016-04-21 22:02:10 · 483 阅读 · 0 评论 -
最短路径算法
在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点原创 2016-04-22 16:39:56 · 579 阅读 · 0 评论 -
Bellman-Ford算法
Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写。即进行持续地松弛(原文是这么写的,为什么要叫松弛,争议很大),每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环,无法得出结果,否则就成功完成。Bellman-ford算法有一个小优化:每次松弛先设一个标识flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退原创 2016-04-23 15:36:46 · 419 阅读 · 0 评论 -
最小生成树算法-Prim算法
MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意原创 2016-04-23 17:43:43 · 568 阅读 · 0 评论 -
KMP算法
kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是根据给定的模式串W1,m,定义一个next函数。next函数包含了模式串本身局部匹配的信息。 /** * KMP算法 * @author 过路的守望 * */public class KmpAlgo原创 2016-04-07 20:21:16 · 563 阅读 · 0 评论 -
无序数组中最小的k个数
对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致。 给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。 测试样例: [1,2,4,3],4,2 返回:[1,2]import java.util.*;/** * 无序数组中最小的k个数 * * @author 过路的守望 * */public class KthNu原创 2016-04-07 19:04:34 · 1201 阅读 · 0 评论 -
腾讯2016实习生编程题蛇形矩阵打印
import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ int len = in.nextInt();原创 2016-04-03 23:50:24 · 556 阅读 · 0 评论 -
超长正整数相加
请设计一个算法完成两个超长正整数的加法。 输入参数: String addend:加数 String augend:被加数 返回值:加法结果 思路:两个数相加,可先将两个数长度对齐,短的用0补齐后再计算。两个数相加的结果长度至多为较大的数大长度加1。可以用一个数组来存放结果。public class Main { public static void main(Strin原创 2016-04-02 14:59:47 · 344 阅读 · 0 评论 -
最长上升子序列
广场上站着一支队伍,她们是来自全国各地的扭秧歌代表队,现在有她们的身高数据,请你帮忙找出身高依次递增的子序列。 例如队伍的身高数据是(1、7、3、5、9、4、8),其中依次递增的子序列有(1、7),(1、3、5、9),(1、3、4、8)等,其中最长的长度为4。 方法一:/* * 时间复杂度O(n^2) */public class LongIncrementSequence { p原创 2016-04-04 13:44:10 · 248 阅读 · 0 评论 -
最大上升子序列和
一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …,aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中序列和最大为原创 2016-04-04 16:45:58 · 396 阅读 · 0 评论 -
最长回文子串
回文,亦称回环,是正读反读都能一样的字符串。例如“12321”、“abba”等。 现在给你一个字符串,请你找出其中长度最长的回文。输入描述: 输入有多组数据。 每组数据有一行,包含一个长度小于100个字符的字符串s,且仅由字母和数字构成。 如果有多个长度相等的回文,仅输出第一个。输出描述: 对应每一组输入,输出其中长度最长的回文字符串。/** * 最长回文子串求解的四种方法 */pu原创 2016-04-04 23:10:53 · 261 阅读 · 0 评论 -
最长公共子串
最长公共子串问题的基本表述为: 给定两个字符串,求出它们之间最长的相同子字符串的长度。/** * 最长公共子串(连续) * @author 过路的守望 * */public class LongIncrementSub { public static void main(String[] args) { System.out.println(getLongestCo原创 2016-04-06 23:13:48 · 414 阅读 · 0 评论 -
最长公共子序列(不连续)
一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。 例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。 寻找LCS的一种方法是枚举X所有的子序列,然后注意检查是否是Y原创 2016-04-06 23:19:04 · 796 阅读 · 0 评论 -
最小生成树-Kruskal算法
kruskal算法即克鲁斯卡尔算法,指求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e步,其中e是网络中边的数目。按耗费递增的顺序来考虑这e条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环原创 2016-04-24 14:41:47 · 414 阅读 · 0 评论