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)堆排序算法是一种高效的排序算法。

java面试题经典算法

java面试题经典算法

java面试题经典算法经典算法在Java面试中经常被问及,因为它们可以展示面试者对基本数据结构和算法的理解程度。

以下是一些经典算法,我会逐个介绍它们。

1. 冒泡排序(Bubble Sort),这是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

时间复杂度为O(n^2)。

2. 快速排序(Quick Sort),快速排序使用分治法策略来把一个序列分为两个子序列。

它是一种分而治之的算法,时间复杂度为O(nlogn)。

3. 二分查找(Binary Search),二分查找是一种在有序数组中查找某一特定元素的搜索算法。

时间复杂度为O(logn)。

4. 递归算法(Recursion),递归是指在函数的定义中使用函数自身的方法。

递归算法通常用于解决可以被分解为相同问题的子问题的情况。

5. 动态规划(Dynamic Programming),动态规划是一种在数学、计算机科学和经济学中使用的一种方法。

它将问题分解为相互重叠的子问题,通过解决子问题的方式来解决原始问题。

6. 深度优先搜索(Depth-First Search)和广度优先搜索(Breadth-First Search),这两种搜索算法通常用于图的遍历和搜索。

深度优先搜索使用栈来实现,而广度优先搜索则使用队列来实现。

以上是一些常见的经典算法,当然还有很多其他的算法,如贪心算法、Dijkstra算法、KMP算法等等。

在面试中,除了了解这些算法的原理和实现方式之外,还需要能够分析算法的时间复杂度、空间复杂度以及适用场景等方面的知识。

希望这些信息能够帮助你在Java面试中更好地准备算法相关的问题。

Java常见的七种查找算法

Java常见的七种查找算法

Java常见的七种查找算法1. 基本查找也叫做顺序查找,说明:顺序查找适合于存储结构为数组或者链表。

基本思想:顺序查找也称为线形查找,属于无序查找算法。

从数据结构线的一端开始,顺序扫描,依次将遍历到的结点与要查找的值相比较,若相等则表示查找成功;若遍历结束仍没有找到相同的,表示查找失败。

示例代码:public class A01_BasicSearchDemo1 {public static void main(String[] args){//基本查找/顺序查找//核心://从0索引开始挨个往后查找//需求:定义一个方法利用基本查找,查询某个元素是否存在//数据如下:{131, 127, 147, 81, 103, 23, 7, 79}int[] arr ={131,127,147,81,103,23,7,79};int number =82;System.out.println(basicSearch(arr, number));}//参数://一:数组//二:要查找的元素//返回值://元素是否存在public static boolean basicSearch(int[] arr,int number){//利用基本查找来查找number在数组中是否存在for(int i =0; i < arr.length; i++){if(arr[i]== number){return true;}}return false;}}2. 二分查找也叫做折半查找,说明:元素必须是有序的,从小到大,或者从大到小都是可以的。

如果是无序的,也可以先进行排序。

但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数据是否在容器当中,返回的索引无实际的意义。

基本思想:也称为是折半查找,属于有序查找算法。

用给定值先与中间结点比较。

比较完之后有三种情况:•相等说明找到了•要查找的数据比中间节点小说明要查找的数字在中间节点左边•要查找的数据比中间节点大说明要查找的数字在中间节点右边代码示例:package com.itheima.search;public class A02_BinarySearchDemo1 {public static void main(String[] args){//二分查找/折半查找//核心://每次排除一半的查找范围//需求:定义一个方法利用二分查找,查询某个元素在数组中的索引//数据如下:{7, 23, 79, 81, 103, 127, 131, 147}int[] arr ={7,23,79,81,103,127,131,147};System.out.println(binarySearch(arr,150));}public static int binarySearch(int[] arr,int number){//1.定义两个变量记录要查找的范围int min =0;int max = arr.length-1;//2.利用循环不断的去找要查找的数据while(true){if(min > max){return-1;}//3.找到min和max的中间位置int mid =(min + max)/2;//4.拿着mid指向的元素跟要查找的元素进行比较if(arr[mid]> number){//4.1 number在mid的左边//min不变,max = mid - 1;max = mid -1;}else if(arr[mid]< number){//4.2 number在mid的右边//max不变,min = mid + 1;min = mid +1;}else{//4.3 number跟mid指向的元素一样//找到了return mid;}}}}3. 插值查找在介绍插值查找之前,先考虑一个问题:为什么二分查找算法一定要是折半,而不是折四分之一或者折更多呢?其实就是因为方便,简单,但是如果我能在二分查找的基础上,让中间的mid点,尽可能靠近想要查找的元素,那不就能提高查找的效率了吗?二分查找中查找点计算如下:mid=(low+high)/2, 即mid=low+1/2*(high-low);我们可以将查找的点改进为如下:mid=low+(key-a[low])/(a[high]-a[low])*(high-low),这样,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

java递归算法经典题目

java递归算法经典题目

java递归算法经典题目递归是一种常见的算法思想,它通过将问题分解为更小的子问题来解决问题。

在Java中,递归算法可以用于解决许多经典问题,如斐波那契数列、汉诺塔、阶乘等。

下面我们将介绍一些Java递归算法经典题目,帮助您更好地理解和掌握递归算法。

1.斐波那契数列斐波那契数列是一个经典的递归问题,它是指从第0项开始,每一项都是前两项的和。

在Java中,可以使用递归方法来求解斐波那契数列。

以下是一个简单的递归算法实现:```javapublicstaticintfibonacci(intn){if(n<=1){returnn;}else{returnfibonacci(n-1)+fibonacci(n-2);}}```这个算法会一直递归调用直到达到斐波那契数列的末项为止。

需要注意的是,递归算法的时间复杂度较高,当n值较大时可能会导致栈溢出等问题。

2.汉诺塔问题汉诺塔问题是一个经典的递归问题,它描述了一个操作:将一堆盘子从一个柱子移动到另一个柱子,要求遵循以下规则:每次只能移动一个盘子,并且大盘子不能放在小盘子上面。

在Java中,可以使用递归方法来解决汉诺塔问题。

以下是一个简单的递归算法实现:```javapublicstaticvoidhanoi(intn,Stringfrom,Stringto,Stringvia) {if(n==1){System.out.println("Movedisk"+n+"from"+from+"to"+to);}else{hanoi(n-1,from,via,to);System.out.println("Movedisk1from"+from+"to"+to);hanoi(n-1,via,to,from);}}```这个算法会一直递归调用,直到完成所有盘子的移动。

java算法大全

java算法大全

java算法大全
Java算法大全可以包含许多不同的算法,包括排序算法、搜索算法、图算法等等。

下面是一些常见和常用的Java算法示例:
1. 排序算法:
- 冒泡排序
- 插入排序
- 选择排序
- 快速排序
- 归并排序
- 堆排序
2. 搜索算法:
- 二分查找
- 广度优先搜索(BFS)
- 深度优先搜索(DFS)
3. 图算法:
- 最短路径算法(如Dijkstra算法、Floyd-Warshall算法)
- 最小生成树算法(如Prim算法、Kruskal算法)
- 拓扑排序算法
4. 动态规划算法:
- 背包问题
- 最长上升子序列(LIS)问题
- 最长公共子序列(LCS)问题
5. 字符串算法:
- 字符串匹配(如暴力匹配、KMP算法、Boyer-Moore
算法)
- 字符串排序(如基数排序)
6. 数值算法:
- 求解线性方程组
- 求解方程的根
- 求解数值积分
以上只是一些常见的算法示例,Java算法的范围非常广泛,涉及到各种不同的问题和应用领域。

如果你有特定的算法
需求,可以提供更具体的问题描述,我可以为你提供更详
细的解答。

javaSHA1WithRSA算法

javaSHA1WithRSA算法

javaSHA1WithRSA算法SHA1WithRSA是一种经典的数字签名算法,利用SHA1摘要算法和RSA非对称加密算法结合起来实现数字签名,保证数据的完整性和安全性。

下面将对该算法进行详细介绍和解析。

1.算法原理首先,SHA1WithRSA算法使用SHA1(Secure Hash Algorithm 1)算法对原始数据进行摘要计算,得到一个固定长度的摘要值,通常为160位(20字节),这个摘要值可以唯一的代表原始数据。

接下来,使用RSA加密算法对摘要值进行加密,生成一个数字签名。

RSA是一种非对称加密算法,使用公钥进行加密,使用私钥进行解密。

对于SHA1WithRSA算法而言,签名的过程是使用私钥对摘要值进行加密,生成签名;而验证的过程则是使用公钥对签名进行解密,还原原始的摘要值。

最后,接收到数字签名的一方,可以根据原始数据、公钥和数字签名,验证数字签名的真实性。

具体过程是首先使用相同的SHA1算法对原始数据进行摘要计算,得到一个新的摘要值,然后使用发送方的公钥对数字签名进行解密,还原原始的摘要值,并与新计算得到的摘要值进行比对,如果两个摘要值相同,则说明数字签名没有被篡改,数据可信。

2.实现过程实现SHA1WithRSA算法的关键是对原始数据进行摘要计算和RSA非对称加密。

2.1摘要计算摘要计算使用SHA1算法,将原始数据转化为一个固定长度的摘要值。

Java提供了MessageDigest类来实现SHA1算法的摘要计算。

```javaString originalData = "Hello, world!";MessageDigest sha1Digest = MessageDigest.getInstance("SHA1");byte[] sha1Hash = sha1Digest.digest(originalData.getBytes();```2.2RSA加密和解密RSA非对称加密算法使用公钥对数据进行加密,使用私钥对加密的数据进行解密。

java平方根算法

java平方根算法

java平方根算法==============一、概述----Java平方根算法是一个用于计算一个数字的平方根的算法。

在Java编程语言中,可以使用各种方法来实现平方根算法,其中一种常见的方法是使用牛顿迭代法。

本文档将介绍如何使用牛顿迭代法在Java中实现平方根算法。

二、算法原理------牛顿迭代法是一种常用的求解非线性方程的数值解法。

它通过不断地迭代逼近方程的解,从而得到精确的数值解。

对于平方根问题,可以使用牛顿迭代法来求解一个数字的平方根。

具体来说,对于一个数字x,可以使用以下公式进行迭代:x_{n+1} = x_n - \frac{x_n^2 - a}{2x_n}其中,a为输入数字,x_n为迭代过程中的当前值。

通过不断迭代,可以逐渐逼近a的平方根。

三、Java实现-------下面是一个简单的Java程序,使用牛顿迭代法实现平方根算法:```javapublic class SquareRootAlgorithm {public static void main(String[] args) {double number = 25.0; // 输入数字double epsilon = 0.00001; // 精度要求double guess = number / 2.0; // 初始猜测值double squareRoot = calculateSquareRoot(number, guess, epsilon);System.out.println("The square root of " + number + " is: " + squareRoot);}public static double calculateSquareRoot(double number, double guess, double epsilon) {double oldGuess = guess;while (Math.abs(guess * guess - number) > epsilon * guess * guess) { // 判断是否满足精度要求guess = (guess + number / guess) / 2.0; // 更新猜测值并继续迭代}return guess; // 返回最终的平方根值}}```这段代码首先定义了一个输入数字和精度要求,并初始化了初始猜测值。

java贪心算法几个经典例子

java贪心算法几个经典例子

java贪心算法几个经典例子1. 跳跃游戏跳跃游戏是一个非常简单的贪心算法问题,概括来说,它的目标是将一些数列中的数字与它们的下标相加,然后通过一定的规则从开始位置向后跳跃,直到跳到数组的最后一个位置。

在这个过程中,我们需要决定每一步要跳多远才能尽可能地跳到数组的最后一个位置。

具体来说,我们需要维护两个变量:一个表示目前能够跳的最远距离,另一个表示如果一步跳完所能到达的最远位置。

对于每一步,我们需要计算出在当前位置能够跳的最远距离,然后从这个范围中选出下一步的最佳位置,直到最终到达数组的结尾。

代码实现如下:```public boolean canJump(int[] nums) {int n = nums.length;int farthest = 0;for (int i = 0; i < n; i++) {if (i <= farthest) {farthest = Math.max(farthest, i + nums[i]);if (farthest >= n - 1) return true;}}return false;}```2. 最佳买卖股票时机在这个问题中,我们需要决定什么时候买入股票并在价值最高的时候卖出。

我们可以利用贪心算法来解决这个问题。

具体来说,我们需要维护两个变量:一个表示目前为止的最小股票价格,另一个表示目前为止的最大利润。

在遍历数组的过程中,我们将最小股票价格与当前价格进行比较,并尝试更新最大利润。

代码实现如下:```public int maxProfit(int[] prices) {int minPrice = Integer.MAX_VALUE;int maxProfit = 0;for (int price : prices) {if (price < minPrice) {minPrice = price;} else if (price - minPrice > maxProfit) {maxProfit = price - minPrice;}}return maxProfit;}```3. 分配饼干这个问题是关于如何将一些饼干分配给孩子们以使得他们获得最大的满足感。

java贪心算法几个经典例子

java贪心算法几个经典例子

java贪心算法几个经典例子
1. 零钱兑换问题
给定面额为1、5、10、25的硬币,以及一个需要兑换的金额,问最少需要多少硬币才能兑换成功。

解法:每次选择面额最大的硬币兑换,直到兑换完毕为止。

2. 分糖果问题
有m个糖果,要分给n个孩子,每个孩子至少分到一个糖果,且每个孩子分到的糖果数应尽量相近,求最小的糖果差。

解法:将m个糖果按照大小排序,依次将糖果分给n个孩子,每次将糖果分给最少的孩子。

3. 区间覆盖问题
给定多个区间,问最少需要选多少个区间才能覆盖全集。

解法:每次选择与当前未被覆盖的部分交集最大的区间添加到答案中,直到所有部分被覆盖完毕为止。

4. 任务调度问题
有n个任务需要完成,每个任务需要占用不同的时间,同时每个任务都有一个
最后期限,问如何调度任务才能最大程度地避免超时。

解法:将所有任务按照最后期限排序,依次将任务安排到最后期限之前的最近空闲时间点,尽量将任务时间安排得紧凑。

Java常用排序算法程序员必须掌握的8大排序算法

Java常用排序算法程序员必须掌握的8大排序算法

分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。

先来看看8种排序之间的关系:1.直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。

如此反复循环,直到全部排好顺序。

(2)实例(3)用java实现12345678911121314151617181920package com.njue;publicclass insertSort {public insertSort(){inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,2 5,53,51};int temp=0;for(int i=1;i<a.length;i++){int j=i-1;temp=a[i];for(;j>=0&&temp<a[j];j--){a[j+1]=a[j]; //将大于temp的值整体后移一个单位}a[j+1]=temp;}for(int i=0;i<a.length;i++){System.out.println(a[i]);}2. 希尔排序(最小增量排序)(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。

当增量减到1时,进行直接插入排序后,排序完成。

(2)实例:(3)用java实现123456789101112131415161718192122232425262728293031publicclass shellSort { publicshellSort(){int a[]={1,54,6,3,78,34,12,45,56,100}; double d1=a.length;int temp=0;while(true){d1= Math.ceil(d1/2);int d=(int) d1;for(int x=0;x<d;x++){for(int i=x+d;i<a.length;i+=d){int j=i-d;temp=a[i];for(;j>=0&&temp<a[j];j-=d){a[j+d]=a[j];}a[j+d]=temp;}}if(d==1){break;}for(int i=0;i<a.length;i++){System.out.println(a[i]);}}3.简单选择排序(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

JAVA常用基本算法

JAVA常用基本算法

JAVA常用基本算法JAVA作为一种常用的编程语言,提供了很多常用的基本算法,用于解决各种问题。

下面我将介绍一些常用的基本算法并给出示例代码。

1.排序算法排序算法是最常用的算法之一,用于将一组数据按照其中一种规则进行排序。

JAVA中常用的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。

冒泡排序:```public static void bubbleSort(int[] arr)int n = arr.length;for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - i - 1; j++)if (arr[j] > arr[j + 1])int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}```快速排序:```public static void quickSort(int[] arr, int low, int high) if (low < high)int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}public static int partition(int[] arr, int low, int high) int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++)if (arr[j] < pivot)i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;```2.查找算法查找算法用于在一组数据中寻找特定的值或位置。

JAVA经典算法练习题

JAVA经典算法练习题
【程序30】
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
1. 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
【程序31】
题目:将一个数组逆序输出。
1.程序分析:用第一个与最后一个交换。
【程序32】
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用~(~0 < <4)
(3)将上面二者进行&运算。
【程序33】
题目:打印出杨辉三角形(要求打印出10行如下图)
【程序10】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
【程序11】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
【程序42】
题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
【程序43】
题目:求0—7所能组成的奇数个数。
【程序44】
题目:一个偶数总能表示为两个素数之和。
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。

java 力扣经典算法思路总结

java 力扣经典算法思路总结

java 力扣经典算法思路总结1.暴力枚举暴力枚举是一种朴素的算法思路,适用于解决一些简单的问题。

在 Java 中,可以使用循环和条件语句来实现暴力枚举。

例如,在力扣题目中,可以使用嵌套循环来求解两个数组的交集、最长公共子序列等问题。

2.递归递归是一种常用的算法思路,适用于解决一些分治的问题。

在 Java 中,可以通过定义递归函数来实现递归算法。

例如,在力扣题目中,可以使用递归来求解二叉树的高度、反转链表等问题。

3.动态规划动态规划是一种经典的算法思路,适用于解决一些最优化的问题。

在 Java 中,可以通过定义数组和循环来实现动态规划算法。

例如,在力扣题目中,可以使用动态规划来求解最长公共子序列、背包问题等问题。

4.深度优先搜索深度优先搜索是一种常用的搜索算法,适用于解决一些图论问题。

在 Java 中,可以通过定义递归函数和栈来实现深度优先搜索算法。

例如,在力扣题目中,可以使用深度优先搜索来求解图的连通性、染色问题等问题。

5.广度优先搜索广度优先搜索是一种常用的搜索算法,适用于解决一些图论问题。

在 Java 中,可以通过定义队列来实现广度优先搜索算法。

例如,在力扣题目中,可以使用广度优先搜索来求解图的连通性、最短路径等问题。

6.双指针双指针是一种常用的算法思路,适用于解决一些区间查询和区间更新的问题。

在 Java 中,可以通过定义两个指针来实现双指针算法。

例如,在力扣题目中,可以使用双指针来求解滑动窗口的最大值、链表中重复的元素等问题。

7.排序与查找排序与查找是计算机科学中最基本的算法思路之一。

在 Java 中,可以使用Arrays 类的 sort 方法实现排序,使用 ArrayList 类的 indexOf 方法实现查找。

例如,在力扣题目中,可以使用排序来解决三数之和问题、使用查找来解决两数之和问题。

总之,以上这些算法思路是 Java 在力扣题目中的经典应用,掌握这些算法思路可以有效地解决各种不同类型的问题。

相关主题
  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法来说明如何进行字符串说明,这个方法速度快且容易理解。

相关文档
最新文档