使用 HTML + JavaScript 实现文章逐句高亮朗读功能

article/2025/6/9 10:58:05

在这个信息爆炸的时代,我们每天都要面对大量的文字阅读。无论是学习、工作还是个人成长,阅读都扮演着至关重要的角色。然而,在快节奏的生活中,我们往往难以找到足够的安静时间专注于阅读。本文用 HTML + JavaScript 实现了一个基于Web的语音文章朗读器,为您带来全新的阅读体验。

效果演示

image-20250603220304012

image-20250603220336133

项目核心

本项目主要包含以下核心功能:

  • 语音合成(Text-to-Speech)功能
  • 控制播放、暂停、继续和停止操作
  • 语音选择功能
  • 阅读进度保存与恢复
  • 句子级高亮显示
  • 点击任意句子直接跳转并朗读

页面结构

控制区域

包含所有操作按钮(开始、暂停、继续、停止、重置)和语音选择下拉框。

<div class="controls"><button id="playBtn">开始朗读</button><button id="pauseBtn" disabled>暂停</button><button id="resumeBtn" disabled>继续</button><button id="stopBtn" disabled>停止</button><select id="voiceSelect" class="voice-select"></select><button id="resetBtn">重置进度</button>
</div>

文章区域

包含多个段落,每个段落由多个可交互的句子组成。

<div class="article" id="article"><p class="paragraph"><span class="sentence">在编程的世界里,学习是一个永无止境的过程。</span><span class="sentence">随着技术的不断发展,我们需要不断更新自己的知识和技能。</span><span class="sentence">HTML、CSS和JavaScript是构建现代网页的三大基石。</span></p><p class="paragraph"><span class="sentence">掌握这些基础技术后,你可以进一步学习各种前端框架和工具。</span><span class="sentence">React、Vue和Angular是目前最流行的前端框架。</span><span class="sentence">它们都采用了组件化的开发模式,提高了代码的可维护性和复用性。</span></p><p class="paragraph"><span class="sentence">除了前端技术,后端开发也是全栈工程师必须掌握的技能。</span><span class="sentence">Node.js让JavaScript可以用于服务器端编程,大大扩展了JavaScript的应用范围。</span><span class="sentence">数据库技术也是开发中的重要组成部分。</span></p>
</div>
进度信息

显示当前阅读进度。

<div class="progress-info">当前进度: <span id="progressText">0/0</span><div class="progress-bar-container"><div class="progress-bar"></div></div>
</div>

核心功能实现

定义基础变量

获取DOM元素

const sentences = document.querySelectorAll('.sentence');
const playBtn = document.getElementById('playBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resumeBtn = document.getElementById('resumeBtn');
const stopBtn = document.getElementById('stopBtn');
const resetBtn = document.getElementById('resetBtn');
const voiceSelect = document.getElementById('voiceSelect');
const progressText = document.getElementById('progressText');
const progressBar = document.querySelector('.progress-bar');

定义语音合成相关变量

let speechSynthesis = window.speechSynthesis;
let voices = [];
let currentUtterance = null;
let currentSentenceIndex = 0;
let isPaused = false;
语音合成初始化

通过 window.speechSynthesis API 获取系统支持的语音列表,并填充到下拉选择框中。

function initSpeechSynthesis() {// 获取可用的语音列表voices = speechSynthesis.getVoices();// 填充语音选择下拉框voiceSelect.innerHTML = '';voices.forEach((voice, index) => {const option = document.createElement('option');option.value = index;option.textContent = `${voice.name} (${voice.lang})`;voiceSelect.appendChild(option);});// 尝试选择中文语音const chineseVoice = voices.find(voice =>{voice.lang.includes('zh') || voice.lang.includes('cmn')});if (chineseVoice) {const voiceIndex = voices.indexOf(chineseVoice);voiceSelect.value = voiceIndex;}
}
句子朗读功能
function speakSentence(index) {if (index >= sentences.length || index < 0) return;// 停止当前朗读if (currentUtterance) {speechSynthesis.cancel();}// 更新当前句子高亮updateHighlight(index);// 创建新的语音合成实例const selectedVoiceIndex = voiceSelect.value;const utterance = new SpeechSynthesisUtterance(sentences[index].textContent);if (voices[selectedVoiceIndex]) {utterance.voice = voices[selectedVoiceIndex];}utterance.rate = 0.9; // 稍微慢一点的语速// 朗读开始时的处理utterance.onstart = function() {sentences[index].classList.add('reading');playBtn.disabled = true;pauseBtn.disabled = false;resumeBtn.disabled = true;stopBtn.disabled = false;};// 朗读结束时的处理utterance.onend = function() {sentences[index].classList.remove('reading');if (!isPaused) {if (currentSentenceIndex >= sentences.length - 1) {// 朗读完成playBtn.disabled = false;pauseBtn.disabled = true;resumeBtn.disabled = true;stopBtn.disabled = true;updateProgressText();return;}currentSentenceIndex++;saveProgress();speakSentence(currentSentenceIndex);}};// 开始朗读currentUtterance = utterance;speechSynthesis.speak(utterance);updateProgressText();
}
句子高亮功能
function updateHighlight(index) {sentences.forEach((sentence, i) => {sentence.classList.remove('current');if (i === index) {sentence.classList.add('current');// 滚动到当前句子sentence.scrollIntoView({ behavior: 'smooth', block: 'center' });}});
}
更新进度文本
function updateProgressText() {progressText.textContent = `${currentSentenceIndex + 1}/${sentences.length}`;const percentage = (currentSentenceIndex + 1) / sentences.length * 100;progressBar.style.width = `${percentage}%`;
}
进度保存与恢复

保存进度到本地存储

function saveProgress() {localStorage.setItem('readingProgress', currentSentenceIndex);localStorage.setItem('articleId', 'demoArticle'); updateProgressText();
}

从本地存储加载进度

function loadProgress() {const savedArticleId = localStorage.getItem('articleId');if (savedArticleId === 'demoArticle') {const savedProgress = localStorage.getItem('readingProgress');if (savedProgress !== null) {currentSentenceIndex = parseInt(savedProgress);if (currentSentenceIndex >= sentences.length) {currentSentenceIndex = 0;}updateHighlight(currentSentenceIndex);updateProgressText();}}
}
点击句子朗读跳转功能
sentences.forEach((sentence, index) => {sentence.addEventListener('click', function() {currentSentenceIndex = index;speakSentence(currentSentenceIndex);});
});

扩展建议

  • 语速调节:增加语速调节滑块,让用户自定义朗读速
  • 多语言支持:自动检测文本语言并选择合适的语音引擎
  • 断句优化:改进自然语言处理逻辑,使朗读更符合口语习惯
  • 多文章支持:扩展文章管理系统,允许用户选择不同文章进行朗读

完整代码

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文章逐句高亮朗读</title><style>body {font-family: 'Microsoft YaHei', sans-serif;line-height: 1.6;max-width: 800px;margin: 0 auto;padding: 40px 20px;color: #333;height: 100vh;box-sizing: border-box;background: linear-gradient(to bottom right, #f8f9fa, #e9ecef);}h1 {text-align: center;color: #2c3e50;margin-bottom: 40px;font-size: 2.5em;letter-spacing: 2px;position: relative;animation: fadeInDown 1s ease-out forwards;}@keyframes fadeInDown {from {opacity: 0;transform: translateY(-30px);}to {opacity: 1;transform: translateY(0);}}h1::after {content: '';display: block;width: 100px;height: 4px;background: linear-gradient(to right, #3498db, #2980b9);margin: 15px auto 0;border-radius: 2px;animation: growLine 1s ease-out forwards;}@keyframes growLine {from {width: 0;}to {width: 100px;}}.controls {box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);border-radius: 10px;padding: 20px;background-color: #ffffffcc;display: flex;flex-direction: column;gap: 15px;margin-bottom: 30px;}.controls > div {display: flex;flex-wrap: wrap;justify-content: center;gap: 15px;}button {padding: 10px 20px;background: linear-gradient(135deg, #3498db, #2980b9);color: white;border: none;border-radius: 25px;cursor: pointer;font-size: 16px;transition: all 0.3s ease-in-out;box-shadow: 0 4px 6px rgba(52, 152, 219, 0.3);}button:hover {transform: translateY(-2px);box-shadow: 0 6px 12px rgba(52, 152, 219, 0.4);}button:disabled {background: linear-gradient(135deg, #95a5a6, #7f8c8d);box-shadow: none;transform: none;}.article {font-size: 18px;line-height: 1.8;background-color: #ffffffee;border-radius: 10px;padding: 25px;margin-top: 30px;box-shadow: 0 8px 20px rgba(0, 0, 0, 0.05);margin-bottom: 30px;position: relative;z-index: 0}.article::before {content: '';position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: radial-gradient(circle at top left, rgba(52, 152, 219, 0.05) 0%, transparent 100%);z-index: -1;border-radius: 10px;}.paragraph {margin-bottom: 20px;}.sentence {border-radius: 3px;transition: all 0.3s ease-in-out;cursor: pointer;position: relative;z-index: 1;}.sentence:hover {background-color: #f0f0f0;}.sentence::after {content: '';position: absolute;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(255, 255, 255, 0.3);opacity: 0;z-index: -1;transition: opacity 0.3s ease-in-out;}.sentence:hover::after {opacity: 1;}.current {background-color: #fffde7 !important;font-weight: bold;transform: scale(1.05);box-shadow: 0 2px 8px rgba(255, 221, 0, 0.3);}.progress-info {text-align: center;margin-top: 20px;font-size: 14px;color: #7f8c8d;}select {padding: 8px;border-radius: 4px;border: 1px solid #bdc3c7;font-size: 16px;}.voice-select {min-width: 220px;padding: 10px 12px;border-radius: 25px;border: 1px solid #bdc3c7;font-size: 16px;background-color: #f8f9fa;transition: all 0.3s ease-in-out;appearance: none;background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='%23555' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat: no-repeat;background-position: right 15px center;background-size: 12px;display: block;margin: 0 auto;}.voice-select:focus {outline: none;border-color: #3498db;box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2);}.progress-info {text-align: center;margin-top: 30px;font-size: 14px;color: #7f8c8d;position: relative;height: 30px;}.progress-bar-container {width: 100%;height: 6px;background-color: #ecf0f1;border-radius: 3px;overflow: hidden;margin: 10px 0;}.progress-bar {height: 100%;width: 0;background: linear-gradient(to right, #3498db, #2980b9);transition: width 0.3s ease-in-out;}</style>
</head>
<body>
<h1>文章逐句高亮朗读</h1><div class="controls"><div><button id="playBtn">开始朗读</button><button id="pauseBtn" disabled>暂停</button><button id="resumeBtn" disabled>继续</button><button id="stopBtn" disabled>停止</button><button id="resetBtn">重置进度</button></div><select id="voiceSelect" class="voice-select"></select>
</div><div class="article" id="article"><p class="paragraph"><span class="sentence">在编程的世界里,学习是一个永无止境的过程。</span><span class="sentence">随着技术的不断发展,我们需要不断更新自己的知识和技能。</span><span class="sentence">HTML、CSS和JavaScript是构建现代网页的三大基石。</span></p><p class="paragraph"><span class="sentence">掌握这些基础技术后,你可以进一步学习各种前端框架和工具。</span><span class="sentence">React、Vue和Angular是目前最流行的前端框架。</span><span class="sentence">它们都采用了组件化的开发模式,提高了代码的可维护性和复用性。</span></p><p class="paragraph"><span class="sentence">除了前端技术,后端开发也是全栈工程师必须掌握的技能。</span><span class="sentence">Node.js让JavaScript可以用于服务器端编程,大大扩展了JavaScript的应用范围。</span><span class="sentence">数据库技术也是开发中的重要组成部分。</span></p>
</div><div class="progress-info">当前进度: <span id="progressText">0/0</span><div class="progress-bar-container"><div class="progress-bar"></div></div>
</div><script>document.addEventListener('DOMContentLoaded', function() {// 获取DOM元素const sentences = document.querySelectorAll('.sentence');const playBtn = document.getElementById('playBtn');const pauseBtn = document.getElementById('pauseBtn');const resumeBtn = document.getElementById('resumeBtn');const stopBtn = document.getElementById('stopBtn');const resetBtn = document.getElementById('resetBtn');const voiceSelect = document.getElementById('voiceSelect');const progressText = document.getElementById('progressText');const progressBar = document.querySelector('.progress-bar');// 语音合成相关变量let speechSynthesis = window.speechSynthesis;let voices = [];let currentUtterance = null;let currentSentenceIndex = 0;let isPaused = false;// 从本地存储加载进度loadProgress();// 初始化语音合成function initSpeechSynthesis() {// 获取可用的语音列表voices = speechSynthesis.getVoices();// 填充语音选择下拉框voiceSelect.innerHTML = '';voices.forEach((voice, index) => {const option = document.createElement('option');option.value = index;option.textContent = `${voice.name} (${voice.lang})`;voiceSelect.appendChild(option);});// 尝试选择中文语音const chineseVoice = voices.find(voice =>{voice.lang.includes('zh') || voice.lang.includes('cmn')});if (chineseVoice) {const voiceIndex = voices.indexOf(chineseVoice);voiceSelect.value = voiceIndex;}}// 语音列表加载可能需要时间speechSynthesis.onvoiceschanged = initSpeechSynthesis;initSpeechSynthesis();// 朗读指定句子function speakSentence(index) {if (index >= sentences.length || index < 0) return;// 停止当前朗读if (currentUtterance) {speechSynthesis.cancel();}// 更新当前句子高亮updateHighlight(index);// 创建新的语音合成实例const selectedVoiceIndex = voiceSelect.value;const utterance = new SpeechSynthesisUtterance(sentences[index].textContent);if (voices[selectedVoiceIndex]) {utterance.voice = voices[selectedVoiceIndex];}utterance.rate = 0.9; // 稍微慢一点的语速// 朗读开始时的处理utterance.onstart = function() {sentences[index].classList.add('reading');playBtn.disabled = true;pauseBtn.disabled = false;resumeBtn.disabled = true;stopBtn.disabled = false;};// 朗读结束时的处理utterance.onend = function() {sentences[index].classList.remove('reading');if (!isPaused) {if (currentSentenceIndex >= sentences.length - 1) {// 朗读完成playBtn.disabled = false;pauseBtn.disabled = true;resumeBtn.disabled = true;stopBtn.disabled = true;updateProgressText();return;}currentSentenceIndex++;saveProgress();speakSentence(currentSentenceIndex);}};// 开始朗读currentUtterance = utterance;speechSynthesis.speak(utterance);updateProgressText();}// 更新句子高亮function updateHighlight(index) {sentences.forEach((sentence, i) => {sentence.classList.remove('current');if (i === index) {sentence.classList.add('current');// 滚动到当前句子sentence.scrollIntoView({ behavior: 'smooth', block: 'center' });}});}// 更新进度文本function updateProgressText() {progressText.textContent = `${currentSentenceIndex + 1}/${sentences.length}`;const percentage = (currentSentenceIndex + 1) / sentences.length * 100;progressBar.style.width = `${percentage}%`;}// 保存进度到本地存储function saveProgress() {localStorage.setItem('readingProgress', currentSentenceIndex);localStorage.setItem('articleId', 'demoArticle'); // 在实际应用中可以使用文章IDupdateProgressText();}// 从本地存储加载进度function loadProgress() {const savedArticleId = localStorage.getItem('articleId');if (savedArticleId === 'demoArticle') {const savedProgress = localStorage.getItem('readingProgress');if (savedProgress !== null) {currentSentenceIndex = parseInt(savedProgress);if (currentSentenceIndex >= sentences.length) {currentSentenceIndex = 0;}updateHighlight(currentSentenceIndex);updateProgressText();}}}// 事件监听器playBtn.addEventListener('click', function() {currentSentenceIndex = 0;speakSentence(currentSentenceIndex);});pauseBtn.addEventListener('click', function() {if (speechSynthesis.speaking && !isPaused) {speechSynthesis.pause();isPaused = true;pauseBtn.disabled = true;resumeBtn.disabled = false;}});resumeBtn.addEventListener('click', function() {if (isPaused) {speechSynthesis.resume();isPaused = false;pauseBtn.disabled = false;resumeBtn.disabled = true;}});stopBtn.addEventListener('click', function() {speechSynthesis.cancel();isPaused = false;playBtn.disabled = false;pauseBtn.disabled = true;resumeBtn.disabled = true;stopBtn.disabled = true;// 移除所有朗读样式sentences.forEach(sentence => {sentence.classList.remove('reading');});});resetBtn.addEventListener('click', function() {localStorage.removeItem('readingProgress');localStorage.removeItem('articleId');currentSentenceIndex = 0;updateHighlight(currentSentenceIndex);updateProgressText();});// 点击句子跳转到该句子并朗读sentences.forEach((sentence, index) => {sentence.addEventListener('click', function() {currentSentenceIndex = index;speakSentence(currentSentenceIndex);});});});
</script>
</body>
</html>

http://www.hkcw.cn/article/losEfVNXHk.shtml

相关文章

《TCP/IP 详解 卷1:协议》第5章:Internet协议

IPv4和IPv6头部 IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP 数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。 IP头部字段 IPv4 头部通常为 20 字节&#xff08;无选项时&#xff09;&#xff0c;而 IPv6 头部固定为 40 字节。IPv6 不…

WPS word 已有多级列表序号

wps的word中&#xff0c;原来已生成的文档里&#xff0c;已存在序号。比如&#xff0c;存在2、2.1、2.1.1、2.1.1.1、2.1.1.1.1 5层序号&#xff0c;而且已分为5级。但增加内容的时候&#xff0c;并不会自动增加序号&#xff0c;应该如何解决&#xff1f; 原来长这样&#xff…

5 个经典的大模型微调技术

传统微调方法&#xff08;如下图所示&#xff09;对于大语言模型而言并不可行&#xff0c;因为这些模型具有数百亿甚至千亿的参数量&#xff0c;而且显存需求高达数百GB&#xff0c;并非所有人都能获得如此规模的计算资源。 但如今&#xff0c;我们拥有多种优化大语言模型的微调…

爱耕云课时管理系统评测

1 核心功能模块与代码实现 1.1 智能排课引擎&#xff08;Python伪代码示例&#xff09; 爱耕云的排课系统采用约束满足算法&#xff08;Constraint Satisfaction Problem&#xff09;解决教培机构最头疼的资源冲突问题。该系统将教师、教室、课程和时间段抽象为多维资源&…

Go的隐式接口机制

正确使用Interface 不要照使用C/Java等OOP语言中接口的方式去使用interface。 Go的Interface的抽象不仅可以用于dynamic-dispatch 在工程上、它最大的作用是&#xff1a;隔离实现和抽象、实现完全的dependency inversion 以及interface segregation(SOLID principle中的I和D)。…

Linux总结

一、Linux linux系统的构成 1.linux系统内核&#xff1a;提供最核心的功能&#xff0c;如&#xff1a;调度CPU、调度内存、调度文件系统、调度网络通信、调度IO等。 2.系统级应用程序&#xff1a;出厂自带程序&#xff0c;可供用户快速上手操作系统。如&#xff1a;文件管理…

嵌入式复习小练

1.ARM处理器中用作程序计数器PC的通用寄存器是&#xff08;&#xff09; A.R12 B.R13 C.R14 D.R15 答案&#xff1a;D。在 ARM 处理器中&#xff0c;R15 用作程序计数器&#xff08;PC&#xff09; &#xff0c;用于存放下一条要执行指令的地址 2.以下关于ARM程序状态寄存器C…

Python Day41学习(日志Day8复习)

对信贷数据中的离散特征重新进行独热编码 重写代码时出现的问题&#xff1a; .tolist()是一个方法对象&#xff0c;调用时须加()。刚开始书写时漏掉了()&#xff0c;导致报错。 复习“日志Day8”的内容 今日有点事耽搁了&#xff0c;少复习了些内容&#xff0c;明日继续加油&…

入门AJAX——XMLHttpRequest(Post)

一、前言 在上篇文章中&#xff0c;我们已经介绍了 HMLHttpRequest 的GET 请求的基本用法&#xff0c;并基于我提供的接口练习了两个简单的例子。如果你还没有看过第一篇文章&#xff0c;强烈建议你在学习完上篇文章后再学习本篇文章&#xff1a; &#x1f517;入门AJAX——XM…

网络交换机:构建高效、安全、灵活局域网的基石

在数字化时代&#xff0c;网络交换机作为局域网(LAN)的核心设备&#xff0c;承担着数据转发、通信优化和安全防护的关键任务。其通过独特的MAC地址学习、冲突域隔离、VLAN划分等技术&#xff0c;显著提升了网络性能&#xff0c;成为企业、学校、医院等场景不可或缺的基础设施。…

《深入解析SPI协议及其FPGA高效实现》-- 第三篇:FPGA实现关键技术与优化

第三篇&#xff1a;FPGA实现关键技术与优化 聚焦高速时序、资源复用与信号完整性 1. 时序收敛关键策略 1.1 源同步时序约束 tcl # Vivado XDC约束示例 create_generated_clock -name spi_sck -source [get_pins clk_gen/CLKOUT] \-divide_by 1 [get_ports sck]# 建立时间约…

EtherCAT背板方案:方芯半导体工业自动化领域的高速、高精度的通信解决方案

前言&#xff1a;EtherCAT背板方案是一种插拔式设计方案&#xff0c;ESC&#xff08;EtherCAT从站控制器&#xff09;之间通过底板信号线相互连接。底板信号线为所支撑的器件提供电源和数据信号。ESC芯片多级从站之间通过LVDS&#xff08;低压差分信号&#xff09;接口相连接&a…

TablePlus:一个跨平台的数据库管理工具

TablePlus 是一款现代化的跨平台&#xff08;Window、Linux、macOS、iOS&#xff09;数据库管理工具&#xff0c;提供直观的界面和强大的功能&#xff0c;可以帮助用户轻松管理和操作数据库。 TablePlus 免费版可以永久使用&#xff0c;但是只能同时打开 2 个连接窗口&#xff…

记我的第一个深度学习模型尝试——MNIST手写数字识别

种一棵树最好的时间是十年前&#xff0c;其次是现在。 目录 前言 一、数据准备 二、构建模型 三、模型精度检验 前言 最近又空闲下来&#xff0c;终于有时间把之前荒废的学习计划给重拾起来了&#xff01;今天做的是MNIST手写数字识别项目。这可以说是深度学习的“Hello Wo…

杭州白塔岭画室怎么样?和燕壹画室哪个好?

杭州作为全国美术艺考集训的核心区域&#xff0c;汇聚了众多实力强劲的画室&#xff0c;其中白塔岭画室和燕壹画室备受美术生关注。对于怀揣艺术梦想的考生而言&#xff0c;选择一所契合自身需求的画室&#xff0c;对未来的艺术之路影响深远。接下来&#xff0c;我们将从多个维…

AI与区块链:数据确权与模型共享的未来

AI与区块链&#xff1a;数据确权与模型共享的未来 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI与区块链&#xff1a;数据确权与模型共享的未来摘要引言技术路线对比1. 数据确权&#xff1a;从中心化存储到分布…

【T2I】Decouple-Then-Merge: Finetune Diffusion Models as Multi-Task Learning

CODE: CVPR 2025 GitHub - MqLeet/DeMe: [CVPR2025] Official implementation of "Decouple-Then-Merge: Finetune Diffusion Models as Multi-Task Learning" Abstract 扩散模型是通过学习一系列模型来训练的&#xff0c;这些模型可以逆转噪声衰减的每一步。通常&…

二分查找的边界艺术:LeetCode 34 题深度解析

文章目录 一、问题引入&#xff1a;寻找区间的边界二、二分的核心&#xff1a;二段性三、左边界的查找逻辑&#xff08;找第一个 ≥ target 的位置&#xff09;四、右边界的查找逻辑&#xff08;找最后一个 ≤ target 的位置&#xff09;五、代码实现六、二分边界模板总结结语 …

系统思考:短期利益与长期系统影响

一个决策难题&#xff1a;一家公司接到了一个大订单&#xff0c;客户提出了10%的降价要求&#xff0c;而企业的产能还无法满足客户的需求。你会选择增加产能&#xff0c;接受这个订单&#xff0c;还是拒绝&#xff1f;从系统思考的角度来看&#xff0c;这个决策不仅仅是一个简单…

【数据结构 -- B树】

目录 一、前言二、B树示例定义查找数据插入数据删除数据 一、前言 前面我们已经学习了二叉搜索树和AVL树&#xff0c;它们的查找、插入、删除数据效率都很高&#xff0c;我们首先需要了解它们是怎么操作数据的 首先将所有数据一次性调到内存中&#xff0c;再在内存中进行处理…