面试常考简单操作

参考文章

面试常考简单操作

    • 快速排序
    • 归并排序
    • 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.mzph.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;并提供最佳的项目组织方式。 前言 本文以复制文本的自定义指令详细介绍自定义指令的基础知识 多个自定义指令如何进行…