Android第十二次面试-多线程和字符串算法总结
多线程的创建与常见使用方法
一、多线程创建方式
1. 继承Thread类
class MyThread extends Thread {@Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() + " is running");}
}// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
2. 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is running");}
}// 使用
Thread thread = new Thread(new MyRunnable());
thread.start();
3. Android特有方式
// HandlerThread(自带Looper)
HandlerThread handlerThread = new HandlerThread("WorkerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper()) {@Overridepublic void handleMessage(Message msg) {// 后台线程处理消息}
};// 发送消息
handler.sendEmptyMessage(0);
二、线程池使用(推荐方式)
1. 创建线程池
// 固定大小线程池
ExecutorService fixedPool = Executors.newFixedThreadPool(4);// 缓存线程池(自动扩容)
ExecutorService cachedPool = Executors.newCachedThreadPool();// 单线程池(顺序执行)
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
2. 提交任务
// 执行Runnable任务
fixedPool.execute(() -> {System.out.println("Task running in thread pool");
});// 提交Callable任务并获取Future
Future<String> future = fixedPool.submit(() -> {return "Task result";
});
3. 自定义线程池
ThreadPoolExecutor customPool = new ThreadPoolExecutor(4, // 核心线程数10, // 最大线程数60, // 空闲线程存活时间(秒)TimeUnit.SECONDS,new LinkedBlockingQueue<>(100) // 任务队列
);// 拒绝策略(当队列满时)
customPool.setRejectedExecutionHandler((task, executor) -> {System.err.println("Task rejected: " + task);
});
1. 交替打印数字(两个线程协作)
题目:两个线程交替打印1~100,一个线程打印奇数,另一个打印偶数
public class AlternatePrint {private int num = 1;private final Object lock = new Object();public void printOdd() {synchronized (lock) {while (num <= 100) {if (num % 2 == 1) {System.out.println(Thread.currentThread().getName() + ": " + num++);lock.notify(); // 唤醒偶数线程} else {try {lock.wait(); // 等待偶数线程通知} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public void printEven() {synchronized (lock) {while (num <= 100) {if (num % 2 == 0) {System.out.println(Thread.currentThread().getName() + ": " + num++);lock.notify(); // 唤醒奇数线程} else {try {lock.wait(); // 等待奇数线程通知} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public static void main(String[] args) {AlternatePrint printer = new AlternatePrint();new Thread(printer::printOdd, "OddThread").start();new Thread(printer::printEven, "EvenThread").start();}
}
2. 生产者-消费者模型(缓冲区管理)
题目:实现生产者线程生成数据,消费者线程消费数据,使用阻塞队列控制
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumer {private static final int CAPACITY = 5;private final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(CAPACITY);public void produce() throws InterruptedException {int value = 0;while (true) {synchronized (this) {while (queue.size() == CAPACITY) {wait(); // 缓冲区满时等待}queue.put(value);System.out.println("Produced: " + value);value++;notifyAll(); // 通知消费者}Thread.sleep(100); // 模拟生产耗时}}public void consume() throws InterruptedException {while (true) {synchronized (this) {while (queue.isEmpty()) {wait(); // 缓冲区空时等待}int value = queue.take();System.out.println("Consumed: " + value);notifyAll(); // 通知生产者}Thread.sleep(150); // 模拟消费耗时}}public static void main(String[] args) {ProducerConsumer pc = new ProducerConsumer();new Thread(() -> {try { pc.produce(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }}, "Producer").start();new Thread(() -> {try { pc.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }}, "Consumer").start();}
}
3. 多线程顺序打印(线程协同)
题目:三个线程按顺序循环打印ABC各10次
public class SequentialPrinter {private final Object lock = new Object();private String state = "A";public void printA() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("A")) {System.out.print("A");state = "B";i++;lock.notifyAll(); // 唤醒所有等待线程} else {try {lock.wait(); // 等待条件满足} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}// 类似实现printB()和printC()public void printB() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("B")) {System.out.print("B");state = "C";i++;lock.notifyAll();} else {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public void printC() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("C")) {System.out.print("C ");state = "A";i++;lock.notifyAll();} else {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public static void main(String[] args) {SequentialPrinter printer = new SequentialPrinter();new Thread(printer::printA, "Thread-A").start();new Thread(printer::printB, "Thread-B").start();new Thread(printer::printC, "Thread-C").start();}
}
4. 多线程计算素数(任务分发)
题目:使用线程池计算1~N范围内素数的数量
import java.util.concurrent.*;public class PrimeCounter {public static void main(String[] args) throws Exception {final int N = 1000000;final int THREADS = Runtime.getRuntime().availableProcessors();ExecutorService executor = Executors.newFixedThreadPool(THREADS);int segment = N / THREADS;Future<Integer>[] results = new Future[THREADS];// 分发任务for (int i = 0; i < THREADS; i++) {final int start = i * segment + 1;final int end = (i == THREADS - 1) ? N : (i + 1) * segment;results[i] = executor.submit(() -> {int count = 0;for (int num = start; num <= end; num++) {if (isPrime(num)) count++;}return count;});}// 汇总结果int totalPrimes = 0;for (Future<Integer> future : results) {totalPrimes += future.get();}System.out.println("Total primes: " + totalPrimes);executor.shutdown();}private static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;for (int i = 3; i <= Math.sqrt(n); i += 2) {if (n % i == 0) return false;}return true;}
}
5. 自定义简单线程池
题目:实现一个固定大小的线程池,支持提交任务和执行任务
import java.util.concurrent.*;
import java.util.*;public class SimpleThreadPool {private final BlockingQueue<Runnable> taskQueue;private final List<WorkerThread> workers;private volatile boolean isShutdown = false;public SimpleThreadPool(int poolSize) {this.taskQueue = new LinkedBlockingQueue<>();this.workers = new ArrayList<>();for (int i = 0; i < poolSize; i++) {WorkerThread worker = new WorkerThread("Worker-" + i);worker.start();workers.add(worker);}}public void execute(Runnable task) {if (isShutdown) {throw new IllegalStateException("ThreadPool is shutdown");}taskQueue.offer(task);}public void shutdown() {isShutdown = true;workers.forEach(Thread::interrupt);}private class WorkerThread extends Thread {public WorkerThread(String name) {super(name);}@Overridepublic void run() {while (!isShutdown || !taskQueue.isEmpty()) {try {Runnable task = taskQueue.take();task.run();} catch (InterruptedException e) {// 处理中断,结束线程}}}}public static void main(String[] args) {SimpleThreadPool pool = new SimpleThreadPool(4);// 提交任务for (int i = 0; i < 10; i++) {final int taskId = i;pool.execute(() -> {System.out.println(Thread.currentThread().getName() + " executing Task-" + taskId);try {Thread.sleep(500);} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 等待任务完成try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}pool.shutdown();}
}
字符串算法总结
1. 字符串反转
题目:反转字符串或单词顺序
// 整个字符串反转
public String reverseString(String s) {char[] chars = s.toCharArray();int left = 0, right = chars.length - 1;while (left < right) {char temp = chars[left];chars[left++] = chars[right];chars[right--] = temp;}return new String(chars);
}// 单词顺序反转(保留空格)
public String reverseWords(String s) {String[] words = s.trim().split("\\s+");StringBuilder sb = new StringBuilder();for (int i = words.length - 1; i >= 0; i--) {sb.append(words[i]);if (i > 0) sb.append(" ");}return sb.toString();
}
2. 字符串转换整数 (atoi)
题目:处理边界条件(空格/正负号/溢出)
public int myAtoi(String s) {int index = 0, sign = 1, total = 0;// 1. 跳过空格while (index < s.length() && s.charAt(index) == ' ') index++;if (index == s.length()) return 0;// 2. 处理正负号if (s.charAt(index) == '+' || s.charAt(index) == '-') {sign = s.charAt(index) == '+' ? 1 : -1;index++;}// 3. 转换数字并处理溢出while (index < s.length()) {int digit = s.charAt(index) - '0';if (digit < 0 || digit > 9) break;// 检查溢出if (total > Integer.MAX_VALUE / 10 || (total == Integer.MAX_VALUE / 10 && digit > 7)) {return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}total = total * 10 + digit;index++;}return total * sign;
}
3. 最长公共前缀
题目:查找字符串数组的最长公共前缀
public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) return "";for (int i = 0; i < strs[0].length(); i++) {char c = strs[0].charAt(i);for (int j = 1; j < strs.length; j++) {if (i == strs[j].length() || strs[j].charAt(i) != c) {return strs[0].substring(0, i);}}}return strs[0];
}
4. 无重复字符的最长子串
题目:滑动窗口经典应用
public int lengthOfLongestSubstring(String s) {Map<Character, Integer> map = new HashMap<>();int maxLen = 0;for (int left = 0, right = 0; right < s.length(); right++) {char c = s.charAt(right);if (map.containsKey(c)) {left = Math.max(left, map.get(c) + 1); // 跳过重复字符}map.put(c, right);maxLen = Math.max(maxLen, right - left + 1);}return maxLen;
}
5. 最长回文子串
题目:中心扩展法
public String longestPalindrome(String s) {if (s == null || s.length() < 1) return "";int start = 0, end = 0;for (int i = 0; i < s.length(); i++) {int len1 = expand(s, i, i); // 奇数长度int len2 = expand(s, i, i + 1); // 偶数长度int len = Math.max(len1, len2);if (len > end - start) {start = i - (len - 1) / 2;end = i + len / 2;}}return s.substring(start, end + 1);
}private int expand(String s, int left, int right) {while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return right - left - 1;
}
6. 字符串匹配算法(KMP)
题目:实现 strStr()
public int strStr(String haystack, String needle) {// 空模式串直接返回 0if (needle.isEmpty()) return 0;// 核心预处理:计算 next 数组int[] next = getNext(needle);int i = 0, j = 0;while (i < haystack.length()) {// 当前字符匹配:继续比较后续字符if (j == -1 || haystack.charAt(i) == needle.charAt(j)) {i++;j++;} // 字符不匹配:模式串向右滑动else {j = next[j];}// 完整匹配成功if (j == needle.length()) {return i - j;}}return -1;
}// 计算 next 数组(部分匹配表)
private int[] getNext(String pattern) {int[] next = new int[pattern.length()];next[0] = -1; // 初始值int i = 0, j = -1;while (i < pattern.length() - 1) {if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {i++;j++;next[i] = j;} else {j = next[j]; // 回退到上一匹配位置}}return next;
}
KMP 算法四步流程
-
初始化预处理
- 对于模式串
needle
,计算其next
数组 next[i]
表示当needle[i]
匹配失败时,模式串应该回退到的位置
- 对于模式串
-
next 数组构建过程
- 使用双指针
i
(主指针)和j
(前缀指针) next[0] = -1
作为特殊标记- 通过最长公共前后缀的查找计算每个位置的 next 值:
模式串: "ABCDABD" next[]: [-1,0,0,0,0,1,2]
- 使用双指针
-
滑动匹配过程
- 主串指针
i
永不回溯 - 当匹配失败时,模式串指针
j
回退到next[j]
的位置 - 利用 next 数组避免回溯导致的重复比较
- 主串指针
-
匹配成功判断
- 当
j == needle.length()
时,表示模式串完全匹配 - 返回起始位置:
i - j
- 当
优化(Hash)
7. 有效的括号
题目:栈的经典应用
public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(') stack.push(')');else if (c == '[') stack.push(']');else if (c == '{') stack.push('}');else if (stack.isEmpty() || stack.pop() != c) return false;}return stack.isEmpty();
}
8. 字母异位词分组
题目:HashMap的巧妙使用
public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String s : strs) {char[] chars = s.toCharArray();Arrays.sort(chars);String key = new String(chars);map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);}return new ArrayList<>(map.values());
}
9. 编辑距离(动态规划)
题目:计算最小操作次数
public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i][j - 1], dp[i - 1][j]));}}}return dp[m][n];
}
10. 字符串解码
题目:嵌套括号处理
public String decodeString(String s) {Stack<Integer> numStack = new Stack<>();Stack<StringBuilder> strStack = new Stack<>();StringBuilder cur = new StringBuilder();int num = 0;for (char c : s.toCharArray()) {if (Character.isDigit(c)) {num = num * 10 + (c - '0');} else if (c == '[') {numStack.push(num);strStack.push(cur);cur = new StringBuilder();num = 0;} else if (c == ']') {StringBuilder tmp = cur;cur = strStack.pop();int repeat = numStack.pop();for (int i = 0; i < repeat; i++) {cur.append(tmp);}} else {cur.append(c);}}return cur.toString();
}
相关文章:
Android第十二次面试-多线程和字符串算法总结
多线程的创建与常见使用方法 一、多线程创建方式 1. 继承Thread类 class MyThread extends Thread {Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() " is running");} }// 使用 MyThread thread new …...
ES6——数组扩展之Set数组
在ES6(ECMAScript 2015)中,JavaScript的Set对象提供了一种存储任何值唯一性的方式,类似于数组但又不需要索引访问。这对于需要确保元素唯一性的场景非常有用。Set对象本身并不直接提供数组那样的方法来操作数据(例如ma…...

Cursor Rules 使用
前言 最近在使用 Cursor 进行编程辅助时,发现 AI 生成的代码风格和当前的代码风格大相径庭。而且有时它会输出很奇怪的代码,总是不符合预期。 遂引出本篇,介绍一下 Rules ,它就可以做一些规范约束之类的事情。 什么是 Cursor R…...

服务器数据恢复—服务器raid5阵列崩溃如何恢复数据?
服务器数据恢复环境&故障: 某品牌型号为X3850服务器上有一组由14块数据盘和1块热备盘组建的raid5磁盘阵列。 服务器在正常使用过程中突然崩溃,管理员查看raid5阵列故障情况的时发现磁盘阵列中有2块硬盘掉线,但是热备盘没有启用。 服务器数…...

Go语言堆内存管理
Go堆内存管理 1. Go内存模型层级结构 Golang内存管理模型与TCMalloc的设计极其相似。基本轮廓和概念也几乎相同,只是一些规则和流程存在差异。 2. Go内存管理的基本概念 Go内存管理的许多概念在TCMalloc中已经有了,含义是相同的,只是名字有…...

【DAY41】简单CNN
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常…...
Rust 学习笔记:使用自定义命令扩展 Cargo
Rust 学习笔记:使用自定义命令扩展 Cargo Rust 学习笔记:使用自定义命令扩展 Cargo Rust 学习笔记:使用自定义命令扩展 Cargo Cargo 支持通过 $PATH 中的 cargo-something 形式的二进制文件拓展子命令,而无需修改 Cargo 本身。 …...
LeetCode 08.06 面试题 汉诺塔 (Java)
经典递归解决汉诺塔问题:清晰的三步移动策略 问题描述 在汉诺塔问题中,有 3 根柱子和 N 个大小不同的盘子,盘子初始按升序堆叠在第一根柱子上(最小的在顶部)。目标是将所有盘子移动到第三根柱子上,并满足…...

使用MinIO搭建自己的分布式文件存储
目录 引言: 一.什么是 MinIO ? 二.MinIO 的安装与部署: 三.Spring Cloud 集成 MinIO: 1.前提准备: (1)安装依赖: (2)配置MinIO连接: &…...
单元测试与QTestLib框架使用
一.单元测试的意义 在软件开发中,单元测试是指对软件中最小可测试单元(通常是函数、类的方法)进行隔离的、可重复的验证。进行单元测试具有以下重要意义: 1.提升代码质量与可靠性: 早期错误检测: 在开发…...
java面试场景题:QPS 短链系统怎么设计
以下是对文章的润色版本: 这道场景设计题,初看似乎业务简单,实则覆盖的知识点极为丰富: 高并发与高性能分布式 ID 生成机制;Redis Bloom Filter——高并发、低内存损耗的过滤组件知识;分库、分表海量数据存…...
java面试场景提题:
以下是润色后的文章,结构更清晰,语言更流畅,同时保留了技术细节: 应对百倍QPS增长的系统设计策略 整体架构设计思路 面对突发性百倍QPS增长,系统设计需从硬件、架构、代码、数据四个维度协同优化: 硬件层…...

K7 系列各种PCIE IP核的对比
上面三个IP 有什么区别,什么时候用呢? 7 series Integrated Block for PCIE AXI Memory Mapped to PCI Express DMA subsystem for PCI Express 特点 这是 Kintex-7 内置的 硬核 PCIe 模块。部分事务层也集成在里面,使用标准的PCIE 基本没…...

natapp 内网穿透失败
连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn...

深入解析CI/CD开发流程
引言:主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署,但是自己不是太了解什么意思,所以就自己查了一下ci/cd相关的资料,整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写,旨在简化并…...

Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试
docker运行Ktransformers部署Qwen3MOE模型实战及 性能测试 最开始拉取ktransformers:v0.3.1-AVX512版本,发现无论如何都启动不了大模型,后来发现是cpu不支持avx512指令集。 由于本地cpu不支持amx指令集,因此下载avx2版本镜像: …...

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用
在量子技术飞速发展的今天,实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器(AWG)作为精准信号控制的核心设备,在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…...

相机--相机标定实操
教程 camera_calibration移动画面示例 usb_cam使用介绍和下载 标定流程 单目相机标定 我使用的是USB相机,所以直接使用ros的usb_cam功能包驱动相机闭关获取实时图像,然后用ros的camera_calibration标定相机。 1,下载usb_cam和camera_calibration: …...
深入理解汇编语言中的顺序与分支结构
本文将结合Visual Studio环境配置、顺序结构编程和分支结构实现,全面解析汇编语言中的核心编程概念。通过实际案例演示无符号/有符号数处理、分段函数实现和逻辑表达式短路计算等关键技术。 一、汇编环境配置回顾(Win32MASM) 在Visual Studi…...

DAY43 复习日
浙大疏锦行-CSDN博客 kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:把项目拆分成多个文件 src/config.py: 用于存放项目配置,例如文件路径、学习率、批次大小等。 # src/config.py# Paths DATA_DIR "data…...
【仿生机器人】仿生机器人智能架构:从感知到个性的完整设计
仿生机器人智能架构:从感知到个性的完整设计 仿生机器人不仅需要模拟人类的外表,更需要具备类人的认知、情感和个性特征。本研究提出了一个综合性的软件架构,实现了从环境感知到情感生成、从实时交互到人格塑造的完整智能系统。该架构突破了…...
【业务框架】3C-相机-Cinemachine
概述 插件,做相机需求,等于相机老师傅多年经验总结的工具 Feature Transform:略Control Camera:控制相机参数Noise:增加随机性Blend:CameraBrain的混合列表指定一个虚拟相机到另一个相机的过渡ÿ…...

【Auto.js例程】华为备忘录导出到其他手机
目录 问题描述方法步骤1.安装下载Visual Studio Code2.安装扩展3.找到Auto.js插件,并安装插件4.启动服务器5.连接手机6.撰写脚本并运行7.本文实现功能的代码8.启动手机上的换机软件 问题描述 问题背景:华为手机换成一加手机,华为备忘录无法批…...

单片机的低功耗模式
什么是低功耗? STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...

架构师级考验!飞算 JavaAI 炫技赛:AI 辅助编程解决老项目难题
当十年前 Hibernate 框架的 N1 查询隐患在深夜持续困扰排查,当 SpringMVC 控制器中错综复杂的业务逻辑在跨语言迁移时令人抓狂,企业数字化进程中的百万行老系统,已然成为暗藏危机的 “技术债冰山”。而此刻,飞算科技全新发布的 Ja…...

手机端抓包大麦网抢票协议:实现自动抢票与支付
🚀 手机端抓包大麦网抢票协议:实现自动抢票与支付 🚀 🔥 你是否还在为抢不到热门演出票而烦恼?本文将教你如何通过抓包技术获取大麦网抢票协议,并编写脚本实现自动化抢票与支付!🔥 …...
使用阿里云百炼embeddings+langchain+Milvus实现简单RAG
使用阿里云百炼embeddingslangchainMilvus实现简单RAG 注意测试时,替换其中的key、文档等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…...
C#合并CAN ASC文件:实现与优化
C#合并CAN ASC文件:实现与优化 在汽车电子和工业控制领域,CAN(Controller Area Network)总线是一种广泛使用的通信协议。CAN ASC(American Standard Code)文件则是记录CAN总线通信数据的标准格式ÿ…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境
问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时,提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0,而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本,但为了不影响其他程序,需…...

如何思考?分析篇
现代人每天刷 100 条信息,却难静下心读 10 页书。 前言: 我一直把思考当作一件生活中和工作中最为重要的事情。但是我发现当我想写一篇跟思考有关的文章时,却难以下手。因为思考是一件非常复杂的事情,用文字描述十分的困难。 读书…...