java學習之數據結構:一、數組

主要是對數組所有的東西進行總結,整理

適合小白~

目錄

1.什么是數組

1.1數組定義

1.2數組創建

1)靜態創建

2)動態創建

?1.3數組遍歷

1)for和while遍歷

2)foreach遍歷

2.數組越界問題及解決

2.1數組越界問題

2.2越界問題解決----數組拷貝擴容

1)防止發生:

2)發生后解決:

3)采用List list = new ArrayList<>();

3.數組算法

3.1插入算法

1)尾插法

2)指定位置插入法

2.刪除

1)刪除第一個符合條件的數據

2)刪除所有符合條件的數據

3)使用快慢指針刪除元素

3.查找算法

1)二分查找法


1.什么是數組

1.1數組定義

數組是一種用于存儲固定大小的同類型元素的集合,是一種數據結構。

        int[] arr = {1,2,3,4,5,6,7,8,9,10};char[] chars = {'a','b','c','d','e','f','g','h','i','j'};String[] strings = {"hello","world","java","python","c++"};double[] doubles = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10};

1.2數組創建

有兩種方式。[兩者相比后者靈活性更高,區別不大,針對需求選擇格式使用]

1)靜態創建

在創建數組時就明確地指定數組中的元素,數組的長度由指定的元素個數決定。

// 基本數據類型數組
int[] staticArray1 = {1, 2, 3, 4, 5};
// 對象數組
String[] staticArray2 = {"apple", "banana", "cherry"};

2)動態創建

在創建數組時只指定數組的長度,而不具體給出數組元素的初始值。后續可以再對數組元素進行賦值操作。

// 基本數據類型數組
int[] dynamicArray1 = new int[5];List<Integer> list = new ArrayList<>();

?1.3數組遍歷

java中數組有兩種常見的遍歷方式

1)for和while遍歷

2)foreach遍歷

這種方式不能修改數組值和單獨訪問下標索引。形式為for( int name?: names)表示對數組names中的每個元素都復制給name然后執行

        int[] arr = {1,2,3,4,5,6,7,8,9,10};
//        for遍歷for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}
//        while遍歷int i = 0;while (i< arr.length){System.out.println(arr[i]);}
//        foreach遍歷for (int i : arr) {System.out.println(i);}

2.數組越界問題及解決

2.1數組越界問題

數組越界:訪問的索引值超過了數組的最大長度-1[因為數組下標從0開始]。或者是添加元素超過了數組最大長度-1、刪除數組中沒有的元素

越界異常提示實例如下:

        int[] arr = {1,2,3,4,5,6,7,8,9,10};System.out.println(arr[10]);

提示為:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
?? ?at com.weimeng.test.array.main(array.java:25)

2.2越界問題解決----數組拷貝擴容

發生越界后有以下解決方法:

1)防止發生:

仔細檢查索引計算:在編寫代碼時,要確保索引的計算不會超出數組的有效范圍。

進行邊界檢查:在訪問數組元素之前,先檢查索引是否在有效范圍內。可以編寫一個if輔助方法來進行邊界檢查,避免越界訪問。

2)發生后解決:

數組擴容:就是創建新數組再拷貝原數組元素,新數組的長度更長。先創建新數組,再將原數組元素復制過來,最后替換引用。如下:

        int[] arr = {1,2,3,4,5,6,7,8,9,10};
//        數組擴容
//先創建新數組,再將原數組元素復制過來,最后替換引用int len=arr.length;double factor=1.5;//擴大因子int[] brr=new int[(int) (len*factor)];//新數組for(int i=0;i<len;i++){brr[i]=arr[i];}arr=brr;System.out.println(arr[10]);

3)采用List<Integer> list = new ArrayList<>();

這種方法可以防止添加元素越界,訪問越界和刪除越界可以再結合1)方式。

3.數組算法

3.1插入算法

數組的插入算法是指在數組的特定位置插入一個新元素的操作。由于數組的特性(元素在內存中連續存儲,長度固定),插入元素可能需要移動其他元素來騰出空間。

1)尾插法

尾插法過程:判斷數組滿沒滿,沒滿就直接放入數組最后元素的下一個位置;滿了就進行擴容再插入。整個過程通過size控制,代碼如下:

public class Array1 {int size=0;int len=10;double factor=1.5;//擴大因子int arr[]=new int[len];//        目標:實現尾插法public static void main(String[] args) {Array1 list=new Array1();list.add(1);list.add(2);list.add(3);System.out.println(list.toString());}public void add(int data){if(size==len){len=(int)(len*factor);int[] brr=new int[len];for(int i=0;i<size;i++){brr[i]=arr[i];}arr=brr;}arr[size]=data;size++;}public String toString(){String str="[";for(int i=0;i<size;i++){str+=arr[i];if(i!=size-1){str+=",";}}str+="]";return str;}
}

2)指定位置插入法

算法原理:先判斷插入位置是否合理,保證代碼合法性;再判斷數組是否滿;插入時反向循環,先將size++,然后arr[i]=size[i-1]進行循環,如下圖所示:

//    指定位置插入public void addAtIndex(int index,int data){//保證數組訪問安全if(index<0||index>size){System.out.println("超出范圍");return;}//擴容if(size==len){len=(int)(len*factor);int[] brr=new int[len];for(int i=0;i<size;i++){brr[i]=arr[i];}arr=brr;}size++;for(int i=size;i>index;i--){arr[i]=arr[i-1];}arr[index]=data;}public String toString(){String str="[";for(int i=0;i<size;i++){str+=arr[i];if(i!=size-1){str+=",";}}str+="]";return str;}

2.刪除

1)刪除第一個符合條件的數據

原理:從前向后遍歷,找刪除的數據。找不到直接輸出“不存在該元素”;找到則記錄該位置,通過循環從該位置開始,arr[i]=arr[i+1]覆蓋掉,size--,輸出“刪除完成"

 public void remove(int data) {for (int i = 0; i < size; i++) {if (arr[i] == data) {// 移動元素覆蓋要刪除的元素for (int j = i; j < size - 1; j++) {arr[j] = arr[j + 1];}// 最后一個有效位置置為默認值arr[size - 1] = 0;size--;System.out.println("刪除成功");return;}}System.out.println("不存在該元素");}

2)刪除所有符合條件的數據

即通過循環遍歷元素,遇到arr[i]==data就進行刪除,如下:

    public void delete(int data) {for(int i=0;i<size;i++){if(arr[i]==data){for(int j=i+1;j<size;j++){arr[j-1]=arr[j];}size--;i--;}}}

3)使用快慢指針刪除元素

  • 慢指針(slow:用于記錄刪除特定元素后數組的有效長度,它指向的位置是下一個非data元素應該存放的位置。
  • 快指針(fast:用于遍歷數組中的每一個元素。

具體步驟:

1.初始化兩個指針:slow?和?fast,都指向arr的起始位置(索引為 0)。

2.使用?fast?指針遍歷數組:如果?fast?指針指向的元素不等于data,則將該元素賦值給?slow?指針指向的位置,然后?slow?指針向后移動一位。如果?fast?指針指向的元素等于data,則跳過該元素,slow?指針保持不動。

重復步驟 2,直到?fast?指針遍歷完整個數組。最終?slow?指針的值就是刪除特定元素后數組的新長度。

代碼:

//    使用快慢指針刪除元素public void delete2(int data){int slow=0;int fast=0;while(fast<size){if(arr[fast]!=data){arr[slow]=arr[fast];slow++;}fast++;}size=slow;}

3.查找算法

1)二分查找法

二分查找適合有序數組,它的核心思想是不斷將查找區間縮小一半,以此減少查找范圍,從而快速定位目標元素。

算法內容:

1.先設置左右邊界,左邊界?left?初始化為數組的第一個元素的索引(通常為 0),右邊界?right?初始化為數組最后一個元素的索引(即數組長度減 1)。

2.再計算當前查找區間的中間元素的索引?mid,計算公式為?mid = left + (right - left) / 2

3.比較中間元素跟目標元素:若中間元素等于目標元素,表明找到了目標元素,返回中間元素的索引。若中間元素大于目標元素,說明目標元素在左半部分區間,更新右邊界?right = mid - 1。若中間元素小于目標元素,說明目標元素在右半部分區間,更新左邊界?left = mid + 1

4.重復2、3步,持續縮小查找區間,直到左邊界大于右邊界,此時表示目標元素不存在于數組中,返回 -1。

代碼:

public int binarySearch(int target) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = (right + left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return-1;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78357.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Survey]SAM2 for Image and Video Segmentation: A Comprehensive Survey

BaseInfo TitleSAM2 for Image and Video Segmentation: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2503.12781Journal/Time2503Author四川大學&#xff0c;北京大學 1. Introduction 圖像分割專注于識別單個圖像中的目標、邊界或紋理&#xff0c;而視頻分割則將這…

用Maven定位和解決依賴沖突

用Maven定位和解決依賴沖突 一、依賴沖突的常見表現二、定位沖突依賴的4種方法2.1 使用Maven命令分析依賴樹2.2 使用IDE可視化工具2.3 使用Maven Enforcer插件2.4 運行時分析 三、解決依賴沖突的5種方案3.1 排除特定傳遞依賴3.2 統一指定版本&#xff08;推薦&#xff09;3.3 使…

穿越數據森林與網絡迷宮:樹與圖上動態規劃實戰指南

在 C 算法的浩瀚宇宙中&#xff0c;樹與圖就像是神秘的迷宮和茂密的森林&#xff0c;充滿了未知與挑戰。而動態規劃則是我們探索其中的神奇羅盤&#xff0c;幫助我們找到最優路徑。今天&#xff0c;就讓我們一起深入這片神秘領域&#xff0c;揭開樹與圖上動態規劃的神秘面紗&am…

UDP / TCP 協議

目錄 一、前言&#xff1a; 數據封裝與分用&#xff1a; 二、網絡協議分層模型&#xff1a; 三、UDP / TCP 協議 UDP 協議&#xff1a; 1、UDP 協議段格式&#xff1a; 2、UDP 的特點&#xff1a; TCP 協議&#xff1a; 1、TCP 協議段格式&#xff1a; 2、TCP 協議的十…

Python 實現的運籌優化系統數學建模詳解(動態規劃模型)

相關代碼鏈接&#xff1a;https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在計算機科學與數學建模的廣闊領域中&#xff0c;算法如同精密的齒輪&#xff0c;推動著問題的解決與系統的運行。當面對復雜的優化問題時&…

langfuse本地安裝

目錄 安裝命令項目準備用openai測試 安裝命令 本地&#xff08;docker compose&#xff09;&#xff1a;使用 Docker Compose 在你的機器上于 5 分鐘內運行 Langfuse。 # 獲取最新的 Langfuse 倉庫副本 git clone https://github.com/langfuse/langfuse.git cd langfuse# 運行 …

每天學一個 Linux 命令(35):dos2unix

每天學一個 Linux 命令(35):dos2unix 命令簡介 dos2unix 是一個用于將 Windows/DOS 格式的文本文件轉換為 Unix/Linux 格式的實用工具。它主要處理行尾符的轉換(將 CRLF 轉換為 LF),同時也能處理編碼問題和字符集轉換。這個命令在跨平臺文件共享、代碼遷移和系統管理場…

第6章 Python 基本數據類型詳解(int, float, bool, str)細節補充

文章目錄 Python 基本數據類型深入解析(int, float, bool, str)一、整型(int)的底層機制二、浮點型(float)的陷阱與解決方案三、布爾型(bool)的底層本質四、字符串(str)的不可變性與優化五、類型間的隱式轉換與陷阱六、性能優化與工具總結:關鍵細節與最佳實踐Python…

19. LangChain安全與倫理:如何避免模型“幻覺“與數據泄露?

引言&#xff1a;當AI成為企業"數字員工"時的責任邊界 2025年某金融機構因AI客服泄露用戶信用卡信息被罰款2300萬美元。本文將基于LangChain的安全架構與Deepseek-R1的合規實踐&#xff0c;揭示如何構建既強大又安全的AI系統。 一、AI安全風險矩陣 1.1 2025年最新威…

Java快速上手之實驗六

1. 編寫ItemEventDemo.java&#xff0c;當選中或取消選中單選鈕、復選鈕和列表框時顯示所選的結果。 2&#xff0e;編寫GUIExample.java&#xff0c;當選中或取消選中單選鈕、復選鈕時在標簽中顯示相應結果。 import javax.swing.*; import java.awt.*; import java.awt.event.…

QT6 源(72):閱讀與注釋單選框這個類型的按鈕 QRadioButton,及各種屬性驗證,

&#xff08;1&#xff09;按鈕間的互斥&#xff1a; &#xff08;2&#xff09;源碼來自于頭文件 qradiobutton . h &#xff1a; #ifndef QRADIOBUTTON_H #define QRADIOBUTTON_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qabstractbutton.h>…

【算法滑動窗口】 將x減到0的最小操作數

將x減到0的最小操作數 個人總結的八步歸納AI的歸納**8步歸納法&#xff08;極簡直白版&#xff09;**1. 問題本質2. 問題特征3. 切入點4. 解決流程5. 每步目標與操作6. 注意事項7. 最終目標8. 整體總結 代碼對照&#xff08;逐行解析&#xff09;舉個栗子&#x1f330;**一句話…

RISC-V GPU架構研究進展:在深度學習推理場景的可行性驗證

一、新型算力架構的突圍戰 在英偉達CUDA生態主導的GPU市場中&#xff0c;RISC-V架構正以?開源基因?和?模塊化設計?開辟新賽道。當前主流GPU架構面臨兩大痛點&#xff1a; 指令集封閉性?&#xff1a;NVIDIA的SASS指令集與AMD的GCN/RDNA架構均采用私有指令編碼&#xff0c…

LVGL -滑動條

1 滑動條 LVGL 的滑動條(Slider)是一個非常有用的控件,允許用戶通過拖動滑塊或點擊滑條來選擇一個值。 1.1 基本定義 滑動條允許用戶在一個預定義的數值范圍內選擇一個特定的值。它通常由一個軌道(track)和一個滑塊(thumb)組成。用戶可以通過點擊或拖動滑塊來調整數值。…

ROS2學習筆記|Python實現訂閱消息并朗讀的詳細步驟

本教程將詳細介紹如何使用 ROS 2 實現一個節點訂閱另一個節點發布的消息&#xff0c;并將接收到的消息通過 espeakng 庫進行朗讀的完整流程。以下步驟假設你已經安裝好了 ROS 2 環境&#xff08;以 ROS 2 Humble 為例&#xff09;&#xff0c;并熟悉基本的 Linux 操作。 注意&…

WPF封裝常用的TCP、串口、Modbus、MQTT、Webapi、PLC通訊工具類

WPF封裝常用通訊工具類 下面我將為您封裝常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通訊工具類,適用于WPF應用程序開發。 一、TCP通訊工具類 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …

npm pnpm yarn 設置國內鏡像

國內鏡像 常用的國內鏡像&#xff1a; 淘寶鏡像 https://registry.npmmirror.com 騰訊云鏡像?? https://mirrors.cloud.tencent.com/npm/ 華為云鏡像?? https://repo.huaweicloud.com/repository/npm/ CNPM&#xff08;阿里系&#xff09; ?? https://r.cnpmjs.org/ 清華…

P4552 [Poetize6] IncDec Sequence 題解

P4552 [Poetize6] IncDec Sequence - 洛谷 差分貪心 根據題目&#xff1a;一段區間都加1或減1 &#xff0c; 可以想到差分 構建差分數組&#xff1a;sub 我們要讓除了sub[1] , 其他全是0 我們可以的操作是&#xff1a;l1 , r-1 or l-1 , r1 or 一個數1 / -1 所…

Power Query精通指南2:數據轉換——透視/逆透視/分組、橫向縱向合并數據、條件判斷、處理日期時間

文章目錄 七、常見數據轉換7.1 逆透視7.1.1 逆透視操作7.1.2 重建透視表&#xff0c;更新數據7.1.3 三種逆透視方式&#xff08;逆透視列等價于逆透視其他列&#xff09; 7.2 透視7.3 拆分列7.3.1 將列拆分為多列7.3.2 將列拆分為多行7.3.3 拆分到列后逆透視&#xff08;保留列…

使用線性表實現通訊錄管理

目錄 &#x1f680;前言&#x1f99c;任務目標&#x1f31f;順序表實現&#x1f40d;鏈表實現 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介紹線性表的實驗&#xff0c;使用順序表和鏈表實現通訊錄管理&#xff0c;包含初始化、插入、刪除、查詢、輸出。 &a…