
练习题(JAVA)
文章平均质量分 65
「已注销」
从今天开始,做一个有博客的人
展开
-
递归反转栈的顺序-------只使用常数量个变量
转载地址:http://www.cnblogs.com/4everlove/p/3666016.html我们要反转一个栈,如果使用另外一个栈作为辅助的话,那么反转起来很简单,一个接一个push到辅助栈里再push回来就行了。那么假如不能使用辅助栈,数组等空间为O(n)的数据结构,只使用O(1)的空间复杂度即只能有常数个变量,怎么实现将栈反转?即原来的栈顶在栈底,栈底变成栈顶。 面试转载 2016-09-06 20:22:33 · 453 阅读 · 0 评论 -
编辑距离算法的实现
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。例如将kitten一字转成sitting:sitten (k→s)sittin (e→i)sitting (→g)比如要计算ca原创 2016-08-04 10:01:55 · 472 阅读 · 0 评论 -
华为oj--走格子
请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。解题思路:对于一个n*m的格子,由题意,若右走则变成n*(m-1)的格子,若往下走则变成(n-1)*m的格子,由此可得递推关系式 f(n,m)=f(n-1,m)+f(n,m-1),又当格原创 2016-08-12 08:55:23 · 1221 阅读 · 0 评论 -
普利姆算法
普里姆算法的基本思想:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。从连通网络N = { V, E }中的某一顶点u0出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把该边加入到生成树的边集TE中,把它的顶点加入到集合U中。如此重原创 2016-08-24 12:07:17 · 10637 阅读 · 0 评论 -
华为oj--MP3光标位置
MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。 现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:歌曲总数光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。其他情况下用户按Up键,光标挪到上一首歌曲原创 2016-09-02 11:40:24 · 539 阅读 · 0 评论 -
称砝码
现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。输入 int n:n表示有多少组重量不同的砝码,1int[] weight:表示n组砝码的重量,1int[] num:表示n组砝码的最大数量,1输出利用给定的砝码可以称出的不同原创 2016-08-23 17:58:41 · 402 阅读 · 0 评论 -
华为oj--整型数组合并
将两个数组合并按照升序排列,并去掉重复的元素。思路:首先将两个无序的数组排列有序,然后将其合并到另一个数组中,合并过程中遇到重复元素则不放入数组,有点类似归并排序的合并操作。华为oj上面错了一个用例,也不知道为什么。/** * 输入说明,按下列顺序输入: *1 输入第一个数组的个数 *2 输入第一个数组的数值 *3 输入第二个数组的个数 *4 输入第二个数组的数值输原创 2016-09-02 10:12:00 · 536 阅读 · 0 评论 -
回型矩阵
给定正整数n,输出一个n*n的矩阵,如n=3,输出矩阵如下: 1 2 3 8 9 4 7 6 5import java.util.Scanner;class Fun{ public void fun(int[][] a,int n,int k,int count,int N){ if(n<=0) return;原创 2016-08-11 13:37:34 · 1198 阅读 · 0 评论 -
最短路径
public class Demo { public static void main(String[] args) { int[][] graph=new int[][]{{65535,65535,10,65535,30,100}, {65535,5,65535,65535,65535,65535}, {65535,65535,65535,50,655原创 2016-08-23 13:31:22 · 182 阅读 · 0 评论 -
华为oj--字符串截取(最长回文字符串)
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer原创 2016-09-03 08:38:39 · 699 阅读 · 0 评论 -
判断字符串中的括号是否匹配
思路:括号匹配可以用栈来解决,当输入的是左括号时,将其压入栈中,输入的是右括号时,判断栈是否为空,为空则匹配失败,否则取栈顶元素判断其是否与当前右括号匹配。这样直到字符串输入结束时,若栈为空则匹配成功,否则匹配失败。import java.util.Scanner;import java.util.Stack;public class Main { public static vo原创 2016-09-03 11:52:39 · 4239 阅读 · 0 评论 -
股神
题目描述有股神吗?有,小赛就是!经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?import java.util.Scanner;public clas原创 2016-09-15 11:57:34 · 543 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历结果,重建该二叉树。假设原创 2016-08-26 12:15:41 · 216 阅读 · 0 评论 -
击鼓传花(赛码网)
题目描述学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。聪明原创 2016-09-17 10:02:29 · 2370 阅读 · 0 评论 -
筛选法求素数
如果一个数为素数,那么它的倍数一定是合数。由此可得,对于求n以内的素数,分配一个大小为n+1的boolean类型的数组,首先将下标为奇数的boolean量置为true,然后3开始筛选。import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner scanner=原创 2016-08-25 11:02:29 · 441 阅读 · 0 评论 -
华为oj--坐标移动
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。 输入: 合法坐标为A(或者D或者W或者S) + 数字(两位以内) 坐标之间以;分隔。 非法坐标点需要进行丢弃。如AA10; A1A; $%$; YAD; 等。 下面是一个简单的例子 如: A10;S20;W10;D原创 2016-08-25 10:38:08 · 311 阅读 · 0 评论 -
分苹果
果园里有堆苹果,N(1<N<9)只熊来分。第一只熊把这堆苹果平均分为N份,多了一个,它把多的一个扔了,拿走了一份。第二只熊把剩下的苹果又平均分成N份,又多了一个,它同样把多的一个扔了,拿走了一份,第三、第四直到第N只熊都是这么做的,问果园里原来最少有多少个苹果?import java.util.Scanner;public class Main { public static原创 2016-09-16 14:38:29 · 1510 阅读 · 0 评论 -
计算器的新功能
题目描述当你学一些可视化程序设计语言时,老师经常会让你设计并且编程做出一个计算器,这时也许你会仿照windows系统自带的计算器外观和功能去设计,但是现在老师要你多做出一个有新功能的计算器,实现当输入一个数时,能够将这个数分解成一个或多个素因子乘积的形式,并按素因子的大小排列显示出来。大家对计算器中数的表示应该很清楚的。下面显示出了0 — 9这十个数字的表示形式。每个数字都占据5 * 3大原创 2016-09-16 13:55:50 · 555 阅读 · 0 评论 -
路灯
题目描述V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道上的点与路灯的最远距离,所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?输入输入两行数据,第原创 2016-09-15 19:50:51 · 818 阅读 · 0 评论 -
翻转数组
给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列。其中数组片段[l,r]表示序列a[l], a[l+1], ..., a[r]。原始数组为a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n原创 2016-09-15 14:38:44 · 343 阅读 · 0 评论 -
密码验证合格程序
密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能有相同长度超2的子串重复import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner scanner=new Scanner(System.in); Str原创 2016-09-01 20:06:44 · 509 阅读 · 0 评论 -
华为oj--寻找等差数列
题目标题:在给定的区间范围内找出所有素数能构成的最大的等差数列(即等差数列包含的素数个数最多)。举例:在区间[0, 10]中,素数构成的最大等差数列为3,5,7思路:首先找出所有的素数,然后求得最大的素数和最小的素数之差i(即为最大的公差),将公差从1到i依次循环,在求得的素数列表中找到最长的等差序列。import java.util.ArrayList;import java.util.L原创 2016-09-01 16:19:10 · 870 阅读 · 0 评论 -
按之字形顺序打印二叉树
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层 按照从左到右的顺序打印,第三行再按照从左到右的顺序打印,其他行依次类推。 思路:按照之字形顺序打印二叉树需要两个栈。当打印某一行节点时,把下一行的子节点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子节点再保存右子节点到第一个栈里;如果当前打印的是偶数层,则先保存右子节点再保存左子节点到第二个栈中。原创 2016-08-30 11:35:07 · 335 阅读 · 0 评论 -
素数伴侣
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会原创 2016-08-08 15:04:19 · 1219 阅读 · 0 评论 -
最长公共子序列
问题的递推式: import java.util.Scanner;public class Test{ public static void main(String[] args) { Scanner input=new Scanner(System.in); String s1=input.nextLine(); String s2=input.next原创 2016-08-04 11:39:22 · 259 阅读 · 0 评论 -
字符串的全排列
(1)求所有可能出现在第一个位置的字符,(2)把第一个字符和其后面的字符一一交换。如下图所示,分别把第一个字符a和后面的b、c等字符交换的情形。(3)固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换 import java.util.HashSet;imp原创 2016-08-03 14:23:25 · 243 阅读 · 0 评论 -
二叉搜索树的查找、添加和删除操作
class Node{ int data; Node lChild; Node rChild; public Node(int data){ this.data=data; this.lChild=null; this.rChild=null; }}public class Tree { public static void main(String[] arg原创 2016-08-29 18:45:31 · 562 阅读 · 0 评论 -
查找两个字符串a,b的最长公共子串
对于两个字符串a、b,开辟一个大小为[a.length()+1][b.length()+1]的二维整型数组,初始化第一行和第一列为0,对于其他的每一个a[i][j],如果字符串a的第i个字符与字符串b的第j个字符相等,那么a[i][j]=a[i-1][j-1]+1,否则a[i][j]=0。import java.util.Scanner;public class Main{ pub原创 2016-08-28 15:56:59 · 630 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
请写一个程序创建一棵二元树,并按照一定规则,输出二元树根节点到叶子节点的路径。规则如下:从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。比如下面一些转化的例子:输入"10,5,12,4,7"值,构造的树如下(注意:构造二元树时,需要从上到下一层一层原创 2016-08-27 11:12:12 · 376 阅读 · 0 评论 -
堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节转载 2016-08-20 11:32:59 · 311 阅读 · 0 评论 -
表达式求值
这是刚学数据结构时候碰到的题了,当时还觉得有点难,现在又碰到了这道题,理清思路后还是把它编出来了。这道题核心思想是将中缀表达式转换为后缀表达式。我用了两个栈来实现这个操作。解析输入的字符串,如果是数字则入数字栈,是操作符则比较当前操作符和操作符栈顶操作符的优先级,若当前操作符优先级较高,则从数字栈中弹出两个数进行运算,否则将当前操作符压入栈中,其中‘)’不入栈并弹出‘(’。import jav原创 2016-08-09 10:04:08 · 203 阅读 · 0 评论 -
建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。
/** * 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。 * 这个问题用Object的wait(),notify()就可以很方便的解决。 * * 主要的思想就是,为了控制执行的顺序,必须要先持有prev锁,也就前一个线程要释放自身对象锁,再去申请自身对象锁, * 两者兼备时打印,之后首先调用self.notify()转载 2016-08-31 10:41:37 · 784 阅读 · 0 评论 -
放苹果
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。解题思路:看到这道题目,首先想到的是数学里的排列组合的插空法,即将N个盘子插到M+1个位置。首先将第N个盘子固定在第M+1个位置,然后其余每个盘子都有M种可能,递归调用,去除不合格的结果,即为所求。总结:看网上别人都是通过递推式求解的,效率很高。相比之下,我原创 2016-08-11 10:06:44 · 404 阅读 · 0 评论 -
图的邻接表存储
邻接表是图的一种链式存储结构。在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点Vi的边。import java.util.Scanner;class Node{ String point; //顶点 int value; //权值 Node next;}public class Graph { public static void原创 2016-08-22 10:15:21 · 304 阅读 · 0 评论 -
华为oj--迷宫问题
定义一个二维数组N*M(其中2int 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-08-22 12:13:48 · 1368 阅读 · 0 评论 -
字符串合并处理
按照指定规则对输入的字符串进行处理。详细描述:将输入的两个字符串合并。对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后原创 2016-08-10 10:36:46 · 359 阅读 · 0 评论 -
二叉树的相关操作(递归)
二叉树节点定义public class Node { int data; Node leftChild; Node rightChild;}一些二叉树的操作import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Stack;原创 2016-08-05 13:48:55 · 257 阅读 · 0 评论 -
sunday算法
sunday算法的概念如下:Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M。此时已经匹配的部分为u,并假设原创 2016-08-10 08:35:39 · 331 阅读 · 0 评论 -
二叉树的非递归遍历
import java.util.Stack;class Node{ String data; Node lChild; Node rChild; public Node(String data){ this.data=data; this.lChild=null; this.rChild=null; }}public class Demo { public原创 2016-08-21 17:02:29 · 337 阅读 · 0 评论 -
整数与ip地址之间的转换
整数与IP地址间的转换题目描述原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。举例:一个ip地址为10.0.3.193每段数字 相对应的二进制数10 000010100 000000003原创 2016-08-21 10:29:26 · 859 阅读 · 1 评论