java数据结构典型题
- 1 - 一、 顺序表 interface IList{ public void clear(); public boolean isEmpty(); public Object get(int i) throws Exception; public void insert(int i,Object x) throws Exception; public void remove(int i) throws Exception; public int indexOf(Object x); public void display(); } < SqList.java> public class SqList implements IList{ private Object[] listElem; private int curLen; public SqList(int maxSize){ curLen=0; listElem=new Object[maxSize]; } public void clear(){ curLen=0; } public boolean isEmpty(){ return curLen==0; } public int lenght(){ return curLen; } public Object get(int i) throws Exception{ if(i<0||i>curLen-1) throw new Exception("第"+i+"个元素不存在"); return listElem[i]; } public void insert(int i,Object x) throws Exception{ if(curLen==listElem.length) throw new Exception("顺序表已满"); if(i<0||i>curLen) throw new Exception("插入位置不合法"); for(int j=curLen;j>i;j--) listElem[j]=listElem[j-1]; listElem[i]=x; curLen++; } public void remove(int i) throws Exception{ if(i<0||i>curLen-1) throw new Exception("删除位置不合法"); for(int j=i;jlistElem[j]=listElem[j+1]; curLen--; }
public int indexOf(Object x) { int j=0;
while(jj++; if(jreturn j; else return-1; } public void display(){ for(int j=0;jSystem.out.print(listElem[j]+""); System.out.println(); } public static void main(String[] args) throws Exception{ SqList L=new SqList(50); L.insert(0,'a'); L.insert(1,'b'); L.insert(2,'c'); L.insert(3,'d'); L.insert(4,'e'); int order=L.indexOf('c'); if(order!=-1) System.out.println("顺序表中第一次出现的值为‘c’的数据元素的位置为:"+order); else System.out.println("此顺序表中不包含值为‘c’的数据元素!"); L.remove(2); System.out.println("删除后的顺序表为:"); L.display(); }}
顺序表中第一次出现的值为‘c’的数据元素的位置为:2 删除后的顺序表为: abde - 2 -
二、 链表 interface IList{ public void clear(); public boolean isEmpty(); public Object get(int i) throws Exception; public void insert(int i,Object x) throws Exception; public void remove(int i) throws Exception; public int indexOf(Object x); public void display(); public void nizhi(); } < Node.java > public class Node { private Object data; private Node next; public Node() { this(null,null); } public Node(Object data) { this(data,null); } public Node(Object data,Node next) { this.data=data; this.next=next; } public Object getData(){ return data; } public Node getNext() { return next; } public void setData(Object data) { this.data=data; } public void setNext(Node next) { this.next=next; } } < LinkList.java> import java.util.*; public class LinkList implements IList { private Node head; public LinkList(){ head=new Node(); } public LinkList(int n,boolean Order)throws Exception{ this(); if(Order) create1(n); else create2(n); } public void create1(int n)throws Exception { Scanner sc=new Scanner(System.in); for(int j=0;jinsert(length(),sc.next()); } public void create2(int n)throws Exception { Scanner sc=new Scanner(System.in); for(int j=0;jinsert(0,sc.next()); } public void clear(){ head.setData(null); head.setNext(null); } public boolean isEmpty(){ return head.getNext()==null; } public int length(){ Node p=head.getNext(); int length = 0; while(p!=null) { p=p.getNext(); ++length; } return length; } public Object get(int i) throws Exception { Node p=head.getNext(); int j=0; while(p!=null&&jp=p.getNext(); ++j; } if(j>i||p==null) { throw new Exception("第"+i+"个元素不存在"); } return p.getData(); } public void insert(int i,Object x)throws Exception { Node p=head; int j=-1; while(p!=null&&j{ p=p.getNext(); ++j; } if(j>i-1||p==null) throw new Exception("插入位置不合法"); Node s=new Node(x); s.setNext(p.getNext()); p.setNext(s); } public void remove (int i)throws Exception { Node p=head; - 3 -
int j=-1; while(p.getNext()!=null&&ji-1||p.getNext()==null) throw new Exception("删除位置不合法"); p.setNext(p.getNext().getNext()); } public int indexOf(Object x) { Node p=head.getNext(); int j=0; while(p!=null&&!p.getData().equals(x)) { p=p.getNext(); ++j; } if(p!=null) return j; else return -1; } public void display(){ Node node=head.getNext(); while(node!=null) { System.out.print(node.getData()+" "); node=node.getNext(); } System.out.println();} public void nizhi() { Node p=head.getNext(); Node q; head.setNext(null); while(p!=null) { q=p.getNext(); p.setNext(head.getNext()); head.setNext(p); p=q; }} public static void main(String[] args) throws Exception{ int n=10; LinkList L=new LinkList(); for(int i=0;i import java.util.*; public class test { public static void main(String[] args) throws Exception{ int a; System.out.println("请输入5个结点值:"); LinkList L=new LinkList(5,true); System.out.println("插入的字符为:"); intx=new Scanner(System.in).nextInt(); System.out.println("插入的位置为:"); inty=newScanner(System.in).nextInt(); L.insert(y,x); L.display(); System.out.println("单链表的长度为:"); a=L.length(); System.out.println(a); System.out.println("所删除字符的结点值为:"); Int n=new Scanner(System.in).nextInt(); L.remove(n); L.display(); System.out.println("请输入要查询的结点值:"); Int i=new Scanner(System.in).nextInt(); if(0System.out.println("位置"+i+"的元素的值是:"+L.get(i)); } else System.out.println("位置"+i+"的元素不存在"); System.out.println("实现单链表逆置"); L.nizhi(); L.display(); }}
java 经典笔试算法题
java 经典笔试算法题一、排序算法1. 实现一个基于Java的快速排序算法。
答:快速排序是一种常用的排序算法,其核心思想是分治法。
首先选择一个基准元素,将数组分成两部分,一部分小于基准元素,一部分大于基准元素。
然后递归地对这两部分继续进行快速排序,直到整个数组有序。
2. 实现一个稳定的冒泡排序算法。
答:冒泡排序是一种简单的排序算法,通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
稳定的冒泡排序算法是指在排序过程中,相同元素的相对位置不会改变。
3. 实现一个选择排序算法。
答:选择排序是一种简单直观的排序算法。
其工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
二、字符串操作算法1. 实现一个函数,将一个字符串反转。
答:可以使用StringBuilder类的reverse()方法来实现字符串的反转。
2. 实现一个函数,将一个字符串中的所有大写字母转换为小写字母,其余字符保持不变。
答:可以使用String类的replaceAll()方法和toLowerCase()方法来实现。
3. 实现一个函数,将一个字符串按空格分割成单词数组,并删除空字符串和null字符串。
答:可以使用split()方法和Java 8的流来处理。
三、数据结构算法1. 实现一个单向链表,并实现插入、删除、查找和打印链表的功能。
答:单向链表是一种常见的数据结构,可以通过定义节点类和链表类来实现。
插入、删除、查找和打印链表的功能可以通过相应的方法来实现。
2. 实现一个二叉搜索树(BST),并实现插入、查找、删除节点的功能。
答:二叉搜索树是一种常见的数据结构,它具有唯一的高度特性。
插入、查找和删除节点的功能可以通过相应的方法来实现,如左旋、右旋、递归等。
3. 实现一个哈希表(HashMap),并实现插入、查找和删除键值对的功能。
答:HashMap是一种基于哈希表的映射数据结构,它通过哈希码的方式将键映射到对应的值上。
java 递归笔试题目
以下是一些可能的Java递归笔试题目:
1. 阶乘计算:
实现一个函数,使用递归计算给定数字的阶乘。
例如,factorial(5) 应返回。
java代码:
2. 斐波那契数列:
实现一个函数,使用递归计算斐波那契数列的第n项。
斐波那契数列的定义是:。
java代码:
3. 汉诺塔问题:
实现一个函数,使用递归解决汉诺塔问题。
给定三个柱子A、B、C和n个圆盘,开始时所有圆盘都在柱子A上,目标是将所有圆盘移动到柱子C上,遵循以下规则:
每次只能移动一个圆盘。
每次移动时,圆盘必须放在比它大的圆盘上面。
不允许将任何较大的圆盘放在较小的圆盘上。
java代码:
4. N个台阶的走法:
给定一个楼梯有N个台阶,每次可以跳上1阶或2阶,计算总共有多少种不同的走法。
java代码:
5. 树的深度优先搜索(DFS):
给定一个树的数据结构,实现一个函数,使用递归进行深度优先搜索。
java代码:
这些题目涵盖了基本的递归概念和应用,包括简单的数学问题、经典的递归
问题以及数据结构中的递归搜索。
在实际的笔试中,题目可能会包含更复杂的场景和限制。
Java数据结构和算法总结-字符串相关高频面试题算法
Java数据结构和算法总结-字符串相关⾼频⾯试题算法 前⾔:周末闲来⽆事,看了看字符串相关算法的讲解视频,收货颇丰,跟着视频讲解简单做了⼀下笔记,⽅便以后翻阅复习同时也很乐意分享给⼤家。
什么字符串在算法中有多重要之类的⼤路边上的客套话就不多说了,直接上笔记吧。
⼀、字符串java:String内置类型,不可更改。
(如需更改可考虑:StringBuffer, StringBuilder,char[]等)⼆、归类 字符串涉及到的相关题型通常会是以下⼏个⽅⾯:概念理解:字典序简单操作:插⼊删除字符、旋转规则判断(罗马数字转换是否是合法的整数、浮点数)数字运算(⼤数加法,⼆进制加法)排序、交换字符计数:变位词匹配(正则表达式、全串匹配、KMP、周期判断)动态规划(LCS、编辑距离、最长回⽂⼦串)搜索(单词变换、排列组合)三、例题1、交换:把⼀个只包含01的串排序,可交换任意两个数的位置,最少需要多少次交换? 思路:从两头往中间扫荡,扫荡过程中在左边遇到1就和右边遇到的0交换位置,直接到左有下标相遇时结束。
具体代码如下:1public static void main(String[] strs) {2int count = 0;3int[] arrays = new int[] {0, 0, 1, 1, 1, 0, 1, 0, 0, 1};4int left = 0;5int right = arrays.length - 1;6while (true) {7while (arrays[left] == 0) {8 left++;9 }10while (arrays[right] == 1) {11 right--;12 }13if (left >= right) {14break;15 } else {16int temp = arrays[left];17 arrays[left] = arrays[right];18 arrays[right] = temp;19 count++;20 }21 }22 Logger.println("交换次数:" + count);23for (int array : arrays) {24 Logger.print(array + ", ");25 }26 }清晰起见,交换次数和排序后的的字符串输出如下:交换次数:30, 0, 0, 0, 0, 1, 1, 1, 1, 1,2、字符串替换和复制:删除⼀个字符串所有的a,并且复制所有的b(字符数组⾜够⼤) 思路:详细思路见代码注释1public static void main(String[] strs) {2char[] input = new char[]{'a', 'b', 'c', 'd', 'a', 'f', 'a', 'b', 'c', 'd', 'b', 'b', 'a', 'b'};3char[] chars = new char[50];4for (int j = 0; j < input.length; j++) {5 chars[j] = input[j];6 }7 Logger.println("操作前:");8for (char c:chars9 ) {10 Logger.print(c + ", ");11 }13int countB = 0;14// 1、删除a,⽤n当做新下标,循环遍历数组,凡是不是a的元素都放到新下标的位置,由于新n增长慢,⽼下标i增长快,所以元素不会被覆盖。
java经典编程题目
java经典编程题目
以下是一些经典的Java编程题目,这些题目可以帮助你提高编程技巧和解决问题的能力:
1.反转字符串:编写一个Java方法,将给定的字符串反转。
2.斐波那契数列:编写一个Java方法,计算并返回斐波那契数列的第n项。
3.查找最大和最小元素:编写一个Java方法,在一个整数数组中查找最大和最小元素。
4.反转数组:编写一个Java方法,将给定的整数数组反转。
5.判断回文:编写一个Java方法,判断给定的字符串是否是回文。
6.计算阶乘:编写一个Java方法,计算给定整数的阶乘。
7.冒泡排序:编写一个Java方法,对给定的整数数组进行冒泡排序。
8.二分查找:编写一个Java方法,在已排序的整数数组中查找指定的元素。
9.合并两个有序数组:编写一个Java方法,将两个已排序的整数数组合并为一个新的已排序数组。
10.实现二叉树:编写一个Java类,实现二叉树数据结构,并实现插入、查找和删除节点的方法。
这些题目可以帮助你掌握Java编程的基础知识和技能,提高你的编程能力和解决问题的能力。
JAVA语言程序设计复习题及答案
JAVA语言程序设计考试试卷及部分答案一、单选题:(每题1分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项的标记写在题干后的括号内。
1.下列语句序列执行后,k 的值是( B )。
int m=3, n=6, k=0。
while( (m++) < ( -- n) ) ++k。
A) 0 B) 1 C) 2 D) 32.设 i、j 为int型变量名,a 为int型数组名,以下选项中,正确的赋值语句是( B )。
A) i = i + 2 B) a[0] = 7。
C) i++ - --j。
D) a(0) = 66。
3.Java语言的类间的继承关系是( B )。
A) 多重的 B) 单重的 C) 线程的 D) 不能继承4.设有定义 int i = 6 。
,则执行以下语句后,i 的值为( C )。
i += i - 1。
A) 10 B) 121 C) 11 D) 1005.下列选项中,用于在定义子类时声明父类名的关键字是( C )。
A)interface B) package C) extends D) class6.若已定义 byte[ ] x= {11,22,33,-66} 。
其中0≤k≤3,则对x数组元素错误的引用是( C )。
A) x[5-3] B) x[k] C) x[k+5] D) x[0]7.下列语句序列执行后,ch1 的值是( B )。
char ch1='A',ch2='W'。
if(ch1 + 2 < ch2 ) ++ch1。
A) 'A' B) 'B' C) 'C' D) B8.下列语句序列执行后,i 的值是( D )。
int i=8, j=16。
9.下列语句序列执行后,k 的值是( C )。
int i=10, j=18, k=30。
switch( j - i ){ case 8 : k++。
数据结构与算法分析java课后答案
数据结构与算法分析java课后答案【篇一:java程序设计各章习题及其答案】>1、 java程序是由什么组成的?一个程序中必须有public类吗?java源文件的命名规则是怎样的?答:一个java源程序是由若干个类组成。
一个java程序不一定需要有public类:如果源文件中有多个类时,则只能有一个类是public类;如果源文件中只有一个类,则不将该类写成public也将默认它为主类。
源文件命名时要求源文件主名应与主类(即用public修饰的类)的类名相同,扩展名为.java。
如果没有定义public类,则可以任何一个类名为主文件名,当然这是不主张的,因为它将无法进行被继承使用。
另外,对applet小应用程序来说,其主类必须为public,否则虽然在一些编译编译平台下可以通过(在bluej下无法通过)但运行时无法显示结果。
2、怎样区分应用程序和小应用程序?应用程序的主类和小应用程序的主类必须用public修饰吗?答:java application是完整的程序,需要独立的解释器来解释运行;而java applet则是嵌在html编写的web页面中的非独立运行程序,由web浏览器内部包含的java解释器来解释运行。
在源程序代码中两者的主要区别是:任何一个java application应用程序必须有且只有一个main方法,它是整个程序的入口方法;任何一个applet小应用程序要求程序中有且必须有一个类是系统类applet的子类,即该类头部分以extends applet结尾。
应用程序的主类当源文件中只有一个类时不必用public修饰,但当有多于一个类时则主类必须用public修饰。
小应用程序的主类在任何时候都需要用public来修饰。
3、开发与运行java程序需要经过哪些主要步骤和过程?答:主要有三个步骤(1)、用文字编辑器notepad(或在jcreator,gel, bulej,eclipse, jbuilder等)编写源文件;(2)、使用java编译器(如javac.exe)将.java源文件编译成字节码文件.class;(3)、运行java程序:对应用程序应通过java解释器(如java.exe)来运行,而对小应用程序应通过支持java标准的浏览器(如microsoft explorer)来解释运行。
数据结构Java版第二章习题
(按照自己的情况选作部分习题,不要抄袭)第二章习题顺序存储线性表一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
×2.顺序存储的线性表可以按序号随机存取。
√3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
×4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
√5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
×6.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
√二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( A ) 。
(A) 一个有限序列,可以为空; (B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空; (D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的(A)个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n三填空题1.在顺序表中做插入操作时首先检查___表是否满了______________。
四算法设计题1.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。
试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性。
并且分析算法的时间复杂度。
2.已知一顺序表A,其元素值非递减有序排列,编写一个函数删除顺序表中多余的值相同的元素。
3.编写一个函数,从一给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。
提示:可以先将顺序表中所有值在x~y之间的元素置成一个特殊的值,并不立即删除它们,然后从最后向前依次扫描,发现具有特殊值的元素后,移动其后面的元素将其删除掉。
4.线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R 中的字符按字母字符、数字字符和其它字符的顺序排列。
全国计算机等级考试二级Java语言程序设计真题精选5(含答案)
全国计算机等级考试二级Java语言程序设计真题精选5一、单项选择题1.下列数据结构中,属于非线性结构的是()。
A.双向链表B.循环链表C.二叉链表√D.循环队列解析:线性结构是指除了第一个和最后一个结点外,所有的元素都是首尾相连的,每一个结点只有一个前驱结点和一个后继结点。
线性表、栈、队列都是线性结构,循环链表和双向链表是线性表的链式存储结构;二叉链表是二叉树的存储结构,而二叉树是非线性结构,因为二叉树有些结点有两个后继结点,不符合线性结构的定义。
2.在下列链表中,能够从任意一个结点出发直接访问到所有结点的是()。
A.单链表B.循环链表√C.双向链表D.二叉链表解析:由于线性单链表的每个结点只有一个指针域,由这个指针只能找到其后继结点,但不能找到其前驱结点。
循环链表的最后一个结点的指针域指向表头结点,所有结点的指针构成了一个环状链,只要指出表中任何一个结点的位置就可以从它出发访问到表中其他所有的结点。
双向链表中的每个结点设置有两个指针,一个指向其前驱,一个指向其后继,这样从任意一个结点开始,既可以向前查找,也可以向后查找,在结点的访问过程中一般从当前结点向链尾方向扫描,如果没有找到,则从链尾向头结点方向扫描,这样部分结点就要被遍历两次,因此不符合题意。
二叉链表是二叉树的一种链式存储结构,每个结点有两个指针域,分别指向左右子结点,可见,二叉链表只能由根结点向叶子结点的方向遍历。
3.下列与栈结构有关联的是()。
A.数组的定义域使用B.操作系统的进程调度C.函数的递归调用√D.选择结构的执行解析:递归调用就是在当前的函数中调用自身并传给相应的参数,这一动作是层层进行的,直到满足一般情况的时才停止递归调用,开始从最后一个递归调用返回,函数调用是通过栈实现的。
4.下面对软件特点描述不正确的是()。
A.软件是一种逻辑实体,具有抽象性B.软件开发、运行对计算机系统具有依赖性C.软件开发涉及软件知识产权、法律及心理等社会因素D.软件运行存在磨损和老化问题√解析:软件具有以下特点:①软件具有抽象性,是一种逻辑实体;②软件没有明显的制作过程;③软件在使用期间不存在磨损、老化问题;④对硬件和环境具有依赖性;⑤软件复杂性高,成本昂贵;⑥软件开发涉及诸多的社会因素。
《Java语言程序的设计基础教程》习题解答
《Java语言程序设计基础教程》练习思考题参考答案第1章 Java程序设计概述1.9 练习思考题1、Java运行平台包括三个版本,请选择正确的三项:()A. J2EEB. J2MEC. J2SED. J2E解答:A,B,C2、Java JDK中反编译工具是:()A. javacB. javaC. jdbD. javap解答:D3、public static void main方法的参数描述是:()A. String args[]B. String[] argsC. Strings args[]D. String args解答:A,B4、在Java中,关于CLASSPATH环境变量的说法不正确的是:()A. CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。
B. 编译器用它来搜索各自的类文件。
C. CLASSPATH是一个目录列表。
D. 解释器用它来搜索各自的类文件。
解答:A5、编译Java Application源文件将产生相应的字节码文件,扩展名为()A. .javaB. .classC. .htmlD. .exe解答:B6、开发与运行Java程序需要经过的三个主要步骤为____________、____________和____________。
7、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是______类的子类并且存储该源程序文件的文件名为______。
8、如果一个Java Applet程序文件中定义有3个类,则使用Sun公司的JDK编译器编译该源程序文件将产生______个文件名与类名相同而扩展名为______的字节码文件。
9、开发与运行Java程序需要经过哪些主要步骤和过程?10、Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎么样的?11、编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。
数据结构习题解答与实验指导
数据结构( Java 版) 习题解答与实验指导目录第1 章绪论11.1 数据结构的基本概念11.2 算法2第2 章线性表32.1 线性表抽象数据类型32.2 线性表的顺序存储和实现42.2.1 线性表的顺序存储结构42.2.2 顺序表52.2.3 排序顺序表72.3 线性表的链式存储和实现92.3.1 单链表9【习题2-8】单链表结点类问题讨论。
9【习2.1 ]使用单链表求解Josephu环问题。
12【习2.2】集合并运算,单链表深拷贝的应用。
142.3.2 双链表16【习2.3] 循环双链表的迭代方法。
19【习2.4] 循环双链表合并连接。
19第3 章串213.1 串抽象数据类型213.2 串的存储和实现223.2.1 串的存储结构223.2.2 常量字符串类22【习3.1 ] C/C++语言,str in g.h 中的strcpy()和strcat()函数存在下标越界错误。
22【思考题3-1】逆转String串,分析算法效率。
24【实验题3-1】MyString 类,比较串大小,忽略字母大小写。
25【例3.2思考题3-2] Mylnteger整数类,返回value的radix进制原码字符串。
26【实验题3-9] 浮点数类。
273.2.3 变量字符串类30【实验题3-11]删除变量串中的所有空格。
4-样卷303.3 串的模式匹配313.3.1 Brute-Force模式匹配算法313.3.2 模式匹配应用32【思考题3-4,实验题3-13 ] MyString 类,replaceAII(pattern,s)改错。
323.3.3 KMP模式匹配算法33第4 章栈和队列364.1 栈364.2 队列384.3 递归41【习4.1 】打印数字塔。
41第5 章数组和广义表435.1 数组435.2 特殊矩阵的压缩存储445.2.1 三角矩阵、对称矩阵和对角矩阵的压缩存储445.2.2 稀疏矩阵的压缩存储465.3 广义表48第6 章树和二叉树496.2 二叉树496.3 线索二叉树566.4 Huffman 树616.5 树的表示和实现62第7 章图637.1 图及其抽象数据类型637.2 图的表示和实现647.3 图的遍历657.4最小生成树677.5最短路径69 第8章查找728.1查找的基本概念728.2二分法查找738.4散列748.5二叉排序树7676【实验8-1】判断一棵二叉树是否为二叉排序树,改错。
