当前位置: 首页 > news >正文

【JavaSE】Java基础语法(二十三):递归与数组的高级操作

文章目录

  • 1. 递归
    • 1.1 递归
    • 1.2 递归求阶乘
  • 2. 数组的高级操作
    • 2.1 二分查找
    • 2.2 冒泡排序
    • 2.3 快速排序
    • 2.4 Arrays (应用)



在这里插入图片描述


1. 递归

1.1 递归

  • 递归的介绍
    • 以编程的角度来看,递归指的是方法定义中调用方法本身的现象
    • 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
    • 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
  • 递归的基本使用
public class MyFactorialDemo2 {public static void main(String[] args) {int sum = getSum(100);System.out.println(sum);}private static int getSum(int i) {//1- 100之间的和//100 + (1-99之间的和)// 99 + (1- 98之间的和)//....//1//方法的作用: 求 1- i 之间和if(i == 1){return 1;}else{return i + getSum(i -1);}}
}
  • 递归的注意事项
    • 递归一定要有出口。否则内存溢出
    • 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出

1.2 递归求阶乘

  • 案例需求
    • 用递归求5的阶乘,并把结果在控制台输出
  • 代码实现
public class DiGuiDemo01 {public static void main(String[] args) {//调用方法int result = jc(5);//输出结果System.out.println("5的阶乘是:" + result);}//定义一个方法,用于递归求阶乘,参数为一个int类型的变量public static int jc(int n) {//在方法内部判断该变量的值是否是1if(n == 1) {//是:返回1return 1;} else {//不是:返回n*(n-1)!return n*jc(n-1);}}
}

2. 数组的高级操作

2.1 二分查找

  • 二分查找概述
    查找指定元素在数组中的位置时,以前的方式是通过遍历,逐个获取每个元素,看是否是要查找的元素,
    这种方式当数组元素较多时,查找的效率很低
    二分查找也叫折半查找,每次可以去掉一半的查找范围,从而提高查找的效率

  • 需求
    在数组{1,2,3,4,5,6,7,8,9,10}中,查找某个元素的位置


  • 实现步骤
  1. 定义两个变量,表示要查找的范围。默认min = 0 ,max = 最大索引
  2. 循环查找,但是min <= max
  3. 计算出mid的值
  4. 判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
  5. 如果要查找的值在mid的左半边,那么min值不变,max = mid -1.继续下次循环查找
  6. 如果要查找的值在mid的右半边,那么max值不变,min = mid + 1.继续下次循环查找
  7. 当min > max 时,表示要查找的元素在数组中不存在,返回-1.
  • 代码实现
public class MyBinarySearchDemo {public static void main(String[] args) {int [] arr = {1,2,3,4,5,6,7,8,9,10};int number = 11;//1,我现在要干嘛? --- 二分查找//2.我干这件事情需要什么? --- 数组 元素//3,我干完了,要不要把结果返回调用者 --- 把索引返回给调用者int index = binarySearchForIndex(arr,number);System.out.println(index);}private static int binarySearchForIndex(int[] arr, int number) {//1,定义查找的范围int min = 0;int max = arr.length - 1;//2.循环查找 min <= maxwhile(min <= max){//3.计算出中间位置 midint mid = (min + max) >> 1;//mid指向的元素 > numberif(arr[mid] > number){//表示要查找的元素在左边.max = mid -1;}else if(arr[mid] < number){//mid指向的元素 < number//表示要查找的元素在右边.min = mid + 1;}else{//mid指向的元素 == numberreturn mid;}}//如果min大于了max就表示元素不存在,返回-1.return -1;}
}

注意事项
有一个前提条件,数组内的元素一定要按照大小顺序排列,如果没有大小顺序,是不能使用二分查
找法的


2.2 冒泡排序

  • 冒泡排序概述
    一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
    如果有n个数据进行排序,总共需要比较n-1次 每一次比较完毕,下一次的比较就会少一个数据参与

  • 代码实现

public class MyBubbleSortDemo2 {public static void main(String[] args) {int[] arr = {3, 5, 2, 1, 4};//1 2 3 4 5bubbleSort(arr);}private static void bubbleSort(int[] arr) {//外层循环控制的是次数 比数组的长度少一次.for (int i = 0; i < arr.length -1; i++) {//内存循环就是实际循环比较的//-1 是为了让数组不要越界//-i 每一轮结束之后,我们就会少比一个数字.for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}printArr(arr);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}
}

2.3 快速排序

  • 快速排序概述
    冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置 快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的.再找到所有比基准数大的.小的全部放左边,大的全部放右边,确定基准数的正确位置

  • 核心步骤
  1. 从右开始找比基准数小的
  2. 从左开始找比基准数大的
  3. 交换两个值的位置
  4. 红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
  5. 基准数归位
  • 代码实现
public class MyQuiteSortDemo2 {public static void main(String[] args) {// 1,从右开始找比基准数小的// 2,从左开始找比基准数大的// 3,交换两个值的位置// 4,红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止// 5,基准数归位int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};quiteSort(arr,0,arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}private static void quiteSort(int[] arr, int left, int right) {// 递归结束的条件if(right < left){return;}int left0 = left;int right0 = right;//计算出基准数int baseNumber = arr[left0];while(left != right){// 1,从右开始找比基准数小的while(arr[right] >= baseNumber && right > left){right--;}// 2,从左开始找比基准数大的while(arr[left] <= baseNumber && right > left){left++;}// 3,交换两个值的位置int temp = arr[left];arr[left] = arr[right];arr[right] = temp;}//基准数归位int temp = arr[left];arr[left] = arr[left0];arr[left0] = temp;// 递归调用自己,将左半部分排好序quiteSort(arr,left0,left-1);// 递归调用自己,将右半部分排好序quiteSort(arr,left +1,right0);}
}

2.4 Arrays (应用)

  • Arrays的常用方法
    在这里插入图片描述

  • 示例代码

public class MyArraysDemo {public static void main(String[] args) {// public static String toString(int[] a) 返回指定数组的内容的字符串表示形式// int [] arr = {3,2,4,6,7};// System.out.println(Arrays.toString(arr));// public static void sort(int[] a) 按照数字顺序排列指定的数组// int [] arr = {3,2,4,6,7};// Arrays.sort(arr);// System.out.println(Arrays.toString(arr));// public static int binarySearch(int[] a, int key) 利用二分查找返回指定元素的索引int [] arr = {1,2,3,4,5,6,7,8,9,10};int index = Arrays.binarySearch(arr, 0);System.out.println(index);//1,数组必须有序//2.如果要查找的元素存在,那么返回的是这个元素实际的索引//3.如果要查找的元素不存在,那么返回的是 (-插入点-1)//插入点:如果这个元素在数组中,他应该在哪个索引上.}
}
  • 工具类设计思想
  1. 构造方法用 private 修饰
  2. 成员用 public static 修饰

在这里插入图片描述

相关文章:

【JavaSE】Java基础语法(二十三):递归与数组的高级操作

文章目录 1. 递归1.1 递归1.2 递归求阶乘 2. 数组的高级操作2.1 二分查找2.2 冒泡排序2.3 快速排序2.4 Arrays (应用) 1. 递归 1.1 递归 递归的介绍 以编程的角度来看&#xff0c;递归指的是方法定义中调用方法本身的现象把一个复杂的问题层层转化为一个与原问题相似的规模较…...

HUSTOJ使用指南

如何快速上手&#xff08;了解系统的功能&#xff09;&#xff1f; admin管理员用户登录&#xff0c;点击右上角管理&#xff0c;仔细阅读管理首页的说明。 切记&#xff1a;题目导入后一次只能删一题&#xff0c;不要导入过多你暂时用不上的题目&#xff0c;正确的方式是每次…...

java基础学习

一、注释 1&#xff09;当行注释 // 2&#xff09;多行注释 /* ... */ 3&#xff09;文档注释 &#xff08;java特有&#xff09; /** author 张三 version v1.0 这是文档注释&#xff0c;需要将class用public修饰 */ 二、关键字 &#xff08;1&#xff09;48个关键…...

Linux——进程优先级

1.什么是优先级&#xff1f; 优先级和权限息息相关。权限的含义为能还是不能做这件事。而优先级则表示&#xff1a;你有权限去做&#xff0c;只不过是先去做还是后去做这件事罢了。 2.为什么会存在优先级&#xff1f; 优先级表明了狼多肉少的理念&#xff0c;举个例子&#xff…...

音频设备初始化与输出:QT与SDL策略模式的实现

音频设备初始化与输出&#xff1a;QT与SDL策略模式的实现 一、引言&#xff08;Introduction&#xff09;1.1 音频设备初始化与输出的重要性1.2 QT与SDL的音频设备处理1.3 策略模式在音频设备处理中的应用 二、深入理解音频设备初始化与输出2.1 音频设备的基本概念2.2 音频设备…...

Linux 手动部署 SpringBoot 项目

Linux 手动部署 SpringBoot 项目 1. 将项目打包成 jar 包 &#xff08;1&#xff09;引入插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></pl…...

华为OD机试真题B卷 Java 实现【内存资源分配】

一、题目描述 有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源,返回申请结果成功失败列表。 分配规则如下: 分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度…...

深入理解ChatGPT插件:competitorppcads、seoanalysis和kraftful

1. 引言 插件&#xff0c;作为一种扩展功能的工具&#xff0c;为我们的应用程序提供了无限的可能性。在ChatGPT中&#xff0c;我们有许多强大的插件&#xff0c;如competitorppcads、seoanalysis和kraftful。这篇博客将详细介绍这三个插件的功能和使用方法。 2. competitorpp…...

通过源码编译安装LAMP平台的搭建

目录 1. 编译安装Apache httpd服务2 编写mysqld服务3 编译安装PHP 解析环境安装论坛 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。 LAMP是一个缩写词&#xff0c;具体包…...

mac os 安装rz/sz

说明&#xff1a;使用rz sz实现终端的文件传输&#xff0c;该命令主要使用场景为 macos中通过堡垒机登陆后无法使用ftp工具传输文件。 工具&#xff1a;iTerm2、lrzsz、homebrew 以及两个脚本文件&#xff08;iterm2-recv-zmodem.sh、iterm2-send-zmodem.sh&#xff09; …...

Redis源码(1) 建立监听服务和开启事件循环

Redis 是cs架构(服务端-客户端)&#xff0c;典型的一对多的服务器应用程序。多个客户通过网络与Redis服务器进行通信。那么在linux环境中是使用epoll(我们也 只讨论linux环境的&#xff0c;便于学习)。   通过使用I/O多路复用技术&#xff0c; redis 服务器使用单线程单进程的…...

c++基础概念,const与指针、引用的关系,auto,decltype关键字能干啥总得了解吧。总得按照需求自定义创建实体类,自己编写头文件吧

const限定符 有时我们希望定义这样一种变量&#xff0c;它的值不能被改变。例如&#xff0c;用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时&#xff0c;很容易对其进行调整。另一方面&#xff0c;也应随时警惕防止程序一不小心改变了这个值。…...

【数据结构】---几分钟简单几步学会手撕链式二叉树(下)

文章目录 前言&#x1f31f;一、二叉树链式结构的实现&#x1f30f;1.1 二叉树叶子节点个数&#x1f4ab;代码&#xff1a;&#x1f4ab;流程图&#xff1a; &#x1f30f;1.2 二叉树的高度&#x1f4ab;第一种写法(不支持)&#xff1a;&#x1f4d2;代码&#xff1a;&#x1f…...

用户验证FTP实验

用户FTP实验 目录 匿名用户验证&#xff1a; 本地用户验证&#xff1a; 本地用户访问控制&#xff1a; 匿名用户验证&#xff1a; 例&#xff1a;&#xff08;前提配置&#xff0c;防火墙关闭&#xff0c;yum安装&#xff0c;同模式vmware11&#xff09; 现有一台计算机huy…...

App 软件开发《单选4》试卷答案及解析

App 软件开发《单选4》试卷答案及解析 注&#xff1a;本文章所有答案的解析来自 ChatGPT 的回答&#xff08;给出正确答案让其解释原因&#xff09;&#xff0c;正确性请自行甄辨。 文章目录 App 软件开发《单选4》试卷答案及解析单选题&#xff08;共计0分&#xff09;1&#…...

代码随想录算法训练营第三十七天 | 力扣 738.单调递增的数字, 968.监控二叉树

738.单调递增的数字 题目 738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 解析 从后向前遍历&#xf…...

C++内存总结

1.2 C内存 参考 https://www.nowcoder.com/issue/tutorial?tutorialId93&uuid8f38bec08f974de192275e5366d8ae24 1.2.1 简述一下堆和栈的区别 参考回答 区别&#xff1a; 堆栈空间分配不同。栈由操作系统自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变…...

开发移动端官网总结_Vue2.x

目录 1、自定义加载中效果 2、HTML页面注入环境变量 / 加载CDN和本地库 3、在 Vue 中使用 wow.js 4、过渡路由 5、全局监听当前设备&#xff0c;切换PC端和移动端 6、移动端常用初始化样式 7、官网默认入口文件 8、回到顶部滑动过渡效果&#xff08;显示与隐藏、滑动置…...

Zookeeper+消息队列Kafka

一、Zookeeper 概述 官方下载地址&#xff1a;Index of /dist/zookeeper 1.1 Zookeeper 定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 1.2 Zookeeper 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设…...

【滤波】设计卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第8章节08-Designing-Kalman-Filters&#xff08;设计卡尔曼滤波器&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 在上一章节中&#xff0c;我们讨论了教…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...