尚硅谷Java第 4、5 章IDEA,數組

第 4 章:IDEA的使用

第 5 章:數組

5.1 數組的概述

數組(Array):就可以理解為多個數據的組合。

程序中的容器:數組、集合框架(List、Set、Map)。

數組中的概念:

  • 數組名

  • 下標(或索引)

  • 元素

  • 數組的長度

數組存儲的數據的特點:

  • 依次緊密排列的、有序的、可以重復的。

  • 數組的其它特點:

    • 一旦初始化,其長度就是確定的、不可更改的。

    • 數組的下標是從0開始的

5.2 一維數組

5.2.1 數組的聲明和初始化

代碼示例:

?int[] arr1 = new int[10];String[] arr2 = new String[]{"Tom","Jerry"};

5.2.2 數組的使用

  • 調用數組的指定元素:使用角標、索引、index。

  • index 從 0 開始。

  • 數組的屬性:length,表示數組的長度。

  • 數組的遍歷。

  • 數組元素的默認初始化值。

5.2.3 一維數組內存分析

  • 虛擬機棧:main() 作為一個棧幀,壓入棧空間中。在 main() 棧幀中,存儲著 arr 變量。arr 記錄著數組實體的首地址值。

  • 堆:數組實體存儲在堆空間中。

  • Java 虛擬機的內存劃分:

5.3 二維數組

二維數組本質上是元素類型是一維數組的一維數組。

5.4 數組的常用算法

  • 數值型數組的特征值的計算:最大值、最小值、總和、平均值等。

  • 數組元素的賦值。

  • 數組的復制、賦值。

  • 數組的反轉。

  • 數組的擴容、縮容。

  • 數組的查找:

    • 線性查找。

    • 二分法查找(前提:數組有序)。

  • 數組的排序:

    • 冒泡排序(最簡單)。

    • 快速排序(最常用)。

5.5 Arrays 工具類的使用

  • java.util.Arrays 類即為操作數組的工具類,包含了用來操作數組(比如排序和搜索)的各種方法。

  • toString() 、 sort()、 binarySearch()。

5.6 數組中的常見異常

  • 下標越界異常:ArrayIndexOutOfBoundsException

  • 空指針異常:NullPointerException

5.7、企業真題

  1. 數組有沒有 length()這個方法? String 有沒有 length()這個方法? 答: 數組沒有 length(),有 length 屬性。 String 有 length()。

  2. 有數組 int[] arr,用 Java 代碼將數組元素順序顛倒? 答: 可以使用兩個指針,一個指向數組的第一個元素,另一個指向數組的最后一個元素,交換它們的值,然后繼續向中間靠攏,直到兩個指針相遇。

    ?public static void reverseArray(int[] arr){int left = 0;int right = arr.length - 1;?while (left < right){int temp = arr[left];?arr[left] = arr[right];arr[right] = temp;left++;right--;}}?public static void main(String[] args){int[] arr = {1, 2, 3, 4, 5}; ? ?// 定義一個數組?System.out.println("原數組:" + Arrays.toString(arr)); ? ?// 輸出原數組reverseArray(arr); ? ?// 調用方法將數組元素順序顛倒System.out.println("顛倒后的數組:" + Arrays.toString(arr)); ? ?// 輸出顛倒后的數組}

    運行該主函數,輸出結果如下:

    ?原數組:[1, 2, 3, 4, 5]顛倒后的數組:[5, 4, 3, 2, 1]
  3. 為什么數組要從 0 開始編號,而不是 1? 答: 數組的索引,表示了數組元素距離首地址的偏離量。因為第 1 個元素的地址與首地址相同,所以偏移量就是 0,所以數組要從 0 開始。

  4. 數組有什么排序的方式,手寫一下? 答: 常見的數組排序方式有冒泡排序、選擇排序、插入排序、快速排序、歸并排序等。

    冒泡排序: 冒泡排序的思路是從第一個元素開始,依次比較相鄰的兩個元素,如果前一個元素比后一個元素大,則交換它們的位置。這樣一輪下來,最大的元素就會被移動到最后一個位置。然后再從第一個元素開始,繼續進行比較和交換,直到所有元素都被排序。

    ?public class BubbleSort{public static void main(String[] args){int[] arr = {3, 9, 1, 8, 2, 5, 7};?bubbleSort(arr);?for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}}?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;}}}}}

    冒泡排序的時間復雜度為 O(n^2),空間復雜度為 O(1)。

    快速排序: 快速排序的思路是選取一個基準元素,將數組分為左右兩部分,左半部分的元素均小于等于基準元素,右半部分的元素均大于等于基準元素。然后對左右兩部分分別進行快速排序,直到整個數組有序。在上面的代碼中,partition 方法用于實現分區,將數組分為左右兩部分。quickSort 方法用于實現快速排序,遞歸調用自身對左右兩部分進行排序。

    ?public class QuickSort{public static void main(String[] args){int[] arr = {5, 2, 9, 3, 7, 6, 1, 8, 4};?quickSort(arr, 0, arr.length - 1);?for (int i : arr){System.out.print(i + " ");}}?public static void quickSort(int[] arr, int left, int right){if (left < right){int pivot = partition(arr, left, right);?quickSort(arr, left, pivot - 1);quickSort(arr, pivot + 1, right);}}?public static int partition(int[] arr, int left, int right){int pivot = arr[left];?while (left < right){while (left < right && arr[right] >= pivot){right--;}?arr[left] = arr[right];?while (left < right && arr[left] <= pivot){left++;}?arr[right] = arr[left];}?arr[left] = pivot;?return left;}}

    快速排序的時間復雜度為 O(nlogn),空間復雜度為 O(logn)。

  5. 二分算法實現數組的查找? 答: 二分查找思路: ① 首先確定要查找的數組的范圍,即左右邊界; ② 計算中間位置,即中間索引值; ③ 判斷中間值是否等于要查找的值,如果是,則返回中間索引值; ④ 如果中間值大于要查找的值,則在左半部分繼續查找,即將右邊界設為中間索引值減一; ⑤ 如果中間值小于要查找的值,則在右半部分繼續查找,即將左邊界設為中間索引值加一; ⑥ 重復 ②-⑤ 步驟,直到找到要查找的值或左右邊界重合,此時返回-1 表示未找到。

    ?public class BinarySearch{public static int binarySearch(int[] arr, int key){int low = 0;int high = arr.length - 1;?while (low <= high){int mid = (low + high) / 2;?if (key < arr[mid]){high = mid - 1;}else if (key > arr[mid]){low = mid + 1;}else{return mid;}}?return -1;}?public static void main(String[] args){int[] arr = {1, 3, 5, 7, 9};int key = 3;int index = binarySearch(arr, key);?if (index == -1){System.out.println("找不到指定的元素");}else{System.out.println("指定元素的索引為:" + index);}}}

    復雜度分析: 時間復雜度為 O(log n),因為每次查找都將查找范圍縮小一半,最壞情況下需要查找 log n 次,其中 n 為數組長度。 空間復雜度為 O(1),因為只需要常數個額外變量存儲查找范圍的左右邊界和中間索引值。

  6. 怎么求數組的最大子序列和? 答: 以下是一個使用 Java 實現的求解最大子序列和的示例代碼:

    這個算法的思路是使用動態規劃的思想。

    我們從左到右遍歷整個數組,使用兩個變量 maxSum 和 currentSum 來記錄最大子序列和和當前子序列和。

    對于當前遍歷到的元素 nums[i],我們可以有兩種選擇: 將 nums[i] 加入當前子序列中,即 currentSum = currentSum + nums[i]; 以 nums[i] 作為新的起點開始一個新的子序列,即 currentSum = nums[i]。

    我們需要比較這兩種選擇哪個更優,即選擇 currentSum + nums[i] 或選擇 nums[i] 中的較大值作為當前子序列的和 currentSum。同時,我們需要比較當前子序列的和 currentSum 和最大子序列和 maxSum 哪個更大,即選擇 Math.max(maxSum, currentSum)作為新的最大子序列和 maxSum。

    最后,遍歷完成后 maxSum 就是最大子序列和。

    ?public class MaxSubArraySum{public static int maxSubArraySum(int[] nums){int maxSum = nums[0];int currentSum = nums[0];?for (int i = 1; i < nums.length; i++){currentSum = Math.max(currentSum + nums[i], nums[i]);maxSum = Math.max(maxSum, currentSum);}?return maxSum;}?public static void main(String[] args){int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int maxSum = maxSubArraySum(nums);?System.out.println("最大子序列和為:" + maxSum);}}

    輸出:

    ?最大子序列和為:6

    解釋:最大子序列為[4, -1, 2, 1],和為 6。

  7. Arrays 類的排序方法是什么?如何實現排序的? 答: Arrays 類提供了多種排序方法,包括: ① sort(Object[] a):對數組 a 進行升序排序,元素類型必須實現 Comparable 接口。 ② sort(Object[] a, Comparator c):對數組 a 進行排序,使用自定義的 Comparator 比較器進行比較。 ③ parallelSort(Object[] a):對數組 a 進行并行排序,效率更高。

    排序的實現原理主要是基于快速排序和歸并排序,具體實現方式根據元素類型和排序方法不同而不同。

    在 sort(Object[] a) 方法中,對于實現了 Comparable 接口的元素類型,通過 compareTo() 方法進行比較,并且使用快速排序實現;對于未實現 Comparable 接口的元素類型,則會拋出 ClassCastException 異常。

    在 sort(Object[] a, Comparator c) 方法中,通過傳入自定義的 Comparator 比較器進行比較,也使用快速排序實現。 在 parallelSort(Object[] a) 方法中,使用 Fork/Join 框架實現并行排序,將數組拆分成多個小數組進行排序,最后再合并起來。

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

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

相關文章

SQL注入基本原理靶場實現

? 一、前言 SQL注入漏洞(SQL injection)是WEB層面高危的漏洞之一&#xff0c;也是常見的攻擊方式。 二、本質 1、什么是SQL注入 SQL 注入是一種利用應用程序對用戶輸入數據過濾不嚴格&#xff0c;將惡意 SQL 代碼插入到正常 SQL 語句中&#xff0c;從而操控數據庫查詢邏輯的…

圖像預處理(OpenCV)

1 圖像翻轉(圖像鏡像旋轉) 在OpenCV中&#xff0c;圖片的鏡像旋轉是以圖像的中心為原點進行鏡像翻轉的。 cv2.flip(img,flipcode) 參數 img: 要翻轉的圖像 flipcode: 指定翻轉類型的標志 flipcode0: 垂直翻轉&#xff0c;圖片像素點沿x軸翻轉 flipcode>0: 水平翻轉&…

PCDN收益高低的關鍵因素

PCDN&#xff08;P2P內容分發網絡&#xff09;收益好的三個主要關鍵因素是&#xff1a;硬件配置與性能、網絡環境與質量、業務調度與策略。 1. 硬件配置與性能 設備穩定性與兼容性 PCDN節點需長時間穩定運行&#xff0c;硬件性能直接影響收益。例如&#xff0c;使用高性能CPU、…

『生成內容溯源系統』詳解

生成內容溯源系統詳解 1. 定義與核心目標 生成內容溯源系統&#xff08;Generative Content Provenance System&#xff09;是指能夠追蹤AI生成內容的來源、生成過程、版權歸屬及修改歷史的技術體系。其核心目標是&#xff1a; 驗證真實性&#xff1a;證明內容由特定AI模型生…

conda如何安裝和運行jupyter

在Conda環境中安裝和運行Jupyter Notebook是一項常見且實用的任務&#xff0c;特別是在數據科學和機器學習項目中。以下是使用Conda安裝和運行Jupyter Notebook的步驟&#xff1a; 安裝Jupyter Notebook 首先&#xff0c;確保你的Conda是最新的。打開終端或Anaconda Prompt&a…

QML之Flickable(滾動區域)

Flickable 是 QML 中用于創建可滾動區域的基礎組件&#xff0c;它比 ScrollView 提供更底層的控制&#xff0c;適合需要自定義滾動行為的場景。 基本用法 qml import QtQuick 2.15Flickable {width: 200height: 200contentWidth: 400 // 內容總寬度contentHeight: 800 // 內…

【NumPy科學計算引擎:從基礎操作到高性能實踐】

目錄 前言&#xff1a;技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析關鍵技術模塊說明技術選型對比 二、實戰演示環境配置核心代碼實現運行結果驗證 三、性能對比測試方法論量化數據對比結果分析 四、最佳實踐推薦方案 ?常見錯誤 ?調試技巧 五、應用…

PandaGPT實戰(1): 環境配置及效果演示

文章目錄 1. 環境安裝2. 數據準備2.1 模型權重獲取2.2 訓練數據準備3. 效果演示3.1 訓練3.2 部署效果PandaGPT是首個無需顯式監督即能跨六種模態執行指令微調任務的基礎模型。它展現出多樣化的多模態能力,包括復雜理解/推理、基于知識的描述以及多輪對話交互。 作為通用型指令…

spring security oauth2.0 使用GitHub

在 Spring Security 中集成 GitHub 的 OAuth 2.0 登錄&#xff0c;可以實現用戶通過 GitHub 賬號快速認證。以下是完整的分步實現指南和代碼示例&#xff1a; 一、前置準備 1. 在 GitHub 注冊 OAuth 應用 訪問 GitHub Settings → Developer settings → OAuth Apps點擊 New …

QT聊天項目DAY01

1.新建初始項目 2.修改UI格式 運行效果 3.創建登錄界面 設計登錄界面UI 設計布局 調整布局間距 往水平布局中拖入標簽和文本輸入框 更換控件名稱并固定高度 添加窗口部件 往現有的資源文件中導入圖片 添加水平布局 4.設置登陸界面為主窗口的核心組件 #pragma once#include &l…

檢測到目標URL存在http host頭攻擊漏洞

漏洞描述 修復措施 方法一&#xff1a; nginx 的 default_server 指令可以定義默認的 server 去處理一些沒有匹配到 server_name 的請求&#xff0c;如果沒有顯式定義&#xff0c;則會選取第一個定義的 server 作為 default_server。 server { …

小甲魚第004講:變量和字符串(下)| 課后測試題及答案

問答題: 0. 請問下面代碼有沒有毛病&#xff0c;為什么? 請問下面代碼為什么會出錯&#xff0c;應該如何解決&#xff1f; 答:這是由于在字符串中&#xff0c;反斜杠()會與其隨后的字符共同構成轉義字符。 為了避免這種不測情況的發生&#xff0c;我們可以在字符串的引號前面…

Hyprnote開源程序是一款記錄和轉錄您會議的 AI 記事本。 本地優先且可擴展 。

一、軟件介紹 文末提供源碼下載學習 Hyprnote開源程序是一款記錄和轉錄您會議的 AI 記事本。 從您的原始會議記錄中生成強大的摘要&#xff0c;本地優先且可擴展 。使用開源模型 &#xff08;Whisper & Llama&#xff09; 離線工作&#xff0c;高度可擴展 &#xff0c;由插…

FreeRTOS使任務處于阻塞態的API

在FreeRTOS中&#xff0c;任務進入阻塞狀態通常是因為等待某個事件或資源。以下是常用的使任務進入阻塞態的API及其分類&#xff1a; 1. 任務延時 vTaskDelay(pdMS_TO_TICKS(ms)) 將任務阻塞固定時間&#xff08;相對延時&#xff0c;從調用時開始計算&#xff09;。 示例&…

各種“排序”的方法

文章目錄 插入排序1. 直接插入排序(O(n^2))舉例1&#xff1a;舉例2&#xff1a;直插排序的"代碼"直插排序的“時間復雜度” 2. 希爾排序(O(n^1.3))方法一方法二(時間復雜度更優) 選擇排序堆排序直接選擇排序 我們學過冒泡排序&#xff0c;堆排序等等。&#xff08;回…

【Linux網絡與網絡編程】08.傳輸層協議 UDP

傳輸層協議負責將數據從發送端傳輸到接收端。 一、再談端口號 端口號標識了一個主機上進行通信的不同的應用程序。在 TCP/IP 協議中&#xff0c;用 "源IP"&#xff0c;"源端口號"&#xff0c;"目的 IP"&#xff0c;"目的端口號"&…

python求π近似值

【問題描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圓周率PI的近似值。 從鍵盤輸入一個整數N值&#xff0c;利用上述公式計算出π的近似值&#xff0c;然后輸出π值&#xff0c;保留小數后8位。 【樣例輸入】1000 【樣例輸出】3.14059265 def countpi(N):p0040nowid0for i i…

第十六屆藍橋杯省賽JavaB組題解

A 逃離高塔 第一道填空題很簡單&#xff0c;根據題意跑一邊循環即可&#xff0c;一共是202個符合條件的數 public static void main(String[] args) {Scanner scanner new Scanner(System.in);int ans0;for(long i0;i<2025;i){if((i*i*i)%103)ans;}System.out.println(ans)…

汽車車窗升降系統全生命周期耐久性驗證方案研究

隨著汽車行業的快速發展&#xff0c;消費者對于汽車品質和安全性的要求日益提高。汽車車窗升降系統作為汽車電子系統中的重要組成部分&#xff0c;其可靠性和耐久性直接影響到用戶的使用體驗和行車安全。車窗升降系統在日常使用中頻繁操作&#xff0c;承受著各種復雜的工況&…

嵌入式Linux——8 串口

目錄 1.終端&#xff08;tty&#xff09; /dev/tty*&#xff1a;物理/虛擬終端 /dev/pts/*&#xff1a;偽終端 /dev/tty&#xff1a;當前進程的控制終端 /dev/tty0&#xff1a;當前活動的虛擬控制臺 2.行規程模式&#xff08;line discipline&#xff09; 比較行規程和原…