Java面試黃金寶典15

1. 請找出增序排列中一個數字第一次和最后一次出現的數組下標

  • 定義

由于數組是增序排列的,我們可以利用二分查找的特性來高效地定位目標數字。對于查找第一次出現的位置,當中間元素等于目標數字時,我們需要繼續向左搜索,以確保找到最左邊的目標數字;對于查找最后一次出現的位置,當中間元素等于目標數字時,我們需要繼續向右搜索,以確保找到最右邊的目標數字。

  • 要點
  1. 采用二分查找算法,其時間復雜度為 O(logn),可以大大提高查找效率。
  2. 分別編寫兩個二分查找函數,一個用于查找第一次出現的位置,另一個用于查找最后一次出現的位置。

代碼示例

java

public class FindFirstAndLastPosition {public static int[] searchRange(int[] nums, int target) {int first = findFirst(nums, target);int last = findLast(nums, target);return new int[]{first, last};}private static int findFirst(int[] nums, int target) {int left = 0, right = nums.length - 1;int result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1;if (nums[mid] == target) {result = mid;}} else {left = mid + 1;}}return result;}private static int findLast(int[] nums, int target) {int left = 0, right = nums.length - 1;int result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] <= target) {left = mid + 1;if (nums[mid] == target) {result = mid;}} else {right = mid - 1;}}return result;}public static void main(String[] args) {int[] nums = {1, 2, 2, 2, 3, 4, 4, 5};int target = 2;int[] range = searchRange(nums, target);System.out.println("First position: " + range[0]);System.out.println("Last position: " + range[1]);}
}

  • 應用

若數組不是嚴格增序,存在重復元素且可能有相等元素打亂順序的情況,可先對數組進行排序,再使用上述方法。不過排序會增加額外的時間復雜度,如使用快速排序,時間復雜度為 O(nlogn)。

2. 如何實現海量數據去重

  • 定義
  1. 哈希表:利用哈希表的特性,其鍵具有唯一性。將數據作為鍵插入哈希表中,重復的數據會自動覆蓋,最終哈希表中的鍵即為去重后的數據。
  2. 位圖(BitMap):對于整數數據,位圖是一個不錯的選擇。位圖是一個二進制數組,每個位代表一個數據,通過設置相應位的值來標記數據的出現情況。

  • 要點
  1. 哈希表適用于各種類型的數據,但需要較多的內存空間,空間復雜度為 O(n)。
  2. 位圖適用于整數數據,內存占用較小,但數據范圍不能太大。

代碼示例(哈希表)

java

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class MassiveDataDeduplication {public static List<Integer> deduplicate(List<Integer> data) {Set<Integer> set = new HashSet<>();List<Integer> result = new ArrayList<>();for (int num : data) {if (set.add(num)) {result.add(num);}}return result;}public static void main(String[] args) {List<Integer> data = List.of(1, 2, 2, 3, 4, 4, 5);List<Integer> deduplicatedData = deduplicate(data);System.out.println(deduplicatedData);}
}

  • 應用

當數據量極大,無法全部加載到內存時,可采用分治策略。將數據分成多個小文件,分別對每個小文件進行去重,最后再合并結果。這樣可以降低單次處理的數據量,避免內存溢出。

3. 如何找出海量數據中前 10 個最大的數(數據有重復)

  • 定義

可以使用最小堆來解決該問題。首先創建一個大小為 10 的最小堆,將前 10 個數據插入堆中。然后遍歷剩余的數據,如果當前數據大于堆頂元素,則將堆頂元素替換為當前數據,并調整堆,以保持最小堆的性質。最后堆中的元素就是前 10 個最大的數。

  • 要點
  1. 最小堆的時間復雜度為 O(nlogk),其中 n 是數據的總數,k 是要找的最大數的個數。
  2. 堆的插入和刪除操作的時間復雜度為 O(logk)。

代碼示例

java

import java.util.PriorityQueue;public class TopKNumbers {public static int[] topK(int[] nums, int k) {PriorityQueue<Integer> minHeap = new PriorityQueue<>(k);for (int i = 0; i < nums.length; i++) {if (i < k) {minHeap.offer(nums[i]);} else if (nums[i] > minHeap.peek()) {minHeap.poll();minHeap.offer(nums[i]);}}int[] result = new int[k];for (int i = k - 1; i >= 0; i--) {result[i] = minHeap.poll();}return result;}public static void main(String[] args) {int[] nums = {3, 2, 1, 5, 6, 4};int k = 2;int[] topK = topK(nums, k);for (int num : topK) {System.out.print(num + " ");}}
}

  • 應用

可以考慮使用分布式算法,將數據分散到多個節點上,每個節點找出自己的前 10 個最大的數,然后將這些結果合并,再找出最終的前 10 個最大的數。這樣可以充分利用分布式系統的并行計算能力,提高處理效率。

4. 數組先升序在降序,找出最大數

  • 定義

由于數組先升序后降序,我們可以使用二分查找來找到最大數。通過比較中間元素和其相鄰元素的大小,來判斷最大數在左半部分還是右半部分。

  • 要點
  1. 二分查找的時間復雜度為 O(logn),可以高效地找到最大數。
  2. 比較中間元素和其相鄰元素的大小,以此來確定最大數的位置。

代碼示例

java

public class FindMaxInAscDescArray {public static int findMax(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < nums[mid + 1]) {left = mid + 1;} else {right = mid;}}return nums[left];}public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5, 4, 3, 2, 1};int max = findMax(nums);System.out.println("Max number: " + max);}
}

  • 應用

若數組中有重復元素,需要對二分查找的條件進行適當調整。例如,當中間元素與其相鄰元素相等時,需要進一步判斷左右兩側的趨勢。

5. 正整數數組,如何拼出一個最大的正數

  • 定義

自定義排序規則,將數組中的元素進行排序。排序規則是將兩個元素拼接成兩個字符串,比較這兩個字符串的大小,將拼接后較大的字符串對應的元素排在前面。

  • 要點
  1. 自定義排序規則,使用 Comparator 接口。
  2. 將元素拼接成字符串進行比較。

代碼示例

java

import java.util.Arrays;
import java.util.Comparator;public class LargestNumber {public static String largestNumber(int[] nums) {String[] strs = new String[nums.length];for (int i = 0; i < nums.length; i++) {strs[i] = String.valueOf(nums[i]);}Arrays.sort(strs, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return (s2 + s1).compareTo(s1 + s2);}});if (strs[0].equals("0")) {return "0";}StringBuilder sb = new StringBuilder();for (String str : strs) {sb.append(str);}return sb.toString();}public static void main(String[] args) {int[] nums = {3, 30, 34, 5, 9};String largest = largestNumber(nums);System.out.println("Largest number: " + largest);}
}

  • 應用

若數組中包含負數,需要先將負數進行處理,例如將負數轉換為正數,或者在排序時單獨處理負數。

6. 一個正整數數組,給其中一個數字加 1,使得所有數乘積最大,找出加 1 的那個數字

  • 定義

遍歷數組,計算給每個數字加 1 后的所有數的乘積,找出乘積最大時對應的數字。

  • 要點
  1. 遍歷數組,計算每種情況下的乘積。
  2. 記錄最大乘積和對應的數字下標。

代碼示例

java

public class MaxProductAfterIncrement {public static int findNumberToIncrement(int[] nums) {int maxProduct = Integer.MIN_VALUE;int index = -1;for (int i = 0; i < nums.length; i++) {int product = 1;for (int j = 0; j < nums.length; j++) {if (j == i) {product *= (nums[j] + 1);} else {product *= nums[j];}}if (product > maxProduct) {maxProduct = product;index = i;}}return index;}public static void main(String[] args) {int[] nums = {1, 2, 3};int index = findNumberToIncrement(nums);System.out.println("Index of number to increment: " + index);}
}

  • 應用

可以考慮優化算法,通過數學推導找出更高效的方法。例如,分析數組元素的大小關系,找出對乘積影響最大的元素。

7. 手寫快排、堆排 二分查找

  • 快速排序

java

public class QuickSort {public static void quickSort(int[] nums, int left, int right) {if (left < right) {int pivotIndex = partition(nums, left, right);quickSort(nums, left, pivotIndex - 1);quickSort(nums, pivotIndex + 1, right);}}private static int partition(int[] nums, int left, int right) {int pivot = nums[right];int i = left - 1;for (int j = left; j < right; j++) {if (nums[j] < pivot) {i++;swap(nums, i, j);}}swap(nums, i + 1, right);return i + 1;}private static void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public static void main(String[] args) {int[] nums = {3, 2, 1, 5, 6, 4};quickSort(nums, 0, nums.length - 1);for (int num : nums) {System.out.print(num + " ");}}
}

  • 堆排序

java

public class HeapSort {public static void heapSort(int[] nums) {int n = nums.length;// 構建最大堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(nums, n, i);}// 一個個交換元素for (int i = n - 1; i > 0; i--) {// 將堆頂元素(最大值)與當前未排序部分的最后一個元素交換int temp = nums[0];nums[0] = nums[i];nums[i] = temp;// 重新調整堆heapify(nums, i, 0);}}private static void heapify(int[] nums, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;// 如果左子節點大于根節點if (left < n && nums[left] > nums[largest]) {largest = left;}// 如果右子節點大于當前最大節點if (right < n && nums[right] > nums[largest]) {largest = right;}// 如果最大節點不是根節點if (largest != i) {int swap = nums[i];nums[i] = nums[largest];nums[largest] = swap;// 遞歸調整受影響的子樹heapify(nums, n, largest);}}public static void main(String[] args) {int[] nums = {3, 2, 1, 5, 6, 4};heapSort(nums);for (int num : nums) {System.out.print(num + " ");}}
}

  • 二分查找

java

public class BinarySearch {public static int binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;}public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5};int target = 3;int index = binarySearch(nums, target);System.out.println("Index of target: " + index);}
}

8. 手寫單詞接龍的程序

java

import java.util.*;public class WordChain {public static boolean isValidChain(List<String> words) {if (words.size() <= 1) {return true;}for (int i = 1; i < words.size(); i++) {String prev = words.get(i - 1);String curr = words.get(i);if (prev.charAt(prev.length() - 1) != curr.charAt(0)) {return false;}}return true;}public static void main(String[] args) {List<String> words = Arrays.asList("apple", "elephant", "tiger");boolean isValid = isValidChain(words);System.out.println("Is valid chain: " + isValid);}
}

9. 如何實現括號匹配

  • 定義

使用棧來實現括號匹配。遍歷字符串,遇到左括號時將其壓入棧中,遇到右括號時,檢查棧頂元素是否為對應的左括號,如果是則彈出棧頂元素,否則返回不匹配。最后檢查棧是否為空,如果為空則匹配成功。

  • 要點
  1. 使用棧來存儲左括號。
  2. 遍歷字符串,根據括號類型進行相應的操作。

代碼示例

java

import java.util.Stack;public class BracketMatching {public static boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(' || c == '[' || c == '{') {stack.push(c);} else {if (stack.isEmpty()) {return false;}char top = stack.pop();if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {return false;}}}return stack.isEmpty();}public static void main(String[] args) {String s = "()[]{}";boolean isValid = isValid(s);System.out.println("Is valid: " + isValid);}
}

  • 應用

可以考慮處理多種類型的括號嵌套的情況,以及處理包含其他字符的字符串。在處理時,需要忽略非括號字符,只對括號進行匹配檢查。

10. 一個數組存著負數與正數,將正數放在前面,負數放在后面

  • 定義

使用雙指針法,一個指針從左往右遍歷,一個指針從右往左遍歷。當左指針指向負數,右指針指向正數時,交換兩個指針所指的元素。

  • 要點
  1. 使用雙指針,時間復雜度為 O(n)。
  2. 交換元素的位置。

代碼示例

java

public class RearrangeArray {public static void rearrange(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {while (left < right && nums[left] > 0) {left++;}while (left < right && nums[right] < 0) {right--;}if (left < right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;}}}public static void main(String[] args) {int[] nums = {1, -2, 3, -4, 5};rearrange(nums);for (int num : nums) {System.out.print(num + " ");}}
}

  • 應用

若要保持正數和負數的相對順序不變,可以使用額外的數組來實現。先將正數存入一個數組,再將負數存入另一個數組,最后將兩個數組合并。不過這種方法會增加額外的空間復雜度,為 O(n)。

?友情提示:本文已經整理成文檔,可以到如下鏈接免積分下載閱讀

https://download.csdn.net/download/ylfhpy/90535149

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

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

相關文章

CentOS 7安裝 mysql

CentOS 7安裝 mysql 1. yum 安裝 mysql 配置mysql源 yum -y install mysql57-community-release-el7-10.noarch.rpm安裝MySQL服務器 yum -y install mysql-community-server啟動MySQL systemctl start mysqld.service查看MySQL運行狀態&#xff0c;運行狀態如圖&#xff…

科軟25機試

題目: 2025科軟復試上機題&#xff08;回憶版&#xff09;題解_嗶哩嗶哩_bilibili 1. 字符串反轉 #include<bits/stdc.h> using namespace std;void solve(string& a, int CurN) {if (!(CurN % 2)) {int right a.size() - 1;int left 0;while (left < right)…

Oracle相關的面試題

以下是150道Oracle相關的面試題&#xff0c;涵蓋了Oracle的基礎概念、架構、SQL與PL/SQL、性能調優、高可用性、備份與恢復、安全、分區與索引、存儲與內存管理、網絡與連接、版本與升級等方面&#xff0c;希望對你有所幫助。 Oracle基礎概念 1. 什么是Oracle數據庫&#xff1…

docker安裝,鏡像,常用命令,Docker容器卷,Docker應用部署,自定義鏡像,Docker服務編排,創建私有倉庫

1.為什么使用docker 如果開發環境和測試環境的允許軟件版本不一致&#xff0c;可能會導致項目無法正常啟動 把環境和項目一起打包發送給測試環境 1.1docker的概念 開源的應用容器引擎&#xff0c;完全使用沙箱機制&#xff0c;相互隔離&#xff0c;容器性能開銷極低 一種容…

ES 字段的映射定義了字段的類型及其行為

在 Elasticsearch 中&#xff0c;字段的映射定義了字段的類型及其行為。你提供的 content_answer 字段映射如下&#xff1a; Json 深色版本 "content_answer": { "type": "text", "fields": { "keyword": { …

Manus的開源替代者之一:OpenManus通用AI智能體框架解析及產品試用

引言 在AI智能體領域&#xff0c;Monica團隊近期發布的Manus被譽為全球首個通用型AI智能體。該項目推出后迅速爆紅&#xff0c;邀請碼一號難求&#xff0c;隨之而來的是各路開發者快速構建了眾多類似的開源替代方案。其中&#xff0c;MetaGPT團隊的5位工程師僅用3小時就開發完…

Linux MariaDB部署

1&#xff1a;查看Linux系統版本 cat /etc/os-release#返回結果&#xff1a; NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI…

PHP MySQL 預處理語句

PHP MySQL 預處理語句 引言 在PHP中與MySQL數據庫進行交互時,預處理語句是一種非常安全和高效的方法。預處理語句不僅可以防止SQL注入攻擊,還可以提高數據庫查詢的效率。本文將詳細介紹PHP中預處理語句的用法,包括其基本概念、語法、優勢以及在實際開發中的應用。 預處理…

算法 | 2024最新算法:鳑鲏魚優化算法原理,公式,應用,算法改進研究綜述,matlab代碼

2024最新鳑鲏魚優化算法(BFO)研究綜述 鳑鲏魚優化算法(Bitterling Fish Optimization, BFO)是2024年提出的一種新型群智能優化算法,受鳑鲏魚獨特的繁殖行為啟發,通過模擬其交配、產卵和競爭機制進行全局優化。該算法在多個領域展現出優越性能,尤其在解決復雜非線性問題中…

HDR(HDR10/ HLG),SDR

以下是HDR&#xff08;HDR10/HLG&#xff09;和SDR的詳細解釋&#xff1a; 1. SDR&#xff08;Standard Dynamic Range&#xff0c;標準動態范圍&#xff09; ? 定義&#xff1a;SDR是傳統的動態范圍標準&#xff0c;主要用于8位色深的視頻顯示&#xff0c;動態范圍較窄&…

uni-app頁面怎么設計更美觀

頂部 頁面最頂部要獲取到手機設備狀態欄的高度&#xff0c;避免與狀態欄重疊或者被狀態欄擋住 // 這是最頂部的父級容器 <view :style"{ paddingTop: ${statusBarHeight extraPadding}px }">.... </view> export default {data() {return {statusBarH…

江西核威環保科技:打造世界前沿的固液分離設備高新企業

隨著市場經濟的不斷發展&#xff0c;消費者的需求越來越大&#xff0c;為了更好的服務廣大新老客戶&#xff0c;作為知名品牌的“江西核威環保科技有限公司&#xff08;以下簡稱江西核威環保科技&#xff09;”&#xff0c;將堅持以“服務為企業宗旨&#xff0c;全力打造世界前…

Ethernet(以太網)詳解

一、Ethernet的定義與核心特性 以太網&#xff08;Ethernet&#xff09;是一種 基于IEEE 802.3標準的局域網&#xff08;LAN&#xff09;技術&#xff0c;用于設備間通過有線或光纖介質進行數據通信。其核心特性包括&#xff1a; 標準化&#xff1a;遵循IEEE 802.3系列協議&am…

JBDev - Theos下一代越獄開發工具

JBDev - Theos下一代越獄開發工具 自越獄誕生以來&#xff0c;Theos一直是越獄開發的主流工具&#xff0c;大多數開發者使用Theos編譯代碼&#xff0c;再用lldb手動調試。JBDev簡化了這個過程&#xff0c;項目地址https://github.com/lich4/JBDev 簡介 JBDev用于Xcode越獄開…

黑蘋果及OpenCore Legacy Patcher

黑蘋果及OpenCore Legacy Patcher OpenCoreUnable to resolve dependencies, error code 71 OpenCore Unable to resolve dependencies, error code 71 黑蘋果升級后打補丁不成功&#xff0c;比如提示以下錯誤&#xff0c;可參考官方文檔進行修復。 Open TerminalType sudo …

el-table + el-pagination 前端實現分頁操作

el-table el-pagination 前端實現分頁操作 后端返回全部列表數據&#xff0c;前端進行分頁操作 html代碼 <div><el-table :data"tableData" border><el-table-column label"序號" type"index" width"50" /><el…

PTA 1097-矩陣行平移

給定一個&#x1d45b;&#x1d45b;nn的整數矩陣。對任一給定的正整數&#x1d458;<&#x1d45b;k<n&#xff0c;我們將矩陣的奇數行的元素整體向右依次平移1、……、&#x1d458;、1、……、&#x1d458;、……1、……、k、1、……、k、……個位置&#xff0c;平移…

C++藍橋杯實訓篇(一)

片頭 嗨~小伙伴們&#xff0c;大家好&#xff01;現在我們來到實訓篇啦~本篇章涉及算法知識&#xff0c;比基礎篇稍微難一點&#xff0c;我會盡量把習題講的通俗易懂。準備好了嗎&#xff1f;咱們開始咯&#xff01; 第1題 遞歸實現指數型枚舉 我們先畫個圖~ 從圖中&#xff…

#C8# UVM中的factory機制 #S8.5# 對factory機制的重載進一步思考

前面的重載,我們已經談了很多,為什么還需要進一步聊聊呢。作為碼農,我們喜歡拿來多種相近語言,進行對比理解,相信這是一種加深對問題理解的方式。 一 C++ 重載 在 C++ 中,重載 和 多態 的英文術語分別是:重載 → Overloading ;多態 → Polymorphism 重載的定義:在…

CentOS(最小化)安裝之后,快速搭建Docker環境

本文以VMware虛擬機中安裝最小化centos完成后開始。 1. 檢查網絡 打開網卡/啟用網卡 執行命令ip a查看當前的網絡連接是否正常&#xff1a; 如果得到的結果和我一樣&#xff0c;有ens網卡但是沒有ip地址&#xff0c;說明網卡未打開 手動啟用&#xff1a; nmcli device sta…