成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

落淚!滴滴一面,涼了......

開發(fā) 前端
IO多路復用是一種高效的IO處理方式,它允許單個進程或線程同時監(jiān)視多個文件描述符,如網絡連接或文件句柄。當這些描述符中的任何一個就緒時,比如有數據可讀或可寫,多路復用機制就能夠通知應用程序進行相應的讀寫操作。

大家好,我是小林。

今天就來分享 Java 同學面試滴滴后端開發(fā)的面經,主要是問了Java+MySQL+系統+網絡+算法,都是比較經典面試題,不算難。

圖片圖片

可惜最后同學還是掛了,掛了沒關系,重在復盤每一次的面經,針對面試中不理解或者不明白的問題看書繼續(xù)加強理解,針對已經知道,但是講不清楚的問題,自己對著鏡子面前練習。

考察的知識內容,我?guī)痛蠹伊_列了一下:

  • 操作系統:進程線程協程、進程狀態(tài)、io 模型、io 多路復用
  • 計算機網絡:http 請求頭、狀態(tài)碼
  • Java:集合、JVM
  • mysql:事務、并發(fā)問題
  • 算法:二分

操作系統

進程,線程,協程的區(qū)別是什么?

  • 首先,我們來談談進程。進程是操作系統中進行資源分配和調度的基本單位,它擁有自己的獨立內存空間和系統資源。每個進程都有獨立的堆和棧,不與其他進程共享。進程間通信需要通過特定的機制,如管道、消息隊列、信號量等。由于進程擁有獨立的內存空間,因此其穩(wěn)定性和安全性相對較高,但同時上下文切換的開銷也較大,因為需要保存和恢復整個進程的狀態(tài)。
  • 接下來是線程。線程是進程內的一個執(zhí)行單元,也是CPU調度和分派的基本單位。與進程不同,線程共享進程的內存空間,包括堆和全局變量。線程之間通信更加高效,因為它們可以直接讀寫共享內存。線程的上下文切換開銷較小,因為只需要保存和恢復線程的上下文,而不是整個進程的狀態(tài)。然而,由于多個線程共享內存空間,因此存在數據競爭和線程安全的問題,需要通過同步和互斥機制來解決。
  • 最后是協程。協程是一種用戶態(tài)的輕量級線程,其調度完全由用戶程序控制,而不需要內核的參與。協程擁有自己的寄存器上下文和棧,但與其他協程共享堆內存。協程的切換開銷非常小,因為只需要保存和恢復協程的上下文,而無需進行內核級的上下文切換。這使得協程在處理大量并發(fā)任務時具有非常高的效率。然而,協程需要程序員顯式地進行調度和管理,相對于線程和進程來說,其編程模型更為復雜。

進程的狀態(tài)(五種狀態(tài)),如何切換?

一個完整的進程狀態(tài)的變遷如下圖:

圖片圖片

進程五種狀態(tài)的變遷 再來詳細說明一下進程的狀態(tài)變遷:

  • _NULL -> 創(chuàng)建狀態(tài)_:一個新進程被創(chuàng)建時的第一個狀態(tài);
  • _創(chuàng)建狀態(tài) -> 就緒狀態(tài)_:當進程被創(chuàng)建完成并初始化后,一切就緒準備運行時,變?yōu)榫途w狀態(tài),這個過程是很快的;
  • _就緒態(tài) -> 運行狀態(tài)_:處于就緒狀態(tài)的進程被操作系統的進程調度器選中后,就分配給 CPU 正式運行該進程;
  • _運行狀態(tài) -> 結束狀態(tài)_:當進程已經運行完成或出錯時,會被操作系統作結束狀態(tài)處理;
  • _運行狀態(tài) -> 就緒狀態(tài)_:處于運行狀態(tài)的進程在運行過程中,由于分配給它的運行時間片用完,操作系統會把該進程變?yōu)榫途w態(tài),接著從就緒態(tài)選中另外一個進程運行;
  • _運行狀態(tài) -> 阻塞狀態(tài)_:當進程請求某個事件且必須等待時,例如請求 I/O 事件;
  • _阻塞狀態(tài) -> 就緒狀態(tài)_:當進程要等待的事件完成時,它從阻塞狀態(tài)變到就緒狀態(tài);

你了解過哪些io模型?

  • 阻塞I/O模型:應用程序發(fā)起I/O操作后會被阻塞,直到操作完成才返回結果。適用于對實時性要求不高的場景。
  • 非阻塞I/O模型:應用程序發(fā)起I/O操作后立即返回,不會被阻塞,但需要不斷輪詢或者使用select/poll/epoll等系統調用來檢查I/O操作是否完成。適合于需要進行多路復用的場景,例如需要同時處理多個socket連接的服務器程序。
  • I/O復用模型:通過select、poll、epoll等系統調用,應用程序可以同時等待多個I/O操作,當其中任何一個I/O操作準備就緒時,應用程序會被通知。適合于需要同時處理多個I/O操作的場景,比如高并發(fā)的服務端程序。
  • 信號驅動I/O模型:應用程序發(fā)起I/O操作后,可以繼續(xù)做其他事情,當I/O操作完成時,操作系統會向應用程序發(fā)送信號來通知其完成。適合于需要異步I/O通知的場景,可以提高系統的并發(fā)能力。
  • 異步I/O模型:應用程序發(fā)起I/O操作后可以立即做其他事情,當I/O操作完成時,應用程序會得到通知。異步I/O模型由操作系統內核完成I/O操作,應用程序只需等待通知即可。適合于需要大量并發(fā)連接和高性能的場景,能夠減少系統調用次數,提高系統效率。

有了解過io多路復用嗎?

IO多路復用是一種高效的IO處理方式,它允許單個進程或線程同時監(jiān)視多個文件描述符,如網絡連接或文件句柄。當這些描述符中的任何一個就緒時,比如有數據可讀或可寫,多路復用機制就能夠通知應用程序進行相應的讀寫操作。這種機制的核心優(yōu)勢在于,它可以在不增加額外線程或進程的情況下,處理大量的并發(fā)連接,從而顯著地提高系統的并發(fā)性和響應能力。常見的IO多路復用技術包括select、poll和epoll等。這些技術各有特點,但核心思想都是通過一個線程來管理多個連接,減少系統資源的消耗,并提高程序運行的效率。select 實現多路復用的方式是,將已連接的 Socket 都放到一個文件描述符集合,然后調用 select 函數將文件描述符集合拷貝到內核里,讓內核來檢查是否有網絡事件產生,檢查的方式很粗暴,就是通過遍歷文件描述符集合的方式,當檢查到有事件產生后,將此 Socket 標記為可讀或可寫, 接著再把整個文件描述符集合拷貝回用戶態(tài)里,然后用戶態(tài)還需要再通過遍歷的方法找到可讀或可寫的 Socket,然后再對其處理。所以,對于 select 這種方式,需要進行 2 次「遍歷」文件描述符集合,一次是在內核態(tài)里,一個次是在用戶態(tài)里 ,而且還會發(fā)生 2 次「拷貝」文件描述符集合,先從用戶空間傳入內核空間,由內核修改后,再傳出到用戶空間中。select 使用固定長度的 BitsMap,表示文件描述符集合,而且所支持的文件描述符的個數是有限制的,在 Linux 系統中,由內核中的 FD_SETSIZE 限制, 默認最大值為 1024,只能監(jiān)聽 0~1023 的文件描述符。poll 不再用 BitsMap 來存儲所關注的文件描述符,取而代之用動態(tài)數組,以鏈表形式來組織,突破了 select 的文件描述符個數限制,當然還會受到系統文件描述符限制。但是 poll 和 select 并沒有太大的本質區(qū)別,都是使用「線性結構」存儲進程關注的 Socket 集合,因此都需要遍歷文件描述符集合來找到可讀或可寫的 Socket,時間復雜度為 O(n),而且也需要在用戶態(tài)與內核態(tài)之間拷貝文件描述符集合,這種方式隨著并發(fā)數上來,性能的損耗會呈指數級增長。poll 通過兩個方面,很好解決了 select/poll 的問題。

  • _第一點_,epoll 在內核里使用紅黑樹來跟蹤進程所有待檢測的文件描述字,把需要監(jiān)控的 socket 通過 epoll_ctl() 函數加入內核中的紅黑樹里,紅黑樹是個高效的數據結構,增刪改一般時間復雜度是 O(logn)。而 select/poll 內核里沒有類似 epoll 紅黑樹這種保存所有待檢測的 socket 的數據結構,所以 select/poll 每次操作時都傳入整個 socket 集合給內核,而 epoll 因為在內核維護了紅黑樹,可以保存所有待檢測的 socket ,所以只需要傳入一個待檢測的 socket,減少了內核和用戶空間大量的數據拷貝和內存分配。
  • _第二點_, epoll 使用事件驅動的機制,內核里維護了一個鏈表來記錄就緒事件,當某個 socket 有事件發(fā)生時,通過回調函數內核會將其加入到這個就緒事件列表中,當用戶調用 epoll_wait() 函數時,只會返回有事件發(fā)生的文件描述符的個數,不需要像 select/poll 那樣輪詢掃描整個 socket 集合,大大提高了檢測的效率。

從下圖你可以看到 epoll 相關的接口作用:

圖片圖片

epoll 的方式即使監(jiān)聽的 Socket 數量越多的時候,效率不會大幅度降低,能夠同時監(jiān)聽的 Socket 的數目也非常的多了,上限就為系統定義的進程打開的最大文件描述符個數。因而,epoll 被稱為解決 C10K 問題的利器。

計算機網絡

Http請求頭有哪些

下面是一個HTTP請求的請求頭:

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0

常見的請求字段如下表所示:

字段名

說明

示例

Accept

能夠接受的回應內容類型(Content-Types)

Accept: text/plain

Accept-Charset

能夠接受的字符集

Accept-Charset: utf-8

Accept-Encoding

能夠接受的編碼方式列表

Accept-Encoding: gzip, deflate

Authorization

用于超文本傳輸協議的認證的認證信息

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Cache-Control

用來指定在這次的請求/響應鏈中的所有緩存機制 都必須 遵守的指令

Cache-Control: no-cache

Connection

該瀏覽器想要優(yōu)先使用的連接類型

Connection: keep-alive Connection: Upgrade

Cookie

服務器通過 Set- Cookie (下文詳述)發(fā)送的一個 超文本傳輸協議Cookie

Cookie: $Versinotallow=1; Skin=new;

Content-Length

以 八位字節(jié)數組 (8位的字節(jié))表示的請求體的長度

Content-Length: 348

Content-Type

請求體的 多媒體類型

Content-Type: application/x-www-form-urlencoded

Host

服務器的域名(用于虛擬主機 ),以及服務器所監(jiān)聽的傳輸控制協議端口號

Host: en.wikipedia.org:80 Host: en.wikipedia.org

User-Agent

瀏覽器的瀏覽器身份標識字符串

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0

Origin

發(fā)起一個針對 跨來源資源共享 的請求

Origin: http://www.example-social-network.com

常見的狀態(tài)碼(分類舉例說明)

圖片圖片

五大類 HTTP 狀態(tài)碼

  • 1xx 類狀態(tài)碼屬于提示信息,是協議處理中的一種中間狀態(tài),實際用到的比較少。
  • 2xx 類狀態(tài)碼表示服務器成功處理了客戶端的請求,也是我們最愿意看到的狀態(tài)。
  • 3xx 類狀態(tài)碼表示客戶端請求的資源發(fā)生了變動,需要客戶端用新的 URL 重新發(fā)送請求獲取資源,也就是重定向。
  • 4xx 類狀態(tài)碼表示客戶端發(fā)送的報文有誤,服務器無法處理,也就是錯誤碼的含義。
  • 5xx 類狀態(tài)碼表示客戶端請求報文正確,但是服務器處理時內部發(fā)生了錯誤,屬于服務器端的錯誤碼。

301和302有什么區(qū)別

重定向狀態(tài)碼如下,301 和 302 都會在響應頭里使用字段 Location,指明后續(xù)要跳轉的 URL,瀏覽器會自動重定向新的 URL。

  • 「301 Moved Permanently」表示永久重定向,說明請求的資源已經不存在了,需改用新的 URL 再次訪問。
  • 「302 Found」表示臨時重定向,說明請求的資源還在,但暫時需要用另一個 URL 來訪問。

重定向是指將一個URL請求轉發(fā)到另一個URL的過程。重定向的作用包括:

  • 更改URL:通過重定向,可以更改URL,使其更易于記憶、更友好或更有意義。例如,將長而復雜的URL重定向到簡潔的、易于理解的URL。
  • 網站遷移:當網站進行重構、更換域名或更改URL結構時,通過重定向舊的URL到新的URL,可以讓用戶和搜索引擎正確地訪問和索引新的內容。

Java八股

常用的集合有哪些?

圖片圖片

List是有序的Collection,使用此接口能夠精確的控制每個元素的插入位置,用戶能根據索引訪問List中元素。常用的實現List的類有LinkedList,ArrayList,Vector,Stack。

  • ArrayList是容量可變的非線程安全列表,其底層使用數組實現。當幾何擴容時,會創(chuàng)建更大的數組,并把原數組復制到新數組。ArrayList支持對元素的快速隨機訪問,但插入與刪除速度很慢。
  • LinkedList本質是一個雙向鏈表,與ArrayList相比,,其插入和刪除速度更快,但隨機訪問速度更慢。

Set不允許存在重復的元素,與List不同,set中的元素是無序的。常用的實現有HashSet,LinkedHashSet和TreeSet。

  • HashSet通過HashMap實現,HashMap的Key即HashSet存儲的元素,所有Key都是用相同的Value,一個名為PRESENT的Object類型常量。使用Key保證元素唯一性,但不保證有序性。由于HashSet是HashMap實現的,因此線程不安全。
  • LinkedHashSet繼承自HashSet,通過LinkedHashMap實現,使用雙向鏈表維護元素插入順序。
  • TreeSet通過TreeMap實現的,添加元素到集合時按照比較規(guī)則將其插入合適的位置,保證插入后的集合仍然有序。

Map 是一個鍵值對集合,存儲鍵、值和之間的映射。Key 無序,唯一;value 不要求有序,允許重復。Map 沒有繼承于 Collection 接口,從 Map 集合中檢索元素時,只要給出鍵對象,就會返回對應的值對象。主要實現有TreeMap、HashMap、HashTable、LinkedHashMap、ConcurrentHashMap

  • HashMap:JDK1.8 之前 HashMap 由數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的(“拉鏈法”解決沖突),JDK1.8 以后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為 8)時,將鏈表轉化為紅黑樹,以減少搜索時間
  • LinkedHashMap:LinkedHashMap 繼承自 HashMap,所以它的底層仍然是基于拉鏈式散列結構即由數組和鏈表或紅黑樹組成。另外,LinkedHashMap 在上面結構的基礎上,增加了一條雙向鏈表,使得上面的結構可以保持鍵值對的插入順序。同時通過對鏈表進行相應的操作,實現了訪問順序相關邏輯。
  • HashTable:數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的
  • TreeMap:紅黑樹(自平衡的排序二叉樹)
  • ConcurrentHashMap:Node數組+鏈表+紅黑樹實現,線程安全的(jdk1.8以前Segment鎖,1.8以后volatile + CAS 或者 synchronized)

hashtable 和concurrentHashMap有什么區(qū)別

  • 底層數據結構:
  • jdk7之前的ConcurrentHashMap底層采用的是分段的數組+鏈表實現,jdk8之后采用的是數組+鏈表/紅黑樹;
  • HashTable采用的是數組+鏈表,數組是主體,鏈表是解決hash沖突存在的。
  • 實現線程安全的方式:
  • jdk8以前,ConcurrentHashMap采用分段鎖,對整個數組進行了分段分割,每一把鎖只鎖容器里的一部分數據,多線程訪問不同數據段里的數據,就不會存在鎖競爭,提高了并發(fā)訪問;jdk8以后,直接采用數組+鏈表/紅黑樹,并發(fā)控制使用CAS和synchronized操作,更加提高了速度。
  • HashTable:所有的方法都加了鎖來保證線程安全,但是效率非常的低下,當一個線程訪問同步方法,另一個線程也訪問的時候,就會陷入阻塞或者輪詢的狀態(tài)。

Java的垃圾回收器有哪些?

  • Serial 收集器,串行收集器是最古老,最穩(wěn)定以及效率高的收集器,可能會產生較長的停頓,只使用一個線程去回收。
  • ParNew 收集器,ParNew 收集器其實就是 Serial 收集器的多線程版本。
  • Parallel 收集器,Parallel Scavenge 收集器類似 ParNew 收集器,Parallel 收集器更關注系統的吞吐量。
  • Parallel Old 收集器,Parallel Old 是 Parallel Scavenge 收集器的老年代版本,使用多線程和“標記-整理”算法
  • CMS 收集器,CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。
  • G1 收集器,G1 (Garbage-First)是一款面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器. 以極高概率滿足 GC 停頓時間要求的同時,還具備高吞吐量性能特征

垃圾回收的方法有哪些?

  • 標記-清除算法:標記-清除算法分為“標記”和“清除”兩個階段,首先通過可達性分析,標記出所有需要回收的對象,然后統一回收所有被標記的對象。標記-清除算法有兩個缺陷,一個是效率問題,標記和清除的過程效率都不高,另外一個就是,清除結束后會造成大量的碎片空間。有可能會造成在申請大塊內存的時候因為沒有足夠的連續(xù)空間導致再次 GC。
  • 復制算法:為了解決碎片空間的問題,出現了“復制算法”。復制算法的原理是,將內存分成兩塊,每次申請內存時都使用其中的一塊,當內存不夠時,將這一塊內存中所有存活的復制到另一塊上。然后將然后再把已使用的內存整個清理掉。復制算法解決了空間碎片的問題。但是也帶來了新的問題。因為每次在申請內存時,都只能使用一半的內存空間。內存利用率嚴重不足。
  • 標記-整理算法:復制算法在 GC 之后存活對象較少的情況下效率比較高,但如果存活對象比較多時,會執(zhí)行較多的復制操作,效率就會下降。而老年代的對象在 GC 之后的存活率就比較高,所以就有人提出了“標記-整理算法”。標記-整理算法的“標記”過程與“標記-清除算法”的標記過程一致,但標記之后不會直接清理。而是將所有存活對象都移動到內存的一端。移動結束后直接清理掉剩余部分。
  • 分代回收算法:分代收集是將內存劃分成了新生代和老年代。分配的依據是對象的生存周期,或者說經歷過的 GC 次數。對象創(chuàng)建時,一般在新生代申請內存,當經歷一次 GC 之后如果對還存活,那么對象的年齡 +1。當年齡超過一定值(默認是 15,可以通過參數 -XX:MaxTenuringThreshold 來設定)后,如果對象還存活,那么該對象會進入老年代。

有哪些優(yōu)化java程序的辦法

調整新生代和老年代的比例、線程池、減少GC。

mysql

mysql幾種事務隔離

SQL 標準提出了四種隔離級別來規(guī)避這些現象,隔離級別越高,性能效率就越低,這四個隔離級別如下:

  • 讀未提交(_read uncommitted_),指一個事務還沒提交時,它做的變更就能被其他事務看到;
  • 讀提交(_read committed_),指一個事務提交之后,它做的變更才能被其他事務看到;
  • 可重復讀(_repeatable read_),指一個事務執(zhí)行過程中看到的數據,一直跟這個事務啟動時看到的數據是一致的,MySQL InnoDB 引擎的默認隔離級別;
  • 串行化(_serializable_ );會對記錄加上讀寫鎖,在多個事務對這條記錄進行讀寫操作時,如果發(fā)生了讀寫沖突的時候,后訪問的事務必須等前一個事務執(zhí)行完成,才能繼續(xù)執(zhí)行;

按隔離水平高低排序如下:圖片針對不同的隔離級別,并發(fā)事務時可能發(fā)生的現象也會不同。圖片也就是說:

  • 在「讀未提交」隔離級別下,可能發(fā)生臟讀、不可重復讀和幻讀現象;
  • 在「讀提交」隔離級別下,可能發(fā)生不可重復讀和幻讀現象,但是不可能發(fā)生臟讀現象;
  • 在「可重復讀」隔離級別下,可能發(fā)生幻讀現象,但是不可能臟讀和不可重復讀現象;
  • 在「串行化」隔離級別下,臟讀、不可重復讀和幻讀現象都不可能會發(fā)生。

臟讀和幻讀有什么區(qū)別

臟讀

如果一個事務「讀到」了另一個「未提交事務修改過的數據」,就意味著發(fā)生了「臟讀」現象。

舉個栗子。

假設有 A 和 B 這兩個事務同時在處理,事務 A 先開始從數據庫中讀取小林的余額數據,然后再執(zhí)行更新操作,如果此時事務 A 還沒有提交事務,而此時正好事務 B 也從數據庫中讀取小林的余額數據,那么事務 B 讀取到的余額數據是剛才事務 A 更新后的數據,即使沒有提交事務。圖片

因為事務 A 是還沒提交事務的,也就是它隨時可能發(fā)生回滾操作,如果在上面這種情況事務 A 發(fā)生了回滾,那么事務 B 剛才得到的數據就是過期的數據,這種現象就被稱為臟讀。

幻讀

在一個事務內多次查詢某個符合查詢條件的「記錄數量」,如果出現前后兩次查詢到的記錄數量不一樣的情況,就意味著發(fā)生了「幻讀」現象。

舉個栗子。

假設有 A 和 B 這兩個事務同時在處理,事務 A 先開始從數據庫查詢賬戶余額大于 100 萬的記錄,發(fā)現共有 5 條,然后事務 B 也按相同的搜索條件也是查詢出了 5 條記錄。

圖片

接下來,事務 A 插入了一條余額超過 100 萬的賬號,并提交了事務,此時數據庫超過 100 萬余額的賬號個數就變?yōu)?6。

然后事務 B 再次查詢賬戶余額大于 100 萬的記錄,此時查詢到的記錄數量有 6 條,發(fā)現和前一次讀到的記錄數量不一樣了,就感覺發(fā)生了幻覺一樣,這種現象就被稱為幻讀。

算法

有序數組1-100,刪除一個數,如何查找

可以通過二分查找的方式來查找并刪除一個數。

首先,將數組從中間分成兩部分,比較中間元素和要查找的數的大小關系。如果中間元素等于要查找的數,則刪除該元素并將數組整體向前移動一位。如果中間元素大于要查找的數,則在左半部分繼續(xù)進行二分查找。如果中間元素小于要查找的數,則在右半部分繼續(xù)進行二分查找。

重復以上步驟,直到找到要刪除的數或者確定該數不在數組中。如果找到要刪除的數,則將該數刪除并將數組整體向前移動一位。

以下是java實現代碼:

public class DeleteNumber {

    public static void main(String[] args) {
        int[] arr = new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }

        int target = 50; // 要刪除的數
        int index = binarySearch(arr, target);
        if(index != -1){
            deleteNumber(arr, index);
            System.out.println("刪除成功!");
        }else{
            System.out.println("未找到該數!");
        }
    }

    public static int binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

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

        return -1;
    }

    public static void deleteNumber(int[] arr, int index) {
        for (int i = index; i < arr.length - 1; i++) {
            arr[i] = arr[i + 1];
        }
    }
}

在上面的代碼中,假設要刪除的數是50,然后調用binarySearch方法查找50的索引,如果找到則調用deleteNumber方法刪除該數。最后打印刪除成功的消息。

責任編輯:武曉燕 來源: 小林coding
相關推薦

2022-05-11 22:15:51

云計算云平臺

2009-07-30 14:38:36

云計算

2020-09-19 17:46:20

React Hooks開發(fā)函數

2011-12-22 20:53:40

Android

2011-12-23 09:43:15

開源開放

2013-09-16 10:52:09

2012-12-19 09:04:29

2022-05-10 08:11:15

MySQL技巧結構

2022-08-13 12:07:14

URLHTTP加密

2022-03-30 10:10:17

字節(jié)碼??臻g

2025-04-01 08:40:00

HTTPRPC開發(fā)

2021-11-03 09:03:09

面試鏈接http

2022-05-11 15:57:16

優(yōu)化SQL

2024-09-19 08:51:01

HTTP解密截取

2024-11-11 16:40:04

2025-03-24 07:35:00

開發(fā)注解Spring

2025-05-15 09:45:54

2023-09-04 00:00:07

百度長連接網絡

2024-11-26 08:52:34

SQL優(yōu)化Kafka

2022-10-10 08:13:16

遞歸通用代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产黄色一级片 | 精品美女久久久久久免费 | 91国内视频在线 | 亚洲精品电影在线观看 | 国产欧美精品一区二区色综合朱莉 | 亚洲国产成人久久综合一区,久久久国产99 | 中文字幕日韩一区二区 | 欧美不卡视频一区发布 | 亚洲免费在线 | 一区二区三区在线观看视频 | 亚洲一区导航 | av电影一区二区 | 超碰97免费在线 | 久久av一区二区三区 | 久久最新网址 | 久久久一 | www.天堂av.com | 中文字幕高清免费日韩视频在线 | 毛片视频网站 | 亚洲欧美一区二区三区1000 | 午夜久久久久久久久久一区二区 | 久久99精品久久久久久国产越南 | 国产一区 | 久久国产精品久久久久久 | 欧美嘿咻 | 男女久久久 | 草草视频在线免费观看 | 欧美在线a | 91久久久久久 | 亚洲性视频网站 | 一级少妇女片 | 午夜精品久久久久久久 | 欧美性成人 | 国产精品美女久久久久aⅴ国产馆 | 精品久久久999 | 亚洲精品日韩一区二区电影 | 欧美亚洲高清 | 久久精品国产v日韩v亚洲 | 久久伊人免费视频 | 午夜久久久久久久久久一区二区 | 国产精品久久久久一区二区三区 |