java-数据结构

一.链表

单向链表 

/单向链表
public class SinglyLinkedList implements Iterable<Integer> {//头节点private Node head =null;//头指针//节点类private static   class  Node{int value;//值Node next;//下一个节点的指针public Node(int value, Node next) {this.value = value;this.next = next;}}
}

  addFirst方法

 public  void  addFirst(int value){//1.链表为空//  head =new Node(value,null);//2.链表非空head =new Node(value,head

遍历链表 

一 

public  void  loop1(Consumer<Integer> consumer){Node p =head;while (p!=null){consumer.accept(p.value);p=p.next;}}

二 

  public  void  loop2(Consumer<Integer> consumer){for (Node p =head;p!=null;p=p.next){consumer.accept(p.value);}}

 三 

@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {SinglyLinkedList.Node p = head;@Overridepublic boolean hasNext() {//是否有下一个元素return p != null;}@Overridepublic Integer next() {//返回当前值,并指向下一个元素int v = p.value;p = p.next;return v;}};}

 Test类e

 SinglyLinkedList LinkedList = new SinglyLinkedList();LinkedList.addFirst(1);LinkedList.addFirst(2);LinkedList.addFirst(3);LinkedList.addFirst(4);LinkedList.addFirst(5);LinkedList.loop1(value->{System.out.println(value);});System.out.println("------------------------");LinkedList.loop2(value->{System.out.println(value);});//使用迭代器去遍历链表for (Integer value : LinkedList) {System.out.println(value);}}

二分查找 

1.基础版 

 public  static String binarysearch(int []arr, int data){//1.定义两个变量,一个站左边,一个站右边int left=0;int right=arr.length-1;while (left<=right){int middle=(left+right)/2;if (data<arr[middle]){right=middle-1;}else if(data>arr[middle]){left=middle+1;}else {return  String.valueOf(middle);}}return "该数组没有该数字";}

1.关于为什么在中间值不使用middle=(left+right)/2;

因为Java中使用 在Java中,进行二分查找时,直接使用 middle = (left + right) / 2 可能会遇到整数溢出的问题。这是因为当 left 和 right 都非常大且接近 Integer.MAX_VALUE 时,它们的和可能会超过 int 类型的最大值,从而导致溢出。

 改进版

int middle = left + (right - left) / 2;

无符号右移一位相当于除以2向下取整 

那么 

int middle = left +right >>> 1; 

2.关于为什么使用left<=right去作为判断跳出循环的条件而不是去用left<right去作为判断的条件 

 如果使用 left < right 作为条件,那么在最后一次迭代中,当 left 和 right 相邻时(即 left = right - 1),循环就会提前终止,从而可能错过目标元素(如果它正好位于 left 或 right 指向的位置)。

 left ==right 意味着它们指向的元素也会参与比较,left < right  只意味着middle指向的元素参与比较

2.改进版二分查找

public  static String binarysearch(int [] arr,int target){int left =0, right =arr.length;while (left<right){int  middle =left+right >>> 1;if(target<arr[middle]){right=middle;}else if(arr[middle]<target){left =middle +1;}else {return  String.valueOf(middle);}}return "没有找到该数字" ;}

1)令right为arr.length是确定right为数组边界外一值并不是数组中的值不希望right参与比较,在其中left是参加比较的值而right是不参与比较的值

使得在target在小于arr[middle]时令right=middle 

2)关于循环跳出条件为left<right的原因

当查找的数没有在数组中时会进行死循环报错

3.平衡版

问题切入点:

l为总循环次数,当元素在最右边与最左边时的循环次数不一致。在最右边要进行2*l次比较

 

时间复杂度都为log(n)。 

 

  public  static String binarysearch(int [] arr,int target) {int left =0, right=arr.length;while (1<right-left){int middle =(left+right)>>>1;if(target<arr[middle]){right=middle;}else {left=middle;}}if(arr[left]==target){return  String.valueOf(left);}else {return  "没有该数字";}}

4.java版二分查找

 

private static int binarySearch0(long[] a, int fromIndex, int toIndex,long key) {int low = fromIndex;int high = toIndex - 1;while (low <= high) {int mid = (low + high) >>> 1;long midVal = a[mid];if (midVal < key)low = mid + 1;else if (midVal > key)high = mid - 1;elsereturn mid; // key found}return -(low + 1);  // key not found.}

关于使用Java自身提供的区别在于返回值当查询不到数据时返回的是-(插入值+1) 

return -(low + 1);  // key not found. 

eg  当我的数组为{1,23,45,77,123}时我查找12时就会返回-2(因为12拍数组第二所以-(1+1)=-2)

 int arr2[]={12,14,123,434,56};System.out.println(Arrays.binarySearch(arr2, 13));

返回-2 

5.leftmost与rightmost

实现查找重复数字中最左边序号  

 

  public static int binarySearchLeftMost(int arr[], int target) {int left = 0, right = arr.length - 1;int candidate = -1;while (left <= right) {int middle = (left + right) >>> 1;if (target < arr[middle]) {right = middle - 1;} else if (arr[middle] < target) {left = middle + 1;} else {//记录候选者位置candidate = middle;right = middle - 1; // 继续向左搜索}}return candidate;}

实现查找重复数字中最右边序号  

区别:在边界处不同

// 继续向右搜索,直到找到最右边的位置  
            left = middle + 1;   

 

public static int binarySearchRightMost(int arr[], int target) {  int left = 0, right = arr.length - 1;  int candidate = -1;  while (left <= right) {  int middle = (left + right) >>> 1;  if (target < arr[middle]) {  right = middle - 1;  } else if (arr[middle] < target) {  left = middle + 1;  } else {  candidate = middle;  // 继续向右搜索,直到找到最右边的位置  left = middle + 1;  }  }  

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460277.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm与anaconda下的pyside6的安装记录

一、打开anaconda虚拟环境的命令行窗口&#xff0c;pip install&#xff0c;加入清华源&#xff1a; pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 二、打开pycharm&#xff0c;在文件--设置--工具--外部工具中配置一下三项&#xff1a; 1、 QtDesigner…

成本累计曲线:项目预算的秘密武器

在项目管理的过程中&#xff0c;成本控制是影响项目成败的关键因素之一&#xff0c;而其中“成本累计曲线”就像是一位财务导航员&#xff0c;为项目的成本控制和进度监控提供了极大的帮助。那么&#xff0c;什么是成本累计曲线&#xff1f;它包含哪些步骤&#xff1f;如何应用…

[0152].第3节:IDEA中工程与模块

我的后端学习大纲 IDEA大纲 1、Project和Module的概念&#xff1a; 2、Module操作&#xff1a; 2.1.创建Module: 2.2.删除Module&#xff1a; 2.3.导入Module&#xff1a; 1.导入外来模块的代码&#xff1a; 查看Project Structure&#xff0c;选择import module&#xff1a…

【Linux网络】UdpSocket

目录 套接字 socket编程 源IP地址和目的IP地址 端口号 网络字节序 socket常用API socket结构 UDP UDP协议&#xff08;用户数据报协议&#xff09; 创建套接字 绑定 通信 udp_echo_server:简单的回显服务器和客户端代码 dict_server:简单的英译汉的网络字典 chat_…

双11猫咪好物盛典开启,线上抢购不停 购物清单新鲜出炉

双十一购物狂欢节终于到了&#xff01;铲屎官们想好要给猫咪添置什么好东西了吗&#xff1f;还不知道怎么选的看过来啦~这里整理了一份双十一购物清单&#xff0c;快看看有没有你需要的吧&#xff01; 双十一养猫必购1&#xff1a;CEWEY自动猫砂盆 CEWEY自动猫砂盆真的是我最爱…

magic-api简单使用二:自定义返回结果

背景 在上一章 中我们学习了搭建项目和导入文件&#xff0c; 这二天稍微有点时间&#xff0c;研究下这个magic-api的写法。 后续如果需要维护或者更改&#xff0c;也能在项目中尽快上手。 今天我们主要学习自定义返回结果&#xff0c;当然也可以使用官方的。不需要任何更改。…

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条&#xff0c;清洗后&#xff0c;90条正确数据在DWD层清洗表&#xff0c;10条错误数据在DWD层清洗数据错误表&#xff0c;所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是&#xff0c;Hive中原本的SQL语句&#xff0c;放在ClickHouse…

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案

【Nas】X-Doc&#xff1a;jellyfin“该客户端与媒体不兼容&#xff0c;服务器未发送兼容的媒体格式”问题解决方案 当使用Jellyfin播放视频时出现“该客户端与媒体不兼容&#xff0c;服务器未发送兼容的媒体格式”&#xff0c;这是与硬件解码和ffmpeg设置有关系&#xff0c;具体…

linux应急响应-1

声明&#xff1a;部分内容来源于网络&#xff0c;只是新手练习 靶场环境来自于知攻善防实验室 概述&#xff1a; 一、整体过程 初始环境设置 将Linux centOS 7配置为图形化界面&#xff0c;通过yum groupinstall “X Window System” -y和yum groupinstall “GNOME Desktop”&a…

视频去水印软件推荐:6款去水印工具值得一试

在视频创作和分享的过程中&#xff0c;水印往往会成为影响美观和平台推流。幸运的是&#xff0c;市面上有许多视频去水印软件能够帮助我们轻松解决这一问题。本文将为大家推荐几款实用的视频去水印软件&#xff0c;并详细介绍它们的功能和去除水印的方法。 1.影忆 功能介绍&…

MaxKB: 一款基于大语言模型的知识库问答系统

嗨, 大家好, 我是徐小夕. 之前一直在社区分享零代码&低代码的技术实践&#xff0c;最近也在研究多模态文档引擎相关的产品, 在社区发现一款非常有意思的知识库问答系统——MaxKB, 它支持通过大语言模型和RAG技术来为知识库赋能,今天就和大家分享一下这款项目. PS: 它提供了…

Java NIO2 异步IO支持

NIO2 从 Java 7 在之前的NIO基础上&#xff0c;它提供了异步 IO 操作、文件系统访问增强等诸多功能 路径&#xff08;Path&#xff09;接口 Path 接口代表了文件系统的路径。它可以用来定位一个文件或目录。 提供了多种方法来解析、转换和查询路径信息。Paths 类提供了一些静…

上市公司数字经济与实体经济融合发展程度测算数据(2008-2022年)-最新出炉_附下载链接

上市公司数字经济与实体经济融合发展程度测算数据&#xff08;2008-2022年&#xff09; 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;上市公司数字经济与实体经济融合发展程度测算数据&#xff08;2008-2022年&#xff09;-最新出炉.zip 一、引言 随着…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

Nginx防盗链配置

1. 什么是盗链? 盗链是指服务提供商自己不提供服务的内容&#xff0c;通过技术手段绕过其它有利益的最终用户界面&#xff08;如广告&#xff09;&#xff0c;直接在自己的网站上向最终用户提供其它服务提供商的服务内容&#xff0c;骗取最终用户的浏览和点击率。受益者不提供…

ppt设计软件哪个好?这5个在线ppt工具不容错过!

职场人每天的办公日常&#xff0c;大概率都离不开PPT&#xff0c;不管是制作季度汇报&#xff0c;还是向团队展示各类方案&#xff0c;诸如此类的场景都会用到ppt。 ppt是一个看重视觉效果的演示媒介&#xff0c;可以说它的外观精美与否&#xff0c;很大程度上决定了观众或潜在…

LC20. 有效的括号

用来熟悉一下栈的应用之括号匹配 题目链接 下面是大致思路 1.初始化:创建一个空栈,用于存储左括号。&#xff08;LC这题不用&#xff0c;自己写完整的需要&#xff09; 2.遍历字符串:从左到右依次扫描字符串中的每个字符。 3.处理左括号:如果是左括号,将其压入栈中。 4.处理右…

8. 性能指标

博客补充&#xff1a;CUDA C 最佳实践指南-CSDN博客https://blog.csdn.net/qq_62704693/article/details/141267262?spm1001.2014.3001.5502 在尝试优化 CUDA 代码时&#xff0c;了解如何准确测量性能并了解带宽在性能测量中的作用是值得的。本章讨论如何使用 CPU 计时器和 C…

【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!

【Stable Diffusion - Ai】小白入门必看&#xff08;涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇&#xff09;&#xff01;真材实料&#xff01;不卖课&#xff01;&#xff01;&#xff01; 在上一篇 小白入门必看&#xff08;图生图篇&#xff09;中我们详细的介绍了文生图和图生…

Linux字体更新 使用中文字体

问题描述&#xff0c;处理之前&#xff0c;中文乱码 处理后的结果 压缩需要上传的字体&#xff1a; 上传到LInux的字体目录&#xff0c;上传后解压出来 刷新字体&#xff1a; fc-cache -fv 测试是否正常 fc-list | grep "FontName"如果还不行 可以在代码里面指定字…