mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-25 04:36:41 +08:00
509 lines
23 KiB
HTML
509 lines
23 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
|
||
<head>
|
||
|
||
<head>
|
||
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
|
||
<link rel="icon" href="/static/favicon.png">
|
||
|
||
<title>00 数据结构与算法,应该这样学!.md.html</title>
|
||
|
||
<!-- Spectre.css framework -->
|
||
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
|
||
<!-- theme css & js -->
|
||
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
|
||
</head>
|
||
<body>
|
||
<div class="book-container">
|
||
|
||
<div class="book-sidebar">
|
||
|
||
<div class="book-brand">
|
||
|
||
<a href="/">
|
||
|
||
<img src="/static/favicon.png">
|
||
|
||
<span>技术文章摘抄</span>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<div class="book-menu uncollapsible">
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
|
||
</ul>
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="../">上一级</a></li>
|
||
|
||
</ul>
|
||
<ul class="uncollapsible">
|
||
|
||
<li>
|
||
<a class="current-tab" href="/专栏/重学数据结构与算法-完/00 数据结构与算法,应该这样学!.md.html">00 数据结构与算法,应该这样学!.md.html</a>
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/01 复杂度:如何衡量程序运行的效率?.md.html">01 复杂度:如何衡量程序运行的效率?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/02 数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度.md.html">02 数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/03 增删查:掌握数据处理的基本操作,以不变应万变.md.html">03 增删查:掌握数据处理的基本操作,以不变应万变.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/04 如何完成线性表结构下的增删查?.md.html">04 如何完成线性表结构下的增删查?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/05 栈:后进先出的线性表,如何实现增删查?.md.html">05 栈:后进先出的线性表,如何实现增删查?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/06 队列:先进先出的线性表,如何实现增删查?.md.html">06 队列:先进先出的线性表,如何实现增删查?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/07 数组:如何实现基于索引的查找?.md.html">07 数组:如何实现基于索引的查找?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/08 字符串:如何正确回答面试中高频考察的字符串匹配算法?.md.html">08 字符串:如何正确回答面试中高频考察的字符串匹配算法?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/09 树和二叉树:分支关系与层次结构下,如何有效实现增删查?.md.html">09 树和二叉树:分支关系与层次结构下,如何有效实现增删查?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/10 哈希表:如何利用好高效率查找的“利器”?.md.html">10 哈希表:如何利用好高效率查找的“利器”?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/11 递归:如何利用递归求解汉诺塔问题?.md.html">11 递归:如何利用递归求解汉诺塔问题?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/12 分治:如何利用分治法完成数据查找?.md.html">12 分治:如何利用分治法完成数据查找?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/13 排序:经典排序算法原理解析与优劣对比.md.html">13 排序:经典排序算法原理解析与优劣对比.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/14 动态规划:如何通过最优子结构,完成复杂问题求解?.md.html">14 动态规划:如何通过最优子结构,完成复杂问题求解?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/15 定位问题才能更好地解决问题:开发前的复杂度分析与技术选型.md.html">15 定位问题才能更好地解决问题:开发前的复杂度分析与技术选型.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/16 真题案例(一):算法思维训练.md.html">16 真题案例(一):算法思维训练.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/17 真题案例(二):数据结构训练.md.html">17 真题案例(二):数据结构训练.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/18 真题案例(三):力扣真题训练.md.html">18 真题案例(三):力扣真题训练.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/19 真题案例(四):大厂真题实战演练.md.html">19 真题案例(四):大厂真题实战演练.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/20 代码之外,技术面试中你应该具备哪些软素质?.md.html">20 代码之外,技术面试中你应该具备哪些软素质?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/21 面试中如何建立全局观,快速完成优质的手写代码?.md.html">21 面试中如何建立全局观,快速完成优质的手写代码?.md.html</a>
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/加餐 课后练习题详解.md.html">加餐 课后练习题详解.md.html</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
|
||
<div class="sidebar-toggle-inner"></div>
|
||
|
||
</div>
|
||
<script>
|
||
|
||
function add_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.add('show')
|
||
|
||
}
|
||
function remove_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.remove('show')
|
||
|
||
}
|
||
function sidebar_toggle() {
|
||
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let content = document.querySelector('.off-canvas-content')
|
||
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
|
||
sidebar_toggle.classList.remove('extend')
|
||
|
||
sidebar.classList.remove('hide')
|
||
|
||
content.classList.remove('extend')
|
||
|
||
} else { // hide
|
||
|
||
sidebar_toggle.classList.add('extend')
|
||
|
||
sidebar.classList.add('hide')
|
||
|
||
content.classList.add('extend')
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
function open_sidebar() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.add('show')
|
||
|
||
overlay.classList.add('show')
|
||
|
||
}
|
||
|
||
function hide_canvas() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.remove('show')
|
||
|
||
overlay.classList.remove('show')
|
||
|
||
}
|
||
</script>
|
||
<div class="off-canvas-content">
|
||
|
||
<div class="columns">
|
||
|
||
<div class="column col-12 col-lg-12">
|
||
|
||
<div class="book-navbar">
|
||
|
||
<!-- For Responsive Layout -->
|
||
|
||
<header class="navbar">
|
||
|
||
<section class="navbar-section">
|
||
|
||
<a onclick="open_sidebar()">
|
||
|
||
<i class="icon icon-menu"></i>
|
||
|
||
</a>
|
||
|
||
</section>
|
||
|
||
</header>
|
||
|
||
</div>
|
||
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
|
||
overflow-x: auto;
|
||
|
||
overflow-y: hidden;">
|
||
|
||
<div class="book-post">
|
||
|
||
<p id="tip" align="center"></p>
|
||
|
||
<div><h1>00 数据结构与算法,应该这样学!</h1>
|
||
|
||
<p>你好,我是公瑾,很高兴我们来一起重学数据结构与算法。</p>
|
||
|
||
<p>工作以来,我一直专注于机器学习、深度学习等计算机领域算法的研发,算得上是国内首批从事 AI 工作的工程师,代码开发和优化过程让我不断加强了对数据结构、算法思想的理解。</p>
|
||
|
||
<p>想象一下,你在开发一个网站的用户系统。这个用户系统的功能之一是,对某个尝试登录用户的ID去核实是否合法,这就需要去存储着海量数据的数据库中查找这个ID。假设这个尝试登录用户的ID是lagou,一个可行的办法是,对数据库中的每个记录去匹配是否与lagou一致。然而,效率更高的方法是,预先对数据库中所有的数据按照字母顺序进行排序,接着就可以从有序数据的中间开始查找,去通过二分查找不断缩小查找范围。如果这个系统的注册用户只有不足16个,两种查找方式所花费时间的差异也许并不明显,无非就是16次匹配与log₂16 = 4次匹配的区别。但如果注册用户的数量达到了1000万,两种查找算法的效率可能就是1000万次和24次的区别了(log₂10000000 = 23.25)。</p>
|
||
|
||
<p>我认为,数据结构与算法至关重要,不仅是优秀工程师思考如何解决业务问题、高效稳定地支撑公司业务、体现自身核心价值的关键,而且是入职<strong>大厂的必考内容</strong>。快手、今日头条、阿里等大厂面试,一定会考查你的数据结构与算法掌握情况,因为对于大流量应用来说,高效的算法直接影响用户体验。</p>
|
||
|
||
<p>但是数据结构和算法的学习并不轻松,你往往会经历以下痛苦:</p>
|
||
|
||
<ul>
|
||
|
||
<li>从原理到应用,所<strong>涵盖的知识非常多</strong>,大而全的通盘学习往往不现实,即使付出大量时间和精力坚持下来,但学得快,忘得也快;</li>
|
||
|
||
<li>为了应试或求职,<strong>大量刷题,却刷不会,即使看着答案也不理解,而且刷题效率低下</strong>,耐着性子学一天,也不过刷完了两道题,同类型问题稍加变动就又束手无策;</li>
|
||
|
||
<li>看了大量图书和学习资料,掌握了理论知识,但一<strong>遇到实际问题仍然无从下手</strong>。</li>
|
||
|
||
</ul>
|
||
|
||
<p><strong>其实学习和实践数据结构与算法,是有方法的。</strong> 这正是我和拉勾教育合作设计这个课程的初衷。我希望帮助你摆脱盲目刷题与漫无目的地学习方式,更加高效地掌握数据结构与算法知识,真正掌握程序开发、代码优化的方法论,完成从掌握理论知识到解决实际问题的转变。</p>
|
||
|
||
<h3>你为什么需要重学数据结构与算法?</h3>
|
||
|
||
<p>很多软件工程师都有进大厂的诉求,获得高薪 Offer,或者体验大厂的优质文化。但互联网的红利期早已过去,竞争也越来越激烈,“僧多粥少”的情况直接提高了面试“门槛”,诞生了“优秀工程师”的概念。</p>
|
||
|
||
<p><strong>优秀的软件工程师必须具备过硬的代码开发能力,而这就体现在你对数据结构、算法思维、代码效率优化等知识的储备上,并直接反应在你工作中解决实际问题的好坏上。</strong></p>
|
||
|
||
<p>比如,你要去开发某个复杂系统,如何才能围绕系统的复杂性去选择最合适的解决方案呢?一方面是对所用算法的选型,另一方面是对所用数据结构的选型,这都要求你对数据结构与算法有充分的理解和掌握。</p>
|
||
|
||
<p>但是 996、007 的互联网快节奏下,开发者普遍专注当下工作本身,并不追求极致的性能,一直在追语言,学框架,而忽视了数据结构与算法的学习和落地训练,基础知识储备不足,很难顺利做出最优的技术选择,从而导致开发的系统性能、稳定性都存在很多缺陷。</p>
|
||
|
||
<p><strong>此外,面试中都要重点考察数据结构与算法知识,这是不争的事实。</strong> 一是因为代码能力不容易评估,而数据结构和算法的掌握情况相对可衡量;二是可以衡量工程师的基本功,以及逻辑思考能力。</p>
|
||
|
||
<p>我曾经有个海外名校毕业的应届生同事,他的计算机领域基础知识,尤其是数据结构和算法、机器学习、深度学习等基本功特别扎实,在面对陌生问题时往往能更快速地锁定问题,并根据已有知识去寻找解决方法。短短几个月后,他就从刚入职的小白转变为某些项目的负责人。所以说,基本功扎实的人潜力会非常大,取得业绩结果只不过是时间问题。</p>
|
||
|
||
<p>而据我所知,为了快速掌握数据结构与算法知识,或者提高代码能力,绝大多数的学生或候选人一定会通过公开的题库去刷题,却常常被那些千变万化的代码题搞得晕头转向、不明所以,浪费了大量时间和精力,得不偿失。</p>
|
||
|
||
<p><strong>这并不是说刷题本身有错,而是应该掌握正确的方式方法。而且刷题只是形式,更重要的是掌握算法思维和原理,并用以解决实际的编码问题。</strong></p>
|
||
|
||
<p>我经常说,真题实际上是刨除了特定场景和业务问题后,对于我们实际解决问题的方法的提炼。考核真题和刷题不是目标,还是要最终回归到能力培养上来。这也是这门课中,我要核心传达给你的内容。</p>
|
||
|
||
<h3>如何学习数据结构与算法?</h3>
|
||
|
||
<p>我想,这可以从课程的特色与设计思路中很好地体现出来。</p>
|
||
|
||
<h4>课程特色</h4>
|
||
|
||
<ul>
|
||
|
||
<li><strong>重视方法论</strong>。我没有单纯去讲数据结构与算法,而是从程序优化的通用方法论讲起,以此为引子,让你更深刻地理解数据结构和算法思维在程序优化中的作用。</li>
|
||
|
||
<li><strong>内容精简、重点突出</strong>。市面上的课程,都会主打“大而全”,唯恐某些知识点没有讲到。殊不知,<strong>高频使用的数据结构就那么几个,其他往往是这些基础知识点的不同组合与变形</strong>,把这些牢牢掌握后,就已经足够解决你绝大多数的实际问题了。</li>
|
||
|
||
<li><strong>学习收获快</strong>。内容精简,且重视方法论的建设,可以快速建立程序优化的思想,并牢牢掌握知识体系中最核心、最根本的内容。我希望你快速抓住重点,迅速“所学即所得”地将知识运用到工作中去。</li>
|
||
|
||
</ul>
|
||
|
||
<h4>课程设置</h4>
|
||
|
||
<p>总结来说,这门课会从<strong>方法论、基础知识、真题演练、面试技巧</strong>这四个方面,为你提供成为优秀工程师的完整路径,具体包括以下五部分内容。</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>第一部分:方法论,也就是把“烂”代码优化为高效率代码的方法和路径,是这门课关于代码开发与优化方法框架的总纲</strong>。代码的目标,除了完成任务,还要求把某项任务高效率地完成。</li>
|
||
|
||
<li><strong>第二部分,在方法论的指引下,带你补充必备的数据结构基础知识</strong>。复杂度的降低,要求对数据有更好的组织方式,这正是数据结构需要解决的问题。为了合理选择数据结构,我们需要全面分析任务对数据处理和计算的基本操作,再根据不同数据结构在这些基本操作中的优劣特点去灵活选用合适的数据结构。</li>
|
||
|
||
<li><strong>第三部分,在方法论的指引下,带你掌握必备的算法思维,也就是用算法思考问题的逻辑和程序设计的重要思想</strong>。在一些实际问题的解决中,需要运用一些巧妙的方法,它们不会改变数据的组织方式,但可以通过巧妙的计算方式降低代码复杂度。常见的方法,如递归、二分法、排序算法、动态规划等,会在这一部分介绍。</li>
|
||
|
||
<li><strong>第四部分,面试真题详解,带你用前面的知识体系,去真正地解决问题</strong>。前三部分的知识合在一起,就是解决实际问题的工具包。<strong>面试题并非单纯考核人才的工具,更是实际业务问题高度提炼后的缩影,它能反映一个开发者的知识储备和问题解决能力</strong>。这一部分将深入剖析高频真题的解题方法和思路。</li>
|
||
|
||
<li><strong>第五部分,面试现场,给你一些求职时的切实建议</strong>。很多工程师有个共性问题,那就是明明有能力,却说不出来,表现得就像是个初学者一样。这部分,我通过补充面试经验,包括现场手写代码、问题分析、面试官注重的软素质等内容,来帮你解决这个问题。</li>
|
||
|
||
</ul>
|
||
|
||
<p><img src="assets/CgqCHl8_QyeAX6RGAAIqe25t_U8556.png" alt="数据结构.png" /></p>
|
||
|
||
<p>如果你是以下用户,那么本课程一定适合你:</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>参加校招的应届生</strong>,应届生需要具备充足的知识储备,这也是面试官核心考察的内容之一。</li>
|
||
|
||
<li><strong>需要补学数据结构与算法的程序员</strong>,以便在工作中更好地支撑和优化业务逻辑(比如搭建在线系统的 Java 后端同学,需要不断提高和优化系统性能),以及有意转行 Python 算法或人工智能等方向的程序员。</li>
|
||
|
||
<li><strong>基本功薄弱的软件工程师求职者</strong>,尤其是常年挂在面试手写代码的求职者。</li>
|
||
|
||
</ul>
|
||
|
||
<h3>讲师寄语</h3>
|
||
|
||
<p>数据结构与算法知识虽然庞杂、难懂,但却是编码能力的核心体现,不仅是技术面试的高频考点,更是高级 IT 工程师的必备技能,适用面非常广泛。在竞争越来越激烈的今天,我们经常说一个人的底层能力,决定了他能走多远,希望这个课程能够帮你打好基础。</p>
|
||
|
||
<p>最后,我想再说一句,即使你身处中小型企业,如今的精细化管理也在更多地讲究效率和质量。成为核心骨干的一个先决条件,就是准确的技术选型和扎实的代码基础,而这最基本的条件是要掌握算法思维和数据结构原理,这是代码开发和优化的方法论,是用以解决实际编码问题的精髓所在,也是这门课核心要传达的内容。</p>
|
||
|
||
<p>另外,被动阅读只能掌握 50%,我希望你能够在学习的过程中多动手练习和实践,真正达成内化吸收的闭环。你也可以寻找一起学习的伙伴,在留言区分享你的学习思考、动手实践的小成就,通过不同的动作来坚持学习的过程。OK,课程开始了,你准备好了吗?</p>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div>
|
||
|
||
|
||
|
||
<div style="float: right">
|
||
|
||
<a href="/专栏/重学数据结构与算法-完/01 复杂度:如何衡量程序运行的效率?.md.html">下一页</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
|
||
</div>
|
||
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997dbb4db13cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
|
||
</body>
|
||
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
|
||
<script>
|
||
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag() {
|
||
|
||
dataLayer.push(arguments);
|
||
|
||
}
|
||
gtag('js', new Date());
|
||
|
||
gtag('config', 'G-NPSEEVD756');
|
||
|
||
var path = window.location.pathname
|
||
|
||
var cookie = getCookie("lastPath");
|
||
|
||
console.log(path)
|
||
|
||
if (path.replace("/", "") === "") {
|
||
|
||
if (cookie.replace("/", "") !== "") {
|
||
|
||
console.log(cookie)
|
||
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
setCookie("lastPath", path)
|
||
|
||
}
|
||
function setCookie(cname, cvalue) {
|
||
|
||
var d = new Date();
|
||
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
|
||
var expires = "expires=" + d.toGMTString();
|
||
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
|
||
}
|
||
function getCookie(cname) {
|
||
|
||
var name = cname + "=";
|
||
|
||
var ca = document.cookie.split(';');
|
||
|
||
for (var i = 0; i < ca.length; i++) {
|
||
|
||
var c = ca[i].trim();
|
||
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
|
||
}
|
||
|
||
return "";
|
||
|
||
}
|
||
</script>
|
||
</html>
|
||
|