面試常考簡單操作

參考文章

面試常考簡單操作

    • 快速排序
    • 歸并排序
    • Dijkstra
    • 自定義排序
    • 交替打印奇偶數
    • 冒泡排序
    • 插入排序
    • 堆排序
    • 歐幾里得算法求最大公約數
    • 單例模式的雙重校驗
    • LRU

快速排序

public class Solution {private static int partition(int[] arr, int left, int right) {int temp = arr[left];	// 1while(left < right) {while(left < right && temp <= arr[right]) right--;arr[left] = arr[right];	// 2while(left < right && temp >= arr[left]) left++;arr[right] = arr[left];	// 3}arr[left] = temp;	// 4return left;}private static void quicSort(int[] arr, int left, int right) {if(left<right) {int mid = partition(arr, left, right);quicSort(arr,left, mid-1);quicSort(arr,mid+1, right);}}public static void main(String[] args) {int[] arr = {3,5,1,32,8,5,3,0};quicSort(arr, 0, arr.length-1);Arrays.stream(arr).forEach((n)->{System.out.print(n + " ");});}
}
  • 時間復雜度O( n l o g n nlogn nlogn):快排使用的是遞歸,需要做logn次分割,而每次劃分需要找對應的基準元素,需要O(n)時間。
  • 空間復雜度O( l o g n logn logn):平均情況下,遞歸樹的高度為logn。

歸并排序

public class Solution {// 主要是這里,對于兩個有序數組合并,是挺簡單的。// 如何把它拆分出來是一個問題。private static int[] mergeSort(int[] arr, int left, int right) {if(left == right) { //長度為1,直接放回return new int[]{arr[left]};}int mid = ((right - left) >> 1 ) + left;int[] l = mergeSort(arr, left, mid);int[] r = mergeSort(arr, mid+1, right);return mergeTwoArray(l,r);}// 歸并思想挺簡單的,如下private static int[] mergeTwoArray(int[] l, int[] r) {int[] res = new int[l.length+r.length];int left = 0, right = 0, index = 0;while(left < l.length && right < r.length) {if(l[left] < r[right]) {res[index++] = l[left++];}else {res[index++] = r[right++];}}while(left < l.length) {res[index++] = l[left++];}while(right < r.length) {res[index++] = r[right++];}return res;}public static void main(String[] args) {int[] arr = {3,5,1,32,8,5,3,0};int[] res = mergeSort(arr, 0, arr.length-1);    // 注意這里不是原地排序的,是新開辟一個空間Arrays.stream(res).forEach((n)->{System.out.print(n + " ");});}
}
  • 時間復雜度O( n l o g n nlogn nlogn):無論原始數組的順序如何,歸并排序都需要將數組不斷地分成兩半,然后再合并,總共需要進行logn
    層的劃分和合并操作,每層操作都需要遍歷 O(n)個元素。

  • 空間復雜度O( n n n):需要額外的輔助數組。

Dijkstra

package com.zy;import java.util.Arrays;public class Solution {private static final int INF = Integer.MAX_VALUE;public static int[] dijkstra(int[][] graph, int src) {int n = graph.length;int[] dist = new int[n];boolean[] sptSet = new boolean[n];//初始化距離數組和最短路徑集合Arrays.fill(dist, INF);dist[src] = 0;// 每次循環找到距離src最近的一個節點,總共循環n-1次for (int count = 0; count < n - 1; count++) {//找到最近節點uint u = minDistance(dist, sptSet);sptSet[u] = true;// 加入u后,各個節點的變化for (int v = 0; v < n; v++) {// 要是還沒處理,且u和v是可達的,且剛剛更新的最近節點u不是不可達的,且更新后的距離更短if (!sptSet[v] && graph[u][v] != 0 && dist[u] != INF && dist[u] + graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v];}}}return dist;}private static int minDistance(int[] dist, boolean[] sptSet) {int min = INF, minIndex = -1;for (int v = 0; v < dist.length; v++) {if (!sptSet[v] && dist[v] <= min) {min = dist[v];minIndex = v;}}return minIndex;}public static void main(String[] args) {int[][] graph = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};int src = 0;int[] dist = dijkstra(graph, src);System.out.println("從頂點 " + src + " 到各頂點的最短距離為:");for (int i = 0; i < dist.length; i++) {System.out.println("到頂點 " + i + " 的最短距離是:" + dist[i]);}}
}
  • 時間復雜度O( n 2 n^2 n2):由于使用了鄰接矩陣存儲圖,每次查找距離源點最近的頂點需要遍歷所有頂點,更新距離也需要遍歷所有頂點。
  • 空間復雜度O( n n n):主要使用了 dist 數組和 sptSet 數組來存儲距離和標記頂點是否已處理

自定義排序

思考Comparator和Comparable的區別
在這里插入圖片描述

實現Comparator接口實現。

package com.zy;import java.util.Arrays;
import java.util.Comparator;class Student implements Comparable<Student>{int age;int score;public Student(int age, int score) {this.age = age;this.score = score;}@Overridepublic int compareTo(Student o) {if(this.age != o.age) {return this.age - o.age;}return o.score - this.score;}
}public class Solution {public static void main(String[] args) {Student[] stu = new Student[3];stu[0] = new Student(10,13);stu[1] = new Student(5, 4);stu[2] = new Student(5,33);// 法1Arrays.sort(stu, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {if(o1.age != o2.age) {return o1.age - o2.age;}return o2.score - o1.score;}});// 法2Arrays.sort(stu, (o1,o2)-> {if(o1.age != o2.age) {return o1.age - o2.age;}return o2.score - o1.score;});// 法3(用Comparable實現默認排序)Arrays.sort(stu);Arrays.stream(stu).forEach(student -> {System.out.println(student.age + " " + student.score);});}
}

交替打印奇偶數

package com.zy;class AlterPrint {private static final Object lock = new Object();private static final int MAX = 200;private static int count = 0;// 打印,喚醒,看有沒有終止,有就結束,沒有就等待void printNumber() {synchronized (lock) {while(true) {System.out.println(Thread.currentThread().getName() + "打印" + count++);lock.notify();if(count>=MAX) {lock.notifyAll(); //在徹底退出之前,最好都喚醒,不然某些線程會一直等待。break;}try {lock.wait();}catch (InterruptedException e) {e.printStackTrace();}}}}}public class Solution {public static void main(String[] args) {// 實現兩個線程交替打印奇偶AlterPrint alterPrint = new AlterPrint();Thread thread0 = new Thread(alterPrint::printNumber, "線程1");Thread thread1 = new Thread(alterPrint::printNumber, "線程2");thread0.start();thread1.start();}}

冒泡排序

public class Solution {private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}private static void bubbleSort(int[] arr) {for(int i=0;i<arr.length;i++) {boolean flag = true;for(int j=arr.length-1;j>i;j--) {if(arr[j-1] > arr[j]) {swap(arr, j-1, j);flag = false;}}if(flag) break;}}public static void main(String[] args) {int[] arr = {3,4,6,8,3,1,0,22,10};bubbleSort(arr);for(int i : arr) {System.out.println(i);}}}

插入排序

public class Solution {private static void InsertSort(int[] arr) {for(int i=1;i<arr.length;i++) {int key = arr[i];   // 要排序的數字int j = i-1;    // 從有序數組的尾部開始比較while(j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}}public static void main(String[] args) {int[] arr = {3,4,6,8,3,1,0,22,10};InsertSort(arr);for(int i : arr) {System.out.println(i);}}
}

堆排序

package com.zy;import java.util.Scanner;public class Main {// 調整有效大小為n的堆中的i節點private static void adjust(int[] nums, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;// 找左右節點跟節點i中最大的節點索引 : largestif(left < n && nums[left] > nums[largest]) {largest = left;}if(right < n && nums[right] > nums[largest]) {largest = right;}if(largest != i) {  // 如果節點i需要往下調整// 跟最大的節點替換后int tmp = nums[i];nums[i] = nums[largest];nums[largest] = tmp;// 接著繼續向下調整adjust(nums,n,largest);}}private static void heapSort(int[] arr) {int n = arr.length;// 調整數組,使得父節點>子節點,從最后一個非葉子節點開始for(int i=n/2-1;i>=0;i--) {     // 自己小推一下就知道了adjust(arr, n, i);}// i*2-1for(int i=n-1;i>0;i--) {// 當前父節點移動到末尾(這里他就是排到正確位置了)int temp = arr[0];arr[0] = arr[i];arr[i] = temp;// 剩下部分繼續調整adjust(arr, i, 0);}}public static void main(String[] args) {int[] arr = {3,1,2,5,7,4};heapSort(arr);for(int num : arr) {System.out.print(num + " ");}}
}

歐幾里得算法求最大公約數

static int gcb(int a, int b) {if(b==0) return a;return gcb(b, a%b);
}

單例模式的雙重校驗

package com.zy;public class Singleton {private volatile static Singleton singletonInstance;private Singleton(){}public static Singleton getSingleton(){if(singletonInstance == null) {synchronized (Singleton.class) {if(singletonInstance == null) {singletonInstance = new Singleton();}}}return singletonInstance;}
}

LRU


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

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

相關文章

2025圖像處理和深度學習國際學術會議(IPDL 2025)

重要信息 官網&#xff1a;www.IPDL.xyz 時間&#xff1a;2025年4月11-13日 地點&#xff1a;中國-成都 簡介 隨著深度學習和圖像處理技術的迅速發展&#xff0c;相關技術的應用逐漸滲透到各個行業&#xff0c;如醫療影像分析、自動駕駛、安防監控和智能制造等。這些應用的…

RNN萬能逼近定理證明

RNN萬能逼近定理證明 RNN原理圖和數學表達式RNN的萬能逼近定理及其證明證明 RNN原理圖和數學表達式 s t U h t ? 1 W x t b ∈ R D h s_tUh_{t-1}Wx_tb\in\mathbb{R}^{D_h} st?Uht?1?Wxt?b∈RDh? s t ∈ R D h s_t\in\mathbb{R}^{D_h} st?∈RDh? U ∈ R D h D h U\…

算力重構營銷生態:廣電數字人 “造星“ 運動背后的智能革命

一、數字人 "造星" 運動&#xff1a;廣電行業的智能覺醒 當陜西廣電的虛擬主播 "小雅" 在柞水縣融媒體中心實現日更 100 秒新聞&#xff0c;當湖北廣電的 "王丹" 從新聞主播轉型為城市文化 IP&#xff0c;一場由算力驅動的數字人 "造星&qu…

大數據Spark(五十六):Spark生態模塊與運行模式

文章目錄 Spark生態模塊與運行模式 一、Spark生態模塊 二、Spark運行模式 Spark生態模塊與運行模式 一、Spark生態模塊 Spark 生態模塊包括&#xff1a;SparkCore、SparkSQL、SparkStreaming、StructuredStreaming、MLlib 和 GraphX。與 Hadoop 相關的整個技術生態如下所示…

Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central

具體錯誤 [ERROR] Failed to execute goal on project datalink-resource: Could not resolve dependencies for project com.leon.datalink:datalink-resource:jar:1.0.0: Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central (https://repo.maven…

運營商在網狀態查詢API接口如何對接?

運營商在網狀態查詢 API 接口是一種能夠讓開發者通過編程方式查詢手機號碼在運營商網絡中當前狀態的應用程序接口。該接口是一組規范和協議&#xff0c;允許第三方開發者通過特定的編程方式與運營商的系統進行交互&#xff0c;以查詢手機號碼在運營商網絡中的當前狀態。 運營商…

【JavaScript】---- 數組的交集,并集,差集的實現,以及Set對象的交集,并集,差集的詳細介紹和使用

1. 前言 數組的交集,并集,差集的實現。其實本質來說都不算難,但是 Set 類直接實現這些方法,所以我們先自己實現一下,然后再講解一下 Set 類的相同方法。 2. intersection 交集 用數學公式,交集被表示為: A ∩ B = { x ∈ A ∣ x ∈ B } A \cap B = \{x \in A \mid x…

青銅與信隼的史詩——TCP與UDP的千年博弈

點擊下面圖片帶您領略全新的嵌入式學習路線 &#x1f525;爆款熱榜 88萬閱讀 1.6萬收藏 第一章 契約之匣與自由之羽 熔巖尚未冷卻的鑄造臺上&#xff0c;初代信使長歐諾彌亞將液態秘銀倒入雙生模具。左側模具刻著交握的青銅手掌&#xff0c;右側則是展開的隼翼紋章。當星辰…

SpringBoot的日志框架

目錄 默認日志框架 日志配置 更換日志框架 排除默認Logback 引入目標日志框架 添加配置文件 logback.xml SpringBoot的核心設計宗旨是約定大于配置&#xff0c;很多框架功能都給你默認加載和配置完成供你使用&#xff0c;但這就要求使用者對框架有一定的理解和改造能力&am…

今日行情明日機會——20250403

今日漲停的主要行業方向分析&#xff08;2025-04-03&#xff09; 1. 貿易戰相關概念&#xff08;13家漲停&#xff09; 細分領域&#xff1a;外貿、稀土永磁、中日韓貿易、物流、港口。代表個股&#xff1a; 外貿&#xff1a;愛麗家居、派斯林、迪生力&#xff08;受特朗普宣布…

Vue3使用富文本編輯器vue-quill 自定義圖片上傳、文件上傳

一、引入依賴 // npm install vueup/vue-quill^1.2.0 quill^1.3.7"vueup/vue-quill": "^1.2.0","quill": "^1.3.7", 二、在vue文件中使用 <templete><div class"editor-container" v-if"show"><…

k8s pod重啟順序說明

在 Kubernetes 中&#xff0c;Pod 的重啟順序由 控制器類型 和 Pod 管理策略 共同決定。以下是不同場景下的詳細規則和底層邏輯&#xff1a; 一、Pod 重啟的觸發場景 場景類型觸發原因控制方容器崩潰重啟容器進程退出&#xff08;如異常、OOM&#xff09;kubelet&#xff08;…

Modbus RTU與TCP通信示例

準備工作 安裝 libmodbus 庫 Linux (Debian/Ubuntu): sudo apt-get install libmodbus-dev Windows: 下載預編譯庫 libmodbus for Windows&#xff0c;并配置開發環境。 示例 1.Modbus RTU (串行通信) #include <stdio.h> #include <modbus/modbus.h> ? int…

maven項目添加第三方JAR包

項目開發過程中&#xff0c;不可避免的需要用到一些maven庫&#xff08;公共庫、司庫等&#xff09;中沒有的冷門jar包依賴&#xff0c;這時&#xff0c;可以將這些第三方JAR包安裝到本地maven倉庫中&#xff0c;實現項目依賴的一致性。具體步驟如下&#xff1a; 1、下載jar包 …

Sentinel實戰(三)、流控規則之流控效果及流控小結

spring cloud Alibaba-Sentinel實戰&#xff08;三&#xff09;、流控效果流控小結 一、流控規則&#xff1a;流控效果一&#xff09;、流控效果&#xff1a;預熱1、概念含義2、案例流控規則設置測試結果 二&#xff09;、流控效果&#xff1a;排隊等待1、概念含義2、案例流控規…

c++ (通用引用)和(左值引用)區別

問&#xff1a; for (auto &&ipKF : vpKFs) {} 使用 一個& 和 兩個&& 區別和聯系&#xff1f; c 在 C 中&#xff0c;auto&& 和 auto& 在范圍基于的 for 循環中有重要的區別&#xff0c;涉及到引用類型和值類別的處理。讓我們詳細解釋它們的區…

使用高德api實現天氣查詢

創建應用獲取 Key 天氣查詢-基礎 API 文檔-開發指南-Web服務 API | 高德地圖API 代碼編寫 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

XEOS 與 AutoMQ 推出聯合方案,共筑云原生 Kafka 新生態

近日&#xff0c;XSKY 星辰天合旗下企業級對象存儲產品 XEOS 與 AutoMQ 云原生消息隊列系統完成了產品兼容性適配互認證&#xff0c;致力于為客戶在私有云和混合云環境中提供云原生的 Kafka 解決方案。 在云計算和大數據時代&#xff0c;消息隊列作為分布式系統的重要組成部分…

Synology NAS 部署WPS-Office

記錄在群暉NAS上部署WPS-Office實現網頁上編輯文檔 目錄 1.思考及想法由來2.問題解決2.1 群暉NAS Docker使用2.2 部署wps-office參考1:【Docker+WPS Office】遠程辦公:Docker + WPS Office 私人云辦公室2.3 群暉NAS映射文件夾權限參考1:參考2:群暉NAS中普通用戶獲取Docker容…

Vue自定義指令最佳實踐教程

Vue 3 顯著增強了自定義指令的功能&#xff0c;使其封裝更加靈活和易用。本文將分為基礎和進階兩部分&#xff0c;介紹如何實現常用的自定義指令&#xff0c;并提供最佳的項目組織方式。 前言 本文以復制文本的自定義指令詳細介紹自定義指令的基礎知識 多個自定義指令如何進行…