JAVA经典算法

合集下载

java 经典笔试算法题

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经典算法50题(3)【面试+工作】

JAVA经典算法50题(3)【面试+工作】

JAVA经典算法50题(3)【面试+工作】JAVA经典算法50题(3)【面试+工作】【程序21】题目:求1+2!+3!+...+20!的和。

1.程序分析:此程序只是把累加变成了累乘。

public class Demo21 {public static void main(String[] args) {long sum = 0;long fac = 1;for (int i = 1; i <= 20; i++) {fac = fac * i;sum += fac;}System.out.println(sum);}}【程序22】题目:利用递归方法求5!。

1.程序分析:递归公式:f(n)=f(n-1)*4!import java.util.Scanner;public class Demo22 {public static long fac(int n) {long value = 0;if (n == 1 || n == 0) {value = 1;} else if (n > 1) {value = n * fac(n - 1);}return value;}public static void main(String[] args) {System.out.println("请输入一个数:");Scanner in = new Scanner(System.in);int n = in.nextInt();System.out.println(n + "的阶乘为:" + fac(n));}}【程序23】题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。

问第4个人岁数,他说比第3个人大2岁。

问第三个人,又说比第2人大两岁。

问第2个人,说比第一个人大两岁。

最后问第一个人,他说是10岁。

请问第五个人多大?1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。

Java中的机器学习算法实现

Java中的机器学习算法实现

Java中的机器学习算法实现机器学习是一种通过让计算机系统从数据中获取知识和经验,并利用这些知识和经验进行学习和决策的方法。

而Java作为一种强大的编程语言,在机器学习领域也拥有广泛的应用。

本文将介绍Java中常用的机器学习算法实现及其应用。

一、线性回归算法线性回归是一种应用广泛的机器学习算法,用于预测一个或多个自变量与因变量之间的线性关系。

在Java中,我们可以使用Apache Commons Math库中的线性回归类来实现线性回归算法。

下面是一个简单的线性回归示例代码:```javaimport mons.math3.stat.regression.SimpleRegression;public class LinearRegressionExample {public static void main(String[] args) {// 创建线性回归对象SimpleRegression regression = new SimpleRegression();// 添加数据点regression.addData(1, 2);regression.addData(2, 3);regression.addData(3, 4);// 输出回归方程System.out.println("Intercept: " + regression.getIntercept());System.out.println("Slope: " + regression.getSlope());// 预测新的数据点double x = 4;double y = regression.predict(x);System.out.println("Predicted y: " + y);}}```二、决策树算法决策树是一种基于树结构的机器学习算法,可以用于分类和回归任务。

JAVA算法100例题目

JAVA算法100例题目

JA V A经典算法40题【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

【程序3】题目:打印出所有的"水仙花数",所谓"水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。

例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

【程序4】题目:将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

【程序5】题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.程序分析:(a> b)?a:b这是条件运算符的基本例子。

【程序6】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

1.程序分析:利用辗除法。

【程序7】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

1.程序分析:利用while语句,条件为输入的字符不为'\n '.【程序8】题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

java辗转相除法

java辗转相除法

java辗转相除法Java辗转相除法是一种常用的求最大公约数的算法。

它通过不断地用两个数的余数来替换原来的两个数,直到两个数中的一个变为0为止,此时另一个非零的数就是这两个数的最大公约数。

辗转相除法的原理很简单,但其实现方式有多种。

下面我将介绍一种常见的实现方式,并给出Java代码示例。

一、辗转相除法的原理辗转相除法,也称为欧几里得算法,其核心思想是利用除法的性质来逐步缩小求解范围。

具体步骤如下:1. 取两个正整数a和b(a > b);2. 用a除以b,得到余数r;3. 若r等于0,则b即为最大公约数;4. 若r不等于0,则a等于b,b等于r,再次执行第2步;5. 重复执行第2步和第3步,直到r等于0,此时上一次的b就是最大公约数。

二、Java代码示例下面是使用Java语言实现辗转相除法的代码示例:```javapublic class GCDAlgorithm {public static void main(String[] args) {int a = 48;int b = 36;int gcd = getGCD(a, b);System.out.println("最大公约数为:" + gcd);}public static int getGCD(int a, int b) {while (b != 0) {int temp = a % b;a = b;b = temp;}return a;}}```在上述代码示例中,我们通过一个`getGCD`方法来实现辗转相除法。

首先,我们使用一个`while`循环,判断当`b`不等于0时,执行循环体中的操作。

在循环体中,我们用`temp`来保存`a`除以`b`的余数,然后将`b`赋值给`a`,将`temp`赋值给`b`。

重复执行该过程,直到`b`等于0为止。

最终,我们得到的`a`就是两个数的最大公约数。

三、辗转相除法的应用辗转相除法不仅可以求解最大公约数,还可以用于其他一些与最大公约数相关的问题,例如判断两个数是否互质、求解线性同余方程等。

java常见算法题整理

java常见算法题整理

java常见算法题整理
以下是一些常见的 Java 算法题:
1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

2. 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

3. 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。

新链表是通过拼接给定的两个链表的所有节点组成的。

4. 反转链表
反转一个链表。

你可以使用迭代或递归的方法来解决这个问题。

5. 合并两个有序数组
将两个升序有序数组 A 和 B 合并为一个新的升序有序数组 C。

6. 二分查找
在排序数组中查找元素的近似最右位置。

通过比较数组中间元素和目标值的大小关系,如果目标值大于中间元素,则在右半部分继续查找;否则在左半部分查找。

重复此过程直到找到目标值或确定目标值不存在于数组中。

7. 二分查找 II
给定一个排序的整数数组 nums 和一个目标值 target,如果 nums 中包含目标值,则返回目标值的索引,否则返回 -1。

java常用算法和数据结构

java常用算法和数据结构

java常用算法和数据结构Java是一种面向对象的编程语言,它具有丰富的算法库和数据结构库,为开发人员提供了许多常用的算法和数据结构。

下面将介绍一些Java常用的算法和数据结构。

1.排序算法-冒泡排序(Bubble Sort):比较相邻的两个元素,如果顺序错误则交换位置,重复该过程直到整个序列有序。

-插入排序(Insertion Sort):将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分合适的位置。

-选择排序(Selection Sort):每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。

-快速排序(Quick Sort):选择一个基准元素,将数组分为两部分,小于基准的放左边,大于基准的放右边,递归地对左右两部分进行快速排序。

-归并排序(Merge Sort):将数组分为两部分,分别对每个子数组进行排序,然后合并两个有序子数组。

2.搜索算法-二分查找(Binary Search):对有序数组进行查找,每次将查找范围缩小一半。

-广度优先搜索(BFS):以树或图的形式搜索,从根节点开始,逐层扩展搜索范围,直到找到目标节点。

-深度优先搜索(DFS):以树或图的形式搜索,从根节点开始,逐个访问节点的所有邻居节点,直到找到目标节点或搜索完所有节点。

3.数据结构-数组(Array):一组按顺序存储的相同类型元素的集合,通过索引访问元素,可以快速访问元素,但插入和删除元素较慢。

-链表(Linked List):一组通过指针连接的节点存储的元素的集合,支持灵活的插入和删除操作,但访问元素较慢。

-栈(Stack):一种特殊的线性数据结构,遵循先进后出(LIFO)原则,只能在栈顶进行插入和删除操作。

-队列(Queue):一种特殊的线性数据结构,遵循先进先出(FIFO)原则,在队尾插入元素,队头删除元素。

-堆(Heap):一种特殊的树形数据结构,可以快速找到最小(或最大)元素,常用于实现优先队列。

学习编程的十大经典算法

学习编程的十大经典算法

学习编程的十大经典算法学习编程是现代社会中一个非常重要的技能,而掌握经典算法是成为一个优秀的程序员的必备条件之一。

下面将介绍十大经典算法,详细解释它们的原理和应用。

1. 二分查找算法(Binary Search)二分查找算法是一种在有序数组中快速查找特定元素的算法。

它将查找范围不断缩小一半,直到找到目标元素或确定目标元素不存在。

二分查找算法的时间复杂度为O(log n)。

2. 冒泡排序算法(Bubble Sort)冒泡排序算法是一种简单但效率较低的排序算法。

它通过多次遍历数组,将相邻的元素进行比较并交换位置,使得较大(或较小)的元素逐渐移动到数组的末尾。

冒泡排序的时间复杂度为O(n^2)。

3. 快速排序算法(Quick Sort)快速排序算法是一种高效的排序算法。

它通过选择一个基准元素,将数组分为左右两个子数组,并对子数组进行递归排序。

快速排序算法的时间复杂度为O(n log n),在大多数情况下具有较好的性能。

4. 归并排序算法(Merge Sort)归并排序算法是一种分治思想的排序算法。

它将数组一分为二,递归地对子数组进行排序,然后将排好序的子数组合并成一个有序的数组。

归并排序算法的时间复杂度为O(n log n),稳定且适用于大规模数据的排序。

5. 插入排序算法(Insertion Sort)插入排序算法是一种简单且稳定的排序算法。

它通过将未排序的元素逐个插入已排序的序列中,以达到整体有序的目的。

插入排序的时间复杂度为O(n^2),但对于小规模数据或基本有序的数组,插入排序具有较好的性能。

6. 选择排序算法(Selection Sort)选择排序算法是一种简单但效率较低的排序算法。

它通过多次遍历数组,选择出最小(或最大)的元素,并放置到已排序的序列中。

选择排序的时间复杂度为O(n^2),但它适用于小规模数据或交换成本较高的情况。

7. 堆排序算法(Heap Sort)堆排序算法是一种高效的排序算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河内塔问题(Towers of Hanoi)问题说明:河內之塔(Towers of Hanoi)是法国人M.Claus(Lucas)於1883年从泰国带至法国的,河內为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及這个故事,据说创世紀时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),並命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将损毁,而也就是世界末日來临之时。

算法代码(Java):复制内容到剪贴板import java.io.*;public class Hanoi {public static void main(String args[]) throws IOException {int n;BufferedReader buf;buf = new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入盘子个数");n = Integer.parseInt(buf.readLine());Hanoi hanoi = new Hanoi();hanoi.move(n, 'A', 'B', 'C');}public void move(int n, char a, char b, char c) {if(n == 1)System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);else {move(n - 1, a, c, b);System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);move(n - 1, b, a, c);}}}背包为题(Kanpsack Problem)问题说明:假设一个背包的负重最大可达8公斤,而希望在背包内放置负重范围你价值最高的物品。

算法代码(Java):复制内容到剪贴板class Fruit {private String name;private int size;private int price;public Fruit(String name, int size, int price) { = name;this.size = size;this.price = price;}public String getName() {return name;}public int getPrice() {return price;}public int getSize() {return size;}}public class Knapsack {public static void main(String[] args) {final int MAX = 8;final int MIN = 1;int[] item = new int[MAX+1];int[] value = new int[MAX+1];Fruit fruits[] = {new Fruit("李子", 4, 4500),new Fruit("苹果", 5, 5700),new Fruit("桔子", 2, 2250),new Fruit("草莓", 1, 1100),new Fruit("甜瓜", 6, 6700)};for(int i = 0; i < fruits.length; i++) {for(int s = fruits[i].getSize(); s <= MAX; s++) {int p = s - fruits[i].getSize();int newvalue = value[p] +fruits[i].getPrice();if(newvalue > value[s]) {// 找到阶段最佳解value[s] = newvalue;item[s] = i;}}}System.out.println("物品\t价格");for(int i = MAX;i >= MIN;i = i - fruits[item[i]].getSize()) {System.out.println(fruits[item[i]].getName()+"\t" + fruits[item[i]].getPrice());}System.out.println("合计\t" + value[MAX]);}}双色,三色河内塔(Hanoi2Colors)问题说明:双色,三色河内塔是由河内塔演变而来的一种算法。

算法代码(Java):复制内容到剪贴板public class Hanoi2Colors {public static void help() {System.out.println("Usage: java Hanoi2Colors number_of_disks");System.out.println("\t number_of_disks: must be a even number.");System.exit(0);}public static void main(String[] args) {int disks = 0;try {disks = Integer.parseInt(args[0]);} catch (Exception e) {help();}if ((disks <= 0) || (disks % 2 != 0)) {help();}hanoi2colors(disks);}public static void hanoi(int disks,char source, char temp, char target) { if (disks == 1) {System.out.println("move disk from "+ source + " to " + target);System.out.println("move disk from "+ source + " to " + target);} else {hanoi(disks-1, source, target, temp);hanoi(1, source, temp, target);hanoi(disks-1, temp, source, target);}}public static void hanoi2colors(int disks) {char source = 'A';char temp = 'B';char target = 'C';for (int i = disks / 2; i > 1; i--) {hanoi(i-1, source, temp, target);System.out.println("move disk from "+ source + " to " + temp);System.out.println("move disk from "+ source + " to " + temp);hanoi(i-1, target, temp, source);System.out.println("move disk from "+ temp + " to " + target);}System.out.println("move disk from "+ source + " to " + temp);System.out.println("move disk from "+ source + " to " + target);}}三色河内塔复制内容到剪贴板public class Hanoi3Colors {public static void help() {System.out.println("Usage: java Hanoi3Colors number_of_disks");System.out.println("\tnumber_of_disks: must be a number divisible by 3.");System.exit(0);}public static void main(String[] args) {int disks = 0;try {disks = Integer.parseInt(args[0]);} catch (Exception e) {help();}if ((disks <= 0) || (disks % 3 != 0)) {help();}hanoi3colors(disks);}public static void hanoi(int disks,char source, char temp, char target) { if (disks == 1) {System.out.println("move disk from "+ source + " to " + target);System.out.println("move disk from "+ source + " to " + target);System.out.println("move disk from "+ source + " to " + target);} else {hanoi(disks-1, source, target, temp);hanoi(1, source, temp, target);hanoi(disks-1, temp, source, target);}}public static void hanoi3colors(int disks) {char source = 'A';char temp = 'B';char target = 'C';if (disks == 3) {System.out.println("move disk from "+ source + " to " + temp);System.out.println("move disk from "+ source + " to " + temp);System.out.println("move disk from "+ source + " to " + target);System.out.println("move disk from "+ temp + " to " + target);System.out.println("move disk from "+ temp + " to " + source);System.out.println("move disk from "+ target + " to " + temp);} else {hanoi(disks/3-1, source, temp, target);System.out.println("move disk from "+ source + " to " + temp); System.out.println("move disk from "+ source + " to " + temp); System.out.println("move disk from "+ source + " to " + temp); hanoi(disks/3-1, target, temp, source);System.out.println("move disk from "+ temp + " to " + target); System.out.println("move disk from "+ temp + " to " + target); System.out.println("move disk from "+ temp + " to " + target); hanoi(disks/3-1, source, target, temp);System.out.println("move disk from "+ target + " to " + source); System.out.println("move disk from "+ target + " to " + source); hanoi(disks/3-1, temp, source, target);System.out.println("move disk from "+ source + " to " + temp);for (int i = disks / 3 - 1; i > 0; i--) {if (i>1) {hanoi(i-1, target, source, temp);}System.out.println("move disk from "+ target + " to " + source);System.out.println("move disk from "+ target + " to " + source);if (i>1) {hanoi(i-1, temp, source, target);}System.out.println("move disk from "+ source + " to " + temp);}}}}字符串核对(String Match)问题说明:现在的一些高级程序语言对于字符串的处理支持越来越大,不过字符串搜寻本身仍是值得探讨的课题,在这里以Boyer Moore法来说明如何进行字符串说明,这个方法速度快且容易理解。

相关文档
最新文档