主題難度:* *
(學(xué)習(xí)影片推薦:java課程)
1、排序序
【題目】
傳回一個(gè)數(shù)字?jǐn)?shù)組的排序值,例如資料[6,2,5,0] 的回傳是[4,2,3,1]
【代碼】
package swear2offer.array; import java.util.Arrays; public class SortSequence { /** * 返回一個(gè)數(shù)字?jǐn)?shù)組的排序值 * 比如數(shù)據(jù) [6,2,5,0] 的返回是 [4,2,3,1] * */ public int[] compare(int[] a) { int i,j,n; n = a.length; int [] c = new int[n]; //數(shù)組下標(biāo)從0開始,但是輸出的次序從1開始,所以需要初始化數(shù)組為1 for (i=0; i<n; i++) { c[i]++; } for (i=0; i<n; i++) { for (j=0; j<i; j++) { if (a[j]<a[i]) c[i]++; else c[j]++; } } return c; } public static void main(String[] args) { int[] a = {6,2,5,0}; System.out.println(Arrays.toString(new SortSequence().compare(a))); } }
【思考】
正常的獲得次序的方式是每一個(gè)元素都與其他所有元素進(jìn)行比較,然後獲得大小次序,但是這裡採用的是梯形比較次序
6 6 2 6 2 5 6 2 5 0
比較的時(shí)候,不只判斷比較元素,同時(shí)也判斷被比較元素,也就是if else的程式碼,這樣可以減少比較次數(shù)。
2、陣列下標(biāo)輔助記錄
【題目】
給定一個(gè)陣列a, 長度為N, 元素取值範(fàn)圍為[1, N],統(tǒng)計(jì)各個(gè)元素出現(xiàn)的次數(shù),要求時(shí)間複雜度為O (N), 空間複雜度為O (1)
#【程式碼】
/** * 這類要求空間O(1)時(shí)間復(fù)雜度為O(n)的問題 * 需要在一次遍歷并且不聲明新數(shù)組的情況下求解,這種題目通常要求元素大小跟下標(biāo)大小一致。 * 所以通??紤]是利用數(shù)組存儲的元素和數(shù)組下標(biāo)來求解 * 在本題中,數(shù)組的元素變成了下標(biāo),而數(shù)組內(nèi)元素則表示之前元素出現(xiàn)的次數(shù),0則代表不出現(xiàn)。 * 為了區(qū)分元素和次數(shù),可以把次數(shù)設(shè)定為負(fù)值 * */ public void Solution(int[] a) { int i,n,temp; n = a.length; i = 0; /** * 只有在temp小于0的時(shí)候才會推進(jìn)循環(huán) * */ while(i < n) { temp = a[i]-1; // 如果數(shù)組元素小于0,則代表該數(shù)已經(jīng)被替換到其他地方或者已經(jīng)被計(jì)數(shù)過從而被覆蓋 if (temp < 0) { i ++; continue; } // 把未記錄的數(shù)保存在已經(jīng)記錄的位置上,并用負(fù)值保存數(shù)量 if (a[temp]>0) { a[i] = a[temp]; a[temp] = -1; } else { a[i] = 0; //該數(shù)據(jù)已經(jīng)使用過,且表示元素i+1出現(xiàn)0次 a[temp]--; } } }
(圖文教學(xué)推薦:java面試題目及答案)
3、找出有序二維數(shù)組的元素
【題目】
在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組是否含有該整數(shù)。
【程式碼】
package swear2offer.array; public class ArrayFind { /** * 在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同), * 每一行都按照從左到右遞增的順序排序, * 每一列都按照從上到下遞增的順序排序。 * 請完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù), * 判斷數(shù)組中是否含有該整數(shù)。 * * 思路: * 從左上出發(fā),需要考慮的情況太多,因?yàn)橄蛴液拖蛳露际沁f增 * 但是從右上出發(fā),向左遞減,向下遞增,這樣就把情況限定在一種。 * */ public boolean Find(int target, int [][] array) { int l,h,x,y; h = array.length; l = array[0].length; // 游標(biāo)的橫縱坐標(biāo) x = l-1; y = 0; while (x>=0 && y<h) { if(array[y][x] == target) { return true; } if (array[y][x]<target) { y++; } else { x--; } } return false; } public static void main(String[] args) { int[][] a = {{1,3,5,6},{2,4,7,8},{5,8,9,12}}; System.out.println(new ArrayFind().Find(11,a)); } }
【思考】
從左上出發(fā),需要考慮的情況太多,因?yàn)橄蛴液拖蛳露际沁f增,但是從右上出發(fā),向左遞減,向下遞增,這樣就把情況限定在一種。特殊的數(shù)組,充分利用數(shù)組的特殊性,從不同的方向考慮方法。
4、跳臺階
【題目】
一隻青蛙一次可以跳上 1 級臺階,也可以跳上 2 級。求該青蛙跳上一個(gè) n 級的階梯總共有多少種跳法(先後次序不同算不同的結(jié)果)。
【程式碼】
package swear2offer.array; public class Floors { /** * 一只青蛙一次可以跳上 1 級臺階,也可以跳上 2 級。 * 求該青蛙跳上一個(gè) n 級的臺階總共有多少種跳法(先后次序不同算不同的結(jié)果)。 * * 獲取跳法次數(shù) * */ public int JumpFloor(int target) { if (target < 3) return target; // 大于等于3個(gè)臺階,次數(shù)是第一步調(diào)1下和跳2下的個(gè)數(shù)之和 return JumpFloor(target-1) + JumpFloor(target-2); } }
5、變態(tài)跳臺階
【題目】
#一隻青蛙一次可以跳上1 級臺階,也可以跳上2 級… 它也可以跳上n 級。求該青蛙跳上一個(gè) n 級的階梯總共有多少種跳法。
【程式碼】
package swear2offer.array; import java.util.Arrays; public class FloorsPlus { /** * 一只青蛙一次可以跳上 1 級臺階, * 也可以跳上 2 級…… 它也可以跳上 n 級。 * 求該青蛙跳上一個(gè) n 級的臺階總共有多少種跳法。 * * 動態(tài)規(guī)劃:數(shù)組代表含義、邊界、轉(zhuǎn)換公式 * 動態(tài)規(guī)劃最重要的是找出階段之間的變化公式, * 即,n-1和n之間的狀態(tài)是如何轉(zhuǎn)移的 * * f[n]:n階臺階的跳法 * f[n] = f[n-1]+f[n-2]+...+f[1]+f[0] * f[n-1]代表最后一步走了1步 * f[n-2]代表最后一步走了2步 * f[1]代表最后一步走了n-1步 * f[0]代表最后一步走了n步 * * 這里需要注意,f[0]=0,但是最后一步走了n步也算一種方法, * 所以需要初始化把數(shù)組初始化為1,或則單獨(dú)處理f[0]. * * */ public int JumpFloorII(int target) { if (target < 3) return target; int[] f = new int[target+1]; //單獨(dú)處理f[0] f[0] = 1; f[1] = 1;//邊界 int i,j; for (i=2; i<=target; i++) { for (j=i-1; j>=0; j--) { f[i] += f[j]; } } return f[target]; } public int JumpFloorII2(int target) { if (target < 3) return target; int[] f = new int[target+1]; //初始化把數(shù)組初始化為1 Arrays.fill(f,1); f[0] = 0; f[1] = 1;//邊界 int i,j; for (i=2; i<=target; i++) { for (j=i-1; j>0; j--) { f[i] += f[j]; } } return f[target]; } }
相關(guān)推薦:java入門
以上是java面試中常見的陣列題目總結(jié)(一)的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

遍歷Java中的Map有三種常用方法:1.使用entrySet同時(shí)獲取鍵和值,適用於大多數(shù)場景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡化代碼結(jié)構(gòu)。 entrySet返回包含所有鍵值對的Set集合,每次循環(huán)獲取Map.Entry對象,適合頻繁訪問鍵和值的情況;若只需鍵或值,可分別調(diào)用keySet()或values(),也可在遍歷鍵時(shí)通過map.get(key)獲取值;Java8中可通過Lambda表達(dá)式使用forEach((key,value)->

Optional能清晰表達(dá)意圖並減少null判斷的代碼噪音。 1.Optional.ofNullable是處理可能為null對象的常用方式,如從map中取值時(shí)可結(jié)合orElse提供默認(rèn)值,邏輯更清晰簡潔;2.通過鍊式調(diào)用map實(shí)現(xiàn)嵌套取值,安全地避免NPE,任一環(huán)節(jié)為null則自動終止並返回默認(rèn)值;3.filter可用於條件篩選,滿足條件才繼續(xù)執(zhí)行後續(xù)操作,否則直接跳到o??rElse,適合輕量級業(yè)務(wù)判斷;4.不建議過度使用Optional,如基本類型或簡單邏輯中其反而增加複雜度,部分場景直接返回nu

遇到j(luò)ava.io.NotSerializableException的核心解決方法是確保所有需序列化的類實(shí)現(xiàn)Serializable接口,並檢查嵌套對象的序列化支持。 1.給主類添加implementsSerializable;2.確保類中自定義字段對應(yīng)的類也實(shí)現(xiàn)Serializable;3.用transient標(biāo)記不需要序列化的字段;4.檢查集合或嵌套對像中的非序列化類型;5.查看異常信息定位具體哪個(gè)類未實(shí)現(xiàn)接口;6.對無法修改的類考慮替換設(shè)計(jì),如保存關(guān)鍵數(shù)據(jù)或使用可序列化的中間結(jié)構(gòu);7.考慮改

在Java中,Comparable用於類內(nèi)部定義默認(rèn)排序規(guī)則,Comparator用於外部靈活定義多種排序邏輯。 1.Comparable是類自身實(shí)現(xiàn)的接口,通過重寫compareTo()方法定義自然順序,適用於類有固定、最常用的排序方式,如String或Integer。 2.Comparator是外部定義的函數(shù)式接口,通過compare()方法實(shí)現(xiàn),適合同一類需要多種排序方式、無法修改類源碼或排序邏輯經(jīng)常變化的情況。兩者區(qū)別在於Comparable只能定義一種排序邏輯且需修改類本身,而Compar

方法引用是Java中一種簡化Lambda表達(dá)式的寫法,使代碼更簡潔。它不是新語法,而是Java8引入的Lambda表達(dá)式的一種快捷方式,適用於函數(shù)式接口的上下文。其核心在於將已有方法直接作為函數(shù)式接口的實(shí)現(xiàn)來使用。例如System.out::println等價(jià)於s->System.out.println(s)。方法引用主要有四種形式:1.靜態(tài)方法引用(ClassName::staticMethodName);2.實(shí)例方法引用(綁定到特定對象,instance::methodName);3.

處理Java中的字符編碼問題,關(guān)鍵是在每一步都明確指定使用的編碼。 1.讀寫文本時(shí)始終指定編碼,使用InputStreamReader和OutputStreamWriter並傳入明確的字符集,避免依賴系統(tǒng)默認(rèn)編碼。 2.在網(wǎng)絡(luò)邊界處理字符串時(shí)確保兩端一致,設(shè)置正確的Content-Type頭並用庫顯式指定編碼。 3.謹(jǐn)慎使用String.getBytes()和newString(byte[]),應(yīng)始終手動指定StandardCharsets.UTF_8以避免平臺差異導(dǎo)致的數(shù)據(jù)損壞。總之,通過在每個(gè)階段

解析JSON在Java中的常見方式有三種:使用Jackson、Gson或org.json。 1.Jackson適合大多數(shù)項(xiàng)目,性能好且功能全面,支持對象與JSON字符串之間的轉(zhuǎn)換及註解映射;2.Gson更適合Android項(xiàng)目或輕量級需求,使用簡單但處理複雜結(jié)構(gòu)和高性能場景略遜;3.org.json適用於簡單任務(wù)或小腳本,不推薦用於大型項(xiàng)目,因其靈活性和類型安全不足。選擇應(yīng)根據(jù)實(shí)際需求決定。

在Outlook中快速新建郵件的方法如下:1.桌面版使用快捷鍵Ctrl Shift M,可直接彈出新郵件窗口;2.網(wǎng)頁版可通過創(chuàng)建包含JavaScript的書籤(如javascript:document.querySelector("divrole='button'").click())實(shí)現(xiàn)一鍵新建郵件;3.使用瀏覽器插件(如Vimium、CrxMouseGestures)自定義快捷鍵觸發(fā)“新建郵件”按鈕;4.Windows用戶還可通過右鍵任務(wù)欄Outlook圖標(biāo)選擇“新建電
