diff --git a/.DS_Store b/.DS_Store index cb80475d..9984cea5 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/README.md b/README.md index ad6a4fd4..09ea9f6b 100644 --- a/README.md +++ b/README.md @@ -1,186 +1,21 @@ -# 和小浩学算法 +# Hi, Boy -> 本项目于 2020.7.22 位于 github 日总榜第一!截图留念!(还没有助力的,右上角快来个 star ) +> On July 22, 2020, the project ranked first in GitHub daily list! Take a screenshot as a souvenir! (star in the upper right corner! Thank you) > [![图片展示失败,点击查看](https://www.geekxh.com/mark.png)](https://www.geekxh.com/mark.png) -## 简介 +Xiaohao algorithm is a graphic algorithm problem dictionary completed by me during the epidemic period! At present, it has completed 140 + high-frequency interview algorithm questions, with a total of 30W words. All of them are in the way of cartoon illustration, which is easy to understand and suitable for the primary and intermediate readers. > [![图片展示失败,点击查看](https://www.geekxh.com/book.png)](https://www.geekxh.com/book.png) -小浩算法是我在疫情期间完成的一部图解算法题典! 目前共完成 140+ 道高频面试算法题目,总计 30w 字,全部采用漫画图解的方式,简单易懂,适合初中级读者。 +> If you are willing to help me translate, welcome to contact ~ -## 如何使用 +# Related Topics -1、因为本教程完全免费,但现在被一些不良商家拿去卖钱, 所以我需要你先帮我点一个 star ,助力原创,防止更多人上当受骗,也顺便支持我一下。 +1、my_book(No translation yet.....) -2、如果你想直接下载我的这本电子书,[点击这里就行](https://www.geekxh.com/0.0.%E5%AD%A6%E4%B9%A0%E9%A1%BB%E7%9F%A5/03.html?3pVd) +2、showmecode_100() -3、如果你还想加入我们的万人刷题群,和我们一起交流,遇见更优秀的人。请下方扫码回复【进群】 +3、interview_100 -> [![图片展示失败,点击查看](https://www.geekxh.com/code.png)](https://www.geekxh.com/code.png) - -4、当然,也许你就想加我的私人微信: [个人名片](https://www.geekxh.com/contact.jpeg) - -## 本项目除此之外,还包括(持续更新): - -1、100 张超清思维导图 - -2、100 篇大厂面试面经 - -3、100 本清晰版电子书 - -## 内容展示 - -我这里截取了思维导图以及算法题解的内容图片,可以看一下效果: - -导图目录:[点击查看](https://www.geekxh.com/daotu-1.png) - -导图效果展示:[点击查看](https://www.geekxh.com/daotu-2.png) - -电子书效果展示: [点击查看](https://www.geekxh.com/book.png) - -网站效果:[点击查看](https://www.geekxh.com/demo.png) - -## 获取全部内容方式(任选其一) - -1、通过网站下载(推荐,网速快):[下载地址](https://www.geekxh.com/0.0.%E5%AD%A6%E4%B9%A0%E9%A1%BB%E7%9F%A5/03.html?3pVd) - -2、直接通过 github clone 项目。(国内不推荐) - -3、公众号扫码回复 999。(直接通过百度云下载) - -## 题解目录 - -* [开始学习](http://www.geekxh.com) - -* [阅读指南](http://www.geekxh.com/c99/hello.html) - -* [1.数组]() - * [01.两个数组的交集(350)](http://www.geekxh.com/1.0.数组系列/001.html) - * [02.最长公共前缀(14)](http://www.geekxh.com/1.0.数组系列/002.html) - * [03.买卖股票的最佳时机(122)](http://www.geekxh.com/1.0.数组系列/003.html) - * [04.旋转数组(189)](http://www.geekxh.com/1.0.数组系列/004.html) - * [05.原地删除(27)](http://www.geekxh.com/1.0.数组系列/005.html) - * [06.加一(66)](http://www.geekxh.com/1.0.数组系列/006.html) - * [07.两数之和(1)](http://www.geekxh.com/1.0.数组系列/007.html) - * [08.三数之和(15)](http://www.geekxh.com/1.0.数组系列/008.html) - * [09.Z字形变换(6)](http://www.geekxh.com/1.0.数组系列/009.html) - -* [2.链表]() - * [01.删除链表倒数第N个节点(19)](http://www.geekxh.com/1.1.链表系列/101.html) - * [02.合并两个有序链表(21)](http://www.geekxh.com/1.1.链表系列/102.html) - * [03.环形链表(21)](http://www.geekxh.com/1.1.链表系列/103.html) - * [04.两数相加(2)](http://www.geekxh.com/1.1.链表系列/104.html) - -* [3.动态规划]() - * [01.爬楼梯(70)](http://www.geekxh.com/1.2.动态规划系列/201.html) - * [02.最大子序和(53)](http://www.geekxh.com/1.2.动态规划系列/202.html) - * [03.最长上升子序列(300)](http://www.geekxh.com/1.2.动态规划系列/203.html) - * [04.三角形最小路径和(120)](http://www.geekxh.com/1.2.动态规划系列/204.html) - * [05.最小路径和(64)](http://www.geekxh.com/1.2.动态规划系列/205.html) - * [06.打家劫舍(198)](http://www.geekxh.com/1.2.动态规划系列/206.html) - -* [4.字符串]() - * [01.反转字符串(344)](http://www.geekxh.com/1.3.字符串系列/301.html) - * [02.字符串中的第一个唯一字符(387)](http://www.geekxh.com/1.3.字符串系列/302.html) - * [03.实现 Sunday 匹配](http://www.geekxh.com/1.3.字符串系列/303.html) - * [04.大数打印](http://www.geekxh.com/1.3.字符串系列/304.html) - * [05.验证回文串(125)](http://www.geekxh.com/1.3.字符串系列/305.html) - * [06.KMP 精讲](http://www.geekxh.com/1.3.字符串系列/306.html) - * [07.旋转字符串(796)](http://www.geekxh.com/1.3.字符串系列/307.html) - * [08.最后一个单词的长度(58)](http://www.geekxh.com/1.3.字符串系列/308.html) - -* [5.二叉树]() - * [01.最大深度与DFS(104)](http://www.geekxh.com/1.4.二叉树系列/401.html) - * [02.层次遍历与BFS(102)](http://www.geekxh.com/1.4.二叉树系列/402.html) - * [03.BST与其验证(98)](http://www.geekxh.com/1.4.二叉树系列/403.html) - * [04.BST 的查找(700)](http://www.geekxh.com/1.4.二叉树系列/404.html) - * [05.BST 的删除(450)](http://www.geekxh.com/1.4.二叉树系列/405.html) - * [06.平衡二叉树(110)](http://www.geekxh.com/1.4.二叉树系列/406.html) - * [07.完全二叉树(222)](http://www.geekxh.com/1.4.二叉树系列/407.html) - * [08.二叉树的剪枝(814)](http://www.geekxh.com/1.4.二叉树系列/408.html) - -* [6.滑动窗口]() - * [01.滑动窗口最大值(239)](http://www.geekxh.com/1.5.滑动窗口系列/501.html) - * [02.无重复字符的最长子串(3)](http://www.geekxh.com/1.5.滑动窗口系列/502.html) - * [03.找到字符串中所有字母异位词(438)](http://www.geekxh.com/1.5.滑动窗口系列/503.html) - * [04.和为s的连续正数序列](http://www.geekxh.com/1.5.滑动窗口系列/504.html) - -* [7.博弈论系列]() - * [01.囚徒困境](http://www.geekxh.com/1.6.博弈论系列/601.html) - * [02.辛普森悖论](http://www.geekxh.com/1.6.博弈论系列/602.html) - * [03.红眼睛和蓝眼睛](http://www.geekxh.com/1.6.博弈论系列/603.html) - * [04.海盗分金币](http://www.geekxh.com/1.6.博弈论系列/604.html) - * [05.智猪博弈](http://www.geekxh.com/1.6.博弈论系列/605.html) - * [06.生男生女的问题](http://www.geekxh.com/1.6.博弈论系列/606.html) - * [07.硬币问题](http://www.geekxh.com/1.6.博弈论系列/607.html) - * [08.画圈圈的问题](http://www.geekxh.com/1.6.博弈论系列/608.html) - * [09.巧克力问题](http://www.geekxh.com/1.6.博弈论系列/609.html) - * [10.大鱼和小鱼的问题](http://www.geekxh.com/1.6.博弈论系列/610.html) - -* [8.位运算系列]() - * [01.使用位运算求和](http://www.geekxh.com/1.8.位运算系列/801.html) - * [02.2的幂(231)](http://www.geekxh.com/1.8.位运算系列/802.html) - * [03.返回一个数二进制中1的个数](http://www.geekxh.com/1.8.位运算系列/803.html) - * [04.只出现一次的数字](http://www.geekxh.com/1.8.位运算系列/804.html) - * [05.只出现一次的数字Ⅱ](http://www.geekxh.com/1.8.位运算系列/805.html) - * [06.缺失数字(268)](http://www.geekxh.com/1.8.位运算系列/806.html) - -* [9.二分法系列]() - * [01.爱吃香蕉的珂珂(875)](http://www.geekxh.com/1.9.二分法系列/901.html) - * [02.x的平方根(69)](http://www.geekxh.com/1.9.二分法系列/902.html) - * [03.x的平方根(69)](http://www.geekxh.com/1.9.二分法系列/903.html) - * [04.旋转排序数组中的最小值Ⅰ(153)](http://www.geekxh.com/1.9.二分法系列/904.html) - * [05.旋转排序数组中的最小值Ⅱ(154)](http://www.geekxh.com/1.9.二分法系列/905.html) - * [06.供暖器(475)](http://www.geekxh.com/1.9.二分法系列/906.html) - -* [其他补充题目]() - * [01.螺旋矩阵(54)](http://www.geekxh.com/1.99.其他补充题目/01.html) - * [02.只有两个键的键盘(650)](http://www.geekxh.com/1.99.其他补充题目/02.html) - * [03.24点游戏(679)](http://www.geekxh.com/1.99.其他补充题目/03.html) - * [04.飞机座位分配概率(1227)](http://www.geekxh.com/1.99.其他补充题目/04.html) - * [05.水分子的产生](http://www.geekxh.com/1.99.其他补充题目/05.html) - * [06.救生艇(881)](http://www.geekxh.com/1.99.其他补充题目/06.html) - * [07.救生艇(881)](http://www.geekxh.com/1.99.其他补充题目/07.html) - * [08.灯泡开关(319)](http://www.geekxh.com/1.99.其他补充题目/08.html) - * [09.三门问题](http://www.geekxh.com/1.99.其他补充题目/09.html) - * [10.猜数字游戏(299)](http://www.geekxh.com/1.99.其他补充题目/10.html) - * [11.LRU缓存机制(146)](http://www.geekxh.com/1.99.其他补充题目/11.html) - * [12.最小的k个数](http://www.geekxh.com/1.99.其他补充题目/12.html) - * [13.不同路径](http://www.geekxh.com/1.99.其他补充题目/13.html) - * [14.不同路径-障碍物](http://www.geekxh.com/1.99.其他补充题目/14.html) - * [15.连续n个数的和](http://www.geekxh.com/1.99.其他补充题目/15.html) - * [16.盛水最多的容器](http://www.geekxh.com/1.99.其他补充题目/16.html) - * [17.扑克牌中的顺子容器](http://www.geekxh.com/1.99.其他补充题目/17.html) - * [18.整数拆分(343)](http://www.geekxh.com/1.99.其他补充题目/18.html) - * [19.移动石子到连续(1033)](http://www.geekxh.com/1.99.其他补充题目/19.html) - * [20.Nim游戏(292)](http://www.geekxh.com/1.99.其他补充题目/20.html) - * [21.寻找两个正序数组的中位数(4)](http://www.geekxh.com/1.99.其他补充题目/21.html) - * [22.第k个最大元素(215)](http://www.geekxh.com/1.99.其他补充题目/22.html) - * [23.镜面反射(858)](http://www.geekxh.com/1.99.其他补充题目/23.html) - * [25.整数转罗马数字(12)](http://www.geekxh.com/1.99.其他补充题目/25.html) - * [26.荷兰国旗问题](http://www.geekxh.com/1.99.其他补充题目/26.html) - * [27.六九问题](http://www.geekxh.com/1.99.其他补充题目/27.html) - * [28.有效的数独](http://www.geekxh.com/1.99.其他补充题目/28.html) - * [29.费米估算](http://www.geekxh.com/1.99.其他补充题目/29.html) - * [30.分发饼干](http://www.geekxh.com/1.99.其他补充题目/30.html) - * [31.生命游戏(289)](http://www.geekxh.com/1.99.其他补充题目/31.html) - * [32.搜索二维矩阵(74)](http://www.geekxh.com/1.99.其他补充题目/32.html) - * [33.子集(78)](http://www.geekxh.com/1.99.其他补充题目/33.html) - * [34.面试中的智力题](http://www.geekxh.com/1.99.其他补充题目/34.html) - * [35.旋转图像(48)](http://www.geekxh.com/1.99.其他补充题目/51.html) - - -* [其他:排序专栏]() - * [排序算法](http://www.geekxh.com/2.0.排序系列/0.hello.html) - * [冒泡排序](http://www.geekxh.com/2.0.排序系列/1.bubbleSort.html) - * [选择排序](http://www.geekxh.com/2.0.排序系列/2.selectionSort.html) - * [插入排序](http://www.geekxh.com/2.0.排序系列/3.insertionSort.html) - * [希尔排序](http://www.geekxh.com/2.0.排序系列/4.shellSort.html) - * [归并排序](http://www.geekxh.com/2.0.排序系列/5.mergeSort.html) - * [快速排序](http://www.geekxh.com/2.0.排序系列/6.quickSort.html) - * [堆排序](http://www.geekxh.com/2.0.排序系列/7.heapSort.html) - * [计数排序](http://www.geekxh.com/2.0.排序系列/8.countingSort.html) - * [桶排序](http://www.geekxh.com/2.0.排序系列/9.bucketSort.html) - * [基数排序](http://www.geekxh.com/2.0.排序系列/10.radixSort.html) +4、mindMap_100(42 HD mind map...) \ No newline at end of file diff --git a/interview_100/awesome_interview/README.md b/interview_100/awesome_interview/README.md new file mode 100644 index 00000000..d338a850 --- /dev/null +++ b/interview_100/awesome_interview/README.md @@ -0,0 +1,644 @@ +# Awesome Interviews [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) + +> A curated list of lists of technical interview questions. + +[What makes for an awesome list?](awesome.md) + +Please read the [contribution guidelines](contributing.md) or the [creating a list guide](create-list.md) if you want to contribute. + +--- + +
+

+ + Looking for a job? +
+ No resume needed. Just prove you can code. +
+

+ Tripblebyte +
+ + Clicking this helps fund the Awesome project +

+
+ +--- + +
+

+ + Having Tech Interview? +
3600 Tech Interview Questions. Answered. +
+

+ FullStack.Cafe +
+ + Proudly supporting the Awesome project +

+
+ +--- + +### Table of Contents + +- [Programming Languages/Frameworks/Platforms](#programming-languagesframeworksplatforms) + - [Android](#android) + - [AngularJS](#angularjs) + - [Angular](#angular) + - [BackboneJS](#backbonejs) + - [C++](#c) + - [C](#c-1) + - [C♯](#c-2) + - [.NET](#net) + - [Clojure](#clojure) + - [CSS](#css) + - [Cucumber](#cucumber) + - [Django](#django) + - [Docker](#docker) + - [EmberJS](#emberjs) + - [Erlang](#erlang) + - [Golang](#golang) + - [GraphQl](#graphql) + - [HTML](#html) + - [Ionic](#ionic) + - [iOS](#ios) + - [Java](#java) + - [JavaScript](#javascript) + - [jQuery](#jquery) + - [Front-end build tools](#front-end-build-tools) + - [KnockoutJS](#knockoutjs) + - [Less](#less) + - [Lisp](#lisp) + - [NodeJS](#nodejs) + - [Objective-C](#objective-c) + - [PHP](#php) + - [Python](#python) + - [ReactJS](#reactjs) + - [Rails](#ruby-on-rails) + - [Ruby](#ruby) + - [Rust](#rust) + - [Sass](#sass) + - [Scala](#scala) + - [Shell](#shell) + - [Swift](#swift) + - [Wordpress](#wordpress) + - [TypeScript](#typescript) + +- [Database technologies](#database-technologies) + - [Cassandra](#cassandra) + - [Microsoft Access](#microsoft-access) + - [MongoDB](#mongodb) + - [MySQL](#mysql) + - [Neo4j](#neo4j) + - [Oracle](#oracle) + - [Postgres](#postgres) + - [SQL](#sql) + - [SQL Lite](#sql-lite) +- [Caching technologies](#caching-technologies) + - [Memcached](#memcached) + - [Redis](#redis) + +- [OS](#os) + - [Linux](#linux) + - [Windows](#windows) +- [Algorithms](#algorithms) +- [Blockchain](#blockchain) +- [Coding exercises](#coding-exercises) +- [Comprehensive lists](#comprehensive-lists) +- [Design patterns](#design-patterns) +- [Data structures](#data-structures) +- [Networks](#networks) +- [Security](#security) +- [Data Science](#data-science) + +## Programming Languages/Frameworks/Platforms + +### Android + +* [10 Android interview question answers for Freshers](http://www.careerride.com/android-interview-questions.aspx) +* [20 Essential Android Interview Questions from Toptal](http://www.toptal.com/android/interview-questions) +* [25 Essential Android Interview Questions from Adeva](https://adevait.com/android/interview-questions) +* [50 android interview questions & answers](http://career.guru99.com/50-android-interview-questions-answers/). +* [A couple of Android questions posted by Quora users](https://www.quora.com/What-are-good-job-interview-questions-for-an-Android-developer) +* [A great list of Android interview questions covering all the aspects of this career](http://www.tutorialspoint.com/android/android_interview_questions.htm) +* [Collection of Android and Java related questions and topics, including general developer questions, Java core, Data structures, Build Tools, Programming Paradigms, Core Android, Databases and etc](https://github.com/derekargueta/Android-Interview-Questions) +* [Collection of Android and Java questions divided by experience](https://medium.com/@neteinstein/not-another-android-interviews-article-the-questions-3dedafa30bec) +* [Android Interview Questions & How to Interview Candidates](https://pangara.com/blog/android-interview-questions) +* [RocketSkill App Android Interview Questions](https://github.com/mindash/android-structured-interview) + +### AngularJS + +* [12 Essential AngularJS Interview Questions from Toptal](http://www.toptal.com/angular-js/interview-questions) +* [An AngularJS exam with questions from beginner to expert by @gdi2290 from @AngularClass](https://github.com/gdi2290/ngExam) +* [29 AngularJS Interview Questions – Can You Answer Them All? Great Article from Codementor](https://www.codementor.io/angularjs/tutorial/angularjs-interview-questions-sample-answers) +* [AngularJS interview questions and answers for experienced developers](http://www.web-technology-experts-notes.in/2014/11/angularjs-interview-questions-and-answers-for-experienced.html) +* [AngularJS Interview Questions which have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of AngularJS](http://www.tutorialspoint.com/angularjs/angularjs_interview_questions.htm) +* [This article discusses the top 50 Most occurred AngularJS interview question with answers](http://www.codeproject.com/Articles/891718/AngularJS-Interview-Questions-and-Answers) +* [Top 25 Angularjs Interview Questions and Quiz](http://career.guru99.com/top-25-angular-js-interview-questions/) +* [100 AngularJS Interview Questions - Quick Refresher](https://www.techbeamers.com/latest-angularjs-interview-questions-answers/) + +### Angular + +* [A list of helpful Angular related questions you can use to interview potential candidates, test yourself or completely ignore](https://github.com/Yonet/Angular-Interview-Questions) +* [Angular 2 Interview Questions](https://www.onlineinterviewquestions.com/angular2-interview-questions/) +* [List of 300 Angular Interview Questions and Answers](https://github.com/sudheerj/angular-interview-questions) + + +### BackboneJS + +* [8 Essential Backbonejs Interview Questions from Toptal](http://www.toptal.com/backbone-js/interview-questions) +* [Backbonejs Interview Questions And Answers from web technology experts notes](http://www.web-technology-experts-notes.in/2015/01/backbone-js-interview-questions-and-answers.html) +* [Top 25 Backbone.js interview questions](http://career.guru99.com/top-25-backbone-js-interview-questions/) + +### C++ + +* [1000+ Multiple Choice Questions & Answers in C++ with explanations](http://www.sanfoundry.com/cplusplus-interview-questions-answers/) +* [200 C++ interview questions and answers](http://www.careerride.com/C++-Interview-questions-Answer.aspx) +* [24 Essential C++ Interview Questions from Toptal](http://www.toptal.com/c-plus-plus/interview-questions) +* [C++ Interview Questions and Answers for Freshers and Experienced developers](http://a4academics.com/interview-questions/57-c-plus-plus/419-cpp-interview-questions-answers) +* [C++ Interview Questions from GeekInterview](http://www.geekinterview.com/Interview-Questions/Languages/C-Plus-Plus) +* [C++ Programming Q&A and quizzes from computer science portal for geeks](http://www.geeksforgeeks.org/c-plus-plus/) +* [C++ Programming Questions and Answers related to such topics as OOPs concepts, Object and Classes, Functions, Constructors and Destructors, Inheritance and etc](http://www.indiabix.com/cpp-programming/questions-and-answers/) +* [LeetCode Problems' Solutions written in C++](https://github.com/haoel/leetcode) +* [25 Fundamental C++ Interview Questions](https://pangara.com/blog/cplusplus-interview-questions) + +### C + +* [Basic C language technical frequently asked interview questions and answers It includes data structures, pointers interview questions and answers for experienced](http://www.cquestions.com/2010/10/c-interview-questions-and-answers.html) +* [C Programming Interview Questions and Answers for such topics as Bits and Bytes, Preprocessors, Functions, Strings, Language basics and etc](http://www.indiabix.com/technical/c/) +* [C Programming Interview Questions have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of C Programming](http://www.tutorialspoint.com/cprogramming/cprogramming_interview_questions.htm) +* [First set of commonly asked C programming interview questions from computer science portal for geeks](http://geeksquiz.com/commonly-asked-c-programming-interview-questions-set-1/) +* [Second set of commonly asked C programming interview questions from computer science portal for geeks](http://geeksquiz.com/commonly-asked-c-programming-interview-questions-set-2/) +* [9 Essential C Interview Questions with answers](https://www.toptal.com/c/interview-questions) + +### C# + +* [15 Essential C# Interview Question from Toptal](http://www.toptal.com/c-sharp/interview-questions) +* [C# interview questions from dotnetfunda.com](http://www.dotnetfunda.com/interviews/cat/6/csharp) +* [Top 100 C# Interview Questions and Answers](http://a4academics.com/interview-questions/52-dot-net-interview-questions/417-c-oops-interview-questions-and-answers) +* [Top 50 C# Interview Questions & Answers](http://career.guru99.com/top-50-c-sharp-interview-questions-answers/) +* [50 C# Coding Interview Questions and Answers](https://www.techbeamers.com/csharp-coding-interview-questions-developers/) +* [20 C# OOPS Interview Questions and Answers](https://www.techbeamers.com/csharp-oops-interview-questions-answers/) + +### .NET + +* [300 ASPNET interview questions and answers](http://www.careerride.com/ASPNet-Questions.aspx) +* [ASP.NET Core Interview Questions](https://www.talkingdotnet.com/asp-net-core-interview-questions/) +* [Great list of NET interview questions covering all the NET platform topics](http://www.indiabix.com/technical/dotnet/) +* [NET Interview Questions and Answers for Beginners which consists of the most frequently asked questions in NET This list of 100+ questions and answers gauge your familiarity with the NET platform](http://www.dotnetcurry.com/dotnetinterview/70/dotnet-interview-questions-answers-beginners) +* [Questions gathered by community of the StackOverflow](http://stackoverflow.com/questions/365489/questions-every-good-net-developer-should-be-able-to-answer) +* [What Great NET Developers Ought To Know (More NET Interview Questions)](http://www.hanselman.com/blog/WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions.aspx) + +### Clojure + +* [Classic 'Fizz Buzz' interview question for Clojure developers](http://www.learningclojure.com/2014/05/fizz-buzz-interview-question.html) +* [Clojure Interview Questions for experienced devs](http://ita2zguide.blogspot.com.by/p/cc.html) +* [Coding exercises in Clojure, handy practice for technical interview questions](https://github.com/dpetrovics/coding-exercises) +* [Experience and questions from Clojure developer interview collected by Reddit users](https://www.reddit.com/r/Clojure/comments/34qhha/clojure_coding_job_interview_experience/) +* [Interview cake Clojure solutions](https://github.com/DerekCuevas/interview-cake-clj) + +### CSS + +* [CSS interview questions and answers for freshers and experienced candidates Also there you can find CSS online practice tests to fight written tests and certification exams on CSS](http://www.careerride.com/Interview-Questions-CSS.aspx) +* [Development hiring managers and potential interviewees may find there sample CSS proficiency interview Q&As and code snippets useful](http://www.techrepublic.com/blog/software-engineer/css-interview-questions-and-answers/) +* [Interview Questions and Exercises About CSS](https://css-tricks.com/interview-questions-css/) +* [Top 50 CSS(Cascading Style Sheet) Interview Questions covering the most of tricky CSS moments](http://career.guru99.com/top-50-csscascading-style-sheet-interview-questions/) +* [CSS Questions and Answers](https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/css-questions.md) + +### Cucumber + +* [Cucumber Web Application BDD Sample Interview Questions](https://ratedr05.wordpress.com/2017/09/22/cucumber-interview-questions/) +* [Guide to building a simple Cucumber + Watir page object pattern framework](http://watir.com/simple-cucumber-watir-page-object-pattern-framework/) + +### Django + +* [Some abstract interview questions for Python/Django developers](http://insights.dice.com/2014/04/30/interview-questions-pythondjango-developers/) +* [Some Django basic interview questions to establish the basic level of the candidates](http://www.ilian.io/django-interview-questions/) +* [Top 16 Django Interview Questions for both freshers and experienced developers](http://career.guru99.com/top-16-django-interview-questions/) + +### Docker + +* [Docker Interview Questions](https://mindmajix.com/docker-interview-questions) +* [Top Docker Interview Questions You Must Prepare In 2019](https://www.edureka.co/blog/interview-questions/docker-interview-questions/) +* [Top Docker Interview Questions And Answers](https://intellipaat.com/interview-question/docker-interview-questions/) +* [DOCKER (SOFTWARE) INTERVIEW QUESTIONS & ANSWERS](https://www.wisdomjobs.com/e-university/docker-software-interview-questions.html) +* [30 Docker Interview Questions and Answers in 2019](https://www.fullstack.cafe/blog/docker-interview-questions-and-answers) + +### EmberJS + +* [8 Essential Emberjs Interview Questions from Toptal](http://www.toptal.com/emberjs/interview-questions) +* [Top 25 Emberjs Interview Questions for both freshers and experienced developers](http://career.guru99.com/top-25-ember-js-interview-questions/) + +### Erlang + +* [Top 22 Erlang Interview Questions for both freshers and experienced developers](http://career.guru99.com/top-22-erlang-interview-questions/) + +### Golang + +* [Solutions for Elements of Programming Interviews problems written in Golang](https://github.com/mrekucci/epi) +* [Solutions for some basic coding interview tasks written in Go](https://github.com/efischer19/golang_ctci) +* [Top 20 GO Programming Interview Questions for both freshers and experienced developers](http://career.guru99.com/top-20-go-programming-interview-questions/) + +### GraphQl + +* [8 GraphQl Interview Questions To Know](https://www.fullstack.cafe/blog/5-graphql-interview-questions-you-should-know) +* [How to GraphQl - Common Questions](https://www.howtographql.com/advanced/5-common-questions/) + +### HTML + +* [10 Typical HTML Interview Exercises from SitePoint.com](http://www.sitepoint.com/10-typical-html-interview-exercises/) +* [16 Essential HTML5 Interview Questions from Toptal](http://www.toptal.com/html5/interview-questions) +* [40 important HTML 5 Interview questions with answers](http://www.codeproject.com/Articles/702051/important-HTML-Interview-questions-with-answe) +* [HTML interview questions and answers for freshers and experienced candidates Also find HTML online practice tests to fight written tests and certification exams on HTML](http://www.careerride.com/Interview-Questions-HTML.aspx) +* [Top 50 HTML Interview Questions for both freshers and experienced developers](http://career.guru99.com/top-50-html-interview-questions/) +* [Common HTML interview questions for freshers](http://www.javatpoint.com/html-interview-questions) +* [HTML Questions and Answers](https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/html-questions.md) +* [30 HTML Interview Questions and Answers](https://www.techbeamers.com/latest-html-interview-questions/) + +### Ionic + +* [23 Beginner Level Ionic Framework Questions](http://www.codeandyou.com/p/ionic-interview-questions.html) +* [12 Essential Ionic Interview Questions](https://www.toptal.com/ionic/interview-questions) + +### iOS + +* [14 Essential iOS Interview Questions from Toptal](http://www.toptal.com/ios/interview-questions) +* [20 iOS Developer Interview Questions and Answers for getting you ready for your interview](https://www.codementor.io/ios/tutorial/ios-interview-tips-questions-answers-objective-c) +* [25 Essential iOS Interview Questions from Adeva](https://adevait.com/ios/interview-questions) +* [A small guide to help those looking to hire a developer or designer for iOS work While tailored for iOS, many questions could be used for Android developers or designers as well A great self-test if you're looking to keep current or practice for your own interview](https://github.com/CameronBanga/iOS-Developer-and-Designer-Interview-Questions) +* [All you need to know about iOS technical interview including some tips for preparing, questions and some coding exercises](http://www.raywenderlich.com/53962/ios-interview-questions) +* [Interview Questions for iOS and Mac Developers from the CEO of Black Pixel](https://blackpixel.com/writing/2013/04/interview-questions-for-ios-and-mac-developers-1.html) +* [iOS Interview Questions and Answers including such topics as Development Basics, App states and multitasking, App states, Core app objects](http://www.geekinterview.com/Interview-Questions/iOS) +* [iOS Interview Questions For Senior Developers](https://m.smartcloud.io/ios-interview-questions-for-senior-developers-in-2017-a94cc81c8205) +* [50 iOS Interview Questions And Answers 1](https://medium.com/ios-os-x-development/ios-interview-questions-13840247a57a) +* [50 iOS Interview Questions And Answers Part 2](https://medium.com/ios-os-x-development/50-ios-interview-questions-and-answers-part-2-45f952230b9f) +* [50 iOS Interview Questions And Answers Part 3](https://medium.com/ios-os-x-development/50-ios-interview-questions-and-answers-part-3-3fad146b6c3d) +* [50 iOS Interview Questions And Answers Part 4](https://medium.com/@duruldalkanat/50-ios-interview-questions-and-answers-part-4-6f26b26341a) +* [50 iOS Interview Questions And Answers Part 5](https://medium.com/@duruldalkanat/50-ios-interview-questions-and-answers-part-5-de6241374a8f) +* [10 iOS interview questions and answers](https://www.upwork.com/i/interview-questions/ios/) +* [iOS Developer and Designer Interview Questions](https://github.com/9magnets/iOS-Developer-and-Designer-Interview-Questions#tech) +* [IOS Interview Questions and Answers](http://www.thecrazyprogrammer.com/2015/11/ios-interview-questions-and-answers.html) +* [iOS Interview Questions For Beginners](http://ichuiphonedev.blogspot.com/2014/05/iphone-latest-interview-questions-and.html) +* [Babylon iOS Interview Questions](https://github.com/Babylonpartners/ios-playbook/blob/master/Interview/questions.md) +* [RocketSkill App iOS Interview Questions](https://github.com/mindash/iOS-structured-interview) + +### Java + +* [115 Java Interview Questions and Answers – The ULTIMATE List](http://www.javacodegeeks.com/2014/04/java-interview-questions-and-answers.html) +* [37 Java Interview Questions to Practice With from Codementor](https://www.codementor.io/java/tutorial/java-interview-sample-questions-answers) +* [21 Essential Java Interview Questions](http://www.toptal.com/java/interview-questions) +* [29 Essential Java Interview Questions from Adeva](https://adevait.com/java/interview-questions) +* [A collection of Java interview questions and answers to them](https://github.com/svozniuk/java-interviews) +* [Data Structures and Algorithms in Java which can be useful in interview process](https://github.com/donbeave/interview) +* [Java Interview Questions: How to crack the TOP 15 questions](https://blog.udemy.com/java-interview-questions/) +* [300 Core Java Interview Questions](http://www.javatpoint.com/corejava-interview-questions) +* [Top 10 Tricky Java interview questions and Answers](http://java67.blogspot.com.by/2012/09/top-10-tricky-java-interview-questions-answers.html) +* [Top 25 Most Frequently Asked Interview Core Java Interview Questions And Answers](http://javahungry.blogspot.com/2013/06/top-25-most-frequently-asked-core-java.html) +* [Top 40 Core Java Interview Questions Answers from Telephonic Round](http://java67.blogspot.sg/2015/03/top-40-core-java-interview-questions-answers-telephonic-round.html) +* [Interview Cake Java Interview Questions](https://www.interviewcake.com/java-interview-questions) +* [Java Interview Questions & Quizzes](https://www.techbeamers.com/java-interview-questions/) + +### JavaScript + +* [Practice common algorithms using JavaScript](https://github.com/ignacio-chiazzo/Algorithms-Leetcode-Javascript) +* [10 Interview Questions Every JavaScript Developer Should Know](https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95) +* [21 Essential JavaScript Interview Questions from best mentors all over the world](https://www.codementor.io/javascript/tutorial/21-essential-javascript-tech-interview-practice-questions-answers) +* [20 Essential JavaScript Interview Questions from Adeva](https://adevait.com/javascript-developers/interview-questions) +* [37 Essential JavaScript Interview Questions from Toptal](http://www.toptal.com/javascript/interview-questions) +* [5 More JavaScript Interview Exercises](http://www.sitepoint.com/5-javascript-interview-exercises/) +* [5 Typical JavaScript Interview Exercises](http://www.sitepoint.com/5-typical-javascript-interview-exercises/) +* [Development hiring managers and potential interviewees may find these sample JavaScript proficiency interview Q&As and code snippets useful](http://www.techrepublic.com/blog/software-engineer/javascript-interview-questions-and-answers/) +* [123 Essential JavaScript Interview Question](https://github.com/nishant8BITS/123-Essential-JavaScript-Interview-Question) +* [JavaScript Interview Questions have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of JavaScript](http://www.tutorialspoint.com/javascript/javascript_interview_questions.htm) +* [JS: Basics and Tricky Questions](http://www.thatjsdude.com/interview/js2.html) +* [JS: Interview Algorithm](http://thatjsdude.com/interview/js1.html) +* [Some basic javascript coding challenges and interview questions](https://github.com/kolodny/exercises) +* [Some JavaScript interview exercises](https://github.com/csvenja/javascript-exercises) +* [Ten Questions I've Been Asked, Most More Than Once, Over Six Technical JavaScript / Front-End Engineer Job Interviews.](https://www.reddit.com/r/javascript/comments/3rb88w/ten_questions_ive_been_asked_most_more_than_once) +* [Top 85 JavaScript Interview Questions](http://career.guru99.com/top-85-javascript-interview-questions/) +* [Interview Cake JavaScript Interview Questions](https://www.interviewcake.com/javascript-interview-questions) +* [The Best Frontend JavaScript Interview Questions (written by a Frontend Engineer)](https://performancejs.com/post/hde6d32/The-Best-Frontend-JavaScript-Interview-Questions-(written-by-a-Frontend-Engineer)) +* [10 JavaScript Concepts You Need to Know for Interviews](https://dev.to/arnavaggarwal/10-javascript-concepts-you-need-to-know-for-interviews) +* [Front end interview handbook](https://github.com/yangshun/front-end-interview-handbook) +* [JavaScript Interview Questions - Quick Refresher](https://www.techbeamers.com/javascript-interview-questions-answers/) +* [The MEGA Interview Guide](https://github.com/danieldelcore/mega-interview-guide) + +### jQuery + +* [70 jQuery Interview Questions to Ace Your Next Interview](https://pangara.com/blog/70-jquery-interview-questions) +* [Top 50 jquery interview questions](https://career.guru99.com/top-50-jquery-interview-questions/) +* [17 Essential jQuery Interview Questions From Toptal](https://www.toptal.com/jquery/interview-questions) + + +### Front-end build tools + +* [Webpack interview questions & answers](https://github.com/styopdev/webpack-interview-questions) +* [Gulp js interview questions](https://www.codeproject.com/Articles/1065184/Latest-Gulp-js-interview-questions) +* [Grunt js interview questions for beginners](http://www.talkingdotnet.com/grunt-js-interview-questions/) +* [Grunt js interview questions](https://mindmajix.com/grunt-interview-questions) + +### KnockoutJS + +* [15 interview questions from CodeSample.com](http://www.code-sample.com/2014/01/knockout-js-interview-questions-and.html) +* [20 questions you might be asked about KnockoutJS in an interview for both freshers and experienced developers](http://www.codeproject.com/Articles/987899/KnockoutJS-interview-questions) + +### Less + +* [Top 25 LESS Interview Questions](http://career.guru99.com/top-25-less-interview-questions/) + +### Lisp + +* [10 LISP Questions & Answers](http://www.sanfoundry.com/lisp-mcqs-class/) +* [Top 18 Lisp Interview Questions from Career Guru](http://career.guru99.com/top-18-lisp-interview-questions/) + +### NodeJS + +* [25 Essential Node.js Interview Questions from Adeva](https://adevait.com/nodejs/interview-questions) +* [8 Essential Nodejs Interview Questions from Toptal](http://www.toptal.com/nodejs/interview-questions) +* [Node.JS Interview Questions have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of Node.JS](http://www.tutorialspoint.com/nodejs/nodejs_interview_questions.htm) +* [Node.js Interview Questions and Answers](https://blog.risingstack.com/node-js-interview-questions/) +* [Top 25 Nodejs Interview Questions & Answers from Career Guru](http://career.guru99.com/top-25-interview-questions-on-node-js/) +* [Top 30 Node.Js Interview Questions With Answers](https://www.techbeamers.com/top-30-node-js-interview-questions-answers/) + +### Objective-C + +* [Interview Qs for Objective-C and Swift](http://insights.dice.com/2015/07/21/interview-qs-objective-c-swift/) +* [iOS/ObjC Interview Questions](http://andras.palfi.hu/iosobjc-interview-questions/) +* [iOS Interview Questions For Beginners](http://ichuiphonedev.blogspot.com/2014/05/iphone-latest-interview-questions-and.html) + +### PHP + +* [100 PHP interview questions and answers from CareerRide.com](http://www.careerride.com/PHP-Interview-Questions.aspx) +* [21 Essential PHP Interview Questions from Toptal](http://www.toptal.com/php/interview-questions) +* [20 Common PHP Job Interview Questions and Answers](http://www.woodstitch.com/resources/php-interview-questions.php) +* [25 Essential PHP Interview Questions from Adeva](https://adevait.com/php/interview-questions) +* [PHP interview questions and answers for freshers](http://phpinterviewquestions.co.in/) +* [Top 100 PHP Interview Questions & Answers from CareerGuru](http://career.guru99.com/top-100-php-interview-questions-answers/) +* [25 PHP Interview Questions](https://www.codementor.io/php/tutorial/php-interview-questions-sample-answers) +* [26 Essential PHP Interview Questions for 2018](https://pangara.com/blog/php-interview-questions) +* [Cracking PHP Interviews Questions ebook 300+ Q&A](https://bootsity.com/books) +* [PHP Interview Questions - Quick Refresher](https://www.techbeamers.com/latest-php-interview-questions-answers/) + +### Python + +* [26 Essential Python Interview Questions from Adeva](https://adevait.com/python/interview-questions) +* [50 Python interview questions and answers](http://www.careerride.com/python-interview-questions.aspx) +* [11 Essential Python Interview Questions from Toptal](http://www.toptal.com/python/interview-questions) +* [A listing of questions that could potentially be asked for a python job listing](https://github.com/sigmavirus24/python-interview-questions) +* [Interview Questions for both beginners and experts](http://www.bogotobogo.com/python/python_interview_questions.php) +* [Interview Cake Python Interview Questions](https://www.interviewcake.com/python-interview-questions) +* [Python Frequently Asked Questions (Programming)](https://docs.python.org/2/faq/programming.html) +* [Python interview questions collected by Reddit users](https://www.reddit.com/r/Python/comments/1knw7z/python_interview_questions) +* [Top 25 Python Interview Questions from Career Guru](http://career.guru99.com/top-25-python-interview-questions/) +* [Python Interview 10 questions from Corey Schafer](https://www.youtube.com/watch?v=DEwgZNC-KyE) +* [Python interview questions. Part I. Junior](https://luminousmen.com/post/6) +* [Python interview questions. Part II. Middle](https://luminousmen.com/post/7) +* [Python interview questions. Part III. Senior](https://luminousmen.com/post/8) +* [Python Interview Questions and Answers (2019)](https://www.interviewbit.com/python-interview-questions/) +* [100 Python Interview Questions - Quick Refresher](https://www.techbeamers.com/python-interview-questions-programmers/) + +### Ruby on Rails + +* [20 Ruby on Rails interview questions and answers from CareerRide.com](http://www.careerride.com/ruby-on-rails-interview-questions.aspx) +* [9 Essential Ruby on Rails Interview Questions from Toptal](http://www.toptal.com/ruby-on-rails/interview-questions) +* [A list of common questions with answers ask during interview of ruby on rails job](https://github.com/rishiip/ruby-on-rails-interview-questions) +* [Ruby And Ruby On Rails interview Q&A](http://anilpunjabi.tumblr.com/post/25948339235/ruby-and-rails-interview-questions-and-answers) +* [Some of the most frequently asked Ruby on Rails questions and how to answer them confidently](https://srikantmahapatra.wordpress.com/2013/11/07/ruby-on-rails-interview-questions-and-answers/) +* [11 Ruby on Rails Interview Practice Questions](https://www.codementor.io/ruby-on-rails/tutorial/ruby-on-rails-interview-questions) +* [Top 53 Ruby on Rails Interview Questions & Answers](https://career.guru99.com/top-34-ruby-on-rail-interview-questions/) +* [10 Ruby on Rails interview questions and answers](https://www.upwork.com/i/interview-questions/ruby-on-rails/) + +### ReactJS + +* [Reddit users share their expectations from ReactJS interview](https://www.reddit.com/r/reactjs/comments/3m5equ/react_what_interview_questions_to_expect/) +* [This is a first in the series of interview questions related with ReactJS](http://interview-questions-247.appspot.com/reactjs-interview-questions-set-1) +* [This quiz intends to test your understanding around ReactJS fundamentals (Set 3)](http://interview-questions-247.appspot.com/reactjs-interview-questions-set-3) +* [This quiz intends to test your understanding around ReactJS fundamentals](http://interview-questions-247.appspot.com/reactjs-interview-questions-set-2) +* [5 Essential React.js Interview Questions](https://www.codementor.io/reactjs/tutorial/5-essential-reactjs-interview-questions) +* [React Interview Questions](https://tylermcginnis.com/react-interview-questions/) +* [Toptal's 13 Essential React.js Interview Questions](https://www.toptal.com/react/interview-questions) +* [19 Essential ReactJs Interview Questions](https://www.educba.com/reactjs-interview-questions/) + +### Ruby + +* [21 Essential Ruby Interview Questions from Toptal](http://www.toptal.com/ruby/interview-questions) +* [15 Questions to Ask During a Ruby Interview](https://gist.github.com/ryansobol/5252653) +* [A list of questions about Ruby programming you can use to quiz yourself](https://github.com/undr/ruby-trivia) +* [The Art of Ruby Technical Interview](http://technology.customink.com/blog/2015/11/23/the-art-of-ruby-technical-interviews/) +* [Interview Cake Ruby Interview Questions](https://www.interviewcake.com/ruby-interview-questions) +* [Frequently Asked Ruby Interview Questions](https://www.javatpoint.com/ruby-interview-questions) + +### Rust + +* [Top 250+ Rust Programming Language Interview Questions](https://www.wisdomjobs.com/e-university/rust-programming-language-interview-questions.html) +* [Rust Programming Interview Questions and Answers](https://www.code-sample.com/2018/02/rust-programming-interview-questions.html) +* [rust-exam: A set of questions about the Rust programming language](https://github.com/jean553/rust-exam) +* [Best Rust Programming Language Interview Questions and answers](https://www.bestinterviewquestion.com/rust-programming-language-interview-questions) + + +### Sass + +* [Top 17 Sass Interview Questions from Career Guru](http://career.guru99.com/top-17-sass-interview-questions/) +* [Top 10 Sass Interview Questions from educba](https://www.educba.com/sass-interview-questions/) + +### Scala + +* [4 Interview Questions for Scala Developers](http://insights.dice.com/2014/09/12/4-interview-questions-scala-developers/) +* [A list of Frequently Asked Questions and their answers, sorted by category](http://www.scala-lang.org/old/faq) +* [A list of helpful Scala related questions you can use to interview potential candidates](https://github.com/Jarlakxen/Scala-Interview-Questions) +* [How Scala Developers Are Being Interviewed](http://programmers.stackexchange.com/questions/58145/how-scala-developers-are-being-interviewed) +* [Scala Interview Questions/Answers including Language Questions, Functional Programming Questions, Reactive Programming Questions](https://github.com/peterarsentev/Scala-Interview-Questions-Answers) +* [Top 25 Scala Interview Questions & Answers from Toptal](http://career.guru99.com/top-25-interview-questions-on-scala/) + +### SharePoint + +* [Sharepoint Interview Question For Developer](http://www.rajeshg.me/2013/05/sharepoint-developer-2010-interview.html) + +### Shell + +* [Top 50 Shell Scripting Interview Questions from Career Guru](http://career.guru99.com/shell-scripting-interview-questions/) + +### Swift + +* [10 Essential Swift Interview Questions from Toptal](http://www.toptal.com/swift/interview-questions) +* [Get prepared for your next iOS job interview by studying high quality LeetCode solutions in Swift 5](https://github.com/diwu/LeetCode-Solutions-in-Swift) +* [Swift Interview Questions and Answers](https://www.raywenderlich.com/762435-swift-interview-questions-and-answers) +* [Swift Programming Language Interview Questions And Answers from mycodetips.com](http://mycodetips.com/swift-ios/swift-programming-language-interview-questions-answers-987.html) +* [Your top 10 Swift questions answered](http://blog.udacity.com/2014/11/your-top-10-swift-questions-answered.html) +* [Swift interview questions and answers on Swift 5 by Raywenderlich](https://www.raywenderlich.com/762435-swift-interview-questions-and-answers) + +### WordPress +* [Top 45 WordPress interview questions](https://pangara.com/blog/45-wordpress-interview-questions-and-answers) +* [10 Essential WordPress Interview Questions](https://www.toptal.com/wordpress/interview-questions) + +### TypeScript + +* [Typescript Interview Questions](https://www.onlineinterviewquestions.com/typescript-interview-questions) +* [Top 10 TypeScript Interview Questions and Answers for Beginner Web Developers 2019](https://www.positronx.io/typescript-interview-questions-answers-2109/) + +## Database technologies + + +### Cassandra + +* [Top 23 Cassandra Interview Questions from Career Guru](http://career.guru99.com/top-23-cassandra-interview-questions/) + +### Microsoft Access + +* [Top 16 Microsoft Access Database Interview Questions from Career Guru](http://career.guru99.com/top-16-ms-access-database-interview-questions/) + +### MongoDB + +* [28 MongoDB NoSQL Database Interview Questions and Answers](http://theprofessionalspoint.blogspot.com.by/2014/01/28-mongodb-nosql-database-interview.html) +* [MongoDB frequently Asked Questions by expert members with experience in MongoDB These questions and answers will help you strengthen your technical skills, prepare for the new job test and quickly revise the concepts](http://www.globalguideline.com/interview_questions/Questions.php?sc=MongoDB) + +* [MongoDB Interview Questions from JavaTPointcom](http://www.javatpoint.com/mongodb-interview-questions) +* [MongoDB Interview Questions that have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of MongoDB](http://www.tutorialspoint.com/mongodb/mongodb_interview_questions.htm) +* [Top 20 MongoDB interview questions from Career Guru](http://career.guru99.com/top-20-mongodb-interview-questions/) + +### MySQL + +* [10 MySQL Database Interview Questions for Beginners and Intermediates](http://www.tecmint.com/10-mysql-database-interview-questions-for-beginners-and-intermediates/) +* [100 MySQL interview questions](http://www.careerride.com/MySQL-Interview-Questions.aspx) +* [15 Basic MySQL Interview Questions for Database Administrators](http://www.tecmint.com/basic-mysql-interview-questions-for-database-administrators/) +* [28 MySQL interview questions from JavaTPoint.com](http://www.javatpoint.com/mysql-interview-questions) +* [40 Basic MySQL Interview Questions with Answers](http://www.testingbrain.com/interview/mysql-interview-questions.html) +* [Top 50 MySQL Interview Questions & Answers from Career Guru](http://career.guru99.com/top-50-mysql-interview-questions-answers/) + +### Neo4j + +* [Top 20 Neo4j Interview Questions from Career Guru](http://career.guru99.com/top-20-ne04j-interview-questions/) + +### Oracle + +* [General Oracle Interview Questions & Answers](http://www.coolinterview.com/type.asp?iType=57) + +### Postgres + +* [13 PostgreSQL Interview Q&A](http://www.dotnetfunda.com/interviews/cat/208/postgresql) +* [Frequently Asked Basic PostgreSQL Interview Questions and Answers](http://nazafbtemplate.blogspot.com.by/2014/06/frequently-asked-basic-postgresql.html) +* [PostgreSQL Interview Preparation Guide](http://www.globalguideline.com/interview_questions/Questions.php?sc=postgresqk_database_) +* [PostgreSQL Interview Q&A from CoolInterview.com](http://www.coolinterview.com/type.asp?iType=411) + +### SQL + +* [10 Frequently asked SQL Query Interview Questions](http://java67.blogspot.com.by/2013/04/10-frequently-asked-sql-query-interview-questions-answers-database.html) +* [45 Essential SQL Interview Questions from Toptal](http://www.toptal.com/sql/interview-questions) +* [Common Interview Questions and Answers](http://www.indiabix.com/technical/sql-server-common-questions/) +* [General Interview Questions and Answers](http://www.indiabix.com/technical/sql-server-general-questions/) +* [Schema, Questions & Solutions for SQL Exercising](https://github.com/XD-DENG/SQL-exercise) +* [SQL Interview Questions that have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of SQL](http://www.tutorialspoint.com/sql/sql_interview_questions.htm) +* [SQL Interview Questions CHEAT SHEET](https://www.interviewbit.com/sql-interview-questions/) + +### SQL Lite + +* [Top 20 SQL LITE Interview Questions from Career Guru](http://career.guru99.com/top-20-sql-lite-interview-questions/) + +## Caching technologies + +### Memcached + +* [Memcached Interview Questions from Javapoint](https://www.javatpoint.com/memcached-interview-questions-and-answers) +* [Memcached Interview Questions from Wisdomjobs](https://www.wisdomjobs.com/e-university/memcached-interview-questions.html) + +### Redis + +* [Redis Interview Questions from Javapoint](https://www.javatpoint.com/redis-interview-questions-and-answers) +* [Redis Interview Questions from Wisdomjobs](https://www.wisdomjobs.com/e-university/redis-interview-questions-answers.html) +* [Redis Interview Questions from Career Guru](https://career.guru99.com/top-10-redis-interview-questions/) + +## OS + +### Linux + +* [10 Job Interview Questions for Linux System Administrators from Linux.com](https://www.linuxfoundation.org/blog/2015/07/10-job-interview-questions-for-linux-system-administrators/) +* [10 Useful Random Linux Interview Questions and Answers](http://www.tecmint.com/useful-random-linux-interview-questions-and-answers/) +* [11 Basic Linux Interview Questions and Answers](http://www.tecmint.com/basic-linux-interview-questions-and-answers/) +* [11 Essential Linux Interview Questions from Toptal](http://www.toptal.com/linux/interview-questions) +* [Some basic Linux questions from ComputerNetworkingNotes.com](http://computernetworkingnotes.com/rhce-interview-questions/linux-interview-questions-answers.html) +* [Top 30 Linux System Admin Interview Questions & Answers](http://www.linuxtechi.com/experience-linux-admin-interview-questions/) +* [Top 50 Linux Interview Questions from Career Guru](http://career.guru99.com/top-50-linux-interview-questions/) +* [Linux System Administrator/DevOps Interview Questions](https://github.com/chassing/linux-sysadmin-interview-questions) +* [278 Test Questions and Answers for \*nix System Administrators](https://github.com/trimstray/test-your-sysadmin-skills) +* [Linux Interview Questions - Quick Refresher](https://www.techbeamers.com/essential-linux-questions-answers/) + +### Windows + +* [Top 10 Interview Questions for Windows Administrators](http://www.brentozar.com/archive/2009/07/top-10-interview-questions-for-windows-sysadmins/) +* [Top 22 Windows Server Interview Questions from Career Guru](http://career.guru99.com/top-22-windows-server-interview-questions/) +* [Windows Admin Interview Questions & Answers](http://www.01world.in/p/windows.html) + +## Algorithms +* [Comprehensive list of interview questions of top tech companies](https://github.com/rishabh115/Interview-Questions) +* [A great list of Java interview questions](http://java2novice.com/java-interview-programs/) +* [Algorithms playground for common interview questions written in Ruby](https://github.com/sagivo/algorithms) +* [EKAlgorithms contains some well known CS algorithms & data structures](https://github.com/EvgenyKarkan/EKAlgorithms) +* [Five programming problems every Software Engineer should be able to solve in less than 1 hour](http://www.shiftedup.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hour) +* [Top 10 Algorithms for Coding Interview](http://www.programcreek.com/2012/11/top-10-algorithms-for-coding-interview/) +* [Top 15 Data Structures and Algorithm Interview Questions for Java programmer](http://javarevisited.blogspot.com.by/2013/03/top-15-data-structures-algorithm-interview-questions-answers-java-programming.html) +* [Top Algorithms Questions by Topics](https://github.com/yangshun/tech-interview-handbook/blob/master/algorithms/README.md) +* [Daily Coding Interview Practice](https://www.techseries.dev/daily) + +## Blockchain +* [Top 55 Blockchain Interview Questions You Must Prepare In 2018](https://www.edureka.co/blog/interview-questions/blockchain-interview-questions/) +* [Blockchain Interview Questions](https://mindmajix.com/blockchain-interview-questions) +* [Top Blockchain Interview Questions](https://intellipaat.com/interview-question/blockchain-interview-questions/) +* [Blockchain Developer Interview Questions and Answers](https://applicature.com/blog/blockchain-interview-questions) +* [10 Essential Blockchain Interview Questions ](https://www.toptal.com/blockchain/interview-questions) +* [Top 30 Blockchain Interview Questions – For Freshers to Experienced](https://data-flair.training/blogs/blockchain-interview-questions/) +* [Most Frequently Asked Blockchain Interview Questions](https://www.digitalvidya.com/blog/blockchain-interview-questions/) + +## Coding exercises + +* [Common interview questions and puzzles solved in a number of languages](https://github.com/mre/the-coding-interview) +* [Interactive, test-driven Python coding challenges (algorithms and data structures) typically found in coding interviews or coding competitions](https://github.com/donnemartin/interactive-coding-challenges) +* [Interview questions solved in python](https://github.com/roseperrone/interview-questions) +* [7 Swift Coding Challenges to Practice Your Skills](https://www.makeuseof.com/tag/swift-coding-challenges/) + +## Comprehensive lists + +* [A list of helpful front-end related questions you can use to interview potential candidates, test yourself or completely ignore](https://github.com/h5bp/Front-end-Developer-Interview-Questions) +* [Front End Developer Interview Questions](http://www.aperfectmix.com/free_web_design/front-end-interview-questions.html) +* [Answers to Front End Developer Interview Questions](https://github.com/yangshun/front-end-interview-handbook/blob/master/README.md) +* [Some simple questions to interview potential backend candidates](https://github.com/starandtina/backend-interview-questions) +* [An Annotated List of Frontend Developer Technical Interview Questions](https://www.recruityourninja.com/technical-interview-questions-frontend-candidates/) +* [An Annotated List of Backend Developer Technical Interview Questions](https://www.recruityourninja.com/technical-interview-questions-backend-candidates/) +* [An Annotated List of DevOps Technical Interview Questions](https://www.recruityourninja.com/technical-interview-questions-devops-candidates/) + +## Design Patterns +* [Design Pattern Interview Questions that have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of Design Pattern](http://www.tutorialspoint.com/design_pattern/design_pattern_interview_questions.htm) +* [Design Patterns for Humans™ - An ultra-simplified explanation](https://github.com/kamranahmedse/design-patterns-for-humans) +* [Design Patterns implemented in Java](https://github.com/iluwatar/java-design-patterns) +* [Design Pattens implemented in DotNet](https://www.dofactory.com/net/design-patterns) + +## Data structures + +* [Top 15 Data Structures and Algorithm Interview Questions for Java programmer](http://javarevisited.blogspot.com.by/2013/03/top-15-data-structures-algorithm-interview-questions-answers-java-programming.html) +* [Top 50 Data Structure Interview Questions from Career Guru](http://career.guru99.com/top-50-data-structure-interview-questions/) + +## Networks + +* [Top 100 Networking Interview Questions & Answers from Career Guru](http://career.guru99.com/top-100-networking-interview-questions-answers/) + +## Security + +* [101 IT Security Interview Questions](http://careers.simplicable.com/careers/new/101-IT-security-interview-questions) +* [How to prepare for an information security job interview?](http://searchsecurity.techtarget.com/tip/How-to-prepare-for-an-information-security-job-interview) +* [Information Security Interview Questions from Daniel Miessler](https://danielmiessler.com/study/infosec_interview_questions/) +* [Top 50 Information Security Interview Questions for freshers and experts](http://resources.infosecinstitute.com/top-50-information-security-interview-questions/) +* [Security Interview Questions (and Answers) from Matthew Adeline](https://mkadeline.github.io/security/Security-Interview-Questions-Answers) + +## Data Science +* [Data Science Interview Questions for Top Tech Companies](https://www.dezyre.com/article/-data-science-interview-questions-for-top-tech-companies/189) +* [66 Job Interview Questions for Data Scientists](http://www.datasciencecentral.com/profiles/blogs/66-job-interview-questions-for-data-scientists) +* [An Annotated List of Data Scientist Technical Interview Questions](https://www.recruityourninja.com/technical-interview-questions-data-scientist/) +* [Top 45 Data Science Interview Questions You Must Prepare In 2019](https://www.edureka.co/blog/interview-questions/data-science-interview-questions/) +* [Top 30 data science interview questions](https://towardsdatascience.com/top-30-data-science-interview-questions-7dd9a96d3f5c) +* [Top 100 Data science interview questions](https://www.datacamp.com/community/news/top-100-data-science-interview-questions-cc3lts7gj5j) +* [Data Science Interview Questions](https://hackr.io/blog/data-science-interview-questions) + +### License + +[![CC0](https://i.creativecommons.org/p/zero/1.0/88x31.png)](https://creativecommons.org/publicdomain/zero/1.0/) diff --git a/interview_100/awesome_interview/awesome.md b/interview_100/awesome_interview/awesome.md new file mode 100644 index 00000000..e1b173dc --- /dev/null +++ b/interview_100/awesome_interview/awesome.md @@ -0,0 +1,55 @@ +# The awesome manifesto + +If you want your list to be included on `awesome`, try to only include actual awesome stuff in your list. After all, it's a curation, not a collection. + +But **what is awesome?** + +## Only awesome is awesome + +Research if the stuff you're including is actually awesome. Put only stuff on the list you or another contributor can personally recommend and rather leave stuff out than include too much. + +## Awesome badge + +[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) + +Add an awesome badge to the top of your list, right to the title. [Example](https://github.com/sindresorhus/awesome-nodejs). + +```md +[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) +``` + +## Comment on why something is awesome + +Apart from suggesting a particular item on your list, you should also inform your readers *why* it's on the list and how they will benefit from it. + +## Make it clear what the list is about + +Have a succinct description at the top of your readme. Make sure your list covers a certain scope and nothing else. Link to other awesome lists if you think they already cover a certain subject good enough. + +## Pay attention to grammar + +Ensure your list is grammatically correct, typo free and has no Markdown formatting errors. This should also apply to pull requests. + +## Choose an appropriate license + +Keep in mind that if you [haven't selected a license](http://choosealicense.com/no-license/), it basically means the people are *not* allowed to reproduce, distribute or create derivative works. + +[Creative Commons licenses](https://creativecommons.org/) are perfect for this purpose. **We would recommend [`CC0`](https://creativecommons.org/publicdomain/zero/1.0/).** Code licenses like MIT, BSD, GPL, and so forth are not recommended. + +## Include contribution guidelines + +People who are contributing to your list should have a clear understanding how they should do so. + +If you don't feel like writing one from scratch, feel free to take our [contributing.md](contributing.md) and modify it to your own needs. + +## Stylize your list properly + +Create a table of contents, organize the content into different categories, and use images if suitable. Ensure all entries are consistent (e.g. all entry descriptions end in a `.`). + +## Accept other people's opinion + +If you're an owner of the list, respect other people's opinion. If there are plenty of users not agreeing to your decision, give it a second thought. + +## Discovery + +Link back to this list from your list so users can easily discover more lists. diff --git a/interview_100/awesome_interview/contributing.md b/interview_100/awesome_interview/contributing.md new file mode 100644 index 00000000..803bec00 --- /dev/null +++ b/interview_100/awesome_interview/contributing.md @@ -0,0 +1,48 @@ +# Contribution Guidelines + +## Table of Contents +- [Adding to this list](#adding-to-this-list) +- [Creating your own awesome list](#creating-your-own-awesome-list) +- [Adding something to an Awesome list](#adding-something-to-an-awesome-list) +- [Updating your Pull Request](#updating-your-pull-request) + +## Adding to this list + +Please ensure your pull request adheres to the following guidelines: + +- Search previous suggestions before making a new one, as yours may be a duplicate. +- Make sure the list is useful before submitting. That implies it has enough content and every item has a good succinct description. +- Make an individual pull request for each suggestion. +- Use [title-casing](http://titlecapitalization.com) (AP style). +- Use the following format: `[List Name](link)` +- Link additions should be added to the bottom of the relevant category. +- New categories or improvements to the existing categorization are welcome. +- Check your spelling and grammar. +- Make sure your text editor is set to remove trailing whitespace. +- The pull request and commit should have a useful title. +- The body of your commit message should contain a link to the repository. + +Thank you for your suggestions! + +## Creating your own awesome list + +To create your own list, check out the [instructions](create-list.md). + +## Adding something to an awesome list + +If you have something awesome to contribute to an awesome list, this is how you do it. + +You'll need a [GitHub account](https://github.com/join)! + +1. Access the awesome lists GitHub page. For example: https://github.com/MaximAbramchuck/awesome-interviews +2. Click on the `README.md` file: ![Step 2 Click on Readme.md](https://leto34g.storage.yandex.net/rdisk/8948449e1d73cd0dcfef07f186b7a36e2f7f20d96790c13e852332d0463f7bfb/inf/7e5phO26eyQewxB0SXXAytng0o1HQ9hHVNdV9di4FeXYEPGQzRqXznc9UrAF_Rah2Ux7fSJqVWwPgOLkbBKExA==?uid=0&filename=2015-11-28%2013-28-41%20MaximAbramchuck%20awesome-interviews.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&tknv=v2&rtoken=7cb5689a2bde8e7a302bcb7c55b41c7c&force_default=no&ycrid=na-f270d9f138679e558b06ec1ec93034d7-downloader10e) +3. Now click on the edit icon. ![Step 3 - Click on Edit](https://leto29d.storage.yandex.net/rdisk/05fa06697433943f9203b0653fb0c800f8bf15690ba4d2e8efcd435dc3b8934b/inf/KIRmm9wzFRC95NHeDkZNaNHvzSktU7_HosUvbdi0WdjOVYACD2iNhCZLoJuOXyUo2ykJrzKiBnSlkBRWi1FQIQ==?uid=0&filename=2015-11-28%2013-29-56%20awesome-interviews%20README.md%20at%20master%20%C2%B7%20MaximAbramchuck%20awesome-interviews.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&tknv=v2&rtoken=7cb5689a2bde8e7a302bcb7c55b41c7c&force_default=no&ycrid=na-2c689dfbfd6867ddba96f0b10b4ba3bf-downloader10e) +4. You can start editing the text of the file in the in-browser editor. Make sure you follow guidelines above. You can use [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown/). ![Step 4 - Edit the file](https://leto2f.storage.yandex.net/rdisk/0101ae04ba3a6d2e36f8fec8fd66929bce822ac477828c9d9af97e9fbf24b4cb/inf/n_E0tlZ5u0HYaW2S1k6W1nTYNnR-DKS78m3QtdFbkTzcjSj0Y-rzN10vrGMs85gbrez8mFR3TRJcMWTuPN3F-A==?uid=0&filename=2015-11-28%2013-31-20%20Editing%20awesome-interviews%20README.md%20at%20master%20%C2%B7%20MaximAbramchuck%20awesome-interviews.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&tknv=v2&rtoken=7cb5689a2bde8e7a302bcb7c55b41c7c&force_default=no&ycrid=na-0c11edf2ab8448c3bc9b221e3139c857-downloader10e) +5. Say why you're proposing the changes, and then click on "Propose file change". ![Step 5 - Propose Changes](https://leto30e.storage.yandex.net/rdisk/4ed220e31e45076c75274f6e428bfc577638d13ed51d781ee6911b9febd3d7c6/inf/oj_OaawPZ0980PXZqNTB5mTW3H7w2j9sPvnFUGsN6VvM69LS7jLsXgxNyyWJqGmJ5y4JYyO9LZSNkjyNEeYrEA==?uid=0&filename=2015-11-28%2013-31-59%20Editing%20awesome-interviews%20README.md%20at%20master%20%C2%B7%20MaximAbramchuck%20awesome-interviews.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&tknv=v2&rtoken=7cb5689a2bde8e7a302bcb7c55b41c7c&force_default=no&ycrid=na-7239d00ed9e5460b3946af9c615345f3-downloader10e) +6. Submit the [pull request](https://help.github.com/articles/using-pull-requests/)! + +## Updating your Pull Request + +Sometimes, a maintainer of an awesome list will ask you to edit your Pull Request before it is included. This is normally due to spelling errors or because your PR didn't match the awesome-* list guidelines. + +[Here](https://github.com/RichardLitt/docs/blob/master/amending-a-commit-guide.md) is a write up on how to change a Pull Request, and the different ways you can do that. diff --git a/interview_100/awesome_interview/create-list.md b/interview_100/awesome_interview/create-list.md new file mode 100644 index 00000000..4c911fff --- /dev/null +++ b/interview_100/awesome_interview/create-list.md @@ -0,0 +1,9 @@ +# Creating Your Own List + +- Read the [awesome manifesto](https://github.com/MaximAbramchuck/awesome-interviews/blob/master/awesome.md) and ensure your list complies. +- Wait at least a couple of weeks after creating a list before submitting to this list to give it a chance to mature. +- Search this list before making a new one, as yours may be a duplicate. If it is, try and contribute to the best one instead of making your own. +- A link back to this list from yours, so users can discover more lists, would be appreciated. +- Make sure you read the [contribution guidelines](https://github.com/MaximAbramchuck/awesome-interviews/blob/master/contributing.md) before submitting a request for your list to be added here. + +Thanks for being awesome! diff --git a/interview_100/java_interview_questions.pdf b/interview_100/java_interview_questions.pdf new file mode 100644 index 00000000..aac8f9ef Binary files /dev/null and b/interview_100/java_interview_questions.pdf differ diff --git a/interview_100/javascript_interview_questions.md b/interview_100/javascript_interview_questions.md new file mode 100644 index 00000000..0a2e7082 --- /dev/null +++ b/interview_100/javascript_interview_questions.md @@ -0,0 +1,558 @@ +# Interview Algorithm Questions in Javascript() {...} +*A mostly reasonable collection of technical software development interview questions solved in Javascript in ES5 and ES6* + +## Table of Contents +1. [Array](#array) +1. [Strings](#strings) +1. [Stacks and Queues](#stacks-and-queues) +1. [Recursion](#recursion) +1. [Numbers](#numbers) +1. [Javascript Specific](#javascript) +1. To Be Continued + +## Array + +- **[1.1](#array--product) Given an array of integers, find the largest product yielded from three of the integers** + ```javascript + var unsortedArray = [-10, 7, 29, 30, 5, -10, -70]; + + computeProduct(unsortedArray); // 21000 + + function sortIntegers(a, b) { + return a - b; + } + + // Greatest product is either (min1 * min2 * max1 || max1 * max2 * max3) + function computeProduct(unsorted) { + var sortedArray = unsorted.sort(sortIntegers), + product1 = 1, + product2 = 1, + array_n_element = sortedArray.length - 1; + + // Get the product of three largest integers in sorted array + for (var x = array_n_element; x > array_n_element - 3; x--) { + product1 = product1 * sortedArray[x]; + } + + product2 = sortedArray[0] * sortedArray[1] * sortedArray[array_n_element]; + + if (product1 > product2) return product1; + + return product2; + } + ``` + **View on Codepen:** https://codepen.io/kennymkchan/pen/LxoMvm?editors=0012 + + +- **[1.2](#array--consecutive--sum) Being told that an unsorted array contains (n - 1) of n consecutive numbers (where the bounds are defined), find the missing number in `O(n)` time** + ```javascript + // The output of the function should be 8 + var arrayOfIntegers = [2, 5, 1, 4, 9, 6, 3, 7]; + var upperBound = 9; + var lowerBound = 1; + + findMissingNumber(arrayOfIntegers, upperBound, lowerBound); // 8 + + function findMissingNumber(arrayOfIntegers, upperBound, lowerBound) { + // Iterate through array to find the sum of the numbers + var sumOfIntegers = 0; + for (var i = 0; i < arrayOfIntegers.length; i++) { + sumOfIntegers += arrayOfIntegers[i]; + } + + // Find theoretical sum of the consecutive numbers using a variation of Gauss Sum. + // Formula: [(N * (N + 1)) / 2] - [(M * (M - 1)) / 2]; + // N is the upper bound and M is the lower bound + + upperLimitSum = (upperBound * (upperBound + 1)) / 2; + lowerLimitSum = (lowerBound * (lowerBound - 1)) / 2; + + theoreticalSum = upperLimitSum - lowerLimitSum; + + return theoreticalSum - sumOfIntegers; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/rjgoXw?editors=0012 + + +- **[1.3](#array--unique) Removing duplicates of an array and returning an array of only unique elements** + ```javascript + // ES6 Implementation + var array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8]; + + Array.from(new Set(array)); // [1, 2, 3, 5, 9, 8] + + // ES5 Implementation + var array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8]; + + uniqueArray(array); // [1, 2, 3, 5, 9, 8] + + function uniqueArray(array) { + var hashmap = {}; + var unique = []; + + for(var i = 0; i < array.length; i++) { + // If key returns undefined (unique), it is evaluated as false. + if(!hashmap.hasOwnProperty(array[i])) { + hashmap[array[i]] = 1; + unique.push(array[i]); + } + } + + return unique; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/ZLNwze?editors=0012 + + +- **[1.4](#array--largest-difference) Given an array of integers, find the largest difference between two elements such that the element of lesser value must come before the greater element** + ```javascript + var array = [7, 8, 4, 9, 9, 15, 3, 1, 10]; + // [7, 8, 4, 9, 9, 15, 3, 1, 10] would return `11` based on the difference between `4` and `15` + // Notice: It is not `14` from the difference between `15` and `1` because 15 comes before 1. + + findLargestDifference(array); + + function findLargestDifference(array) { + // If there is only one element, there is no difference + if (array.length <= 1) return -1; + + // currentMin will keep track of the current lowest + var currentMin = array[0]; + var currentMaxDifference = 0; + + // We will iterate through the array and keep track of the current max difference + // If we find a greater max difference, we will set the current max difference to that variable + // Keep track of the current min as we iterate through the array, since we know the greatest + // difference is yield from `largest value in future` - `smallest value before it` + + for (var i = 1; i < array.length; i++) { + if (array[i] > currentMin && (array[i] - currentMin > currentMaxDifference)) { + currentMaxDifference = array[i] - currentMin; + } else if (array[i] <= currentMin) { + currentMin = array[i]; + } + } + + // If negative or 0, there is no largest difference + if (currentMaxDifference <= 0) return -1; + + return currentMaxDifference; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/MJdLWJ?editors=0012 + + +- **[1.5](#array--product-other-than-itself) Given an array of integers, return an output array such that output[i] is equal to the product of all the elements in the array other than itself. (Solve this in O(n) without division)** + ```javascript + var firstArray = [2, 2, 4, 1]; + var secondArray = [0, 0, 0, 2]; + var thirdArray = [-2, -2, -3, 2]; + + productExceptSelf(firstArray); // [8, 8, 4, 16] + productExceptSelf(secondArray); // [0, 0, 0, 0] + productExceptSelf(thirdArray); // [12, 12, 8, -12] + + function productExceptSelf(numArray) { + var product = 1; + var size = numArray.length; + var output = []; + + // From first array: [1, 2, 4, 16] + // The last number in this case is already in the right spot (allows for us) + // to just multiply by 1 in the next step. + // This step essentially gets the product to the left of the index at index + 1 + for (var x = 0; x < size; x++) { + output.push(product); + product = product * numArray[x]; + } + + // From the back, we multiply the current output element (which represents the product + // on the left of the index, and multiplies it by the product on the right of the element) + var product = 1; + for (var i = size - 1; i > -1; i--) { + output[i] = output[i] * product; + product = product * numArray[i]; + } + + return output; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/OWYdJK?editors=0012 + + +- **[1.6](#array--intersection) Find the intersection of two arrays. An intersection would be the common elements that exists within both arrays. In this case, these elements should be unique!** + ```javascript + var firstArray = [2, 2, 4, 1]; + var secondArray = [1, 2, 0, 2]; + + intersection(firstArray, secondArray); // [2, 1] + + function intersection(firstArray, secondArray) { + // The logic here is to create a hashmap with the elements of the firstArray as the keys. + // After that, you can use the hashmap's O(1) look up time to check if the element exists in the hash + // If it does exist, add that element to the new array. + + var hashmap = {}; + var intersectionArray = []; + + firstArray.forEach(function(element) { + hashmap[element] = 1; + }); + + // Since we only want to push unique elements in our case... we can implement a counter to keep track of what we already added + secondArray.forEach(function(element) { + if (hashmap[element] === 1) { + intersectionArray.push(element); + hashmap[element]++; + } + }); + + return intersectionArray; + + // Time complexity O(n), Space complexity O(n) + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/vgwbEb?editors=0012 + +**[⬆ back to top](#table-of-contents)** + +## Strings + +- **[2.1](#string--reverse) Given a string, reverse each word in the sentence** + `"Welcome to this Javascript Guide!"` should be become `"emocleW ot siht tpircsavaJ !ediuG"` + ```javascript + var string = "Welcome to this Javascript Guide!"; + + // Output becomes !ediuG tpircsavaJ siht ot emocleW + var reverseEntireSentence = reverseBySeparator(string, ""); + + // Output becomes emocleW ot siht tpircsavaJ !ediuG + var reverseEachWord = reverseBySeparator(reverseEntireSentence, " "); + + function reverseBySeparator(string, separator) { + return string.split(separator).reverse().join(separator); + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/VPOONZ?editors=0012 + + +- **[2.2](#string--anagram) Given two strings, return true if they are anagrams of one another** + `"Mary" is an anagram of "Army"` + ```javascript + var firstWord = "Mary"; + var secondWord = "Army"; + + isAnagram(firstWord, secondWord); // true + + function isAnagram(first, second) { + // For case insensitivity, change both words to lowercase. + var a = first.toLowerCase(); + var b = second.toLowerCase(); + + // Sort the strings, and join the resulting array to a string. Compare the results + a = a.split("").sort().join(""); + b = b.split("").sort().join(""); + + return a === b; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/NdVVVj?editors=0012 + + +- **[2.3](#string--palindrome) Check if a given string is a palindrome** + `"racecar" is a palindrome. "race car" should also be considered a palindrome. Case sensitivity should be taken into account` + ```javascript + isPalindrome("racecar"); // true + isPalindrome("race Car"); // true + + function isPalindrome(word) { + // Replace all non-letter chars with "" and change to lowercase + var lettersOnly = word.toLowerCase().replace(/\s/g, ""); + + // Compare the string with the reversed version of the string + return lettersOnly === lettersOnly.split("").reverse().join(""); + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/xgNNNB?editors=0012 + + +- **[2.3](#string--palindrome) Check if a given string is a isomorphic** + + ``` + For two strings to be isomorphic, all occurrences of a character in string A can be replaced with another character + to get string B. The order of the characters must be preserved. There must be one-to-one mapping for ever char of + string A to every char of string B. + + `paper` and `title` would return true. + `egg` and `sad` would return false. + `dgg` and `add` would return true. + ``` + ```javascript + isIsomorphic("egg", 'add'); // true + isIsomorphic("paper", 'title'); // true + isIsomorphic("kick", 'side'); // false + + function isIsomorphic(firstString, secondString) { + + // Check if the same lenght. If not, they cannot be isomorphic + if (firstString.length !== secondString.length) return false + + var letterMap = {}; + + for (var i = 0; i < firstString.length; i++) { + var letterA = firstString[i], + letterB = secondString[i]; + + // If the letter does not exist, create a map and map it to the value + // of the second letter + if (letterMap[letterA] === undefined) { + // If letterB has already been added to letterMap, then we can say: they are not isomorphic. + if(secondString.indexOf(letterB) < i){ + return false; + } else { + letterMap[letterA] = letterB; + } + } else if (letterMap[letterA] !== letterB) { + // Eles if letterA already exists in the map, but it does not map to + // letterB, that means that A is mapping to more than one letter. + return false; + } + } + // If after iterating through and conditions are satisfied, return true. + // They are isomorphic + return true; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/mRZgaj?editors=0012 + +**[⬆ back to top](#table-of-contents)** + +## Stacks and Queues + + +- **[3.1](#stack-queue--stack-as-queue) Implement enqueue and dequeue using only two stacks** + ```javascript + var inputStack = []; // First stack + var outputStack = []; // Second stack + + // For enqueue, just push the item into the first stack + function enqueue(stackInput, item) { + return stackInput.push(item); + } + + function dequeue(stackInput, stackOutput) { + // Reverse the stack such that the first element of the output stack is the + // last element of the input stack. After that, pop the top of the output to + // get the first element that was ever pushed into the input stack + if (stackOutput.length <= 0) { + while(stackInput.length > 0) { + var elementToOutput = stackInput.pop(); + stackOutput.push(elementToOutput); + } + } + + return stackOutput.pop(); + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/mRYYZV?editors=0012 + + +- **[3.2](#stack-queue--parentheses-balancing) Create a function that will evaluate if a given expression has balanced parentheses -- Using stacks** + In this example, we will only consider "{}" as valid parentheses + `{}{}` would be considered balancing. `{{{}}` is not balanced + ```javascript + var expression = "{{}}{}{}" + var expressionFalse = "{}{{}"; + + isBalanced(expression); // true + isBalanced(expressionFalse); // false + isBalanced(""); // true + + function isBalanced(expression) { + var checkString = expression; + var stack = []; + + // If empty, parentheses are technically balanced + if (checkString.length <= 0) return true; + + for (var i = 0; i < checkString.length; i++) { + if(checkString[i] === '{') { + stack.push(checkString[i]); + } else if (checkString[i] === '}') { + // Pop on an empty array is undefined + if (stack.length > 0) { + stack.pop(); + } else { + return false; + } + } + } + + // If the array is not empty, it is not balanced + if (stack.pop()) return false; + return true; + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/egaawj?editors=0012 + +**[⬆ back to top](#table-of-contents)** + +## Recursion + +- **[4.1](#recursion--decimal-to-binary) Write a recursive function that returns the binary string of a given decimal number** + Given `4` as the decimal input, the function should return `100` + + ```javascript + decimalToBinary(3); // 11 + decimalToBinary(8); // 1000 + decimalToBinary(1000); // 1111101000 + + function decimalToBinary(digit) { + if(digit >= 1) { + // If digit is not divisible by 2 then recursively return proceeding + // binary of the digit minus 1, 1 is added for the leftover 1 digit + if (digit % 2) { + return decimalToBinary((digit - 1) / 2) + 1; + } else { + // Recursively return proceeding binary digits + return decimalToBinary(digit / 2) + 0; + } + } else { + // Exit condition + return ''; + } + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/OWYYKb?editors=0012 + + +- **[4.2](#recursion--binary-search) Write a recursive function that performs a binary search** + + ```javascript + function recursiveBinarySearch(array, value, leftPosition, rightPosition) { + // Value DNE + if (leftPosition > rightPosition) return -1; + + var middlePivot = Math.floor((leftPosition + rightPosition) / 2); + if (array[middlePivot] === value) { + return middlePivot; + } else if (array[middlePivot] > value) { + return recursiveBinarySearch(array, value, leftPosition, middlePivot - 1); + } else { + return recursiveBinarySearch(array, value, middlePivot + 1, rightPosition); + } + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/ygWWmK?editors=0012 + +**[⬆ back to top](#table-of-contents)** + +## Numbers + +- **[5.1](#numbers--power-of-two) Given an integer, determine if it is a power of 2. If so, + return that number, else return -1. (0 is not a power of two)** + ```javascript + isPowerOfTwo(4); // true + isPowerOfTwo(64); // true + isPowerOfTwo(1); // true + isPowerOfTwo(0); // false + isPowerOfTwo(-1); // false + + // For the non-zero case: + function isPowerOfTwo(number) { + // `&` uses the bitwise n. + // In the case of number = 4; the expression would be identical to: + // `return (4 & 3 === 0)` + // In bitwise, 4 is 100, and 3 is 011. Using &, if two values at the same + // spot is 1, then result is 1, else 0. In this case, it would return 000, + // and thus, 4 satisfies are expression. + // In turn, if the expression is `return (5 & 4 === 0)`, it would be false + // since it returns 101 & 100 = 100 (NOT === 0) + + return number & (number - 1) === 0; + } + + // For zero-case: + function isPowerOfTwoZeroCase(number) { + return (number !== 0) && ((number & (number - 1)) === 0); + } + ``` + **View on Codepen:** http://codepen.io/kennymkchan/pen/qRGGeG?editors=0012 + +**[⬆ back to top](#table-of-contents)** + +## Javascript + +- **[6.1](#javascript--hosting) Explain what is hoisting in Javascript** + + ``` + Hoisting is the concept in which Javascript, by default, moves all declarations to the top + of the current scope. As such, a variable can be used before it has been declared. Note that + Javascript only hoists declarations and not initializations + ``` + + +- **[6.2](#javascript--use-strict) Describe the functionality of the `use strict;` directive** + ``` + the `use strict` directive defines that the Javascript should be executed in `strict mode`. + One major benefit that strict mode provides is that it prevents developers from using + undeclared variables. Older versions of javascript would ignore this directive declaration + ``` + + ```javascript + // Example of strict mode + "use strict"; + + catchThemAll(); + function catchThemAll() { + x = 3.14; // Error will be thrown + return x * x; + } + ``` + +- **[6.3](#javascript--event-bubbling) Explain `event bubbling` and how one may prevent it** + ``` + Event bubbling is the concept in which an event triggers at the deepest possible element, + and triggers on parent elements in nesting order. As a result, when clicking on a child element + one may exhibit the handler of the parent activating. + + One way to prevent event bubbling is using `event.stopPropagation()` or `event.cancelBubble` + on IE < 9 + ``` + +- **[6.4](#javascript--strict-operators) What is the difference between `==` and `===` in JS?** + ``` + `===` is known as a strict operator. The key difference between `==` and `===` is that the + strict operator matches for both value and type, as opposed to just the value. + ``` + + ```javascript + // Example of comparators + 0 == false; // true + 0 === false; // false + + 2 == '2'; // true + 2 === '2'; // false + ``` + + +- **[6.5](#javascript--null-undefined) What is the difference between `null` and `undefined`** + + ``` + In Javascript, null is an assignment value, and can be assigned to a variable representing that + it has no value. Undefined, on the other hand, represents that a variable has been declared but + there is no value associated with it + ``` + + +- **[6.6](#javascript--difference-inheritance) How does `prototypal inheritance` differ from `classical inheritance`** + + ``` + In classical inheritance, classes are immutable, may or may not support multiple + inheritance, and may contain interfaces, final classes, and abstract classes. In contrast, + prototypes are much more flexible in the sense that they may be mutable or immutable. The object + may inherit from multiple prototypes, and only contains objects. + ``` + +**[⬆ back to top](#table-of-contents)** diff --git "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/01.html" "b/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/01.html" deleted file mode 100644 index 54c8f156..00000000 --- "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/01.html" +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - 小浩算法 | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 2:55:23 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/02.html" "b/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/02.html" deleted file mode 100644 index b4ca351d..00000000 --- "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/02.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 阅读指南 | 小浩算法 - - - - - - - -
文章修订于: 6/30/2020, 10:44:42 AM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/021.html" "b/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/021.html" deleted file mode 100644 index e2f3158d..00000000 --- "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/021.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 指导学习(一) | 小浩算法 - - - - - - - -
文章修订于: 7/13/2020, 12:24:08 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/022.html" "b/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/022.html" deleted file mode 100644 index 151939ce..00000000 --- "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/022.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 指导学习(二) | 小浩算法 - - - - - - - -
文章修订于: 7/13/2020, 12:24:08 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/023.html" "b/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/023.html" deleted file mode 100644 index 369ba463..00000000 --- "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/023.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 指导学习(三) | 小浩算法 - - - - - - - -
文章修订于: 7/13/2020, 12:24:08 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/03.html" "b/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/03.html" deleted file mode 100644 index a42ef7f6..00000000 --- "a/learning/.vuepress/dist/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/03.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 资源下载 | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 3:07:35 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001.html" deleted file mode 100644 index 829248a4..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001.html" +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - 两个数组的交集(350) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002.html" deleted file mode 100644 index 768f87cf..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002.html" +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - 最长公共前缀(14) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003.html" deleted file mode 100644 index 0564e799..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003.html" +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - 买卖股票的最佳时机(122) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004.html" deleted file mode 100644 index 761b726e..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004.html" +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - 旋转数组(189) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005.html" deleted file mode 100644 index 99d37ec6..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005.html" +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - 原地删除(27) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006.html" deleted file mode 100644 index 43f0fe10..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006.html" +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - 加一(66) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007.html" deleted file mode 100644 index 947acb59..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007.html" +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - 两数之和(1) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008.html" deleted file mode 100644 index 11c34269..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008.html" +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - 三数之和(15) | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009.html" "b/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009.html" deleted file mode 100644 index af9967f9..00000000 --- "a/learning/.vuepress/dist/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009.html" +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - Z字形变换(6) | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101.html" "b/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101.html" deleted file mode 100644 index c1e84c29..00000000 --- "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101.html" +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - 删除链表倒数第N个节点(19) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102.html" "b/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102.html" deleted file mode 100644 index 3ddbbad7..00000000 --- "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102.html" +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - 合并两个有序链表(21) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103.html" "b/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103.html" deleted file mode 100644 index 06d6c9a6..00000000 --- "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103.html" +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - 环形链表(21) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104.html" "b/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104.html" deleted file mode 100644 index 129c18f7..00000000 --- "a/learning/.vuepress/dist/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104.html" +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - 两数相加(2) | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201.html" "b/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201.html" deleted file mode 100644 index 1e299004..00000000 --- "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201.html" +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - 爬楼梯(70) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202.html" "b/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202.html" deleted file mode 100644 index 0a1065a8..00000000 --- "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202.html" +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - 最大子序和(53) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203.html" "b/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203.html" deleted file mode 100644 index 07ae3724..00000000 --- "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203.html" +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - 最长上升子序列(300) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204.html" "b/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204.html" deleted file mode 100644 index ce3ccda6..00000000 --- "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204.html" +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - 三角形最小路径和(120) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205.html" "b/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205.html" deleted file mode 100644 index 3bd7c513..00000000 --- "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205.html" +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - 最小路径和(64) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206.html" "b/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206.html" deleted file mode 100644 index a59695f4..00000000 --- "a/learning/.vuepress/dist/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206.html" +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - 打家劫舍(198) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301.html" deleted file mode 100644 index 2544d189..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301.html" +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - 反转字符串(301) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302.html" deleted file mode 100644 index 2a1b7268..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302.html" +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - 字符串中的第一个唯一字符(387) | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303.html" deleted file mode 100644 index 04da141d..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303.html" +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - 实现 Sunday 匹配 | 小浩算法 - - - - - - - -
文章修订于: 7/8/2020, 10:18:05 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304.html" deleted file mode 100644 index 4eae2802..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304.html" +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - 大数打印 | 小浩算法 - - - - - - - -
文章修订于: 7/8/2020, 10:18:05 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305.html" deleted file mode 100644 index 36b6898a..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305.html" +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - 验证回文串(125) | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306.html" deleted file mode 100644 index a43dc100..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306.html" +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - KMP(上篇) | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 10:13:00 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307.html" deleted file mode 100644 index acd3e1ff..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307.html" +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - 旋转字符串(796) | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308.html" "b/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308.html" deleted file mode 100644 index f4165332..00000000 --- "a/learning/.vuepress/dist/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308.html" +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - 最后一个单词的长度(58) | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401.html" deleted file mode 100644 index cedee752..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401.html" +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - 最大深度与DFS(104) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402.html" deleted file mode 100644 index 0a524909..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402.html" +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - 层次遍历与BFS(102) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403.html" deleted file mode 100644 index eb0f914f..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403.html" +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - BST与其验证(98) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404.html" deleted file mode 100644 index fe8777ce..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404.html" +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - BST 的查找(700) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405.html" deleted file mode 100644 index 4e881633..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405.html" +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - BST 的删除(450) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406.html" deleted file mode 100644 index 26e7ed80..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406.html" +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - 平衡二叉树(110) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407.html" deleted file mode 100644 index b4a7722e..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407.html" +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - 完全二叉树(222) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408.html" "b/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408.html" deleted file mode 100644 index c9e4c667..00000000 --- "a/learning/.vuepress/dist/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408.html" +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - 二叉树的剪枝(814) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1.html" "b/learning/.vuepress/dist/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1.html" deleted file mode 100644 index b937fab3..00000000 --- "a/learning/.vuepress/dist/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1.html" +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - 全排列算法 | 小浩算法 - - - - - - - -
文章修订于: 7/13/2020, 12:24:08 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501.html" "b/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501.html" deleted file mode 100644 index 72596a6a..00000000 --- "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501.html" +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - 滑动窗口最大值(239) | 小浩算法 - - - - - - - -
文章修订于: 6/14/2020, 12:10:10 AM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502.html" "b/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502.html" deleted file mode 100644 index 2248ece3..00000000 --- "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502.html" +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - 无重复字符的最长子串(3) | 小浩算法 - - - - - - - -
文章修订于: 6/14/2020, 12:10:10 AM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503.html" "b/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503.html" deleted file mode 100644 index 153c50ef..00000000 --- "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503.html" +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - 字母异位词(438) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504.html" "b/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504.html" deleted file mode 100644 index e27adf08..00000000 --- "a/learning/.vuepress/dist/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504.html" +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - 和为s的连续正数序列 | 小浩算法 - - - - - - - -
文章修订于: 7/8/2020, 10:18:05 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601.html" deleted file mode 100644 index 8af0e086..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 囚徒困境 | 小浩算法 - - - - - - - -
文章修订于: 6/14/2020, 6:33:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602.html" deleted file mode 100644 index 34c05a18..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 辛普森悖论 | 小浩算法 - - - - - - - -
文章修订于: 6/15/2020, 6:22:02 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/603.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/603.html" deleted file mode 100644 index a967757e..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/603.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 红眼睛和蓝眼睛 | 小浩算法 - - - - - - - -
文章修订于: 6/15/2020, 6:22:02 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/604.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/604.html" deleted file mode 100644 index 64b9dd7d..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/604.html" +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - 海盗分金币 | 小浩算法 - - - - - - - -
文章修订于: 6/14/2020, 6:33:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605.html" deleted file mode 100644 index 2a225f3d..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 智猪博弈 | 小浩算法 - - - - - - - -
文章修订于: 7/3/2020, 9:35:10 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606.html" deleted file mode 100644 index 3dfadd7d..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 生男生女的问题 | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607.html" deleted file mode 100644 index d27238f7..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 硬币问题 | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608.html" deleted file mode 100644 index aabeb30d..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 画圈圈的问题 | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609.html" deleted file mode 100644 index df22faca..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 巧克力问题 | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610.html" "b/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610.html" deleted file mode 100644 index abfbdf1a..00000000 --- "a/learning/.vuepress/dist/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 大鱼和小鱼的问题 | 小浩算法 - - - - - - - -
文章修订于: 7/8/2020, 10:18:05 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701.html" "b/learning/.vuepress/dist/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701.html" deleted file mode 100644 index 59eec797..00000000 --- "a/learning/.vuepress/dist/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701.html" +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - 按奇偶排序数组(905) | 小浩算法 - - - - - - - -
文章修订于: 6/14/2020, 6:33:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801.html" "b/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801.html" deleted file mode 100644 index ed7e3987..00000000 --- "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801.html" +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - 使用位运算求和 | 小浩算法 - - - - - - - -
文章修订于: 6/28/2020, 6:40:28 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802.html" "b/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802.html" deleted file mode 100644 index aaebcb31..00000000 --- "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802.html" +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - 2的幂(231) | 小浩算法 - - - - - - - -
文章修订于: 6/28/2020, 6:40:28 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803.html" "b/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803.html" deleted file mode 100644 index 83500c22..00000000 --- "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803.html" +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - 返回二进制中1的个数(191) | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 12:09:22 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804.html" "b/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804.html" deleted file mode 100644 index bfc373a6..00000000 --- "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804.html" +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - 只出现一次的数字(136) | 小浩算法 - - - - - - - -
文章修订于: 6/28/2020, 6:40:28 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805.html" "b/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805.html" deleted file mode 100644 index 5a364d05..00000000 --- "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805.html" +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - 只出现一次的数字Ⅱ(137) | 小浩算法 - - - - - - - -
文章修订于: 6/30/2020, 5:47:11 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806.html" "b/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806.html" deleted file mode 100644 index 16e03e3b..00000000 --- "a/learning/.vuepress/dist/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806.html" +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - 缺失数字(268) | 小浩算法 - - - - - - - -
文章修订于: 6/30/2020, 5:47:11 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901.html" "b/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901.html" deleted file mode 100644 index ceb9bf7f..00000000 --- "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901.html" +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - 爱吃香蕉的珂珂(875) | 小浩算法 - - - - - - - -
文章修订于: 6/30/2020, 5:47:11 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902.html" "b/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902.html" deleted file mode 100644 index a29162dd..00000000 --- "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902.html" +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - x的平方根(69) | 小浩算法 - - - - - - - -
文章修订于: 6/30/2020, 5:47:11 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903.html" "b/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903.html" deleted file mode 100644 index ef232d26..00000000 --- "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903.html" +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - 第一个错误的版本(287) | 小浩算法 - - - - - - - -
文章修订于: 6/30/2020, 5:47:11 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904.html" "b/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904.html" deleted file mode 100644 index 5cac5c80..00000000 --- "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904.html" +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - 旋转排序数组中的最小值Ⅰ(153) | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905.html" "b/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905.html" deleted file mode 100644 index 8a22e284..00000000 --- "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905.html" +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - 旋转排序数组中的最小值Ⅱ(154) | 小浩算法 - - - - - - - -
文章修订于: 7/5/2020, 10:02:32 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906.html" "b/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906.html" deleted file mode 100644 index 0a8abe28..00000000 --- "a/learning/.vuepress/dist/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906.html" +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - 供暖器(475) | 小浩算法 - - - - - - - -
文章修订于: 7/6/2020, 10:20:58 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01.html" deleted file mode 100644 index a5a6eb1d..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01.html" +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - 螺旋矩阵Ⅰ(54) | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02.html" deleted file mode 100644 index d098bfc0..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02.html" +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - 只有两个键的键盘(650) | 小浩算法 - - - - - - - -
文章修订于: 6/16/2020, 9:13:23 AM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03.html" deleted file mode 100644 index 9f900415..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03.html" +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - 24点游戏(679) | 小浩算法 - - - - - - - -
文章修订于: 6/16/2020, 9:13:23 AM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04.html" deleted file mode 100644 index 9989d84e..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04.html" +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - 飞机座位分配概率(1227) | 小浩算法 - - - - - - - -
文章修订于: 6/16/2020, 9:13:23 AM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/05.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/05.html" deleted file mode 100644 index 97649836..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/05.html" +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - 水分子的产生 | 小浩算法 - - - - - - - -
文章修订于: 6/16/2020, 4:12:47 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/06.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/06.html" deleted file mode 100644 index 0fc2ed64..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/06.html" +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - 救生艇(881) | 小浩算法 - - - - - - - -
文章修订于: 6/16/2020, 4:12:47 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07.html" deleted file mode 100644 index 871a6c35..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 25匹马的经典问题 | 小浩算法 - - - - - - - -
文章修订于: 6/16/2020, 4:12:47 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08.html" deleted file mode 100644 index 6516bccf..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08.html" +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - 灯泡开关(319) | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 4:13:04 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09.html" deleted file mode 100644 index 50979078..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09.html" +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - 三门问题 | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 4:13:04 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10.html" deleted file mode 100644 index b5868ba5..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10.html" +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - 猜数字游戏(299) | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 4:13:04 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11.html" deleted file mode 100644 index 3b7fd2e0..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11.html" +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - LRU缓存机制(146) | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 8:09:25 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12.html" deleted file mode 100644 index 3f17221f..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12.html" +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - 最小的k个数 | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 8:09:25 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13.html" deleted file mode 100644 index b1f4db20..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13.html" +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - 不同路径 | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 8:09:25 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14.html" deleted file mode 100644 index 51a8c554..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14.html" +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - 不同路径 - 障碍物 | 小浩算法 - - - - - - - -
文章修订于: 6/18/2020, 8:09:25 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15.html" deleted file mode 100644 index 2a617988..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15.html" +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - 伪蒙特卡洛 | 小浩算法 - - - - - - - -
文章修订于: 6/28/2020, 7:49:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16.html" deleted file mode 100644 index 2b247337..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16.html" +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - 盛最多水的容器 | 小浩算法 - - - - - - - -
文章修订于: 6/19/2020, 9:56:29 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17.html" deleted file mode 100644 index 1941bc67..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17.html" +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - 扑克牌中的顺子容器 | 小浩算法 - - - - - - - -
文章修订于: 6/19/2020, 9:56:29 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18.html" deleted file mode 100644 index a79ace34..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18.html" +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - 整数拆分(343) | 小浩算法 - - - - - - - -
文章修订于: 6/19/2020, 9:56:29 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19.html" deleted file mode 100644 index 5b60eb6c..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19.html" +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - 移动石子直到连续(1033) | 小浩算法 - - - - - - - -
文章修订于: 6/20/2020, 9:24:13 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20.html" deleted file mode 100644 index 3bdde8df..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20.html" +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Nim 游戏(292) | 小浩算法 - - - - - - - -
文章修订于: 6/20/2020, 9:24:13 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21.html" deleted file mode 100644 index a177a956..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21.html" +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - 寻找两个正序数组的中位数(292) | 小浩算法 - - - - - - - -
文章修订于: 6/20/2020, 9:24:13 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22.html" deleted file mode 100644 index c4d6f80e..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22.html" +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - 第k个最大元素(215) | 小浩算法 - - - - - - - -
文章修订于: 7/3/2020, 9:35:10 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23.html" deleted file mode 100644 index 90a90701..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23.html" +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - 镜面反射(858) | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25.html" deleted file mode 100644 index c912b76b..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25.html" +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - 整数转罗马数字(12) | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26.html" deleted file mode 100644 index e94729b8..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26.html" +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - 荷兰国旗问题 | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27.html" deleted file mode 100644 index dc9fcd0f..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27.html" +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - 六九问题 | 小浩算法 - - - - - - - -
文章修订于: 7/10/2020, 10:21:53 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28.html" deleted file mode 100644 index 3421af7b..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28.html" +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - 有效的数独 | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 12:12:34 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29.html" deleted file mode 100644 index be92cade..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 费米估算 | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 10:13:00 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30.html" deleted file mode 100644 index 5b0716e4..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30.html" +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - 分发饼干 | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 10:13:00 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31.html" deleted file mode 100644 index 4222c1fe..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31.html" +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - 生命游戏(289) | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 10:13:00 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32.html" deleted file mode 100644 index f7847536..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32.html" +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - 搜索二维矩阵(74) | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33.html" deleted file mode 100644 index a1863e0c..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33.html" +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - 子集(78) | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34.html" deleted file mode 100644 index eaa0ae2a..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 面试中的智力题 | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50.html" deleted file mode 100644 index 245f8e5f..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50.html" +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 图的基础知识 | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 10:13:00 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51.html" deleted file mode 100644 index a0521508..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51.html" +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - 旋转图像(48) | 小浩算法 - - - - - - - -
文章修订于: 7/11/2020, 10:13:00 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52.html" "b/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52.html" deleted file mode 100644 index e01fe1e8..00000000 --- "a/learning/.vuepress/dist/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52.html" +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - 螺旋矩阵Ⅱ(59) | 小浩算法 - - - - - - - -
文章修订于: 7/12/2020, 9:17:31 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/0.hello.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/0.hello.html" deleted file mode 100644 index 5012134d..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/0.hello.html" +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - 排序专栏 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 5:04:59 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/1.bubbleSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/1.bubbleSort.html" deleted file mode 100644 index 74121654..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/1.bubbleSort.html" +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - 冒泡排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/10.radixSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/10.radixSort.html" deleted file mode 100644 index 2bc1645c..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/10.radixSort.html" +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - 基数排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/2.selectionSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/2.selectionSort.html" deleted file mode 100644 index 442df158..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/2.selectionSort.html" +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - 选择排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/3.insertionSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/3.insertionSort.html" deleted file mode 100644 index d4a2e139..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/3.insertionSort.html" +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - 插入排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/4.shellSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/4.shellSort.html" deleted file mode 100644 index 05619843..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/4.shellSort.html" +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - 希尔排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/5.mergeSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/5.mergeSort.html" deleted file mode 100644 index 8c20a9d3..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/5.mergeSort.html" +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - 归并排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/6.quickSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/6.quickSort.html" deleted file mode 100644 index 74a20bf7..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/6.quickSort.html" +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - 快速排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/7.heapSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/7.heapSort.html" deleted file mode 100644 index 23e5fc5c..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/7.heapSort.html" +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - 堆排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/8.countingSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/8.countingSort.html" deleted file mode 100644 index af696a0a..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/8.countingSort.html" +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - 计数排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/9.bucketSort.html" "b/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/9.bucketSort.html" deleted file mode 100644 index 1accf895..00000000 --- "a/learning/.vuepress/dist/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/9.bucketSort.html" +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - 桶排序 | 小浩算法 - - - - - - - -
文章修订于: 6/12/2020, 4:24:27 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git a/learning/.vuepress/dist/404.html b/learning/.vuepress/dist/404.html deleted file mode 100644 index e2376d1b..00000000 --- a/learning/.vuepress/dist/404.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - 小浩算法 - - - - - - - -

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓


进群
- - - diff --git a/learning/.vuepress/dist/assets/css/0.styles.9ca2b61f.css b/learning/.vuepress/dist/assets/css/0.styles.9ca2b61f.css deleted file mode 100644 index a207fc3d..00000000 --- a/learning/.vuepress/dist/assets/css/0.styles.9ca2b61f.css +++ /dev/null @@ -1,10 +0,0 @@ -.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}.navbar .logo[data-v-44bd5a18]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.back-to-ceiling[data-v-44bd5a18]{background-color:#fff;background-color:var(--background-color);box-shadow:0 1px 6px 0 rgba(0,0,0,.2);box-shadow:var(--box-shadow);position:fixed;display:inline-block;text-align:center;cursor:pointer}.back-to-ceiling[data-v-44bd5a18]::hover{background:#d5dbe7}.back-to-ceiling .icon[data-v-44bd5a18]{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:26px;height:26px;fill:#0074af}.fade-enter-active[data-v-44bd5a18],.fade-leave-active[data-v-44bd5a18]{transition:all .5s}.fade-enter[data-v-44bd5a18],.fade-leave-to[data-v-44bd5a18]{opacity:0;transform:translateY(120px)}.navbar .logo[data-v-d48f4d20]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}#loader-wrapper[data-v-d48f4d20]{height:100vh;width:100vw;background:#fff;background:var(--background-color)}#loader-wrapper .loader-main[data-v-d48f4d20]{position:fixed;width:120px;height:50px;top:45%;left:50%;z-index:555;transform:translate(-50%)}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(2){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear 0s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear 0s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(3){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .33s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .33s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(4){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .66s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .66s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(5){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .99s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .99s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:first-of-type{width:0;height:0;border:25px solid #0074af;border-right-color:transparent;border-radius:25px;-webkit-animation:rotate_pacman_half_up-data-v-d48f4d20 .5s 0s infinite;animation:rotate_pacman_half_up-data-v-d48f4d20 .5s 0s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(2){width:0;height:0;border:25px solid #0074af;border-right-color:transparent;border-radius:25px;-webkit-animation:rotate_pacman_half_down-data-v-d48f4d20 .5s 0s infinite;animation:rotate_pacman_half_down-data-v-d48f4d20 .5s 0s infinite;margin-top:-50px}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(3),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(4),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(5),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(6){background-color:#0074af;width:15px;height:15px;border-radius:100%;margin:2px;width:10px;height:10px;position:absolute;transform:translateY(-6.25px);top:25px;left:100px}#loader-wrapper .title[data-v-d48f4d20]{margin:8rem auto 2rem;font-size:30px}#loader-wrapper .description[data-v-d48f4d20],#loader-wrapper .title[data-v-d48f4d20]{text-align:center;color:#2c3e50;color:var(--text-color);box-sizing:border-box;padding:0 10px;text-shadow:0 2px 10px rgba(0,0,0,.2)}#loader-wrapper .description[data-v-d48f4d20]{margin:auto;font-size:22px}@-webkit-keyframes pacman-balls-data-v-d48f4d20{75%{opacity:.7}to{transform:translate(-100px,-6.25px)}}@keyframes pacman-balls-data-v-d48f4d20{75%{opacity:.7}to{transform:translate(-100px,-6.25px)}}@-webkit-keyframes rotate_pacman_half_up-data-v-d48f4d20{0%{transform:rotate(270deg)}50%{transform:rotate(1turn)}to{transform:rotate(270deg)}}@keyframes rotate_pacman_half_up-data-v-d48f4d20{0%{transform:rotate(270deg)}50%{transform:rotate(1turn)}to{transform:rotate(270deg)}}@-webkit-keyframes rotate_pacman_half_down-data-v-d48f4d20{0%{transform:rotate(90deg)}50%{transform:rotate(0deg)}to{transform:rotate(90deg)}}@keyframes rotate_pacman_half_down-data-v-d48f4d20{0%{transform:rotate(90deg)}50%{transform:rotate(0deg)}to{transform:rotate(90deg)}}.valine-wrapper #valine.v .vbtn{color:#2c3e50;color:var(--text-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vbtn:hover{color:#0074af;border-color:#0074af}.valine-wrapper #valine.v .vwrap{background:rgba(27,31,35,.05);background:var(--code-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vwrap .vheader .vinput{border-bottom:1px dashed var(--border-color)}.valine-wrapper #valine.v .vwrap .vheader .vinput:focus{border-bottom-color:#0074af}.valine-wrapper #valine.v .vwrap .vheader .vinput:-internal-autofill-selected{background-color:var(--code-color)!important}.valine-wrapper #valine.v .vinfo{padding-left:.6rem}.valine-wrapper #valine.v .vcard .vquote{margin-left:0;border-left:none}.valine-wrapper #valine.v .vcard .vimg{width:2.8rem;height:2.8rem;border-radius:.25rem;border:none}.valine-wrapper #valine.v .vcard .vhead .vnick{color:#0074af}.valine-wrapper #valine.v .vcard .vhead .vnick:before{background:#0074af}.valine-wrapper #valine.v .vh{border-bottom:none}.valine-wrapper #valine.v .vh .vhead .vsys{color:#0074af;color:var(--text-color);background:rgba(27,31,35,.05);background:var(--code-color)}.valine-wrapper #valine.v .vh .vmeta{margin-bottom:1rem}.valine-wrapper #valine.v .vh .vmeta .vat{margin-right:.3rem;background:rgba(27,31,35,.05);background:var(--code-color);border-radius:.25rem;padding:0 .4rem;color:var(--text-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vh .vmeta .vat:hover{color:#0074af;border-color:#0074af}.valine-wrapper #valine.v .vh .vcontent{background:rgba(27,31,35,.05);background:var(--code-color);border-radius:.25rem;margin:0 .3rem;padding:.1rem .6rem .05rem}.valine-wrapper #valine.v .vh .vcontent p .at{color:#0074af}.valine-wrapper #valine.v .vh .vcontent.expand:before{z-index:1;background:linear-gradient(180deg,hsla(0,0%,100%,0),#fff);background:linear-gradient(180deg,hsla(0,0%,100%,0),var(--background-color))}.valine-wrapper #valine.v .vh .vcontent.expand:after{color:#0074af;color:var(--text-color);background:#fff;background:var(--background-color)}.valine-wrapper #valine.v .info{padding-right:.6rem}.valine-wrapper #valine.v .vbtn,.valine-wrapper #valine.v code,.valine-wrapper #valine.v pre{background:var(--background-color);color:var(--text-color)}.valine-wrapper #valine.v a{color:#0074af}.valine-wrapper #valine.v a:before{background:#0074af} - -/*! - * vssue - A vue-powered issue-based comment plugin - * - * @version v1.4.6 - * @link https://vssue.js.org - * @license MIT - * @copyright 2018-2020 meteorlxy - */.vssue .vssue-button{color:#3eaf7c;border:2px solid #3eaf7c}.vssue .vssue-button:not(:disabled).vssue-button-primary{color:#3eaf7c;border-color:#3eaf7c}.vssue .vssue-icon{fill:#3eaf7c}.vssue .vssue-notice .vssue-alert{color:#3eaf7c;border:2px solid #c3ead8;background-color:#f5fbf8}.vssue .vssue-notice .vssue-progress{background-color:#3eaf7c}.vssue .vssue-status{color:#3eaf7c}@media screen and (max-width:576px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:60px}}@media screen and (min-width:577px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:70px}}@media screen and (max-width:576px){.vssue .vssue-new-comment .vssue-new-comment-footer{text-align:center}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-new-comment-operations{margin-top:10px}}@media screen and (min-width:577px){.vssue .vssue-new-comment .vssue-new-comment-footer{margin-left:70px;text-align:right}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{float:left}}.vssue .vssue-new-comment .vssue-new-comment-input{background-color:#f5fbf8}.vssue .vssue-comments .vssue-comment.vssue-comment-edit-mode .vssue-comment-main,.vssue .vssue-new-comment .vssue-new-comment-input:focus{border-color:#9adbbe;box-shadow:0 0 1px 1px #9adbbe}@media screen and (max-width:576px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:60px}}@media screen and (min-width:577px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:70px}}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations,.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-reactions .vssue-comment-reaction{color:#3eaf7c}@media screen and (max-width:576px){.vssue .vssue-pagination{flex-direction:column;justify-content:center;text-align:center}}@media screen and (max-width:576px){.vssue .vssue-pagination .vssue-pagination-page{margin-top:10px}}@media screen and (min-width:577px){.vssue .vssue-pagination .vssue-pagination-page{text-align:right}}.vssue .vssue-pagination .vssue-pagination-select{border:1px solid #9adbbe}.vssue .vssue-pagination .vssue-pagination-select:focus{box-shadow:0 0 .2px .2px #9adbbe}.vssue .vssue-pagination .vssue-pagination-link:not(.disabled),.vssue :not(.vssue-comment-content) a{color:#3eaf7c}.markdown-body .tab-size[data-tab-size="1"]{-o-tab-size:1}.markdown-body .tab-size[data-tab-size="2"]{-o-tab-size:2}.markdown-body .tab-size[data-tab-size="3"]{-o-tab-size:3}.markdown-body .tab-size[data-tab-size="4"]{-o-tab-size:4}.markdown-body .tab-size[data-tab-size="5"]{-o-tab-size:5}.markdown-body .tab-size[data-tab-size="6"]{-o-tab-size:6}.markdown-body .tab-size[data-tab-size="7"]{-o-tab-size:7}.markdown-body .tab-size[data-tab-size="8"]{-o-tab-size:8}.markdown-body .tab-size[data-tab-size="9"]{-o-tab-size:9}.markdown-body .tab-size[data-tab-size="10"]{-o-tab-size:10}.markdown-body .tab-size[data-tab-size="11"]{-o-tab-size:11}.markdown-body .tab-size[data-tab-size="12"]{-o-tab-size:12}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,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) format("woff")}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{background-color:#b31d28;color:#fafbfc}.markdown-body .pl-c2{background-color:#d73a49;color:#fafbfc}.markdown-body .pl-c2:before{content:"^M"}.markdown-body .pl-sr .pl-cce{color:#22863a;font-weight:700}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#005cc5;font-weight:700}.markdown-body .pl-mi{color:#24292e;font-style:italic}.markdown-body .pl-mb{color:#24292e;font-weight:700}.markdown-body .pl-md{background-color:#ffeef0;color:#b31d28}.markdown-body .pl-mi1{background-color:#f0fff4;color:#22863a}.markdown-body .pl-mc{background-color:#ffebda;color:#e36209}.markdown-body .pl-mi2{background-color:#005cc5;color:#f6f8fa}.markdown-body .pl-mdr{color:#6f42c1;font-weight:700}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{color:#032f62;text-decoration:underline}.markdown-body details{display:block}.markdown-body summary{display:list-item}.markdown-body a{background-color:transparent}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit;font-weight:bolder}.markdown-body h1{margin:.67em 0}.markdown-body img{border-style:none}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em}.markdown-body hr{box-sizing:content-box;overflow:visible}.markdown-body input{font:inherit;margin:0;overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{background:transparent;border-bottom:1px solid #dfe2e5;height:0;margin:15px 0;overflow:hidden}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-bottom:0;margin-top:0}.markdown-body h1{font-size:32px}.markdown-body h1,.markdown-body h2{font-weight:600}.markdown-body h2{font-size:24px}.markdown-body h3{font-size:20px}.markdown-body h3,.markdown-body h4{font-weight:600}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:14px}.markdown-body h5,.markdown-body h6{font-weight:600}.markdown-body h6{font-size:12px}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}.markdown-body pre{margin-bottom:0;margin-top:0}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.markdown-body .border{border:1px solid #e1e4e8!important}.markdown-body .border-0{border:0!important}.markdown-body .border-bottom{border-bottom:1px solid #e1e4e8!important}.markdown-body .rounded-1{border-radius:3px!important}.markdown-body .bg-white{background-color:#fff!important}.markdown-body .bg-gray-light{background-color:#fafbfc!important}.markdown-body .text-gray-light{color:#6a737d!important}.markdown-body .mb-0{margin-bottom:0!important}.markdown-body .my-2{margin-bottom:8px!important;margin-top:8px!important}.markdown-body .py-0{padding-bottom:0!important;padding-top:0!important}.markdown-body .py-2{padding-bottom:8px!important;padding-top:8px!important}.markdown-body .pl-3,.markdown-body .px-3{padding-left:16px!important}.markdown-body .px-3{padding-right:16px!important}.markdown-body .f6{font-size:12px!important}.markdown-body .lh-condensed{line-height:1.25!important}.markdown-body .text-bold{font-weight:600!important}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body hr{background-color:#e1e4e8;border:0;height:.25em;margin:24px 0;padding:0}.markdown-body blockquote{border-left:.25em solid #dfe2e5;color:#6a737d;padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{border:1px solid #c6cbd1;border-bottom-color:#959da5;box-shadow:inset 0 -1px 0 #959da5;font-size:11px}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{border-bottom:1px solid #eaecef;padding-bottom:.3em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:#6a737d;font-size:.85em}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{display:block;overflow:auto;width:100%}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{border:1px solid #dfe2e5;padding:6px 13px}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{background-color:#fff;box-sizing:content-box;max-width:100%}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body code{background-color:rgba(27,31,35,.05);border-radius:3px;font-size:85%;margin:0;padding:.2em .4em}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{background:transparent;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:#f6f8fa;border-radius:3px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-body pre code{background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0;word-wrap:normal}.markdown-body .commit-tease-sha{color:#444d56;display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:90%}.markdown-body .blob-wrapper{border-bottom-left-radius:3px;border-bottom-right-radius:3px;overflow-x:auto;overflow-y:hidden}.markdown-body .blob-wrapper-embedded{max-height:240px;overflow-y:auto}.markdown-body .blob-num{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;color:rgba(27,31,35,.3);cursor:pointer;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;min-width:50px;padding-left:10px;padding-right:10px;text-align:right;user-select:none;vertical-align:top;white-space:nowrap;width:1%}.markdown-body .blob-num:hover{color:rgba(27,31,35,.6)}.markdown-body .blob-num:before{content:attr(data-line-number)}.markdown-body .blob-code{line-height:20px;padding-left:10px;padding-right:10px;position:relative;vertical-align:top}.markdown-body .blob-code-inner{color:#24292e;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;overflow:visible;white-space:pre;word-wrap:normal}.markdown-body .pl-token.active,.markdown-body .pl-token:hover{background:#ffea7f;cursor:pointer}.markdown-body kbd{background-color:#fafbfc;border:1px solid #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1;color:#444d56;display:inline-block;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body :checked+.radio-label{border-color:#0366d6;position:relative;z-index:1}.markdown-body .tab-size[data-tab-size="1"]{-moz-tab-size:1;tab-size:1}.markdown-body .tab-size[data-tab-size="2"]{-moz-tab-size:2;tab-size:2}.markdown-body .tab-size[data-tab-size="3"]{-moz-tab-size:3;tab-size:3}.markdown-body .tab-size[data-tab-size="4"]{-moz-tab-size:4;tab-size:4}.markdown-body .tab-size[data-tab-size="5"]{-moz-tab-size:5;tab-size:5}.markdown-body .tab-size[data-tab-size="6"]{-moz-tab-size:6;tab-size:6}.markdown-body .tab-size[data-tab-size="7"]{-moz-tab-size:7;tab-size:7}.markdown-body .tab-size[data-tab-size="8"]{-moz-tab-size:8;tab-size:8}.markdown-body .tab-size[data-tab-size="9"]{-moz-tab-size:9;tab-size:9}.markdown-body .tab-size[data-tab-size="10"]{-moz-tab-size:10;tab-size:10}.markdown-body .tab-size[data-tab-size="11"]{-moz-tab-size:11;tab-size:11}.markdown-body .tab-size[data-tab-size="12"]{-moz-tab-size:12;tab-size:12}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body .pl-7{padding-left:48px!important}.markdown-body .pl-8{padding-left:64px!important}.markdown-body .pl-9{padding-left:80px!important}.markdown-body .pl-10{padding-left:96px!important}.markdown-body .pl-11{padding-left:112px!important}.markdown-body .pl-12{padding-left:128px!important}.clearfix:after,.vssue .vssue-new-comment .vssue-new-comment-footer:after{display:block;clear:both;content:""}.vssue{width:100%;color:#2c3e50;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding:10px}.vssue .vssue-button{outline:none;cursor:pointer;padding:10px 20px;font-size:1.05;font-weight:700;color:#0074af;background-color:transparent;border:2px solid #0074af;border-radius:10px}.vssue .vssue-button:disabled{cursor:not-allowed;color:#eaecef;border-color:#eaecef}.vssue .vssue-button:disabled .vssue-icon{fill:#eaecef}.vssue .vssue-button:not(:disabled).vssue-button-default{color:#a3aab1;border-color:#a3aab1}.vssue .vssue-button:not(:disabled).vssue-button-primary{color:#0074af;border-color:#0074af}.vssue .vssue-icon{width:1em;height:1em;vertical-align:-.15em;fill:#0074af;overflow:hidden}.vssue .vssue-icon-loading{-webkit-animation:vssue-keyframe-rotation 1s linear infinite;animation:vssue-keyframe-rotation 1s linear infinite}@-webkit-keyframes vssue-keyframe-rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes vssue-keyframe-rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.vssue .fade-appear-active,.vssue .fade-enter-active{transition:all .3s ease}.vssue .fade-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)}.vssue .fade-appear,.vssue .fade-enter,.vssue .fade-leave-to{opacity:0}.vssue .vssue-notice{position:relative;z-index:100;transform:translateY(-11px)}.vssue .vssue-notice .vssue-alert{position:absolute;z-index:101;cursor:pointer;top:0;padding:10px 20px;width:100%;color:#0074af;border:2px solid #9bddff;border-radius:5px;background-color:#eef9ff}.vssue .vssue-notice .vssue-progress{position:absolute;top:0;left:0;height:2px;background-color:#0074af}.vssue .vssue-status{text-align:center;padding-top:20px;padding-bottom:10px;color:#0074af}.vssue .vssue-status .vssue-icon{font-size:1.4em}.vssue .vssue-status .vssue-status-info{margin-top:10px;margin-bottom:10px}.vssue .vssue-header{padding-bottom:10px;border-bottom:1px solid #eaecef;margin-bottom:10px;overflow:hidden}.vssue .vssue-header .vssue-header-powered-by{float:right}.vssue .vssue-new-comment{border-bottom:1px solid #eaecef;margin-top:10px;margin-bottom:10px}.vssue .vssue-new-comment .vssue-comment-avatar{float:left;width:50px;height:50px}.vssue .vssue-new-comment .vssue-comment-avatar img{width:50px;height:50px}.vssue .vssue-new-comment .vssue-comment-avatar .vssue-icon{cursor:pointer;padding:5px;font-size:50px;fill:#757f8a}.vssue .vssue-new-comment .vssue-new-comment-body{position:relative}@media screen and (max-width:719px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:60px}}@media screen and (min-width:720px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:70px}}.vssue .vssue-new-comment .vssue-new-comment-body .vssue-new-comment-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.vssue .vssue-new-comment .vssue-new-comment-footer{margin-top:10px;margin-bottom:10px}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user .vssue-logout{cursor:pointer;text-decoration:underline;color:#a3aab1;font-weight:400}@media screen and (max-width:719px){.vssue .vssue-new-comment .vssue-new-comment-footer{text-align:center}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-new-comment-operations{margin-top:10px}}@media screen and (min-width:720px){.vssue .vssue-new-comment .vssue-new-comment-footer{margin-left:70px;text-align:right}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{float:left}}.vssue .vssue-new-comment .vssue-new-comment-input{resize:none;outline:none;width:100%;padding:15px;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#eef9ff;border:1px solid #eaecef;border-radius:5px}.vssue .vssue-new-comment .vssue-new-comment-input:disabled{cursor:not-allowed;background-color:#f0f2f4}.vssue .vssue-new-comment .vssue-new-comment-input:focus{background-color:#fff;border-color:#58c7ff;box-shadow:0 0 1px 1px #58c7ff}.vssue .vssue-new-comment .vssue-new-comment-input::-moz-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input:-ms-input-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input::-ms-input-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input::placeholder{color:#a3aab1}.vssue .vssue-comments .vssue-comment{margin:15px 0}.vssue .vssue-comments .vssue-comment.vssue-comment-edit-mode .vssue-comment-main{border-color:#58c7ff;box-shadow:0 0 1px 1px #58c7ff}.vssue .vssue-comments .vssue-comment.vssue-comment-disabled{pointer-events:none}.vssue .vssue-comments .vssue-comment.vssue-comment-disabled .vssue-comment-body{background-color:#f9f9fa}.vssue .vssue-comments .vssue-comment .vssue-comment-avatar{float:left;width:50px;height:50px}.vssue .vssue-comments .vssue-comment .vssue-comment-avatar img{width:50px;height:50px}@media screen and (max-width:719px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:60px}}@media screen and (min-width:720px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:70px}}.vssue .vssue-comments .vssue-comment .vssue-comment-header{padding:10px 15px;overflow:hidden;border-top-left-radius:5px;border-top-right-radius:5px;border:1px solid #eaecef;border-bottom:none}.vssue .vssue-comments .vssue-comment .vssue-comment-header .vssue-comment-created-at{float:right;cursor:default;color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-main{padding:15px;border:1px solid #eaecef}.vssue .vssue-comments .vssue-comment .vssue-comment-main .vssue-edit-comment-input{resize:none;outline:none;border:none;width:100%;background:transparent}.vssue .vssue-comments .vssue-comment .vssue-comment-footer{padding:10px 15px;overflow:hidden;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border:1px solid #eaecef;border-top:none}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-hint{cursor:default;color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-reactions .vssue-comment-reaction{cursor:pointer;display:inline-block;margin-right:8px;color:#0074af}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations{float:right;color:#0074af}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation{cursor:pointer;margin-left:8px}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation.vssue-comment-operation-muted{color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation.vssue-comment-operation-muted .vssue-icon{fill:#a3aab1}.vssue .vssue-pagination{cursor:default;display:flex;padding:5px;color:#a3aab1}@media screen and (max-width:719px){.vssue .vssue-pagination{flex-direction:column;justify-content:center;text-align:center}}.vssue .vssue-pagination .vssue-pagination-loading,.vssue .vssue-pagination .vssue-pagination-page,.vssue .vssue-pagination .vssue-pagination-per-page{flex:1}@media screen and (max-width:719px){.vssue .vssue-pagination .vssue-pagination-page{margin-top:10px}}@media screen and (min-width:720px){.vssue .vssue-pagination .vssue-pagination-page{text-align:right}}.vssue .vssue-pagination .vssue-pagination-select{outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #58c7ff;padding-left:.2rem;padding-right:1rem;background-color:transparent;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg class='icon' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cstyle/%3E%3C/defs%3E%3Cpath d='M676.395 432.896a21.333 21.333 0 0 0-30.166 0L511.061 568.021 377.728 434.645a21.333 21.333 0 0 0-30.165 30.166l148.394 148.48a21.419 21.419 0 0 0 30.208 0l150.23-150.187a21.333 21.333 0 0 0 0-30.208'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:100%}.vssue .vssue-pagination .vssue-pagination-select:disabled{cursor:not-allowed}.vssue .vssue-pagination .vssue-pagination-select:focus{background-color:#fff;box-shadow:0 0 .2px .2px #58c7ff}.vssue .vssue-pagination .vssue-pagination-link{display:inline-block;min-width:1em;text-align:center}.vssue .vssue-pagination .vssue-pagination-link.disabled{pointer-events:none}.vssue .vssue-pagination .vssue-pagination-link:not(.disabled){color:#0074af;font-weight:500;cursor:pointer}.vssue,.vssue *{box-sizing:border-box}.vssue :not(.vssue-comment-content) a{cursor:pointer;font-weight:500;color:#0074af;text-decoration:none}.vssue :not(.vssue-comment-content) hr{display:block;height:1px;border:0;border-top:1px solid #eaecef;margin:1.2rem 0;padding:0}.vssue-wrapper.vssue{color:#2c3e50;color:var(--text-color)}.vssue-wrapper.vssue .vssue-new-comment{border-bottom:1px solid #eaecef;border-bottom:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-new-comment .vssue-new-comment-input:disabled{background-color:#fff;background-color:var(--background-color);border:1px solid #eaecef;border:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{color:#2c3e50;color:var(--text-color)}.vssue-wrapper.vssue .vssue-header{border-bottom:1px solid #eaecef;border-bottom:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-comments .vssue-pagination .vssue-pagination-per-page .vssue-pagination-select{color:var(--text-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-header,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-main{border:none}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-main{background:var(--code-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer{border-top:2px solid var(--background-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-avatar img{width:2.8rem;height:2.8rem;border-radius:.25rem}.vssue-wrapper.vssue .markdown-body{color:var(--text-color)}#nprogress{pointer-events:none}#nprogress .bar{background:#0074af;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #0074af,0 0 5px #0074af;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#0074af transparent transparent #0074af;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.navbar .logo[data-v-34310651]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.notification-wrapper[data-v-34310651]{position:fixed;top:80px;right:20px;z-index:19;width:260px;box-sizing:border-box;background:#fff;border:1px solid #0074af;border-radius:.25rem;background:var(--background-color);box-shadow:var(--box-shadow)}.notification-wrapper .notification-title[data-v-34310651]{position:relative;box-sizing:border-box;padding:10px;margin:0;background:#0074af;color:#fff}.notification-wrapper .notification-title i[data-v-34310651]{color:#fff}.notification-wrapper .notification-title .btn-close[data-v-34310651]{position:absolute;display:inline-block;width:22px;height:22px;right:10px;top:0;bottom:0;margin:auto;cursor:pointer}.notification-wrapper .notification-title .btn-close svg[data-v-34310651]{fill:#fff}.notification-wrapper .notification-content[data-v-34310651]{box-sizing:border-box;padding:10px 15px 0}.notification-wrapper .notification-content h5[data-v-34310651]{margin:.2rem 0;text-align:center}.notification-wrapper .notification-content img[data-v-34310651]{width:100%}.notification-wrapper .btn-donate[data-v-34310651]{display:block;margin:2rem auto;width:3.4rem;line-height:3.4rem;text-align:center;background-color:#0074af;border-radius:50%;color:#fff;font-size:1rem;box-shadow:var(--box-shadow);cursor:pointer}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.navbar .logo[data-v-312e2a2a]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-312e2a2a]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-312e2a2a]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.badge[data-v-312e2a2a]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:.25rem;padding:0 6px;color:#fff}.badge.green[data-v-312e2a2a],.badge.tip[data-v-312e2a2a],.badge[data-v-312e2a2a]{background-color:#42b983}.badge.error[data-v-312e2a2a]{background-color:#da5961}.badge.warn[data-v-312e2a2a],.badge.warning[data-v-312e2a2a],.badge.yellow[data-v-312e2a2a]{background-color:#e7c000}.badge+.badge[data-v-312e2a2a]{margin-left:5px}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box .iconfont{position:absolute;top:0;bottom:0;z-index:0;left:.6rem;margin:auto}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid var(--border-color);border-radius:.25rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:transparent;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#0074af}.search-box .suggestions{background:var(--background-color);width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:var(--text-color)}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:var(--border-color)}.search-box .suggestion.focused a{color:#0074af}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box{margin-right:0}.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.module-enter,.module-leave-to{opacity:0;transform:translateY(-20px)}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero h1{font-size:2.5rem;color:var(--text-color)}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{font-size:1.6rem;line-height:1.3;color:var(--text-color)}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#0074af;padding:.6rem 1.2rem;border-radius:.25rem;transition:background-color .1s ease;box-sizing:border-box}.home .hero .action-button:hover{background-color:#008ad1}.home .features{border-top:1px solid var(--border-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%;transition:all .5s;color:var(--text-color)}.home .feature h2{font-size:1.6rem;font-weight:500;border-bottom:none;padding-bottom:0}.home .feature:hover{transform:scale(1.05)}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid var(--border-color);padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#0074af}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #0074af;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--text-color-sub);border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--background-color);padding:.6rem 0;box-shadow:var(--box-shadow);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:var(--text-color)}.nav-links a.router-link-active,.nav-links a.router-link-active .iconfont,.nav-links a:hover,.nav-links a:hover .iconfont{color:#0074af}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #0086ca}}.mode-options{background-color:var(--background-color);min-width:125px;margin:0;padding:1em;box-shadow:var(--box-shadow);border-radius:.25rem}.mode-options .title{margin-top:0;margin-bottom:.6rem;font-weight:700;color:var(--text-color)}.mode-options .color-mode-options{display:flex;flex-wrap:wrap}.mode-options .color-mode-options li{text-align:center;font-size:12px;color:var(--text-color);line-height:18px;padding:3px 6px;border-top:1px solid #666;border-bottom:1px solid #666;background-color:var(--background-color);cursor:pointer}.mode-options .color-mode-options li.dark{border-radius:.25rem 0 0 .25rem;border-left:1px solid #666}.mode-options .color-mode-options li.light{border-radius:0 .25rem .25rem 0;border-right:1px solid #666}.mode-options .color-mode-options li.active{background-color:#0074af;color:#fff}.mode-options .color-mode-options li:not(.active){border-right:1px solid #666}.color-picker{position:relative;margin-right:1em;cursor:pointer}.color-picker .color-button{align-items:center;height:100%}.color-picker .color-button .iconfont{font-size:1.4rem;color:#0074af}.color-picker .color-picker-menu{position:absolute;top:40px;left:50%;transform:translateX(-50%);z-index:150}.color-picker .color-picker-menu.menu-transition-enter-active,.color-picker .color-picker-menu.menu-transition-leave-active{transition:all .25s ease-in-out}.color-picker .color-picker-menu.menu-transition-enter,.color-picker .color-picker-menu.menu-transition-leave-to{top:50px;opacity:0}.color-picker .color-picker-menu ul{list-style-type:none;margin:0;padding:0}@media (max-width:719px){.color-picker{margin-right:1rem}.color-picker .color-picker-menu{left:calc(50% - 35px)}.color-picker .color-picker-menu:before{left:calc(50% + 35px)}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;box-shadow:var(--box-shadow);background:var(--background-color)}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{border-radius:50%}.navbar .site-name{font-size:1.2rem;font-weight:600;color:var(--text-color);position:relative;background:var(--background-color)}.navbar .links{padding-left:1.5rem;box-sizing:border-box;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex;background-color:var(--background-color)}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:.2rem}}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:var(--text-color)}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:var(--text-color);transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:#0074af}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#0074af;border-left-color:#0074af}.sidebar-heading.clickable:hover{color:#0074af}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.navbar .logo[data-v-36b9f66a]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-36b9f66a]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-36b9f66a]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.tags[data-v-36b9f66a]{margin:30px 0}.tags span[data-v-36b9f66a]{vertical-align:middle;margin:4px 4px 10px;padding:4px 8px;display:inline-block;cursor:pointer;border-radius:.25rem;background:#fff;color:#fff;line-height:13px;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s}.tags span[data-v-36b9f66a]:hover{transform:scale(1.04)}.tags span.active[data-v-36b9f66a]{transform:scale(1.2)}.navbar .logo[data-v-48a8cd70]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-48a8cd70]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-48a8cd70]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.friend-link-wrapper[data-v-48a8cd70]{position:relative;margin:30px 0}.friend-link-wrapper .friend-link-item[data-v-48a8cd70]{position:relative;vertical-align:middle;margin:4px 4px 10px;padding:4px 8px 4px 20px;line-height:20px;display:inline-block;cursor:default;border-radius:.25rem;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s}.friend-link-wrapper .friend-link-item .list-style[data-v-48a8cd70]{position:absolute;left:.4rem;top:0;bottom:0;margin:auto;display:block;width:.4rem;height:.4rem;border-radius:.1rem;background:#0074af;content:""}.friend-link-wrapper .friend-link-item .popup-window-wrapper[data-v-48a8cd70]{display:none}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window[data-v-48a8cd70]{position:absolute;display:flex;background:var(--background-color);box-shadow:var(--box-shadow);border-radius:.25rem;box-sizing:border-box;padding:.8rem 1rem;width:300px}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .logo[data-v-48a8cd70]{margin-right:.4rem;width:2rem;height:2rem;flex:0 0 2rem;border-radius:.25rem;overflow:hidden}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .logo img[data-v-48a8cd70]{width:2rem;height:2rem}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info[data-v-48a8cd70]{flex:0 0 85%;width:85%}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title[data-v-48a8cd70]{display:flex;align-items:center;justify-content:space-between;height:2rem}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title h4[data-v-48a8cd70]{margin:.2rem 0;flex:0 0 86%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title .btn-go[data-v-48a8cd70]{width:1.4rem;height:1.2rem;border-radius:.25rem;font-size:.1rem;color:#fff;text-align:center;line-height:1.2rem;cursor:pointer;transition:all .5s}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title .btn-go[data-v-48a8cd70]:hover{transform:scale(1.1)}.fade-enter-active[data-v-48a8cd70],.fade-leave-active[data-v-48a8cd70]{transition:opacity .5s}.fade-enter[data-v-48a8cd70],.fade-leave-to[data-v-48a8cd70]{opacity:0}.navbar .logo[data-v-484a899e]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.iconfont[data-v-484a899e]{display:inline-block;line-height:1.5rem}.iconfont[data-v-484a899e]:not(:last-child){margin-right:1rem}.iconfont span[data-v-484a899e]{margin-left:.5rem}.tags .tag-item[data-v-484a899e]{cursor:pointer;font-family:Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.tags .tag-item.active[data-v-484a899e],.tags .tag-item[data-v-484a899e]:hover{color:#0074af}@media (max-width:719px){.tags[data-v-484a899e]{display:block;margin-left:0!important}}.navbar .logo[data-v-28f76ce9]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-28f76ce9]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-28f76ce9]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.abstract-item[data-v-28f76ce9]{position:relative;margin:0 auto 20px;padding:16px 20px;width:100%;overflow:hidden;border-radius:.25rem;box-shadow:var(--box-shadow);box-sizing:border-box;transition:all .3s;background-color:var(--background-color)}.abstract-item .reco-sticky[data-v-28f76ce9]{position:absolute;top:0;left:0;display:inline-block;color:#0074af;font-size:2.4rem}.abstract-item[data-v-28f76ce9]:hover{box-shadow:var(--box-shadow-hover)}.abstract-item .title[data-v-28f76ce9]{position:relative;font-size:1.28rem;line-height:36px;display:inline-block}.abstract-item .title .reco-lock[data-v-28f76ce9]{font-size:1.28rem;color:#0074af}.abstract-item .title[data-v-28f76ce9]:after{content:"";position:absolute;width:100%;height:2px;bottom:0;left:0;background-color:#0074af;visibility:hidden;transform:scaleX(0);transition:.3s ease-in-out}.abstract-item .title:hover a[data-v-28f76ce9]{color:#0074af}.abstract-item .title[data-v-28f76ce9]:hover:after{visibility:visible;transform:scaleX(1)}.abstract-item .tags .tag-item[data-v-28f76ce9]{cursor:pointer}.abstract-item .tags .tag-item.active[data-v-28f76ce9],.abstract-item .tags .tag-item[data-v-28f76ce9]:hover{color:#0074af}@media (max-width:719px){.tags[data-v-28f76ce9]{display:block;margin-top:1rem;margin-left:0!important}}.sidebar .sidebar-sub-headers{padding-left:1.5rem;font-size:.95em}.sidebar-sub-headers a.sidebar-link{margin:0 1rem 0 .6rem}a.sidebar-link{font-size:1em;font-weight:400;display:block!important;color:var(--text-color);padding:.35rem 1rem .35rem .75rem;line-height:1.4;margin:0 1rem 0 1.5rem;box-sizing:border-box;border-radius:.25rem}a.sidebar-link:hover{color:#0074af}a.sidebar-link.active{font-weight:600;color:#fff;background:#0074af}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500;background:transparent;color:#0074af}.navbar .logo[data-v-b038cec6]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.personal-info-wrapper .personal-img[data-v-b038cec6]{display:block;margin:2rem auto;width:8rem;height:8rem;border-radius:50%}.personal-info-wrapper .name[data-v-b038cec6]{text-align:center;color:var(--text-color)}.personal-info-wrapper .num[data-v-b038cec6]{display:flex;margin:0 auto 1rem;width:80%}.personal-info-wrapper .num>div[data-v-b038cec6]{text-align:center;flex:auto}.personal-info-wrapper .num>div[data-v-b038cec6]:first-child{border-right:1px solid #333}.personal-info-wrapper .num>div h3[data-v-b038cec6]{line-height:auto;margin:0 0 .6rem;color:var(--text-color)}.personal-info-wrapper .num>div h6[data-v-b038cec6]{line-height:auto;color:var(--text-color);margin:0}.navbar .logo[data-v-b014bc36]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.abstract-wrapper[data-v-b014bc36]{width:100%}.home-blog{padding:3.6rem 0 0;margin:0 auto}.home-blog .hero{position:relative}.home-blog .hero .mask{position:absolute;top:0;bottom:0;left:0;right:0;z-index:-1}.home-blog .hero .mask:after{display:block;content:" ";background:var(--mask-color);position:absolute;top:0;bottom:0;left:0;right:0;z-index:0;opacity:.2}.home-blog .hero figure{position:absolute;background:#ff0}.home-blog .hero h1{margin:7rem auto 1.8rem;font-size:2.5rem}.home-blog .hero .action,.home-blog .hero .description,.home-blog .hero .huawei,.home-blog .hero h1{color:#fff}.home-blog .hero .description{margin:1.8rem auto;font-size:1.6rem;line-height:1.3}.home-blog .home-blog-wrapper{display:flex;align-items:flex-start;margin:20px auto 0;max-width:1126px}.home-blog .home-blog-wrapper .blog-list{flex:auto;width:0}.home-blog .home-blog-wrapper .blog-list .abstract-wrapper .abstract-item:last-child{margin-bottom:0}.home-blog .home-blog-wrapper .info-wrapper{position:-webkit-sticky;position:sticky;top:70px;transition:all .3s;margin-left:15px;flex:0 0 300px;height:auto;box-shadow:var(--box-shadow);border-radius:.25rem;box-sizing:border-box;padding:0 15px;background:var(--background-color)}.home-blog .home-blog-wrapper .info-wrapper:hover{box-shadow:var(--box-shadow-hover)}.home-blog .home-blog-wrapper .info-wrapper h4{color:var(--text-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper{list-style:none;padding-left:0}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item{margin-bottom:.4rem;padding:.4rem .8rem;transition:all .5s;border-radius:.25rem;box-shadow:var(--box-shadow);background-color:var(--background-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item:hover{transform:scale(1.04)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item a{display:flex;justify-content:space-between}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item a .post-num{width:1.6rem;height:1.6rem;text-align:center;line-height:1.6rem;border-radius:.25rem;background:#eee;font-size:.6rem;color:#fff}@media (max-width:719px){.home-blog{padding-left:1.5rem;padding-right:1.5rem}.home-blog .hero{margin:0 -1.5rem;height:450px}.home-blog .hero img{max-height:210px;margin:2rem auto 1.2rem}.home-blog .hero h1{margin:6rem auto 1.8rem;font-size:2rem}.home-blog .hero .description{font-size:1.2rem}.home-blog .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home-blog .home-blog-wrapper .info-wrapper{display:none!important}}@media (max-width:419px){.home-blog{padding-left:1.5rem;padding-right:1.5rem}.home-blog .hero{margin:0 -1.5rem;height:350px}.home-blog .hero img{max-height:210px;margin:2rem auto 1.2rem}.home-blog .hero h1{margin:6rem auto 1.8rem;font-size:2rem}.home-blog .hero .description{font-size:1.2rem}.home-blog .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home-blog .home-blog-wrapper .info-wrapper{display:none!important}}.page-nav,.page .comments-wrapper,.page .page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav,.page .comments-wrapper,.page .page-edit{padding:2rem}}@media (max-width:419px){.page-nav,.page .comments-wrapper,.page .page-edit{padding:1.5rem}}.page{padding-top:5rem;padding-bottom:2rem;display:block}.page .page-title{max-width:740px;margin:0 auto;padding:1rem 2.5rem;color:var(--text-color)}.page .page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page .page-edit .edit-link{display:inline-block}.page .page-edit .edit-link a{color:#0074af;margin-right:.25rem}.page .page-edit .last-updated{float:right;font-size:.9em}.page .page-edit .last-updated .prefix{font-weight:500;color:#0074af}.page .page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--border-color);padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-title{padding:0 1rem}.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.navbar .logo[data-v-ae2be87e]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.footer-wrapper[data-v-ae2be87e]{padding:1.5rem 2.5rem;border-top:1px solid var(--border-color);text-align:center;color:#4e6e8e}.footer-wrapper a[data-v-ae2be87e]{font-size:14px}.footer-wrapper>span[data-v-ae2be87e]{margin-left:1rem}.footer-wrapper>span>i[data-v-ae2be87e]{margin-right:.5rem}.footer-wrapper .cyber-security img[data-v-ae2be87e]{margin-right:.5rem;width:20px;height:20px;vertical-align:middle}.footer-wrapper .cyber-security a[data-v-ae2be87e]{vertical-align:middle}@media (max-width:719px){.footer[data-v-ae2be87e]{text-align:left!important}.footer>span[data-v-ae2be87e]{display:block;margin-left:0;line-height:2rem}}.sidebar .personal-info-wrapper{display:none}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid var(--border-color);padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links,.sidebar .personal-info-wrapper{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.navbar .logo[data-v-64685f0e]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-64685f0e]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-64685f0e]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.password-shadow[data-v-64685f0e]{overflow:hidden;position:relative;background:#fff;background:var(--background-color);box-sizing:border-box}.password-shadow .title[data-v-64685f0e]{margin:8rem auto 2rem;width:100%;font-size:30px}.password-shadow .description[data-v-64685f0e],.password-shadow .title[data-v-64685f0e]{text-align:center;box-sizing:border-box;text-shadow:0 2px 4px rgba(0,0,0,.1);color:#2c3e50;color:var(--text-color)}.password-shadow .description[data-v-64685f0e]{margin:0 auto 6rem;font-size:22px;padding:0 10px}.password-shadow .inputBox[data-v-64685f0e]{position:absolute;top:40%;left:0;right:0;margin:auto;display:block;max-width:700px;height:100px;background:#0074af;border-radius:.25rem;padding-left:20px;box-sizing:border-box;opacity:.9}.password-shadow .inputBox input[data-v-64685f0e]{width:600px;height:100%;border:none;padding:0 0 0 5px;color:#fff;background:none;outline:none;position:absolute;bottom:0;left:20px;opacity:0;font-size:50px}.password-shadow .inputBox input[data-v-64685f0e]:focus{opacity:1}.password-shadow .inputBox input:focus~span[data-v-64685f0e]{transform:translateY(-80px);color:#0074af;font-size:30px;opacity:.8}.password-shadow .inputBox input:focus~button[data-v-64685f0e]{opacity:1;width:100px}.password-shadow .inputBox span[data-v-64685f0e]{width:200px;height:100%;display:block;position:absolute;line-height:100px;top:0;left:20px;color:#fff;cursor:text;transition:.5s;transform-origin:left top;font-size:30px}.password-shadow .inputBox button[data-v-64685f0e]{overflow:hidden;width:0;height:98px;border-radius:.25rem;position:absolute;background:var(--background-color);right:1px;top:1px;border:0;padding:0;color:#0074af;font-size:18px;outline:none;cursor:pointer;opacity:0;transition:.5s;z-index:1}.password-shadow .footer[data-v-64685f0e]{position:absolute;left:0;right:0;bottom:10%;padding:2.5rem;text-align:center;color:#4e6e8e}.password-shadow .footer>span[data-v-64685f0e]{margin-left:1rem}.password-shadow .footer>span>i[data-v-64685f0e]{margin-right:.5rem}@media (max-width:719px){.password-shadow .inputBox[data-v-64685f0e]{max-width:700px;height:60px;background:#0074af;border-radius:.25rem;position:absolute;left:0;right:0;top:43%;margin:auto 20px;padding-left:0;box-sizing:border-box;opacity:.9}.password-shadow .inputBox input[data-v-64685f0e]{width:60%;height:100%;border:none;padding:0 0 0 5px;color:#fff;background:none;outline:none;position:absolute;bottom:0;opacity:0;font-size:30px}.password-shadow .inputBox input[data-v-64685f0e]:focus{opacity:1}.password-shadow .inputBox input:focus~span[data-v-64685f0e]{transform:translateY(-60px);color:#0074af;font-size:20px;opacity:.8}.password-shadow .inputBox input:focus~button[data-v-64685f0e]{opacity:1;width:60px}.password-shadow .inputBox span[data-v-64685f0e]{width:200px;height:100%;display:block;position:absolute;line-height:60px;top:0;left:20px;color:#fff;cursor:text;transition:.5s;transform-origin:left top;font-size:20px}.password-shadow .inputBox button[data-v-64685f0e]{width:0;height:58px;border-radius:.25rem;position:absolute;right:1px;top:1px;border:0;padding:0;background:#fff;color:#0074af;font-size:18px;outline:none;cursor:pointer;opacity:0;transition:.5s;z-index:1}.password-shadow .footer[data-v-64685f0e]{margin-left:0}}@media (max-width:959px){.password-shadow .footer[data-v-64685f0e]{margin-left:0}}.navbar .logo[data-v-19557b78]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.theme-container .loading-wrapper[data-v-19557b78]{position:absolute;z-index:22;top:0;bottom:0;left:0;right:0;margin:auto}.theme-container .password-wrapper-out[data-v-19557b78]{position:absolute;z-index:21;top:0;bottom:0;left:0;right:0;margin:auto}.theme-container .password-wrapper-in[data-v-19557b78]{position:absolute;z-index:8;top:0;bottom:0;left:0;right:0}.theme-container .hide[data-v-19557b78]{height:100vh;overflow:hidden}.fade-enter-active[data-v-19557b78],.fade-leave-active[data-v-19557b78]{transition:opacity .5s}.fade-enter[data-v-19557b78],.fade-leave-to[data-v-19557b78]{opacity:0}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_1030519_ookn0nnv0z8.eot?t=1574737898757);src:url(//at.alicdn.com/t/font_1030519_ookn0nnv0z8.eot?t=1574737898757#iefix) format("embedded-opentype"),url("data:application/x-font-woff2;charset=utf-8;base64,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") format("woff2"),url(//at.alicdn.com/t/font_1030519_ookn0nnv0z8.woff?t=1574737898757) format("woff"),url(//at.alicdn.com/t/font_1030519_ookn0nnv0z8.ttf?t=1574737898757) format("truetype"),url(//at.alicdn.com/t/font_1030519_ookn0nnv0z8.svg?t=1574737898757#iconfont) format("svg")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reco-douban:before{content:"\e603"}.reco-wechat:before{content:"\e720"}.reco-color:before{content:"\eae9"}.reco-blog:before{content:"\e61d"}.reco-sf:before{content:"\e610"}.reco-message:before{content:"\e634"}.reco-eye:before{content:"\e669"}.reco-search:before{content:"\e611"}.reco-category:before{content:"\e61e"}.reco-npm:before{content:"\e88d"}.reco-menu:before{content:"\e67c"}.reco-suggestion:before{content:"\e608"}.reco-coding:before{content:"\e601"}.reco-github:before{content:"\e628"}.reco-mail:before{content:"\e624"}.reco-other:before{content:"\e60e"}.reco-home:before{content:"\e65b"}.reco-document:before{content:"\e67a"}.reco-huawei:before{content:"\e6b9"}.reco-up:before{content:"\e68b"}.reco-weibo:before{content:"\e612"}.reco-lock:before{content:"\e60f"}.reco-fullscreen:before{content:"\e602"}.reco-tag:before{content:"\e633"}.reco-date:before{content:"\e63b"}.reco-jianshu:before{content:"\e60c"}.reco-friend:before{content:"\e62f"}.reco-bokeyuan:before{content:"\e626"}.reco-beian:before{content:"\e667"}.reco-copyright:before{content:"\ef87"}.reco-rss:before{content:"\f09d"}.reco-bilibili:before{content:"\e630"}.reco-account:before{content:"\e607"}.reco-qq:before{content:"\e67b"}.reco-theme:before{content:"\e7e8"}.reco-three:before{content:"\e644"}.reco-gitlab:before{content:"\e63c"}.reco-api:before{content:"\e662"}.reco-mayun:before{content:"\e6d0"}.reco-zhihu:before{content:"\e605"}.reco-facebook:before{content:"\e606"}.reco-taobao:before{content:"\e6a5"}.reco-tongzhi:before{content:"\e764"}.reco-douyin:before{content:"\e654"}.reco-v2ex:before{content:"\e62a"}.reco-sticky:before{content:"\e62b"}.reco-toutiao:before{content:"\e6b7"}.reco-linkedin:before{content:"\e668"}.reco-faq:before{content:"\e643"}.reco-twitter:before{content:"\e60b"}.reco-csdn:before{content:"\e609"}.reco-juejin:before{content:"\e613"}.content{margin:4rem auto 0;max-width:800px;padding:0 2rem}.mod_404 .desc .desc_link{display:inline-block;background:#424242!important;color:#fff;padding:6px 20px!important;text-decoration:none!important;border-radius:4px}@media screen and (max-width:720px){.mod_404 .desc{margin:50px 0}.mod_404 .wrapper{margin:0!important;padding-top:20px}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.navbar .logo[data-v-e7537b8a]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-e7537b8a]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-e7537b8a]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.categories-wrapper[data-v-e7537b8a]{max-width:740px;margin:0 auto;padding:4.6rem 2.5rem 0}.categories-wrapper .category-wrapper[data-v-e7537b8a]{list-style:none;padding-left:0}.categories-wrapper .category-wrapper .category-item[data-v-e7537b8a]{vertical-align:middle;margin:4px 8px 10px;display:inline-block;cursor:pointer;border-radius:.25rem;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s;background-color:var(--background-color)}.categories-wrapper .category-wrapper .category-item.active[data-v-e7537b8a],.categories-wrapper .category-wrapper .category-item[data-v-e7537b8a]:hover{background:#0074af}.categories-wrapper .category-wrapper .category-item.active a span.category-name[data-v-e7537b8a],.categories-wrapper .category-wrapper .category-item:hover a span.category-name[data-v-e7537b8a]{color:#fff}.categories-wrapper .category-wrapper .category-item.active a span.category-name .post-num[data-v-e7537b8a],.categories-wrapper .category-wrapper .category-item:hover a span.category-name .post-num[data-v-e7537b8a]{color:#0074af}.categories-wrapper .category-wrapper .category-item a[data-v-e7537b8a]{display:flex;box-sizing:border-box;width:100%;height:100%;padding:8px 14px;justify-content:space-between;align-items:center;color:#666}.categories-wrapper .category-wrapper .category-item a .post-num[data-v-e7537b8a]{margin-left:4px;width:1.2rem;height:1.2rem;text-align:center;line-height:1.2rem;border-radius:.25rem;font-size:.7rem;color:#fff}@media (max-width:719px){.categories-wrapper[data-v-e7537b8a]{padding:4.6rem 1rem 0}.page-edit .edit-link[data-v-e7537b8a]{margin-bottom:.5rem}.page-edit .last-updated[data-v-e7537b8a]{font-size:.8em;float:none;text-align:left}}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.content__default code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--code-color);border-radius:3px}.content__default code .token.deleted{color:#ec5975}.content__default code .token.inserted{color:#0074af}.content__default pre,.content__default pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content__default pre[class*=language-] code,.content__default pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:2.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:3.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:2.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:2.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:var(--code-color);border-color:#67cc86}.custom-block.tip .custom-block-title{color:#67cc86}.custom-block.warning{background-color:var(--code-color);border-color:#fb9b5f}.custom-block.warning .custom-block-title{color:#fb9b5f}.custom-block.danger{background-color:var(--code-color);border-color:#f26d6d}.custom-block.danger .custom-block-title{color:#f26d6d}.custom-block.right{color:rgba(0,0,0,.4);font-size:.9rem;text-align:right}.custom-block.theorem{margin:1rem 0;padding:.1rem 1.5rem;border-radius:.4rem;background-color:var(--code-color)}.custom-block.theorem .title{font-weight:700}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1em 0;padding:1rem;background-color:var(--code-color)}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid var(--text-color-sub)}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid var(--text-color-sub)}.arrow.right{border-left:6px solid var(--text-color-sub)}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid var(--text-color-sub)}.content__default:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content__default:not(.custom){padding:2rem}}@media (max-width:419px){.content__default:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:15px;color:var(--text-color);background-color:var(--background-color)}.page,.password-wrapper-in{overflow-x:hidden;margin-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;box-sizing:border-box}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none;background-color:rgba(0,0,0,.65)}.sidebar{font-size:16px;background-color:var(--background-color);width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--border-color);overflow-y:auto}.content__default:not(.custom) a:hover{text-decoration:underline}.content__default:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content__default:not(.custom) img{max-width:100%}.content__default.custom{padding:0;margin:0}.content__default.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#0074af}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:.9rem;color:#999;border-left:.25rem solid #999;background-color:var(--code-color);margin:.5rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.25}.content__default:not(.custom)>h1,.content__default:not(.custom)>h2,.content__default:not(.custom)>h3,.content__default:not(.custom)>h4,.content__default:not(.custom)>h5,.content__default:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.content__default:not(.custom)>h1:first-child,.content__default:not(.custom)>h2:first-child,.content__default:not(.custom)>h3:first-child,.content__default:not(.custom)>h4:first-child,.content__default:not(.custom)>h5:first-child,.content__default:not(.custom)>h6:first-child{margin-top:-3.5rem;margin-bottom:1rem}.content__default:not(.custom)>h1:first-child+.custom-block,.content__default:not(.custom)>h1:first-child+p,.content__default:not(.custom)>h1:first-child+pre,.content__default:not(.custom)>h2:first-child+.custom-block,.content__default:not(.custom)>h2:first-child+p,.content__default:not(.custom)>h2:first-child+pre,.content__default:not(.custom)>h3:first-child+.custom-block,.content__default:not(.custom)>h3:first-child+p,.content__default:not(.custom)>h3:first-child+pre,.content__default:not(.custom)>h4:first-child+.custom-block,.content__default:not(.custom)>h4:first-child+p,.content__default:not(.custom)>h4:first-child+pre,.content__default:not(.custom)>h5:first-child+.custom-block,.content__default:not(.custom)>h5:first-child+p,.content__default:not(.custom)>h5:first-child+pre,.content__default:not(.custom)>h6:first-child+.custom-block,.content__default:not(.custom)>h6:first-child+p,.content__default:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:1.6rem}h2{font-size:1.4rem;padding-bottom:.3rem;border-bottom:1px solid var(--border-color)}h3{font-size:1.2rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid var(--border-color)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid var(--border-color)}tr:nth-child(2n){background-color:var(--code-color)}td,th{border:1px solid var(--border-color);padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content__default:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page,.theme-container.no-sidebar .password-wrapper-in{margin-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page,.password-wrapper-in{margin-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page,.password-wrapper-in{margin-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}.password-shadow{padding-left:0}}@media (max-width:419px){h1{font-size:1.9rem}.content__default div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.iconfont{font-size:.9rem;color:var(--text-color-sub)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb:vertical{height:5px;background-color:#0074af}::-webkit-scrollbar-thumb:horizontal{width:5px;background-color:#0074af}.vuepress-flowchart{overflow:auto}.sw-update-popup{border-radius:.25rem!important;box-shadow:var(--box-shadow)!important;color:var(--text-color)!important;background:var(--background-color)!important;border:none!important}.sw-update-popup>button{background:#0074af;border-radius:.25rem;color:#fff;-webkit-tap-highlight-color:rgba(0,0,0,0);border:none}.navbar .logo[data-v-7984cb6f]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}[data-v-7984cb6f]:root{--default-color-10:#fff;--default-color-9:hsla(0,0%,100%,0.9);--default-color-8:hsla(0,0%,100%,0.8);--default-color-7:hsla(0,0%,100%,0.7);--default-color-6:hsla(0,0%,100%,0.6);--default-color-5:hsla(0,0%,100%,0.5);--default-color-4:hsla(0,0%,100%,0.4);--default-color-3:hsla(0,0%,100%,0.3);--default-color-2:hsla(0,0%,100%,0.2);--default-color-1:hsla(0,0%,100%,0.1);--background-color:#fff;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.2);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.2);--text-color:#2c3e50;--text-color-sub:#7f7f7f;--border-color:#eaecef;--code-color:rgba(27,31,35,0.05);--mask-color:#888}@media (prefers-color-scheme:dark){[data-v-7984cb6f]:root{--default-color-10:#000;--default-color-9:rgba(0,0,0,0.9);--default-color-8:rgba(0,0,0,0.8);--default-color-7:rgba(0,0,0,0.7);--default-color-6:rgba(0,0,0,0.6);--default-color-5:rgba(0,0,0,0.5);--default-color-4:rgba(0,0,0,0.4);--default-color-3:rgba(0,0,0,0.3);--default-color-2:rgba(0,0,0,0.2);--default-color-1:rgba(0,0,0,0.1);--background-color:#181818;--box-shadow:0 1px 6px 0 rgba(0,0,0,0.6);--box-shadow-hover:0 2px 16px 0 rgba(0,0,0,0.6);--text-color:hsla(0,0%,100%,0.8);--text-color-sub:#8b8b8b;--border-color:rgba(0,0,0,0.3);--code-color:rgba(0,0,0,0.3);--mask-color:#000}}.tag-wrapper[data-v-7984cb6f]{max-width:740px;margin:0 auto;padding:4.6rem 2.5rem 0}@media (max-width:719px){.tag-wrapper[data-v-7984cb6f]{padding:4.6rem 1rem 0}}.navbar .logo[data-v-31ab3906]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.tags-wrapper[data-v-31ab3906]{max-width:740px;margin:0 auto;padding:4.6rem 2.5rem 0}@media (max-width:719px){.tags-wrapper[data-v-31ab3906]{padding:5rem .6rem 0}}.navbar .logo[data-v-8590c612]{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:0}.timeline-wrapper[data-v-8590c612]{max-width:740px;margin:0 auto;padding:4.6rem 2.5rem 0}.timeline-wrapper .timeline-content[data-v-8590c612]{box-sizing:border-box;position:relative;list-style:none}.timeline-wrapper .timeline-content[data-v-8590c612]:after{content:" ";position:absolute;top:14px;left:0;z-index:-1;margin-left:-2px;width:4px;height:100%;background:var(--border-color)}.timeline-wrapper .timeline-content .desc[data-v-8590c612],.timeline-wrapper .timeline-content .year[data-v-8590c612]{position:relative;color:var(--text-color);font-size:16px}.timeline-wrapper .timeline-content .desc[data-v-8590c612]:before,.timeline-wrapper .timeline-content .year[data-v-8590c612]:before{content:" ";position:absolute;z-index:2;left:-20px;top:50%;margin-left:-4px;margin-top:-4px;width:8px;height:8px;background:var(--background-color);border:1px solid var(--border-color);border-radius:50%}.timeline-wrapper .timeline-content .year[data-v-8590c612]{margin:80px 0 0;color:var(--text-color);font-weight:700;font-size:26px}.timeline-wrapper .timeline-content .year-wrapper[data-v-8590c612]{padding-left:0!important}.timeline-wrapper .timeline-content .year-wrapper li[data-v-8590c612]{display:flex;padding:30px 0 10px;list-style:none;border-bottom:1px dashed var(--border-color);position:relative}.timeline-wrapper .timeline-content .year-wrapper li:hover .date[data-v-8590c612]{color:#0074af}.timeline-wrapper .timeline-content .year-wrapper li:hover .date[data-v-8590c612]:before{background:#0074af}.timeline-wrapper .timeline-content .year-wrapper li:hover .title[data-v-8590c612]{color:#0074af}.timeline-wrapper .timeline-content .year-wrapper li .date[data-v-8590c612]{width:40px;line-height:30px;color:var(--text-color-sub);font-size:12px}.timeline-wrapper .timeline-content .year-wrapper li .date[data-v-8590c612]:before{content:" ";position:absolute;left:-19px;top:41px;width:6px;height:6px;margin-left:-4px;background:var(--background-color);border-radius:50%;border:1px solid var(--border-color);z-index:2}.timeline-wrapper .timeline-content .year-wrapper li .title[data-v-8590c612]{line-height:30px;color:var(--text-color-sub);font-size:16px;cursor:pointer}@media (max-width:719px){.timeline-wrapper[data-v-8590c612]{margin:0 1.2rem}} \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/img/1.01bdd0e0.jpg b/learning/.vuepress/dist/assets/img/1.01bdd0e0.jpg deleted file mode 100644 index 8b38d5e3..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.01bdd0e0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.03e01a60.jpg b/learning/.vuepress/dist/assets/img/1.03e01a60.jpg deleted file mode 100644 index c2a8f8f2..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.03e01a60.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.048fe315.jpg b/learning/.vuepress/dist/assets/img/1.048fe315.jpg deleted file mode 100644 index 138432d6..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.048fe315.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.04bdda04.png b/learning/.vuepress/dist/assets/img/1.04bdda04.png deleted file mode 100644 index da859a9f..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.04bdda04.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.0507c071.jpg b/learning/.vuepress/dist/assets/img/1.0507c071.jpg deleted file mode 100644 index 3f8be3f2..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.0507c071.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.057d45eb.jpg b/learning/.vuepress/dist/assets/img/1.057d45eb.jpg deleted file mode 100644 index f96263c2..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.057d45eb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.0690e47c.jpg b/learning/.vuepress/dist/assets/img/1.0690e47c.jpg deleted file mode 100644 index f0366b31..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.0690e47c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.1605b951.jpg b/learning/.vuepress/dist/assets/img/1.1605b951.jpg deleted file mode 100644 index f193abe7..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.1605b951.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.167e9c39.jpg b/learning/.vuepress/dist/assets/img/1.167e9c39.jpg deleted file mode 100644 index 845766ef..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.167e9c39.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.18f4e142.jpg b/learning/.vuepress/dist/assets/img/1.18f4e142.jpg deleted file mode 100644 index a62f8bca..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.18f4e142.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.1ad4dbe0.jpg b/learning/.vuepress/dist/assets/img/1.1ad4dbe0.jpg deleted file mode 100644 index 6efd8e56..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.1ad4dbe0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.1afc39f1.png b/learning/.vuepress/dist/assets/img/1.1afc39f1.png deleted file mode 100644 index 945c206e..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.1afc39f1.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.1fdf7c8b.jpg b/learning/.vuepress/dist/assets/img/1.1fdf7c8b.jpg deleted file mode 100644 index ce451f3f..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.1fdf7c8b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.21ffa5ba.jpg b/learning/.vuepress/dist/assets/img/1.21ffa5ba.jpg deleted file mode 100644 index 41ca46af..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.21ffa5ba.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.26128aab.jpg b/learning/.vuepress/dist/assets/img/1.26128aab.jpg deleted file mode 100644 index f8d478a6..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.26128aab.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.277dc868.jpg b/learning/.vuepress/dist/assets/img/1.277dc868.jpg deleted file mode 100644 index b5e051f7..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.277dc868.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.2c7f8b37.gif b/learning/.vuepress/dist/assets/img/1.2c7f8b37.gif deleted file mode 100644 index 0bae8e03..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.2c7f8b37.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.309ccfa3.gif b/learning/.vuepress/dist/assets/img/1.309ccfa3.gif deleted file mode 100644 index c481c242..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.309ccfa3.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.3cb2cf78.jpg b/learning/.vuepress/dist/assets/img/1.3cb2cf78.jpg deleted file mode 100644 index aa0fb89d..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.3cb2cf78.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.458698c8.jpg b/learning/.vuepress/dist/assets/img/1.458698c8.jpg deleted file mode 100644 index e5a887ff..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.458698c8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.4875b097.jpg b/learning/.vuepress/dist/assets/img/1.4875b097.jpg deleted file mode 100644 index 2bcdaef7..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.4875b097.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.4a84211e.jpg b/learning/.vuepress/dist/assets/img/1.4a84211e.jpg deleted file mode 100644 index 46b98652..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.4a84211e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.5118c910.gif b/learning/.vuepress/dist/assets/img/1.5118c910.gif deleted file mode 100644 index 4ab62695..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.5118c910.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.57963985.jpg b/learning/.vuepress/dist/assets/img/1.57963985.jpg deleted file mode 100644 index 6085f015..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.57963985.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.58ab1a31.png b/learning/.vuepress/dist/assets/img/1.58ab1a31.png deleted file mode 100644 index 55f7571e..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.58ab1a31.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.5b25afb3.jpg b/learning/.vuepress/dist/assets/img/1.5b25afb3.jpg deleted file mode 100644 index 217d4492..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.5b25afb3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.5ce7b4a9.jpg b/learning/.vuepress/dist/assets/img/1.5ce7b4a9.jpg deleted file mode 100644 index 976079a5..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.5ce7b4a9.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.5d3b351e.jpg b/learning/.vuepress/dist/assets/img/1.5d3b351e.jpg deleted file mode 100644 index 8d5ed526..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.5d3b351e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.651abd82.jpg b/learning/.vuepress/dist/assets/img/1.651abd82.jpg deleted file mode 100644 index b8a23a2c..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.651abd82.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.6b32d5f0.jpg b/learning/.vuepress/dist/assets/img/1.6b32d5f0.jpg deleted file mode 100644 index 5860d330..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.6b32d5f0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.6f166662.jpg b/learning/.vuepress/dist/assets/img/1.6f166662.jpg deleted file mode 100644 index b1b52487..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.6f166662.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.71519116.jpg b/learning/.vuepress/dist/assets/img/1.71519116.jpg deleted file mode 100644 index 2c312338..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.71519116.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.7628e6d5.jpg b/learning/.vuepress/dist/assets/img/1.7628e6d5.jpg deleted file mode 100644 index 9a5dd93c..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.7628e6d5.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.77d1279c.jpg b/learning/.vuepress/dist/assets/img/1.77d1279c.jpg deleted file mode 100644 index edc89320..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.77d1279c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.78783a70.jpg b/learning/.vuepress/dist/assets/img/1.78783a70.jpg deleted file mode 100644 index 5f42d4c8..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.78783a70.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.7a0a4d35.jpg b/learning/.vuepress/dist/assets/img/1.7a0a4d35.jpg deleted file mode 100644 index 422bfc6f..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.7a0a4d35.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.7c9cc0a7.png b/learning/.vuepress/dist/assets/img/1.7c9cc0a7.png deleted file mode 100644 index 9d45397d..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.7c9cc0a7.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.7d598a13.jpg b/learning/.vuepress/dist/assets/img/1.7d598a13.jpg deleted file mode 100644 index 7bcb1f99..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.7d598a13.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.81971505.jpg b/learning/.vuepress/dist/assets/img/1.81971505.jpg deleted file mode 100644 index 28bfac19..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.81971505.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.84a19499.jpg b/learning/.vuepress/dist/assets/img/1.84a19499.jpg deleted file mode 100644 index b784c015..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.84a19499.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.85b7a011.jpg b/learning/.vuepress/dist/assets/img/1.85b7a011.jpg deleted file mode 100644 index 68f3269f..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.85b7a011.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.88792000.jpg b/learning/.vuepress/dist/assets/img/1.88792000.jpg deleted file mode 100644 index 3878fadd..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.88792000.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.910339d0.jpg b/learning/.vuepress/dist/assets/img/1.910339d0.jpg deleted file mode 100644 index 39c8566f..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.910339d0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.a1d47533.jpg b/learning/.vuepress/dist/assets/img/1.a1d47533.jpg deleted file mode 100644 index 71e89575..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.a1d47533.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.a3360867.jpg b/learning/.vuepress/dist/assets/img/1.a3360867.jpg deleted file mode 100644 index 34937480..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.a3360867.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.adc871d9.jpg b/learning/.vuepress/dist/assets/img/1.adc871d9.jpg deleted file mode 100644 index c96e9940..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.adc871d9.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.baeb33a7.jpg b/learning/.vuepress/dist/assets/img/1.baeb33a7.jpg deleted file mode 100644 index d1a4e76c..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.baeb33a7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.be7ce0b0.jpg b/learning/.vuepress/dist/assets/img/1.be7ce0b0.jpg deleted file mode 100644 index c92a1d51..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.be7ce0b0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.c0e67383.png b/learning/.vuepress/dist/assets/img/1.c0e67383.png deleted file mode 100644 index 61c82c35..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.c0e67383.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.c1a9953b.jpg b/learning/.vuepress/dist/assets/img/1.c1a9953b.jpg deleted file mode 100644 index f82d2c4d..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.c1a9953b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.c6534889.jpg b/learning/.vuepress/dist/assets/img/1.c6534889.jpg deleted file mode 100644 index 709cf433..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.c6534889.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.c67a662e.png b/learning/.vuepress/dist/assets/img/1.c67a662e.png deleted file mode 100644 index 10402e12..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.c67a662e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.c8aefc09.gif b/learning/.vuepress/dist/assets/img/1.c8aefc09.gif deleted file mode 100644 index b3379672..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.c8aefc09.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.ca86a52f.png b/learning/.vuepress/dist/assets/img/1.ca86a52f.png deleted file mode 100644 index 356397ea..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.ca86a52f.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.d0382e2a.jpg b/learning/.vuepress/dist/assets/img/1.d0382e2a.jpg deleted file mode 100644 index 8e154042..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.d0382e2a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.d12167e7.jpg b/learning/.vuepress/dist/assets/img/1.d12167e7.jpg deleted file mode 100644 index b6ded2f1..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.d12167e7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.d58fcd9b.jpg b/learning/.vuepress/dist/assets/img/1.d58fcd9b.jpg deleted file mode 100644 index 1ec9f5ea..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.d58fcd9b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.d68e1fd6.jpg b/learning/.vuepress/dist/assets/img/1.d68e1fd6.jpg deleted file mode 100644 index c183b160..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.d68e1fd6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.d9839c79.jpg b/learning/.vuepress/dist/assets/img/1.d9839c79.jpg deleted file mode 100644 index 5652498d..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.d9839c79.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.dccce91b.jpg b/learning/.vuepress/dist/assets/img/1.dccce91b.jpg deleted file mode 100644 index 2c06c4f7..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.dccce91b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.df8eb526.jpg b/learning/.vuepress/dist/assets/img/1.df8eb526.jpg deleted file mode 100644 index 2a9867cd..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.df8eb526.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.e3a1f41f.gif b/learning/.vuepress/dist/assets/img/1.e3a1f41f.gif deleted file mode 100644 index f29e0232..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.e3a1f41f.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.e443c271.jpg b/learning/.vuepress/dist/assets/img/1.e443c271.jpg deleted file mode 100644 index 0f596e3e..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.e443c271.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.e6629cc3.jpg b/learning/.vuepress/dist/assets/img/1.e6629cc3.jpg deleted file mode 100644 index c970f092..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.e6629cc3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.e921e02f.jpg b/learning/.vuepress/dist/assets/img/1.e921e02f.jpg deleted file mode 100644 index a31190c7..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.e921e02f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.e9ab843e.png b/learning/.vuepress/dist/assets/img/1.e9ab843e.png deleted file mode 100644 index 76008243..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.e9ab843e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f0787d40.gif b/learning/.vuepress/dist/assets/img/1.f0787d40.gif deleted file mode 100644 index 22eea653..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f0787d40.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f2fa777d.jpg b/learning/.vuepress/dist/assets/img/1.f2fa777d.jpg deleted file mode 100644 index afcbaa8f..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f2fa777d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f32a0445.jpg b/learning/.vuepress/dist/assets/img/1.f32a0445.jpg deleted file mode 100644 index 0cc592b4..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f32a0445.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f3588f7c.jpg b/learning/.vuepress/dist/assets/img/1.f3588f7c.jpg deleted file mode 100644 index 9015652e..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f3588f7c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f441ca2d.jpg b/learning/.vuepress/dist/assets/img/1.f441ca2d.jpg deleted file mode 100644 index d358abd5..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f441ca2d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f5c13fd2.jpg b/learning/.vuepress/dist/assets/img/1.f5c13fd2.jpg deleted file mode 100644 index 95375f71..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f5c13fd2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f680c845.jpg b/learning/.vuepress/dist/assets/img/1.f680c845.jpg deleted file mode 100644 index 55ad9af8..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f680c845.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.f9b4ce18.jpg b/learning/.vuepress/dist/assets/img/1.f9b4ce18.jpg deleted file mode 100644 index c4d610bd..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.f9b4ce18.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.fae9c798.gif b/learning/.vuepress/dist/assets/img/1.fae9c798.gif deleted file mode 100644 index ce23f4f6..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.fae9c798.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/1.fee741e6.jpg b/learning/.vuepress/dist/assets/img/1.fee741e6.jpg deleted file mode 100644 index aa5ea146..00000000 Binary files a/learning/.vuepress/dist/assets/img/1.fee741e6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.063d52f8.jpg b/learning/.vuepress/dist/assets/img/10.063d52f8.jpg deleted file mode 100644 index 5f411cec..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.063d52f8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.170a7f3c.gif b/learning/.vuepress/dist/assets/img/10.170a7f3c.gif deleted file mode 100644 index c6742a7e..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.170a7f3c.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.1e64ecfb.jpg b/learning/.vuepress/dist/assets/img/10.1e64ecfb.jpg deleted file mode 100644 index be95ab15..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.1e64ecfb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.4c4c11dd.jpg b/learning/.vuepress/dist/assets/img/10.4c4c11dd.jpg deleted file mode 100644 index f29fc513..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.4c4c11dd.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.636058c2.jpg b/learning/.vuepress/dist/assets/img/10.636058c2.jpg deleted file mode 100644 index 3d23366f..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.636058c2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.75d5930d.jpg b/learning/.vuepress/dist/assets/img/10.75d5930d.jpg deleted file mode 100644 index 6b9dfdc1..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.75d5930d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.7645bc40.jpg b/learning/.vuepress/dist/assets/img/10.7645bc40.jpg deleted file mode 100644 index 0fa478ab..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.7645bc40.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.b01bb056.jpeg b/learning/.vuepress/dist/assets/img/10.b01bb056.jpeg deleted file mode 100644 index f48b8b94..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.b01bb056.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.b3a11a41.jpg b/learning/.vuepress/dist/assets/img/10.b3a11a41.jpg deleted file mode 100644 index 7cbc23a1..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.b3a11a41.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.be8b0242.jpg b/learning/.vuepress/dist/assets/img/10.be8b0242.jpg deleted file mode 100644 index 453449b3..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.be8b0242.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.cc9e7651.jpg b/learning/.vuepress/dist/assets/img/10.cc9e7651.jpg deleted file mode 100644 index 98aa8634..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.cc9e7651.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/10.f6fd1f71.jpg b/learning/.vuepress/dist/assets/img/10.f6fd1f71.jpg deleted file mode 100644 index cda65c2b..00000000 Binary files a/learning/.vuepress/dist/assets/img/10.f6fd1f71.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.02c892eb.jpg b/learning/.vuepress/dist/assets/img/11.02c892eb.jpg deleted file mode 100644 index 099c315a..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.02c892eb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.1ae1fab1.jpg b/learning/.vuepress/dist/assets/img/11.1ae1fab1.jpg deleted file mode 100644 index 7956b46c..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.1ae1fab1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.21270f34.jpg b/learning/.vuepress/dist/assets/img/11.21270f34.jpg deleted file mode 100644 index 609af413..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.21270f34.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.62c59617.jpeg b/learning/.vuepress/dist/assets/img/11.62c59617.jpeg deleted file mode 100644 index 08fb8ddf..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.62c59617.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.764c6ff1.jpg b/learning/.vuepress/dist/assets/img/11.764c6ff1.jpg deleted file mode 100644 index 8d73766f..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.764c6ff1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.b3b5c2b3.jpg b/learning/.vuepress/dist/assets/img/11.b3b5c2b3.jpg deleted file mode 100644 index 83c9f3cc..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.b3b5c2b3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.b8f438c1.jpg b/learning/.vuepress/dist/assets/img/11.b8f438c1.jpg deleted file mode 100644 index a6508f8e..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.b8f438c1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.ec2b1f7f.jpg b/learning/.vuepress/dist/assets/img/11.ec2b1f7f.jpg deleted file mode 100644 index 4ef1a988..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.ec2b1f7f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/11.fda608bf.jpg b/learning/.vuepress/dist/assets/img/11.fda608bf.jpg deleted file mode 100644 index 976aa822..00000000 Binary files a/learning/.vuepress/dist/assets/img/11.fda608bf.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.0cec972f.jpg b/learning/.vuepress/dist/assets/img/12.0cec972f.jpg deleted file mode 100644 index 70839b28..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.0cec972f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.0f33a19f.jpg b/learning/.vuepress/dist/assets/img/12.0f33a19f.jpg deleted file mode 100644 index 89d55917..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.0f33a19f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.35e54239.jpg b/learning/.vuepress/dist/assets/img/12.35e54239.jpg deleted file mode 100644 index 2493e472..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.35e54239.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.5a12e850.jpg b/learning/.vuepress/dist/assets/img/12.5a12e850.jpg deleted file mode 100644 index 986f122c..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.5a12e850.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.8e7f1b16.jpg b/learning/.vuepress/dist/assets/img/12.8e7f1b16.jpg deleted file mode 100644 index 5db00ed6..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.8e7f1b16.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.a3ded824.jpeg b/learning/.vuepress/dist/assets/img/12.a3ded824.jpeg deleted file mode 100644 index 0db49e3e..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.a3ded824.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.af85a7e4.jpg b/learning/.vuepress/dist/assets/img/12.af85a7e4.jpg deleted file mode 100644 index a65bc562..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.af85a7e4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.b9283517.jpeg b/learning/.vuepress/dist/assets/img/12.b9283517.jpeg deleted file mode 100644 index 5f37ea5b..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.b9283517.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/12.db457c21.gif b/learning/.vuepress/dist/assets/img/12.db457c21.gif deleted file mode 100644 index cf349b1d..00000000 Binary files a/learning/.vuepress/dist/assets/img/12.db457c21.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/13.4a93ccb0.jpg b/learning/.vuepress/dist/assets/img/13.4a93ccb0.jpg deleted file mode 100644 index 0a0c8bf9..00000000 Binary files a/learning/.vuepress/dist/assets/img/13.4a93ccb0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/13.7a6723fa.jpg b/learning/.vuepress/dist/assets/img/13.7a6723fa.jpg deleted file mode 100644 index 1d316179..00000000 Binary files a/learning/.vuepress/dist/assets/img/13.7a6723fa.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/13.84c20ce8.jpg b/learning/.vuepress/dist/assets/img/13.84c20ce8.jpg deleted file mode 100644 index afc59917..00000000 Binary files a/learning/.vuepress/dist/assets/img/13.84c20ce8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/13.b47b0563.jpg b/learning/.vuepress/dist/assets/img/13.b47b0563.jpg deleted file mode 100644 index a28d9060..00000000 Binary files a/learning/.vuepress/dist/assets/img/13.b47b0563.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/13.cc3506e4.gif b/learning/.vuepress/dist/assets/img/13.cc3506e4.gif deleted file mode 100644 index cdf43fcc..00000000 Binary files a/learning/.vuepress/dist/assets/img/13.cc3506e4.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/13.e94b5ec0.jpg b/learning/.vuepress/dist/assets/img/13.e94b5ec0.jpg deleted file mode 100644 index a0793a24..00000000 Binary files a/learning/.vuepress/dist/assets/img/13.e94b5ec0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/14.18d289c2.jpg b/learning/.vuepress/dist/assets/img/14.18d289c2.jpg deleted file mode 100644 index 939d4167..00000000 Binary files a/learning/.vuepress/dist/assets/img/14.18d289c2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/14.6369e786.jpg b/learning/.vuepress/dist/assets/img/14.6369e786.jpg deleted file mode 100644 index 3f100251..00000000 Binary files a/learning/.vuepress/dist/assets/img/14.6369e786.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/14.6eb82e3c.jpg b/learning/.vuepress/dist/assets/img/14.6eb82e3c.jpg deleted file mode 100644 index c1cdfd52..00000000 Binary files a/learning/.vuepress/dist/assets/img/14.6eb82e3c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/14.79bfef1d.jpg b/learning/.vuepress/dist/assets/img/14.79bfef1d.jpg deleted file mode 100644 index b8871ac8..00000000 Binary files a/learning/.vuepress/dist/assets/img/14.79bfef1d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/15.161e5f96.jpg b/learning/.vuepress/dist/assets/img/15.161e5f96.jpg deleted file mode 100644 index b4f94922..00000000 Binary files a/learning/.vuepress/dist/assets/img/15.161e5f96.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/15.9c3af63a.jpg b/learning/.vuepress/dist/assets/img/15.9c3af63a.jpg deleted file mode 100644 index ddc1f71b..00000000 Binary files a/learning/.vuepress/dist/assets/img/15.9c3af63a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/15.b59c6be6.jpg b/learning/.vuepress/dist/assets/img/15.b59c6be6.jpg deleted file mode 100644 index 1b7c7ffb..00000000 Binary files a/learning/.vuepress/dist/assets/img/15.b59c6be6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/15.e8fcfbb5.jpg b/learning/.vuepress/dist/assets/img/15.e8fcfbb5.jpg deleted file mode 100644 index a9c89bda..00000000 Binary files a/learning/.vuepress/dist/assets/img/15.e8fcfbb5.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/16.30313cbf.jpg b/learning/.vuepress/dist/assets/img/16.30313cbf.jpg deleted file mode 100644 index ed2837ca..00000000 Binary files a/learning/.vuepress/dist/assets/img/16.30313cbf.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/16.da98407a.jpg b/learning/.vuepress/dist/assets/img/16.da98407a.jpg deleted file mode 100644 index b36166a2..00000000 Binary files a/learning/.vuepress/dist/assets/img/16.da98407a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/16.e723d28e.jpg b/learning/.vuepress/dist/assets/img/16.e723d28e.jpg deleted file mode 100644 index 24425dca..00000000 Binary files a/learning/.vuepress/dist/assets/img/16.e723d28e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/17.45ce22f3.jpg b/learning/.vuepress/dist/assets/img/17.45ce22f3.jpg deleted file mode 100644 index 256099b1..00000000 Binary files a/learning/.vuepress/dist/assets/img/17.45ce22f3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/17.6750d734.jpg b/learning/.vuepress/dist/assets/img/17.6750d734.jpg deleted file mode 100644 index 28e7d8d6..00000000 Binary files a/learning/.vuepress/dist/assets/img/17.6750d734.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/17.8417ebd0.jpg b/learning/.vuepress/dist/assets/img/17.8417ebd0.jpg deleted file mode 100644 index 91146ee6..00000000 Binary files a/learning/.vuepress/dist/assets/img/17.8417ebd0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/18.4a63b81e.jpg b/learning/.vuepress/dist/assets/img/18.4a63b81e.jpg deleted file mode 100644 index 73e69781..00000000 Binary files a/learning/.vuepress/dist/assets/img/18.4a63b81e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/18.955ef13b.jpg b/learning/.vuepress/dist/assets/img/18.955ef13b.jpg deleted file mode 100644 index eb7dda94..00000000 Binary files a/learning/.vuepress/dist/assets/img/18.955ef13b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/19.99629451.jpg b/learning/.vuepress/dist/assets/img/19.99629451.jpg deleted file mode 100644 index 3f50beaa..00000000 Binary files a/learning/.vuepress/dist/assets/img/19.99629451.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.07279503.jpeg b/learning/.vuepress/dist/assets/img/2.07279503.jpeg deleted file mode 100644 index f5d938dc..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.07279503.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.15ab51a5.jpg b/learning/.vuepress/dist/assets/img/2.15ab51a5.jpg deleted file mode 100644 index d947d9c1..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.15ab51a5.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.1d7ed267.jpg b/learning/.vuepress/dist/assets/img/2.1d7ed267.jpg deleted file mode 100644 index c95549f6..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.1d7ed267.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.20c68c2c.jpg b/learning/.vuepress/dist/assets/img/2.20c68c2c.jpg deleted file mode 100644 index 4ceb6954..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.20c68c2c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.21e27729.jpg b/learning/.vuepress/dist/assets/img/2.21e27729.jpg deleted file mode 100644 index e0a574d8..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.21e27729.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.2441502e.png b/learning/.vuepress/dist/assets/img/2.2441502e.png deleted file mode 100644 index f36d8a49..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.2441502e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.2ea69152.jpg b/learning/.vuepress/dist/assets/img/2.2ea69152.jpg deleted file mode 100644 index 8da8f340..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.2ea69152.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.35fc1054.jpg b/learning/.vuepress/dist/assets/img/2.35fc1054.jpg deleted file mode 100644 index d8a11e04..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.35fc1054.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.394d94e3.jpg b/learning/.vuepress/dist/assets/img/2.394d94e3.jpg deleted file mode 100644 index 97af01ad..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.394d94e3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.3bd5679a.jpg b/learning/.vuepress/dist/assets/img/2.3bd5679a.jpg deleted file mode 100644 index 39d19bef..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.3bd5679a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.3e1b3fee.jpg b/learning/.vuepress/dist/assets/img/2.3e1b3fee.jpg deleted file mode 100644 index 6372b159..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.3e1b3fee.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.3fcd5ea8.jpg b/learning/.vuepress/dist/assets/img/2.3fcd5ea8.jpg deleted file mode 100644 index 035a1acb..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.3fcd5ea8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.4349c876.jpg b/learning/.vuepress/dist/assets/img/2.4349c876.jpg deleted file mode 100644 index 2814ba43..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.4349c876.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.44c23f2f.png b/learning/.vuepress/dist/assets/img/2.44c23f2f.png deleted file mode 100644 index 042887e0..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.44c23f2f.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.48a1792a.jpg b/learning/.vuepress/dist/assets/img/2.48a1792a.jpg deleted file mode 100644 index 352503d1..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.48a1792a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.4a60b533.jpg b/learning/.vuepress/dist/assets/img/2.4a60b533.jpg deleted file mode 100644 index e167a5d2..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.4a60b533.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.55e8dff6.jpg b/learning/.vuepress/dist/assets/img/2.55e8dff6.jpg deleted file mode 100644 index 449375b7..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.55e8dff6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.583ba8c5.png b/learning/.vuepress/dist/assets/img/2.583ba8c5.png deleted file mode 100644 index 63f1cfe8..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.583ba8c5.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.58e28193.png b/learning/.vuepress/dist/assets/img/2.58e28193.png deleted file mode 100644 index 53c5b9dc..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.58e28193.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.5a2adb1f.jpg b/learning/.vuepress/dist/assets/img/2.5a2adb1f.jpg deleted file mode 100644 index 94eae76a..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.5a2adb1f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.5e72397e.jpg b/learning/.vuepress/dist/assets/img/2.5e72397e.jpg deleted file mode 100644 index 07103f69..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.5e72397e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.5e908ad4.jpg b/learning/.vuepress/dist/assets/img/2.5e908ad4.jpg deleted file mode 100644 index 3bbc3e53..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.5e908ad4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.652e2a32.gif b/learning/.vuepress/dist/assets/img/2.652e2a32.gif deleted file mode 100644 index f6f5ad72..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.652e2a32.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.6915c926.png b/learning/.vuepress/dist/assets/img/2.6915c926.png deleted file mode 100644 index d86cfd57..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.6915c926.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.6ab27c2d.png b/learning/.vuepress/dist/assets/img/2.6ab27c2d.png deleted file mode 100644 index 44706d61..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.6ab27c2d.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.6c7de304.jpeg b/learning/.vuepress/dist/assets/img/2.6c7de304.jpeg deleted file mode 100644 index c5c9e2aa..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.6c7de304.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.7985fafb.jpg b/learning/.vuepress/dist/assets/img/2.7985fafb.jpg deleted file mode 100644 index 3d5ead67..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.7985fafb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.85163e0d.gif b/learning/.vuepress/dist/assets/img/2.85163e0d.gif deleted file mode 100644 index cbbbda53..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.85163e0d.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.883bcd77.jpg b/learning/.vuepress/dist/assets/img/2.883bcd77.jpg deleted file mode 100644 index db36f1f6..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.883bcd77.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.8946b15e.jpg b/learning/.vuepress/dist/assets/img/2.8946b15e.jpg deleted file mode 100644 index d1b4c199..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.8946b15e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.90adfc88.jpg b/learning/.vuepress/dist/assets/img/2.90adfc88.jpg deleted file mode 100644 index 02e145b3..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.90adfc88.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.915bf0c2.jpg b/learning/.vuepress/dist/assets/img/2.915bf0c2.jpg deleted file mode 100644 index e6d7a86f..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.915bf0c2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.92dd024b.jpg b/learning/.vuepress/dist/assets/img/2.92dd024b.jpg deleted file mode 100644 index adee0122..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.92dd024b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.93e61020.png b/learning/.vuepress/dist/assets/img/2.93e61020.png deleted file mode 100644 index 2c0bedbd..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.93e61020.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.9d2cac0d.jpg b/learning/.vuepress/dist/assets/img/2.9d2cac0d.jpg deleted file mode 100644 index d0dfd0ce..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.9d2cac0d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a079fe2e.jpg b/learning/.vuepress/dist/assets/img/2.a079fe2e.jpg deleted file mode 100644 index 192994dd..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a079fe2e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a3352c98.jpg b/learning/.vuepress/dist/assets/img/2.a3352c98.jpg deleted file mode 100644 index 58188c2f..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a3352c98.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a51900c0.jpg b/learning/.vuepress/dist/assets/img/2.a51900c0.jpg deleted file mode 100644 index 1b16dfd5..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a51900c0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a554b385.jpg b/learning/.vuepress/dist/assets/img/2.a554b385.jpg deleted file mode 100644 index 336bcc7d..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a554b385.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a57eb659.jpg b/learning/.vuepress/dist/assets/img/2.a57eb659.jpg deleted file mode 100644 index 734476c7..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a57eb659.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a8d7369c.jpg b/learning/.vuepress/dist/assets/img/2.a8d7369c.jpg deleted file mode 100644 index f3e77913..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a8d7369c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a9aa4801.jpg b/learning/.vuepress/dist/assets/img/2.a9aa4801.jpg deleted file mode 100644 index adb7b202..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a9aa4801.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.a9bb6bb9.png b/learning/.vuepress/dist/assets/img/2.a9bb6bb9.png deleted file mode 100644 index 4b2084ca..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.a9bb6bb9.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.ace2c641.jpg b/learning/.vuepress/dist/assets/img/2.ace2c641.jpg deleted file mode 100644 index 0b454427..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.ace2c641.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.aecc2d80.jpg b/learning/.vuepress/dist/assets/img/2.aecc2d80.jpg deleted file mode 100644 index fbdd8ee0..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.aecc2d80.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.aff43165.jpg b/learning/.vuepress/dist/assets/img/2.aff43165.jpg deleted file mode 100644 index 929aa34f..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.aff43165.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.b3d11d61.jpg b/learning/.vuepress/dist/assets/img/2.b3d11d61.jpg deleted file mode 100644 index 79af8c0d..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.b3d11d61.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.b40d95e1.jpg b/learning/.vuepress/dist/assets/img/2.b40d95e1.jpg deleted file mode 100644 index 8ac89863..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.b40d95e1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.b43303bc.jpg b/learning/.vuepress/dist/assets/img/2.b43303bc.jpg deleted file mode 100644 index 8b24d0d1..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.b43303bc.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.b719d6e1.jpg b/learning/.vuepress/dist/assets/img/2.b719d6e1.jpg deleted file mode 100644 index 650d04fb..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.b719d6e1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.be442deb.jpg b/learning/.vuepress/dist/assets/img/2.be442deb.jpg deleted file mode 100644 index f366a7e5..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.be442deb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.c2d40091.jpg b/learning/.vuepress/dist/assets/img/2.c2d40091.jpg deleted file mode 100644 index 4ef367cb..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.c2d40091.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.c5b636d0.jpeg b/learning/.vuepress/dist/assets/img/2.c5b636d0.jpeg deleted file mode 100644 index b3b1cd90..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.c5b636d0.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.cb4efa34.jpg b/learning/.vuepress/dist/assets/img/2.cb4efa34.jpg deleted file mode 100644 index 1fea0aab..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.cb4efa34.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.cb821808.png b/learning/.vuepress/dist/assets/img/2.cb821808.png deleted file mode 100644 index 11f0aa93..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.cb821808.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.cbeec2a0.png b/learning/.vuepress/dist/assets/img/2.cbeec2a0.png deleted file mode 100644 index f79a9b78..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.cbeec2a0.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.d061881a.jpg b/learning/.vuepress/dist/assets/img/2.d061881a.jpg deleted file mode 100644 index 6b2f5bd7..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.d061881a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.d4084b13.jpg b/learning/.vuepress/dist/assets/img/2.d4084b13.jpg deleted file mode 100644 index bdd5f16c..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.d4084b13.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.da9ba16e.png b/learning/.vuepress/dist/assets/img/2.da9ba16e.png deleted file mode 100644 index 1798db8e..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.da9ba16e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.deff66b7.jpg b/learning/.vuepress/dist/assets/img/2.deff66b7.jpg deleted file mode 100644 index 62bd66ab..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.deff66b7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.e2bb3392.jpg b/learning/.vuepress/dist/assets/img/2.e2bb3392.jpg deleted file mode 100644 index 858043aa..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.e2bb3392.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.e5a6e037.jpg b/learning/.vuepress/dist/assets/img/2.e5a6e037.jpg deleted file mode 100644 index dd1aae39..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.e5a6e037.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.e6b05cdb.jpg b/learning/.vuepress/dist/assets/img/2.e6b05cdb.jpg deleted file mode 100644 index d8735062..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.e6b05cdb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.eac5c299.png b/learning/.vuepress/dist/assets/img/2.eac5c299.png deleted file mode 100644 index b0e03083..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.eac5c299.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.eeed6c30.jpg b/learning/.vuepress/dist/assets/img/2.eeed6c30.jpg deleted file mode 100644 index c71685d7..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.eeed6c30.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.f2d22ba1.jpg b/learning/.vuepress/dist/assets/img/2.f2d22ba1.jpg deleted file mode 100644 index 5cd4fc6e..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.f2d22ba1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.f30b0c60.jpg b/learning/.vuepress/dist/assets/img/2.f30b0c60.jpg deleted file mode 100644 index cf1cf51b..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.f30b0c60.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.f9414b45.jpg b/learning/.vuepress/dist/assets/img/2.f9414b45.jpg deleted file mode 100644 index 4c7500f5..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.f9414b45.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.fc3a2c47.jpg b/learning/.vuepress/dist/assets/img/2.fc3a2c47.jpg deleted file mode 100644 index eb105473..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.fc3a2c47.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/2.fe0036fa.jpg b/learning/.vuepress/dist/assets/img/2.fe0036fa.jpg deleted file mode 100644 index e760e4da..00000000 Binary files a/learning/.vuepress/dist/assets/img/2.fe0036fa.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/20.21270649.jpg b/learning/.vuepress/dist/assets/img/20.21270649.jpg deleted file mode 100644 index f2856e3c..00000000 Binary files a/learning/.vuepress/dist/assets/img/20.21270649.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/21.c71ff2d5.jpg b/learning/.vuepress/dist/assets/img/21.c71ff2d5.jpg deleted file mode 100644 index f1536ae1..00000000 Binary files a/learning/.vuepress/dist/assets/img/21.c71ff2d5.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/22.0dfbaa1c.jpg b/learning/.vuepress/dist/assets/img/22.0dfbaa1c.jpg deleted file mode 100644 index a079d299..00000000 Binary files a/learning/.vuepress/dist/assets/img/22.0dfbaa1c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/23.e483057b.jpg b/learning/.vuepress/dist/assets/img/23.e483057b.jpg deleted file mode 100644 index 05baf6eb..00000000 Binary files a/learning/.vuepress/dist/assets/img/23.e483057b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/24.faeadf2e.jpg b/learning/.vuepress/dist/assets/img/24.faeadf2e.jpg deleted file mode 100644 index 746a88cf..00000000 Binary files a/learning/.vuepress/dist/assets/img/24.faeadf2e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/25.6750d734.jpg b/learning/.vuepress/dist/assets/img/25.6750d734.jpg deleted file mode 100644 index 28e7d8d6..00000000 Binary files a/learning/.vuepress/dist/assets/img/25.6750d734.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/26.120ba786.jpg b/learning/.vuepress/dist/assets/img/26.120ba786.jpg deleted file mode 100644 index 4f45d3f0..00000000 Binary files a/learning/.vuepress/dist/assets/img/26.120ba786.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/27.af418b95.jpg b/learning/.vuepress/dist/assets/img/27.af418b95.jpg deleted file mode 100644 index 04724e0b..00000000 Binary files a/learning/.vuepress/dist/assets/img/27.af418b95.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/28.0129bd8c.jpg b/learning/.vuepress/dist/assets/img/28.0129bd8c.jpg deleted file mode 100644 index d4d855f5..00000000 Binary files a/learning/.vuepress/dist/assets/img/28.0129bd8c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/29.3fdbe3a3.jpg b/learning/.vuepress/dist/assets/img/29.3fdbe3a3.jpg deleted file mode 100644 index 34be4d50..00000000 Binary files a/learning/.vuepress/dist/assets/img/29.3fdbe3a3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.005b13e9.jpg b/learning/.vuepress/dist/assets/img/3.005b13e9.jpg deleted file mode 100644 index 770dfe96..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.005b13e9.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.0c3a60cf.gif b/learning/.vuepress/dist/assets/img/3.0c3a60cf.gif deleted file mode 100644 index f3c59826..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.0c3a60cf.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.0dab3096.jpg b/learning/.vuepress/dist/assets/img/3.0dab3096.jpg deleted file mode 100644 index f02e4489..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.0dab3096.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.1996c071.jpg b/learning/.vuepress/dist/assets/img/3.1996c071.jpg deleted file mode 100644 index 97db1610..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.1996c071.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.1a17ae06.jpg b/learning/.vuepress/dist/assets/img/3.1a17ae06.jpg deleted file mode 100644 index 2d727bb8..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.1a17ae06.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.282d3108.jpg b/learning/.vuepress/dist/assets/img/3.282d3108.jpg deleted file mode 100644 index a5e3e1ef..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.282d3108.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.305e9fcd.jpg b/learning/.vuepress/dist/assets/img/3.305e9fcd.jpg deleted file mode 100644 index 9a3e6f24..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.305e9fcd.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.32f5ea8f.jpg b/learning/.vuepress/dist/assets/img/3.32f5ea8f.jpg deleted file mode 100644 index d45c829f..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.32f5ea8f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.330ade79.jpg b/learning/.vuepress/dist/assets/img/3.330ade79.jpg deleted file mode 100644 index 64eafe01..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.330ade79.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.349f556b.jpg b/learning/.vuepress/dist/assets/img/3.349f556b.jpg deleted file mode 100644 index 91f326b2..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.349f556b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.34b978c4.jpg b/learning/.vuepress/dist/assets/img/3.34b978c4.jpg deleted file mode 100644 index 6c079280..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.34b978c4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.369c22de.png b/learning/.vuepress/dist/assets/img/3.369c22de.png deleted file mode 100644 index 9c284498..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.369c22de.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.395c1e89.jpg b/learning/.vuepress/dist/assets/img/3.395c1e89.jpg deleted file mode 100644 index 8cf9f264..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.395c1e89.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.3ff6091a.jpg b/learning/.vuepress/dist/assets/img/3.3ff6091a.jpg deleted file mode 100644 index 5bb37a62..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.3ff6091a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.49d6ed2b.jpeg b/learning/.vuepress/dist/assets/img/3.49d6ed2b.jpeg deleted file mode 100644 index 6fa522a7..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.49d6ed2b.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.4a7ea697.jpg b/learning/.vuepress/dist/assets/img/3.4a7ea697.jpg deleted file mode 100644 index e8e43db1..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.4a7ea697.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.53ddd978.png b/learning/.vuepress/dist/assets/img/3.53ddd978.png deleted file mode 100644 index c78500ad..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.53ddd978.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.57538b3d.png b/learning/.vuepress/dist/assets/img/3.57538b3d.png deleted file mode 100644 index 5a7c3877..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.57538b3d.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.575d3fba.png b/learning/.vuepress/dist/assets/img/3.575d3fba.png deleted file mode 100644 index 148c86ca..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.575d3fba.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.5be4a6f5.jpeg b/learning/.vuepress/dist/assets/img/3.5be4a6f5.jpeg deleted file mode 100644 index 7a7e6986..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.5be4a6f5.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.5e716077.jpg b/learning/.vuepress/dist/assets/img/3.5e716077.jpg deleted file mode 100644 index c2c50a58..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.5e716077.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.5fcd1024.gif b/learning/.vuepress/dist/assets/img/3.5fcd1024.gif deleted file mode 100644 index 8fd5d40b..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.5fcd1024.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.65076092.jpg b/learning/.vuepress/dist/assets/img/3.65076092.jpg deleted file mode 100644 index 1170b400..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.65076092.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.6c81b835.png b/learning/.vuepress/dist/assets/img/3.6c81b835.png deleted file mode 100644 index 3066590f..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.6c81b835.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.6f35751e.jpg b/learning/.vuepress/dist/assets/img/3.6f35751e.jpg deleted file mode 100644 index a831ba18..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.6f35751e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.74675f3c.jpg b/learning/.vuepress/dist/assets/img/3.74675f3c.jpg deleted file mode 100644 index 5e7f641f..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.74675f3c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.77fc440f.jpeg b/learning/.vuepress/dist/assets/img/3.77fc440f.jpeg deleted file mode 100644 index 415974d3..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.77fc440f.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.790bbcab.jpg b/learning/.vuepress/dist/assets/img/3.790bbcab.jpg deleted file mode 100644 index 6821c09b..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.790bbcab.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.7af03277.jpg b/learning/.vuepress/dist/assets/img/3.7af03277.jpg deleted file mode 100644 index 687ab3d4..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.7af03277.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.7d36e53c.jpg b/learning/.vuepress/dist/assets/img/3.7d36e53c.jpg deleted file mode 100644 index ecb070a6..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.7d36e53c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.83332a28.jpg b/learning/.vuepress/dist/assets/img/3.83332a28.jpg deleted file mode 100644 index e0b37d6f..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.83332a28.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.83aaac9c.jpg b/learning/.vuepress/dist/assets/img/3.83aaac9c.jpg deleted file mode 100644 index 83e50ac6..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.83aaac9c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.8ad59b24.jpg b/learning/.vuepress/dist/assets/img/3.8ad59b24.jpg deleted file mode 100644 index 365ee90e..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.8ad59b24.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.96d46fed.gif b/learning/.vuepress/dist/assets/img/3.96d46fed.gif deleted file mode 100644 index 81c7df09..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.96d46fed.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.9a946a0e.jpg b/learning/.vuepress/dist/assets/img/3.9a946a0e.jpg deleted file mode 100644 index 2c6df113..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.9a946a0e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.a40364f6.png b/learning/.vuepress/dist/assets/img/3.a40364f6.png deleted file mode 100644 index 36788df2..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.a40364f6.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.a8ce815b.jpg b/learning/.vuepress/dist/assets/img/3.a8ce815b.jpg deleted file mode 100644 index eda710a2..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.a8ce815b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.aacfd3e5.jpg b/learning/.vuepress/dist/assets/img/3.aacfd3e5.jpg deleted file mode 100644 index 7d3c7f7d..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.aacfd3e5.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.acd93ea4.jpg b/learning/.vuepress/dist/assets/img/3.acd93ea4.jpg deleted file mode 100644 index d180555d..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.acd93ea4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.ad8c5615.jpg b/learning/.vuepress/dist/assets/img/3.ad8c5615.jpg deleted file mode 100644 index a40ecba2..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.ad8c5615.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.af2b4e20.jpg b/learning/.vuepress/dist/assets/img/3.af2b4e20.jpg deleted file mode 100644 index c9df0953..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.af2b4e20.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.b24151b9.png b/learning/.vuepress/dist/assets/img/3.b24151b9.png deleted file mode 100644 index 57d00db3..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.b24151b9.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.b277e870.jpg b/learning/.vuepress/dist/assets/img/3.b277e870.jpg deleted file mode 100644 index ce641c47..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.b277e870.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.b63f9142.jpg b/learning/.vuepress/dist/assets/img/3.b63f9142.jpg deleted file mode 100644 index 14929086..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.b63f9142.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.b6b0c2c7.png b/learning/.vuepress/dist/assets/img/3.b6b0c2c7.png deleted file mode 100644 index 1db89377..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.b6b0c2c7.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.bb5bf3f0.jpg b/learning/.vuepress/dist/assets/img/3.bb5bf3f0.jpg deleted file mode 100644 index afbab6bc..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.bb5bf3f0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.c301cca8.jpg b/learning/.vuepress/dist/assets/img/3.c301cca8.jpg deleted file mode 100644 index 6cbfcdce..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.c301cca8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.c3858898.jpg b/learning/.vuepress/dist/assets/img/3.c3858898.jpg deleted file mode 100644 index 9ca08aa6..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.c3858898.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.cd940b06.jpg b/learning/.vuepress/dist/assets/img/3.cd940b06.jpg deleted file mode 100644 index 5ce40e55..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.cd940b06.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.df655fea.jpg b/learning/.vuepress/dist/assets/img/3.df655fea.jpg deleted file mode 100644 index 69425e8e..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.df655fea.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.e3a47b2e.jpg b/learning/.vuepress/dist/assets/img/3.e3a47b2e.jpg deleted file mode 100644 index 276efeb4..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.e3a47b2e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.eb049027.jpeg b/learning/.vuepress/dist/assets/img/3.eb049027.jpeg deleted file mode 100644 index 86654f7c..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.eb049027.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.ee5b366a.jpg b/learning/.vuepress/dist/assets/img/3.ee5b366a.jpg deleted file mode 100644 index 2644ec41..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.ee5b366a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.f425d51a.jpg b/learning/.vuepress/dist/assets/img/3.f425d51a.jpg deleted file mode 100644 index aa55d885..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.f425d51a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.f59824c9.jpg b/learning/.vuepress/dist/assets/img/3.f59824c9.jpg deleted file mode 100644 index 1a8d3c33..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.f59824c9.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.fbeca3fc.jpg b/learning/.vuepress/dist/assets/img/3.fbeca3fc.jpg deleted file mode 100644 index 9ca62e9a..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.fbeca3fc.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.fea14d13.jpg b/learning/.vuepress/dist/assets/img/3.fea14d13.jpg deleted file mode 100644 index e6139d29..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.fea14d13.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/3.ff524e61.jpg b/learning/.vuepress/dist/assets/img/3.ff524e61.jpg deleted file mode 100644 index 3303ba0e..00000000 Binary files a/learning/.vuepress/dist/assets/img/3.ff524e61.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/30.fdddeb32.jpg b/learning/.vuepress/dist/assets/img/30.fdddeb32.jpg deleted file mode 100644 index 9e0e0944..00000000 Binary files a/learning/.vuepress/dist/assets/img/30.fdddeb32.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/32.55284143.jpg b/learning/.vuepress/dist/assets/img/32.55284143.jpg deleted file mode 100644 index 256aab1d..00000000 Binary files a/learning/.vuepress/dist/assets/img/32.55284143.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/33.2f9c6307.jpg b/learning/.vuepress/dist/assets/img/33.2f9c6307.jpg deleted file mode 100644 index d31bb764..00000000 Binary files a/learning/.vuepress/dist/assets/img/33.2f9c6307.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/34.088e44cf.jpg b/learning/.vuepress/dist/assets/img/34.088e44cf.jpg deleted file mode 100644 index 82f11387..00000000 Binary files a/learning/.vuepress/dist/assets/img/34.088e44cf.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/35.c4d9475c.jpg b/learning/.vuepress/dist/assets/img/35.c4d9475c.jpg deleted file mode 100644 index 67973ce7..00000000 Binary files a/learning/.vuepress/dist/assets/img/35.c4d9475c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/36.16e8c10d.jpg b/learning/.vuepress/dist/assets/img/36.16e8c10d.jpg deleted file mode 100644 index 6ef226c6..00000000 Binary files a/learning/.vuepress/dist/assets/img/36.16e8c10d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/37.a96ce0dc.jpg b/learning/.vuepress/dist/assets/img/37.a96ce0dc.jpg deleted file mode 100644 index 52adcd3a..00000000 Binary files a/learning/.vuepress/dist/assets/img/37.a96ce0dc.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/38.8d2e09fd.jpg b/learning/.vuepress/dist/assets/img/38.8d2e09fd.jpg deleted file mode 100644 index 06347357..00000000 Binary files a/learning/.vuepress/dist/assets/img/38.8d2e09fd.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/39.5bb938d3.jpg b/learning/.vuepress/dist/assets/img/39.5bb938d3.jpg deleted file mode 100644 index 6b1ffc57..00000000 Binary files a/learning/.vuepress/dist/assets/img/39.5bb938d3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.08f28007.jpg b/learning/.vuepress/dist/assets/img/4.08f28007.jpg deleted file mode 100644 index 7277d184..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.08f28007.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.0c272c85.png b/learning/.vuepress/dist/assets/img/4.0c272c85.png deleted file mode 100644 index 29d942db..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.0c272c85.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.0c5afe33.jpg b/learning/.vuepress/dist/assets/img/4.0c5afe33.jpg deleted file mode 100644 index 6395a975..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.0c5afe33.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.1a533a6e.jpg b/learning/.vuepress/dist/assets/img/4.1a533a6e.jpg deleted file mode 100644 index 2b76bf13..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.1a533a6e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.2af867bd.png b/learning/.vuepress/dist/assets/img/4.2af867bd.png deleted file mode 100644 index 87cea773..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.2af867bd.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.2edb2d7e.png b/learning/.vuepress/dist/assets/img/4.2edb2d7e.png deleted file mode 100644 index 2163101c..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.2edb2d7e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.319ecb17.jpg b/learning/.vuepress/dist/assets/img/4.319ecb17.jpg deleted file mode 100644 index 1ae3e4f0..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.319ecb17.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.3662f31c.jpg b/learning/.vuepress/dist/assets/img/4.3662f31c.jpg deleted file mode 100644 index f5d5c4ad..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.3662f31c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.371c25ec.jpg b/learning/.vuepress/dist/assets/img/4.371c25ec.jpg deleted file mode 100644 index 9a0214ed..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.371c25ec.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.386090fa.jpg b/learning/.vuepress/dist/assets/img/4.386090fa.jpg deleted file mode 100644 index a0e8da4b..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.386090fa.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.3a449284.jpg b/learning/.vuepress/dist/assets/img/4.3a449284.jpg deleted file mode 100644 index 931c91bc..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.3a449284.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.3c3af4f3.jpg b/learning/.vuepress/dist/assets/img/4.3c3af4f3.jpg deleted file mode 100644 index 50439a09..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.3c3af4f3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.4b4e0373.png b/learning/.vuepress/dist/assets/img/4.4b4e0373.png deleted file mode 100644 index b3c7931e..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.4b4e0373.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.4b928156.jpg b/learning/.vuepress/dist/assets/img/4.4b928156.jpg deleted file mode 100644 index 2ec9446c..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.4b928156.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.4bdfb1c2.jpg b/learning/.vuepress/dist/assets/img/4.4bdfb1c2.jpg deleted file mode 100644 index b511e6b9..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.4bdfb1c2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.4d0bf2ce.jpg b/learning/.vuepress/dist/assets/img/4.4d0bf2ce.jpg deleted file mode 100644 index 134eb0ea..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.4d0bf2ce.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.517a72a2.jpg b/learning/.vuepress/dist/assets/img/4.517a72a2.jpg deleted file mode 100644 index 0f61a62d..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.517a72a2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.52846cf7.jpg b/learning/.vuepress/dist/assets/img/4.52846cf7.jpg deleted file mode 100644 index b80205f1..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.52846cf7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.577ac376.jpg b/learning/.vuepress/dist/assets/img/4.577ac376.jpg deleted file mode 100644 index 278a2c41..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.577ac376.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.639a8eb0.jpg b/learning/.vuepress/dist/assets/img/4.639a8eb0.jpg deleted file mode 100644 index 4970f2fd..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.639a8eb0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.655c9c55.jpg b/learning/.vuepress/dist/assets/img/4.655c9c55.jpg deleted file mode 100644 index fe44356f..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.655c9c55.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.6650b341.jpeg b/learning/.vuepress/dist/assets/img/4.6650b341.jpeg deleted file mode 100644 index 04aeff2a..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.6650b341.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.6b5d3d0b.jpg b/learning/.vuepress/dist/assets/img/4.6b5d3d0b.jpg deleted file mode 100644 index 69844654..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.6b5d3d0b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.71b453f4.jpg b/learning/.vuepress/dist/assets/img/4.71b453f4.jpg deleted file mode 100644 index a006fad8..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.71b453f4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.72302b38.jpeg b/learning/.vuepress/dist/assets/img/4.72302b38.jpeg deleted file mode 100644 index 43853af5..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.72302b38.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.73e083c6.jpg b/learning/.vuepress/dist/assets/img/4.73e083c6.jpg deleted file mode 100644 index 78df4441..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.73e083c6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.78f043f5.jpg b/learning/.vuepress/dist/assets/img/4.78f043f5.jpg deleted file mode 100644 index 64ba01ba..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.78f043f5.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.79cdc876.png b/learning/.vuepress/dist/assets/img/4.79cdc876.png deleted file mode 100644 index eb8f2bef..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.79cdc876.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.7bc74c08.jpg b/learning/.vuepress/dist/assets/img/4.7bc74c08.jpg deleted file mode 100644 index 4b8da494..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.7bc74c08.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.84cffc54.png b/learning/.vuepress/dist/assets/img/4.84cffc54.png deleted file mode 100644 index eae03abc..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.84cffc54.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.89740a2c.jpg b/learning/.vuepress/dist/assets/img/4.89740a2c.jpg deleted file mode 100644 index 0bcc54ba..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.89740a2c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.8b0cf254.jpg b/learning/.vuepress/dist/assets/img/4.8b0cf254.jpg deleted file mode 100644 index e91f5383..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.8b0cf254.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.8d02ff74.jpg b/learning/.vuepress/dist/assets/img/4.8d02ff74.jpg deleted file mode 100644 index f382492a..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.8d02ff74.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.9c6ba0d5.gif b/learning/.vuepress/dist/assets/img/4.9c6ba0d5.gif deleted file mode 100644 index 46543495..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.9c6ba0d5.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.a8f0713b.jpg b/learning/.vuepress/dist/assets/img/4.a8f0713b.jpg deleted file mode 100644 index 9c001327..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.a8f0713b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.acb8c9b1.jpg b/learning/.vuepress/dist/assets/img/4.acb8c9b1.jpg deleted file mode 100644 index d748f944..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.acb8c9b1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.ae05f578.jpg b/learning/.vuepress/dist/assets/img/4.ae05f578.jpg deleted file mode 100644 index 297ab320..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.ae05f578.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.aef60610.jpg b/learning/.vuepress/dist/assets/img/4.aef60610.jpg deleted file mode 100644 index 262463a1..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.aef60610.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.af1e2af1.jpg b/learning/.vuepress/dist/assets/img/4.af1e2af1.jpg deleted file mode 100644 index 73afdaa7..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.af1e2af1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.b038e351.gif b/learning/.vuepress/dist/assets/img/4.b038e351.gif deleted file mode 100644 index 342226af..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.b038e351.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.b941e37c.png b/learning/.vuepress/dist/assets/img/4.b941e37c.png deleted file mode 100644 index 7a0c3ad4..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.b941e37c.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.b99fbd0c.jpg b/learning/.vuepress/dist/assets/img/4.b99fbd0c.jpg deleted file mode 100644 index 96578d0a..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.b99fbd0c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.c40e03a7.jpg b/learning/.vuepress/dist/assets/img/4.c40e03a7.jpg deleted file mode 100644 index 12fa8ab2..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.c40e03a7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.c46f6eb3.jpg b/learning/.vuepress/dist/assets/img/4.c46f6eb3.jpg deleted file mode 100644 index 7db599ea..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.c46f6eb3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.cd0d1855.jpg b/learning/.vuepress/dist/assets/img/4.cd0d1855.jpg deleted file mode 100644 index d6837296..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.cd0d1855.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.ce034acb.jpg b/learning/.vuepress/dist/assets/img/4.ce034acb.jpg deleted file mode 100644 index f822f4ed..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.ce034acb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.cf1947cb.jpg b/learning/.vuepress/dist/assets/img/4.cf1947cb.jpg deleted file mode 100644 index 5be0a6a6..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.cf1947cb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.dbb7a6ee.jpg b/learning/.vuepress/dist/assets/img/4.dbb7a6ee.jpg deleted file mode 100644 index ada1796c..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.dbb7a6ee.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.e93db3df.gif b/learning/.vuepress/dist/assets/img/4.e93db3df.gif deleted file mode 100644 index 082e089d..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.e93db3df.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.ee799e61.png b/learning/.vuepress/dist/assets/img/4.ee799e61.png deleted file mode 100644 index 8f879cbb..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.ee799e61.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.f3a9aa62.jpg b/learning/.vuepress/dist/assets/img/4.f3a9aa62.jpg deleted file mode 100644 index 5c31dab0..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.f3a9aa62.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.f3d885a0.jpg b/learning/.vuepress/dist/assets/img/4.f3d885a0.jpg deleted file mode 100644 index 190664a7..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.f3d885a0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.f3de9102.jpg b/learning/.vuepress/dist/assets/img/4.f3de9102.jpg deleted file mode 100644 index fed527d5..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.f3de9102.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/4.f931992f.jpg b/learning/.vuepress/dist/assets/img/4.f931992f.jpg deleted file mode 100644 index a77366ad..00000000 Binary files a/learning/.vuepress/dist/assets/img/4.f931992f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/40.02513dd2.jpg b/learning/.vuepress/dist/assets/img/40.02513dd2.jpg deleted file mode 100644 index dcd0b7f1..00000000 Binary files a/learning/.vuepress/dist/assets/img/40.02513dd2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/41.278a834a.jpg b/learning/.vuepress/dist/assets/img/41.278a834a.jpg deleted file mode 100644 index 0c8d6770..00000000 Binary files a/learning/.vuepress/dist/assets/img/41.278a834a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/42.f0b0ff81.jpg b/learning/.vuepress/dist/assets/img/42.f0b0ff81.jpg deleted file mode 100644 index 45aba18c..00000000 Binary files a/learning/.vuepress/dist/assets/img/42.f0b0ff81.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/43.af5389d7.jpg b/learning/.vuepress/dist/assets/img/43.af5389d7.jpg deleted file mode 100644 index bd828a9e..00000000 Binary files a/learning/.vuepress/dist/assets/img/43.af5389d7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/44.daadc38e.jpg b/learning/.vuepress/dist/assets/img/44.daadc38e.jpg deleted file mode 100644 index 564fc9b2..00000000 Binary files a/learning/.vuepress/dist/assets/img/44.daadc38e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/45.1509be0f.jpg b/learning/.vuepress/dist/assets/img/45.1509be0f.jpg deleted file mode 100644 index 35c99d21..00000000 Binary files a/learning/.vuepress/dist/assets/img/45.1509be0f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/46.71cd5e77.jpg b/learning/.vuepress/dist/assets/img/46.71cd5e77.jpg deleted file mode 100644 index ea9ea88f..00000000 Binary files a/learning/.vuepress/dist/assets/img/46.71cd5e77.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/47.cd5c0b80.jpg b/learning/.vuepress/dist/assets/img/47.cd5c0b80.jpg deleted file mode 100644 index 44f1d678..00000000 Binary files a/learning/.vuepress/dist/assets/img/47.cd5c0b80.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/49.b7bb9267.jpg b/learning/.vuepress/dist/assets/img/49.b7bb9267.jpg deleted file mode 100644 index 39a90f69..00000000 Binary files a/learning/.vuepress/dist/assets/img/49.b7bb9267.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.0424dafc.jpg b/learning/.vuepress/dist/assets/img/5.0424dafc.jpg deleted file mode 100644 index b2d75342..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.0424dafc.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.0b256752.jpg b/learning/.vuepress/dist/assets/img/5.0b256752.jpg deleted file mode 100644 index 3325ab21..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.0b256752.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.0bd26895.jpg b/learning/.vuepress/dist/assets/img/5.0bd26895.jpg deleted file mode 100644 index 407db013..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.0bd26895.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.15a64ae0.jpg b/learning/.vuepress/dist/assets/img/5.15a64ae0.jpg deleted file mode 100644 index 69f5a01a..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.15a64ae0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.16739550.png b/learning/.vuepress/dist/assets/img/5.16739550.png deleted file mode 100644 index 674cf977..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.16739550.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.18db8de2.jpg b/learning/.vuepress/dist/assets/img/5.18db8de2.jpg deleted file mode 100644 index c717a286..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.18db8de2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.1ce72971.jpg b/learning/.vuepress/dist/assets/img/5.1ce72971.jpg deleted file mode 100644 index 210c13bf..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.1ce72971.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.1df63ac6.jpg b/learning/.vuepress/dist/assets/img/5.1df63ac6.jpg deleted file mode 100644 index 41de52a8..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.1df63ac6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.243e0f4d.jpg b/learning/.vuepress/dist/assets/img/5.243e0f4d.jpg deleted file mode 100644 index 20665c16..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.243e0f4d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.2c119423.jpg b/learning/.vuepress/dist/assets/img/5.2c119423.jpg deleted file mode 100644 index 21c9f9e2..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.2c119423.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.33763b0a.jpg b/learning/.vuepress/dist/assets/img/5.33763b0a.jpg deleted file mode 100644 index 0bc01cdd..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.33763b0a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.36f3611e.jpg b/learning/.vuepress/dist/assets/img/5.36f3611e.jpg deleted file mode 100644 index fa63177c..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.36f3611e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.3aa639d9.png b/learning/.vuepress/dist/assets/img/5.3aa639d9.png deleted file mode 100644 index d7a26c7b..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.3aa639d9.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.404ed413.jpg b/learning/.vuepress/dist/assets/img/5.404ed413.jpg deleted file mode 100644 index 80dfb6f3..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.404ed413.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.54d5f79b.jpg b/learning/.vuepress/dist/assets/img/5.54d5f79b.jpg deleted file mode 100644 index bc50a966..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.54d5f79b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.54fa5539.jpg b/learning/.vuepress/dist/assets/img/5.54fa5539.jpg deleted file mode 100644 index f39783a4..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.54fa5539.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.585e5236.jpg b/learning/.vuepress/dist/assets/img/5.585e5236.jpg deleted file mode 100644 index 15228b87..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.585e5236.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.5a7a80a4.jpg b/learning/.vuepress/dist/assets/img/5.5a7a80a4.jpg deleted file mode 100644 index 138a866f..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.5a7a80a4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.606dbc80.png b/learning/.vuepress/dist/assets/img/5.606dbc80.png deleted file mode 100644 index 726ce84e..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.606dbc80.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.607471fb.jpg b/learning/.vuepress/dist/assets/img/5.607471fb.jpg deleted file mode 100644 index 3b0d0f2b..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.607471fb.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.672ce4c2.jpg b/learning/.vuepress/dist/assets/img/5.672ce4c2.jpg deleted file mode 100644 index beb07f4a..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.672ce4c2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.6e74812c.jpg b/learning/.vuepress/dist/assets/img/5.6e74812c.jpg deleted file mode 100644 index c06fd182..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.6e74812c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.807d5b53.jpg b/learning/.vuepress/dist/assets/img/5.807d5b53.jpg deleted file mode 100644 index 2cd9c6b7..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.807d5b53.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.865aaf84.png b/learning/.vuepress/dist/assets/img/5.865aaf84.png deleted file mode 100644 index 7fe023b2..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.865aaf84.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.8c39bbb1.jpg b/learning/.vuepress/dist/assets/img/5.8c39bbb1.jpg deleted file mode 100644 index 94b8ad67..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.8c39bbb1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.96253984.jpg b/learning/.vuepress/dist/assets/img/5.96253984.jpg deleted file mode 100644 index 0ce09d00..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.96253984.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.9dd4bda4.jpg b/learning/.vuepress/dist/assets/img/5.9dd4bda4.jpg deleted file mode 100644 index a4814e94..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.9dd4bda4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.9f7794ab.jpg b/learning/.vuepress/dist/assets/img/5.9f7794ab.jpg deleted file mode 100644 index adb7426d..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.9f7794ab.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.a7be87ed.jpg b/learning/.vuepress/dist/assets/img/5.a7be87ed.jpg deleted file mode 100644 index 5e2b5290..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.a7be87ed.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.ab912240.jpg b/learning/.vuepress/dist/assets/img/5.ab912240.jpg deleted file mode 100644 index cf6ddead..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.ab912240.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.acd9a171.jpg b/learning/.vuepress/dist/assets/img/5.acd9a171.jpg deleted file mode 100644 index 4ac87bb7..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.acd9a171.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.b505cca6.jpg b/learning/.vuepress/dist/assets/img/5.b505cca6.jpg deleted file mode 100644 index d0e01415..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.b505cca6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.b6280d8e.jpg b/learning/.vuepress/dist/assets/img/5.b6280d8e.jpg deleted file mode 100644 index 64974b79..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.b6280d8e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.ba54b600.jpg b/learning/.vuepress/dist/assets/img/5.ba54b600.jpg deleted file mode 100644 index a64d6e58..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.ba54b600.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.bd4d699f.jpg b/learning/.vuepress/dist/assets/img/5.bd4d699f.jpg deleted file mode 100644 index f34ed783..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.bd4d699f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.bedc1917.jpg b/learning/.vuepress/dist/assets/img/5.bedc1917.jpg deleted file mode 100644 index 623ce411..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.bedc1917.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.ccd57a30.jpg b/learning/.vuepress/dist/assets/img/5.ccd57a30.jpg deleted file mode 100644 index 5c3a65d2..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.ccd57a30.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.d8077a39.png b/learning/.vuepress/dist/assets/img/5.d8077a39.png deleted file mode 100644 index 35eefdf6..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.d8077a39.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.dfc3e337.jpg b/learning/.vuepress/dist/assets/img/5.dfc3e337.jpg deleted file mode 100644 index ca7d0b0e..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.dfc3e337.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.e45f10c1.jpg b/learning/.vuepress/dist/assets/img/5.e45f10c1.jpg deleted file mode 100644 index 5fa46ee4..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.e45f10c1.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.e942f55e.jpg b/learning/.vuepress/dist/assets/img/5.e942f55e.jpg deleted file mode 100644 index 0ab1db77..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.e942f55e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.f0a35d44.png b/learning/.vuepress/dist/assets/img/5.f0a35d44.png deleted file mode 100644 index fca9c44c..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.f0a35d44.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.f1a30d9b.jpg b/learning/.vuepress/dist/assets/img/5.f1a30d9b.jpg deleted file mode 100644 index 58e75f8d..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.f1a30d9b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.f3b5c75b.jpg b/learning/.vuepress/dist/assets/img/5.f3b5c75b.jpg deleted file mode 100644 index 13cc1ec0..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.f3b5c75b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.f6036c4a.jpg b/learning/.vuepress/dist/assets/img/5.f6036c4a.jpg deleted file mode 100644 index 1889875a..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.f6036c4a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/5.faa33f79.jpg b/learning/.vuepress/dist/assets/img/5.faa33f79.jpg deleted file mode 100644 index bbacc2a0..00000000 Binary files a/learning/.vuepress/dist/assets/img/5.faa33f79.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/51.8438f2b4.jpg b/learning/.vuepress/dist/assets/img/51.8438f2b4.jpg deleted file mode 100644 index 39bde6e3..00000000 Binary files a/learning/.vuepress/dist/assets/img/51.8438f2b4.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.027b3f47.jpg b/learning/.vuepress/dist/assets/img/6.027b3f47.jpg deleted file mode 100644 index 4e172abd..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.027b3f47.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.11546c06.jpg b/learning/.vuepress/dist/assets/img/6.11546c06.jpg deleted file mode 100644 index 59e8bb0c..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.11546c06.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.19b1a4e0.jpg b/learning/.vuepress/dist/assets/img/6.19b1a4e0.jpg deleted file mode 100644 index e2af1d3d..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.19b1a4e0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.1e7a6bde.jpg b/learning/.vuepress/dist/assets/img/6.1e7a6bde.jpg deleted file mode 100644 index 6e66eb62..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.1e7a6bde.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.1f77b9c7.jpg b/learning/.vuepress/dist/assets/img/6.1f77b9c7.jpg deleted file mode 100644 index 1fda252a..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.1f77b9c7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.2aa8b15e.png b/learning/.vuepress/dist/assets/img/6.2aa8b15e.png deleted file mode 100644 index 60576553..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.2aa8b15e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.389dadc8.jpg b/learning/.vuepress/dist/assets/img/6.389dadc8.jpg deleted file mode 100644 index d52e2fc8..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.389dadc8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.3f8c796e.jpg b/learning/.vuepress/dist/assets/img/6.3f8c796e.jpg deleted file mode 100644 index 7f1a068f..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.3f8c796e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.48bc0047.jpg b/learning/.vuepress/dist/assets/img/6.48bc0047.jpg deleted file mode 100644 index 5d625e1a..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.48bc0047.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.4c450ae2.jpg b/learning/.vuepress/dist/assets/img/6.4c450ae2.jpg deleted file mode 100644 index 768f66e9..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.4c450ae2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.61b74f5e.png b/learning/.vuepress/dist/assets/img/6.61b74f5e.png deleted file mode 100644 index 652b3d76..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.61b74f5e.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.6209e333.jpg b/learning/.vuepress/dist/assets/img/6.6209e333.jpg deleted file mode 100644 index 855656d4..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.6209e333.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.64d30411.jpg b/learning/.vuepress/dist/assets/img/6.64d30411.jpg deleted file mode 100644 index a3ab0842..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.64d30411.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.674c41b3.jpg b/learning/.vuepress/dist/assets/img/6.674c41b3.jpg deleted file mode 100644 index 6a22cc0f..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.674c41b3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.73d7c7f6.jpg b/learning/.vuepress/dist/assets/img/6.73d7c7f6.jpg deleted file mode 100644 index 657b710d..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.73d7c7f6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.7579b251.gif b/learning/.vuepress/dist/assets/img/6.7579b251.gif deleted file mode 100644 index 47765031..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.7579b251.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.7626291b.jpg b/learning/.vuepress/dist/assets/img/6.7626291b.jpg deleted file mode 100644 index d6c05e8c..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.7626291b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.791fc1f7.gif b/learning/.vuepress/dist/assets/img/6.791fc1f7.gif deleted file mode 100644 index 67887d88..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.791fc1f7.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.919e5b4b.jpg b/learning/.vuepress/dist/assets/img/6.919e5b4b.jpg deleted file mode 100644 index b617e8ba..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.919e5b4b.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.983baa82.jpg b/learning/.vuepress/dist/assets/img/6.983baa82.jpg deleted file mode 100644 index 49e1cc0f..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.983baa82.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.9b45e80f.jpg b/learning/.vuepress/dist/assets/img/6.9b45e80f.jpg deleted file mode 100644 index e4d10a07..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.9b45e80f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.b0b8a3f6.jpg b/learning/.vuepress/dist/assets/img/6.b0b8a3f6.jpg deleted file mode 100644 index 43ac7284..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.b0b8a3f6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.b47733d0.jpg b/learning/.vuepress/dist/assets/img/6.b47733d0.jpg deleted file mode 100644 index 67dc89aa..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.b47733d0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.b657cbf9.jpg b/learning/.vuepress/dist/assets/img/6.b657cbf9.jpg deleted file mode 100644 index 03d85031..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.b657cbf9.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.c11a0ca7.jpg b/learning/.vuepress/dist/assets/img/6.c11a0ca7.jpg deleted file mode 100644 index 69d1b5bc..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.c11a0ca7.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.c17fdc30.png b/learning/.vuepress/dist/assets/img/6.c17fdc30.png deleted file mode 100644 index 1d9f0466..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.c17fdc30.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.c7796e6a.jpg b/learning/.vuepress/dist/assets/img/6.c7796e6a.jpg deleted file mode 100644 index cbaeeeba..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.c7796e6a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.cc528cb2.jpg b/learning/.vuepress/dist/assets/img/6.cc528cb2.jpg deleted file mode 100644 index 47c49e52..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.cc528cb2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.cc7c7072.jpg b/learning/.vuepress/dist/assets/img/6.cc7c7072.jpg deleted file mode 100644 index 79055481..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.cc7c7072.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.d54032f0.jpg b/learning/.vuepress/dist/assets/img/6.d54032f0.jpg deleted file mode 100644 index bcb1e739..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.d54032f0.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.dba384e6.jpg b/learning/.vuepress/dist/assets/img/6.dba384e6.jpg deleted file mode 100644 index e763c6a6..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.dba384e6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/6.f292572e.jpg b/learning/.vuepress/dist/assets/img/6.f292572e.jpg deleted file mode 100644 index cf505783..00000000 Binary files a/learning/.vuepress/dist/assets/img/6.f292572e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.0d48a111.png b/learning/.vuepress/dist/assets/img/7.0d48a111.png deleted file mode 100644 index 23a057a6..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.0d48a111.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.0e0f6f14.jpg b/learning/.vuepress/dist/assets/img/7.0e0f6f14.jpg deleted file mode 100644 index 43abb357..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.0e0f6f14.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.13aa55b6.jpg b/learning/.vuepress/dist/assets/img/7.13aa55b6.jpg deleted file mode 100644 index c708b499..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.13aa55b6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.185c0a4f.jpg b/learning/.vuepress/dist/assets/img/7.185c0a4f.jpg deleted file mode 100644 index 28cb3349..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.185c0a4f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.3bd17b29.jpg b/learning/.vuepress/dist/assets/img/7.3bd17b29.jpg deleted file mode 100644 index 43d25028..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.3bd17b29.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.3e8ddcf3.jpg b/learning/.vuepress/dist/assets/img/7.3e8ddcf3.jpg deleted file mode 100644 index 16d7054e..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.3e8ddcf3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.4d3f86e3.jpg b/learning/.vuepress/dist/assets/img/7.4d3f86e3.jpg deleted file mode 100644 index 2709e75e..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.4d3f86e3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.662c3152.jpg b/learning/.vuepress/dist/assets/img/7.662c3152.jpg deleted file mode 100644 index 9bd87805..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.662c3152.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.7ff53810.jpg b/learning/.vuepress/dist/assets/img/7.7ff53810.jpg deleted file mode 100644 index 3d71ad73..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.7ff53810.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.84e9f7d6.jpg b/learning/.vuepress/dist/assets/img/7.84e9f7d6.jpg deleted file mode 100644 index d55c7251..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.84e9f7d6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.a6e070a6.jpg b/learning/.vuepress/dist/assets/img/7.a6e070a6.jpg deleted file mode 100644 index b33c16b1..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.a6e070a6.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.a8ef541f.jpg b/learning/.vuepress/dist/assets/img/7.a8ef541f.jpg deleted file mode 100644 index 47c8bb74..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.a8ef541f.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.abae2919.jpg b/learning/.vuepress/dist/assets/img/7.abae2919.jpg deleted file mode 100644 index a2f2c1c4..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.abae2919.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.addb94af.jpg b/learning/.vuepress/dist/assets/img/7.addb94af.jpg deleted file mode 100644 index 29b80683..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.addb94af.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.c99ba323.jpg b/learning/.vuepress/dist/assets/img/7.c99ba323.jpg deleted file mode 100644 index e6af6557..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.c99ba323.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.dc3e1d79.jpg b/learning/.vuepress/dist/assets/img/7.dc3e1d79.jpg deleted file mode 100644 index ebdd1f16..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.dc3e1d79.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.dd25f1d8.jpg b/learning/.vuepress/dist/assets/img/7.dd25f1d8.jpg deleted file mode 100644 index 31b72e6a..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.dd25f1d8.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.efb587cb.png b/learning/.vuepress/dist/assets/img/7.efb587cb.png deleted file mode 100644 index 2901edf3..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.efb587cb.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/7.f1547150.gif b/learning/.vuepress/dist/assets/img/7.f1547150.gif deleted file mode 100644 index 35524ba0..00000000 Binary files a/learning/.vuepress/dist/assets/img/7.f1547150.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.16885cbd.jpg b/learning/.vuepress/dist/assets/img/8.16885cbd.jpg deleted file mode 100644 index e75362ff..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.16885cbd.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.170082ec.jpg b/learning/.vuepress/dist/assets/img/8.170082ec.jpg deleted file mode 100644 index 9a642dd1..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.170082ec.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.29b9373e.jpg b/learning/.vuepress/dist/assets/img/8.29b9373e.jpg deleted file mode 100644 index a442e4ec..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.29b9373e.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.2d128253.jpg b/learning/.vuepress/dist/assets/img/8.2d128253.jpg deleted file mode 100644 index c8a69637..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.2d128253.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.3632bf0c.jpg b/learning/.vuepress/dist/assets/img/8.3632bf0c.jpg deleted file mode 100644 index 9aa7da7b..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.3632bf0c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.68ddf420.png b/learning/.vuepress/dist/assets/img/8.68ddf420.png deleted file mode 100644 index a2bb580c..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.68ddf420.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.7a33313c.jpg b/learning/.vuepress/dist/assets/img/8.7a33313c.jpg deleted file mode 100644 index 38f40089..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.7a33313c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.af52760a.jpg b/learning/.vuepress/dist/assets/img/8.af52760a.jpg deleted file mode 100644 index bb12b7fb..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.af52760a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.c7dee1ef.gif b/learning/.vuepress/dist/assets/img/8.c7dee1ef.gif deleted file mode 100644 index 5188dd4e..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.c7dee1ef.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.e26022ef.gif b/learning/.vuepress/dist/assets/img/8.e26022ef.gif deleted file mode 100644 index 66c3a93b..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.e26022ef.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.e6a571aa.jpg b/learning/.vuepress/dist/assets/img/8.e6a571aa.jpg deleted file mode 100644 index 17dcc0fa..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.e6a571aa.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.ec06de5a.jpg b/learning/.vuepress/dist/assets/img/8.ec06de5a.jpg deleted file mode 100644 index ef037b96..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.ec06de5a.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/8.fb3c4977.jpg b/learning/.vuepress/dist/assets/img/8.fb3c4977.jpg deleted file mode 100644 index b6797c1c..00000000 Binary files a/learning/.vuepress/dist/assets/img/8.fb3c4977.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.09f2ebf9.jpg b/learning/.vuepress/dist/assets/img/9.09f2ebf9.jpg deleted file mode 100644 index 2106da05..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.09f2ebf9.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.1ef32719.jpg b/learning/.vuepress/dist/assets/img/9.1ef32719.jpg deleted file mode 100644 index 22f4dae7..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.1ef32719.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.360c4c9d.jpg b/learning/.vuepress/dist/assets/img/9.360c4c9d.jpg deleted file mode 100644 index 50692c6b..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.360c4c9d.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.6fc15e39.jpg b/learning/.vuepress/dist/assets/img/9.6fc15e39.jpg deleted file mode 100644 index 996583f4..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.6fc15e39.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.72fd97d3.gif b/learning/.vuepress/dist/assets/img/9.72fd97d3.gif deleted file mode 100644 index 9230e8a0..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.72fd97d3.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.730e40a3.jpg b/learning/.vuepress/dist/assets/img/9.730e40a3.jpg deleted file mode 100644 index 83bfc720..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.730e40a3.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.82e35d01.jpg b/learning/.vuepress/dist/assets/img/9.82e35d01.jpg deleted file mode 100644 index 99e34e7d..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.82e35d01.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.99919de2.png b/learning/.vuepress/dist/assets/img/9.99919de2.png deleted file mode 100644 index c6453f9c..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.99919de2.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.b5669156.jpg b/learning/.vuepress/dist/assets/img/9.b5669156.jpg deleted file mode 100644 index 0aadeec0..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.b5669156.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.ceb7e1fe.jpg b/learning/.vuepress/dist/assets/img/9.ceb7e1fe.jpg deleted file mode 100644 index eaea95ed..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.ceb7e1fe.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.e544788a.jpeg b/learning/.vuepress/dist/assets/img/9.e544788a.jpeg deleted file mode 100644 index 60d39f14..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.e544788a.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.f04372f5.png b/learning/.vuepress/dist/assets/img/9.f04372f5.png deleted file mode 100644 index 4b0267aa..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.f04372f5.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.f90fe0ae.jpg b/learning/.vuepress/dist/assets/img/9.f90fe0ae.jpg deleted file mode 100644 index b346cd7d..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.f90fe0ae.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/9.fb258924.jpg b/learning/.vuepress/dist/assets/img/9.fb258924.jpg deleted file mode 100644 index 898264de..00000000 Binary files a/learning/.vuepress/dist/assets/img/9.fb258924.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/bubbleSort.b7d216a5.gif b/learning/.vuepress/dist/assets/img/bubbleSort.b7d216a5.gif deleted file mode 100644 index 5f767d45..00000000 Binary files a/learning/.vuepress/dist/assets/img/bubbleSort.b7d216a5.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/bucket.414dd7da.gif b/learning/.vuepress/dist/assets/img/bucket.414dd7da.gif deleted file mode 100644 index 3137e0fb..00000000 Binary files a/learning/.vuepress/dist/assets/img/bucket.414dd7da.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/countingSort.827d96b8.gif b/learning/.vuepress/dist/assets/img/countingSort.827d96b8.gif deleted file mode 100644 index df987af7..00000000 Binary files a/learning/.vuepress/dist/assets/img/countingSort.827d96b8.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/heapSort.658d0f58.gif b/learning/.vuepress/dist/assets/img/heapSort.658d0f58.gif deleted file mode 100644 index 653e17b7..00000000 Binary files a/learning/.vuepress/dist/assets/img/heapSort.658d0f58.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/home-bg.7b267d7c.jpg b/learning/.vuepress/dist/assets/img/home-bg.7b267d7c.jpg deleted file mode 100644 index 02d4a81b..00000000 Binary files a/learning/.vuepress/dist/assets/img/home-bg.7b267d7c.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/insertionSort.be81c151.gif b/learning/.vuepress/dist/assets/img/insertionSort.be81c151.gif deleted file mode 100644 index bab6db57..00000000 Binary files a/learning/.vuepress/dist/assets/img/insertionSort.be81c151.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/mergeSort.9541d116.gif b/learning/.vuepress/dist/assets/img/mergeSort.9541d116.gif deleted file mode 100644 index 3f0adb94..00000000 Binary files a/learning/.vuepress/dist/assets/img/mergeSort.9541d116.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/quickSort.71c0f1c0.gif b/learning/.vuepress/dist/assets/img/quickSort.71c0f1c0.gif deleted file mode 100644 index 6a3faec9..00000000 Binary files a/learning/.vuepress/dist/assets/img/quickSort.71c0f1c0.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/radixSort.6690b105.gif b/learning/.vuepress/dist/assets/img/radixSort.6690b105.gif deleted file mode 100644 index f5f8c801..00000000 Binary files a/learning/.vuepress/dist/assets/img/radixSort.6690b105.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/selectionSort.44be35da.gif b/learning/.vuepress/dist/assets/img/selectionSort.44be35da.gif deleted file mode 100644 index 17a2cc7b..00000000 Binary files a/learning/.vuepress/dist/assets/img/selectionSort.44be35da.gif and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/sort-0.7ce95224.png b/learning/.vuepress/dist/assets/img/sort-0.7ce95224.png deleted file mode 100644 index eafe9d6e..00000000 Binary files a/learning/.vuepress/dist/assets/img/sort-0.7ce95224.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/img/sort-1.5b9670d7.png b/learning/.vuepress/dist/assets/img/sort-1.5b9670d7.png deleted file mode 100644 index 7935fff2..00000000 Binary files a/learning/.vuepress/dist/assets/img/sort-1.5b9670d7.png and /dev/null differ diff --git a/learning/.vuepress/dist/assets/js/1.7d73e1ec.js b/learning/.vuepress/dist/assets/js/1.7d73e1ec.js deleted file mode 100644 index 6d7829fc..00000000 --- a/learning/.vuepress/dist/assets/js/1.7d73e1ec.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{361:function(t,e,n){"use strict";e.a={data:function(){return{recoShowModule:!1}},mounted:function(){this.recoShowModule=!0},destroyed:function(){this.recoShowModule=!1}}},363:function(t,e,n){"use strict";n(106);var o={name:"ModuleTransition",props:{delay:{type:String,default:"0"},duration:{type:String,default:".25"}},methods:{setStyle:function(t){t.style.transition="all ".concat(this.duration,"s ease-in-out ").concat(this.delay,"s"),t.style.transform="translateY(-20px)",t.style.opacity=0},unsetStyle:function(t){t.style.transform="translateY(0)",t.style.opacity=1}}},i=(n(441),n(3)),s=Object(i.a)(o,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"module"},on:{enter:this.setStyle,"after-enter":this.unsetStyle,"before-leave":this.setStyle}},[this._t("default")],2)}),[],!1,null,null,null);e.a=s.exports},377:function(t,e,n){var o=n(0),i=n(422);o({global:!0,forced:parseInt!=i},{parseInt:i})},378:function(t,e,n){var o=n(12),i="["+n(383)+"]",s=RegExp("^"+i+i+"*"),a=RegExp(i+i+"*$"),r=function(t){return function(e){var n=String(o(e));return 1&t&&(n=n.replace(s,"")),2&t&&(n=n.replace(a,"")),n}};t.exports={start:r(1),end:r(2),trim:r(3)}},380:function(t,e,n){"use strict";n(75),n(32),n(28),n(108),n(377),n(413);var o={data:function(){return{query:"",focused:!1,focusIndex:0,placeholder:void 0}},mounted:function(){this.placeholder=this.$site.themeConfig.searchPlaceholder||""},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site.pages,n=this.$site.themeConfig.searchMaxSuggestions,o=this.$localePath,i=function(e){return e&&e.title&&e.title.toLowerCase().indexOf(t)>-1},s=[],a=0;a=n);a++){var r=e[a];if(this.getPageLocalePath(r)===o)if(i(r))s.push(r);else if(r.headers)for(var l=0;l=n);l++){var c=r.headers[l];i(c)&&s.push(Object.assign({},r,{path:r.path+"#"+c.slug,header:c}))}}return s}},alignRight:function(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},methods:{getPageLocalePath:function(t){for(var e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},onUp:function(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown:function(){this.showSuggestions&&(this.focusIndex "+t._s(e.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,a=(n(425),Object(i.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),r=(n(106),n(176),n(426),n(111),n(77),n(181),n(26),n(182),n(183),n(30),n(414),n(22)),l=n(412),c=n(420),u={components:{NavLink:l.a,DropdownTransition:c.a},data:function(){return{open:!1}},props:{item:{required:!0}},methods:{toggle:function(){this.open=!this.open}}},d=(n(430),Object(i.a)(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[n("a",{staticClass:"dropdown-title",on:{click:t.toggle}},[n("span",{staticClass:"title"},[n("i",{class:"iconfont "+t.item.icon}),t._v("\n "+t._s(t.item.text)+"\n ")]),t._v(" "),n("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(e,o){return n("li",{key:e.link||o,staticClass:"dropdown-item"},["links"===e.type?n("h4",[t._v(t._s(e.text))]):t._e(),t._v(" "),"links"===e.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(e.items,(function(t){return n("li",{key:t.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:t}})],1)})),0):n("NavLink",{attrs:{item:e}})],1)})),0)])],1)}),[],!1,null,null,null).exports),h=n(49),f={components:{NavLink:l.a,DropdownLink:d},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$themeConfig.nav||[]},nav:function(){var t=this,e=this.$site.locales,n=this.userNav;if(e&&Object.keys(e).length>1){var o=this.$page.path,i=this.$router.options.routes,s=this.$themeConfig.locales||{},a={text:this.$themeLocaleConfig.selectText||"Languages",items:Object.keys(e).map((function(n){var a,r=e[n],l=s[n]&&s[n].label||r.lang;return r.lang===t.$lang?a=o:(a=o.replace(t.$localeConfig.path,n),i.some((function(t){return t.path===a}))||(a=n)),{text:l,link:a}}))};return[].concat(Object(r.a)(n),[a])}var l=this.$themeConfig.blogConfig||{},c=n.some((function(t){return!l.category||t.text===(l.category.text||"分类")})),u=n.some((function(t){return!l.tag||t.text===(l.tag.text||"标签")}));if(!c&&Object.hasOwnProperty.call(l,"category")){var d=l.category,h=this.$categories;n.splice(parseInt(d.location||2)-1,0,{items:h.list.map((function(t){return t.link=t.path,t.text=t.name,t})),text:d.text||"分类",type:"links",icon:"reco-category"})}if(!u&&Object.hasOwnProperty.call(l,"tag")){var f=l.tag;n.splice(parseInt(f.location||3)-1,0,{link:"/tag/",text:f.text||"标签",type:"links",icon:"reco-tag"})}return n},userLinks:function(){return(this.nav||[]).map((function(t){return Object.assign(Object(h.l)(t),{items:(t.items||[]).map(h.l)})}))},repoLink:function(){var t=this.$themeConfig.repo;return t?/^https?:/.test(t)?t:"https://github.com/".concat(t):""},repoLabel:function(){if(this.repoLink){if(this.$themeConfig.repoLabel)return this.$themeConfig.repoLabel;for(var t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"],n=0;n=18?"dark":"light")}}else b(t)}var y={name:"ModeOptions",data:function(){return{modeOptions:[{mode:"dark",title:"dark"},{mode:"auto",title:"auto"},{mode:"light",title:"light"}],currentMode:"auto"}},mounted:function(){this.currentMode=localStorage.getItem("mode")||this.$themeConfig.mode||"auto";var t=this;window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){"auto"===t.$data.currentMode&&_(t.$data.currentMode)})),window.matchMedia("(prefers-color-scheme: light)").addListener((function(){"auto"===t.$data.currentMode&&_(t.$data.currentMode)})),_(this.currentMode)},methods:{selectMode:function(t){t!==this.currentMode&&(this.currentMode=t,_(t),localStorage.setItem("mode",t))},getClass:function(t){return t!==this.currentMode?t:"".concat(t," active")}}},k=(n(433),Object(i.a)(y,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"mode-options"},[n("h4",{staticClass:"title"},[t._v("Choose mode")]),t._v(" "),n("ul",{staticClass:"color-mode-options"},t._l(t.modeOptions,(function(e,o){return n("li",{key:o,class:t.getClass(e.mode),on:{click:function(n){return t.selectMode(e.mode)}}},[t._v(t._s(e.title))])})),0)])}),[],!1,null,null,null).exports),w={name:"UserSettings",directives:{"click-outside":m.a},components:{ModePicker:k},data:function(){return{showMenu:!1}},mounted:function(){var t=this.$themeConfig.mode||"auto";!1===this.$themeConfig.modePicker&&("auto"===t&&(window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){_(t)})),window.matchMedia("(prefers-color-scheme: light)").addListener((function(){_(t)}))),_(t))},methods:{hideMenu:function(){this.showMenu=!1}}};n(434);function x(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var C={components:{SidebarButton:a,NavLinks:p,SearchBox:s,AlgoliaSearchBox:{},Mode:Object(i.a)(w,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return!1!==t.$themeConfig.modePicker?n("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.hideMenu,expression:"hideMenu"}],staticClass:"color-picker"},[n("a",{staticClass:"color-button",on:{click:function(e){e.preventDefault(),t.showMenu=!t.showMenu}}},[n("i",{staticClass:"iconfont reco-color"})]),t._v(" "),n("transition",{attrs:{name:"menu-transition",mode:"out-in"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.showMenu,expression:"showMenu"}],staticClass:"color-picker-menu"},[n("ModePicker")],1)])],1):t._e()}),[],!1,null,null,null).exports},data:function(){return{linksWrapMaxWidth:null}},mounted:function(){var t=this,e=parseInt(x(this.$el,"paddingLeft"))+parseInt(x(this.$el,"paddingRight")),n=function(){document.documentElement.clientWidth<719?t.linksWrapMaxWidth=null:t.linksWrapMaxWidth=t.$el.offsetWidth-e-(t.$refs.siteName&&t.$refs.siteName.offsetWidth||0)};n(),window.addEventListener("resize",n,!1)},computed:{algolia:function(){return this.$themeLocaleConfig.algolia||this.$themeConfig.algolia||{}},isAlgoliaSearch:function(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}}},$=(n(435),Object(i.a)(C,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("header",{staticClass:"navbar"},[n("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),n("router-link",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$themeConfig.logo?n("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?n("span",{ref:"siteName",staticClass:"site-name"},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),n("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[n("Mode"),t._v(" "),t.isAlgoliaSearch?n("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$themeConfig.search&&!1!==t.$frontmatter.search?n("SearchBox"):t._e(),t._v(" "),n("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null).exports),S=n(418),T=n(419),O={name:"Sidebar",components:{SidebarLinks:S.default,NavLinks:p,PersonalInfo:T.a},props:["items"]},I=(n(439),Object(i.a)(O,(function(){var t=this.$createElement,e=this._self._c||t;return e("aside",{staticClass:"sidebar"},[e("PersonalInfo"),this._v(" "),e("NavLinks"),this._v(" "),this._t("top"),this._v(" "),e("SidebarLinks",{attrs:{depth:0,items:this.items}}),this._v(" "),this._t("bottom")],2)}),[],!1,null,null,null).exports),L=(n(50),n(415)),M=n.n(L),P=n(363),E=n(361),j={mixins:[E.a],components:{ModuleTransition:P.a},props:{isPage:{type:Boolean,default:!1}},name:"Password",data:function(){return{warningText:"Konck! Knock!",key:""}},computed:{year:function(){return(new Date).getFullYear()}},methods:{inter:function(){var t=this.key,e=this.isPage,n=this.isHasPageKey,o=this.isHasKey,i=this.$refs.passwordBtn,s=M()(t.trim()),a="pageKey".concat(window.location.pathname),r=e?a:"key";if(sessionStorage.setItem(r,s),e?n():o()){this.warningText="Key Success";var l=document.getElementById("box").style.width;i.style.width="".concat(l-2,"px"),i.style.opacity=1,setTimeout((function(){window.location.reload()}),800)}else this.warningText="Key Error"},inputFocus:function(){this.warningText="Input Your Key"},inputBlur:function(){this.warningText="Konck! Knock!"},isHasKey:function(){var t=this.$themeConfig.keyPage.keys;return(t=t.map((function(t){return t.toLowerCase()}))).indexOf(sessionStorage.getItem("key"))>-1},isHasPageKey:function(){var t=this.$frontmatter.keys.map((function(t){return t.toLowerCase()})),e="pageKey".concat(window.location.pathname);return t&&t.indexOf(sessionStorage.getItem(e))>-1}}},B=(n(442),Object(i.a)(j,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"password-shadow"},[n("ModuleTransition",[n("h3",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"title"},[t._v(t._s(t.isPage?t.$frontmatter.title:t.$site.title||t.$localeConfig.title))])]),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&!t.isPage?n("p",{staticClass:"description"},[t._v(t._s(t.$site.description||t.$localeConfig.description))]):t._e()]),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.16"}},[n("label",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"inputBox",attrs:{id:"box"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.key,expression:"key"}],attrs:{type:"password"},domProps:{value:t.key},on:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.inter(e)},focus:t.inputFocus,blur:t.inputBlur,input:function(e){e.target.composing||(t.key=e.target.value)}}}),t._v(" "),n("span",[t._v(t._s(t.warningText))]),t._v(" "),n("button",{ref:"passwordBtn",on:{click:t.inter}},[t._v("OK")])])]),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.24"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"footer"},[n("span",[n("i",{staticClass:"iconfont reco-theme"}),t._v(" "),n("a",{attrs:{target:"blank",href:"https://vuepress-theme-reco.recoluan.com"}},[t._v("vuePress-theme-reco")])]),t._v(" "),n("span",[n("i",{staticClass:"iconfont reco-copyright"}),t._v(" "),n("a",[t.$themeConfig.author||t.$site.title?n("span",[t._v(t._s(t.$themeConfig.author||t.$site.title))]):t._e(),t._v("\n   \n "),t.$themeConfig.startYear&&t.$themeConfig.startYear!=t.year?n("span",[t._v(t._s(t.$themeConfig.startYear)+" - ")]):t._e(),t._v("\n "+t._s(t.year)+"\n ")])])])])],1)}),[],!1,null,"64685f0e",null).exports),H=n(443),K={mixins:[E.a],components:{Sidebar:I,Navbar:$,Password:B},props:{sidebar:{type:Boolean,default:!0}},data:function(){return{isSidebarOpen:!1,isHasKey:!0,isHasPageKey:!0,firstLoad:!0}},computed:{absoluteEncryption:function(){return this.$themeConfig.keyPage&&!0===this.$themeConfig.keyPage.absoluteEncryption},shouldShowNavbar:function(){var t=this.$site.themeConfig;return!1!==this.$page.frontmatter.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar:function(){var t=this.$page.frontmatter;return!1!==this.sidebar&&!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems:function(){return Object(h.n)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses:function(){var t=this.$frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted:function(){var t=this;this.$router.afterEach((function(){t.isSidebarOpen=!1})),this.hasKey(),this.hasPageKey(),this.handleLoading()},methods:{hasKey:function(){var t=this.$themeConfig.keyPage;if(t&&t.keys&&0!==t.keys.length){var e=t.keys;e=e.map((function(t){return t.toLowerCase()})),this.isHasKey=e&&e.indexOf(sessionStorage.getItem("key"))>-1}else this.isHasKey=!0},hasPageKey:function(){var t=this.$frontmatter.keys;t&&0!==t.length?(t=t.map((function(t){return t.toLowerCase()})),this.isHasPageKey=t.indexOf(sessionStorage.getItem("pageKey".concat(window.location.pathname)))>-1):this.isHasPageKey=!0},toggleSidebar:function(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen},onTouchStart:function(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd:function(t){var e=t.changedTouches[0].clientX-this.touchStart.x,n=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(n)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))},handleLoading:function(){var t=this,e=this.$frontmatter.home&&null==sessionStorage.getItem("firstLoad")?1e3:0;Object(H.setTimeout)((function(){t.firstLoad=!1,null==sessionStorage.getItem("firstLoad")&&sessionStorage.setItem("firstLoad",!1)}),e)}},watch:{$frontmatter:function(t,e){this.hasKey(),this.hasPageKey()}}},N=(n(445),Object(i.a)(K,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.absoluteEncryption?n("div",[n("transition",{attrs:{name:"fade"}},[t.firstLoad?n("LoadingPage"):t.isHasKey?n("div",[t.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),n("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar}},[t._t("sidebar-top",null,{slot:"top"}),t._v(" "),t._t("sidebar-bottom",null,{slot:"bottom"})],2),t._v(" "),t.isHasPageKey?n("div",[t._t("default")],2):n("Password",{attrs:{isPage:!0}})],1):n("Password")],1)],1):n("div",[n("transition",{attrs:{name:"fade"}},[n("LoadingPage",{directives:[{name:"show",rawName:"v-show",value:t.firstLoad,expression:"firstLoad"}],staticClass:"loading-wrapper"})],1),t._v(" "),n("transition",{attrs:{name:"fade"}},[n("Password",{directives:[{name:"show",rawName:"v-show",value:!t.isHasKey,expression:"!isHasKey"}],key:"out",staticClass:"password-wrapper-out"})],1),t._v(" "),n("div",{class:{hide:t.firstLoad||!t.isHasKey}},[t.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),n("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar}},[t._t("sidebar-top",null,{slot:"top"}),t._v(" "),t._t("sidebar-bottom",null,{slot:"bottom"})],2),t._v(" "),n("Password",{directives:[{name:"show",rawName:"v-show",value:!t.isHasPageKey,expression:"!isHasPageKey"}],key:"in",staticClass:"password-wrapper-in",attrs:{isPage:!0}}),t._v(" "),n("div",{class:{hide:!t.isHasPageKey}},[t._t("default")],2)],1)],1)])}),[],!1,null,"19557b78",null));e.a=N.exports},383:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},384:function(t,e,n){},385:function(t,e,n){},386:function(t,e,n){},387:function(t,e,n){},388:function(t,e,n){},389:function(t,e,n){},390:function(t,e,n){},391:function(t,e,n){},392:function(t,e,n){},393:function(t,e,n){},394:function(t,e,n){},395:function(t,e,n){},396:function(t,e,n){},397:function(t,e,n){},398:function(t,e,n){},412:function(t,e,n){"use strict";n(176),n(77),n(414);var o=n(49),i={props:{item:{required:!0}},computed:{link:function(){return Object(o.c)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some((function(e){return e===t.link})):"/"===this.link}},methods:{isExternal:o.h,isMailto:o.i,isTel:o.j}},s=n(3),a=Object(s.a)(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isExternal(t.link)?n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.isMailto(t.link)||t.isTel(t.link)?null:"_blank",rel:t.isMailto(t.link)||t.isTel(t.link)?null:"noopener noreferrer"}},[n("i",{class:"iconfont "+t.item.icon}),t._v("\n "+t._s(t.item.text)+"\n "),n("OutboundLink")],1):n("router-link",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact}},[n("i",{class:"iconfont "+t.item.icon}),t._v("\n "+t._s(t.item.text)+"\n")])}),[],!1,null,null,null);e.a=a.exports},413:function(t,e,n){"use strict";var o=n(0),i=n(378).trim;o({target:"String",proto:!0,forced:n(423)("trim")},{trim:function(){return i(this)}})},414:function(t,e,n){"use strict";var o=n(0),i=n(427);o({target:"String",proto:!0,forced:n(428)("link")},{link:function(t){return i(this,"a","href",t)}})},415:function(t,e,n){var o,i,s,a,r;o=n(440),i=n(416).utf8,s=n(184),a=n(416).bin,(r=function(t,e){t.constructor==String?t=e&&"binary"===e.encoding?a.stringToBytes(t):i.stringToBytes(t):s(t)?t=Array.prototype.slice.call(t,0):Array.isArray(t)||(t=t.toString());for(var n=o.bytesToWords(t),l=8*t.length,c=1732584193,u=-271733879,d=-1732584194,h=271733878,f=0;f>>24)|4278255360&(n[f]<<24|n[f]>>>8);n[l>>>5]|=128<>>9<<4)]=l;var p=r._ff,g=r._gg,m=r._hh,v=r._ii;for(f=0;f>>0,u=u+_>>>0,d=d+y>>>0,h=h+k>>>0}return o.endian([c,u,d,h])})._ff=function(t,e,n,o,i,s,a){var r=t+(e&n|~e&o)+(i>>>0)+a;return(r<>>32-s)+e},r._gg=function(t,e,n,o,i,s,a){var r=t+(e&o|n&~o)+(i>>>0)+a;return(r<>>32-s)+e},r._hh=function(t,e,n,o,i,s,a){var r=t+(e^n^o)+(i>>>0)+a;return(r<>>32-s)+e},r._ii=function(t,e,n,o,i,s,a){var r=t+(n^(e|~o))+(i>>>0)+a;return(r<>>32-s)+e},r._blocksize=16,r._digestsize=16,t.exports=function(t,e){if(null==t)throw new Error("Illegal argument "+t);var n=o.wordsToBytes(r(t,e));return e&&e.asBytes?n:e&&e.asString?a.bytesToString(n):o.bytesToHex(n)}},416:function(t,e){var n={utf8:{stringToBytes:function(t){return n.bin.stringToBytes(unescape(encodeURIComponent(t)))},bytesToString:function(t){return decodeURIComponent(escape(n.bin.bytesToString(t)))}},bin:{stringToBytes:function(t){for(var e=[],n=0;n5&&void 0!==arguments[5]?arguments[5]:1;return!e||a>s?null:t("ul",{class:"sidebar-sub-headers"},e.map((function(e){var c=Object(o.g)(i,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[r(t,n+"#"+e.slug,e.title,c),l(t,e.children,n,i,s,a+1)])})))}var c={functional:!0,props:["item","sidebarDepth"],render:function(t,e){var n=e.parent,i=n.$page,s=(n.$site,n.$route),a=n.$themeConfig,c=n.$themeLocaleConfig,u=e.props,d=u.item,h=u.sidebarDepth,f=Object(o.g)(s,d.path),p="auto"===d.type?f||d.children.some((function(t){return Object(o.g)(s,d.basePath+"#"+t.slug)})):f,g=r(t,d.path,d.title||d.path,p),m=i.frontmatter.sidebarDepth||h||c.sidebarDepth||a.sidebarDepth,v=null==m?1:m,b=c.displayAllHeaders||a.displayAllHeaders;return"auto"===d.type?[g,l(t,d.children,d.basePath,s,v)]:(p||b)&&d.headers&&!o.f.test(d.path)?[g,l(t,Object(o.e)(d.headers),d.path,s,v)]:g}};n(437);var u={name:"SidebarLinks",components:{SidebarGroup:a,SidebarLink:Object(s.a)(c,void 0,void 0,!1,null,null,null).exports},props:["items","depth","sidebarDepth"],data:function(){return{openGroupIndex:0}},created:function(){this.refreshIndex()},watch:{$route:function(){this.refreshIndex()}},mounted:function(){this.activationLink(),this.isInViewPortOfOne()},updated:function(){this.isInViewPortOfOne()},methods:{activationLink:function(){var t=decodeURIComponent(this.$route.fullPath);if(t&&""!=t)for(var e=[].slice.call(document.querySelectorAll(".sidebar-link")),n=0;n=s||(t.scrollTop=o-5)}},refreshIndex:function(){var t=function(t,e){for(var n=0;n-1&&(this.openGroupIndex=t)},toggleGroup:function(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive:function(t){return Object(o.g)(this.$route,t.regularPath)}}},d=Object(s.a)(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.items.length?n("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(e,o){return n("li",{key:o},["group"===e.type?n("SidebarGroup",{attrs:{item:e,open:o===t.openGroupIndex,collapsable:e.collapsable||e.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(o)}}}):n("SidebarLink",{attrs:{sidebarDepth:t.sidebarDepth,item:e}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=d.exports},419:function(t,e,n){"use strict";var o={computed:{homeBlogCfg:function(){return this.$recoLocals.homeBlog}}},i=(n(438),n(3)),s=Object(i.a)(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"personal-info-wrapper"},[t.$themeConfig.authorAvatar?n("img",{staticClass:"personal-img",attrs:{src:t.$withBase(t.$themeConfig.authorAvatar),alt:"author-avatar"}}):t._e(),t._v(" "),t.$themeConfig.author||t.$site.title?n("h3",{staticClass:"name"},[t._v("\n "+t._s(t.$themeConfig.author||t.$site.title)+"\n ")]):t._e(),t._v(" "),n("div",{staticClass:"num"},[n("div",[n("h3",[t._v(t._s(t.$recoPosts.length))]),t._v(" "),n("h6",[t._v(t._s(t.homeBlogCfg.article))])]),t._v(" "),n("div",[n("h3",[t._v(t._s(t.$tags.list.length))]),t._v(" "),n("h6",[t._v(t._s(t.homeBlogCfg.tag))])])]),t._v(" "),n("hr")])}),[],!1,null,"b038cec6",null);e.a=s.exports},420:function(t,e,n){"use strict";var o={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},i=(n(429),n(3)),s=Object(i.a)(o,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.a=s.exports},422:function(t,e,n){var o=n(4),i=n(378).trim,s=n(383),a=o.parseInt,r=/^[+-]?0[Xx]/,l=8!==a(s+"08")||22!==a(s+"0x16");t.exports=l?function(t,e){var n=i(String(t));return a(n,e>>>0||(r.test(n)?16:10))}:a},423:function(t,e,n){var o=n(1),i=n(383);t.exports=function(t){return o((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},424:function(t,e,n){"use strict";var o=n(384);n.n(o).a},425:function(t,e,n){"use strict";var o=n(385);n.n(o).a},426:function(t,e,n){"use strict";var o=n(0),i=n(109),s=n(31),a=n(11),r=n(13),l=n(110),c=n(78),u=n(53),d=n(20),h=u("splice"),f=d("splice",{ACCESSORS:!0,0:0,1:2}),p=Math.max,g=Math.min;o({target:"Array",proto:!0,forced:!h||!f},{splice:function(t,e){var n,o,u,d,h,f,m=r(this),v=a(m.length),b=i(t,v),_=arguments.length;if(0===_?n=o=0:1===_?(n=0,o=v-b):(n=_-2,o=g(p(s(e),0),v-b)),v+n-o>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,o),d=0;dv-o+n;d--)delete m[d-1]}else if(n>o)for(d=v-o;d>b;d--)f=d+n-1,(h=d+o-1)in m?m[f]=m[h]:delete m[f];for(d=0;d"+a+""}},428:function(t,e,n){var o=n(1);t.exports=function(t){return o((function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}))}},429:function(t,e,n){"use strict";var o=n(386);n.n(o).a},430:function(t,e,n){"use strict";var o=n(387);n.n(o).a},431:function(t,e,n){"use strict";var o=n(388);n.n(o).a},432:function(t,e){function n(t){return"function"==typeof t.value||(console.warn("[Vue-click-outside:] provided expression",t.expression,"is not a function."),!1)}function o(t){return void 0!==t.componentInstance&&t.componentInstance.$isServer}t.exports={bind:function(t,e,i){if(!n(e))return;function s(e){if(i.context){var n=e.path||e.composedPath&&e.composedPath();n&&n.length>0&&n.unshift(e.target),t.contains(e.target)||function(t,e){if(!t||!e)return!1;for(var n=0,o=e.length;n>>32-e},rotr:function(t,e){return t<<32-e|t>>>e},endian:function(t){if(t.constructor==Number)return 16711935&o.rotl(t,8)|4278255360&o.rotl(t,24);for(var e=0;e0;t--)e.push(Math.floor(256*Math.random()));return e},bytesToWords:function(t){for(var e=[],n=0,o=0;n>>5]|=t[n]<<24-o%32;return e},wordsToBytes:function(t){for(var e=[],n=0;n<32*t.length;n+=8)e.push(t[n>>>5]>>>24-n%32&255);return e},bytesToHex:function(t){for(var e=[],n=0;n>>4).toString(16)),e.push((15&t[n]).toString(16));return e.join("")},hexToBytes:function(t){for(var e=[],n=0;n>>6*(3-s)&63)):e.push("=");return e.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/gi,"");for(var e=[],o=0,i=0;o>>6-2*i);return e}},t.exports=o},441:function(t,e,n){"use strict";var o=n(396);n.n(o).a},442:function(t,e,n){"use strict";var o=n(397);n.n(o).a},443:function(t,e,n){var o="undefined"!=typeof global&&global||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function s(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new s(i.call(setTimeout,o,arguments),clearTimeout)},e.setInterval=function(){return new s(i.call(setInterval,o,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},s.prototype.unref=s.prototype.ref=function(){},s.prototype.close=function(){this._clearFn.call(o,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout((function(){t._onTimeout&&t._onTimeout()}),e))},n(444),e.setImmediate="undefined"!=typeof self&&self.setImmediate||"undefined"!=typeof global&&global.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||"undefined"!=typeof global&&global.clearImmediate||this&&this.clearImmediate},444:function(t,e){!function(t,e){"use strict";if(!t.setImmediate){var n,o,i,s,a,r=1,l={},c=!1,u=t.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(t);d=d&&d.setTimeout?d:t,"[object process]"==={}.toString.call(t.process)?n=function(t){process.nextTick((function(){f(t)}))}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=n,e}}()?t.MessageChannel?((i=new MessageChannel).port1.onmessage=function(t){f(t.data)},n=function(t){i.port2.postMessage(t)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,n=function(t){var e=u.createElement("script");e.onreadystatechange=function(){f(t),e.onreadystatechange=null,o.removeChild(e),e=null},o.appendChild(e)}):n=function(t){setTimeout(f,0,t)}:(s="setImmediate$"+Math.random()+"$",a=function(e){e.source===t&&"string"==typeof e.data&&0===e.data.indexOf(s)&&f(+e.data.slice(s.length))},t.addEventListener?t.addEventListener("message",a,!1):t.attachEvent("onmessage",a),n=function(e){t.postMessage(s+e,"*")}),d.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),o=0;o= 0) ")])])],1),t._v(" "),a("p",[a("br"),t._v("但是这里我们遇到一个问题,"),a("strong",[t._v("很有可能 dp[i-1] 本身是一个负数")]),t._v("。那这种情况的话,"),a("strong",[t._v("如果 dp[i] 通过 dp[i-1]+nums[i] 来推导,那么结果其实反而变小了")]),t._v(",因为我们 dp[i] 要求的是最大和。所以在这种情况下,"),a("strong",[t._v("如果 dp[i-1] < 0,那么 dp[i] 其实就是 nums[i] 的值")]),t._v("。即")]),t._v(" "),a("br"),t._v(" "),a("blockquote",[a("center",[a("b",[t._v(" dp[i] = nums[i] , if (dp[i-1] < 0) ")])])],1),t._v(" "),a("p",[a("br"),t._v("综上分析,我们可以得到:")]),t._v(" "),a("br"),t._v(" "),a("blockquote",[a("center",[a("b",[t._v(" dp[i]=max(nums[i], dp[i−1]+nums[i]) ")])])],1),t._v(" "),a("p",[a("br"),t._v("得到了状态转移方程,但是我们还需要通过一个已有的状态的进行推导,我们可以想到 "),a("strong",[t._v("dp[0] 一定是以 nums[0] 进行结尾")]),t._v(",所以")]),t._v(" "),a("br"),t._v(" "),a("blockquote",[a("center",[a("b",[t._v(" dp[i] = dp[i-1]+nums[i] , if (dp[i-1] >= 0) ")])]),t._v(" "),a("center",[a("b",[t._v(" dp[0] = nums[0] ")])])],1),t._v(" "),a("p",[a("br"),t._v("在很多题目中,"),a("strong",[t._v("因为 dp[i] 本身就定义成了题目中的问题,所以 dp[i] 最终就是要的答案")]),t._v("。但是这里状态中的定义,"),a("strong",[t._v("并不是题目中要的问题,不能直接返回最后的一个状态 (这一步经常有初学者会摔跟头)")]),t._v("。所以最终的答案,其实我们是寻找:")]),t._v(" "),a("br"),t._v(" "),a("blockquote",[a("center",[a("b",[t._v(" max(dp[0], dp[1], ..., d[i-1], dp[i]) ")])])],1),t._v(" "),a("p",[a("br"),t._v("分析完毕,我们绘制成图(图中假定 nums 为 [-2,1,-3,4,-1,2,1,-5,4]):")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(503),alt:"PNG"}}),t._v(" "),a("h2",{attrs:{id:"_03、go语言示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),a("p",[t._v("根据以上分析,可以得到代码如下:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Go")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("maxSubArray")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tdp "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//设置初始化值 ")]),t._v("\n\tdp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//处理 dp[i-1] < 0 的情况")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tdp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tdp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("_")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" dp "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br")])]),a("p",[t._v("我们可以进一步精简代码为:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Go")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("maxSubArray")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n dp "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tdp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br")])]),a("blockquote",[a("p",[t._v("复杂度分析:时间复杂度:O(N)。空间复杂度:O(N)")])])])}),[],!1,null,null,null);s.default=r.exports},503:function(t,s,n){t.exports=n.p+"assets/img/1.d0382e2a.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/101.eee63711.js b/learning/.vuepress/dist/assets/js/101.eee63711.js deleted file mode 100644 index 77d8e644..00000000 --- a/learning/.vuepress/dist/assets/js/101.eee63711.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{1071:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第344题:反转字符串")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。")])])])]),t._v(" "),n("p",[t._v("不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。")]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入:["h","e","l","l","o"]\n输出:["o","l","l","e","h"]\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入:["H","a","n","n","a","h"]\n输出:["h","a","n","n","a","H"]\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),n("p",[t._v("这是一道相当简单的经典题目,直接上题解:使用双指针进行反转字符串。")]),t._v(" "),n("p",[t._v('假设输入字符串为["h","e","l","l","0"]')]),t._v(" "),n("ul",[n("li",[t._v("定义left和right分别指向首元素和尾元素")]),t._v(" "),n("li",[t._v("当left < right ,进行交换。")]),t._v(" "),n("li",[t._v("交换完毕,left++,right--")]),t._v(" "),n("li",[t._v("直至left == right")])]),t._v(" "),n("p",[t._v("具体过程如下图所示:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(553),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),n("p",[t._v("根据以上分析,我们可以得到下面的题解:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//Go")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverseString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("byte")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tleft "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\tright "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\ts"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\tleft"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n\t\tright"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br")])])])}),[],!1,null,null,null);s.default=e.exports},553:function(t,s,a){t.exports=a.p+"assets/img/1.81971505.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/102.55d0cb83.js b/learning/.vuepress/dist/assets/js/102.55d0cb83.js deleted file mode 100644 index 4f505320..00000000 --- a/learning/.vuepress/dist/assets/js/102.55d0cb83.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{1065:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第387题:字符串中的第一个唯一字符")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1 。")])])])]),s._v(" "),n("p",[n("strong",[s._v("案例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('s = "leetcode"\n返回 0.\n\ns = "loveleetcode",\n返回 2. \n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("**注意事项:**您可以假定该字符串只包含小写字母。")]),s._v(" "),n("blockquote",[n("center",[n("b",[s._v("常考题目,建议自行思考 1-2 分钟先~"),n("b")])])],1),s._v(" "),n("h2",{attrs:{id:"_02、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[s._v("#")]),s._v(" 02、题目图解")]),s._v(" "),n("p",[s._v("题目不难,直接进行分析。由于字母共有 26 个,所以我们可以声明一个 26 个长度的数组(该种方法在本类题型很常用)因为字符串中字母可能是重复的,所以我们可以先进行第一次遍历,在数组中记录"),n("strong",[s._v("每个字母的最后一次出现的所在索引")]),s._v("。然后再通过一次循环,"),n("strong",[s._v("比较各个字母第一次出现的索引是否为最后一次的索引")]),s._v("。如果是,我们就找到了我们的目标,如果不是我们将其设为 -1("),n("strong",[s._v("标示该元素非目标元素")]),s._v(")如果第二次遍历最终没有找到目标,直接返回 -1即可。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("图解如下:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(530),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[s._v("#")]),s._v(" 03、GO语言示例")]),s._v(" "),n("p",[s._v("根据以上分析,可以得到代码如下:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("firstUniqChar")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("26")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" i\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports},530:function(s,t,a){s.exports=a.p+"assets/img/1.458698c8.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/103.3ec46175.js b/learning/.vuepress/dist/assets/js/103.3ec46175.js deleted file mode 100644 index 96828cfc..00000000 --- a/learning/.vuepress/dist/assets/js/103.3ec46175.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{1085:function(_,v,t){"use strict";t.r(v);var r=t(3),s=Object(r.a)({},(function(){var _=this,v=_.$createElement,r=_._self._c||v;return r("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[r("blockquote",[r("p",[_._v("本系列将为大家带来一整套的"),r("strong",[_._v("博弈论问题")]),_._v("。因为在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,而这类问题中,很多都有博弈论的影子存在。这些公司里以FLAG(Facebook, LinkedIn, Amazon, Google)为典型,特别喜欢考察本类题型。同时,本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高分析问题的能力~")])]),_._v(" "),r("h2",{attrs:{id:"_01、什么是-博弈论"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_01、什么是-博弈论"}},[_._v("#")]),_._v(" 01、什么是“博弈论”")]),_._v(" "),r("p",[_._v("古语有云,“笑人情似纸,世事如棋”。生活中每个人如同棋手,其每一个行为如同在一张看不见的棋盘上布子,精明慎重的棋手们相互揣摩、牵制、争赢,下出诸多精彩纷呈、变化多端的棋局。而什么是博弈论?就是研究棋手们 的“出棋” 过程,从中抽象出可逻辑化的部分,并将其系统化的一门科学,也是运筹学的一个重要学科。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("我们从最简单的一道“"),r("strong",[_._v("囚徒困境")]),_._v("”来进行学习~")]),_._v(" "),r("h2",{attrs:{id:"_02、囚徒困境"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_02、囚徒困境"}},[_._v("#")]),_._v(" 02、囚徒困境")]),_._v(" "),r("table",[r("thead",[r("tr",[r("th",[_._v("囚徒困境")])])]),_._v(" "),r("tbody",[r("tr",[r("td",[_._v("一件严重的纵火案发生后,警察在现场抓到两个犯罪嫌疑人。事实上,正是他们一起放火烧了这座仓库。但是,警方没有掌握足够的证据,只得把他们分开囚禁起来,要求他们坦白交代。")])])])]),_._v(" "),r("p",[_._v("在分开囚禁后,警察对其分别告知:")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("如果你坦白,而对方不坦白,则将你释放,判对方8年。")]),_._v(" "),r("p",[_._v("如果你不坦白,而对方坦白,则将对方释放,而判你8年。")]),_._v(" "),r("p",[_._v("如果你两都坦白了,则判你两各自4年。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("那么两个囚犯应该如何做,是互相背叛还是一起合作?")]),_._v(" "),r("br"),_._v(" "),r("p",[r("strong",[_._v("题目分析:")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("从表面上看,其实囚犯最应该的就是一起合作,都不坦白,这样因为证据不足,会将两人都进行释放。但是!因为事实确实是两人放的火,所以他们"),r("strong",[_._v("不得不进行思考,另一人采取了什么样的行为")]),_._v("?")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("犯人甲当然不傻,他根本无法相信同伙不会向警方提供任何信息!因为如果同伙一旦坦白,而自己这边如果什么都没说的话,就可以潇洒而去。但他同时也意识到,他的同伙也不傻,也会同样来这样设想他。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("所以犯人甲的结论是,"),r("strong",[_._v("唯一理性的选择就是背叛同伙")]),_._v(",把一切都告诉警方!这样的话,如果他的同伙笨得只会保持沉默,那么他就会是那个离开的人。而如果他的同伙也根据这个逻辑向警方交代了,那么也没有关系,起码他不必服最重的刑!")]),_._v(" "),r("img",{staticStyle:{zoom:"50%"},attrs:{src:t(668),alt:"img"}}),_._v(" "),r("h2",{attrs:{id:"_03、囚徒困境与纳什均衡"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_03、囚徒困境与纳什均衡"}},[_._v("#")]),_._v(" 03、囚徒困境与纳什均衡")]),_._v(" "),r("p",[_._v("这场博弈的过程,"),r("strong",[_._v("显然不是顾及团体利益的最优解决方案")]),_._v("。以全体利益而言,如果两个参与者都合作保持沉默,两人都可以无罪释放,总体利益更高!但根据假设(人性),二人"),r("strong",[_._v("均为理性的个人")]),_._v(",且只追求自己的个人利益。均衡状况会是两个囚徒都选择背叛,这就是“困境”所在!")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("事实上,这种"),r("strong",[_._v("两人都选择坦白的策略以及因此被判4年的结局")]),_._v("被称作“"),r("strong",[_._v("纳什均衡")]),_._v("”(也叫非合作均衡),换言之,在此情况下,"),r("strong",[_._v("无一参与者可以“独自行动”(即单方面改变决定)而增加收获。")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("我们看一下官方释意是多么难懂“所谓纳什均衡,指的是参与人的一种策略组合,在该策略组合上**,任何参与人单独改变策略都不会得到好处。”**简单点讲,如果在一个策略组合上,当所有其他人都不改变策略时,没有人会改变自己的策略,则该策略组合就是一个纳什均衡。")])])}),[],!1,null,null,null);v.default=s.exports},668:function(_,v,t){_.exports=t.p+"assets/img/1.e921e02f.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/104.d27f675f.js b/learning/.vuepress/dist/assets/js/104.d27f675f.js deleted file mode 100644 index c740380f..00000000 --- a/learning/.vuepress/dist/assets/js/104.d27f675f.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{1091:function(_,v,t){"use strict";t.r(v);var r=t(3),s=Object(r.a)({},(function(){var _=this,v=_.$createElement,r=_._self._c||v;return r("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[r("blockquote",[r("p",[_._v("今天给大家讲解一个博弈论中很有趣的问题,智猪博弈。")])]),_._v(" "),r("h2",{attrs:{id:"_01、智猪博弈"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_01、智猪博弈"}},[_._v("#")]),_._v(" 01、智猪博弈")]),_._v(" "),r("blockquote",[r("p",[_._v("在博弈论(Game Theory)经济学中,“智猪博弈”是一个著名的纳什均衡的例子。如果不了解什么是纳什均衡,可以先看下下面的文章。")])]),_._v(" "),r("p",[r("RouterLink",{attrs:{to:"/1.6.博弈论系列/1.6.博弈论系列/601.html"}},[_._v("博弈论系列 - 囚徒困境")])],1),_._v(" "),r("table",[r("thead",[r("tr",[r("th",[_._v("题目:智猪博弈")])])]),_._v(" "),r("tbody",[r("tr",[r("td",[_._v("假设猪圈里有一头大猪、一头小猪。猪圈的一头有猪食槽,另一头安装着控制猪食供应的按钮,按一下按钮会有10个单位的猪食进槽,,但是按按钮以后跑到食槽所需要付出的劳动量,加起来要消耗相当于2个单位的猪食。并且因为按钮和食槽分置笼子的两端,等到按按钮的猪付出劳动跑到食槽的时候,坐享其成的另一头猪早已吃了不少。")])])])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("如果大猪先到(小猪按),大猪吃掉9个单位,小猪只能吃到1个单位;如果同时到达(也就是一起按),大猪吃掉7个单位,小猪吃到3个单位;如果小猪先到(大猪按),小猪可以吃到4个单位,而大猪吃到6个单位")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("那么,在两头猪都足够聪明的前提下,最终的结果是什么?")]),_._v(" "),r("h2",{attrs:{id:"_02、推导过程"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_02、推导过程"}},[_._v("#")]),_._v(" 02、推导过程")]),_._v(" "),r("blockquote",[r("p",[_._v('"智猪博弈"由约翰·纳什(JohnFNash),于1950年提出。')])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("这个推导过程还是比较简单的。首先小猪如果去按按钮,然后再回来的话,只能吃到一份猪食,直接就嗝屁了,这种可能性肯定是不行的。自然,这时大猪也就只有去按按钮这一个选项了。所以最终的结果会是:"),r("strong",[_._v("小猪选择等待,大猪去按按钮")]),_._v("。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("用博弈论中的报酬矩阵,将图画出来,可能更加有助于大家思考:")]),_._v(" "),r("img",{staticStyle:{zoom:"80%"},attrs:{src:t(684),alt:"PNG"}}),_._v(" "),r("ul",[r("li",[r("p",[_._v("如果小猪和大猪同时行动的话,则它们同时到达食槽,分别得到1个单位和5个单位的纯收益(付出4个单位的成本)")])]),_._v(" "),r("li",[r("p",[_._v("如果大猪行动,小猪等待,小猪可得到4个单位的纯收益,大猪得到的6个单位,付出2个单位的成本,实得4个单位;")])]),_._v(" "),r("li",[r("p",[_._v("如果大猪等待,小猪行动,小猪只能吃到1个单位,则小猪的收入将不抵成本,纯收益为-1。")])]),_._v(" "),r("li",[r("p",[_._v("如果大猪等待,小猪也等待,那么小猪的收益为零,成本也为零,总之,小猪等待还是要优于行动。")])])]),_._v(" "),r("br"),_._v(" "),r("h2",{attrs:{id:"_03、题目意义"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目意义"}},[_._v("#")]),_._v(" 03、题目意义")]),_._v(" "),r("p",[_._v("我猜测会有一些朋友,在看到这样一道题目后,会觉得这不是很简单吗,有什么可说的,其实不是这样。这道题目是一个很经典的“"),r("strong",[_._v("劣势策略”下的可预测问题")]),_._v(",其在各高校经济学课程中也被放在一个举足轻重的地位上。原因无他,正是大猪做出这样一个“决策”,目的不是出于对小猪的爱,"),r("strong",[_._v("而是基于“自利”的原则")]),_._v("。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("类比到科技领域,我们都知道研发成本一定高于模仿成本,而各发达国家的研发实力又强于发展中国家,那为什么发达国家还得耗费更大的资源去探索新的技术,难道真的是对外说的为人类为社会吗?其实我认为并不是,这"),r("strong",[_._v("无关个体天性和民族禀赋")]),_._v("。我想说到这里,估计会有人不同意:说浩哥,你这样太不尊重这些为人类做出贡献的先辈了。注意,我上面说了,你得把这件事放大了看。对于个体而言,我其实是非常非常尊重的,甚至我也愿意成为这样的一个人。但是对于集体利益,或者整个国家而言,请不要过于天真,童话都是骗人的。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("当年英国政府将流放澳洲的犯人交给往来于澳洲之间的商船来完成,由此经常会发生因商船主或水手虐待犯人,致使大批流放人员因此死在途中(葬身大海)的事件发生。后来大英帝国对运送犯人的办法(制度)稍加改变,流放人员仍然由往来于澳洲的商船来运送,只是运送犯人的费用要等到犯人送到澳洲后才由政府按实到犯人人数支付给商船。仅就这样一点小小的“改变”,几乎再也没有犯人于中途死掉的事情发生。大家不要高估人性,“虐待”的本身,其实就是权利的滋生,而权利是大多数人都想尝尝的滋味。通过支付方式的一点点改变,船主不得不保护犯人,来保障自己的利益,这背后的原因其实正是智猪博弈。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("作为“大猪”,如果想要获得更大利益,就得“一直跑”。这和看不看得顺眼小猪无关,和小猪卖不卖萌也无关,真实的社会,毕竟不是小猪佩奇。现实是残酷的,如果有一天小猪突然长大了,大猪还会为小猪“奔波”吗?当然不会,看看最近的贸易战,不就是因为“小猪”长大了,所以才出现的吗。但是长大了就是长大了,总不能藏起来吧。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("等到格局到了这一步,其实博弈的结构也已经发生了变化,看看川普一日三变,我想大家都会有一些体悟。最大宏观战略的彻底转变,绝对不会因为其一方简单闹一闹,怼一怼就结束,也并不是把某个看上去比较疯狂的人换掉就可以改变的,请大家一定要记清楚这点。毕竟,这无关个体天性和民族禀赋。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);v.default=s.exports},684:function(_,v,t){_.exports=t.p+"assets/img/1.adc871d9.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/105.d7ceba02.js b/learning/.vuepress/dist/assets/js/105.d7ceba02.js deleted file mode 100644 index 53be4c96..00000000 --- a/learning/.vuepress/dist/assets/js/105.d7ceba02.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{1106:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天继续为大家分享二分法系列篇的内容,看一道比较简单的题目。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目是比较简单,但我认为同时也是非常经典,建议大家掌握!")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第69题:x的平方根")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。")])])])]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_02、二分查找"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、二分查找"}},[t._v("#")]),t._v(" 02、二分查找")]),t._v(" "),n("blockquote",[n("p",[t._v("使用二分法来完成平方根还是比较容易被想到的,在有限的“区间”中,每次通过筛选一半的元素,到最终只剩下一个数(收敛),这个数就是题目要求的取整的平方根整数。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("根据之前说过的二分法模板,要使用二分法,我们当然要找到Left,Right,Mid,那在这里,Mid 自然被作为最终我们要找的平方根的值(不像上一道题,Mid是作为速度,不太容易被想到),而 Left 和 Right,我们采用 1 和 x/2。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("Left 设置为 1 比较容易理解,因为我们可以直接处理掉 x 为 0 的情况(当然,也可以把 Left 初始化为 2,然后我们额外处理 0 和 1 的情况,我之前说过,二分法一万个人有一万种写法,只要能解释清楚,那就是你自己的)。但是为什么 Right 是 x/2 呢?")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们看一下下面这些数的值:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(751),alt:"PNG"}}),t._v(" "),n("p",[t._v("很容易观察出,当 x>2 时,它的"),n("strong",[t._v("整数平方根")]),t._v("一定小于等于 x/2 。即有 0 < 整数平方根 <= x/2。所以我们的问题转化为在 [0,x/2] 中找一个"),n("strong",[t._v("特定值")]),t._v(",满足二分查找的条件。(当然,如果没有想到使用 x/2 作为 Right 而 直接使用 x ,其实也是可以的)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("剩下的逻辑就很简单了,我们不停缩小mid的范围,如果最终平方大于x就放回它前面一个值,否则就正常返回,直到两边的边界完全收敛。")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mySqrt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//注意这一行代码 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br")])]),n("p",[t._v("上面的代码,有三处需要进行讲解:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[n("p",[t._v("第一,就是这里将 left 和 right 都设置为了 long,这是因为担心超出界限。同时,也正是因为设置为了 long,所以后面我可以直接使用 right left,而不用担心报错。")])]),t._v(" "),n("li",[n("p",[t._v("第二,还是这行代码,大家肯定会疑惑,为什么我要在 (right left)/ 2 后面再加1。这其实是一种技巧,一般人我不告诉他。因为在面试的时候,我们往往需要快速写出freebug 的代码,但是如果遇到二分的题目,你很可能会不停的纠结 mid 到底如何设置,是左边界还是右边界。其实,面试官大多时候,并不需要你写出一个非常非常标准的二分,找到绝对的中值。那这里我们是不是就可以偷懒了?我们通过略微增大搜索空间,来降低自己代码的难度,并且因为代码完美的通过,别人还会觉得你牛逼。")])]),t._v(" "),n("li",[n("p",[t._v("第三,这点本来不需要额外说明的,正是在第二的基础上,我们通过不停的缩小搜索空间,最终 left 就变成我们要找的 mid 值,所以直接返回 left 就可以了。(因为昨天的题目有人问我,问为什么最后是返回 left,而不是 mid)其实这也勉强算是一种技巧,一般熟悉二分的人,都不会多余的去写一个mid,而是通过这种返回边界的方式,来找到目标值。这有2个好处,第一是可以让代码更加简洁,第二是不容易出错。")]),t._v(" "),n("br")])]),t._v(" "),n("p",[t._v("这里,我给出上面代码的三种 mid 衍化形式,大家琢磨琢磨:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mySqrt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n #"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n #"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n #"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br")])]),n("p",[t._v("同时,我也再给出一个没想到将 Right 设置为 x/2 的解法,这个解法是非常正派的,特别的适合新手。")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mySqrt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t\tleft "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n\t\t\t\tright "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("读算法文章的目的,是跟着对方的思路走,而不是说这个我会了,就不需要学习了,这样恐怕进步很难。本题自然可以通过 "),n("strong",[t._v("牛顿法,递归")]),t._v(" 等多种方式求解,但并不是我想说的。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_03、一点建议"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、一点建议"}},[t._v("#")]),t._v(" 03、一点建议")]),t._v(" "),n("blockquote",[n("p",[t._v("我拉出来讲这道题的原因,绝对不是说你会了,知道怎么样做了就可以了。我是希望通过本题,各位去深度思考二分法中几个元素的建立过程,比如 "),n("strong",[t._v("Left 和 Right 我们应该如何去设置")]),t._v(",如本题中 Right 既可以设置为 x 也可以设置为 x/2;又比如 "),n("strong",[t._v("mid 值该如何计算")]),t._v("。大家一定要明确 mid 的真正含义有两层,第一:大部分题目最后的 mid 值就是我们要找的目标值 第二:我们通过 mid 值来收敛搜索空间。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那么问题来了,如何可以彻底掌握二分法?初期我并不建议大家直接去套模板,这样意义不是很大,因为套模板很容易边界值出现错误(当然,也可能我的理解还不够深入,网上有很多建议是去直接套模板的)我的建议是:"),n("strong",[t._v("去思考二分法的本质,了解其通过收敛来找到目标的内涵")]),t._v("**,对每一个二分的题目都进行深度剖析,多分析别人的答案**。你得知道,"),n("strong",[t._v("每一个答案,背后都是对方的思考过程")]),t._v("。从这些过程中抽茧剥丝,最终留下的,才是二分的精髓。也只有到这一刻,我认为才可以真正的说一句掌握了二分。毕竟模板的目的,也是让大家去思考模板背后的东西,而不是模板本身。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=r.exports},751:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/106.acaf08c1.js b/learning/.vuepress/dist/assets/js/106.acaf08c1.js deleted file mode 100644 index 6a6c3089..00000000 --- a/learning/.vuepress/dist/assets/js/106.acaf08c1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{1117:function(t,s,a){"use strict";a.r(s);var n=a(3),p=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("“"),n("strong",[t._v("24点")]),t._v("”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。今天就为大家分享一道关于“24点”的算法题目。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("话不多说,直接看题。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第679题:24点游戏")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通 *,/,+,-,(,) 的运算得到 24 。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [4, 1, 8, 7]\n输出: True\n解释: (8-4) * (7-1) = 24\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1, 2, 1, 2]\n输出: False\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("注意:")]),t._v(" "),n("p",[t._v("​\t1、除法"),n("strong",[t._v("运算符 / 表示实数除法,而不是整数除法")]),t._v("。例如 4 / (1 - 2/3) = 12 。")]),t._v(" "),n("p",[t._v("​\t2、每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。")]),t._v(" "),n("p",[t._v("​\t3、你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("p",[t._v("拿到题目,第一反应就可以想到"),n("strong",[t._v("暴力求解。如果我们要判断给出的4张牌是否可以通过组合得到24,那我们只需找出所有的可组合的方式进行遍历。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("4个数字,3个操作符,外加括号,基本目测就能想到组合数不会大到超出边界。所以,我们只要"),n("strong",[t._v("把他们统统列出来,不就可以进行求解了吗")]),t._v("?说干就干!")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们首先定义个方法,用来判断"),n("strong",[t._v("两个数的的所有操作符组合是否可以得到24")]),t._v("。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[t._v("但是这个方法写的正确吗?其实不对!因为在计算机中,实数在计算和存储过程中会有一些微小的误差,"),n("strong",[t._v("对于一些与零作比较的语句来说,有时会因误差而导致原本是等于零但结果却小于或大于零之类的情况发生")]),t._v(",所以常用一个很小的数 "),n("strong",[t._v("1e-6")]),t._v(" 代替 0,进行判读!")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("(1e-6:表示1乘以10的负6次方。Math.abs(x)<1e-6 其实相当于x==0。1e-6(也就是0.000001)叫做"),n("strong",[t._v("epslon")]),t._v(",用来抵消浮点运算中因为误差造成的相等无法判断的情况。这个知识点需要掌握!)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("举个例子:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),t._v(" \n b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.0")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//math.Sqrt:开平方根 ")]),t._v("\n c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Sqrt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("c \n fmt"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//false ")]),t._v("\n fmt"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//true")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br")])]),n("p",[t._v("这里直接用 "),n("strong",[t._v("a==0")]),t._v(" 就会得到false,但是通过 "),n("strong",[t._v("a < 1e-6 && a > -(1e-6)")]),t._v(" 却可以进行准确的判断。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以我们将上面的方法改写:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go语言 ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//judgePoint24_2:判断两个数的所有操作符组合是否可以得到24 func judgePoint24_2(a, b float64) bool { ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[t._v("完善了通过两个数来判断是否可以得到24的方法,现在我们加一个判断三个数是否可以得到24的方法。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//硬核代码,不服来辩! ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br")])]),n("p",[t._v("好了。三个数的也出来了,我们再加一个判断4个数为24点的方法:(排列组合,我想大家都会....)")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//硬核代码,不服来辩!")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br")])]),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),n("p",[t._v("我们整合全部代码如下:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("judgePoint24_2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1e-6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br"),n("span",{staticClass:"line-number"},[t._v("74")]),n("br"),n("span",{staticClass:"line-number"},[t._v("75")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(795),alt:"PNG"}}),t._v(" "),n("br"),t._v(" "),n("blockquote",[n("p",[t._v("由于代码"),n("strong",[t._v("过于硬核")]),t._v(",我们直接击败100%的对手:(没想到吧!代码还可以这么写~)")])])])}),[],!1,null,null,null);s.default=p.exports},795:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/107.88156c64.js b/learning/.vuepress/dist/assets/js/107.88156c64.js deleted file mode 100644 index ea8a91fc..00000000 --- a/learning/.vuepress/dist/assets/js/107.88156c64.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{1128:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("分享一道由群员“Melbourne”,外号 “Paper Machine”,有数学小王子之称的小伙伴分享的题目!")])]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("特别说明:本文非原创,经投稿者同意后发表。")])]),t._v(" "),n("h2",{attrs:{id:"_01、算法介绍"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、算法介绍"}},[t._v("#")]),t._v(" 01、算法介绍")]),t._v(" "),n("blockquote",[n("p",[t._v("期望:在概率论和统计学中,数学期望(mean)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("题目:在1*1的正方形中随机撒三个点,两两点都可构成长方形的一组对顶点,这样一共有三个长方形,需要求面积第二大的长方形的面积的期望。")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("算法:每次随机三个点,计算第二大面积,最后统计期望。")])])])]),t._v(" "),n("h2",{attrs:{id:"_02、蒙特卡洛"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、蒙特卡洛"}},[t._v("#")]),t._v(" 02、蒙特卡洛")]),t._v(" "),n("blockquote",[n("p",[t._v("蒙特卡罗法也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡罗是摩纳哥的著名赌城,该法为表明其随机抽样的本质而命名。故适用于对离散系统进行计算仿真试验。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("蒙特卡洛方法(Monte Carlo Method) 指的是一类使用随机变量解决概率问题的方法。比较常见的是计算积分、计算概率、计算期望等问题。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("常见的蒙特卡洛方法依赖于随机变量的“随机性”,即未发生的事件无法根据已有信息进行预测,比如抛硬币、掷骰子等。在计算机中,常见的随机数是由一系列确定性算法进行生成的,通常称之为伪随机数(pseudo random number)。由于计算精度有限,且这些随机数在统计意义上“不够随机”,会出现可预测的重复序列,这些数在统计意义上收敛精度有限。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("与常见的蒙特卡洛方法不同的是,伪蒙特卡洛使用了低差异序列(low discrepancy sequence,常见的有halton序列、sobol序列等),不使用常见的(伪)随机数,其收敛速率更快(记 N 为样本数量,伪蒙特卡洛收敛速率可达"),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(417),alt:"PNG"}}),t._v(",而普通蒙特卡洛方法收敛速率仅为 "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(417),alt:"PNG"}}),t._v("。另一个最重要的性质是伪蒙特卡洛使用的低差异序列是可复现的(replicable),即不会随环境改变而改变,没有随机种子;而普通蒙特卡洛使用的伪随机数会因随机种子不同而导致结果不同,收敛效果也不尽相同。")]),t._v(" "),n("h2",{attrs:{id:"_03、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目分析"}},[t._v("#")]),t._v(" 03、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("本算法利用伪蒙特卡洛完成。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("CPP代码如下:")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("#"),n("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("")]),t._v(" ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("#"),n("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("")]),t._v(" ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("#"),n("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("")]),t._v(" ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("#"),n("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("")]),t._v(" ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("#"),n("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("")]),t._v(" ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" UP"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \nbool sieve"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("UP "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" primes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("UP"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("top"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("init")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v("UP"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("sieve"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n primes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("top "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v("UP"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n sieve"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nstd"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("halton")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("assert")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v("top"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("prime_inv")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("r")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("t")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n prime_inv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("primes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("auto")]),t._v(" f"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" ret"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("auto")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("e"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n ret "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ret"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("f")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("dim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" d"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v("primes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("d"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("prime_inv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n prime_inv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/=")]),t._v("primes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/=")]),t._v("primes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("experiment")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" idx"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" li"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("halton")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("idx"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),t._v(" area1"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("fabs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),t._v(" area2"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("fabs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),t._v(" area3"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("fabs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),t._v(" w"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("area1 area2 area3"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("area1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("area2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("area3"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("area1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("area2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("area3"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" w"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" BATCH"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("100000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" THREADS"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("init")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),t._v(" total"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" trial"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n std"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("double")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("li")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("THREADS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("omp_set_dynamic")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("omp_set_num_threads")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("THREADS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("#"),n("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("pragma")]),t._v(" omp parallel for")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" thread"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("thread"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("THREADS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" thread"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("long")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("BATCH"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("thread"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("experiment")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trial thread"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("BATCH i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("auto")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("d"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("li"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n total "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("d"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n trial "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("THREADS"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("BATCH"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("printf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"%lld: %.10f\\n"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("trial"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("total"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("trial"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("fflush")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token constant"}},[t._v("stdout")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br")])]),n("br"),t._v(" "),n("p",[t._v("分析:使用了并行计算,批量跑随机实验,速度大大提升。其中halton函数会生成halton低差异序列,其值域为[0,1],参数i表示第i个抽样,dim表示生成数据的维度(本例中每次实验需要6个点,使用6维数据点即可),不同样本之间"),n("strong",[t._v("互不影响")]),t._v(",故可使用并行计算提速。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("#表示随机试验次数×10^7,Avg表示第二大面积的平均值,Err表示与真实值的绝对误差×10^(-10)。")]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"center"}},[t._v("#")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("Avg")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("Err")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("#")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("Avg")]),t._v(" "),n("th",{staticStyle:{"text-align":"center"}},[t._v("Err")])])]),t._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("1")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786804")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("55")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("2")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786707")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("152")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("3")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786905")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("46")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("4")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786889")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("30")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786809")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("6")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786836")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("23")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("7")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786849")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("8")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786868")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("9")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("9")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786799")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("60")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786837")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("22")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("11")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786845")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("14")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("12")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786839")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("20")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("13")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786874")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("15")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("14")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786839")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("20")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("15")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786848")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("11")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("16")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786868")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("9")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("17")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786851")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("8")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("18")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786863")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("4")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("19")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786854")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("20")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786887")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("28")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("21")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786858")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("1")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("22")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786844")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("15")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("23")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786841")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("18")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("24")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786852")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("7")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("25")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786849")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("10")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("26")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.101778684")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("19")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("27")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786838")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("21")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("28")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786852")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("7")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("29")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786838")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("21")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("30")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786846")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("13")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("31")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786859")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("32")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786862")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("3")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("33")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786859")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("34")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786853")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("6")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("35")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786854")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("36")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786859")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("37")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.101778685")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("9")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("38")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786854")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("5")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("39")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786853")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("6")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("40")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786858")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("1")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("41")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786848")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("11")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("42")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786851")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("8")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("43")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786847")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("12")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("44")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786841")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("18")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("45")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.101778685")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("9")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("46")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786842")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("17")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("47")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786852")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("7")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("48")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786848")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("11")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("49")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786854")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("50")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786851")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("8")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[t._v("51")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786842")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("17")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("52")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("0.1017786844")]),t._v(" "),n("td",{staticStyle:{"text-align":"center"}},[t._v("15")])])])]),t._v(" "),n("p",[t._v("可以看到,在实验次之后,收敛精度可达"),n("strong",[t._v("9")]),t._v("位小数,非常精确。由于使用的随机数“不够随机”,普通的蒙特卡洛在同样的实验次数下仅能收敛至五位小数的精度。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("上述方法可扩展至其他随机问题中,非常实用且高效,欢迎大家讨论!")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=e.exports},417:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/108.2f73e8a1.js b/learning/.vuepress/dist/assets/js/108.2f73e8a1.js deleted file mode 100644 index cedc6015..00000000 --- a/learning/.vuepress/dist/assets/js/108.2f73e8a1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{1127:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("能跟着看到现在,大家都有点疲惫了。为了提高各位积极性,我打算每天在文首放一张女神的图(不为别的,只为激励大家,毕竟美女对男女都是通杀的。祝大家早日拿到理想offer,实现人生赢家)话不多说,直接看题!")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("这两天越来越多的读者私信小浩,说觉得只看题的话,不是很系统,想让我系统的讲一讲各类数据结构。对于这个问题,我统一回复一下,首先"),n("strong",[s._v("后面肯定是有系统的讲解各类数据结构的打算的")]),s._v(",这个目前正在筹划中,所以大家请放心!另外对于看题,如果担心缺乏基础知识看不懂的朋友们,大家请一万个放心。老读者都知道,我讲题,一般都是会把这个题涉及到的基础知识都给你过一遍的。当然后面我也会用系列篇,把这些题目再串起来,所以大家还是耐心点的去看。记住,干就对了!")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第343题:整数拆分")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个正整数 "),n("em",[s._v("n")]),s._v(",将其拆分为"),n("strong",[s._v("至少")]),s._v("两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: 2\n输出: 1\n解释: 2 = 1 1, 1 × 1 = 1。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: 10\n输出: 36\n解释: 10 = 3 3 4, 3 × 3 × 4 = 36。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("**说明: **你可以假设 n 不小于 2 且不大于 58。")]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("这个题理解了题意的话,其实还是比较简单的,一起看下。")])]),s._v(" "),n("p",[s._v("要对一个整数进行拆分,并且要使这些拆分完后的因子的乘积最大。我们可以先尝试拆分几个数值,测试一下。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(867),alt:"PNG"}}),s._v(" "),n("p",[s._v("通过观察,首先肯定可以明确,"),n("strong",[s._v("2 和 3 是没办法进行拆分的最小因子")]),s._v("。同时,我们好像能看出来:")]),s._v(" "),n("ul",[n("li",[s._v("只要把 n 尽可能的拆分成包含3的组合,就可以得到最大值。")]),s._v(" "),n("li",[s._v("如果没办法拆成 3 的组合,就退一步拆成 2 的组合。")]),s._v(" "),n("li",[s._v("对于 3 和 2 ,没办法再进行拆分。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("根据分析,我们尝试使用"),n("strong",[s._v("贪心")]),s._v("进行求解。因为一个数(假设为n)除以另一个数,总是包括整数部分(x)和余数部分(y)。那刚才也得到了,"),n("strong",[s._v("最优因子是3")]),s._v(",所以我们需要让 n/3,这样的话,余数可能是 1,2 两种可能性。")]),s._v(" "),n("ul",[n("li",[s._v("如果余数是 1 ,刚才我们也分析过,对于 1 的拆分是没有意义的,所以我们退一步,将最后一次的 3 和 1 的拆分,用 2 和 2 代替。")]),s._v(" "),n("li",[s._v("如果余数是 2 ,那不消多说,直接乘以最后的 2 即可。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("根据分析,得出代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("integerBreak")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//恰好整除,直接为3^x ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("y "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("pow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//余数为1,退一步 3^(x-1)*2*2 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("y "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("pow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//余数为2,直接乘以2")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("pow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("h2",{attrs:{id:"_03、证明过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、证明过程"}},[s._v("#")]),s._v(" 03、证明过程")]),s._v(" "),n("blockquote",[n("p",[s._v("答案是碰出来了,但是我们是通过观察,发现最优因子应该是 3 。那如何来证明这个结论的正确性呢?")])]),s._v(" "),n("p",[s._v("首先,通过均值不等式,很容易验证当每一个拆分值都相等的时候,才具有最大值,所以实际上就是将这个数均分。那么,对于整数"),n("img",{attrs:{src:"18.assets/640.svg",alt:"img"}}),s._v(",我们将其分解成"),n("img",{attrs:{src:"18.assets/640.svg",alt:"img"}}),s._v("份,每一份为"),n("img",{attrs:{src:"18.assets/640.svg",alt:"img"}}),s._v("则有")]),s._v(" "),n("p",[s._v("求"),n("img",{attrs:{src:"18.assets/640-1592573502117.svg",alt:"img"}}),s._v("的极值点为"),n("img",{attrs:{src:"18.assets/640-1592573502133.svg",alt:"img"}}),s._v(",最接近的也就是 3 了。(注意:这里是整数,如果是实数,该证明则有漏洞)")]),s._v(" "),n("h2",{attrs:{id:"_04、都看不懂"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、都看不懂"}},[s._v("#")]),s._v(" 04、都看不懂")]),s._v(" "),n("blockquote",[n("p",[s._v("一力破万法,乱拳打死老师傅,使用万能的动态规划求解。")])]),s._v(" "),n("p",[s._v("dp[i]代表 i 拆分之后得到的乘积的最大的元素,比如dp[4]就保存将4拆分后得到的最大的乘积。状态转移方程式为")]),s._v(" "),n("blockquote",[n("center",[s._v("dp[i]=max(dp[i],(i-j)*max(dp[j],j))")])],1),s._v(" "),n("p",[s._v("整体思路就是这样,将一个大的问题,分解成一个一个的小问题,然后完成一个"),n("strong",[s._v("自底向上")]),s._v("的过程。举一个例子,比如计算 10 ,可以拆分 6 和 4 ,因为 6 的最大值 3x3,以及 4 的最大值 2x2 都已经得到,所以就替换成 9 和 4 ,也就是 10=3x3x4。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("代码如下:(CPP听说很受欢迎?)")]),s._v(" "),n("div",{staticClass:"language-cpp line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-cpp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//C ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("integerBreak")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("dp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br")])]),n("p",[s._v("今天的题目可能有一定难度,建议大家自己写写画画,才能真正的做到理解和巩固。")])])}),[],!1,null,null,null);t.default=r.exports},867:function(s,t,a){s.exports=a.p+"assets/img/1.a1d47533.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/109.faf935da.js b/learning/.vuepress/dist/assets/js/109.faf935da.js deleted file mode 100644 index 7189dbed..00000000 --- a/learning/.vuepress/dist/assets/js/109.faf935da.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{1024:function(s,t,a){s.exports=a.p+"assets/img/bubbleSort.b7d216a5.gif"},1147:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。")]),s._v(" "),n("p",[s._v("作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。")]),s._v(" "),n("h2",{attrs:{id:"_1-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[s._v("#")]),s._v(" 1. 算法步骤")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("比较相邻的元素。如果第一个比第二个大,就交换他们两个。")])]),s._v(" "),n("li",[n("p",[s._v("对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。")])]),s._v(" "),n("li",[n("p",[s._v("针对所有的元素重复以上的步骤,除了最后一个。")])]),s._v(" "),n("li",[n("p",[s._v("持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。")])])]),s._v(" "),n("h2",{attrs:{id:"_2-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-动图演示"}},[s._v("#")]),s._v(" 2. 动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1024),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_3-最慢和最快"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-最慢和最快"}},[s._v("#")]),s._v(" 3. 最慢和最快")]),s._v(" "),n("p",[s._v("正序时最快,反序时最慢")]),s._v(" "),n("h2",{attrs:{id:"_4-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-javascript-代码实现"}},[s._v("#")]),s._v(" 4. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bubbleSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 相邻元素两两对比")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 元素交换")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("h2",{attrs:{id:"_5-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-python-代码实现"}},[s._v("#")]),s._v(" 5. Python 代码实现")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bubbleSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h2",{attrs:{id:"_6-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-go-代码实现"}},[s._v("#")]),s._v(" 6. Go 代码实现")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bubbleSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tlength "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("h2",{attrs:{id:"_7-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-java-代码实现"}},[s._v("#")]),s._v(" 7. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BubbleSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" flag "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" tmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n flag "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("flag"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br")])]),n("h2",{attrs:{id:"_8-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-php-代码实现"}},[s._v("#")]),s._v(" 8. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bubbleSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$tmp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$tmp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/11.82afa120.js b/learning/.vuepress/dist/assets/js/11.82afa120.js deleted file mode 100644 index 8a230465..00000000 --- a/learning/.vuepress/dist/assets/js/11.82afa120.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{1143:function(A,C,Q){"use strict";Q.r(C);var v=Q(3),B=Object(v.a)({},(function(){var A=this,C=A.$createElement,v=A._self._c||C;return v("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[v("blockquote",[v("p",[A._v("今天是小浩算法 “365刷题计划” 第106天。互联网公司面试,经常会出现一些奇奇怪怪的题目。今天就为大家扒几道。(第二道题目由读者提供,是真实的头条面试数据分析岗位对方问到的。防止题目侵权,本文给出的是"),v("strong",[A._v("相似题型")]),A._v(")")])]),A._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:Q(974),alt:"PNG"}}),A._v(" "),v("h2",{attrs:{id:"_01、量出4升水"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_01、量出4升水"}},[A._v("#")]),A._v(" 01、量出4升水")]),A._v(" "),v("blockquote",[v("p",[A._v("这道题的答案并不难,但作为面试官,却可以通过这道题考察很多内容。")])]),A._v(" "),v("br"),A._v(" "),v("table",[v("thead",[v("tr",[v("th",[A._v("题目:量出4升水")])])]),A._v(" "),v("tbody",[v("tr",[v("td",[A._v("怎么用3升和5升的桶量出4升的水?")])])])]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("题目没什么补充的,直接分析,一个3升和5升的水桶:")]),A._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:Q(975),alt:"PNG"}}),A._v(" "),v("p",[A._v("首先用三升水桶装满水,倒入五升水桶:")]),A._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:Q(976),alt:"PNG"}}),A._v(" "),v("p",[A._v("再次倒满三升水桶,填满后继续倒入五升水桶,直到五升水桶倒满。")]),A._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:Q(977),alt:"PNG"}}),A._v(" "),v("p",[A._v("清空五升水桶,将三升水桶的一升水倒入:")]),A._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:Q(978),alt:"PNG"}}),A._v(" "),v("p",[A._v("再次填满三升水桶,倒入五升水桶中:")]),A._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:Q(979),alt:"PNG"}}),A._v(" "),v("h2",{attrs:{id:"_02、最大的钻石"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_02、最大的钻石"}},[A._v("#")]),A._v(" 02、最大的钻石")]),A._v(" "),v("blockquote",[v("p",[A._v("注意,下面是 n,不是 10。网上的题目好多是 1-10 楼。。。。应该都是被简化的,分析起来并不友好。")])]),A._v(" "),v("br"),A._v(" "),v("table",[v("thead",[v("tr",[v("th",[A._v("题目:最大的钻石")])])]),A._v(" "),v("tbody",[v("tr",[v("td",[A._v("1 楼到 n 楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从 1 楼到 n 楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到「最大」的一颗?")])])])]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("不要认为这种题目不会出现在面试中,恰恰相反,这类题目出现的概率非常高。这不,有读者就碰到了。下面两个是知乎中也遇到该题的读者截图:")]),A._v(" "),v("img",{attrs:{src:Q(980),alt:"PNG"}}),A._v(" "),v("img",{staticStyle:{zoom:"80%"},attrs:{src:Q(981),alt:"PNG"}}),A._v(" "),v("p",[A._v("那这种问题主要考察面试者的什么能力呢?一个是面试临场随机应变的能力。第二就是分析问题的能力。")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("面试时如果被问到这种题目,其实大多数面试官心中并没有一个标准答案。(不排除有面试官深究的)事实是作为面试者,我们只要流畅的给出答案,大概率都是可以顺利过关。")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("回到题目。其实题中包含一个隐藏条件:"),v("strong",[A._v("随机放置")]),A._v("。所有的分析都是基于随机放置给出的。"),v("strong",[A._v("换句话说,如果放置钻石是人为干预大小,那么本题的所以分析则全部不成立")]),A._v("。")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("其实这个问题的原型叫做秘书问题,该类问题全部属于"),v("strong",[A._v("最佳停止问题")]),A._v("。")]),A._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:Q(982),alt:"PNG"}}),A._v(" "),v("p",[A._v("这类问题都有着统一的解法:")]),A._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:Q(983),alt:"PNG"}}),A._v(" "),v("p",[A._v("所以到我们的题目里,我们也是可以直接给出答案:"),v("strong",[A._v("我们要选择先放弃前 37%(就是1/e)的钻石,此后选择比前 37% 都大的第一颗钻石。")])]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("其实该法则还有很多运用,比如一些常见的推文《谈恋爱拒绝掉前面37%的人》,其实就是一样的原因。")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("事实上也有人通过测试证明了这个数据:")]),A._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:Q(984),alt:"PNG"}}),A._v(" "),v("p",[A._v("当 n=30 时,测试一万次,可以看到有 4000 次我们拿到了最大的钻石。")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("改题目还有一些变种,比如:")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略?")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("现在要聘请 1 名秘书,共有 n 个应聘者,每面试 1 人后,就知道了应聘者的好坏程度,且必须立刻决定是否聘用,不可重复面试。策略是拒绝前 k 个应聘者,而从第 k+1 个应聘者开始,一旦有比前 k 个都好的,就立刻聘用。如何决定 k 的值,使得聘用到最佳应聘者的概率最大?")]),A._v(" "),v("br"),A._v(" "),v("p",[A._v("等等。这里再给出一个严谨的推导过程:")]),A._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:Q(985),alt:"PNG"}}),A._v(" "),v("h2",{attrs:{id:"_03、思维定势"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_03、思维定势"}},[A._v("#")]),A._v(" 03、思维定势")]),A._v(" "),v("blockquote",[v("p",[A._v("下面这道题也是一道常见的智力题,但是这道题绝对不会出现在面试中了。拿出来分享给大家的原因,是期望不要被思维定势局限。")])]),A._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:Q(986),alt:"PNG"}}),A._v(" "),v("p",[A._v("这道题中有六个停车位,每个车位上都有一个数字,然而有一个车位上的数字被汽车挡住了,要求学生们在20秒内答出这个被挡住的车位上的数字。这是中国香港小学一道给6岁儿童设计的“停车场智力题”。("),v("strong",[A._v("大家可以在评论区留下答案")]),A._v(")")]),A._v(" "),v("br"),A._v(" "),v("p",[v("strong",[A._v("加油,奥利给!")])])])}),[],!1,null,null,null);C.default=B.exports},974:function(A,C,Q){A.exports=Q.p+"assets/img/1.26128aab.jpg"},975:function(A,C){A.exports="data:image/jpeg;base64,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"},976:function(A,C){A.exports="data:image/jpeg;base64,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"},977:function(A,C){A.exports="data:image/jpeg;base64,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"},978:function(A,C){A.exports="data:image/jpeg;base64,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"},979:function(A,C){A.exports="data:image/jpeg;base64,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"},980:function(A,C,Q){A.exports=Q.p+"assets/img/7.185c0a4f.jpg"},981:function(A,C){A.exports="data:image/jpeg;base64,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"},982:function(A,C,Q){A.exports=Q.p+"assets/img/9.fb258924.jpg"},983:function(A,C,Q){A.exports=Q.p+"assets/img/10.be8b0242.jpg"},984:function(A,C,Q){A.exports=Q.p+"assets/img/11.21270f34.jpg"},985:function(A,C,Q){A.exports=Q.p+"assets/img/12.0cec972f.jpg"},986:function(A,C,Q){A.exports=Q.p+"assets/img/13.84c20ce8.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/110.fc1cf27e.js b/learning/.vuepress/dist/assets/js/110.fc1cf27e.js deleted file mode 100644 index 39ed8da3..00000000 --- a/learning/.vuepress/dist/assets/js/110.fc1cf27e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{1031:function(s,t,a){s.exports=a.p+"assets/img/radixSort.6690b105.gif"},1154:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。")]),s._v(" "),n("h2",{attrs:{id:"_1-基数排序-vs-计数排序-vs-桶排序"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-基数排序-vs-计数排序-vs-桶排序"}},[s._v("#")]),s._v(" 1. 基数排序 vs 计数排序 vs 桶排序")]),s._v(" "),n("p",[s._v("基数排序有两种方法:")]),s._v(" "),n("p",[s._v("这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异案例看大家发的:")]),s._v(" "),n("ul",[n("li",[s._v("基数排序:根据键值的每位数字来分配桶;")]),s._v(" "),n("li",[s._v("计数排序:每个桶只存储单一键值;")]),s._v(" "),n("li",[s._v("桶排序:每个桶存储一定范围的数值;")])]),s._v(" "),n("h2",{attrs:{id:"_2-lsd-基数排序动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-lsd-基数排序动图演示"}},[s._v("#")]),s._v(" 2. LSD 基数排序动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1031),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_3-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-javascript-代码实现"}},[s._v("#")]),s._v(" 3. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//LSD Radix Sort")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" counter "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("radixSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" maxDigit")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" dev "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" maxDigit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" dev "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("parseInt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" dev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" pos "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("pos"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br")])]),n("h2",{attrs:{id:"_4-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-python-代码实现"}},[s._v("#")]),s._v(" 4. python 代码实现")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("radix")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n \n digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n max_digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n max_value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("\ntitle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 找出列表中最大的位数\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("**")]),s._v("max_digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" max_value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n max_digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" max_digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" max_digit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("\ntitle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 求出每一个元素的个、十、百位的值\n t "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("**")]),s._v("digit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n \n coll "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n coll"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n \n arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" coll\n digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" digit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br")])]),n("h2",{attrs:{id:"_5-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-java-代码实现"}},[s._v("#")]),s._v(" 5. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 基数排序\n * 考虑负数的情况还可以参考: https://code.i-harness.com/zh-CN/q/e98fa9\n */")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RadixSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxDigit "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMaxDigit")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("radixSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" maxDigit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 获取最高位数\n */")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMaxDigit")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMaxValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getNumLenght")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMaxValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("protected")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getNumLenght")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" lenght "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n lenght"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" lenght"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("radixSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxDigit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" dev "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" maxDigit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" dev "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" counter "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" dev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("arrayAppend")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" pos "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" counter"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("pos"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 自动扩容,并保存数据\n *\n * @param arr\n * @param value\n */")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("arrayAppend")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br")])]),n("h2",{attrs:{id:"_6-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-php-代码实现"}},[s._v("#")]),s._v(" 6. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("radixSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxDigit")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxDigit")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("===")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxDigit")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxDigit")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("preg_match_all")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token single-quoted-string string"}},[s._v("'/\\d/'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("string"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$matches")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$numArr")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$matches")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$lenTmp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$numArr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("array_key_exists")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$lenTmp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$numArr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("intval")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$numArr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$lenTmp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("array_key_exists")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$pos")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$value")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$value")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("array_shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$counter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$pos")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$value")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/111.2521be33.js b/learning/.vuepress/dist/assets/js/111.2521be33.js deleted file mode 100644 index 7f7b6e7d..00000000 --- a/learning/.vuepress/dist/assets/js/111.2521be33.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{1027:function(s,t,a){s.exports=a.p+"assets/img/selectionSort.44be35da.gif"},1149:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。")]),s._v(" "),n("h2",{attrs:{id:"_1-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[s._v("#")]),s._v(" 1. 算法步骤")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置")])]),s._v(" "),n("li",[n("p",[s._v("再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。")])]),s._v(" "),n("li",[n("p",[s._v("重复第二步,直到所有元素均排序完毕。")])])]),s._v(" "),n("h2",{attrs:{id:"_2-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-动图演示"}},[s._v("#")]),s._v(" 2. 动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1027),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_3-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-javascript-代码实现"}},[s._v("#")]),s._v(" 3. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n minIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 寻找最小的数")]),s._v("\n minIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 将最小数的索引保存")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])]),n("h2",{attrs:{id:"_4-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-python-代码实现"}},[s._v("#")]),s._v(" 4. Python 代码实现")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("\ntitle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 记录最小数的索引\n minIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n minIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("\ntitle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" i 不是最小数时,将 i 和最小数进行交换\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("minIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("h2",{attrs:{id:"_5-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-go-代码实现"}},[s._v("#")]),s._v(" 5. Go 代码实现")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tlength "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tmin "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" i\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t\tmin "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("h2",{attrs:{id:"_6-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-java-代码实现"}},[s._v("#")]),s._v(" 6. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SelectionSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 总共要经过 N-1 轮比较")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 每轮需要比较的次数 N-i")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 记录目前能找到的最小值元素的下标")]),s._v("\n min "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 将找到的最小值和i位置所在的值进行交换")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" tmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br")])]),n("h2",{attrs:{id:"_7-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-php-代码实现"}},[s._v("#")]),s._v(" 7. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("selectionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minIndex")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minIndex")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minIndex")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minIndex")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minIndex")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/112.c60355fa.js b/learning/.vuepress/dist/assets/js/112.c60355fa.js deleted file mode 100644 index 16d9fb5b..00000000 --- a/learning/.vuepress/dist/assets/js/112.c60355fa.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{1028:function(s,t,a){s.exports=a.p+"assets/img/insertionSort.be81c151.gif"},1150:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。")]),s._v(" "),n("p",[s._v("插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。")]),s._v(" "),n("h2",{attrs:{id:"_1-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[s._v("#")]),s._v(" 1. 算法步骤")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。")])]),s._v(" "),n("li",[n("p",[s._v("从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)")])])]),s._v(" "),n("h2",{attrs:{id:"_2-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-动图演示"}},[s._v("#")]),s._v(" 2. 动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1028),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_3-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-javascript-代码实现"}},[s._v("#")]),s._v(" 3. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("insertionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" current"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n preIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n current "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("preIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" current"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" current"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("h2",{attrs:{id:"_4-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-python-代码实现"}},[s._v("#")]),s._v(" 4. Python 代码实现")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("insertionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n preIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n current "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" preIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" current"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" current\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("h2",{attrs:{id:"_5-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-go-代码实现"}},[s._v("#")]),s._v(" 5. Go 代码实现")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("insertionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tpreIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t\tcurrent "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" preIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" current "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t\tpreIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("preIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" current\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br")])]),n("h2",{attrs:{id:"_6-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-java-代码实现"}},[s._v("#")]),s._v(" 6. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InsertSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 记录要插入的数据")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 从已经排序的序列最右边的开始比较,找到比其小的数")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 存在比其小的数,插入")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" tmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br")])]),n("h2",{attrs:{id:"_7-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-php-代码实现"}},[s._v("#")]),s._v(" 7. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("insertionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$current")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$current")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$preIndex")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$current")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/113.8a2c0d43.js b/learning/.vuepress/dist/assets/js/113.8a2c0d43.js deleted file mode 100644 index 922e847f..00000000 --- a/learning/.vuepress/dist/assets/js/113.8a2c0d43.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{1033:function(t,s,a){t.exports=a.p+"assets/img/mergeSort.9541d116.gif"},1157:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。")]),t._v(" "),n("p",[t._v("作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:")]),t._v(" "),n("ul",[n("li",[t._v("自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);")]),t._v(" "),n("li",[t._v("自下而上的迭代;")])]),t._v(" "),n("p",[t._v("在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但是对于递归法,作者却认为:")]),t._v(" "),n("blockquote",[n("p",[t._v("However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.")]),t._v(" "),n("p",[t._v("然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。")])]),t._v(" "),n("p",[t._v("说实话,我不太理解这句话。意思是 JavaScript 编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教。")]),t._v(" "),n("p",[t._v("和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。")]),t._v(" "),n("h2",{attrs:{id:"_2-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-算法步骤"}},[t._v("#")]),t._v(" 2. 算法步骤")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;")])]),t._v(" "),n("li",[n("p",[t._v("设定两个指针,最初位置分别为两个已经排序序列的起始位置;")])]),t._v(" "),n("li",[n("p",[t._v("比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;")])]),t._v(" "),n("li",[n("p",[t._v("重复步骤 3 直到某一指针达到序列尾;")])]),t._v(" "),n("li",[n("p",[t._v("将另一序列剩下的所有元素直接复制到合并序列尾。")])])]),t._v(" "),n("h2",{attrs:{id:"_3-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-动图演示"}},[t._v("#")]),t._v(" 3. 动图演示")]),t._v(" "),n("p",[n("img",{attrs:{src:a(1033),alt:"动图演示"}})]),t._v(" "),n("h2",{attrs:{id:"_4-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-javascript-代码实现"}},[t._v("#")]),t._v(" 4. JavaScript 代码实现")]),t._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 采用自上而下的递归方法")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" middle "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("slice")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br")])]),n("h2",{attrs:{id:"_5-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-python-代码实现"}},[t._v("#")]),t._v(" 5. Python 代码实现")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" math\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr\n middle "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("floor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" merge"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mergeSort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mergeSort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("and")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pop"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pop"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pop"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pop"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br")])]),n("h2",{attrs:{id:"_6-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-go-代码实现"}},[t._v("#")]),t._v(" 6. Go 代码实现")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tlength "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tmiddle "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\tleft "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\tright "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\tleft "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\tright "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\tleft "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\tright "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br")])]),n("h2",{attrs:{id:"_7-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-java-代码实现"}},[t._v("#")]),t._v(" 7. Java 代码实现")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MergeSort")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IArraySort")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 对 arr 进行拷贝,不改变参数内容")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" middle "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOfRange")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOfRange")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" middle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("protected")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOfRange")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOfRange")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOfRange")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOfRange")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br")])]),n("h2",{attrs:{id:"_8-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-php-代码实现"}},[t._v("#")]),t._v(" 8. PHP 代码实现")]),t._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$len")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$len")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$middle")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$len")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_slice")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$middle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_slice")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$middle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$result")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$result")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$result")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$result")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$result")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_shift")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$result")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br")])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/114.9133a60a.js b/learning/.vuepress/dist/assets/js/114.9133a60a.js deleted file mode 100644 index 36d5aa57..00000000 --- a/learning/.vuepress/dist/assets/js/114.9133a60a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[114],{1034:function(t,s,a){t.exports=a.p+"assets/img/quickSort.71c0f1c0.gif"},1158:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。")]),t._v(" "),n("p",[t._v("快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。")]),t._v(" "),n("p",[t._v("快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。")]),t._v(" "),n("p",[t._v("快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:")]),t._v(" "),n("blockquote",[n("p",[t._v("快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。")])]),t._v(" "),n("h2",{attrs:{id:"_1-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[t._v("#")]),t._v(" 1. 算法步骤")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("从数列中挑出一个元素,称为 “基准”(pivot);")])]),t._v(" "),n("li",[n("p",[t._v("重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;")])]),t._v(" "),n("li",[n("p",[t._v("递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;")])])]),t._v(" "),n("p",[t._v("递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。")]),t._v(" "),n("h2",{attrs:{id:"_2-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-动图演示"}},[t._v("#")]),t._v(" 2. 动图演示")]),t._v(" "),n("p",[n("img",{attrs:{src:a(1034),alt:"动图演示"}})]),t._v(" "),n("h2",{attrs:{id:"_3-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-javascript-代码实现"}},[t._v("#")]),t._v(" 3. JavaScript 代码实现")]),t._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n partitionIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("'number'")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v("'number'")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n partitionIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 分区操作")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 设定基准值(pivot)")]),t._v("\n index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" high")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("low "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("low "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" high "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("low "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" high "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" high")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("low "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br")])]),n("h2",{attrs:{id:"_4-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-python-代码实现"}},[t._v("#")]),t._v(" 4. Python 代码实现")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("None")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("None")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("not")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("isinstance")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" left\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("not")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("isinstance")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("float")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" right\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n partitionIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" partition"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n quickSort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n quickSort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left\n index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" index\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n swap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n swap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br")])]),n("h2",{attrs:{id:"_5-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-go-代码实现"}},[t._v("#")]),t._v(" 5. Go 代码实现")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("_quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("_quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tpartitionIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("_quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("_quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tpivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" left\n\tindex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\tindex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br")])]),n("h2",{attrs:{id:"_6-c-版"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-c-版"}},[t._v("#")]),t._v(" 6. C++版")]),t._v(" "),n("div",{staticClass:"language-C++ line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v(" //严蔚敏《数据结构》标准分割函数\n Paritition1(int A[], int low, int high) {\n int pivot = A[low];\n while (low < high) {\n while (low < high && A[high] >= pivot) {\n --high;\n }\n A[low] = A[high];\n while (low < high && A[low] <= pivot) {\n ++low;\n }\n A[high] = A[low];\n }\n A[low] = pivot;\n return low;\n }\n\n void QuickSort(int A[], int low, int high) //快排母函数\n {\n if (low < high) {\n int pivot = Paritition1(A, low, high);\n QuickSort(A, low, pivot - 1);\n QuickSort(A, pivot + 1, high);\n }\n }\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("h2",{attrs:{id:"_7-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-java-代码实现"}},[t._v("#")]),t._v(" 7. Java 代码实现")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("QuickSort")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IArraySort")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 对 arr 进行拷贝,不改变参数内容")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" partitionIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" partitionIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 设定基准值(pivot)")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pivot "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n index"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pivot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br")])]),n("h2",{attrs:{id:"_8-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-php-代码实现"}},[t._v("#")]),t._v(" 8. PHP 代码实现")]),t._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$middle")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$leftArray")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("array")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$rightArray")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("array")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$i")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$i")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$middle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$rightArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$leftArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$leftArray")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$leftArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$leftArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$middle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$rightArray")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$rightArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("array_merge")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$leftArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$rightArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br")])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/115.876b06dc.js b/learning/.vuepress/dist/assets/js/115.876b06dc.js deleted file mode 100644 index 933e14b5..00000000 --- a/learning/.vuepress/dist/assets/js/115.876b06dc.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[115],{1029:function(s,t,a){s.exports=a.p+"assets/img/heapSort.658d0f58.gif"},1151:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:")]),s._v(" "),n("ol",[n("li",[s._v("大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;")]),s._v(" "),n("li",[s._v("小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;")])]),s._v(" "),n("p",[s._v("堆排序的平均时间复杂度为 Ο(nlogn)。")]),s._v(" "),n("h2",{attrs:{id:"_1-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[s._v("#")]),s._v(" 1. 算法步骤")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("将待排序序列构建成一个堆 H[0……n-1],根据(升序降序需求)选择大顶堆或小顶堆;")])]),s._v(" "),n("li",[n("p",[s._v("把堆首(最大值)和堆尾互换;")])]),s._v(" "),n("li",[n("p",[s._v("把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;")])]),s._v(" "),n("li",[n("p",[s._v("重复步骤 2,直到堆的尺寸为 1。")])])]),s._v(" "),n("h2",{attrs:{id:"_2-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-动图演示"}},[s._v("#")]),s._v(" 2. 动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1029),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_3-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-javascript-代码实现"}},[s._v("#")]),s._v(" 3. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 建立大顶堆")]),s._v("\n len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 堆调整")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n len"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br")])]),n("h2",{attrs:{id:"_4-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-python-代码实现"}},[s._v("#")]),s._v(" 4. Python 代码实现")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" math\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("floor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n heapify"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" left\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" right\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n swap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n heapify"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("global")]),s._v(" arrLen\n arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n buildMaxHeap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n swap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n heapify"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br")])]),n("h2",{attrs:{id:"_5-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-go-代码实现"}},[s._v("#")]),s._v(" 5. Go 代码实现")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tarrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arrLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t\tarrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arrLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arrLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tleft "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\tright "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n\tlargest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" i\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tlargest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" left\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tlargest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" right\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arrLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br")])]),n("h2",{attrs:{id:"_6-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-java-代码实现"}},[s._v("#")]),s._v(" 6. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HeapSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n len"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("largest "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" largest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br")])]),n("h2",{attrs:{id:"_7-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-php-代码实现"}},[s._v("#")]),s._v(" 7. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("global")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("global")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$left")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$right")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$left")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$left")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$right")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$right")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$largest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("global")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("buildMaxHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/116.0507409d.js b/learning/.vuepress/dist/assets/js/116.0507409d.js deleted file mode 100644 index 22d2469f..00000000 --- a/learning/.vuepress/dist/assets/js/116.0507409d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{1030:function(s,t,a){s.exports=a.p+"assets/img/countingSort.827d96b8.gif"},1152:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。")]),s._v(" "),n("h2",{attrs:{id:"_1-算法步骤"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[s._v("#")]),s._v(" 1. 算法步骤")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("找出原数组中元素值最大的,记为max。")])]),s._v(" "),n("li",[n("p",[s._v("创建一个新数组count,其长度是max加1,其元素默认值都为0。")])]),s._v(" "),n("li",[n("p",[s._v("遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。")])]),s._v(" "),n("li",[n("p",[s._v("创建结果数组result,起始索引index。")])]),s._v(" "),n("li",[n("p",[s._v("遍历count数组,找出其中元素值大于0的元素,将其对应的索引作为元素值填充到result数组中去,每处理一次,count中的该元素值减1,直到该元素值不大于0,依次处理count中剩下的元素。")])]),s._v(" "),n("li",[n("p",[s._v("返回结果数组result。")])])]),s._v(" "),n("h2",{attrs:{id:"_2-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-动图演示"}},[s._v("#")]),s._v(" 2. 动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1030),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_3-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-javascript-代码实现"}},[s._v("#")]),s._v(" 3. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("countingSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" maxValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Array")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxValue"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n sortedIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n bucketLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arrLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" bucketLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sortedIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br")])]),n("h2",{attrs:{id:"_4-python-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-python-代码实现"}},[s._v("#")]),s._v(" 4. Python 代码实现")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("countingSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n bucketLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("bucketLen\n sortedIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n arrLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arrLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("not")]),s._v(" bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bucketLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sortedIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j\n sortedIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("h2",{attrs:{id:"_5-go-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-go-代码实现"}},[s._v("#")]),s._v(" 5. Go 代码实现")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("countingSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tbucketLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\tbucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" bucketLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 初始为0的数组")]),s._v("\n\n\tsortedIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n\tlength "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tbucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" bucketLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sortedIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j\n\t\t\tsortedIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t\t\tbucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br")])]),n("h2",{attrs:{id:"_6-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-java-代码实现"}},[s._v("#")]),s._v(" 6. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("CountingSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMaxValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("countingSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("countingSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" bucketLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucketLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" sortedIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" bucketLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sortedIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMaxValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br")])]),n("h2",{attrs:{id:"_7-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-php-代码实现"}},[s._v("#")]),s._v(" 7. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("countingSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("===")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$m")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$m")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$m")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arrLen")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arrLen")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("array_key_exists")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$sortedIndex")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("foreach")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucket")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("as")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$key")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$sortedIndex")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$key")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/117.4d75eb96.js b/learning/.vuepress/dist/assets/js/117.4d75eb96.js deleted file mode 100644 index a5d31856..00000000 --- a/learning/.vuepress/dist/assets/js/117.4d75eb96.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{1032:function(s,t,a){s.exports=a.p+"assets/img/bucket.414dd7da.gif"},1155:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:")]),s._v(" "),n("ol",[n("li",[s._v("在额外空间充足的情况下,尽量增大桶的数量")]),s._v(" "),n("li",[s._v("使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中")])]),s._v(" "),n("p",[s._v("同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。")]),s._v(" "),n("h2",{attrs:{id:"_1-什么时候最快"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-什么时候最快"}},[s._v("#")]),s._v(" 1. 什么时候最快")]),s._v(" "),n("p",[s._v("当输入的数据可以均匀的分配到每一个桶中。")]),s._v(" "),n("h2",{attrs:{id:"_2-什么时候最慢"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-什么时候最慢"}},[s._v("#")]),s._v(" 2. 什么时候最慢")]),s._v(" "),n("p",[s._v("当输入的数据被分配到了同一个桶中。")]),s._v(" "),n("h2",{attrs:{id:"_3-动图演示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-动图演示"}},[s._v("#")]),s._v(" 3. 动图演示")]),s._v(" "),n("p",[n("img",{attrs:{src:a(1032),alt:"动图演示"}})]),s._v(" "),n("h2",{attrs:{id:"_4-javascript-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-javascript-代码实现"}},[s._v("#")]),s._v(" 4. JavaScript 代码实现")]),s._v(" "),n("div",{staticClass:"language-js line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bucketSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" bucketSize")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("===")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" minValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" minValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n minValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 输入数据的最小值")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 输入数据的最大值")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//桶的初始化")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("DEFAULT_BUCKET_SIZE")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 设置桶的默认数量为5")]),s._v("\n bucketSize "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" bucketSize "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token constant"}},[s._v("DEFAULT_BUCKET_SIZE")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" bucketCount "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" minValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" bucketSize"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" buckets "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Array")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bucketCount"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//利用映射函数将数据分配到各个桶中")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("Math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" minValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" bucketSize"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("insertionSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对每个桶进行排序,这里使用了插入排序")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br")])]),n("h2",{attrs:{id:"_5-java-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-java-代码实现"}},[s._v("#")]),s._v(" 5. Java 代码实现")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BucketSort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("final")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InsertSort")]),s._v(" insertSort "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InsertSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bucketSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bucketSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" bucketSize"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" minValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" minValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n minValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" maxValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" bucketCount "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxValue "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" minValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" bucketSize"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" buckets "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("bucketCount"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 利用映射函数将数据分配到各个桶中")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" minValue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" bucketSize"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("arrAppend")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" arrIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" buckets"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对每个桶进行排序,这里使用了插入排序")]),s._v("\n bucket "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" insertSort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" bucket"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arrIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/**\n * 自动扩容,并保存数据\n *\n * @param arr\n * @param value\n */")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("arrAppend")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br")])]),n("h2",{attrs:{id:"_6-php-代码实现"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-php-代码实现"}},[s._v("#")]),s._v(" 6. PHP 代码实现")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bucketSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketSize")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("===")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketCount")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$maxValue")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketSize")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$buckets")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("array")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$buckets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$buckets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$buckets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$minValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketSize")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("array")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$buckets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketTmp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$buckets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketTmp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketTmp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$bucketTmp")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/118.5ecf1131.js b/learning/.vuepress/dist/assets/js/118.5ecf1131.js deleted file mode 100644 index 99c00b59..00000000 --- a/learning/.vuepress/dist/assets/js/118.5ecf1131.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{1045:function(t,r,o){"use strict";o.r(r);var e=o(3),v=Object(e.a)({},(function(){var t=this,r=t.$createElement,o=t._self._c||r;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("p",[t._v("小浩算法是我在疫情期间完成的一部图解算法题典!目前共完成 "),o("font",{attrs:{color:"red"}},[o("b",[t._v("105道")])]),t._v("\n高频面试算法题目,全部采用漫画图解的方式。该教程目前共有 "),o("font",{attrs:{color:"red"}},[o("b",[t._v("11w")])]),t._v(" 人阅读。\n面向 "),o("font",{attrs:{color:"red"}},[o("b",[t._v("算法小白")])]),t._v(" 和 "),o("font",{attrs:{color:"red"}},[o("b",[t._v("初中阶读者")])]),t._v("。所有代码均在 leetcode 上测试运行,可以直接右上角搜索题号。")],1),t._v(" "),o("div",{staticClass:"custom-block danger"},[o("p",{staticClass:"custom-block-title"},[t._v("重要")]),t._v(" "),o("p",[t._v("目前该教程"),o("b",[t._v("全部免费")]),t._v(",正因如此被一些不良商家拿去卖钱! 所以我把全部的内容都同步到了 "),o("a",{attrs:{href:"https://github.com/geekxh/hello-algorithm",target:"_blank",rel:"noopener noreferrer"}},[t._v("github"),o("OutboundLink")],1),t._v(","),o("b",[t._v("希望大家可以帮我点一个 star,防止有更多的人上当受骗!")]),t._v(" 小浩感激不尽!")])]),t._v(" "),o("hr"),t._v(" "),o("p",[t._v("为了提高大家的学习效率,我做了两件事:")]),t._v(" "),o("p",[t._v("1、首先创建了"),o("b",[t._v("万人刷题群")]),t._v(",群里无广告,不套路。下方扫码回复"),o("font",{attrs:{color:"red"}},[o("b",[t._v("【进群】")])]),t._v(" 即可。")],1),t._v(" "),o("p",[t._v("2、同时我把自己写的所有内容整理成了一本电子书。下方扫码回复"),o("font",{attrs:{color:"red"}},[o("b",[t._v("【999】")])]),t._v(" 下载。")],1),t._v(" "),o("center",[o("img",{attrs:{src:"/code.png",alt:"JPEG"}})])],1)}),[],!1,null,null,null);r.default=v.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/119.05aaae74.js b/learning/.vuepress/dist/assets/js/119.05aaae74.js deleted file mode 100644 index 8eff3c82..00000000 --- a/learning/.vuepress/dist/assets/js/119.05aaae74.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{1043:function(a,t,s){"use strict";s.r(t);var r=s(3),v=Object(r.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"为什么要做这样的一个算法图解合集"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#为什么要做这样的一个算法图解合集"}},[a._v("#")]),a._v(" 为什么要做这样的一个算法图解合集")]),a._v(" "),s("p",[a._v("网上的算法教程杂乱且分散,质量层次不齐,浪费了大家大量宝贵的时间。很多题解,在我掌握题目后去看都费劲,更何况对于一些初学者。")]),a._v(" "),s("h2",{attrs:{id:"本教程阅读门槛"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#本教程阅读门槛"}},[a._v("#")]),a._v(" 本教程阅读门槛")]),a._v(" "),s("p",[a._v("本教程基本没有学习门槛。因为在每道题目中,我都会尽量去串基础知识,以达到学以致用的效果。")]),a._v(" "),s("h2",{attrs:{id:"学完本教程期望达到什么样的目的"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#学完本教程期望达到什么样的目的"}},[a._v("#")]),a._v(" 学完本教程期望达到什么样的目的")]),a._v(" "),s("ul",[s("li",[a._v("掌握基本的数据结构与算法")]),a._v(" "),s("li",[a._v("掌握各类型高频面试算法题")])]),a._v(" "),s("h2",{attrs:{id:"本教程有何特色"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#本教程有何特色"}},[a._v("#")]),a._v(" 本教程有何特色")]),a._v(" "),s("p",[a._v("每一道算法题都配有完整图解!仅此一家!")]),a._v(" "),s("h2",{attrs:{id:"题解是围绕什么编写的"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#题解是围绕什么编写的"}},[a._v("#")]),a._v(" 题解是围绕什么编写的")]),a._v(" "),s("p",[a._v("掌握!所有的题解都以掌握二字为前提。不会追求过多的奇淫技巧,毕竟我们不是专门研究算法的人。我见过太多算法初学者,一个题解看不懂,转头又去看第二个题解,第二个看不懂,又去看第三个,直到最后放弃掉。浪费了时间,题目还是不会做,这图什么呢?所以本教程所有的题解都是以掌握为目标,尽量把每一道题的思路都讲的明明白白的。")]),a._v(" "),s("h2",{attrs:{id:"题解是否严谨"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#题解是否严谨"}},[a._v("#")]),a._v(" 题解是否严谨")]),a._v(" "),s("p",[a._v("绝对严谨,所有的题解都在leetcode上进行过测试运行。")]),a._v(" "),s("h2",{attrs:{id:"没学过-java、go-是否可以学习"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#没学过-java、go-是否可以学习"}},[a._v("#")]),a._v(" 没学过 java、go 是否可以学习")]),a._v(" "),s("p",[a._v("当然可以。我期望大家更多的是去关注算法的本身,而不是语言层面的东西。所以本教程,其实各语言都会使用一些,并不局限于 java、go。但是,我绝对不会使用任何语法特性!我希望大家不要被语言所束缚!")]),a._v(" "),s("h2",{attrs:{id:"是否可以按照本教程顺序来刷题"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#是否可以按照本教程顺序来刷题"}},[a._v("#")]),a._v(" 是否可以按照本教程顺序来刷题")]),a._v(" "),s("p",[a._v("当然可以。一般刷题我们有两种策略,一种就是刷 leetcode 前一百道题目,另一种就是根据分类刷题。刷 leetcode 前一百道题,是因为这些题目都是经典题目。而根据分类,更适合算法小白和初中阶段读者。所以我在这里选择了根据分类来汇编,这样我们还可以在做一些题目的时候,与前面同类型的题目进行比较。")]),a._v(" "),s("h2",{attrs:{id:"这些题目刷完能达到什么效果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#这些题目刷完能达到什么效果"}},[a._v("#")]),a._v(" 这些题目刷完能达到什么效果")]),a._v(" "),s("p",[a._v("刷完再说!")]),a._v(" "),s("h2",{attrs:{id:"你需要做什么"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#你需要做什么"}},[a._v("#")]),a._v(" 你需要做什么")]),a._v(" "),s("p",[a._v("开干!奥利给!")]),a._v(" "),s("h2",{attrs:{id:"看完题目还是不懂怎么办?"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#看完题目还是不懂怎么办?"}},[a._v("#")]),a._v(" 看完题目还是不懂怎么办?")]),a._v(" "),s("p",[a._v("下方扫码,加我微信,我拉你到刷题群。和大家一起交流学习!(备注:进群)")]),a._v(" "),s("img",{staticStyle:{zoom:"67%"},attrs:{src:"/code.png",alt:"PNG",width:"300/"}})])}),[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/12.c91672d5.js b/learning/.vuepress/dist/assets/js/12.c91672d5.js deleted file mode 100644 index bbf3afbb..00000000 --- a/learning/.vuepress/dist/assets/js/12.c91672d5.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{1005:function(t,s,a){t.exports=a.p+"assets/img/1.e3a1f41f.gif"},1006:function(t,s,a){t.exports=a.p+"assets/img/2.3e1b3fee.jpg"},1007:function(t,s,a){t.exports=a.p+"assets/img/3.96d46fed.gif"},1008:function(t,s,a){t.exports=a.p+"assets/img/4.08f28007.jpg"},1009:function(t,s,a){t.exports=a.p+"assets/img/5.36f3611e.jpg"},1010:function(t,s,a){t.exports=a.p+"assets/img/6.19b1a4e0.jpg"},1011:function(t,s,a){t.exports=a.p+"assets/img/7.4d3f86e3.jpg"},1012:function(t,s,a){t.exports=a.p+"assets/img/8.e26022ef.gif"},1013:function(t,s,a){t.exports=a.p+"assets/img/9.6fc15e39.jpg"},1014:function(t,s,a){t.exports=a.p+"assets/img/10.636058c2.jpg"},1015:function(t,s,a){t.exports=a.p+"assets/img/11.1ae1fab1.jpg"},1016:function(t,s,a){t.exports=a.p+"assets/img/12.db457c21.gif"},1017:function(t,s,a){t.exports=a.p+"assets/img/13.cc3506e4.gif"},1145:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("img",{attrs:{src:a(1005),alt:"PNG"}}),t._v(" "),n("blockquote",[n("p",[t._v("今天是小浩算法 “365刷题计划” 第103天。这是前几天一个同学去滴滴面试的原题。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目和昨天讲的生命游戏有一点是很像的,就是同样也要求"),n("strong",[t._v("原地旋转")]),t._v("。其实在很多矩阵的题目中,都会有这样的要求,大家需要注意一下。")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第48题:旋转图像")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个 n × n 的二维矩阵表示一个图像。")])])])]),t._v(" "),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("p",[t._v("你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("给定 matrix = \n[\n [1,2,3],\n [4,5,6],\n [7,8,9]\n],\n\n原地旋转输入矩阵,使其变为:\n[\n [7,4,1],\n [8,5,2],\n [9,6,3]\n]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("给定 matrix =\n[\n [ 5, 1, 9,11],\n [ 2, 4, 8,10],\n [13, 3, 6, 7],\n [15,14,12,16]\n], \n\n原地旋转输入矩阵,使其变为:\n[\n [15,13, 2, 5],\n [14, 3, 4, 1],\n [12, 6, 8, 9],\n [16, 7,10,11]\n]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("题目理解起来还是很容易的:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1006),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[t._v("#")]),t._v(" 02、题解分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这是一道看起来容易,但其实非常考察细心程度的算法题目,有太多地方会出现失误。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们用代码来旋转矩阵,肯定不能说像拿着一个东西整体直接旋转,类似这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(1007),alt:"PNG"}}),t._v(" "),n("p",[t._v("一般容易想到的是,一层层的从外到内旋转每一圈(至于为什么不从内到外,如果你觉得方便,也ok),也就是俗称的找框框:")]),t._v(" "),n("img",{staticStyle:{zoom:"33%"},attrs:{src:a(1008),alt:"PNG"}}),t._v(" "),n("p",[t._v("对每个框框,其实都有 4 个顶点:")]),t._v(" "),n("img",{staticStyle:{zoom:"33%"},attrs:{src:a(1009),alt:"PNG"}}),t._v(" "),n("p",[t._v("剩下的就是交换这四个顶点的值:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1010),alt:"PNG"}}),t._v(" "),n("p",[t._v("交换完毕之后,再继续交换移动后的四个顶点:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1011),alt:"PNG"}}),t._v(" "),n("p",[t._v("那代码实现其实就很简单了:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[t._v("我们通过 x 和 y 就可以定义这个框框的边界")]),t._v(" "),n("li",[t._v("找到框框后,我们再通过框框边界来定义出4个顶点")]),t._v(" "),n("li",[t._v("然后完成交换")])]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("rotate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" e "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" e"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n temp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" temp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("当然,上面是一个 n x n 的矩阵找框框,如果不是 n x n 其实也类似,大家有兴趣可以看下下面这道:")]),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.99.其他补充题目/01.html"}},[t._v("螺旋矩阵(54)")])],1),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那我们除了找框框之外,还能不能有一些别的解法呢?当然可以,想想小时候我们通过对折来完成的填字游戏。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1012),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们观察这个矩阵:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1013),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们观察这个矩阵,向右旋转90°,是不是可以理解为"),n("strong",[t._v("先上下翻转,再沿对角线翻转")]),t._v(":")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1014),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据分析,完成代码(其实应该用Go写,交换元素会方便许多....):")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//JAVA")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("rotate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//上下翻转 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//对角线翻转 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(1015),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、算法小知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、算法小知识"}},[t._v("#")]),t._v(" 03、算法小知识")]),t._v(" "),n("blockquote",[n("p",[t._v("骑士巡逻(英语:Knight's tour)是指在按照国际象棋中骑士的规定走法走遍整个棋盘的每一个方格,而且每个网格只能够经过一次。假若骑士能够从走回到最初位置,则称此巡逻为“封闭巡逻”,否则,称为“开巡逻”。对于8*8棋盘,一共有26,534,728,821,064种封闭巡逻,但是到底有多少种开巡逻仍然未知。")])]),t._v(" "),n("img",{attrs:{src:a(1016),alt:"PNG"}}),t._v(" "),n("img",{attrs:{src:a(1017),alt:"PNG"}}),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/120.c5b701e3.js b/learning/.vuepress/dist/assets/js/120.c5b701e3.js deleted file mode 100644 index 4448b35b..00000000 --- a/learning/.vuepress/dist/assets/js/120.c5b701e3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{1048:function(t,r,e){"use strict";e.r(r);var n=e(3),o=Object(n.a)({},(function(){var t=this,r=t.$createElement,e=t._self._c||r;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[e("a",{attrs:{href:"https://pan.baidu.com/s/1L7tO8a99B-c5xHMPrUKmqQ",target:"_blank",rel:"noopener noreferrer"}},[t._v("点击下载我写的电子书:1u28 (希望下方扫码支持一下,谢谢)"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("扫码回复"),e("font",{attrs:{color:"red"}},[e("b",[t._v("【进群】")])]),t._v(" ,加入万人刷题群,群内可 BAT 内推。")],1),t._v(" "),e("p",[t._v("扫码回复"),e("font",{attrs:{color:"red"}},[e("b",[t._v("【999】")])]),t._v(",下载我整理的 40 张高清思维导图。")],1),t._v(" "),e("center",[e("img",{attrs:{src:"/code.png",alt:"JPEG"}})]),t._v(" "),e("p",[t._v("导图目录如下:")]),t._v(" "),e("center",[e("img",{staticStyle:{zoom:"50%"},attrs:{src:"/daotu-1.png",alt:"JPEG"}})])],1)}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/121.69753711.js b/learning/.vuepress/dist/assets/js/121.69753711.js deleted file mode 100644 index cd29eaac..00000000 --- a/learning/.vuepress/dist/assets/js/121.69753711.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{1090:function(_,v,t){"use strict";t.r(v);var r=t(3),s=Object(r.a)({},(function(){var _=this,v=_.$createElement,t=_._self._c||v;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("blockquote",[t("p",[_._v("在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,尤其以 FLAG(Facebook, LinkedIn, Amazon, Google)等公司为典型。而这类问题的背后,很多都有博弈论的影子。所以在本系列,我将为大家分享一整套需要掌握的"),t("strong",[_._v("博弈论")]),_._v("相关知识,希望大家可以喜欢。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("PS:本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高自身分析问题的能力。")])]),_._v(" "),t("h2",{attrs:{id:"_01、红眼睛和蓝眼睛"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_01、红眼睛和蓝眼睛"}},[_._v("#")]),_._v(" 01、红眼睛和蓝眼睛")]),_._v(" "),t("table",[t("thead",[t("tr",[t("th",[_._v("红眼睛和蓝眼睛")])])]),_._v(" "),t("tbody",[t("tr",[t("td",[_._v("一个岛上有100个人,其中有5个红眼睛,95个蓝眼睛。这个岛有三个奇怪的宗教规则。")])])])]),_._v(" "),t("p",[_._v("1.他们不能照镜子,不能看自己眼睛的颜色。")]),_._v(" "),t("p",[_._v("2.他们不能告诉别人对方的眼睛是什么颜色。")]),_._v(" "),t("p",[_._v("3.一旦有人知道了自己是红眼睛,他就必须在当天夜里自杀。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("某天,有个旅行者到了这个岛上。由于不知道这里的规矩,所以他在和全岛人一起狂欢的时候,不留神就说了一句话:【你们这里有红眼睛的人。】")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("问题:假设这个岛上的人每天都可以看到其他所有人,每个人都可以做出缜密的逻辑推理,请问岛上会发生什么?")]),_._v(" "),t("h2",{attrs:{id:"_02、题目分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[_._v("#")]),_._v(" 02、题目分析")]),_._v(" "),t("p",[_._v("题目乍看之下,没有任何逻辑可言!以目测条件,基本无法完成任何正常的推理。但是在仔细推敲之后,我们可以将问题简化,从假设只有1个红眼睛开始分析。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("我们假设岛上只有1个红眼睛的人,还有99个都是蓝眼睛。因为这个旅行者说了“这里有红眼睛的人”,"),t("strong",[_._v("那么在第一天的时候,这个红眼睛会发现其他的人都是蓝眼睛")]),_._v("(与此同时,其他人因为看到了这个红眼睛的人,所以都确认了自己的安全)"),t("strong",[_._v("那么这天晚上,这个红眼睛的人一定会自杀!")])]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("继续分析,假设这个岛上有2个红眼睛,那么当旅行者说“这里有红眼睛的人”之后的第一天,这两个红眼睛分别发现还有别的红眼睛存在,所以他们当天晚上认为自己是安全的。但是到了第二天,红眼睛惊讶的发现**,另一个红眼睛的人竟然没有自杀(说明岛上有不止一个红眼睛),并且当天他们也没有发现有别的红眼睛存在(说明另一个红眼睛就是自己)"),t("strong",[_._v("WTF,那肯定另一个红眼睛就是自己了,所以")]),_._v("在第二天夜里,两个红眼睛的人会同时自杀**!")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v('继续分析,假如岛上红眼睛有3个。那么在第一天,红眼睛发现了岛上还有另外两个红眼睛,红眼睛呵呵一笑,“反正不是我”。到了第二天,红眼睛仍然看到了另外两个红眼睛,红眼睛心想,"这下你两该完蛋了吧",毕竟你两都知道了自己是红眼睛,晚上回去统统自杀吧!(根据上面的推论得出)但是惊奇的是,'),t("strong",[_._v("到了第三天,红眼睛发现另外两个红眼睛竟然都没有自杀。")]),_._v("("),t("strong",[_._v("说明岛上红眼睛的人不止两个")]),_._v(")并且当天红眼睛也没发现新的红眼睛("),t("strong",[_._v("说明还有一个红眼睛就是自己")]),_._v(")所以在第三天的夜里,三个红眼睛会同时自杀。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("根据上面的推论,"),t("strong",[_._v("假设有N个红眼睛,那么到了第N天,这N个红眼睛就会自杀")]),_._v("。所以最终这个岛上红眼睛的人会统统自杀!这就是答案,生活就是这么朴实无华,且枯燥。")]),_._v(" "),t("h2",{attrs:{id:"_03、旅客的挽回"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_03、旅客的挽回"}},[_._v("#")]),_._v(" 03、旅客的挽回")]),_._v(" "),t("p",[_._v("上面的分析大家应该都看懂了。但若是在旅客说完这句话后,其并没有离开这个岛。同时他也看到了周围人眼里的惊慌和失措,这个时候,旅客为自己的行为感到了懊恼和悔恨!旅客决定对自己的话进行挽回,旅客又该怎么做呢?")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("这里我提供一种思路,"),t("strong",[_._v("旅客可以在第N次集会上杀掉N个红眼睛")]),_._v(',让这N个红眼睛 “GO TO SLEEP”,就可以中断事件的推理。事实上,基于人道主义,旅客并不需要手动杀人,她只需要在第N天的时候告诉这N个人,你们是红眼睛,那么这天晚上,这N个人就会自杀。"All RETURN",一切将回归秩序~')]),_._v(" "),t("br")])}),[],!1,null,null,null);v.default=s.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/122.63d86812.js b/learning/.vuepress/dist/assets/js/122.63d86812.js deleted file mode 100644 index 970a0496..00000000 --- a/learning/.vuepress/dist/assets/js/122.63d86812.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{1088:function(_,v,t){"use strict";t.r(v);var s=t(3),r=Object(s.a)({},(function(){var _=this,v=_.$createElement,t=_._self._c||v;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("blockquote",[t("p",[_._v("在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,尤其以 FLAG(Facebook, LinkedIn, Amazon, Google)等公司为典型。而这类问题的背后,很多都有博弈论的影子。所以在本系列,我将为大家分享一整套需要掌握的"),t("strong",[_._v("博弈论")]),_._v("相关知识,希望大家可以喜欢。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("PS:本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高自身分析问题的能力。")])]),_._v(" "),t("h2",{attrs:{id:"_01、海盗分金币问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_01、海盗分金币问题"}},[_._v("#")]),_._v(" 01、海盗分金币问题")]),_._v(" "),t("table",[t("thead",[t("tr",[t("th",[_._v("海盗分金币")])])]),_._v(" "),t("tbody",[t("tr",[t("td",[_._v("在大海上,有5个海盗抢得100枚金币,他们决定每一个人按顺序依次提出自己的分配方案,如果提出的方案没有获得半数或半数以上的人的同意,则这个提出方案的人就被扔到海里喂鲨鱼。那么第一个提出方案的人要怎么做,才能使自己的利益最大化?")])])])]),_._v(" "),t("p",[_._v("海盗们有如下特点:")]),_._v(" "),t("p",[_._v("1.足智多谋,总是采取最优策略。")]),_._v(" "),t("p",[_._v("2.贪生怕死,尽量保全自己性命。")]),_._v(" "),t("p",[_._v("3.贪得无厌,希望自己得到越多宝石越好")]),_._v(" "),t("p",[_._v("4.心狠手辣,在自己利益最大的情况下希望越多人死越好。")]),_._v(" "),t("p",[_._v("5.疑心多虑,不信任彼此,尽量确保自身利益不寄希望与别人给自己更大利益。")]),_._v(" "),t("h2",{attrs:{id:"_02、题目分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[_._v("#")]),_._v(" 02、题目分析")]),_._v(" "),t("p",[_._v("首先我们很容易会觉得,抽签到第一个提方案的海盗会很吃亏!因为只要死的人够多,那么平均每个人获取的金币就最多,而第一个提方案的人是最容易死的。但是事实是,在满足海盗特点的基础上,"),t("strong",[_._v("第一个提方案的海盗是最赚的")]),_._v(",我们一起来分析一下。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("假如我们设想只有两个海盗。那么不管第一个说什么,只要第二个人不同意,第二个人就可以得到全部的金币!所以"),t("strong",[_._v("第一个海盗必死无疑")]),_._v(",这个大家都能理解。(当然,这样的前提是一号提出方案后不可以马上自己同意,不然如果自己提出给自己全部金币的方案,然后自己支持,这样就是二号必死无疑)")]),_._v(" "),t("p",[_._v("假如现在我们加入第三个海盗,这时候原来的一号成为了二号,二号成为了三号。这时候现在的二号心里会清楚,"),t("strong",[_._v("如果他投死了一号,那么自己必死无疑")]),_._v("!所以根据贪生怕死的原则,二号肯定会让一号存活。而此时一号心理也清楚,无论自己提出什么样的方案,二号都会让自己存活,而这时只要加上自己的一票,就有半数通过,所以一号提出方案:把金币都给我。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("现在又继续加入了新的海盗!原来的1,2,3号,成为了现在的2,3,4号。这时候新的一号海盗洞悉了奥秘,知道了**如果自己死了,二号就可以获取全部的金币,**所以提出给三号和四号一人一个金币,一起投死2号。而与此同时,现在的3号和4号获取的要比三个人时多(三个人时自己获取不了任何金币),所以他们会同意这个方案!")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("现在加入我们的大Boss,最后一个海盗。根据分析,大Boss海盗1号推知出2号的方案后就可以提出(97,0,1,2,0)或者(97,0,1,0,2)的方案。这样的分配方案对现在的3号海盗相比现在的2号的分配方案还多了一枚金币,就会投赞成票,4号或者5号因为得到了2枚金币,相比2号的一枚多,也会支持1号,加上1号自己的赞成票,方案就会通过,即1号提出(97,0,1,2,0)或(97,0,1,0,2)的分配方案,大Boss成功获得了97枚金币。")]),_._v(" "),t("h2",{attrs:{id:"_03、思考"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_03、思考"}},[_._v("#")]),_._v(" 03、思考")]),_._v(" "),t("p",[_._v("最终,"),t("strong",[_._v("大Boss一号海盗得到97枚金币,投死了老二和老五")]),_._v(",这竟然是我们分析出的最佳方案!这个答案明显是反直觉的,如果你是老大,你敢这样分金币,必死无疑。可是,推理过程却非常严谨,无懈可击,那么问题出在哪里呢?")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v('其实,在"海盗分赃"模型中,任何"分配者"想让自己的方案获得通过的关键是,**事先考虑清楚"对手"的分配方案是什么,**'),t("strong",[_._v("并用最小的代价获取最大收益")]),_._v(","),t("strong",[_._v('拉拢"对手"分配方案中最不得意的人们')]),_._v("。1号看起来最有可能喂鲨鱼,但他牢牢地把握住先发优势,结果不但消除了死亡威胁,还收益最大。而5号,看起来最安全,没有死亡的威胁,甚至还能坐收渔人之利,却因不得不看别人脸色行事而只能分得一小杯羹。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("不过,模型任意改变一个假设条件,最终结果都不一样。而现实世界远比模型复杂。"),t("strong",[_._v("因为假定所有人都理性,本身就是不理性的")]),_._v("。回到“海盗分金”的模型中,只要3号、4号或5号中有一个人偏离了绝对聪明的假设,海盗1号无论怎么分都可能会被扔到海里去了。所以,1号首先要考虑的就是他的海盗兄弟们的聪明和理性究竟靠得住靠不住,否则先分者必定倒霉。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("如果某人和一号本身不对眼,就想丢他喂鲨鱼。果真如此,1号自以为得意的方案岂不成了自掘坟墓。再就是俗话所说的“人心隔肚皮”。由于信息不对称,谎言和虚假承诺就大有用武之地,而阴谋也会像杂草般疯长,并借机获益。如果2号对3、4、5号大放烟幕弹,宣称对于1号所提出任何分配方案,他一定会再多加上一个金币给他们。这样,结果又当如何?")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("通常,现实中人人都有自认的公平标准,因而时常会嘟嚷:“"),t("strong",[_._v("谁动了我的奶酪?")]),_._v("”可以料想,一旦1号所提方案和其所想的不符,就会有人大闹。当大家都闹起来的时候,1号能拿着97枚金币毫发无损、镇定自若地走出去吗?最大的可能就是,海盗们会要求修改规则,然后重新分配。当然,大家也可以讲清楚下次再得100枚金币时,先由2号海盗来分…然后是3号……颇有点像美国总统选举,轮流主政。说白了,其实是民主形式下的分赃制。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("最可怕的是其他四人形成一个反1号的大联盟并制定出新规则:四人平分金币,将1号扔进大海。这就颇有点阿Q式的革命理想:高举平均主义的旗帜,将富人扔进死亡深渊。")]),_._v(" "),t("br"),_._v(" "),t("p",[_._v("最后,这里也提供一份代码实现,供有兴趣的同学参考(该代码我大概看了一下,但是因为时间的关系,没有跑单测进行验证,特此说明!)")]),_._v(" "),t("br"),_._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[_._v("以上代码输出:5人时分配方案:[97, 0, 1, 0, 2]\n")])]),_._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[_._v("1")]),t("br")])]),t("br"),_._v(" "),t("p",[_._v("看懂了吗?如果看懂了,这里提出一个问题:假如我们将"),t("strong",[_._v("人性")]),_._v("考虑在内,同时也进行"),t("strong",[_._v("理性")]),_._v("的分析,如果你是老大,又该如何提出这个方案呢?大家在留言区留下自己的回答吧!")])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/123.6bf94e7d.js b/learning/.vuepress/dist/assets/js/123.6bf94e7d.js deleted file mode 100644 index 65c630f4..00000000 --- a/learning/.vuepress/dist/assets/js/123.6bf94e7d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{1114:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("blockquote",[a("p",[s._v("今天为大家分享一道看起来**“高大上****”**的题目。")]),s._v(" "),a("p",[s._v("话不多说,直接看题吧。")])]),s._v(" "),a("h2",{attrs:{id:"_01、水分子的产生"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、水分子的产生"}},[s._v("#")]),s._v(" 01、水分子的产生")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("水分子的产生")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子。")])])])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("这些线程应该三三成组突破屏障并能立即组合产生一个水分子。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("换句话说:")]),s._v(" "),a("p",[s._v("如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。")]),s._v(" "),a("p",[s._v("如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。")]),s._v(" "),a("p",[s._v("书写满足这些限制条件的氢、氧线程同步代码。")]),s._v(" "),a("br"),s._v(" "),a("p",[a("strong",[s._v("示例 1:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v('输入: "HOH"\n输出: "HHO"\n解释: "HOH" 和 "OHH" 依然都是有效解。\n')])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("br"),s._v(" "),a("p",[a("strong",[s._v("示例 2:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v('输入: "OOHHHH"\n输出: "HHOHHO"\n解释: "HOHHHO", "OHHHHO", "HHOHOH", "HOHHOH", "OHHHOH", "HHOOHH", "HOHOHH" 和 "OHHOHH" 依然都是有效解。\n')])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("br"),s._v(" "),a("p",[s._v("限制条件:")]),s._v(" "),a("ul",[a("li",[s._v("输入字符串的总长将会是 3n, 1 ≤ n ≤ 50;")]),s._v(" "),a("li",[s._v("输入字符串中的 “H” 总数将会是 2n;")]),s._v(" "),a("li",[s._v("输入字符串中的 “O” 总数将会是 n。")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("代码模板:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" H2O "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("H2O")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("hydrogen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Runnable")]),s._v(" releaseHydrogen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InterruptedException")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// releaseHydrogen.run() outputs "H". Do not change or remove this line. releaseHydrogen.run(); ')]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("oxygen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Runnable")]),s._v(" releaseOxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InterruptedException")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('// releaseOxygen.run() outputs "O". Do not change or remove this line.')]),s._v("\n releaseOxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br")])]),a("h2",{attrs:{id:"_02、java分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、java分析"}},[s._v("#")]),s._v(" 02、JAVA分析")]),s._v(" "),a("p",[s._v("乍看之下,题目貌似很高大上,不少同学一听多线程直接就慌了神。我们一起分析一下。一个氧消耗两个氢,两个氢供给一个氧。我们只要可以模拟氢和氧的供给关系,就可以顺利进行求解。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("这里先介绍一下Java中的Semaphore:Semaphore是 synchronized 的加强版,作用是"),a("strong",[s._v("控制线程的并发数量")]),s._v("。可以通过 acquire 和 release 来进行类似 lock 和 unlock 的操作。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("acquire")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//释放一个信号量,这时候信号量个数+1,")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("release")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("什么?听不懂!大白话就是叫做 Semaphore 的这个东东,可以控制同时有多少线程可以进去,比一般的锁要稍微高级那么一点点。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("由于题目中给的限制条件,已经明确说明了H是2n,O是n,所以我们不需要考虑无法构成水分子的情况。我们分别定义H和O的信号量,都初始化为2个信号量。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("在每一次产生O的过程中,都需要等待产生了两个H。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("util"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("concurrent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Semaphore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" H2O "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("H2O")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Semaphore")]),s._v(" h "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Semaphore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Semaphore")]),s._v(" o "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Semaphore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("hydrogen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Runnable")]),s._v(" releaseHydrogen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InterruptedException")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("acquire")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n releaseHydrogen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("release")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("oxygen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Runnable")]),s._v(" releaseOxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("InterruptedException")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("acquire")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n releaseOxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("release")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br")])]),a("h2",{attrs:{id:"_03、c-代码分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、c-代码分析"}},[s._v("#")]),s._v(" 03、C++代码分析")]),s._v(" "),a("p",[s._v("如果没有原生的信号量支持怎么办?其实也是一样的。我们可以通过锁来模拟信号量。这里加一个C++版本的实现。")]),s._v(" "),a("div",{staticClass:"language-c++ line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("class H2O { \nprivate: \n int countOxygen; \n pthread_mutex_t lockHy; \n pthread_mutex_t lockOx; \npublic: \n H2O() { \n pthread_mutex_init(&lockOx,NULL);        \n pthread_mutex_init(&lockHy,NULL);\n pthread_mutex_lock(&lockOx);\n countOxygen = 2;\n }\n void hydrogen(function releaseHydrogen) {\n pthread_mutex_lock(&lockHy);\n releaseHydrogen();\n countOxygen--;\n if(countOxygen > 0){\n pthread_mutex_unlock(&lockHy);\n }else{\n pthread_mutex_unlock(&lockOx);\n }\n }\n void oxygen(function releaseOxygen) {\n pthread_mutex_lock(&lockOx);\n releaseOxygen();\n countOxygen = 2;\n pthread_mutex_unlock(&lockHy);\n }\n};\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br")])]),a("h2",{attrs:{id:"_03、python代码分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、python代码分析"}},[s._v("#")]),s._v(" 03、Python代码分析")]),s._v(" "),a("p",[s._v("好吧,其他语言都有并发。但是我PY竟然连并发都没有(杠精勿扰,我知道有 threading 库可以用。并且里边也已经提供了现成的信号量可以用)这种情况下怎么办?")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("还是可以解决,我们可以用队列模拟进行实现")]),s._v(" "),a("div",{staticClass:"language-python line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("H2O")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" __init__"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" \n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("o "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" hydrogen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" releaseHydrogen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'Callable[[], None]'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("None")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("append"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("releaseHydrogen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("7")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" oxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" releaseOxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'Callable[[], None]'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("None")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("append"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("releaseOxygen"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("pop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("h"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("pop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("pop"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("h2",{attrs:{id:"_04、go语言版本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_04、go语言版本"}},[s._v("#")]),s._v(" 04、GO语言版本")]),s._v(" "),a("p",[s._v("已经提供了PY,JAVA,C++的版本。对于GO而言,不管你是通过channel来模拟信号量的方式,还是参照PY的方式进行实现,我觉得应该都可以完成。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/124.2c04d5ed.js b/learning/.vuepress/dist/assets/js/124.2c04d5ed.js deleted file mode 100644 index 40ed5ec0..00000000 --- a/learning/.vuepress/dist/assets/js/124.2c04d5ed.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{1113:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("blockquote",[a("p",[s._v("小浩算法改版了,大家看一下风格怎么样,还喜欢吗?所有的排版,绘图,文案,题解都是由小浩一人完成哦~")]),s._v(" "),a("p",[s._v("今天为大家分享一道关于**“救生艇****”**的题目。")]),s._v(" "),a("p",[s._v("话不多说,直接看题吧。")])]),s._v(" "),a("h2",{attrs:{id:"_01、题目示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("第881题:救生艇")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。")])])])]),s._v(" "),a("p",[a("strong",[s._v("示例 1:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入:people = [1,2], limit = 3\n输出:1\n解释:1 艘船载 (1, 2)\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("br"),s._v(" "),a("p",[a("strong",[s._v("示例 2:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入:people = [3,2,2,1], limit = 3\n输出:3\n解释:3 艘船分别载 (1, 2), (2) 和 (3)\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("br"),s._v(" "),a("p",[a("strong",[s._v("示例 3:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入:people = [3,5,3,4], limit = 5\n输出:4\n解释:4 艘船分别载 (3), (3), (4), (5)\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("br"),s._v(" "),a("p",[a("strong",[s._v("提示:")])]),s._v(" "),a("ul",[a("li",[s._v("1 <= people.length <= 50000")]),s._v(" "),a("li",[s._v("1 <= people[i] <= limit <= 30000")])]),s._v(" "),a("h2",{attrs:{id:"_02、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),a("p",[s._v("这不是一道算法题,这是一个脑筋急转弯。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("一个船最多可以装两个人,并且不能把船压垮。同时要求把这些人可以统统装下的最小船数。用脚趾头也可以想到,我们需要"),a("strong",[s._v("尽最大努力的去维持一个床上得有两个人")]),s._v("。。哦,不,船上。这是什么思想?Bingo,贪心。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("思路很简单:")]),s._v(" "),a("ol",[a("li",[s._v("我们首先需要让这些人"),a("strong",[s._v("根据体重进行排序。")])]),s._v(" "),a("li",[s._v("同时"),a("strong",[s._v("维护两个指针,每次让最重的一名上船,同时让最轻的也上船")]),s._v("。(因为最重的要么和最轻的一起上船。要么就无法配对,只能自己占用一艘船的资源)")])]),s._v(" "),a("h2",{attrs:{id:"_03、java示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、java示例"}},[s._v("#")]),s._v(" 03、JAVA示例")]),s._v(" "),a("p",[s._v("根据分析,得到代码:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("numRescueBoats")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" limit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" ans "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ans"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" limit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n j"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" ans"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("h2",{attrs:{id:"_04、go示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_04、go示例"}},[s._v("#")]),s._v(" 04、GO示例")]),s._v(" "),a("p",[s._v("GO代码其实也一样:")]),s._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("numRescueBoats")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("people "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" limit "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n sort"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("Ints")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n ans :"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" j "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" people"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" limit "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n j"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n ans"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" ans\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br")])]),a("h2",{attrs:{id:"_05、题目扩展"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_05、题目扩展"}},[s._v("#")]),s._v(" 05、题目扩展")]),s._v(" "),a("p",[s._v("这里肯定马上就有细心的读者会问!为什么你每次是让最瘦的和最胖的来凑一对。而不是放弃掉这个最瘦的,去找一个逼近limit体重的人来乘船呢?这里要注意题目,"),a("strong",[s._v("因为题中已经告诉了, 一艘船仅能坐两人")]),s._v("。所以去找一个逼近limit体重的人是没有意义的。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("但是,这里并不妨碍我们将此题扩展进行思考。这里留下疑问,"),a("strong",[s._v("如果我们不对船上的人数进行限制")]),s._v(",那么应该如何来完成本题呢?大家可以尝试代码练习一下。")])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/125.dae9510e.js b/learning/.vuepress/dist/assets/js/125.dae9510e.js deleted file mode 100644 index 974c4f6a..00000000 --- a/learning/.vuepress/dist/assets/js/125.dae9510e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[125],{1153:function(s,a,t){"use strict";t.r(a);var n=t(3),r=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。")]),s._v(" "),t("p",[s._v("希尔排序是基于插入排序的以下两点性质而提出改进方法的:")]),s._v(" "),t("ul",[t("li",[s._v("插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;")]),s._v(" "),t("li",[s._v("但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;")])]),s._v(" "),t("p",[s._v("希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。")]),s._v(" "),t("h2",{attrs:{id:"_1-算法步骤"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-算法步骤"}},[s._v("#")]),s._v(" 1. 算法步骤")]),s._v(" "),t("ol",[t("li",[t("p",[s._v("选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;")])]),s._v(" "),t("li",[t("p",[s._v("按增量序列个数 k,对序列进行 k 趟排序;")])]),s._v(" "),t("li",[t("p",[s._v("每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。")])])]),s._v(" "),t("h2",{attrs:{id:"_2-javascript-代码实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-javascript-代码实现"}},[s._v("#")]),s._v(" 2. JavaScript 代码实现")]),s._v(" "),t("div",{staticClass:"language-js line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-js"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("shellSort")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token parameter"}},[s._v("arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" len "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n temp"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//动态定义间隔序列")]),s._v("\n gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Math"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n temp "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" temp"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br")])]),t("h2",{attrs:{id:"_3-python-代码实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-python-代码实现"}},[s._v("#")]),s._v(" 3. Python 代码实现")]),s._v(" "),t("div",{staticClass:"language-python line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-python"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("shellSort")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" math\n gap"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),t("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n temp "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("gap\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" temp"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v("gap\n arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp\n gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" math"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("floor"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br")])]),t("h2",{attrs:{id:"_4-go-代码实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-go-代码实现"}},[s._v("#")]),s._v(" 4. Go 代码实现")]),s._v(" "),t("div",{staticClass:"language-go line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-go"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("shellSort")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tlength "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\tgap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tgap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\ttemp "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t\tj "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" gap\n\t\t\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" temp "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t\tarr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t\t\tj "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" gap\n\t\t\t"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t\t\tarr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" temp\n\t\t"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t\tgap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br")])]),t("h2",{attrs:{id:"_5-java-代码实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-java-代码实现"}},[s._v("#")]),s._v(" 5. Java 代码实现")]),s._v(" "),t("div",{staticClass:"language-java line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ShellSort")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("implements")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IArraySort")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Override")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sourceArray"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 对 arr 进行拷贝,不改变参数内容")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("copyOf")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sourceArray"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sourceArray"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" tmp "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" tmp"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" gap"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" tmp"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gap "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" arr"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br")])]),t("h2",{attrs:{id:"_6-php-代码实现"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-php-代码实现"}},[s._v("#")]),s._v(" 6. PHP 代码实现")]),s._v(" "),t("div",{staticClass:"language-php line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-php"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("shellSort")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("count")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("floor")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$len")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$i")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$j")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$gap")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$temp")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$arr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/126.b897c930.js b/learning/.vuepress/dist/assets/js/126.b897c930.js deleted file mode 100644 index c14dd9f9..00000000 --- a/learning/.vuepress/dist/assets/js/126.b897c930.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{1156:function(t,e,n){"use strict";n.r(e);var s=n(3),l=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("这是一个彩蛋。")])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/127.3c1e0228.js b/learning/.vuepress/dist/assets/js/127.3c1e0228.js deleted file mode 100644 index eea4bebb..00000000 --- a/learning/.vuepress/dist/assets/js/127.3c1e0228.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[127],{355:function(n,w,o){}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/13.8b88dcbf.js b/learning/.vuepress/dist/assets/js/13.8b88dcbf.js deleted file mode 100644 index 78909745..00000000 --- a/learning/.vuepress/dist/assets/js/13.8b88dcbf.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{1102:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("昨天我们在“除了某个元素只出现一次以外,其余每个元素均出现二次”的条件下,通过使用“异或”的操作,找到了只出现一次的元素。那对于其余每个元素均出现三次的case,我们应该如何解决呢?一起来看下吧。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("看之前强烈建议复习昨天的文章:")]),t._v(" "),n("br"),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.8.位运算系列/learning/1.8/804.html"}},[t._v("只出现一次的数字(136)")])],1),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("这种通过改变题中条件,进而增加难度的方式,其实是出题者惯用的一种手段!")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第137题:只出现一次的数字Ⅱ")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?")])])])]),t._v(" "),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("p",[t._v("你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [2,2,3,2]\n输出: 3\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [0,1,0,1,0,1,99]\n输出: 99\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("br"),t._v(" "),n("p",[n("strong",[t._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),t._v(" "),n("h2",{attrs:{id:"_02、hashmap求解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、hashmap求解"}},[t._v("#")]),t._v(" 02、HashMap求解")]),t._v(" "),n("blockquote",[n("p",[t._v("很简单就能想到,说白了就是"),n("strong",[t._v("统计每个元素出现的次数,最终再返回次数为1的元素")]),t._v("。但是使用了额外空间。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("直接上代码:(go版本)")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//如果是其他语言,请注意对应的判空操作! ")]),t._v("\n m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" v "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" k\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(726),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、数学方式"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、数学方式"}},[t._v("#")]),t._v(" 03、数学方式")]),t._v(" "),n("blockquote",[n("p",[t._v("这个题目曾经在Google很火~目前国内应该也有很多厂子会问到。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("原理:[A,A,A,B,B,B,C,C,C] 和 [A,A,A,B,B,B,C],差了两个C。即:")]),t._v(" "),n("p",[t._v("3×("),n("em",[t._v("a")]),t._v(" "),n("em",[t._v("b")]),t._v(" "),n("em",[t._v("c")]),t._v(")−("),n("em",[t._v("a")]),t._v(" "),n("em",[t._v("a")]),t._v(" "),n("em",[t._v("a")]),t._v(" "),n("em",[t._v("b")]),t._v(" "),n("em",[t._v("b")]),t._v(" "),n("em",[t._v("b")]),t._v(" "),n("em",[t._v("c")]),t._v(")=2"),n("em",[t._v("c")])]),t._v(" "),n("p",[t._v("也就是说,如果把"),n("strong",[t._v("原数组去重、再乘以3得到的值,刚好就是要找的元素的2倍")]),t._v("。举个例子:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(727),alt:"PNG"}}),t._v(" "),n("p",[t._v("利用这个性质,进行求解:(python代码如下,这里要注意的是,使用int可能会因为超出界限报错)")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(728),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_04、位运算"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、位运算"}},[t._v("#")]),t._v(" 04、位运算")]),t._v(" "),n("blockquote",[n("p",[t._v("对于“每个其余元素,均出现了二次”之所以可以使用“"),n("strong",[t._v("异或")]),t._v("”进行求解,原因是因为“异或”操作可以让两数相同归 0。那对于其余元素出现三次的,是不是只要可以让其三者相同归 0,就能达到我们的目的呢?")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("这个思想可能比较简单,但是要让大家理解,还是有一定难度。如果大家准备好了,可以开始往下看。我看过leetcode上的题解,很多都是直接扔出来一个公式,其实讲的我认为并不是特别的清楚。所以我打算先把本题退化到“每个其余元素,均出现二次”的case来进行分析一下。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("假如我们有 [21,21,26] 三个数,是下面这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(729),alt:"PNG"}}),t._v(" "),n("p",[t._v("回想一下,之所以能用“"),n("strong",[t._v("异或")]),t._v("”,其实我们是完成了一个 "),n("strong",[t._v("同一位上有2个1清零")]),t._v(" 的过程。上面的图看起来可能容易,如果是这样 (下图应为26^21):")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(730),alt:"PNG"}}),t._v(" "),n("p",[t._v("那对于“每个其余元素,均出现了三次”也是一样,如果我们可以完成 **一个同一位上的三个1清零的过程,**也就是 a ?a ?a = 0,问题则迎刃冰解。那因为各语言中都没有这样一个现成的方法可以使用,所以我们需要构造一个。(想象一下,位运算也是造出来的对不对?)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(731),alt:"PNG"}}),t._v(" "),n("p",[t._v("如何构造,这里先说第一种方法(注意,到这里我们的问题已经转化成了定义一种 a ? a ? a = 0 的运算),观察一下“异或”运算:")]),t._v(" "),n("center",[t._v(" 1^1=0 ")]),t._v(" "),n("center",[t._v(" 1^0=1 ")]),t._v(" "),n("center",[t._v(" 0^1=1 ")]),t._v("\n是不是可以理解为,其实就是二进制的加法,然后砍掉进位呢?\n"),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(732),alt:"PNG"}}),t._v(" "),n("p",[n("strong",[t._v("砍掉进位的过程,是不是又可以理解为对 2 进行取模")]),t._v(",也就是取余。到了这里,问题已经非常非常明确了。那我们要完成一个 a ? a ? a = 0 的运算,是不是其实就是让其二进制的每一位数都相加,最后再对 3 进行一个取模的过程呢?(一样,如果要定义一个 a ? a ? a ? a = 0 的运算,那就最后对 4 进行取模就可以了)")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//初始化每一位1的个数为0 ")]),t._v("\n number "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//通过右移i位的方式,计算每一位1的个数")]),t._v("\n number "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//最终将抵消后剩余的1放到对应的位数上")]),t._v("\n res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" i\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("如果对上面的代码不能理解,可以看看这个图,假设只有一个数 [21],我们通过不断右移的方式,获取其每一位上的1。当然,这里因为余数都是1,所以肯定都保留了下来,然后与 1 进行 “与”运算,最终再将其放入到对应的位数上。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(733),alt:"PNG"}}),t._v(" "),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(734),alt:"PNG"}}),t._v(" "),n("p",[t._v("在上面的代码中,"),n("strong",[t._v("我们通过一个number,来记录每一位数出现的次数")]),t._v("。但是缺点是,我们记录了64位(Go语言中,int为32位以上)")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(735),alt:"PNG"}}),t._v(" "),n("p",[t._v("那如果我们可以同时对所有位进行计数,是不是就可以简化过程。因为我们的目的是把每一位与3取模进行运算,是不是就可以理解为其实是一个"),n("strong",[t._v("三进制")]),t._v("。如果大家听不懂三进制的话,可以简单理解为3次一循环,也就是 00 - 01 - 10 - 11。但是又因为对于 11 这种情况,我们需要砍掉(上面已经说过了,相当于 11 - 00 的转化),所以我们就只有3个状态,00 - 01 - 10,所以我们采用 a 和 b 来记录状态。其中的状态转移过程如下:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(736),alt:"PNG"}}),t._v(" "),n("p",[t._v("这里 a‘ 和 b’ 的意思代表着 a 和 b 下一次的状态。next 代表着下一个 bit 位对应的值。然后这是什么,不就是状态机嘛。。。我们通过 a 和 b 的状态变化,来完成次数统计。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("然后因为此图复杂,将其分别简化成 a 和 b 的卡诺图(卡诺图是逻辑函数的一种图形表示。两逻辑相邻项,合并为一项,保留相同变量,消去不同变量。先 b’ 后 a‘ )")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("next\\a,b")]),t._v(" "),n("th",[t._v("00")]),t._v(" "),n("th",[t._v("01")]),t._v(" "),n("th",[t._v("11")]),t._v(" "),n("th",[t._v("10")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("1")]),t._v(" "),n("td",[t._v("1")]),t._v(" "),n("td",[t._v("0")]),t._v(" "),n("td",[t._v("X")]),t._v(" "),n("td",[t._v("0")])]),t._v(" "),n("tr",[n("td",[t._v("0")]),t._v(" "),n("td",[t._v("0")]),t._v(" "),n("td",[t._v("1")]),t._v(" "),n("td",[t._v("X")]),t._v(" "),n("td",[t._v("0")])])])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("next\\a,b")]),t._v(" "),n("th",[t._v("00")]),t._v(" "),n("th",[t._v("01")]),t._v(" "),n("th",[t._v("11")]),t._v(" "),n("th",[t._v("10")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("1")]),t._v(" "),n("td",[t._v("0")]),t._v(" "),n("td",[t._v("1")]),t._v(" "),n("td",[t._v("X")]),t._v(" "),n("td",[t._v("0")])]),t._v(" "),n("tr",[n("td",[t._v("0")]),t._v(" "),n("td",[t._v("0")]),t._v(" "),n("td",[t._v("0")]),t._v(" "),n("td",[t._v("X")]),t._v(" "),n("td",[t._v("1")])])])]),t._v(" "),n("p",[t._v("然后我们根据卡诺图(这个卡诺图其实并不难看。。如果学习一下话,还是挺简单的。)写出关系式:")]),t._v(" "),n("center",[t._v(" a` = (a &~ next) | (b & next) ")]),t._v(" "),n("center",[t._v(" b` = (~a & ~b & next) | (b & ~next) ")]),t._v("\n然后就是套公式:(Java代码,注意Go语言中是不天然支持 ~ 这种运算的)\n"),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[t._v("class Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n public "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" next "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" ~next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("~a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" ~b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" ~next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br")])]),n("p",[t._v("当然,其实题解还可以再进一步优化,其实就是化简上一步中的公式:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[t._v("class Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n public "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" next "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),t._v(" next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" ~a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),t._v(" next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" ~b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[t._v("当然,这个解法就相当牛皮了,反正我第一次做肯定是想不到的。。。我看了一下,第一个给出这个解法的人,应该是一位国外的工程师(某扣上面有很多人其实都是把题解翻译过来的,当然我有时也会哈哈哈哈,我觉得这某种意义上讲也是一个好的现象,挺好)不过毕竟非原创,还是得说明一下!")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(737),alt:"PNG"}}),t._v(" "),n("br"),t._v(" "),n("p",[t._v("总之,今天的题目,有一定的难度!希望大家动脑动手动脚, 认真想想。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])],1)}),[],!1,null,null,null);s.default=e.exports},726:function(t,s,a){t.exports=a.p+"assets/img/1.4875b097.jpg"},727:function(t,s,a){t.exports=a.p+"assets/img/2.d061881a.jpg"},728:function(t,s,a){t.exports=a.p+"assets/img/3.34b978c4.jpg"},729:function(t,s,a){t.exports=a.p+"assets/img/4.aef60610.jpg"},730:function(t,s,a){t.exports=a.p+"assets/img/5.f6036c4a.jpg"},731:function(t,s,a){t.exports=a.p+"assets/img/6.b47733d0.jpg"},732:function(t,s,a){t.exports=a.p+"assets/img/7.84e9f7d6.jpg"},733:function(t,s,a){t.exports=a.p+"assets/img/8.e6a571aa.jpg"},734:function(t,s,a){t.exports=a.p+"assets/img/9.82e35d01.jpg"},735:function(t,s,a){t.exports=a.p+"assets/img/10.063d52f8.jpg"},736:function(t,s,a){t.exports=a.p+"assets/img/11.02c892eb.jpg"},737:function(t,s,a){t.exports=a.p+"assets/img/12.5a12e850.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/14.168d7583.js b/learning/.vuepress/dist/assets/js/14.168d7583.js deleted file mode 100644 index 630a3151..00000000 --- a/learning/.vuepress/dist/assets/js/14.168d7583.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{1124:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享很出名的 LRU 算法,第一讲共包括 4 节。")]),t._v(" "),n("ul",[n("li",[t._v("LRU概述")]),t._v(" "),n("li",[t._v("LRU使用")]),t._v(" "),n("li",[t._v("LRU实现")]),t._v(" "),n("li",[t._v("Redis近LRU概述")])])]),t._v(" "),n("h2",{attrs:{id:"_01、lru-概述"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、lru-概述"}},[t._v("#")]),t._v(" 01、LRU 概述")]),t._v(" "),n("p",[t._v("LRU 是 Least Recently Used 的缩写,译为最近最少使用。它的理论基础为“"),n("strong",[t._v("最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然不会被使用")]),t._v("”由于该思想非常契合业务场景 ,并且可以解决很多实际开发中的问题,所以我们经常通过 LRU 的思想来作缓存,一般也将其称为"),n("strong",[t._v("LRU缓存机制")]),t._v("。因为恰好 leetcode 上有这道题,所以我干脆把题目贴这里。但是对于 LRU 而言,希望大家不要局限于本题(大家不用担心学不会,我希望能做一个全网最简单的版本,希望可以坚持看下去!)下面,我们一起学习一下。")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第146题:LRU缓存机制")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作:获取数据 get 和 写入数据 put 。")])])])]),t._v(" "),n("p",[t._v("获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1 。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );\ncache.put(1, 1);\ncache.put(2, 2);\ncache.get(1); // 返回 1\ncache.put(3, 3); // 该操作会使得密钥 2 作废\ncache.get(2); // 返回 -1 (未找到)\ncache.put(4, 4); // 该操作会使得密钥 1 作废\ncache.get(1); // 返回 -1 (未找到)\ncache.get(3); // 返回 3\ncache.get(4); // 返回 4\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br")])]),n("h2",{attrs:{id:"_02、lru-使用(解释)"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、lru-使用(解释)"}},[t._v("#")]),t._v(" 02、LRU 使用(解释)")]),t._v(" "),n("p",[t._v("由于我实在担心部分同学完全懵逼零基础,所以我把上面的LRUCache的示例解释一下。")]),t._v(" "),n("p",[t._v("第一步:我们申明一个 LRUCache ,长度为 2。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(834),alt:"PNG"}}),t._v(" "),n("p",[t._v("第二步:我们分别向 cache 里边 put(1,1) 和 put(2,2),这里因为最近使用的是 2( put 也算作使用)所以2在前,1 在后。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(835),alt:"PNG"}}),t._v(" "),n("p",[t._v("第三步:我们 get(1),也就是我们使用了 1,所以需要将 1 移到前面。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(836),alt:"PNG"}}),t._v(" "),n("p",[t._v("第四步:此时我们 put(3,3),因为 2 是最近最少使用的,所以我们需要将 2 进行作废。此时我们再 get(2),就会返回 -1 。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(837),alt:"PNG"}}),t._v(" "),n("p",[t._v("第五步:我们继续 put(4,4),同理我们将 1 作废。此时如果 get(1) ,也是返回 -1 。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(838),alt:"PNG"}}),t._v(" "),n("p",[t._v("第六步:此时我们 get(3) ,实际为调整 3 的位置。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(839),alt:"PNG"}}),t._v(" "),n("p",[t._v("第七步:同理,get(4),继续调整 4 的位置。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(840),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、lru-实现(层层剖析)"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、lru-实现(层层剖析)"}},[t._v("#")]),t._v(" 03、LRU 实现(层层剖析)")]),t._v(" "),n("blockquote",[n("p",[t._v("上面的图搞了我半小时,基本不是弱智的话,应该都能理解 LRU 的使用了。现在我们聊一下实现。LRU 一般来讲,我们是使用"),n("strong",[t._v("双向链表")]),t._v("实现。基本上在面试的时候,能写出来双向链表的实现,已经可以打 9 分了。但是这里我要强调的是,其实在项目中,并不绝对是这样。比如 Redis 源码里,LRU 的淘汰策略,就没有使用双向链表,而是使用一种模拟链表的方式。因为 Redis 大多是当内存在用(我知道可以持久化),如果再在内存中去维护一个链表,就平添了一些复杂性,同时也会多耗掉一些内存,后面我会单独拉出来 Redis 的源码给大家分析,这里不细说。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("回到题目,为什么我们要选择双向链表来实现呢?看看上面的使用步骤图,大家会发现,在整个 LRUCache 的使用中,我们需要"),n("strong",[t._v("频繁的去调整首尾元素的位置")]),t._v("。而双向链表的结构,刚好满足这一点(再啰嗦一下,前几天我刚好看了 groupcache 的源码,里边就是用双向链表来做的 LRU,当然它里边做了一些改进。groupcache 是memcache 作者实现的 go 版本,如果有 go 的读者,可以去看看源码,还是有一些收获。)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("下面,我们采用 hashmap+ 双向链表的方式进行实现。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("首先,我们定义一个 LinkNode ,用以存储元素。因为是双向链表,自然我们要定义 pre 和 next。同时,我们需要存储下元素的 key 和 value 。val 大家应该都能理解,关键是为什么需要存储 key?举个例子,比如当整个cache 的元素满了,此时我们需要删除 map 中的数据,需要通过 LinkNode 中的 key 来进行查询,否则无法获取到 key。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" LinkNode "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tkey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" val "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\tpre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br")])]),n("p",[t._v("现在有了 LinkNode ,自然需要一个 Cache 来存储所有的 Node。我们定义 cap 为 cache 的长度,m 用来存储元素。head 和 tail 作为 Cache 的首尾。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" LRUCache "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tm "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode\n\t"),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("cap")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br")])]),n("p",[t._v("接下来我们对整个 Cache 进行初始化。在初始化 head 和 tail 的时候将它们连接在一起。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Constructor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("capacity "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" LRUCache "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\thead "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\ttail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail\n\ttail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" capacity"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br")])]),n("p",[t._v("大概是这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(841),alt:"PNG"}}),t._v(" "),n("p",[t._v("现在我们已经完成了 Cache 的构造,剩下的就是添加它的 API 了。因为 Get 比较简单,我们先完成 Get 方法。这里分两种情况考虑,如果没有找到元素,我们返回 -1。如果元素存在,我们需要把这个元素移动到首位置上去。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head \n cache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next \n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next \n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("大概就是下面这个样子(假若 2 是我们 get 的元素)")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(842),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们很容易想到这个方法后面还会用到,所以将其抽出。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\thead "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//从当前位置删除")]),t._v("\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//移动到首位置")]),t._v("\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tcache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tthis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("MoveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br")])]),n("p",[t._v("现在我们开始完成 Put。实现 Put 时,有两种情况需要考虑。假若元素存在,其实相当于做一个 Get 操作,也是移动到最前面("),n("strong",[t._v("但是需要注意的是,这里多了一个更新值的步骤")]),t._v(")。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head\n\ttail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tail\n\tcache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//假若元素存在")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//1.更新值")]),t._v("\n\t\tv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.移动到最前")]),t._v("\n\t\tthis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("MoveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//TODO")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("假若元素不存在,我们将其插入到元素首,并把该元素值放入到 map 中。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head\n\ttail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tail\n\tcache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//存在")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//1.更新值")]),t._v("\n\t\tv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.移动到最前")]),t._v("\n\t\tthis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("MoveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tv "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\tv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("但是我们漏掉了一种情况,**如果恰好此时Cache中元素满了,需要删掉最后的元素。**处理完毕,附上 Put 函数完整代码。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head\n\ttail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tail\n\tcache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//存在")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//1.更新值")]),t._v("\n\t\tv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.移动到最前")]),t._v("\n\t\tthis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("MoveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tv "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("cap")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//删除最后元素 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail\n tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(843),alt:"PNG"}}),t._v(" "),n("p",[t._v("最后,我们完成所有代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" LinkNode "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tkey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" val "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\tpre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" LRUCache "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tm "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode\n\t"),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("cap")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Constructor")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("capacity "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" LRUCache "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\thead "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\ttail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail\n\ttail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" capacity"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tcache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tthis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("MoveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\thead "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//从当前位置删除")]),t._v("\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//移动到首位置")]),t._v("\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n\thead"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("this "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("LRUCache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("head\n\ttail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("tail\n\tcache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("m\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//存在")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//1.更新值")]),t._v("\n\t\tv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value\n\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//2.移动到最前")]),t._v("\n\t\tthis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("MoveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tv "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("LinkNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("cap")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//删除最后元素 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("delete")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail\n tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next\n v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pre "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" v\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br")])]),n("p",[t._v("优化后:")]),t._v(" "),n("div",{staticClass:"language-g line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("type LinkNode struct {\n\tkey, val int\n\tpre, next *LinkNode\n}\n\ntype LRUCache struct {\n\tm map[int]*LinkNode\n\tcap int\n\thead, tail *LinkNode\n}\n\nfunc Constructor(capacity int) LRUCache {\n\thead := &LinkNode{0, 0, nil, nil}\n\ttail := &LinkNode{0, 0, nil, nil}\n\thead.next = tail\n\ttail.pre = head\n\treturn LRUCache{make(map[int]*LinkNode), capacity, head, tail}\n}\n\nfunc (this *LRUCache) Get(key int) int {\n\tcache := this.m\n\tif v, exist := cache[key]; exist {\n\t\tthis.MoveToHead(v)\n\t\treturn v.val\n\t} else {\n\t\treturn -1\n\t}\n}\n\nfunc (this *LRUCache) RemoveNode(node *LinkNode) {\n\tnode.pre.next = node.next\n\tnode.next.pre = node.pre\n}\n\nfunc (this *LRUCache) AddNode(node *LinkNode) {\n\thead := this.head\n\tnode.next = head.next\n\thead.next.pre = node\n\tnode.pre = head\n\thead.next = node\n}\n\nfunc (this *LRUCache) MoveToHead(node *LinkNode) {\n\tthis.RemoveNode(node)\n\tthis.AddNode(node)\n}\n\nfunc (this *LRUCache) Put(key int, value int) {\n\ttail := this.tail\n\tcache := this.m\n\tif v, exist := cache[key]; exist {\n\t\tv.val = value\n\t\tthis.MoveToHead(v)\n\t} else {\n\t\tv := &LinkNode{key, value, nil, nil}\n\t\tif len(cache) == this.cap {\n\t\t\tdelete(cache, tail.pre.key)\n\t\t\tthis.RemoveNode(tail.pre)\n\t\t}\n\t\tthis.AddNode(v)\n\t\tcache[key] = v\n\t}\n}\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(844),alt:"PNG"}}),t._v(" "),n("p",[t._v("因为该算法过于重要,给一个 Java 版本的:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java版本")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" java"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("util"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Hashtable"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\npublic class LRUCache "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n class DLinkedNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n LinkedNode prev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n LinkedNode next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n private void "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("addNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DLinkedNode node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("prev "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("prev "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n private void "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DLinkedNode node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n LinkedNode prev "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("prev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n LinkedNode next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n prev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("prev "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" prev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n private void "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("moveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DLinkedNode node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("addNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n private DLinkedNode "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("popTail")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n DLinkedNode res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("prev"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n private Hashtable"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" DLinkedNode"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" cache "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("new")]),t._v(" Hashtable"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" DLinkedNode"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n private "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n private "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" capacity"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n private DLinkedNode head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n public "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("LRUCache")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" capacity"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("size "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n this"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("capacity "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" capacity"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("DLinkedNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n tail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("DLinkedNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("prev "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n public "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n DLinkedNode node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" null"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("moveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n public void "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n DLinkedNode node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" null"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n DLinkedNode newNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("DLinkedNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n newNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("key "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n newNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("addNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("size "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" capacity"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n DLinkedNode tail "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("popTail")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n cache"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("remove")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tail"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("value "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("moveToHead")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br"),n("span",{staticClass:"line-number"},[t._v("74")]),n("br"),n("span",{staticClass:"line-number"},[t._v("75")]),n("br"),n("span",{staticClass:"line-number"},[t._v("76")]),n("br"),n("span",{staticClass:"line-number"},[t._v("77")]),n("br"),n("span",{staticClass:"line-number"},[t._v("78")]),n("br"),n("span",{staticClass:"line-number"},[t._v("79")]),n("br")])]),n("h2",{attrs:{id:"_04、redis-近lru-介绍"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、redis-近lru-介绍"}},[t._v("#")]),t._v(" 04、Redis 近LRU 介绍")]),t._v(" "),n("blockquote",[n("p",[t._v("上文完成了咱们自己的 LRU 实现,现在现在聊一聊 Redis 中的近似 LRU 。由于"),n("strong",[t._v("真实LRU需要过多的内存(在数据量比较大时)")]),t._v(",所以 Redis 是使用一种随机抽样的方式,来实现一个近似 LRU 的效果。说白了,LRU 根本只是一个"),n("strong",[t._v("预测键访问顺序的模型")]),t._v("。")])]),t._v(" "),n("p",[t._v("在 Redis 中有一个参数,叫做 “maxmemory-samples”,是干嘛用的呢?")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("# LRU and minimal TTL algorithms are not precise algorithms but approximated  # algorithms (in order to save memory), so you can tune it for speed or  # accuracy. For default Redis will check five keys and pick the one that was  # used less recently, you can change the sample size using the following  # configuration directive.  6#  # The default of 5 produces good enough results. 10 Approximates very closely  # true LRU but costs a bit more CPU. 3 is very fast but not very accurate.  # 10maxmemory-samples 5\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("上面我们说过了,"),n("strong",[t._v("近似LRU是用随机抽样的方式来实现一个近似的LRU效果")]),t._v("。这个参数其实就是作者提供了一种方式,可以让我们人为干预样本数大小,将其设的越大,就越接近真实 LRU 的效果,当然也就意味着越耗内存。(初始值为 5 是作者默认的最佳)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(845),alt:"PNG"}}),t._v(" "),n("p",[t._v("这个图解释一下,绿色的点是新增加的元素,深灰色的点是没有被删除的元素,浅灰色的是被删除的元素。最下面的这张图,是真实 LRU 的效果,第二张图是默认该参数为 5 的效果,可以看到浅灰色部分和真实的契合还是不错的。第一张图是将该参数设置为 10 的效果,已经基本接近真实 LRU 的效果了。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天基本就说到这里。那 Redis 中的近似 LRU 是如何实现的呢?因为时间的关系,我打算做到下一期的内容。最后,评论区留下你的想法吧!")])])}),[],!1,null,null,null);s.default=e.exports},834:function(t,s,a){t.exports=a.p+"assets/img/1.18f4e142.jpg"},835:function(t,s,a){t.exports=a.p+"assets/img/2.58e28193.png"},836:function(t,s,a){t.exports=a.p+"assets/img/3.575d3fba.png"},837:function(t,s,a){t.exports=a.p+"assets/img/4.79cdc876.png"},838:function(t,s,a){t.exports=a.p+"assets/img/5.606dbc80.png"},839:function(t,s,a){t.exports=a.p+"assets/img/6.c17fdc30.png"},840:function(t,s,a){t.exports=a.p+"assets/img/7.0d48a111.png"},841:function(t,s,a){t.exports=a.p+"assets/img/8.68ddf420.png"},842:function(t,s,a){t.exports=a.p+"assets/img/9.e544788a.jpeg"},843:function(t,s,a){t.exports=a.p+"assets/img/10.b01bb056.jpeg"},844:function(t,s,a){t.exports=a.p+"assets/img/11.62c59617.jpeg"},845:function(t,s,a){t.exports=a.p+"assets/img/12.b9283517.jpeg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/15.eb714af1.js b/learning/.vuepress/dist/assets/js/15.eb714af1.js deleted file mode 100644 index 26c5f11e..00000000 --- a/learning/.vuepress/dist/assets/js/15.eb714af1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{1121:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天分享一道比较简单的题目,希望大家可以5分钟掌握!")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("最小的k个数")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:arr = [3,2,1], k = 2\n输出:[1,2] 或者 [2,1]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:arr = [0,1,2,1], k = 1\n输出:[0]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("限制:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("0 <= k <= arr.length <= 10000\n0 <= arr[i] <= 10000\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、堆和大小顶堆"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、堆和大小顶堆"}},[t._v("#")]),t._v(" 02、堆和大小顶堆")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题出自《剑指offer》,是一道非常高频的题目。可以通过排序等多种方法求解。但是这里,我们使用较为经典的**大顶堆(大根堆)**解法进行求解。因为我知道有很多人可能一脸懵逼,所以,我们先复习一下大顶堆。")])]),t._v(" "),n("p",[t._v("首先复习一下"),n("strong",[t._v("堆")]),t._v(",堆(Heap)是计算机科学中一类特殊的数据结构的统称,我们通常是指一个可以被看做一棵"),n("strong",[t._v("完全二叉树")]),t._v("的数组对象。如果不记得什么是完全二叉树,可以复习这篇:")]),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.4/407.html"}},[t._v("二叉树第七讲 - 完全二叉树(222)")])],1),t._v(" "),n("p",[t._v("堆的特性是"),n("strong",[t._v("父节点的值总是比其两个子节点的值大或小")]),t._v("。如果父节点比它的两个子节点的值都要大,我们叫做"),n("strong",[t._v("大顶堆")]),t._v("。如果父节点比它的两个子节点的值都要小,我们叫做"),n("strong",[t._v("小顶堆")]),t._v("。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(809),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(810),alt:"PNG"}}),t._v(" "),n("p",[t._v("大顶堆,满足以下公式:")]),t._v(" "),n("blockquote",[n("center",[t._v("arr[i] >= arr[2i 1] && arr[i] >= arr[2i 2]")])],1),t._v(" "),n("p",[t._v("小顶堆也一样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(811),alt:"PNG"}}),t._v(" "),n("p",[t._v("小顶堆,满足以下公式:")]),t._v(" "),n("blockquote",[n("center",[t._v("arr[i] <= arr[2i 1] && arr[i] <= arr[2i 2]")])],1),t._v(" "),n("h2",{attrs:{id:"_03、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目分析"}},[t._v("#")]),t._v(" 03、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("上面我们学习了大顶堆,现在考虑如何用大根堆进行求解。")])]),t._v(" "),n("p",[t._v("首先,我们创建一个大小为k的大顶堆。假如数组为[4,5,1,6,2,7,3,8],k=4。大概是下面这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(812),alt:"PNG"}}),t._v(" "),n("p",[t._v("我想肯定这里有不知道如何建堆的同学。记住:"),n("strong",[t._v("对于一个没有维护过的堆(完全二叉树),我们可以从其最后一个节点的父节点开始进行调整")]),t._v("。这个不需要死记硬背,其实就是一个层层调节的过程。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("从最后一个节点的父节点调整")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(813),alt:"PNG"}}),t._v(" "),n("p",[t._v("继续向上调整")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(814),alt:"PNG"}}),t._v(" "),n("p",[t._v("继续向上调整")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(815),alt:"PNG"}}),t._v(" "),n("p",[t._v("建堆 调整的代码大概就是这样:(翻Java牌子)")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//建堆。对于一个还没维护过的堆,从他的最后一个节点的父节点开始进行调整。")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//最后一个节点 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" lastNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//记住:父节点 = (i - 1) / 2 左节点 = 2 * i 1 右节点 = 2 * i 2; ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//最后一个节点的父节点 7")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" startHeapify "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lastNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("startHeapify "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//不断调整建堆的过程")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" startHeapify"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//调整大顶堆的过程")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//和当前节点的左右节点比较,如果节点中有更大的数,那么交换,并继续对交换后的节点进行维护")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//左右子节点")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" c1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//假定当前节点最大")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//如果左子节点比较大,更新max = c1;")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//如果右子节点比较大,更新max = c2;")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//如果最大的数不是节点i的话,那么heapify(nums, max),即调整节点i的子树。")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//递归处理")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br")])]),n("p",[t._v("然后我们从下标 k 继续开始依次遍历数组的剩余元素。"),n("strong",[t._v("如果元素小于堆顶元素,那么取出堆顶元素,将当前元素入堆")]),t._v("。在上面的示例中 ,因为2小于堆顶元素6,所以将2入堆。我们发现现在的完全二叉树不满足大顶堆,所以对其进行调整。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("调整前")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(816),alt:"PNG"}}),t._v(" "),n("p",[t._v("调整后")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(817),alt:"PNG"}}),t._v(" "),n("p",[t._v("继续重复上述步骤,依次将7,3,8入堆。这里因为7和8都大于堆顶元素5,所以只有3会入堆。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("调整前")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(818),alt:"PNG"}}),t._v(" "),n("p",[t._v("调整后")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(819),alt:"PNG"}}),t._v(" "),n("p",[t._v("最后得到的堆,就是我们想要的结果。由于堆的大小是 K,所以这里空间复杂度是O(K),时间复杂度是O(NlogK)。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("根据分析,完成代码:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLeastNumbers")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//对arr数组的前k个数建堆 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" heap "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("arraycopy")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" heap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("heap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//对后面较小的树建堆")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" heap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n heap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("heap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//返回这个堆")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" heap"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildHeap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" lastNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" startHeapify "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lastNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("startHeapify "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" startHeapify"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" c1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("heapify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("swap")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(820),alt:"PNG"}})])}),[],!1,null,null,null);s.default=r.exports},809:function(t,s,a){t.exports=a.p+"assets/img/1.71519116.jpg"},810:function(t,s,a){t.exports=a.p+"assets/img/2.da9ba16e.png"},811:function(t,s,a){t.exports=a.p+"assets/img/3.6c81b835.png"},812:function(t,s,a){t.exports=a.p+"assets/img/4.84cffc54.png"},813:function(t,s,a){t.exports=a.p+"assets/img/5.f0a35d44.png"},814:function(t,s,a){t.exports=a.p+"assets/img/6.1e7a6bde.jpg"},815:function(t,s,a){t.exports=a.p+"assets/img/7.dc3e1d79.jpg"},816:function(t,s,a){t.exports=a.p+"assets/img/8.fb3c4977.jpg"},817:function(t,s,a){t.exports=a.p+"assets/img/9.f04372f5.png"},818:function(t,s,a){t.exports=a.p+"assets/img/10.7645bc40.jpg"},819:function(t,s,a){t.exports=a.p+"assets/img/11.b8f438c1.jpg"},820:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/16.4350692d.js b/learning/.vuepress/dist/assets/js/16.4350692d.js deleted file mode 100644 index b2957930..00000000 --- a/learning/.vuepress/dist/assets/js/16.4350692d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{1138:function(t,s,a){"use strict";a.r(s);var v=a(3),i=Object(v.a)({},(function(){var t=this,s=t.$createElement,v=t._self._c||s;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("blockquote",[v("p",[t._v("今天为大家分享一道“奇葩”面试题。")])]),t._v(" "),v("h2",{attrs:{id:"_01、加油站问题"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_01、加油站问题"}},[t._v("#")]),t._v(" 01、加油站问题")]),t._v(" "),v("blockquote",[v("p",[t._v("信心满满的去面试,面试突然问了这样一个让人瞬间懵逼的问题....")])]),t._v(" "),v("br"),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("问题:北京有多少加油站?")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("对的,你没看错,这就是原题。。。")])])])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("遇到这种“智障问题”怎么办?不要怕,直接给出答案!“截止到2019年,北京共有1063个加油站。”对,就是这么刚。直接答出来,让面试官懵逼!")]),t._v(" "),v("h2",{attrs:{id:"_02、费米估算"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_02、费米估算"}},[t._v("#")]),t._v(" 02、费米估算")]),t._v(" "),v("blockquote",[v("p",[t._v("上面的答案当然是玩笑。其实这道题,并没有那么玄乎,一起分析下。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("这道题目主要考察人的估算能力。而估算界,有一个估算大牛叫做费米。")]),t._v(" "),v("img",{attrs:{src:a(935),alt:"PNG"}}),t._v(" "),v("p",[t._v("这位大牛有多牛呢?据说第一颗原子弹正在试爆,费米随手把自己笔记本的一张纸撕成小碎片顺手一撒,碎纸随风飘落,在费米身后2米处落下。")]),t._v(" "),v("img",{attrs:{src:a(936),alt:"PNG"}}),t._v(" "),v("p",[t._v("费米根据这个数据,心算得出核爆量大约是一万吨TNT。这个数据和一些尖端的仪器设备花了数星期时间来分析波速、波压得出的数据基本一致。")]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("于是这种估算方法后来就被称为费米估算。")]),t._v(" "),v("h2",{attrs:{id:"_03、题目分析"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目分析"}},[t._v("#")]),t._v(" 03、题目分析")]),t._v(" "),v("blockquote",[v("p",[t._v("幸运的是,大师的估算方法并没有失传。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("费米估算,其实说白了就是将"),v("strong",[t._v("正确答案,转化为一系列估算变量的乘法")]),t._v("。首先要把变量选的准确,其次要把变量估的准确。")]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("回到本题,我们要分析的问题是:")]),t._v(" "),v("img",{attrs:{src:a(937),alt:"PNG"}}),t._v(" "),v("p",[t._v("那我们至少得有多少辆车吧?但是并不是所有的车,每天都会上路。所以准确的说我们需要知道每天上路的车有多少。")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:a(938),alt:"PNG"}}),t._v(" "),v("p",[t._v("但是是所有上路的车都需要加油吗?当然不是,所以我们还得改改:")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:a(939),alt:"PNG"}}),t._v(" "),v("p",[t._v("知道了每天上路需要加油的车辆数,我们得知道每个加油站可以满足多少辆车吧?")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:a(940),alt:"PNG"}}),t._v(" "),v("p",[t._v("那加油站用什么满足车?自然是油咯。")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:a(941),alt:"PNG"}}),t._v(" "),v("p",[t._v("问题来了,那我们如何知道每天上路需要加油的车辆数?是不是我们可以转化为 北京车辆总数 / 加油频次:")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:a(942),alt:"PNG"}}),t._v(" "),v("p",[t._v("这个加油频次,相信大家就很容易估算出来了。跑滴滴的一天一次油,正常开的话一周一次,开的少一点的话差不多半个月一次。")]),t._v(" "),v("p",[v("img",{staticStyle:{zoom:"50%"},attrs:{src:a(943),alt:"PNG"}}),v("img",{staticStyle:{zoom:"50%"},attrs:{src:a(944),alt:"PNG"}})]),t._v(" "),v("p",[t._v("① 每天上路需要加油的车辆数 ② 每个加油站的容量")]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("所以我们只要回答出上面两个参数,再给出计算公式。就可以很完美的解答本题了!")]),t._v(" "),v("h2",{attrs:{id:"_04、总结"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_04、总结"}},[t._v("#")]),t._v(" 04、总结")]),t._v(" "),v("blockquote",[v("p",[t._v("数学家的嘴,骗人的鬼。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("上面的费米估算大家应该都知道是个什么东东了。还有很多类似的题目“芝加哥的钢琴家数量”,“上海有多少滴滴”,“成都有多少家星巴克”这都是一类问题。")]),t._v(" "),v("img",{staticStyle:{zoom:"33%"},attrs:{src:a(945),alt:"PNG"}}),t._v(" "),v("p",[t._v("其实到这里就可以结束了,但是我还是想说“数学家的嘴,骗人的鬼”,有一个叫做德雷克的数学家,他用费米估算来解释自己单身的原因:")]),t._v(" "),v("br"),t._v(" "),v("ul",[v("li",[t._v("1、住在我附近的女性有多少?(伦敦:400万)")]),t._v(" "),v("li",[t._v("2、多少人有可能年龄上适合?(20%:80万)")]),t._v(" "),v("li",[t._v("3、多少人有可能是单身?(50%:40万)")]),t._v(" "),v("li",[t._v("4、多少人有可能拥有大学文凭?(26%:104000)")]),t._v(" "),v("li",[t._v("5、多少人有可能有魅力?(5%:5200)")]),t._v(" "),v("li",[t._v("6、多少人有可能觉得我有魅力?(5%:260)")]),t._v(" "),v("li",[t._v("7、多少人有可能和我合得来?(10%:26)")]),t._v(" "),v("li",[t._v("到最后,他愿意交往的女人,全世界只有26个。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("还专门发表了一篇论文,用数学大谈特谈自己没有女朋友的原因。")]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("然鹅。他在论文发表结束后,就马上结婚了。。哈哈哈哈哈,当然,这并不是说费米估算没有用,或许是估算错误吧!")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:a(946),alt:"PNG"}}),t._v(" "),v("p",[t._v("好了,基本就是这样了。周末写文不容易,求个转发,来个评论。感谢~")])])}),[],!1,null,null,null);s.default=i.exports},935:function(t,s,a){t.exports=a.p+"assets/img/1.84a19499.jpg"},936:function(t,s,a){t.exports=a.p+"assets/img/2.7985fafb.jpg"},937:function(t,s){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAS4AAACpCAYAAACVgtCXAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAVt0lEQVR42u3cf2zUZYLH8Tf0xxDrtAZaNm4Hc0wxx5C6HQ7vxguxJaZijoIJCFkK7Flkj+JyAqtQPMEai5q1uGvpKlCVH1mFuqetOaFsFqqReuScjd5Ob1mmCXa4yFSydCTXDt3w7bRwf7QDA5R25ttK+ern9Re08zzzfb7T5zPP8/1+n2dMT0/PJYCkpCQS1d3dTWpqasLlADo6OsjIyLhp79nb24vaqXaqnd+Ndo411SoRkVGk4BIRy1FwiYjlKLhExHIUXCJiOQouEbEcBZeIWI6CS0QsR8ElIpaj4BIRy1FwiYjlJEciEYhZK5SIaFkzent76e7uvmnvefHiRbVT7VQ7vyPtTE5JSQGTizgB04s4k5KSTJe92YtV1U61U+28tdqpqaKIWI6CS0QsR8ElIpaj4BIRy1FwiYjlKLhExHIUXCJiOQouEbEcBZeIWI6CS0QsR8ElIpaj4BIRy0kerTf+uvN/6bx4e8LlIpEI0YXhiYiuPh87NvGsNvueAOfPn1c71U7LttNuu4M7bptgqo5vU3JnZ6fpE9Pb22t61fr/nf+G95u3j3b7RWQQJX//b4yJxD++MZsJiQZ0cnp6OpjcNqO7u9v81hehvnKzXItMlReRb8+F7i4+az2E3W4n47aMuMuZzYREt7UZtali1LiUNNJs6aN9GCISo+3cl6N9CIPSxXkRsRwFl4hYjoJLRCxHwSUilqPgEhHLUXCJiOUouETEchRcImI5Ci4RsRwFl4hYjoJLRCwnORKJQMwix0REy5oRXQ0uIreuSCRCd3d3Qq83I5oH8eZQcnS/HrPb05jdHcLMNjoicnOlpKQk3Mdvxu4QSg8RsRwFl4hYjoJLRCxHwSUilqPgEhHLUXCJiOUouETEchRcImI5Ci4RsRwFl4hYjoJLRCxHwSUilpNsZleIqIsXL5raVQLg0qVLo912ERlCb29vQn3cbCYkWkYjLhGxnOToNhJmtrXp7e01vR3OmDFjRrvtIjKEpKSkhPr4cDIBbWsjIt9lCi4RsRwFl4hYjoJLRCxHwSUilqPgEhHLUXCJiOUouETEchRcImI5Ci4RsRwFl4hYjoJLRCwnORKJgIltJQCiZc24ePHiaLddRIYQiUTo7u5O6PVmRPMg3hxKTklJAZO7QwCkpqaaKjd2rAZ7Ire6lJSUhPu4mUyIBpZ2hxCR7ywFl4hYjoJLRCxHwSUilqPgEhHLUXDJIAzCZ8OjfRAi11FwJarLGJl6ju9l6ayf8cK7fkaoRsKHynloySs0nRmptnrZ9qN5PLY3MCLVBd8r57F1b+A9PULH920aqc9ZvhUKrgSFj75IwaxyGocbDrnFbC6GI+seZ2/zyBybfUImwbOZZN05ErW10bjl19ROyadocpCGXXvZum4Fa5+ux99hrkbH7EKc7+7Hd3aYh3a8lvLtTQS7Rua8DSR44OcUzNpI7fGRDDA/tevfoLFFo9jhUnAN5VQ9j/3jOhpO9f3X7nKT09JGx4XhVmzDVbqdusZtFE2J/swg3BEi8IUX7/FQwiMx/xefkv/TB3FFf9BjEO5ow3/Mi/eYF+8XAcI98dQUxverMvYkPcHvP9nEbPd0Chd6yDrlxXcySPtfTXbmjAyycOP44TBP3YR0OirKqfcNM1SMEP4bnBNH7j+Q1RLAwJZgnV6qZ61jr3egcHLhdh5h7aw9eOP6HORGkkf7AG55k3PwnKom2Nn//3E27OSRM9lshQbhjm46Tp+g7WyIQEsrrduqCZxsxdsSuuqVmcu2c/CVfOxD1GW0B2j9S5CmeoPU/FrKf+wn2DPwp2t7YA1VpXk37o49bTQ+t5XP7ilj2+o8MpOBDBvBD/ayp2cN2/avxJ02nBNqwxb7cLQRJnS2E8Znk5lQvXPx3JtgqFx3KO14yxexkE0caCjGGfu7CVlk48Y5KdE6PSxYW8/Sf6nF8z8rr3yJ9HNMccOcHLLV84ZFpy8ubhwTY/47J4fMmP+GT7fBpOzrA6armZonqvF2QbvfSyAtD89dObgKnDjudOKc6MCzMJ+5SyE1wx7fd3uXn9r1G9nrz2LqfXlMv8uBIy+b1BYvTbml7HiqCIfJYAm3NFL3YTuutVVsTmumZsFDtK3ezcrkvWx8K5vKtxMMrXNhwuPt15yXHDJjz2VPO963XqSyxsu4eRXseHPB1QEykK9aaVzk5tlh5ha4KNm5nfbXwwy8SCWL9IzEa3XMr2DPXW1kD/A7+4QsSIJx9IV24HiQ9FwXmcNuy/eLgmtI2TjmXfOj6B8eAG0c3vgQ1ROqqPt14VWBRloepbu3s6Sjm9Q0O7YBz7ZB+Hgj1eu9pM8vYckc5yAjLCDNRfGODym+6odt1L3u55FnKkyHFhikTimkpCz6/zxK395A+aylrHCXULW/BFeCndj/3ka8M7dTkjtYe5wUPb+L/OJG9u88QbADnIO9T4+B/3gzfBNm/9P1NOxtgsVV7Ku65tzHa1I+G34R5xnqMLBlxJMwNpwznGCECV/g+s/eW0NZUTXe0zbyF5ayYYqCK1EKrsF0hQme8tHaOY386AXvs234XJ7+TtJG06Yyqr8uYsmyGwWODXv/H7vR3EB9wE6WEaD9bCdB0nFOcuKY2En4QD17j0PO9AoKE7y4HjpQTfXkJzicC8bZAL5jTRw55IPpc1nyaCHOuMLMdlXnCn1Rz55f1nFh7cvsmufGkfDIw4/3vRMY98X8yLhAZ+wr3q0m4F5O0VQ79qmFlFYVDlCPgX/XRrYe7rtmZJ/shP9spaS8itLZdvLH57L0pMEFAy4PWXsMwmdaaHqvDu95N0WrFuCZSAIMwh0GcIIju/ZyxO8jeLadlsPNsLiCHS8uGPicGmFCpwP4Pj/KZ4caOXLSjrvgQZasLsETO+X0lFL5ZpG5oBUAkjs7+/6UzOzW0Nvba3pXiUS2yriZwh9XU1bjJeAPk7ewhNkLcshOi3kcoAdCAGebqHnpD2T+ZBtHX4zvT9CW58R4ahEHVn/CtjUxZQwvTbhY89qmhEOLM41UvuSFtCwaj2XgutvJtDkleJxvsPChdTDlv9g82x5nZQahLxrYs62B9vseZc2OfTjO1fP4j8px/vZDNhT0B3AX2IYIQ+NoA3vOLqByaswPW5o5CDwYfc1Xb1D20jicA1wLijlruFZUsWNh/2jnXCPlh+zkF9ixEabzHJQsy6ftl7NY2rKA5QXp2O904cgAe1ondZXl1DUbHKiLuYbV5WXvFj+OkkconGoHDLy/+jk1vlQck50478rBOTFIeE4+xY8uwNEf6MbHL/J3S8p5we1md8k1E9qONrwfNxEgG+fdc1m1YzklX7aTkTfECPoWFw6HGROJf3xjNhOi29rEm0PJ6enpYHJbm+7ubtPb2qSGzJX7ttkfWEPVjDBcvuYUoiHp6luImb6jNBQsobQqP8HaXRSWeNhzuh1iv29PBfBPKWLDjETnC200vFRLzmsV5OwM45mZd6XWPA/5FJLjirPbdAXwetthooc1uxf0j77aaNhcTdPsJTxiNFJb6aPp0BGaWsBTWkHF8/k4blBd+2k/jtXr8cQ2aZKTgjlG3zEaXprecVH65qODhNYV0Sla8HA9J1Y9QYUNoJPwWRdZE+y4Z84lNK6AkhV5Vwo5QxQ+18a0Z665bpbmodBTz9JZ1aS2biI/zYanwE2ZP5vK5/tHQmcaqPsQxiXHHkMWsIAlDw9wFS4jG8/8YjyXfxCi4bWHqZy4nYMvXnODZZx15oV2u52M2+IfbpvNhES3tdFUcQC2jGs7e4C2M+DuHw255y+haIa5gb5jZhE5/1pLdXI6oaMB2m2pZOe6efCp6WTFTneGZOD7VTlHH6igckaImk4f3g9qafV68X+Tz4Y3XaTnJvAJpznxPBDTITsC1G1eR/PM3Xw2PwsuAAVFFP/UQ/m0dRw91ULoXD6O8Tdo5+Lt7E6+pjHjC9m0o6+J4Y8aqFu4nsOeRDqxn8a3Uln+dn/UGUFOHHLjeRVsGS4K328nFPuV8HUbjblFrBrgC8Ex/2UO3hciNc0geLobxyQnnlNBLn+lXDCgM8DBXe2Q7qF4kavvo5noIHv8wMdW80g9rqpN5E8CjFZOeIsoaxjgrvDkLDIB43Qzvo5s3LmZiT508b2n4BrK2VZaOyEnntcaBobNNvgf4eR8lvwkm/sXe+j+m3IWHs5nS1miF5YN/DUbqZ+4iS3zs8EI0pnuwPVAEUXzo5ftQ/hNPrIRbq5lyy/bKHhmHxVT+7udDSBM03MvcHTRy+x7tejyFGpAyQOfB5utb6q28+lOyn7vSajDhj6o4ciiUvZFp9Mn/Xhzs5mbAYzLxHHh6sdJjPOduBYV3XBEZ78zE47X8qlRTPGMLHKOBzAI46t+geqjflo7XOSkucm/14ENCH11AjwPkjVgbU48M30sfa+ZPz+ZR/ijRoxXNlM0qf+aW1c30EnwT0H4PMjWdXWEjTaOfuCFmWuo3L0Sj4k7mN9XegD1Rs42U/dSOdXHDLLivVPn+xTvYE+Vn2uiqTmTwsV9HdZ+lxN7p8EFgDNN1GxviOOpcgP/rldomrqFimXOvo5/LkTQlYMzwxZzYRmgkeDXibW5oeYNDp5/kC2/WY/n5FaW/vMrNPUv0Qm+9wLP/mkJ234xRGgNqo2GpzcSfHYDRYlczzvXxM53prG55EoMBX2f4s939U0Dbemkj+sPif4bFAd/58VmMMiDvGGa3mnHmUv/3eN2OjvsuNe8zO7XSnFPzmfJ4kLck/vCu/20D+523OBLxoa7tILds6f23bQ57qHk3nZ8HzcT+rKBsr9dx56mTuzzN/Hn/RVsqKqgonwBbsAx04NboZUQBVesnjCBYw3UPP4w8zadYNrqCtbMz8L4ahrZ0U6WDL6TbQMW9/u8hP96o8oNfG/9Gn/sE9MTssjOdfRdJ7ozn6I7m1j7o1k89lwTwQHrCBM42oJ94SZKC2ImIN+00/b5frau38jaH29k2z4vQRMPlRtpeRSVrqR4Zt/UJXPeJjbPDPDs6w343tnIindz2Pbvw3kA1cD3qzIq2cCGRdkJlGujoaKR6VUrcREmbNA3bdzrpfi+af2jtixykhrY80YtB48FMbDhmLeZLYudNx7VHa+jGjfTbAB2Mie1X//59US/CNoI+EK4Mga5fpPmwpMLocO17D/aRMNnkPNAHplTPRQWQHauC0fs4xTftNPGApaX5GmqmCBNFWMZQbx7a/Des4X9a/L6r01003k85jVT83hk1X4aFk2laHL/n1uPQailgT2vHyHn3k0wwEgidKCcte/cT+Xaa35x6sp1Gcf8CvZ0lbN8/c/YO3Ogu4F2nAV519d9yk/2og1smB87FgjRDBgJLC25/k6hDdeK9ax67GHWdlWw5zcL4ny0YiBhvC+touzMI+z5RdENL+oP8KHg29WA7akKCicBpHKi4mGqvQY+2xrevxzgmRS+/CqFtngjIETDtlfwLPui/3O2kf6Dbur2vIK3OUC7zcAwoGxpPfS0w3gnxiFwL77+yMNfNnPiL+0EP2qi3ttJ/upSdv6HC/vl3pVNzgwv3nNAzPQ9/HUb/p8Vcf/4OA9ZLlNwxUpzUfzmNQ93ngnSCly+f2jzsLzKz5blD1F27RKdqUVMtw18hT14MsjcHZuvvst2wSB81Q1LG85lFew0bDRlxHtnJozvowYc8ysG/G3r16Gr72Am4nQjW9dtxe/ZxcEyj/nb+l0B6jY9Tn3aBva9WpjQNDPUHMDx6Ercl8vY8DxUiO93ISrefhRX7PmMO7QgsLecygPFbHnlShnXffcznQUUP3NtPQbeihk8RiFL7rn+LHT8aT9ljwd5cMdmdj4TG1hXZE4u7B+9hQgebyXQ8geOvn0E0mx4z3rIT+g5M1FwDWV8Jjnzru76dk8JlZ+UUNkVvrJAN9mOfZDRiPvJfbj7/x3+opE/XrDD8Sa8l59qirLhWlER1yMCABgn+OO7xXiev9LZwi1eTnSFaT1lss0dARp3VbPtmINVL77Phqnmn0QKtzSwbVM9thW72Tcnkelhn8y8Ac6Ep5T//tR2g5UI8cm+p28ZV1bstaW84mtWJETZmHZfMe7b5w74nJ1j/sscnjN4bjpcbnw1NWT+kwfHDxx4Fk4nf9l6KjVHNEXBNRSbhzU7bvC7NLupUYh9RiHTj1az6rlG8qs2DO8Jats05v7ecdVyHPtUB6EnllJz3MWGu+Ov3TjTTGPtHvZ/nsXc1Zt5/8lh3KY/56dhZy1//EERq/bvGuElLcMLLQDbjJXs/CQc9+dnn72JfbMHqW+o9uU+QuXzduyaFo4IBVc8voWzZC9Yw5bfekgtSHwUck1NuPKu7X7ZFJWWcHDydIpzh67BONOM96NWwj90kVdaRdGTwzkeg/CXAdptDgqfqaBo5E/diLGPv5nPtCu0RpKCaxQ5CzwjUMsN5JawI47QArDdmUf+srz4Xjx0bdinuCy9zEVufXocQkQsR8ElIpaTHIlEIGaRYyKiZc2IrgYXkVtXJBJJaCcXs5kQzYN4cyg5JSUFTO4OAZjeHcLMNjoicnOlpKQk3Mdvxu4QSg8RsRwFl4hYjoJLRCxHwSUilqPgEhHLUXCJiOUouETEchRcImI5Ci4RsRwFl4hYjoJLRCxHwSUilpNsZleIqIsXL5raVQLg0qVLo912ERlCb29vQn3cbCYkWkYjLhGxnOToNhJmtrXp7e01vR3OmDFjRrvtIjKEpKSkhPr4cDIBbWsjIt9lCi4RsRwFl4hYjoJLRCxHwSUilqPgEhHLUXCJiOUouETEchRcImI5Ci4RsRwFl4hYjoJLRCwnORKJgIltJQCiZc24ePHiaLddRIYQiUTo7u5O6PVmRPMg3hxKTklJAZO7QwCkpqaaKjd2rAZ7Ire6lJSUhPu4mUyIBpZ2hxCR7ywFl4hYjoJLRCxHwSUilqPgEhHLUXCJiOUouETEchRcImI5Ci4RsRwFl4hYjoJLRCxHwSUilpM82gdwIdLFhUjXaB+GiFhIcmdnJ5jcraG3t9f0rhLRrTI+8b832udARG4gHA4zJhL/+MZsJkS3tYk3h8b09PRcwuS2Nt3d3aa3tfGfbub2229PuFwkEiG6Fc+3eWJG4j0Bzp8/r3aqnZZtp912B3fcNiHucmYzIdFtbUZtqvjD9L8hIyMj4XI368SMxHsCdIztUDvVzu9NO28WXZwXEctRcImI5Si4RMRyFFwiYjkKLhGxHAWXiFiOgktELEfBJSKWo+ASEctRcImI5Si4RMRykiORCMSsiUpEtKwZvb29l3eIuBnvGV2sqnaqnWqn9duZHF09bnZ7GrOLOJOSkkyXvdmLVdVOtVPtvLXaqamiiFiOgktELEfBJSKWo+ASEctRcImI5Si4RMRyFFwiYjkKLhGxHAWXiFiOgktELOf/ARCSZJH13HG5AAAAAElFTkSuQmCC"},938:function(t,s,a){t.exports=a.p+"assets/img/4.52846cf7.jpg"},939:function(t,s,a){t.exports=a.p+"assets/img/5.0bd26895.jpg"},940:function(t,s,a){t.exports=a.p+"assets/img/6.6209e333.jpg"},941:function(t,s,a){t.exports=a.p+"assets/img/7.3bd17b29.jpg"},942:function(t,s,a){t.exports=a.p+"assets/img/8.170082ec.jpg"},943:function(t,s,a){t.exports=a.p+"assets/img/9.ceb7e1fe.jpg"},944:function(t,s,a){t.exports=a.p+"assets/img/10.1e64ecfb.jpg"},945:function(t,s,a){t.exports=a.p+"assets/img/11.b3b5c2b3.jpg"},946:function(t,s,a){t.exports=a.p+"assets/img/12.8e7f1b16.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/17.b9e444cf.js b/learning/.vuepress/dist/assets/js/17.b9e444cf.js deleted file mode 100644 index 85a79fe1..00000000 --- a/learning/.vuepress/dist/assets/js/17.b9e444cf.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{1132:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享一道FLAG和BAT都出现过的经典面试题。题目有一定难度,建议大家耐着性子看完!不要说没天赋看不懂。在这个浮躁到努力的人都很少的年代,还谈不上说天赋这件事。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题是非常好的一道题目,也是前面100道里最难的题目之一,相当经典!")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第4题:寻找两个正序数组的中位数")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m n))。你可以假设 nums1 和 nums2 不会同时为空。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("nums1 = [1, 3]\nnums2 = [2]\n则中位数是 2.0\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("nums1 = [1, 2]\nnums2 = [3, 4]\n则中位数是 (2 3)/2 = 2.5\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("题意还是比较简单的,没有什么需要额外补充。当然可以直接暴力求解,因为都是有序数组,直接进行合并,再对合并后的数组通过判断是否是偶数个,求出中位数。但是由于这种方法肯定是达不到O(log(n))的,所以我们直接略过。如果是为了练习code能力的小伙伴,下去可以自行试试。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那如何保证时间复杂度在O(log(n))呢?这里有一个小技巧,"),n("strong",[t._v("一般如果题目要求时间复杂度在O(log(n)),大部分都是可以使用二分的思想来进行求解")]),t._v("。当然,本题的二分是有一点反直觉的,可能不是很容易想到,一起看下。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("首先,我们考虑一个问题,如果只有一个有序数组,我们需要找中位数,那肯定需要判断元素是奇数个还是偶数个,如果是奇数个那最中间的就是中位数,如果是偶数个的话,那就是最中间两个数的和除以2。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(883),alt:"PNG"}}),t._v(" "),n("p",[t._v("那如果是两个数组,也是一样的,我们先求出两个数组长度之和。如果为奇数,就找中间的那个数,也就是 "),n("strong",[t._v("(长度之和 1)/2")]),t._v(" 。如果为偶数,那就找 "),n("strong",[t._v("长度之和/2")]),t._v("。比如下面的 (9 5)/2 = 7,那我们最终就是"),n("strong",[t._v("找到排列第7位的值")]),t._v("。此时,问题其实已经转化为“"),n("strong",[t._v("找到两个数组中第k小的元素")]),t._v("”。找到了第7位之后,第8位我们已经知道了,然后第7位和第8位的和,除以2就是我们要找的中位数("),n("strong",[t._v("注意:这里的7和8你其实是不知道的,图中画出来,只是为了帮助理解")]),t._v(")")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(884),alt:"PNG"}}),t._v(" "),n("p",[t._v("现在的问题是,我们如何用二分的思想来找到中间排列第7位的数。这里有一种不太好想到的方式,"),n("strong",[t._v("是用删的方式")]),t._v(",因为**如果我们可以把多余的数排除掉,最终剩下的那个数,是不是就是我们要找的数?**对于上面的数组,我们可以先删掉 7/2=3 个数。那这里,可以选择删上面的,也可以选择删下面的。那这里因为 i=")]),t._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('//计算出每次要比较的两个数的值,来决定 "删除"" 哪边的元素')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MAX_VALUE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MAX_VALUE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//通过递归的方式,来模拟删除掉前K/2个元素")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mid1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" mid2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findK")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findK")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(893),alt:"PNG"}})],1)}),[],!1,null,null,null);s.default=e.exports},883:function(t,s){t.exports="data:image/jpeg;base64,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"},884:function(t,s,a){t.exports=a.p+"assets/img/2.20c68c2c.jpg"},885:function(t,s,a){t.exports=a.p+"assets/img/3.df655fea.jpg"},886:function(t,s,a){t.exports=a.p+"assets/img/4.71b453f4.jpg"},887:function(t,s,a){t.exports=a.p+"assets/img/5.585e5236.jpg"},888:function(t,s,a){t.exports=a.p+"assets/img/6.dba384e6.jpg"},889:function(t,s,a){t.exports=a.p+"assets/img/7.a8ef541f.jpg"},890:function(t,s,a){t.exports=a.p+"assets/img/8.16885cbd.jpg"},891:function(t,s,a){t.exports=a.p+"assets/img/9.f90fe0ae.jpg"},892:function(t,s,a){t.exports=a.p+"assets/img/10.4c4c11dd.jpg"},893:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/18.777e7ada.js b/learning/.vuepress/dist/assets/js/18.777e7ada.js deleted file mode 100644 index 2d13680f..00000000 --- a/learning/.vuepress/dist/assets/js/18.777e7ada.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{1064:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v('在上一篇中,我们通过题目**“最长上升子序列” 以及 "最大子序和",'),n("strong",[t._v("学习了DP(动态规划)在")]),t._v("线性关系**中的分析方法。这种分析方法,也在运筹学中被称为“线性动态规划”,具体指的是 “目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的是求目标函数的最大值或最小值”。这点大家作为了解即可,不需要死记,更不要生搬硬套!")]),t._v(" "),n("p",[t._v("在本节中,我们将继续分析一道略微区别于之前的题型,希望可以由此题与之前的题目进行对比论证,进而顺利求解!")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第120题:三角形最小路径和")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。")])])])]),t._v(" "),n("p",[n("strong",[t._v("例如,给定三角形:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("[\n [2],\n [3,4],\n [6,5,7],\n [4,1,8,3]\n]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br")])]),n("p",[t._v("则自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。")]),t._v(" "),n("blockquote",[n("p",[n("strong",[t._v("这道题有一定难度哦!如果没有思路请回顾上一篇的学习内容!")])]),t._v(" "),n("p",[n("strong",[t._v("不建议直接看题解!")])])]),t._v(" "),n("h2",{attrs:{id:"_02、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),n("p",[t._v("首先我们分析题目,要找的是**三角形最小路径和,**这是个啥意思呢?假设我们有一个三角形:[[2], [3,4], [6,5,7],")]),t._v(" "),n("p",[t._v("[4,1,8,3]]")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(520),alt:"PNG"}}),t._v(" "),n("p",[t._v("那从上到下的最小路径和就是2-3-5-1,等于11。")]),t._v(" "),n("p",[t._v("由于我们是使用数组来定义一个三角形,所以便于我们分析,我们将三角形稍微进行改动:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(521),alt:"PNG"}}),t._v(" "),n("p",[t._v("这样相当于我们将整个三角形进行了拉伸。这时候,我们根据题目中给出的条件:每一步只能移动到下一行中相邻")]),t._v(" "),n("p",[t._v("的结点上。其实也就等同于,"),n("strong",[t._v("每一步我们只能往下移动一格或者右下移动一格")]),t._v("。将其转化成代码,假如2所在的元")]),t._v(" "),n("p",[t._v("素位置为[0,0],那我们往下移动就只能移动到[1,0]或者[1,1]的位置上。假如5所在的位置为[2,1],同样也只能移动")]),t._v(" "),n("p",[t._v("到[3,1]和[3,2]的位置上。如下图所示:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(522),alt:"PNG"}}),t._v(" "),n("p",[t._v("题目明确了之后,现在我们开始进行分析。题目很明显是"),n("strong",[t._v("一个找最优解的问题,并且可以从子问题的最优解进")])]),t._v(" "),n("p",[n("strong",[t._v("行构建")]),t._v("。所以我们通过动态规划进行求解。首先,我们定义状态:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[i][j] : 表示包含第i行j列元素的最小路径和 ")])])],1),t._v(" "),n("p",[t._v("我们很容易想到可以自顶向下进行分析。并且,无论最后的路径是哪一条,它一定要经过最顶上的元素,即 [0,0]。所以我们需要对 dp[0][0] 进行初始化。")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[0][0] = [0][0]位置所在的元素值 ")])])],1),t._v(" "),n("p",[t._v("继续分析,如果我们要求dp[i][j],那么其一定会从自己头顶上的两个元素移动而来。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(523),alt:"PNG"}}),t._v(" "),n("p",[t._v("如5这个位置的最小路径和,要么是从2-3-5而来,要么是从2-4-5而来。然后取两条路径和中较小的一个即可。进")]),t._v(" "),n("p",[t._v("而我们得到状态转移方程:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[i][j] = min(dp[i-1][j-1],dp[i-1][j]) + triangle[i][j] ")])])],1),t._v(" "),n("p",[t._v("但是,我们这里会遇到一个问题!除了最顶上的元素之外,")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(524),alt:"PNG"}}),t._v(" "),n("p",[n("strong",[t._v("最左边的元素只能从自己头顶而来")]),t._v("。(2-3-6-4)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(525),alt:"PNG"}}),t._v(" "),n("p",[n("strong",[t._v("最右边的元素只能从自己左上角而来")]),t._v("。(2-4-7-3)")]),t._v(" "),n("p",[t._v("然后,我们观察发现,"),n("strong",[t._v("位于第2行的元素,都是特殊元素")]),t._v("("),n("strong",[t._v("因为都只能从[0,0]的元素走过来")]),t._v(")")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(526),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们可以直接将其特殊处理,得到:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[1][0] = triangle[1][0] + triangle[0][0] ")])]),t._v(" "),n("center",[n("b",[t._v(" dp[1][1] = triangle[1][1] + triangle[0][0] ")])])],1),t._v(" "),n("br"),t._v(" "),n("p",[t._v("最后,我们只要找到"),n("strong",[t._v("最后一行元素中,路径和最小的一个")]),t._v(",就是我们的答案。即:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" l:dp数组长度 ")])]),t._v(" "),n("center",[n("b",[t._v(" result = min(dp[l-1,0],dp[l-1,1],dp[l-1,2]....) ")])])],1),t._v(" "),n("p",[t._v("综上我们就分析完了,我们总共进行了4步:")]),t._v(" "),n("ol",[n("li",[t._v("定义状态")]),t._v(" "),n("li",[t._v("总结状态转移方程")]),t._v(" "),n("li",[t._v("分析状态转移方程不能满足的特殊情况。")]),t._v(" "),n("li",[t._v("得到最终解")])]),t._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),n("p",[t._v("根据以上分析,可以得到代码如下:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("minimumTotal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tdp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" triangle "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(527),alt:"PNG"}}),t._v(" "),n("p",[t._v("运行上面的代码,我们发现使用的内存过大。我们有没有什么办法可以压缩内存呢?通过观察我们发现,"),n("strong",[t._v("在我们")])]),t._v(" "),n("p",[n("strong",[t._v("自顶向下的过程中,其实我们只需要使用到上一层中已经累积计算完毕的数据,并且不会再次访问之前的元素数")])]),t._v(" "),n("p",[n("strong",[t._v("据")]),t._v("。绘制成图如下:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(528),alt:"PNG"}}),t._v(" "),n("p",[t._v("优化后的代码如下:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("minimumTotal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\ttriangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ttriangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ttriangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\ttriangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\ttriangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\ttriangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" triangle"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(529),alt:"PNG"}})])}),[],!1,null,null,null);s.default=r.exports},520:function(t,s,a){t.exports=a.p+"assets/img/1.e9ab843e.png"},521:function(t,s,a){t.exports=a.p+"assets/img/2.a9bb6bb9.png"},522:function(t,s,a){t.exports=a.p+"assets/img/3.b24151b9.png"},523:function(t,s,a){t.exports=a.p+"assets/img/4.b941e37c.png"},524:function(t,s,a){t.exports=a.p+"assets/img/5.3aa639d9.png"},525:function(t,s,a){t.exports=a.p+"assets/img/6.61b74f5e.png"},526:function(t,s,a){t.exports=a.p+"assets/img/7.efb587cb.png"},527:function(t,s,a){t.exports=a.p+"assets/img/8.7a33313c.jpg"},528:function(t,s,a){t.exports=a.p+"assets/img/9.99919de2.png"},529:function(t,s,a){t.exports=a.p+"assets/img/10.cc9e7651.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/19.87dbe463.js b/learning/.vuepress/dist/assets/js/19.87dbe463.js deleted file mode 100644 index a5546518..00000000 --- a/learning/.vuepress/dist/assets/js/19.87dbe463.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{1140:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天是小浩算法“365刷题计划”第102天。每个人的起点和终点都是一样的,但过程却各不相同。我们无法主宰生死却可以选择如何让生命有意义。我们如何用算法来进行一场生命的游戏呢!")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("生命游戏,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第289题:生命游戏")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。")])])])]),t._v(" "),n("p",[t._v("每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[t._v("如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;")]),t._v(" "),n("li",[t._v("如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;")]),t._v(" "),n("li",[t._v("如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;")]),t._v(" "),n("li",[t._v("如果死细胞周围正好有三个活细胞,则该位置死细胞复活;")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("题目有点复杂,举例说明:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(952),alt:"PNG"}}),t._v(" "),n("p",[t._v("注意:"),n("strong",[t._v("面板上所有格子需要同时被更新")]),t._v(":你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。")]),t._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[t._v("#")]),t._v(" 02、题解分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目的关键点是:"),n("strong",[t._v("面板上所有格子需要同时被更新")])])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("本题的复杂主要复杂在 4 个更新规则,所以我们需要先对 4 个规则进行掌握(我们仅对下面绿色标出的元素进行说明)")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[n("p",[t._v("R1:细胞数少于两个,则该位置"),n("strong",[t._v("活细胞")]),t._v("死亡")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(953),alt:"PNG"}})]),t._v(" "),n("li",[n("p",[t._v("R2:有两个或三个活细胞,则该位置"),n("strong",[t._v("活细胞")]),t._v("仍然存活")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(954),alt:"PNG"}})]),t._v(" "),n("li",[n("p",[t._v("R3:有超过三个活细胞,则该位置"),n("strong",[t._v("活细胞")]),t._v("死亡")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(955),alt:"PNG"}})]),t._v(" "),n("li",[n("p",[t._v("R4:有三个活细胞,则该位置"),n("strong",[t._v("死细胞")]),t._v("复活")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(956),alt:"PNG"}})])]),t._v(" "),n("p",[t._v("四个规则理解起来并不复杂,现在考虑如何解决问题。最自然的想法是:一个个的更新细胞状态。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("但是这里我们会遇到一个问题:假设你每次更新完毕后,都把更新后的结果填入数组。那么当前轮其他格子的更新就会引用到你已经更新的结果。啥意思呢:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(957),alt:"PNG"}}),t._v(" "),n("p",[t._v("比如上面这个就是"),n("strong",[t._v("错误")]),t._v("的:我们先依据规则4更新了绿色框处的状态,此时蓝色框色周围同样满足规则4。"),n("strong",[t._v("已更新细胞的状态会影响到周围其他还未更新细胞状态的计算")]),t._v("。这明显不是我们想要的!")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(958),alt:"PNG"}}),t._v(" "),n("p",[t._v("那我们最简单的思路:是不是只要我们能一直获取原始数组的数据,不就可以保证更新一直正确了吗!至于在哪里,其实不管是copy一个数组,还是说用hashmap存一下数值其实都ok。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("因为这种思路相对比较简单,我就直接上 leetcode 官方题解的代码了:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("gameOfLife")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" neighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" rows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" cols "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 创建复制数组 copyBoard")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" copyBoard "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("rows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("cols"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 从原数组复制一份到 copyBoard 中")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" row "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" row "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" rows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" row"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" cols"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" col"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n copyBoard"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 遍历面板每一个格子里的细胞")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" row "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" row "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" rows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" row"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" cols"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" col"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 对于每一个细胞统计其八个相邻位置里的活细胞数量")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("neighbors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" neighbors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("row "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" neighbors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" neighbors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 查看相邻的细胞是否是活细胞")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("r "),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v(" rows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c "),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v(" cols "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("copyBoard"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 规则 1 或规则 3 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("copyBoard"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 规则 4")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("copyBoard"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br")])]),n("p",[t._v("然后有意思的事情发生了,大神之所以是大神,就是大神的思路和普通人不一样。大神说,你这种方法可以是可以,但是占用了新的空间。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("你不就想既可以保存原数组的状态,还可以更新新的状态吗?这些统统都可以在原有数组上搞")]),t._v("。具体怎么搞呢?")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[t._v("原来的 0 和 1 不就是代表死和生吗?但是你要更新新的状态,无非就是从生->死,从死->生。那我们加个状态 2,代表 生->死,加个状态 3 表示从 死>生。")]),t._v(" "),n("li",[t._v("对于一个节点来说,如果它周边的点是 1 或者 2,就说明该点上一轮是活的。")]),t._v(" "),n("li",[t._v("整体策略是完成 原始状态->过渡状态->真实状态 的过程。")]),t._v(" "),n("li",[t._v("过渡状态 到 真实状态,代码就是把 0 和 2 变回 0,1 和 3 变回1的过程。用模只是代码技巧。")]),t._v(" "),n("li",[t._v("策略实现的第一步是先找到当前节点周围的存活节点数。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("代码大概就是这样:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//JAVA")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("gameOfLife")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 原始状态 -> 过渡状态 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断上边 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断左边 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断下边 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tliveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断右边 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tliveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断左上角 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tliveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//判断右下角 ")]),t._v("\n \t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tliveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断右上角 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tliveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 判断左下角 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tliveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据周边存活数量更新当前点,结果是 0 和 1 的情况不用更新 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tboard"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" liveNeighbors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 过渡状态 -> 真实状态 ")]),t._v("\n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n \tboard"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" board"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n \t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(959),alt:"PNG"}}),t._v(" "),n("p",[t._v("细心的读者也许会想到,这不就是卡诺图吗?是的。在大多数的矩阵状态变化类题目中,卡诺图、状态机 等都是一些常用的技巧。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("一般的通用解法为:")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("1、大部分都是遍历两次矩阵,第一遍引入中间值(中间状态),存储一些原矩阵不包含的额外信息。")]),t._v(" "),n("p",[t._v("2、通过 原始矩阵->过渡矩阵->真实矩阵 的策略,在结尾处将中间状态置成真实状态。")]),t._v(" "),n("p",[t._v("3、当遍历到某个位置时,需要查看它周边的位置,此时如果每一个周围的位置都手写,然后再判断是否越界,就很麻烦。一般用一个数组,保存向周边位置变化的坐标偏移值。")]),t._v(" "),n("p",[t._v("4、如果是 0 和 1 的状态置换,可以使用位运算来秀操作。如果涉及状态过多,考虑是否可以简化状态。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("总之:这是一道相对比较经典的题目,如果大家有兴趣,大家可以练习一下 第73题 矩阵置零,也是类似的解法。")]),t._v(" "),n("h2",{attrs:{id:"_03、每日算法"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、每日算法"}},[t._v("#")]),t._v(" 03、每日算法")]),t._v(" "),n("blockquote",[n("p",[t._v("宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(960),alt:"PNG"}}),t._v(" "),n("img",{attrs:{src:a(961),alt:"PNG"}}),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);s.default=r.exports},952:function(t,s,a){t.exports=a.p+"assets/img/1.f680c845.jpg"},953:function(t,s){t.exports="data:image/jpeg;base64,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"},954:function(t,s){t.exports="data:image/jpeg;base64,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"},955:function(t,s){t.exports="data:image/jpeg;base64,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"},956:function(t,s){t.exports="data:image/jpeg;base64,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"},957:function(t,s,a){t.exports=a.p+"assets/img/6.389dadc8.jpg"},958:function(t,s,a){t.exports=a.p+"assets/img/7.662c3152.jpg"},959:function(t,s){t.exports="data:image/jpeg;base64,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"},960:function(t,s,a){t.exports=a.p+"assets/img/9.72fd97d3.gif"},961:function(t,s,a){t.exports=a.p+"assets/img/10.170a7f3c.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/20.1b1ce662.js b/learning/.vuepress/dist/assets/js/20.1b1ce662.js deleted file mode 100644 index 66034121..00000000 --- a/learning/.vuepress/dist/assets/js/20.1b1ce662.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{1080:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("在上一篇中,我们学习了解了"),n("strong",[t._v("平衡二叉树")]),t._v(",并且利用DFS进行了验证。在本节中,我们将继续学习"),n("strong",[t._v("完全二叉树")]),t._v("的相关内容。首先了解一下什么是完全二叉树。")])]),t._v(" "),n("h2",{attrs:{id:"_01、完全二叉树"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、完全二叉树"}},[t._v("#")]),t._v(" 01、完全二叉树")]),t._v(" "),n("p",[t._v("完全二叉树由满二叉树引出,先来了解一下什么是满二叉树:")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("如果"),n("strong",[t._v("二叉树中除了叶子结点,每个结点的度都为 2")]),t._v(",则此二叉树称为"),n("strong",[t._v("满二叉树")]),t._v("。("),n("strong",[t._v("二叉树的度")]),t._v("代表**某个结点的孩子或者说直接后继的个数。**对于二叉树而言,1度是只有一个孩子或者说单子树,2度是有两个孩子或者说左右子树都有。)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("比如下面这颗:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(636),alt:"img"}}),t._v(" "),n("p",[t._v("那什么又是完全二叉树呢:")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("如果"),n("strong",[t._v("二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布")]),t._v(",则此二叉树被称为"),n("strong",[t._v("完全二叉树")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("比如下面这颗:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(637),alt:"img"}}),t._v(" "),n("p",[t._v("而这颗就不是:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(638),alt:"img"}}),t._v(" "),n("p",[t._v("熟悉了概念,我们还是一起来看题目吧。")]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第222题:完全二叉树的节点个数")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给出一个完全二叉树,求出该树的节点个数。")])])])]),t._v(" "),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("p",[t._v("完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: \n 1\n / \\\n 2 3\n / \\ /\n4 5 6\n\n输出: 6\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br")])]),n("h2",{attrs:{id:"_03、递归求解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、递归求解"}},[t._v("#")]),t._v(" 03、递归求解")]),t._v(" "),n("p",[t._v("首先分析题目,我们很容易可以想到通过递归,来求解节点个数。")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("func countNodes(root *TreeNode) int {\n if root != nil {\n return 1 + countNodes(root.Right) + countNodes(root.Left)\n }\n return 1 + countNodes(root.Right) + countNodes(root.Left)\n}\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(639),alt:"img"}}),t._v(" "),n("p",[t._v("但是很明显,出题者肯定不是要这种答案。因为这种答案和完全二叉树一毛钱关系都没有。所以我们继续思考。")]),t._v(" "),n("h2",{attrs:{id:"_04、经典解法"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、经典解法"}},[t._v("#")]),t._v(" 04、经典解法")]),t._v(" "),n("p",[t._v("由于题中已经告诉我们这是一颗完全二叉树,我们又已知了完全二叉树除了最后一层,其他层都是满的,并且最后一层的节点全部靠向了左边。那我们可以想到,可以将该完全二叉树可以分割成"),n("strong",[t._v("若干满二叉树和完全二叉树")]),t._v(","),n("strong",[t._v("满二叉树直接根据层高h计算出节点为2^h-1,"),n("strong",[t._v("然后")]),t._v("继续计算子树中完全二叉树节点")]),t._v("。那如何分割成若干满二叉树和完全二叉树呢?"),n("strong",[t._v("对任意一个子树,遍历其左子树层高left,右子树层高right,相等左子树则是满二叉树,否则右子树是满二叉树")]),t._v("。这里可能不容易理解,我们看图。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("假如我们有树如下:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(640),alt:"img"}}),t._v(" "),n("p",[t._v("我们看到根节点的左右子树高度都为3,那么说明左子树是一颗满二叉树。因为节点已经填充到右子树了,左子树必定已经填满了。所以左子树的节点总数我们可以直接得到,是2^left - 1,加上当前这个root节点,则正好是2^3,即 8。然后只需要再对右子树进行递归统计即可。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(641),alt:"img"}}),t._v(" "),n("p",[t._v("那假如我们的树是这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(642),alt:"img"}}),t._v(" "),n("p",[t._v("我们看到左子树高度为3,右子树高度为2。说明此时最后一层不满,但倒数第二层已经满了,可以直接得到右子树的节点个数。同理,右子树节点+root节点,总数为2^right,即2^2。再对左子树进行递归查找。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(643),alt:"img"}}),t._v(" "),n("p",[t._v("根据分析,得出代码:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("countNodes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TreeNode")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("countLevel")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("countLevel")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("countNodes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("countNodes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("countLevel")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TreeNode")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" level "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n level"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" level"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(644),alt:"img"}})])}),[],!1,null,null,null);s.default=e.exports},636:function(t,s,a){t.exports=a.p+"assets/img/1.d12167e7.jpg"},637:function(t,s,a){t.exports=a.p+"assets/img/2.e5a6e037.jpg"},638:function(t,s){t.exports="data:image/jpeg;base64,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"},639:function(t,s,a){t.exports=a.p+"assets/img/4.3662f31c.jpg"},640:function(t,s,a){t.exports=a.p+"assets/img/5.b6280d8e.jpg"},641:function(t,s,a){t.exports=a.p+"assets/img/6.027b3f47.jpg"},642:function(t,s,a){t.exports=a.p+"assets/img/7.13aa55b6.jpg"},643:function(t,s,a){t.exports=a.p+"assets/img/8.ec06de5a.jpg"},644:function(t,s,a){t.exports=a.p+"assets/img/9.730e40a3.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/21.5330b659.js b/learning/.vuepress/dist/assets/js/21.5330b659.js deleted file mode 100644 index bc3c82aa..00000000 --- a/learning/.vuepress/dist/assets/js/21.5330b659.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{1142:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天是小浩算法 “365刷题计划” 第105天。这是昨天一个同学面试快手被问到的算法题,很不幸的是他被挂掉了。征得对方同意后,拿出来分享给大家~")])]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(965),alt:"PNG"}}),s._v(" "),n("center",[s._v("(如果要进入算法交流群的,扫描二维码就可以了)")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(966),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("子集:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第48题:子集")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一组"),n("strong",[s._v("不含重复元素")]),s._v("的整数数组 "),n("em",[s._v("nums")]),s._v(",返回该数组所有可能的子集(幂集)。")])])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("**说明:**解集不能包含重复的子集")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: nums = [1,2,3] \n\n输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[s._v("题目本身没有太多需要补充的,初中数学知识:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(967),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_02、题解分析-高级"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析-高级"}},[s._v("#")]),s._v(" 02、题解分析(高级)")]),s._v(" "),n("blockquote",[n("p",[s._v("上一个很厉害的题解。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("首先我们可以证明一下 N 个元素的子集个数有 2^N 个:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(968),alt:"PNG"}}),s._v(" "),n("p",[s._v("可以类比为 N 个不同的小球,一次拿出若干个小球(可以不拿),对于每一个球都可以选择拿或者不拿,共有 N 个球,总共判断 N 次,产生了 2^N 个子集。比如:123,共有下面 8 个子集:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(969),alt:"PNG"}}),s._v(" "),n("p",[s._v("然后考虑解题思路,**暂且不谈回溯,我们其实可以用二进制来模拟每个元素是否选中的状态。**又因为我们已知了对于 N 个元素共有 2^N 个子集,所以我们直接遍历 2^N 个元素。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("subsets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//存放所有子集 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//子集总数共有 2^N 个 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//遍历所有的子集 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" sub "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//TODO : 找到对应的子集元素")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("p",[s._v("但是我们并不知道具体的子集元素。那如何找到对应的子集元素呢?"),n("strong",[s._v("对于 2^N 个 N 位的二进制数,我们可以通过从后往前的第 j 个二进制位的 0 和 1 来表示是否放入子集集合。")])]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" sub"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[s._v("综合一下代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("subsets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//存放所有子集 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//子集总数公有 2^N 个 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//遍历所有的子集 ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" sub "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" sub"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sub"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br")])]),n("p",[s._v("为帮助大家理解,假设 nums 为 [1,2,3],res 的存储过程为:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(970),alt:"PNG"}}),s._v(" "),n("p",[s._v("大家可以仔细体会一下这个题解。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(971),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、题解分析(普通)"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题解分析(普通)"}},[s._v("#")]),s._v(" 03、题解分析(普通)")]),s._v(" "),n("blockquote",[n("p",[s._v("当然,上面的题解并不是凡人可以直接想到的。所以我们这里还是给出一种更为通用的题解~")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("集合中所有元素的选/不选,其实构成了一个满二叉树。左子树选,右子树不选。自然,那从根节点到所有叶子节点的路径,就构成了所有的子集。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(972),alt:"PNG"}}),s._v(" "),n("center",[s._v("(旋转90°)")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(973),alt:"PNG"}}),s._v(" "),n("p",[s._v("那这种解法其实就好理解很多了:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("subsets")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" list "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("dfs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("dfs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" start"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" start"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("dfs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("remove")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br")])]),n("p",[s._v("总之,这道题目其实还是有一定难度的,难点主要包括:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("数学知识的混淆,忘记考虑空集等情况。")]),s._v(" "),n("li",[s._v("和全排列问题混淆,把 2^N 当做 N!处理。")]),s._v(" "),n("li",[s._v("递归与回溯细节掌握不扎实。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("但并不是不可以攻克,建议大家下去自行练习一番~")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("加油,奥利给!")])])],1)}),[],!1,null,null,null);t.default=e.exports},965:function(s,t,a){s.exports=a.p+"assets/img/1.0690e47c.jpg"},966:function(s,t,a){s.exports=a.p+"assets/img/2.9d2cac0d.jpg"},967:function(s,t,a){s.exports=a.p+"assets/img/3.fea14d13.jpg"},968:function(s,t,a){s.exports=a.p+"assets/img/4.9c6ba0d5.gif"},969:function(s,t,a){s.exports=a.p+"assets/img/5.f1a30d9b.jpg"},970:function(s,t){s.exports="data:image/jpeg;base64,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"},971:function(s,t){s.exports="data:image/jpeg;base64,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"},972:function(s,t,a){s.exports=a.p+"assets/img/8.af52760a.jpg"},973:function(s,t,a){s.exports=a.p+"assets/img/9.1ef32719.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/22.751097e9.js b/learning/.vuepress/dist/assets/js/22.751097e9.js deleted file mode 100644 index a9f72dce..00000000 --- a/learning/.vuepress/dist/assets/js/22.751097e9.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{1053:function(t,s,a){"use strict";a.r(s);var n=a(3),A=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享一道让很多人头疼过的题目 - Z字形变化。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("额。。。不知道是不是我瞎,明明是N么(杠精勿扰,只是说说)")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第6题:Z 字形变换")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v('将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 **"LEETCODEISHIRING" **行数为 3 时,排列如下:')])])])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("L C I R\nE T O E S I I G\nE D H N\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("br"),t._v(" "),n("p",[t._v("之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"),n("strong",[t._v('"LCIRETOESIIGEDHN"')]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("请你实现这个将字符串进行指定行数变换的函数:")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("string convert(string s, int numRows);\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入: s = "LEETCODEISHIRING", numRows = 3\n输出: "LCIRETOESIIGEDHN"\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入: s = "LEETCODEISHIRING", numRows = 4\n输出: "LDREOEIIECIHNTSG"\n\n解释:\nL D R\nE O E I I\nE C I H N\nT S G\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(476),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这是我比较推崇的一道“小学题目”,因为其没有任何复杂的思维逻辑,只需要按部就班,就可以顺利解答。难的是,按部就班的过程里,却极其容易出错。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("因为最终目的是变换字符串的顺序,并且题中也没有限制说不可用额外空间,所以我们秉承不重复造轮子的原则,想办法利用某种结构对原字符串做文章。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v('假若我们采用示例2的数据来进行分析,输入字符串 s 为 "LEETCODEISHIRING", numRows 为 4 ,画成图大概长这样:')]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(477),alt:"PNG"}}),t._v(" "),n("p",[t._v("重点来了,"),n("strong",[t._v("我们的目标是按行打印,那总得有个东西来存储每行的数据吧")]),t._v("?因为只需要存储"),n("strong",[t._v("每行")]),t._v("的数据,那是不是用个数组就可以了。(当然,你硬说搞个map来存也没啥毛病,就是有点闲得蛋疼)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("问题来了,那数组设置多大呢?自然是有多少行我们就设置多大呗,换句话说,numRows多大,我们的数组就设置多大。画成图大概就是下面这个样子:")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(478),alt:"PNG"}}),t._v(" "),n("p",[t._v("存储的容器有了,原字符串也列出来是啥样了,现在嘎哈?自然就是把原字符串放到容器里咯。怎么放?"),n("strong",[t._v("根据 numRows 的大小来回进行放置即可")]),t._v("(即从0到n-1,再从n-1到0)。具体的请看下图:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(479),alt:"PNG"}}),t._v(" "),n("p",[t._v("上面的图长得不得了,但是观察我们能看出来,"),n("strong",[t._v("每 2n-2 即为一个周期")]),t._v("。到了这里,应该没有人会质疑这是一道小学题目了吧。。。把所有的字符串放完之后,大概就是下面这个样子:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(480),alt:"PNG"}}),t._v(" "),n("p",[t._v("最后一步,咱们让这个数组排排坐,就可以开始吃果果:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(481),alt:"PNG"}}),t._v(" "),n("p",[t._v("如果看不清楚,不如这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(482),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据分析,得出代码(好久没翻go的牌子了):")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("convert")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" numRows "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" numRows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" s\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("rune")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" numRows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" period "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" numRows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" period\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" numRows "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tres"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tres"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("period "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" strings"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Join")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{},attrs:{src:a(483),alt:"PNG"}}),t._v(" "),n("p",[t._v("上面的代码要强调两点:")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("第一:用了一个rune,这个其实是go里的用法,用来处理unicode或utf-8字符而已,并没有什么特别的。")]),t._v(" "),n("p",[t._v("第二:12-15行的意思是,在周期内,正着走 numRows-1 下,剩余的反着走。(也就是上面那个长长的图)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("为了照顾Java的小伙伴,再给出一个Java版本的:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("convert")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" numRows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numRows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("numRows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("fill")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" chars "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("toCharArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" chars"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" period "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" numRows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" period"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mod "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" numRows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" chars"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("period "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" mod"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("valueOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("chars"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StringBuilder")]),t._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StringBuilder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" ch "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ch"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br")])]),n("p",[t._v("和Go语言的示例一样,代码的关键仍然是计算轨迹的过程(10-17),这里再提供另外一种计算轨迹的方式:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("convert")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" numRows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("numRows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("numRows"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("fill")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" flag "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("toCharArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" numRows "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" flag "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("flag"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" flag"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StringBuilder")]),t._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StringBuilder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" ch "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ch"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("通过使用一个标志位,来使轨迹回移。(本质其实是一样的)")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_03、总结"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、总结"}},[t._v("#")]),t._v(" 03、总结")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目的意义在于考察coding的能力,本身的思维过程并不复杂。有的同学一看这种题目,"),n("strong",[t._v("就想通过二维数组来进行计算,殊不知已经落入了题目的陷阱(不信你试试,二维数组出错率一定远胜一维数组)")]),t._v("。当然,本题也是可以不借助额外空间来进行实现的,核心的逻辑完全相同,建议大家下去自己动手练习一下。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=A.exports},476:function(t,s,a){t.exports=a.p+"assets/img/1.c8aefc09.gif"},477:function(t,s,a){t.exports=a.p+"assets/img/2.2ea69152.jpg"},478:function(t,s,a){t.exports=a.p+"assets/img/3.e3a47b2e.jpg"},479:function(t,s,a){t.exports=a.p+"assets/img/4.c46f6eb3.jpg"},480:function(t,s,a){t.exports=a.p+"assets/img/5.dfc3e337.jpg"},481:function(t,s){t.exports="data:image/jpeg;base64,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"},482:function(t,s){t.exports="data:image/jpeg;base64,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"},483:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/23.a7bcde24.js b/learning/.vuepress/dist/assets/js/23.a7bcde24.js deleted file mode 100644 index 5e2cb5a5..00000000 --- a/learning/.vuepress/dist/assets/js/23.a7bcde24.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{1083:function(A,s,t){"use strict";t.r(s);var a=t(3),n=Object(a.a)({},(function(){var A=this,s=A.$createElement,a=A._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[a("blockquote",[a("p",[A._v("今天为大家分享如何用算法来求全排列!话不多说,直接看题!")])]),A._v(" "),a("h2",{attrs:{id:"_01、全排列概念"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、全排列概念"}},[A._v("#")]),A._v(" 01、全排列概念")]),A._v(" "),a("blockquote",[a("p",[A._v("什么是全排列?从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n 个不同元素中取出 m 个元素的一个排列。当 m=n 时所有的排列情况叫全排列。")])]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("比如 [1,2,3] 全排列共有 6 种:")]),A._v(" "),a("img",{attrs:{src:t(655),alt:"PNG"}}),A._v(" "),a("h2",{attrs:{id:"_02、全排列题目"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、全排列题目"}},[A._v("#")]),A._v(" 02、全排列题目")]),A._v(" "),a("blockquote",[a("p",[A._v("然后把上面的全排列稍微改改,就变成了一道算法题。。。")])]),A._v(" "),a("table",[a("thead",[a("tr",[a("th",[A._v("全排列问题")])])]),A._v(" "),a("tbody",[a("tr",[a("td",[A._v("给定一个 "),a("strong",[A._v("没有重复")]),A._v(" 数字的序列,返回其所有可能的全排列。")])])])]),A._v(" "),a("p",[a("strong",[A._v("示例:")])]),A._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[A._v("输入: [1,2,3]\n\n输出:\n[\n [1,2,3],\n [1,3,2],\n [2,1,3],\n [2,3,1],\n [3,1,2],\n [3,2,1]\n]\n")])]),A._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[A._v("1")]),a("br"),a("span",{staticClass:"line-number"},[A._v("2")]),a("br"),a("span",{staticClass:"line-number"},[A._v("3")]),a("br"),a("span",{staticClass:"line-number"},[A._v("4")]),a("br"),a("span",{staticClass:"line-number"},[A._v("5")]),a("br"),a("span",{staticClass:"line-number"},[A._v("6")]),a("br"),a("span",{staticClass:"line-number"},[A._v("7")]),a("br"),a("span",{staticClass:"line-number"},[A._v("8")]),a("br"),a("span",{staticClass:"line-number"},[A._v("9")]),a("br"),a("span",{staticClass:"line-number"},[A._v("10")]),a("br"),a("span",{staticClass:"line-number"},[A._v("11")]),a("br")])]),a("h2",{attrs:{id:"_03、题解分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、题解分析"}},[A._v("#")]),A._v(" 03、题解分析")]),A._v(" "),a("blockquote",[a("p",[A._v("这种由基础数学知识改编而成的题目,在面试时还是很受欢迎的。因为作为面试官,可以用这种题目,来显示自己的博学。(谬论)")])]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("假如我们不是做算法题,而是做数学题。我们会一个位置一个位置的来考虑,先写出以1开头的排列,再写出以2开头的排列,最后写出以3开头的排列。")]),A._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:t(656),alt:"PNG"}}),A._v(" "),a("p",[A._v("这种思路是不是很像深度优先(DFS)的求解过程呢?")]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("1、我们先选择 1,然后为 1 的第二位选择 2,此时 1 的 第三位只能选择 3。")]),A._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:t(657),alt:"PNG"}}),A._v(" "),a("p",[A._v("2、然后完成了上面的步骤,我们需要回退到 1,因为只有 1 这里还存在别的选择 1-3,然后填写 1-3 后,只有 1-3-2 一种选择。")]),A._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:t(658),alt:"PNG"}}),A._v(" "),a("p",[A._v("3、此时我们需要从 1-3-2,回退到 1-3,再回退到 1,再回退到 根节点,然后重新选择 2。")]),A._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:t(659),alt:"PNG"}}),A._v(" "),a("p",[A._v("4、后面的流程与前面相似,我就不一步步的描述了。")]),A._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:t(660),alt:"PNG"}}),A._v(" "),a("p",[A._v("当然,如果不省略其回溯过程,就是下面这个样子:")]),A._v(" "),a("p",[A._v("[TODO]")]),A._v(" "),a("p",[A._v("上面分析是分析完了,但是仍然不妨碍你继续懵逼。。。“题目中不是给我的是一个数组吗?作为一个合格的算法小白,我特么根本就不知道 DFS 在这里面咋用啊!!”本来想扔完代码就走,想了想还是决定讲一下。")]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("我们把代码先丢出来(注意,这个代码不是最优的,这样写只是易于大家理解。比如我们还可以通过置换的方式来进行优化,又或者其他的优化方法。但是都大同小异,核心是回溯的过程):")]),A._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[A._v("//JAVA ")]),A._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("class")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("Solution")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v(" \n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("List")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")])]),A._v(" ans "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("new")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("ArrayList")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v(" \n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("public")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("List")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")])]),A._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("permute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("]")]),A._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v(" \n "),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(",")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("new")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("ArrayList")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("return")]),A._v(" ans"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("private")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("void")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("]")]),A._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(",")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")])]),A._v(" tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),A._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("Arrays")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("+")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[A._v('","')]),A._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("+")]),A._v(" tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("if")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("size")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("==")]),A._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),A._v("length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n ans"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("new")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[A._v("ArrayList")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("else")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("for")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("int")]),A._v(" num "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v(":")]),A._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("if")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("!")]),A._v("tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("contains")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(",")]),A._v(" tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v("\n tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("remove")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("tmp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[A._v("size")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("-")]),A._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[A._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n")])]),A._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[A._v("1")]),a("br"),a("span",{staticClass:"line-number"},[A._v("2")]),a("br"),a("span",{staticClass:"line-number"},[A._v("3")]),a("br"),a("span",{staticClass:"line-number"},[A._v("4")]),a("br"),a("span",{staticClass:"line-number"},[A._v("5")]),a("br"),a("span",{staticClass:"line-number"},[A._v("6")]),a("br"),a("span",{staticClass:"line-number"},[A._v("7")]),a("br"),a("span",{staticClass:"line-number"},[A._v("8")]),a("br"),a("span",{staticClass:"line-number"},[A._v("9")]),a("br"),a("span",{staticClass:"line-number"},[A._v("10")]),a("br"),a("span",{staticClass:"line-number"},[A._v("11")]),a("br"),a("span",{staticClass:"line-number"},[A._v("12")]),a("br"),a("span",{staticClass:"line-number"},[A._v("13")]),a("br"),a("span",{staticClass:"line-number"},[A._v("14")]),a("br"),a("span",{staticClass:"line-number"},[A._v("15")]),a("br"),a("span",{staticClass:"line-number"},[A._v("16")]),a("br"),a("span",{staticClass:"line-number"},[A._v("17")]),a("br"),a("span",{staticClass:"line-number"},[A._v("18")]),a("br"),a("span",{staticClass:"line-number"},[A._v("19")]),a("br"),a("span",{staticClass:"line-number"},[A._v("20")]),a("br"),a("span",{staticClass:"line-number"},[A._v("21")]),a("br"),a("span",{staticClass:"line-number"},[A._v("22")]),a("br"),a("span",{staticClass:"line-number"},[A._v("23")]),a("br"),a("span",{staticClass:"line-number"},[A._v("24")]),a("br"),a("span",{staticClass:"line-number"},[A._v("25")]),a("br")])]),a("p",[A._v("假若 nums 为 [1,2,3],会有下面的输出:")]),A._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:t(661),alt:"PNG"}}),A._v(" "),a("p",[A._v("其实这个代码还是很容易理解的,他干了个啥事?就是当我们按顺序去枚举每一位时,我们要把已经选择过的数字排除掉(第16行代码),比如我们上面选择三个数字:")]),A._v(" "),a("br"),A._v(" "),a("ul",[a("li",[A._v("在枚举第一位的时候,就有三种情况")]),A._v(" "),a("li",[A._v("在枚举第二位的时候,就只有两种情况(前面已经出现的一个数字不可以再出现)")]),A._v(" "),a("li",[A._v("在枚举第三位的时候,就只有一种情况(前面已经出现的两个数字不可以再出现)")])]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("整个代码其实就干了这么一件事!而 第12行 的代码,其实就是说"),a("strong",[A._v("当枚举到最后一位的时候,这个就是我们要的排列结果,所以我们要放入到全排列结果集中。")])]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("那这里还有一个很重要的代码,其实是 第19行,这一步其实是干啥!说白了就是在回到上一位时,我们要就把上一次的选择结果"),a("strong",[A._v("撤销")]),A._v("掉。不然如果你之前选过了,后面不就不能继续用了么。")]),A._v(" "),a("h2",{attrs:{id:"_04、总结"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_04、总结"}},[A._v("#")]),A._v(" 04、总结")]),A._v(" "),a("blockquote",[a("p",[A._v("回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。")])]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("这是最简单的一道全排列题目,注意我在上面的题解中,并没有引入什么状态、路径、选择列表、结束条件之类的专业术语,甚至我连回溯的概念都没有提及。")]),A._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:t(662),alt:"PNG"}}),A._v(" "),a("p",[A._v("之所以这样讲,我是希望咱可以从最简单的人类思考出发,而不是去套用一些框架之类的东东。。。。当然,至于更多的概念和回溯框架的东西,我会在后面更为复杂的题目中为大家引入。")]),A._v(" "),a("br"),A._v(" "),a("p",[A._v("好了,基本就是这样了。周末写文不容易,求个转发,来个评论。感谢~")])])}),[],!1,null,null,null);s.default=n.exports},655:function(A,s,t){A.exports=t.p+"assets/img/1.f3588f7c.jpg"},656:function(A,s){A.exports="data:image/jpeg;base64,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"},657:function(A,s,t){A.exports=t.p+"assets/img/3.6f35751e.jpg"},658:function(A,s,t){A.exports=t.p+"assets/img/4.386090fa.jpg"},659:function(A,s,t){A.exports=t.p+"assets/img/5.f3b5c75b.jpg"},660:function(A,s,t){A.exports=t.p+"assets/img/6.7626291b.jpg"},661:function(A,s){A.exports="data:image/jpeg;base64,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"},662:function(A,s,t){A.exports=t.p+"assets/img/8.c7dee1ef.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/24.281f9edc.js b/learning/.vuepress/dist/assets/js/24.281f9edc.js deleted file mode 100644 index 40463161..00000000 --- a/learning/.vuepress/dist/assets/js/24.281f9edc.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{1086:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("在上一节中,我们使用"),n("strong",[t._v("双端队列")]),t._v("完成了滑动窗口的一道颇为困难的题目,以此展示了什么是滑动窗口。在本节中我们将继续深入分析,探索滑动窗口题型一些具有模式性的解法。")])]),t._v(" "),n("h2",{attrs:{id:"_01、滑动窗口介绍"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、滑动窗口介绍"}},[t._v("#")]),t._v(" 01、滑动窗口介绍")]),t._v(" "),n("p",[t._v("对于大部分滑动窗口类型的题目,一般是"),n("strong",[t._v("考察字符串的匹配")]),t._v("。比较标准的题目,会给出一个"),n("strong",[t._v("模式串B")]),t._v(",以及一个"),n("strong",[t._v("目标串A")]),t._v("。然后提出问题,找到"),n("strong",[t._v("A中符合对B一些限定规则的子串或者对A一些限定规则的结果,"),n("strong",[t._v("最终")]),t._v("再将搜索出的子串完成题意中要求的组合或者其他")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("比如:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("又或者:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("再如:给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("都是属于这一类的标准题型。而对于这一类题目,我们常用的解题思路,"),n("strong",[t._v("是去维护一个可变长度的滑动窗口")]),t._v("。无论是使用"),n("strong",[t._v("双指针")]),t._v(",还是使用"),n("strong",[t._v("双端队列")]),t._v(",又或者用"),n("strong",[t._v("游标")]),t._v("等其他奇技淫巧,目的都是一样的。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("Now,我们通过一道题目来进行具体学习吧")]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第3题:无重复字符的最长子串")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入: "abcabcbb"\n输出: 3 \n解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入: "bbbbb"\n输出: 1\n解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[n("strong",[t._v("示例 3:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('输入: "pwwkew"\n输出: 3\n解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。\n')])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("br"),t._v(" "),n("p",[t._v('请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。')]),t._v(" "),n("h2",{attrs:{id:"_03、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题解分析"}},[t._v("#")]),t._v(" 03、题解分析")]),t._v(" "),n("p",[t._v("直接分析题目,假设我们的输入为“abcabcbb”,我们只需要维护一个窗口在输入字符串中进行移动。如下图:")]),t._v(" "),n("img",{attrs:{src:a(669),alt:"img"}}),t._v(" "),n("p",[t._v("当下一个元素在窗口没有出现过时,我们扩大窗口。")]),t._v(" "),n("img",{attrs:{src:a(670),alt:"img"}}),t._v(" "),n("p",[t._v("当下一个元素在窗口中出现过时,我们缩小窗口,将"),n("strong",[t._v("出现过的元素以及其左边的元素")]),t._v("统统移出:")]),t._v(" "),n("img",{attrs:{src:a(671),alt:"img"}}),t._v(" "),n("p",[t._v("在整个过程中,我们"),n("strong",[t._v("记录下窗口出现过的最大值")]),t._v("即可。而我们唯一要做的,只需要"),n("strong",[t._v("尽可能扩大窗口")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那我们代码中通过什么来维护这样的一个窗口呢?anyway~ 不管是队列,双指针,甚至通过map来做,都可以。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们演示一个"),n("strong",[t._v("双指针")]),t._v("的做法:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("lengthOfLongestSubstring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Set")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Character")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" set "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashSet")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//charAt:返回指定位置处的字符")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("set"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("contains")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n set"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n set"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("remove")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(672),alt:"img"}}),t._v(" "),n("p",[t._v("通过观察,我们能看出来。如果是最坏情况的话,我们每一个字符都可能会访问两次,left一次,right一次,时间复杂度达到了O(2N),这是不可饶恕的。不理解的话看下图:")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("假设我们的字符串为“abcdc”,对于abc我们都访问了2次。")]),t._v(" "),n("img",{attrs:{src:a(673),alt:"img"}}),t._v(" "),n("p",[t._v("那如何来进一步优化呢?")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("其实我们可以定义"),n("strong",[t._v("字符到索引的映射")]),t._v(",而不是简单通过一个集合来判断字符是否存在。这样的话,当我们"),n("strong",[t._v("找到重复的字符时,我们可以立即跳过该窗口")]),t._v(",而不需要对之前的元素进行再次访问。")]),t._v(" "),n("img",{attrs:{src:a(674),alt:"img"}}),t._v(" "),n("p",[t._v("优化代码如下:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("lengthOfLongestSubstring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Character")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" map "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HashMap")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("map"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("containsKey")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("map"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n map"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("put")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(675),alt:"img"}}),t._v(" "),n("p",[t._v("修改之后,我们发现虽然时间复杂度有了一定提高,但是还是比较慢!如何更进一步的优化呢?我们可以使用一个256位的数组来替代hashmap,以进行优化。(因为ASCII码表里的"),n("strong",[t._v("字符")]),t._v("总共有128个。ASCII码的长度是一个字节,8位,理论上可以表示256个字符,但是许多时候只谈128个。具体原因可以下去自行学习~)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("进一步优化代码:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("lengthOfLongestSubstring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" charIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("256")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("char")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("charIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n charIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(676),alt:"img"}}),t._v(" "),n("p",[t._v("我们发现优化后时间复杂度有了极大的改善!这里简单说一下原因,对于数组和hashmap访问时,两个谁快谁慢不是一定的,需要思考hashmap的底层实现,以及数据量大小。但是在这里,因为已知了待访问数据的下标,可以"),n("strong",[t._v("直接寻址")]),t._v(",所以极大的缩短了查询时间。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_04、总结"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、总结"}},[t._v("#")]),t._v(" 04、总结")]),t._v(" "),n("p",[t._v("本题基本就到这里。最后要说的,一般建议如果要分析一道题,我们要压缩压缩再压缩,抽茧剥丝一样走到最后,尽可能的完成对题目的优化。不一定非要自己想到最优解,但绝对不要局限于单纯的完成题目,那样将毫无意义!")])])}),[],!1,null,null,null);s.default=r.exports},669:function(t,s){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAVcAAAB8CAMAAADq8wNrAAAAolBMVEX////8/Pzw8PD5+fnu7u7o6Ojo38PfyYbYu2LWtlaqqqpPT08UFBQAAADn05jdwGzv25/77MD/8sxnZ2crKyudnZ3m5ublzIFYWFilnop5eXlLRTIkJCQTEg0KCgrY2NgvLy+CgoLEup1HR0fs7OzExMSCe2gvLSbYza329vaZmZmknIOkpKTs4L1HQzn26cVnYlLZzq7Z2dl1dXXi4uK6urrParC6AAAEb0lEQVR42u2ca3eiMBCGo3V7T1VQ272qBby01L11//9f2wMWWxHIeEh0HN584niekwyPySQRolKq1VJZaWcX758VXYEzctzikcKpVuvsrJWVTnbx/lnRFTgjB6+OvDIbP1I4bvFI4bjFI4XjFo8Ujls8Ujhu8UjhuMUjheMWjxSOWzxSONVudzrtrHxqt88vLq+qyuXFecpd39zqqnJ7c91Ibl06ed933V7fqyr9XvdOtZU/GI5UVRkNB34DuU1/3fZ6d++Zy/1d239Q5vLgN44r8XreJWj1vO7nAaEZpQZfGsZdl3i96JG89r4OSe0MvzWMuynxetknee1/H5HaGf1oGHdb4vWKpNXzNKkZpRrLwasbDl7dcLnnW/Bakyt5vgWv1rwiD7jgkF/dcPDqhrPjdTyZHuX+bLdLrc/MwSu8wiu8mrw+Jj+FPxK8jidaB6H5/sJA68nYyEVJuxHh/qy2S63PzBn2W48zz/Nm84XRa9JGGOw0VOBrqtTyaWngoqQ/TAke7LZLra+c22e/tZg/G72mCnaHR/7+wsDP31qxh3WtsdGr3Xap9ZVze+y3FnM9o+XXpZ+PfqcfFoztMq/jiZ4aONvtUuszc4b8+rJKnzWSveYHRv7+CoZ2IZdkQ63pXi21S63PzFV7/flLzxfey+rQXpd+MseEgVSvi/ks7bREr7tZLH9/8T7jkezVcrvm+sycyetzutYye02/uEjnJ5r8/ZUt/Hbqi7M53MDZbpdWn5kz5YHVC23e0v5SjSe+af2kYtJ6Jx1gpHnLbrvU+swcYd5a/abkgbhomimY55P1tHlfkMxbwR9KHrDaLrU+M4ffCd1weL5ll8PzLddekQdccMivbjh4dcPBqxsO7xNa5creJ8T7r/W4svdf8b52Pa7sfW2cL6jJlXnFeZia3MYrzm8d5PxW5pv7eT7uHLd4pHDc4pHCcYtHCsctHikct3ikcNzikcJxi0cKh//Rc/Q/eszikcJxGz9SOG7xSOG4xSOF4xaPFI5bPFI4bvFI4bjFI4XjFo8UDvsCR/uCrc81tRw9bu7cdj/WhHdmthj245FHft31GgZFZxPgtbbXv/m38uG1lte3I3+bsjkCBq81vW4dJYvg1aLXOEkC6WkqeLXkVamp1n746vthuD5vD682vMbrY19ZP30/swivJK/b+4IPzrYnrlx/Pfq6mztX5TVJsFl3hdc9vZbm18Rr9NZb4wj5dc88UOU1Wu8JoskYXi16fXoIkz9GSRZb8GrRa6TUaxikUxa8WvT6z08P2UfIr9b7a1bg1aLXivXr0ePmzqG/HtprWYFXktet81tkr5tzSp2qqw/nmZrGob866q/wCq8nxGGddXivH55wx/AKrxw4eIXXU+KqnsNUeD36cw7uHLw68oo84CYPwCu8nhAHr/B6Shy8Ht4rfndx4xX9tYZX7Avc7AtwfsuNV2bjRwrHLR4pHLd4pHDc4pHCcYtHCsctHikct3ikcNzikcLh/zIc7QuYxSOF+w+ayUq4zfeUvAAAAABJRU5ErkJggg=="},670:function(t,s){t.exports="data:image/jpeg;base64,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"},671:function(t,s){t.exports="data:image/jpeg;base64,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"},672:function(t,s){t.exports="data:image/jpeg;base64,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"},673:function(t,s){t.exports="data:image/jpeg;base64,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"},674:function(t,s,a){t.exports=a.p+"assets/img/6.cc528cb2.jpg"},675:function(t,s,a){t.exports=a.p+"assets/img/7.0e0f6f14.jpg"},676:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/25.643fe370.js b/learning/.vuepress/dist/assets/js/25.643fe370.js deleted file mode 100644 index b7d7acb4..00000000 --- a/learning/.vuepress/dist/assets/js/25.643fe370.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{1111:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享一道关于"),n("strong",[t._v("螺旋矩阵")]),t._v("的问题。话不多说,直接看题目吧。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第54题:螺旋矩阵")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:\n[\n [ 1, 2, 3 ],\n [ 4, 5, 6 ],\n [ 7, 8, 9 ]\n]\n输出: [1,2,3,6,9,8,7,4,5]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:\n[\n [1, 2, 3, 4],\n [5, 6, 7, 8],\n [9,10,11,12]\n]\n输出: [1,2,3,4,8,12,11,10,9,5,6,7]\n\n\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("p",[t._v("本题的思路,在于"),n("strong",[t._v("模拟螺旋的移动轨迹")]),t._v("。")]),t._v(" "),n("p",[t._v("问题的难点,在于"),n("strong",[t._v("想明白模拟过程中会遇到什么问题")]),t._v("。")]),t._v(" "),n("p",[t._v("那模拟的过程中会遇到什么样的问题?"),n("strong",[t._v("边界处理")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("因为只有我们能找到边界(边界包括:1、数组的边界 2、已经访问过的元素),才可以通过“"),n("strong",[t._v("右,下,左,上")]),t._v("”的方向来进行移动。同时,每一次"),n("strong",[t._v("碰壁")]),t._v(",就可以调整到下一个方向。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("思路明确了,我们看一下整个过程。假如我们的数组为:")]),t._v(" "),n("p",[t._v("[")]),t._v(" "),n("p",[t._v("[1, 2, 3, 4],")]),t._v(" "),n("p",[t._v("[5, 6, 7, 8],")]),t._v(" "),n("p",[t._v("[9,10,11,12]")]),t._v(" "),n("p",[t._v("]")]),t._v(" "),n("p",[t._v("数组如下图所示:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(770),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们首先对其设置好四个边界:")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("up := 0\ndown := len(matrix) - 1\nleft := 0\nright := len(matrix[0]) - 1\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br")])]),n("p",[t._v("如下图所示:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(771),alt:"PNG"}}),t._v(" "),n("p",[t._v("同时,我们定义x和y,来代表行和列。")]),t._v(" "),n("p",[t._v("如x=2,y=1,则 arr[2][1]=10(第3行第2列)")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(772),alt:"PNG"}}),t._v(" "),n("p",[t._v("然后我们从第一个元素开始行军(y=left),完成第一行的遍历,直到碰壁。(y<=right)")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(773),alt:"PNG"}}),t._v(" "),n("p",[t._v("下面关键的一步来了,"),n("strong",[t._v("因为第一行已经走过了,我们将上界下调")]),t._v("**(up++)**,同时转弯向下走。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(774),alt:"PNG"}}),t._v(" "),n("p",[t._v("直到碰到底部时(x<=down),我们将"),n("strong",[t._v("右界左调(right--)")]),t._v(",转弯向左走。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(775),alt:"PNG"}}),t._v(" "),n("p",[t._v("后面向左和向上,分别完成"),n("strong",[t._v("下界上调(down--)"),n("strong",[t._v("和")]),t._v("左界右调(left++)")]),t._v("。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(776),alt:"PNG"}}),t._v(" "),n("p",[t._v("最后,对剩下的矩阵重复整个过程,直到上下、左右的壁与壁碰在一起**(up <= down && left <= right,这是避免碰壁的条件)**。")]),t._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),n("p",[t._v("所以这道题很简单,只要会碰壁,就可以顺利得到代码(很漂亮,不是吗?),代码如下:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("spiralOrder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tleft"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" down "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" up "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" down "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("avoid")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" down"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" y"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\ty"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n\t\tup"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" down "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("avoid")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" down"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\tx"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n\t\tright"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("avoid")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" down"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" y"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\ty"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n\t\tdown"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" down"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" up "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("avoid")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" down"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("y"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\tx"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n\t\tleft"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("avoid")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" up"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" down "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" up "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" down "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" right\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"150%"},attrs:{src:a(777),alt:"PNG"}})])}),[],!1,null,null,null);s.default=r.exports},770:function(t,s,a){t.exports=a.p+"assets/img/1.58ab1a31.png"},771:function(t,s,a){t.exports=a.p+"assets/img/2.cb821808.png"},772:function(t,s,a){t.exports=a.p+"assets/img/3.b6b0c2c7.png"},773:function(t,s,a){t.exports=a.p+"assets/img/4.6650b341.jpeg"},774:function(t,s,a){t.exports=a.p+"assets/img/5.d8077a39.png"},775:function(t,s,a){t.exports=a.p+"assets/img/6.73d7c7f6.jpg"},776:function(t,s,a){t.exports=a.p+"assets/img/7.abae2919.jpg"},777:function(t,s){t.exports="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/26.39de823a.js b/learning/.vuepress/dist/assets/js/26.39de823a.js deleted file mode 100644 index 34fd6056..00000000 --- a/learning/.vuepress/dist/assets/js/26.39de823a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{1137:function(s,t,n){"use strict";n.r(t);var a=n(3),r=Object(a.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(927),alt:"PNG"}}),s._v(" "),a("blockquote",[a("p",[s._v("数独相信在座的各位都玩过,那我们如何使用程序去验证一个 9×9 的数独是有效的呢?一起看下!")])]),s._v(" "),a("h2",{attrs:{id:"_01、题目示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),a("blockquote",[a("p",[s._v("数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据 9×9 盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。")])]),s._v(" "),a("br"),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("题目:有效的数独")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。")])])])]),s._v(" "),a("br"),s._v(" "),a("ul",[a("li",[s._v("数字 1-9 在每一行只能出现一次。")]),s._v(" "),a("li",[s._v("数字 1-9 在每一列只能出现一次。")]),s._v(" "),a("li",[s._v("数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。")])]),s._v(" "),a("br"),s._v(" "),a("p",[a("strong",[s._v("示例:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v('输入:\n[\n\n ["5","3",".",".","7",".",".",".","."],\n\n ["6",".",".","1","9","5",".",".","."],\n\n [".","9","8",".",".",".",".","6","."],\n\n ["8",".",".",".","6",".",".",".","3"],\n\n ["4",".",".","8",".","3",".",".","1"],\n\n ["7",".",".",".","2",".",".",".","6"],\n\n [".","6",".",".",".",".","2","8","."],\n\n [".",".",".","4","1","9",".",".","5"],\n\n [".",".",".",".","8",".",".","7","9"]\n\n]\n\n输出: true\n\n解释:\n\n数独部分空格内已填入了数字,空白格用 \'.\' 表示。\n\n')])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br")])]),a("p",[a("strong",[s._v("说明:")])]),s._v(" "),a("p",[a("strong",[s._v("一个有效的数独(部分已被填充)不一定是可解的。")])]),s._v(" "),a("p",[s._v("只需要根据以上规则,验证已经填入的数字是否有效即可。")]),s._v(" "),a("p",[s._v("给定数独序列只包含数字 1-9 和字符 '.' 。")]),s._v(" "),a("p",[s._v("给定数独永远是 9x9 形式的。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("画出来就是下面这样:")]),s._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(928),alt:"PNG"}}),s._v(" "),a("h2",{attrs:{id:"_02、题解分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),a("blockquote",[a("p",[s._v("聊聊数独,很早之前其实研究过一阵子,还是非常有趣的。解法有很多,包括什么余数法,摒除法等等。那我们如何去评定一个数独的难度呢?一般情况下,给定的数字个数越多,数独相对越简单。")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("解题的关键题目中其实已经说了:")]),s._v(" "),a("br"),s._v(" "),a("ul",[a("li",[s._v("数字 1-9 在每一行只能出现一次。")]),s._v(" "),a("li",[s._v("数字 1-9 在每一列只能出现一次。")]),s._v(" "),a("li",[s._v("数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("我们要做的就是"),a("strong",[s._v("用程序来完成这个验证的过程")]),s._v(",如何验证?那其实就两步:")]),s._v(" "),a("br"),s._v(" "),a("ul",[a("li",[s._v("第一步:遍历数独中的每一个元素")]),s._v(" "),a("li",[s._v("第二步:验证该元素是否满足上述条件")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("遍历这个没什么好说的,"),a("strong",[s._v("从左到右,从上到下进行遍历即可")]),s._v("。就一个两层循环。因为题目本身就是常数级的规模,所以时间复杂度就是 O(1)。")]),s._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(929),alt:"PNG"}}),s._v(" "),a("p",[s._v("问题来了:如何验证元素在 行 / 列 / 子数独中没有重复项?")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("其实很简单,我们建立三个数组分别记录每行,每列,每个子数独(子数独就是上面各种颜色的小框框)中出现的数字。")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" rows "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" col "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sbox "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("当然,刚开始的时候他们都是空的。然后"),a("strong",[s._v("每遍历到一个元素,我们就看看这个元素在里边存不存在,不存在就放进去,存在那说明数独不合法")]),s._v("。")]),s._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(930),alt:"PNG"}}),s._v(" "),a("p",[s._v("举个栗子,比如这个数独。第6行5列为2,那我们就对 rows 和 col 进行设置:(1表示元素存在)")]),s._v(" "),a("br"),s._v(" "),a("blockquote",[a("center",[s._v("rows[当前行][当前元素值] = rows[5][2] = 1")]),s._v(" "),a("center",[s._v("col[当前列][当前元素值] = col[4][2] = 1")])],1),s._v(" "),a("br"),s._v(" "),a("p",[s._v("但是这里有个问题,如果元素值是 9,那就越界了!所以我们对当前元素值减个一处理一下:")]),s._v(" "),a("blockquote",[a("center",[s._v("rows[当前行][当前元素值] = rows[5][2-1] = 1")]),s._v(" "),a("center",[s._v("col[当前列][当前元素值] = col[4][2-1] = 1")])],1),s._v(" "),a("br"),s._v(" "),a("p",[s._v("现在的题是,对于 sbox 该如何设置呢?我们用下面的公式来计算得到:")]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("boxIndex = (row / 3) * 3 + columns / 3\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("其实很容易理解:我们把上面的第6行5列代入到这个公式里,(5 / 3) * 3 + 4 / 3 = 3 + 1 = 4。这个 4 也就代表最终落到 4 的这个小区域中。")]),s._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(931),alt:"PNG"}}),s._v(" "),a("p",[s._v("我猜有人不能理解这个算式(是的,连公式都称不上),所以我再解释一下它是怎么来的。比如上面的第 6 行,row 为 5,5/3=1 可以理解为 "),a("strong",[s._v("此时在第1大行上")]),s._v(",然后 (5/3)*3,是计算出当前第一大行处的 boxIndex 值。最后再加上的 4/3,意思是向右偏移几个大列。")]),s._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(932),alt:"PNG"}}),s._v(" "),a("p",[s._v("根据分析,给出代码:")]),s._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("isValidSudoku")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" board"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" rows "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" col "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sbox "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" board"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" board"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("board"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'.'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" board"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'1'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" boxIndex "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("rows"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n rows"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("col"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n col"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sbox"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("boxIndex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n sbox"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("boxIndex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br")])]),a("p",[s._v("执行结果:")]),s._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(933),alt:"PNG"}}),s._v(" "),a("h2",{attrs:{id:"_03、总结"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、总结"}},[s._v("#")]),s._v(" 03、总结")]),s._v(" "),a("p",[s._v("最后,我在这里分享给大家一个很难很难的数独,欢迎大家来挑战!!挑战成功的,评论区留下你的答案!")]),s._v(" "),a("img",{attrs:{src:n(934),alt:"PNG"}}),s._v(" "),a("p",[s._v("好了,今天的题目就讲完了,我觉得讲的还是挺好的。大家要是认为ok的话,给我来个转发吧~感谢!")])])}),[],!1,null,null,null);t.default=r.exports},927:function(s,t,n){s.exports=n.p+"assets/img/1.2c7f8b37.gif"},928:function(s,t,n){s.exports=n.p+"assets/img/2.a554b385.jpg"},929:function(s,t,n){s.exports=n.p+"assets/img/3.cd940b06.jpg"},930:function(s,t,n){s.exports=n.p+"assets/img/4.319ecb17.jpg"},931:function(s,t,n){s.exports=n.p+"assets/img/5.96253984.jpg"},932:function(s,t,n){s.exports=n.p+"assets/img/6.b657cbf9.jpg"},933:function(s,t){s.exports="data:image/jpeg;base64,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"},934:function(s,t){s.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/27.66093a0e.js b/learning/.vuepress/dist/assets/js/27.66093a0e.js deleted file mode 100644 index 07a75835..00000000 --- a/learning/.vuepress/dist/assets/js/27.66093a0e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{1073:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天是小浩算法 “365刷题计划” 第103天。分享的这道题虽然很简单,但是在笔试或者面试当中,出现的频率却非常高。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("经典常考类算法题目。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第796题:旋转字符串")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定两个字符串, A 和 B。A 的旋转操作就是将 A 最左边的字符移动到最右边。例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: A = 'abcde', B = 'cdeab'\n输出: true\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: A = 'abcde', B = 'abced'\n输出: false\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("**注意:**A 和 B 长度不超过 100。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("题意还是很容易理解的,说白了就是每次把前面的元素放到最后面:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(559),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("这道题目看起来简单,但其实很容易出错。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("这道题目最容易想到的解法,其实就是跟着题意来。每次将旋转后的A和目标串对比:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(560),alt:"PNG"}}),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rotateString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("equals")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("equals")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" first "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("substring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" last "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("substring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" last "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" first"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("equals")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("p",[s._v("但是代码其实并不优雅,我们继续观察一下这个字符串:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(561),alt:"PNG"}}),s._v(" "),n("p",[s._v("无论它怎样旋转,最终的 A + A包含了所有可以通过旋转操作从 A 得到的字符串:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(562),alt:"PNG"}}),s._v(" "),n("p",[s._v("那我们是不是只需要判断 B 是否为 A + A 的子串就可以了:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rotateString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("contains")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(563),alt:"PNG"}}),s._v(" "),n("p",[s._v("一般面试写的话,基本就是到这个程度。但是大概率面试官这时还会问你一个问题:如何继续进行优化?")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(564),alt:"PNG"}}),s._v(" "),n("p",[s._v("注意我们上面问题,其实已经转化为了:"),n("strong",[s._v("判断 B 是否为 A + A 的子串")]),s._v("。那我们就可以引申答出 KMP,SUNDAY,BF 等字符串匹配策略。(当然,这里其实 SUNDAY 并不是特别适合)")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("然后就是用相应的匹配策略,来实现转化后的问题。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("这里附上一份 KMP 解题代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rotateString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("N")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("N")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("N")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//Compute shift table")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" shifts "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("N")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("fill")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("shifts"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("N")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" shifts"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n shifts"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//Find match of B in A+A")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" matchLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("A")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toCharArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("matchLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("B")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("matchLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n matchLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" shifts"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("matchLen"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("matchLen "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("N")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br")])]),n("p",[s._v("这个有兴趣可以看看,代码是 leetcode 官方的。")]),s._v(" "),n("br"),s._v(" "),n("h2",{attrs:{id:"_03、算法小知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、算法小知识"}},[s._v("#")]),s._v(" 03、算法小知识")]),s._v(" "),n("blockquote",[n("p",[s._v("KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。")])]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(565),alt:"PNG"}}),s._v(" "),n("p",[s._v("大家有兴趣可以看我之前写的一篇KMP教程:")]),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.3.字符串系列/1.3.字符串系列/306.html"}},[s._v("KMP(上篇)")])],1)])}),[],!1,null,null,null);t.default=e.exports},559:function(s,t){s.exports="data:image/jpeg;base64,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"},560:function(s,t,a){s.exports=a.p+"assets/img/2.a079fe2e.jpg"},561:function(s,t,a){s.exports=a.p+"assets/img/3.7af03277.jpg"},562:function(s,t,a){s.exports=a.p+"assets/img/4.8b0cf254.jpg"},563:function(s,t){s.exports="data:image/jpeg;base64,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"},564:function(s,t,a){s.exports=a.p+"assets/img/6.791fc1f7.gif"},565:function(s,t,a){s.exports=a.p+"assets/img/7.f1547150.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/28.6437e3e0.js b/learning/.vuepress/dist/assets/js/28.6437e3e0.js deleted file mode 100644 index 92773d1a..00000000 --- a/learning/.vuepress/dist/assets/js/28.6437e3e0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{1082:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("在之前的系列中。我们学习了DFS、BFS,也熟悉了平衡二叉树,满二叉树,完全二叉树,BST(二叉搜索树)等概念。在本节中,我们将学习一种二叉树中常用的操作 —"),n("strong",[t._v("剪枝")]),t._v("。这里额外说一点,就本人而言,对这个操作以及其衍化形式的使用会比较频繁。因为我是做规则引擎的,在规则引擎中,我们会有一个概念叫做"),n("strong",[t._v("决策树")]),t._v(",那"),n("strong",[t._v("如果一颗决策树完全生长,就会带来比较大的过拟合问题")]),t._v("。因为完全生长的决策树,每个节点只会包含一个样本。所以我们就"),n("strong",[t._v("需要对决策树进行剪枝操作,来提升整个决策模型的泛化能力")]),t._v("(ML概念)... 听不懂也没关系,简单点讲,就是我觉得这个很重要,或者每道算法题都很重要。如果你在工作中没有用到,不是说明算法不重要,而可能是你还不够重要。")])]),t._v(" "),n("h2",{attrs:{id:"_01、剪枝概述"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、剪枝概述"}},[t._v("#")]),t._v(" 01、剪枝概述")]),t._v(" "),n("p",[t._v("假设有一棵树,最上层的是root节点,而"),n("strong",[t._v("父节点会依赖子节点")]),t._v("。如果现在有一些节点已经标记为无效,我们要删除这些无效节点。"),n("strong",[t._v("如果无效节点的依赖的节点还有效,那么不应该删除")]),t._v(",如果无效节点和它的子节点都无效,则可以删除。剪掉这些节点的过程,称为剪枝,目的是"),n("strong",[t._v("用来处理二叉树模型中的依赖问题")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们还是通过一道题目来进行具体学习。")]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第814题:二叉树的剪枝")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身,以及所有 X 的后代。)")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1,null,0,0,1]\n输出: [1,null,0,null,1]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(648),alt:"img"}}),t._v(" "),n("p",[t._v("**解释: **")]),t._v(" "),n("ul",[n("li",[t._v("只有红色节点满足条件“所有不包含 1 的子树”。")]),t._v(" "),n("li",[t._v("右图为返回的答案。")])]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1,0,1,0,0,0,1]\n输出: [1,null,1,null,1]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(649),alt:"img"}}),t._v(" "),n("p",[n("strong",[t._v("示例3:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1,1,0,1,1,0,1,0]\n输出: [1,1,0,1,1,null,1]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(650),alt:"img"}}),t._v(" "),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("ul",[n("li",[t._v("给定的二叉树最多有 100 个节点。")]),t._v(" "),n("li",[t._v("每个节点的值只会为 0 或 1 。")])]),t._v(" "),n("h2",{attrs:{id:"_03、递归求解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、递归求解"}},[t._v("#")]),t._v(" 03、递归求解")]),t._v(" "),n("p",[t._v("二叉树的问题,大多都可以通过递归进行求解。我们直接进行分析。假设我们有二叉树如下:[0,1,0,1,0,0,0,0,1,1,0,1,0]")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("就是下面这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(651),alt:"img"}}),t._v(" "),n("p",[t._v("剪枝之后是这样:")]),t._v(" "),n("img",{attrs:{src:a(652),alt:"img"}}),t._v(" "),n("p",[t._v("剪什么大家应该都能理解。那关键是怎么剪?过程也很简单,"),n("strong",[t._v("在递归的过程中,如果当前结点的左右节点皆为空,且当前结点为0,我们就将当前节点剪掉即可。")])]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(653),alt:"img"}}),t._v(" "),n("p",[t._v("根据分析,很自然得出代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("pruneTree")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" node "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\tnode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" node\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(654),alt:"img"}}),t._v(" "),n("br"),t._v(" "),n("blockquote",[n("p",[t._v("我一度认为算法题的意义绝不简简单单只是为了面试,一度想把这种观念传递给认识我的朋友们。至少在工作中,对于栈,优先队列,红黑树,图等知识或多或少都是有机会能用到。不记得是不是李开复说的了,"),n("strong",[t._v("算法是提高智商少数为之可行的手段")]),t._v("。真心希望大家可以在这个过程中为之成长,我们大家一起努力啊。")])])])}),[],!1,null,null,null);s.default=e.exports},648:function(t,s,a){t.exports=a.p+"assets/img/1.1ad4dbe0.jpg"},649:function(t,s,a){t.exports=a.p+"assets/img/2.aff43165.jpg"},650:function(t,s,a){t.exports=a.p+"assets/img/3.83332a28.jpg"},651:function(t,s,a){t.exports=a.p+"assets/img/4.1a533a6e.jpg"},652:function(t,s,a){t.exports=a.p+"assets/img/5.9f7794ab.jpg"},653:function(t,s,a){t.exports=a.p+"assets/img/6.b0b8a3f6.jpg"},654:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/29.fc8a7331.js b/learning/.vuepress/dist/assets/js/29.fc8a7331.js deleted file mode 100644 index d4258241..00000000 --- a/learning/.vuepress/dist/assets/js/29.fc8a7331.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{1097:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("在本系列中,将为大家讲解"),n("strong",[t._v("排序算法")]),t._v("相关内容。同时,由于网上排序相关的教程太多了,我会尽可能的讲解一些不一样的内容。而不是按照 排序讲解 标准Titile,什么“十大排序算法”,“经典排序算法”,“排序算法必知必会” 之类的一个一个来进行讲解。所以,如果内容引起不适,概不负责...")])]),t._v(" "),n("h2",{attrs:{id:"_01、排序的重要性"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、排序的重要性"}},[t._v("#")]),t._v(" 01、排序的重要性")]),t._v(" "),n("p",[t._v("在leetcode中,直接搜索"),n("strong",[t._v("排序标签")]),t._v("出现的题目有80余道,这是与排序直接相关的题目,不包括其他一些用到排序思想的题目。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(704),alt:"PNG"}}),t._v(" "),n("p",[t._v("同时,各个公司在面试的过程中,或多或少都直接或间接问到过排序相关的内容(毕竟面试官不知道问什么时,都会用排序算法来救救场。不要问我是怎么知道的...),尤其是 "),n("strong",[t._v("快排、堆排序、全排列")]),t._v(" 等 Topic,在面试中屡试不爽。")]),t._v(" "),n("br"),t._v(" "),n("center",[n("b",[t._v(" 百度:堆排序 ")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(705),alt:"PNG"}}),t._v(" "),n("center",[n("b",[t._v(" 滴滴:全排列 ")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(706),alt:"PNG"}}),t._v(" "),n("p",[t._v("综上,得出结论**:为了offer~排序很重要,我们需要进行掌握。**")]),t._v(" "),n("h2",{attrs:{id:"_02、从-插入排序-说起"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、从-插入排序-说起"}},[t._v("#")]),t._v(" 02、从“插入排序”说起")]),t._v(" "),n("p",[t._v("为什么要先讲"),n("strong",[t._v("插入排序")]),t._v("的原因,是因为我觉得插入排序是最容易理解的一个,而且插入这个词有一定的神秘感(好吧,反正我不觉得冒泡最容易理解,谁没事一天去观察吐泡泡?)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("插入排序:就是炸金花的时候,你"),n("strong",[t._v("接一个同花顺")]),t._v("的过程。(标准定义:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(707),alt:"PNG"}}),t._v(" "),n("p",[t._v("代码示例:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("insert_sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("insert_sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n fmt"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("输入:")]),t._v(" "),n("img",{attrs:{src:a(708),alt:"PNG"}}),t._v(" "),n("p",[t._v("讲解完了插入排序,我们根据其思想,完成下面这道题目吧")]),t._v(" "),n("h2",{attrs:{id:"_03、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目分析"}},[t._v("#")]),t._v(" 03、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第905题:按奇偶排序数组")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:[3,1,2,4]\n输出:[2,4,3,1]\n输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("br"),t._v(" "),n("p",[n("strong",[t._v("提示:")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v("1 <= A.length <= 5000\n0 <= A[i] <= 5000\n")])])]),n("h2",{attrs:{id:"_04、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、题目图解"}},[t._v("#")]),t._v(" 04、题目图解")]),t._v(" "),n("p",[t._v("这道题,按照插入排序的思想,很容易可以想到题解。我们只需要遍历数组,当我们"),n("strong",[t._v("遇到偶数时")]),t._v(",**将其插入到数组前最近的一个为奇数的位置,**"),n("strong",[t._v("与该位置的奇数元素交换")]),t._v("。为了达成该目的,我们引入一个指针 j,来维持这样一个奇数的位置。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("假设我们的数组为:[3,1,2,4]")]),t._v(" "),n("img",{attrs:{src:a(709),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据以上分析,得到代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sortArrayByParity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tj "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" A "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" A"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tA"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" A"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" A"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" A"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\tj"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" A\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(710),alt:"PNG"}})],1)}),[],!1,null,null,null);s.default=r.exports},704:function(t,s,a){t.exports=a.p+"assets/img/1.057d45eb.jpg"},705:function(t,s,a){t.exports=a.p+"assets/img/2.b43303bc.jpg"},706:function(t,s,a){t.exports=a.p+"assets/img/3.f59824c9.jpg"},707:function(t,s,a){t.exports=a.p+"assets/img/4.e93db3df.gif"},708:function(t,s){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAd0AAABOCAMAAABSZjwFAAAAbFBMVEUnKCKCrszMzMzMv5thKCInKH+szMyshCLBml4nhKzMrn9hmsEnY5vBzMzMzMGcYyInKF6cv8yszMGsrsGcv8GsmpvBzMGCrsHMzKyCKCKsrqyszKzBzKxhhKzMv6ysv8yshF6crszBv5vBrn+vtzurAAADDUlEQVR42u2dW5OaQBBGGVwv42DETWI0u7n///+Y4iJ0N2Dtg6k07Dkv64hatXUcGaa/arIMAAAAAP4dIc9XTw/6rPUmz7f/+x8CQdi1D2K+759NeS5FFQf9HajGSmP4cKz/lifseuJmd/38UdrdDV/YHy4/HbPY+qzfu/l8xq5HbnbDPt23Kw/XRnuPX44Fdl3S2o2X63271pu0m2XY9Uljt7KSzHlXztU4WHsFNcauTxq7lVnz01ue9DhermKU1Ai7TqntlqdqjZyLhdLIifZZHE36pdh1SndFZG0WBy0qiZ9iKxe7Thm1W81lKTDm6rxb7VrIJ1I38bHri7B7wId0YNcX2F0y7DMDAAAAAMD7hSuiJXOrANoaQnGwW49iTPJmJvR7VarEV56+Srsvqt5H8mYu9HaLV6Ewrb5N281I3syE8QpgcT7Gt9ulAuiV1u56o867YZdFc941JV2SN3Ogn7tiNlZmo1lKR6WX5M0sEBXA/mGogzh6WUzyZoaIVdVZGYt3QpAkb2ZCY3fkxCrtRh2AJXkzF8hmLBnsLhn2mQEAAAAA4P3CFdGSuXVW0DuRwdYQsiDHydYYSN74pN1nfrlOFfUa4vcf0q7e4CJ545XJGpGq+K03P0/TdkneeOVtFcCwL+/YpQLolc6u6oJSJWCFp+L1qu2aljjYdUpnN5ilc3na9Q+3A2+6JQ52fdL1mrvY2GOfkazC6bm9ckrY9U9rdyhXR1oH3nRLHOz6pLHbzM5uNtb9q+wv8TaTh+XVMckbr5DNWDLYXTLsMwMAAAAAwPuFK6Ilc9vNKA6qKqCb2ti7TZmWOPU+Zv12djN80dpNq1+yvGua2mT6blO2JU7x+6l7HrueaKsIf7S9YY1IV/x0SxzseqWv3t+3q7yZljjY9cqkXZXVMHebMi1xqvNuUx/Gri+m7CZbzhet6MZa4jSvx64vJuwO+p7IBOxYS5ymUx12fTFudyhX3W1q2BKnDdFh1xd9zxuRvLFNbeIgM6fsVsmb5kuCXV+QzVgy2F0y7DMDAAA8nr+uwSW2rXcY9wAAAABJRU5ErkJggg=="},709:function(t,s,a){t.exports=a.p+"assets/img/6.9b45e80f.jpg"},710:function(t,s,a){t.exports=a.p+"assets/img/7.dd25f1d8.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/3.405cb1d3.js b/learning/.vuepress/dist/assets/js/3.405cb1d3.js deleted file mode 100644 index bdf4193d..00000000 --- a/learning/.vuepress/dist/assets/js/3.405cb1d3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{1074:function(t,s,n){"use strict";n.r(s);var a=n(3),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("blockquote",[a("p",[t._v("今天打算为大家讲解一下KMP。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("KMP 其实已经念念叨叨挺长时间了,一直没写的原因是我觉得自己可能写不好。"),a("strong",[t._v("与其误人子弟,宁可错失良机")]),t._v("。毕竟自己懂是一码事,能讲清楚是另一码事。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("所以为了写好这篇文章,我又去参考了很多别的资料。嗯。。"),a("strong",[t._v("我发现网上讲解 KMP 的文章实在是太多了,但大多数看完后还是云里雾里(纵然我已经会了,读对方的文章还是懵逼)")]),t._v("。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("我希望我的这篇文章能达到的目的是:"),a("strong",[t._v("让小白也能学会KMP")]),t._v("。如果届时达到了目的,请帮我进行一次转发。否则,你只需要叉掉即可。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("话不多说,我们直接开始。")]),t._v(" "),a("h2",{attrs:{id:"_01、图解分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、图解分析"}},[t._v("#")]),t._v(" 01、图解分析")]),t._v(" "),a("blockquote",[a("p",[t._v("KMP 算法常被称为“看毛片算法”,由一个姓K的,一个姓M的,一个姓P 一起提出。"),a("strong",[t._v("是一种由暴力匹配改进的字符串匹配算法")]),t._v("。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("我看了下网上的 KMP 讲解基本都是由 "),a("strong",[t._v("next匹配表")]),t._v(" 开始讲起。但是说实话,如果是我第一次看这玩意,你给我讲 next匹配表,我肯定一脸懵逼。所以我打算换一种讲法。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("上面说了,"),a("strong",[t._v("KMP 是由暴力匹配改进的字符串匹配算法")]),t._v("。那什么是暴力匹配?假若我们的目标串和模式串如下图。(之前在 Sunday 匹配中讲过,"),a("strong",[t._v("所有的字符串匹配算法第一步都是对齐")]),t._v("。不管是 暴力匹配,KMP,Sunday,BM 都是一样)")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(566),alt:"PNG"}}),t._v(" "),a("p",[t._v("暴力匹配,就是目标串和模式串一个一个的对比。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(567),alt:"PNG"}}),t._v(" "),a("p",[t._v("当A匹配成功,继续开始比对,直到我们遇见一个不匹配的字符。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(568),alt:"PNG"}}),t._v(" "),a("p",[t._v("然后我们调整模式串,"),a("strong",[t._v("从目标串的下一个字符开始匹配(注意,这里是核心)")]),t._v("。很遗憾,还是没有匹配成功(A和B)")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(569),alt:"PNG"}}),t._v(" "),a("p",[t._v("继续这个步骤:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(570),alt:"PNG"}}),t._v(" "),a("p",[t._v("直到我们完成整个匹配过程:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(571),alt:"PNG"}}),t._v(" "),a("p",[t._v("假若我们目标串长度为m,模式串长度为n。模式串与目标串至少比较m次,又因其自身长度为n,所以理论的时间复杂度为**O(m*n)。**但我们可以看到,"),a("strong",[t._v("因为途中遇到不能匹配的字符时,就可以停止,并不需要完全对比(比如上图第2行)")]),t._v("。所以虽然理论时间复杂度为 "),a("strong",[t._v("O(m*n)")]),t._v(" ,但其实大部分情况效率高很多。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("暴力匹配又称为BF算法,暴风算法。代码比较简单:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//GO ")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("BFSearch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("haystack "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" needle "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("haystack"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n l2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("needle"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" haystack"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" needle"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" \n j"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-=")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" j\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br")])]),a("p",[t._v("接下来我们开始说KMP。假如还是上面的这个串。最开始其实还是一样,我们依次对比A-A,B-B,C-C,直到遇见第一个无法匹配的字符A-E。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(572),alt:"PNG"}}),t._v(" "),a("p",[t._v("现在开始不一样了,如果按照上面的暴力匹配。此时目标串我们应该回到 B 这个位置,模式串应直接回到头。但是按照 KMP 的思路,"),a("strong",[t._v("在我们在第一次匹配后,因为 BC 匹配成功了,所以我们知道了 BC 不等于 A(注意这个逻辑关系)")]),t._v(":")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(573),alt:"PNG"}}),t._v(" "),a("p",[t._v("那既然已知了 BC 不等于 A,我们就没必要用 A 和 BC 进行匹配了。那我们直接用 A 越过前面不需要匹配的 BC:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(574),alt:"PNG"}}),t._v(" "),a("p",[t._v("继续向下适配,我们发现在 D-C 处,匹配不上了。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(575),alt:"PNG"}}),t._v(" "),a("p",[t._v("那我们因为前面的 B 又匹配成功了,那我们就知道 B 不等于 A,所以我们又可以直接略过前面的 B:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(576),alt:"PNG"}}),t._v(" "),a("p",[t._v("也就是说,我们可以直接从 D 处开始比较:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(577),alt:"PNG"}}),t._v(" "),a("p",[t._v("继续向下比较:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(578),alt:"PNG"}}),t._v(" "),a("p",[t._v("到现在为止,你已经掌握了 KMP 的前百分之五十:"),a("strong",[t._v("在KMP中,如果模式串和目标串没有匹配成功,目标串不回溯")]),t._v("。现在我们需要换一个新串,来掌握接下来的百分之五十:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(579),alt:"PNG"}}),t._v(" "),a("p",[t._v("我们还是从头开始匹配,直到遇到第一个不匹配的字符:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(580),alt:"PNG"}}),t._v(" "),a("p",[t._v("到这里和上面的例子还是一样,"),a("strong",[t._v("因为我们的 BC 匹配成功了,所以我们知道 BC 不等于 A,所以我们可以跳过 BC(注意这个逻辑)")]),t._v(":")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(581),alt:"PNG"}}),t._v(" "),a("p",[t._v("所以我们从 A 处开始比较:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(582),alt:"PNG"}}),t._v(" "),a("p",[t._v("直到我们再次匹配失败:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(583),alt:"PNG"}}),t._v(" "),a("p",[t._v("我想到现在你已经知道怎么做了,来和我一起说。**因为前面的 B 匹配成功了,所以我们知道 B 不等于 A,所以我们可以跳过 B。**当然,跳过之后下一次的匹配直接失败了(A-D)。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(584),alt:"PNG"}}),t._v(" "),a("p",[t._v("重点来了!!!然后我们继续匹配下一位。我们发现这一次,我们的匹配基本就要匹配成功了,但是卡在了最后一步的比较(D-B)。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(585),alt:"PNG"}}),t._v(" "),a("p",[t._v("现在怎么办?假若我们把两个串修改一下(把里边的AB修改成XY),那么显而易见,你当然知道从哪里开始:")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(586),alt:"PNG"}}),t._v(" "),a("p",[t._v("但是现在的问题是,在模式串中 AB 重复出现了,那我们是不是可以在下次比较的时候直接把 AB 给让出来?")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(587),alt:"PNG"}}),t._v(" "),a("p",[t._v("所以我们把这个AB让出来,让出来之后,我们相当于在 模式串 上又跳过了 2个字符。(也就是说模式串下一次匹配从C开始)")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(588),alt:"PNG"}}),t._v(" "),a("p",[t._v("其实到这里 KMP 就基本完事了。我们可以稍微总结下:")]),t._v(" "),a("br"),t._v(" "),a("ul",[a("li",[a("p",[t._v("如果模式串和目标串匹配成功,长串短串都加一")])]),t._v(" "),a("li",[a("p",[t._v("如果模式串和目标串没有匹配成功:")])]),t._v(" "),a("li",[a("ul",[a("li",[t._v("目标串不回溯("),a("strong",[t._v("在上面的分割线之前,我都是给你讲这个")]),t._v(")")]),t._v(" "),a("li",[t._v("模式串回溯到匹配未成功的字符前的子串的相同的真前缀和真后缀的最大长度**(在上面的分割线之后,我重点是给你讲这个)**")])])])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("好了,我知道上面匹配成功后的第二种情况有点拗口。所以我又单独拎出来和你说。这句话是啥意思呢?")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("假若我们有个串 abbaab:")]),t._v(" "),a("ul",[a("li",[t._v("a, ab, abb, abba, abbaa,就是它的真前缀。")]),t._v(" "),a("li",[t._v("b, ab, aab, baab, bbaab, 就是它的真后缀。")]),t._v(" "),a("li",[t._v("“真”字,"),a("strong",[t._v("说白了就是不包含自己")]),t._v("。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("在我们上面的示例中,未成功的字符前的子串是 ABCEAB,它相同的最长的真前缀和真后缀就是 AB,最大长度就是2。所以我们就把模式串回溯到第2个位置处。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(589),alt:"PNG"}}),t._v(" "),a("p",[t._v("我猜有人要说话了,“不是说模式串是回溯到真前缀和真后缀的最大长度位置处吗?那为什么上面的第一个例子,是回到了起始位置呢?”")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(590),alt:"PNG"}}),t._v(" "),a("p",[t._v("其实,不是我们没有回溯模式串,而是此时的最大长度(指的是相同真前缀和真后缀的最大长度,后面都省略)其实就是 0。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("那我们怎么获取最大长度呢?就可以很自然的引入 next表 了。"),a("strong",[t._v("不管你是把next表 理解成描述最大长度的东东,还是把 next表 理解成用来回溯模式串的东东,其实都是可以的!!!这也是为什么你在网上看到很多人文章对next表理解不一致的原因。")])]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(591),alt:"PNG"}}),t._v(" "),a("p",[t._v("我们拿上面标黄色那个解释一下,ABCEAB 不包含自己,那就是 ABCEA,ABCEA的 真前缀 和 真后缀 为:")]),t._v(" "),a("br"),t._v(" "),a("ul",[a("li",[t._v("A,AB,ABC,ABCE")]),t._v(" "),a("li",[t._v("A,EA,CEA,BCEA")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("所以最大长度就是 1。那这个 1 干啥用呢?我们可以在下次比的时候就直接把这个 A 让过去,直接从 B 开始比。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(592),alt:"PNG"}}),t._v(" "),a("p",[t._v("这里注意,如果我们模式串稍微修改成下面这样,此时 F 的最大长度就是 0,并不是 2。初学者很容易把 AB 误认为是最长相同的真前缀和真后缀。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(593),alt:"PNG"}}),t._v(" "),a("p",[t._v("到这里为止,其实 KMP 的思路已经快说完了。但是大神说话了,大神认为这个匹配表,还得再改改,不然会出问题。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(594),alt:"PNG"}}),t._v(" "),a("p",[t._v("为什么会出问题呢,我们说了,对 KMP 而言,**如果没有匹配成功,**"),a("strong",[t._v("目标串是不回溯的")]),t._v("。那如果目标串不回溯,如果模式串一直都是 0,是不是意味着这个算法就没办法继续进行下去?所以大神把这个 next匹配表 改了一下,把 0 位置处的 next表 值改为了 -1。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(595),alt:"PNG"}}),t._v(" "),a("p",[t._v("那这个 -1 是干嘛用的呢?"),a("strong",[t._v("其实只是一个代码技巧")]),t._v("!大家注意一下第 7 行代码,假若没有 j == -1,此时如果 next[j] 等于 0,是不是就进死循环了。而加上这一句,相当于说无论什么情况下,模式串的第一个字符都可以匹配(对 j 而言,此时 -1++,是不是还是0。但是此时模式串却向前走了。不就不会因为死循环而卡死了吗?"),a("strong",[t._v("请大家自行脑补没有 j==-1 这行代码时,死循环卡死在11行的过程")]),t._v(")")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//GO ")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("KmpSearch")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("haystack "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" needle "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("haystack"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n l2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("needle"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" haystack"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" needle"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n j"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" next"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" j\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br")])]),a("p",[t._v("到这里为止,其实 KMP 就讲的差不太多了,代码还是比较简单的。但是麻烦的是?一般我们并没有现成的 next表 直接使用。那 next表 又该如何生成呢?")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("其实 next表 的生成,我们也可以看作是字符串匹配的过程:"),a("strong",[t._v("即原模式串和原模式串自身前缀进行匹配的过程。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("我们用下面这个字符串来讲一下:XXYXXYXXX。")]),t._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(596),alt:"PNG"}}),t._v(" "),a("p",[t._v("对于该字符串:")]),t._v(" "),a("br"),t._v(" "),a("ul",[a("li",[t._v("真前缀为 X,XX,XXY,XXYX,XXYXX.....")]),t._v(" "),a("li",[t._v("真后缀为 X,XX,XXX,YXXX,XYXXX.....")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("为了方便大家理解,我画了两种图(左图是真实的填表过程,右图是脑补过程):")]),t._v(" "),a("br"),t._v(" "),a("ul",[a("li",[a("p",[t._v("首先 index[0] 肯定是填写 0")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(597),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("然后填写 index[1]。"),a("strong",[t._v("如果匹配上,我们把 i 和 j 都加一")]),t._v("。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(598),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("然后填写 index[2],"),a("strong",[t._v("如果没有匹配上,就把 j 回溯到 j 当前指向的前一个位置的 index 处。在这里,也就是 0 。")])]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(599),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("注意,是回溯完成后才开始填表,此时 index[2] 为 0")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(600),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("然后我们移动 i,发现下一位匹配成功。同时给 i 和 j 加一,并填表。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(601),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("填完表后,我们发现下一位仍然匹配。继续移动 i 和 j。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(602),alt:"PNG"}}),t._v(" "),a("center",[t._v("(填表)")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(603),alt:"PNG"}}),t._v(" "),a("center",[t._v("(仍然匹配,继续移动 i 和 j)")])],1),t._v(" "),a("li",[a("p",[t._v("仍然匹配成功,继续重复上面的操作。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(604),alt:"PNG"}}),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(605),alt:"PNG"}}),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(606),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("注意,"),a("strong",[t._v("到这里开始匹配失败了")]),t._v("。上面说了,如果没有匹配成功,"),a("strong",[t._v("把 j 回溯到 j 当前指向的前一个位置的 index 处")]),t._v("。在这里,也就是 2 。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(607),alt:"PNG"}}),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(608),alt:"PNG"}}),t._v(" "),a("center",[t._v("(j 的前一个位置的 index)")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(609),alt:"PNG"}}),t._v(" "),a("center",[t._v("(回溯完成后,我们发现仍然不匹配)")])],1),t._v(" "),a("li",[a("p",[t._v("继续这个回溯的过程。。。(这一步是整个 next表 构建的核心)")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(610),alt:"PNG"}}),t._v(" "),a("center",[t._v("(这个蓝色的小标是下次的回溯位置)")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(611),alt:"PNG"}}),t._v(" "),a("center",[t._v("(回溯后,我们发现匹配成功了)")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(612),alt:"PNG"}})],1)]),t._v(" "),a("center",[t._v("(然后我们可以填表了)")]),t._v(" "),a("ul",[a("li",[t._v("注意!这里为什么是填2,其实就是填写上次回溯到的那个匹配成功的位置的index值加1。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("细心的读者,估计到这里发现一点问题。我们把填完后的表拿出来:")]),t._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(613),alt:"PNG"}}),t._v(" "),a("p",[t._v("我们发现这个表和我们最上面说的不太一样,我们最上面说的 next表 的首位是 -1,并且要记录哪一个 index 位置的 next 值,是去看该元素前面所有子串的真前缀和真后缀的最大长度。这句话有点拗口,我们还是看到下面这个。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(614),alt:"PNG"}}),t._v(" "),a("p",[t._v("比如 index 为 5 时,此时next的值是看 ABCEA 的最大长度(真后缀A,真前缀A,所以为1)。"),a("strong",[t._v("但是在我们下面这个表中,我们发现我们是记录的当前索引位置处的最大长度")]),t._v("。其实我这里要说一下,下面这个表,其实我们一般称为"),a("strong",[t._v("部分匹配表")]),t._v(",或者pmt。")]),t._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(615),alt:"PNG"}}),t._v(" "),a("p",[t._v("那这个表和我们的 next 表有什么关系吗,我们发现把这个表往后串一位,就得到了我们最终的 next 表。")]),t._v(" "),a("img",{staticStyle:{zoom:"80%"},attrs:{src:n(616),alt:"PNG"}}),t._v(" "),a("p",[t._v("但是但是但是!!!并不是所有讲解 KMP 的地方都会给你提一提部分匹配表的概念,有的地方干脆就直接把这个 pmt 等同于 next 表使用。**这种属于错误讲解吗?其实不是的!**因为我上面也说了,next表 在最初始位置补 -1,或者甚至干脆把 pmt 的第一位补一个 -1 当作 next表,这都统统是可以的。"),a("strong",[t._v("因为最关键的还是说你到时候怎么去使用!毕竟 next表 的定义也是人们给它赋予的!")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("举个例子,假如你 next表 的首位不补 -1,我们其实就可以在前面 KMP 的算法中,去掉 -1 的逻辑。而单独加一个 if 判断来解决上面说的死循环的问题。")]),t._v(" "),a("h2",{attrs:{id:"_02、总结"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、总结"}},[t._v("#")]),t._v(" 02、总结")]),t._v(" "),a("p",[t._v("KMP上篇到这里就结束了! KMP系列打算分上下两篇来讲,第一讲就是讲明白 KMP 是干嘛的,next 表是干嘛的,pmt 又是干嘛的。第二讲会给大家讲讲关于 next表 的计算,以及 next表 的优化。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("总之,我个人认为本篇内容放在全网讲解KMP的文章里,质量都还是可以的。如果是小白,学习本篇文章其实就够了。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])],1)}),[],!1,null,null,null);s.default=e.exports},566:function(t,s,n){t.exports=n.p+"assets/img/1.7628e6d5.jpg"},567:function(t,s,n){t.exports=n.p+"assets/img/2.b40d95e1.jpg"},568:function(t,s,n){t.exports=n.p+"assets/img/3.349f556b.jpg"},569:function(t,s,n){t.exports=n.p+"assets/img/4.8d02ff74.jpg"},570:function(t,s,n){t.exports=n.p+"assets/img/5.bd4d699f.jpg"},571:function(t,s,n){t.exports=n.p+"assets/img/6.f292572e.jpg"},572:function(t,s,n){t.exports=n.p+"assets/img/7.addb94af.jpg"},573:function(t,s,n){t.exports=n.p+"assets/img/8.3632bf0c.jpg"},574:function(t,s,n){t.exports=n.p+"assets/img/9.09f2ebf9.jpg"},575:function(t,s,n){t.exports=n.p+"assets/img/10.f6fd1f71.jpg"},576:function(t,s,n){t.exports=n.p+"assets/img/11.764c6ff1.jpg"},577:function(t,s,n){t.exports=n.p+"assets/img/12.35e54239.jpg"},578:function(t,s,n){t.exports=n.p+"assets/img/13.4a93ccb0.jpg"},579:function(t,s,n){t.exports=n.p+"assets/img/14.18d289c2.jpg"},580:function(t,s,n){t.exports=n.p+"assets/img/15.9c3af63a.jpg"},581:function(t,s,n){t.exports=n.p+"assets/img/16.e723d28e.jpg"},582:function(t,s,n){t.exports=n.p+"assets/img/17.6750d734.jpg"},583:function(t,s,n){t.exports=n.p+"assets/img/18.955ef13b.jpg"},584:function(t,s,n){t.exports=n.p+"assets/img/19.99629451.jpg"},585:function(t,s,n){t.exports=n.p+"assets/img/20.21270649.jpg"},586:function(t,s,n){t.exports=n.p+"assets/img/21.c71ff2d5.jpg"},587:function(t,s,n){t.exports=n.p+"assets/img/22.0dfbaa1c.jpg"},588:function(t,s,n){t.exports=n.p+"assets/img/23.e483057b.jpg"},589:function(t,s,n){t.exports=n.p+"assets/img/24.faeadf2e.jpg"},590:function(t,s,n){t.exports=n.p+"assets/img/25.6750d734.jpg"},591:function(t,s,n){t.exports=n.p+"assets/img/26.120ba786.jpg"},592:function(t,s,n){t.exports=n.p+"assets/img/27.af418b95.jpg"},593:function(t,s,n){t.exports=n.p+"assets/img/28.0129bd8c.jpg"},594:function(t,s,n){t.exports=n.p+"assets/img/29.3fdbe3a3.jpg"},595:function(t,s,n){t.exports=n.p+"assets/img/30.fdddeb32.jpg"},596:function(t,s){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAj8AAABsCAMAAACy9yN1AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAllBMVEX////5+fnw8PD8/Pz09PTt7e339/c1NTUrKysqKioMDAwREREpKSlOTk43NzdTU1NgYGAPDw86Ojo2NjZRUVHnplIAAAAAgsZSpuf//8aEAAAAAFKl4///x4SEx///46VSAAAAVaXn/////+elVQDn/+cAAITG///GggBSUlLGx4QtLS0NDQ1aWlpeXl5fX18iIiIkJCTIZVULAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAA3RJREFUeNrt3G1T2kAYheEABaWtFWhJBVRA0dJaa/v//1xnAkPZD7s0S8Keh9zPjIOZzGUO5JjwMiTLdtPKnGk7S+7KTiewEtkgaScpUlHaSYpUlHaSIhWlnaRIRWknKVJR2kmKVJRZazfvWs50nSV3Za8XWIlskLTTdKSitJMUqSjtJEUqSjtJkYrSTlKkorSTFKko7SRFKko7SZGK0k5SpKK0kxSpKO0kRSpKO0mRitJOUqSitJMUqSiz9m66bWcuLven7y71Aysv339AnpP8eLXfC7cm/mJ9uh5EzhB5VnJ0HTj+BPqTRc4QeVaS/iDpDzKVpD9I+oNMJekPkv4gU0n6g6Q/yFSS/iDpDzKVpD/I2vrj/db8Z1P3EVmfHH2JuX4Cxx/kZjh/IekPMpWkP0j6g0wl6Q+S/iBTSfqDpD/IVJL+IHX6M86/bm9vSiaNlpPp7Lb45W77F06wzaak/Q9Z8fFnnN8XD45vc/6mR8v5YvlQ7Jni5jTbbEraw7Li/jyuZrfZZOr73wokjZebezfe/mOfZptNSXtQBvvT2U2v44z/8/f5Yvm0ev5WPukRcj27zeaLmwhJ2mPl6Pt+L9yaxPQnG+d5ccwrnTReTqbLp5X3fFDPNpuS9pAM9ufflHj9tfafLA8804+Wd3nuPx/UtM2mpD0gK3/9Pl/kgcNdKGm8jH90SHukrLo/j6vnH7n/6VYgabwMPh2taZtNSXtIVt2fdX5f/JRPGi/j9whpj5UV96d4dTqZ+o94w+pl/B4h7dGy2v5s3x3b3pRJGi+z6D1C2uNlpf3ZFXVc9t35eLlRMXuEtBVIPj9F6nx+qnkfkfVJ+oOkP8hUkv4g6Q8yleT6CUiun4BMJTl/IekPMpWkP0j6g0wl6Q+S/iBTSfqDpD/IVJL+IOkPMpWkP0j6g0wl6Q+ytv60d9NtO3PxEjs/+8hzki9X+71wa+Iv1utgf345S29vgZWD33+Q5yRfB4Hjj//AFFjpXLcD2WBpJylSUdpJilSUdpIiFaWdpEhFaScpUlHaSYpUlHaSIhWlnaRIRWknKVJR2kmKVJR2kiIVpf/6Cd2W/1vzvV5gJbJB0k7TkYrSTlKkorSTFKko7SRFKko7SZGK0k5SpKK0kxSpKO0kRSpKO0mRitJOUqSitJMUqSjtJEUqSjtJkYryL0z9Vclt1SugAAAAAElFTkSuQmCC"},597:function(t,s,n){t.exports=n.p+"assets/img/32.55284143.jpg"},598:function(t,s,n){t.exports=n.p+"assets/img/33.2f9c6307.jpg"},599:function(t,s,n){t.exports=n.p+"assets/img/34.088e44cf.jpg"},600:function(t,s,n){t.exports=n.p+"assets/img/35.c4d9475c.jpg"},601:function(t,s,n){t.exports=n.p+"assets/img/36.16e8c10d.jpg"},602:function(t,s,n){t.exports=n.p+"assets/img/37.a96ce0dc.jpg"},603:function(t,s,n){t.exports=n.p+"assets/img/38.8d2e09fd.jpg"},604:function(t,s,n){t.exports=n.p+"assets/img/39.5bb938d3.jpg"},605:function(t,s,n){t.exports=n.p+"assets/img/40.02513dd2.jpg"},606:function(t,s,n){t.exports=n.p+"assets/img/41.278a834a.jpg"},607:function(t,s,n){t.exports=n.p+"assets/img/42.f0b0ff81.jpg"},608:function(t,s,n){t.exports=n.p+"assets/img/43.af5389d7.jpg"},609:function(t,s,n){t.exports=n.p+"assets/img/44.daadc38e.jpg"},610:function(t,s,n){t.exports=n.p+"assets/img/45.1509be0f.jpg"},611:function(t,s,n){t.exports=n.p+"assets/img/46.71cd5e77.jpg"},612:function(t,s,n){t.exports=n.p+"assets/img/47.cd5c0b80.jpg"},613:function(t,s){t.exports="data:image/jpeg;base64,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"},614:function(t,s,n){t.exports=n.p+"assets/img/49.b7bb9267.jpg"},615:function(t,s){t.exports="data:image/jpeg;base64,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"},616:function(t,s,n){t.exports=n.p+"assets/img/51.8438f2b4.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/30.019b90f7.js b/learning/.vuepress/dist/assets/js/30.019b90f7.js deleted file mode 100644 index 4bdb97ed..00000000 --- a/learning/.vuepress/dist/assets/js/30.019b90f7.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{1107:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天继续为大家讲解二分查找,分享一道知乎面试题。话不多说,直接看题。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目有两个版本,一道简单,一道困难。我们从简单的开始讲起。")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第153题:旋转排序数组最小值Ⅰ")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [3,4,5,1,2]\n输出: 1\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [4,5,6,7,0,1,2]\n输出: 0\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[t._v("#")]),t._v(" 02、题解分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目的关键点取决于是否可以想到二分,难点:无。但是如果把题中的条件,换成数组中元素可重复,本题的难度就会大幅上升。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("当然,本题可以直接暴力搜索,但是这就就会被面试官撵出去。为了不被他撵出去,我们还是使用二分更为稳妥!"),n("strong",[t._v("在****二分搜索中,我们找到区间的中间点并根据某些条件决定去区间左半部分还是右半部分搜索")]),t._v("。但是麻烦的是,我们的数组被旋转了,因此肯定不能直接使用二分。那我们需要先观察一下,假若我们的原始数组如下:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(752),alt:"PNG"}}),t._v(" "),n("p",[t._v("无论怎么旋转,我们都可以得到一个结论,首元素 > 尾元素,像是下面这样。虽然不知道这个结论有什么用,但是我们先记下来。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(753),alt:"PNG"}}),t._v(" "),n("p",[t._v("继续进行观察,上面其实是两种极端情况,那如果普通的情况旋转,大概是下面这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(754),alt:"PNG"}}),t._v(" "),n("p",[t._v("问题似乎变得简单了,旋转将原数组一分为二,并且我们已知了首元素值总是大于尾元素,那我们只要找到将其一分为二的那个点(该点左侧的元素都大于首元素,该点右侧的元素都小于首元素),是不是就可以对应找到数组中的最小值。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(755),alt:"PNG"}}),t._v(" "),n("p",[t._v("然后我们通过二分来进行查找,先找到中间节点mid,如果中间元素大于首元素,我们就把mid向右移动。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(756),alt:"PNG"}}),t._v(" "),n("p",[t._v("如果中间元素小于首元素,我们就把mid向左移动。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(757),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据分析,完成题解:")]),t._v(" "),n("p",[t._v("java版本")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findMin")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br")])]),n("p",[t._v("python版本")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("//")]),t._v("python \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" findMin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br")])]),n("p",[t._v("c版本")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//c ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findMin")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" numsSize"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("numsSize"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n left"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(758),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、课后思考"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、课后思考"}},[t._v("#")]),t._v(" 03、课后思考")]),t._v(" "),n("blockquote",[n("p",[t._v("本题有多种变形,是一道练习二分法的绝佳题目。比如“把元素中不可重复的条件去掉”,又或者是“编写一个函数来判断目标值是否在数组中”等等,不同的改动,都会对题目解题方式有略微的影响,但是万变不离其宗,统统都是二分法。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("其他的就不啰嗦了,明天将为大家答疑分析,解决“元素可重复”的版本。所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=r.exports},752:function(t,s){t.exports="data:image/jpeg;base64,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"},753:function(t,s,a){t.exports=a.p+"assets/img/2.ace2c641.jpg"},754:function(t,s,a){t.exports=a.p+"assets/img/3.305e9fcd.jpg"},755:function(t,s,a){t.exports=a.p+"assets/img/4.517a72a2.jpg"},756:function(t,s,a){t.exports=a.p+"assets/img/5.1ce72971.jpg"},757:function(t,s,a){t.exports=a.p+"assets/img/6.64d30411.jpg"},758:function(t,s,a){t.exports=a.p+"assets/img/7.7ff53810.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/31.252cb005.js b/learning/.vuepress/dist/assets/js/31.252cb005.js deleted file mode 100644 index 53aa210f..00000000 --- a/learning/.vuepress/dist/assets/js/31.252cb005.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{1112:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享一道关于**“复制” + “粘贴”**的题目。话不多说,直接看题吧。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第650题:只有两个键的键盘")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("最初在一个记事本上只有一个字符 'A' 。你每次可以对这个记事本进行两种操作:Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。Paste (粘贴) : 你可以粘贴你上一次复制的字符。")])])])]),t._v(" "),n("p",[t._v("给定一个数字 n 。你需要使用"),n("strong",[t._v("最少的操作次数")]),t._v(",在记事本中打印出恰好 n 个 'A'。输出能够打印出 n 个 'A' 的最少操作次数。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: 3\n输出: 3\n解释:\n最初, 我们只有一个字符 'A'。\n第 1 步, 我们使用 Copy All 操作。\n第 2 步, 我们使用 Paste 操作来获得 'AA'。\n第 3 步, 我们使用 Paste 操作来获得 'AAA'。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br")])]),n("br"),t._v(" "),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("p",[t._v("n 的取值范围是 [1, 1000] 。")]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("p",[t._v("本题的思路,在于"),n("strong",[t._v("想明白复制和粘贴过程中的规律,找到如何组成N个A的最小操作数。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们从最简单的开始分析,假如我们给定数字为1,那啥也不用做,因为面板上本来就有一个A。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(778),alt:"PNG"}}),t._v(" "),n("p",[t._v("假如我们给定数字为2,那我们需要做C-P,共计2次操作来得到。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(779),alt:"PNG"}}),t._v(" "),n("p",[t._v("假如我们给定数字为3,那我们需要做C-P-P,共计3次操作来得到。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(780),alt:"PNG"}}),t._v(" "),n("p",[t._v("假如我们给定数字为4,我们发现好像变得不一样了。因为我们有两种方法都可以得到目标。(C-P-C-P)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(781),alt:"PNG"}}),t._v(" "),n("p",[t._v("或者(C-P-P-P)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(782),alt:"PNG"}}),t._v(" "),n("p",[t._v("但是需要的步骤还是一样。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("好了,到这里为止,STOP!通过上面的分析,我们至少可以观察出:"),n("strong",[t._v("如果 i 为质数,那么 i 是多少,就需要粘贴多少次")]),t._v("。即:素数次数为本身的结论。如 两个A = 2,三个A = 3,五个A = 5。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那对于合数又该如何分析呢?(自然数中除能被1和本身整除外,还能被其他的数整除的数)这里我们直接给出答案:合数的次数为**将其分解质因数的操作次数的和。**解释一下,这是个啥意思?举个例子:")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("比如30,可以分解为:3"),n("em",[t._v("2")]),t._v("5。什么意思呢?我们演示一遍:首先复制1,进行2次粘贴得到3。然后复制3,进行1次粘贴得到6。然后复制6,进行4次粘贴得到30。总共需要(CPPCPCPPPP)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(783),alt:"PNG"}}),t._v(" "),n("blockquote",[n("p",[t._v("注意:这里由于每一次都需要进行一次复制,"),n("strong",[t._v("所以直接就等于分解质因数的操作次数的和")]),t._v("。并且分解的顺序,不会影响到结果。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("综合上面的分析,我们得出分析结果:")]),t._v(" "),n("p",[t._v("1、质数次数为其本身。")]),t._v(" "),n("p",[t._v("2、合数次数为将其分解到"),n("strong",[t._v("所有不能再分解的质数的操作次数的和")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),n("p",[t._v("分析完毕,代码如下所示:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("minSteps")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tres "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tres "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i\n\t\t\tn "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/=")]),t._v(" i\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(784),alt:"PNG"}})])}),[],!1,null,null,null);s.default=r.exports},778:function(t,s){t.exports="data:image/jpeg;base64,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"},779:function(t,s,a){t.exports=a.p+"assets/img/2.b719d6e1.jpg"},780:function(t,s,a){t.exports=a.p+"assets/img/3.005b13e9.jpg"},781:function(t,s,a){t.exports=a.p+"assets/img/4.4b4e0373.png"},782:function(t,s,a){t.exports=a.p+"assets/img/5.bedc1917.jpg"},783:function(t,s,a){t.exports=a.p+"assets/img/6.c11a0ca7.jpg"},784:function(t,s,a){t.exports=a.p+"assets/img/7.a6e070a6.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/32.09b2a156.js b/learning/.vuepress/dist/assets/js/32.09b2a156.js deleted file mode 100644 index 7a3c4c8c..00000000 --- a/learning/.vuepress/dist/assets/js/32.09b2a156.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{1122:function(t,a,s){"use strict";s.r(a);var n=s(3),o=Object(n.a)({},(function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享一道BAT常考题目,不同路径。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("p",[t._v("该题很容易出现在各大厂的面试中,一般会要求手写,所以需要完整掌握。")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("不同路径")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("一个机器人位于一个 m x n 网格的左上角,起始点在下图中标记为“Start”。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,在下图中标记为“Finish”。 问:总共有多少条不同的路径?")])])])]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(821),alt:"PNG"}}),t._v(" "),n("p",[t._v("例如,上图是一个7 x 3 的网格。有多少可能的路径?")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("**说明:**m 和 n 的值均不超过 100。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: m = 3, n = 2\n输出: 3\n\n解释:\n从左上角开始,总共有 3 条路径可以到达右下角。\n\\1. 向右 -> 向右 -> 向下\n\\2. 向右 -> 向下 -> 向右\n\\3. 向下 -> 向右 -> 向右\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: m = 7, n = 3\n输出: 28\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题属于相当标准的动态规划,虽然还有一些公式法等其他解法,但是如果面试官问到,基本就是想考察你的动态规划。")])]),t._v(" "),n("p",[t._v("拿到题目,首先定义状态。因为有横纵坐标,明显属于二维DP。我们定义"),n("strong",[t._v("DP[i][j]表示到达i行j列的最多路径")]),t._v("。同时,因为第0行和第0列都只有一条路径,所以需要初始化为1。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:s(822),alt:"PNG"}}),t._v(" "),n("p",[t._v("状态转移方程一目了然,dp[i][j] = dp[i-1][j] dp[i][j-1]。(想象你站在一个十字路口,到达这个十字路口可能的所有路径,就是从东南西北四个方向过来可能出现的所有路径和。放在这道题里,其实就是砍掉东南。)")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:s(823),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据分析,完成代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("uniquePaths")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("m "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n dp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(824),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、代码优化"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、代码优化"}},[t._v("#")]),t._v(" 03、代码优化")]),t._v(" "),n("blockquote",[n("p",[t._v("上面的答案,如果在面试时给出,可以给到7分,后面3分怎么拿,我们真的需要用一个二维数组来存储吗?一起看下!")])]),t._v(" "),n("p",[t._v("在上文中,我们使用"),n("strong",[t._v("二维数组")]),t._v("记录状态。但是这里观察一下,每一个格子可能的路径,"),n("strong",[t._v("都是由左边的格子和上面的格子的总路径计算而来, 对于之前更早的数据,其实已经用不到了")]),t._v("。如下图,计算第三行时,已经用不到第一行的数据了。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:s(825),alt:"PNG"}}),t._v(" "),n("p",[t._v("那我们只要能定义一个状态,同时可以表示左边的格子和上面的格子,是不是就可以解决问题?所以我们定义状态dp[j],用来表示"),n("strong",[t._v("当前行到达第j列的最多路径")]),t._v("。这个“当前行”三个字很重要,比如我们要计算dp[3],因为还没有计算出,所以这时dp[3]保存的其实是4(上一行的数据),而dp[2]由于已经计算出了,所以保存的是6(当前行的数据)。理解了这个,就理解如何压缩状态。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:s(826),alt:"PNG"}}),t._v(" "),n("p",[t._v("最后,根据分析得出代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("uniquePaths")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("m "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n dp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//注意,这里dp[j-1]已经是新一行的数据了,而dp[j]仍然是上一行的数据")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(827),alt:"PNG"}})])}),[],!1,null,null,null);a.default=o.exports},821:function(t,a,s){t.exports=s.p+"assets/img/1.dccce91b.jpg"},822:function(t,a){t.exports="data:image/jpeg;base64,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"},823:function(t,a){t.exports="data:image/jpeg;base64,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"},824:function(t,a){t.exports="data:image/jpeg;base64,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"},825:function(t,a,s){t.exports=s.p+"assets/img/5.2c119423.jpg"},826:function(t,a,s){t.exports=s.p+"assets/img/6.48bc0047.jpg"},827:function(t,a){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/33.de06b422.js b/learning/.vuepress/dist/assets/js/33.de06b422.js deleted file mode 100644 index 70b108a8..00000000 --- a/learning/.vuepress/dist/assets/js/33.de06b422.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{1060:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天为大家带来,"),n("strong",[s._v("链表检测成环")]),s._v("的经典题目。如果你觉得你会了,请你不妨耐心些认真看下去,我相信会有一些不一样的收获!还是先从一道题目开始哟,准备好了吗? Let' s go !")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第141题:环形链表")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:head = [3,2,0,-4], pos = 1\n输出:true\n解释:链表中有一个环,其尾部连接到第二个节点。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(504),alt:"PNG"}}),s._v(" "),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:head = [1,2], pos = 0\n输出:true\n解释:链表中有一个环,其尾部连接到第一个节点。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(505),alt:"PNG"}}),s._v(" "),n("p",[n("strong",[s._v("示例 3:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:head = [1], pos = -1\n输出:false\n解释:链表中没有环。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("img",{attrs:{src:a(506),alt:"PNG"}}),s._v(" "),n("blockquote",[n("p",[n("strong",[s._v("题目可能你会觉得过于简单!但是不妨耐心看完!")])]),s._v(" "),n("p",[n("strong",[s._v("则一定会有收获!")])])]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("p",[n("strong",[s._v("题解一:哈希表判定")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("思路:"),n("strong",[s._v("通过hash表来检测节点之前是否被访问过")]),s._v(",来判断链表是否成环。这是最容易想到的一种题解了。过于简单,直接上代码:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("hasCycle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n m "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("exist "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("exist "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),s._v("\n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" false12\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("br"),s._v(" "),n("p",[n("strong",[s._v("题解二:JS特殊解法")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("相信对于 JS 中的 JSON.stringify() 方法大家都用过,主要用于"),n("strong",[s._v("将 JS 对象 转换为 JSON 字符串")]),s._v("。基本使用如下:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" car "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n name"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'小喵'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n age"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" str "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" JSON"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("stringify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("car"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nconsole"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("log")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("str"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('//=> {"name":"小喵","age":20}')]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("p",[s._v("大家想一下,如果是自己实现这样的一个函数,我们需要处理什么样的特殊情况?对,就是"),n("strong",[s._v("循环引用")]),s._v("。因为对于循环引用,我们很难通过 JSON 的结构将其进行展示!比如下面:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" a \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" b\n console"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("log")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("JSON"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("stringify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//=> TypeError: Converting circular structure to JSON")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("p",[s._v("那我们思考,对于环形链表,是不是就是一个循环结构呢?当然是!因为只要是环形链表,它一定存在类似以下代码:")]),s._v(" "),n("blockquote",[n("center",[s._v("a.Next = b")]),s._v(" "),n("center",[s._v("b.Next = a")])],1),s._v(" "),n("p",[s._v("所以我们可以通过 JSON.stringify() 的特性进行求解:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" hasCycle "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("function")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n try"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n JSON"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("stringify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("catch")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("当然,这种解法并不是建议的标准题解!在此列出是为了拓宽思维!(大家如有兴趣,可以自己去看下JSON.stringify 内部的实现,是如何检测循环引用的。)")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("题解三:双指针解法")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("本题标准解法!常识内容,"),n("strong",[s._v("必须掌握")]),s._v("!")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("思路来源:先想象一下,"),n("strong",[s._v("两名运动员以不同速度在跑道上进行跑步")]),s._v("会怎么样?"),n("strong",[s._v("相遇")]),s._v("!好了,这道题你会了。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("解题方法:通过"),n("strong",[s._v("使用具有 不同速度 的快、慢两个指针遍历链表")]),s._v(",空间复杂度可以被降低至 O(1)。"),n("strong",[s._v("慢指针每次移动一步,而快指针每次移动两步")]),s._v("。")]),s._v(" "),n("p",[s._v("假设链表为 "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(507),alt:"PNG"}}),s._v(", 其步骤如下:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(508),alt:"PNG"}}),s._v(" "),n("p",[s._v("分析完毕,直接上代码:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("hasCycle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n fast "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 快指针,每次走两步")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" fast "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" fast"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" fast "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" head "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 快慢指针相遇,表示有环")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n fast "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" fast"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next \n head "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" head"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 慢指针,每次走一步")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("p",[s._v("这里我们要特别说明一下,为什么慢指针的步长设置为 1 ,而快指针步长设置为 2 。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("首先,慢指针步长为 1,很容易理解,因为我们需要让"),n("strong",[s._v("慢指针步行至每一个元素")]),s._v("。而快指针步长为 2 ,通俗点可以理解为他们的"),n("strong",[s._v("相对速度只差 1")]),s._v(",快的只能一个一个格子的去追慢的,必然在一个格子相遇。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("如果没看懂,我们来分析:在快的快追上慢的时,他们之间一定是只差 1 个或者 2 个格子。如果落后 1 个,那么下一次就追上了。如果落后 2 个,那么下一次就落后 1 个,再下一次就能追上!如下图:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(509),alt:"PNG"}}),s._v(" "),n("p",[s._v("所以我们的快指针的步长可以设置为 2 。")]),s._v(" "),n("h2",{attrs:{id:"_03、特别说明"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、特别说明"}},[s._v("#")]),s._v(" 03、特别说明")]),s._v(" "),n("p",[s._v("我们常会遇到一些所谓的“简单题目“,然后用着前人留下来的那些”经典题解“迅速作答。在解题的过程中,追求公式化、模板化。当然,这个过程是好的,因为社会、工作、学业要求我们如此!但是,我希望我们也可以留下一些自己的思考,纵然不是最优解,但是是我们自己想到的、创造的!真正在算法题中去收获快乐~")])])}),[],!1,null,null,null);t.default=e.exports},504:function(s,t,a){s.exports=a.p+"assets/img/1.277dc868.jpg"},505:function(s,t){s.exports="data:image/jpeg;base64,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"},506:function(s,t){s.exports="data:image/jpeg;base64,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"},507:function(s,t){s.exports="data:image/jpeg;base64,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"},508:function(s,t,a){s.exports=a.p+"assets/img/5.a7be87ed.jpg"},509:function(s,t,a){s.exports=a.p+"assets/img/6.d54032f0.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/34.2477a1e5.js b/learning/.vuepress/dist/assets/js/34.2477a1e5.js deleted file mode 100644 index 7c95a17a..00000000 --- a/learning/.vuepress/dist/assets/js/34.2477a1e5.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{1063:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("前几天写了一篇“小白为了面试如何刷题”的文章大受好评。随之而来的是好多小伙伴私下跑来问我“"),n("strong",[t._v("浩哥,你说前200道题很好,但是前两百道题的难度很大,我不会怎么办")]),t._v("”这问题我想了一两天。。。好吧,既然你们说难不会。那我干脆就把前两百道题都给你们配上图解,全部安排,这样总可以了吧?牛气冲天有木有,哪个公号主敢这么干的!奥利给,搞起。今儿为大家分享经典面试题目 - 两数相加。做过的朋友,也不要急着叉掉,不妨借机复习一番。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("各数据结构中的“加减乘除”都是很爱考察的内容。")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第2题:两数相加")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。")])])])]),t._v(" "),n("p",[t._v("给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("您可以假设除了数字 0 之外,这两个数都不会以 0 开头。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)\n输出:7 -> 0 -> 8\n原因:342 + 465 = 807\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("h2",{attrs:{id:"_02、算法图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、算法图解"}},[t._v("#")]),t._v(" 02、算法图解")]),t._v(" "),n("blockquote",[n("p",[t._v("烧饼(哨兵)节点:烧饼节点就是说有一个节点长的像烧饼,站在最前面。往往第一个节点小子都会来啃一口,因为是牛肉拔丝烧饼,扯不掉就连起来了。。。好了,我实在编不下去了~囧....")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("不了解哨兵节点的可以看下:")]),t._v(" "),n("br"),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.1.链表系列/1.0.数组系列/101.html"}},[t._v("删除链表倒数第N个节点(19)")])],1),t._v(" "),n("br"),t._v(" "),n("p",[t._v("好了,了解了哨兵节点,其实这道题和哨兵节点**并没有什么毛线关系,**我只是让你复习一下(会不会想打我)。现在开始正式分析题目。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("老样子,我们还是先画图,假若我们的链表是 (2 -> 4 -> 3) + (5 -> 6 -> 4) ,大概就是这样(注意,这里我们其实是要完成 342 + 465):")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(514),alt:"PNG"}}),t._v(" "),n("p",[t._v("加法肯定是从最低位到最高位进行相加,也就是这里的"),n("strong",[t._v("链表头到链表尾进行相加,所以需要遍历链表")]),t._v("。我们令 l1 和 l2 指向两个链表的头,用一个 tmp 值来存储同一位相加的结果,以及一个新的链表来存储 tmp 的值。(为什么不直接用新链表存储结果,而是用 tmp 先存储结果,再用新链表存储 tmp 的值呢?请继续往下看)")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(515),alt:"PNG"}}),t._v(" "),n("p",[t._v("记住:"),n("strong",[t._v("所有模拟运算的题目,都需要考虑进位")]),t._v("。这里因为个位不涉及进位,开始计算十位。我们同时遍历 l1,l2,以及新链表到下一位。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(516),alt:"PNG"}}),t._v(" "),n("p",[t._v("重复上面的操作,可以看到十位与个位不同,发生了进位。这时,刚才的 tmp 就有了用武之地。"),n("strong",[t._v("我们使用 tmp 携带进位的值到下一位的运算")]),t._v("。自然,这里的链表也不能直接存储 tmp 的值了,而是要存储 tmp%10 的值。重复这个步骤,"),n("strong",[t._v("直到两个链表都遍历完成,并且 tmp 没有进位值")]),t._v(":")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(517),alt:"PNG"}}),t._v(" "),n("p",[t._v("现在只需要返回我们的新链表就可以了。问题来了,"),n("strong",[t._v("因为我们没有构造哨兵节点,所以此时不太容易直接返回新链表")]),t._v("。所以在整个流程的第一步,我们还需要用一个哨兵节点指向我们的新链表。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(518),alt:"PNG"}}),t._v(" "),n("p",[t._v("分析完毕,直接上代码(好久没翻Go的牌子了):")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("addTwoNumbers")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" l2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("ListNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tlist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//这里用一个result,只是为了后面返回节点方便,并无他用")]),t._v("\n\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" list\n\ttmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" l1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" l2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\ttmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" l1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val\n\t\t\tl1 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\ttmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" l2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val\n\t\t\tl2 "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\tlist"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("ListNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\ttmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\n\t\tlist "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(519),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、总结"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、总结"}},[t._v("#")]),t._v(" 03、总结")]),t._v(" "),n("blockquote",[n("p",[t._v("1950年6月19日,毛泽东写信给当时的教育部部长马叙伦:“要各校注意健康第一,学习第二。营养不足,宜酌增经费。”1951年9月底,毛泽东接见安徽参加国庆的代表团,代表团成员中有渡江小英雄马三姐。毛泽东关切地问她念书情况,还送她一本精美的笔记本,并且在扉页上题词:"),n("strong",[t._v("好好学习,天天向上")]),t._v("。这8个字的题词迅速在全国传播开来。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天的题目到这里就结束了。你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);s.default=r.exports},514:function(t,s,a){t.exports=a.p+"assets/img/1.77d1279c.jpg"},515:function(t,s,a){t.exports=a.p+"assets/img/2.aecc2d80.jpg"},516:function(t,s,a){t.exports=a.p+"assets/img/3.282d3108.jpg"},517:function(t,s,a){t.exports=a.p+"assets/img/4.4d0bf2ce.jpg"},518:function(t,s,a){t.exports=a.p+"assets/img/5.acd9a171.jpg"},519:function(t,s,a){t.exports=a.p+"assets/img/6.11546c06.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/35.b8a6b459.js b/learning/.vuepress/dist/assets/js/35.b8a6b459.js deleted file mode 100644 index 29ea28a8..00000000 --- a/learning/.vuepress/dist/assets/js/35.b8a6b459.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{1066:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("在上一篇中,我们通过分析,顺利完成了“"),n("strong",[t._v("三角形最小路径和")]),t._v("”的动态规划题解。在本节中,我们继续看一道相似题型,以求能完全掌握这种“路径和”的问题。话不多说,先看题目:")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第64题:最小路径和")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。")])])])]),t._v(" "),n("p",[t._v("说明:每次只能向下或者向右移动一步。")]),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:\n[\n [1,3,1],\n [1,5,1],\n [4,2,1]\n]\n输出: 7\n解释: 因为路径 1→3→1→1→1 的总和最小。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br")])]),n("br"),t._v(" "),n("blockquote",[n("p",[n("strong",[t._v("这道题有一定难度哦!如果没有思路请回顾上一篇的学习内容!")])]),t._v(" "),n("p",[n("strong",[t._v("不建议直接看题解!")])])]),t._v(" "),n("h2",{attrs:{id:"_02、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),n("p",[t._v("首先我们分析题目,要找的是 **最小路径和,**这是个啥意思呢?假设我们有一个 m * n 的矩形 :[[1,3,1],[1,5,1],[4,2,1]]")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(531),alt:"PNG"}}),t._v(" "),n("p",[t._v("那从"),n("strong",[t._v("左上角到右下角")]),t._v("的最小路径和,我们可以很容易看出就是 1-3-1-1-1 ,这一条路径,结果等于 7 。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("题目明确了,我们继续进行分析。该题与上一道求三角形最小路径和一样,题目明显符合可以"),n("strong",[t._v("从子问题的最优解进行构建")]),t._v(",所以我们考虑使用动态规划进行求解。首先,我们定义状态:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[i][j] : 表示包含第i行j列元素的最小路径和 ")])])],1),t._v(" "),n("p",[t._v("同样,因为任何一条到达右下角的路径,都会经过 [0,0] 这个元素。所以我们需要对 dp[0][0] 进行初始化。")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[0][0] = [0][0]位置所在的元素值 ")])])],1),t._v(" "),n("p",[t._v("继续分析,根据题目给的条件,如果我们要求 dp[i][j] ,那么它一定是从自己的上方或者左边移动而来。如下图所示:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(532),alt:"PNG"}}),t._v(" "),n("blockquote",[n("center",[t._v("5,只能从3或者1移动而来")]),t._v(" "),n("center",[t._v("2,只能从5或者4移动而来")]),t._v(" "),n("center",[t._v("4,从1移动而来")]),t._v(" "),n("center",[t._v("3,从1移动而来")]),t._v(" "),n("center",[n("b",[t._v(" (红色位置必须从蓝色位置移动而来) ")])])],1),t._v(" "),n("p",[t._v("进而我们得到状态转移方程:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j] ")])])],1),t._v(" "),n("p",[t._v("同样我们需要考虑两种特殊情况:")]),t._v(" "),n("ul",[n("li",[t._v("最上面一行,只能由左边移动而来(1-3-1)")]),t._v(" "),n("li",[t._v("最左边一列,只能由上面移动而来(1-1-4)")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(533),alt:"PNG"}}),t._v(" "),n("p",[t._v("最后,因为我们的目标是"),n("strong",[t._v("从左上角走到右下角")]),t._v(","),n("strong",[t._v("整个网格的最小路径和其实就是包含右下角元素的最小路径和")]),t._v("。即:")]),t._v(" "),n("blockquote",[n("center",[n("b",[t._v(" 设:dp的长度为l ")])]),t._v(" "),n("center",[n("b",[t._v(" 最终结果就是:dp[l-1][len(dp[l-1])-1] ")])])],1),t._v(" "),n("p",[t._v("综上我们就分析完了,我们总共进行了 4 步:")]),t._v(" "),n("ol",[n("li",[t._v("定义状态")]),t._v(" "),n("li",[t._v("总结状态转移方程")]),t._v(" "),n("li",[t._v("分析状态转移方程不能满足的特殊情况。")]),t._v(" "),n("li",[t._v("得到最终解")])]),t._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、GO语言示例")]),t._v(" "),n("p",[t._v("根据以上分析,可以得到代码如下:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("minPathSum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tl "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tdp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" grid "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(534),alt:"PNG"}}),t._v(" "),n("p",[t._v("同样,运行上面的代码,我们发现使用的内存过大。有没有什么办法可以压缩内存呢?通过观察我们发现,"),n("strong",[t._v("在我们自左上角到右下角计算各个节点的最小路径和的过程中,我们只需要使用到之前已经累积计算完毕的数据,并且不会再次访问之前的元素数据")]),t._v("。绘制成图如下:(大家看这个过程像不像扫雷,其实如果大家研究扫雷外挂的话,就会发现在扫雷的核心算法中,就有一处颇为类似这种分析方法,这里就不深究了)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(535),alt:"PNG"}}),t._v(" "),n("p",[t._v("优化后的代码如下:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("minPathSum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tl "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tgrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tgrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tgrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(536),alt:"PNG"}}),t._v(" "),n("br"),t._v(" "),n("blockquote",[n("p",[n("strong",[t._v("课后思考:路径和类问题和之前的子序列类问题有何区别?")])])])])}),[],!1,null,null,null);s.default=r.exports},531:function(t,s,a){t.exports=a.p+"assets/img/1.5d3b351e.jpg"},532:function(t,s,a){t.exports=a.p+"assets/img/2.e2bb3392.jpg"},533:function(t,s,a){t.exports=a.p+"assets/img/3.1996c071.jpg"},534:function(t,s,a){t.exports=a.p+"assets/img/4.af1e2af1.jpg"},535:function(t,s,a){t.exports=a.p+"assets/img/5.ba54b600.jpg"},536:function(t,s,a){t.exports=a.p+"assets/img/6.1f77b9c7.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/36.a576e173.js b/learning/.vuepress/dist/assets/js/36.a576e173.js deleted file mode 100644 index 3d69366c..00000000 --- a/learning/.vuepress/dist/assets/js/36.a576e173.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{1077:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("在两节中,我们了解了BST(二叉搜索树)的概念,并且知道了如何在BST中查找一个元素。那我们又如何在BST中去删除一个元素呢?我们将通过本节的例题进行学习!")]),t._v(" "),n("p",[t._v("下面我们仍然通过例题进行讲解。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第450题:删除二叉搜索树中的节点")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。")])])])]),t._v(" "),n("p",[t._v("一般来说,删除节点可分为两个步骤:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[t._v("首先找到需要删除的节点;")]),t._v(" "),n("li",[t._v("如果找到了,删除它。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("说明: 要求算法时间复杂度为 O(h),h 为树的高度。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("root = [5,3,6,2,4,null,7]\nkey = 3\n\n 5\n / \\\n 3 6\n / \\ \\\n2 4 7\n\n给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。\n\n一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。\n 5\n / \\\n 4 6\n / \\\n2 7\n\n另一个正确答案是 [5,2,6,null,4,null,7]。\n 5\n / \\\n 2 6\n \\ \\\n 4 7\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br")])]),n("blockquote",[n("p",[n("strong",[t._v("强烈建议先学习之前两节内容!")])]),t._v(" "),n("p",[n("strong",[t._v("以达到最好的学习效果!")])])]),t._v(" "),n("h2",{attrs:{id:"_02、复习巩固"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、复习巩固"}},[t._v("#")]),t._v(" 02、复习巩固")]),t._v(" "),n("p",[t._v("先复习一下,"),n("strong",[t._v("二叉搜索树")]),t._v("(BST)的特性:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[t._v("若它的左子树不为空,则所有左子树上的值均小于其根节点的值")]),t._v(" "),n("li",[t._v("若它的右子树不为空,则所有右子树上的值均大于其根节点得值")]),t._v(" "),n("li",[t._v("它的左右子树也分别为二叉搜索树")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("如下图就是一棵典型的BST:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(624),alt:"img"}}),t._v(" "),n("h2",{attrs:{id:"_03、图解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、图解分析"}},[t._v("#")]),t._v(" 03、图解分析")]),t._v(" "),n("p",[t._v("明确了概念,我们进行分析。我们要删除BST的一个节点,首先需要"),n("strong",[t._v("找到该节点")]),t._v("。而找到之后,会出现三种情况。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("1、待删除的节点左子树为空,让待删除节点的右子树替代自己。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(625),alt:"img"}}),t._v(" "),n("p",[t._v("2、待删除的节点右子树为空,让待删除节点的左子树替代自己。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(626),alt:"img"}}),t._v(" "),n("p",[t._v("3、如果待删除的节点的左右子树都不为空。我们需要找到"),n("strong",[t._v("比当前节点小的最大节点(前驱)")]),t._v(",来替换自己")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(627),alt:"img"}}),t._v(" "),n("p",[t._v("或者"),n("strong",[t._v("比当前节点大的最小节点(后继)")]),t._v(",来替换自己。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(628),alt:"img"}}),t._v(" "),n("p",[t._v("分析完毕,我们一起看代码怎么实现吧。")]),t._v(" "),n("h2",{attrs:{id:"_04、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、go语言示例"}},[t._v("#")]),t._v(" 04、GO语言示例")]),t._v(" "),n("p",[t._v("这里我们给出通过"),n("strong",[t._v("后继节点")]),t._v("来替代自己的方案(请后面自行动手实现另一种方案):")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deleteNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" key "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" key "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deleteNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" root\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" key "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deleteNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" root\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//到这里意味已经查找到目标")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//右子树为空")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//左子树为空")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n minNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" minNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//查找后继")]),t._v("\n minNode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" minNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" minNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val\n root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deleteMinNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" root\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deleteMinNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n pRight "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right\n root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" pRight\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("deleteMinNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" root\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(629),alt:"img"}})])}),[],!1,null,null,null);s.default=r.exports},624:function(t,s,a){t.exports=a.p+"assets/img/1.03e01a60.jpg"},625:function(t,s,a){t.exports=a.p+"assets/img/2.c2d40091.jpg"},626:function(t,s,a){t.exports=a.p+"assets/img/3.7d36e53c.jpg"},627:function(t,s,a){t.exports=a.p+"assets/img/4.a8f0713b.jpg"},628:function(t,s,a){t.exports=a.p+"assets/img/5.15a64ae0.jpg"},629:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/37.f66ba3cd.js b/learning/.vuepress/dist/assets/js/37.f66ba3cd.js deleted file mode 100644 index dd4cf0e4..00000000 --- a/learning/.vuepress/dist/assets/js/37.f66ba3cd.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{1103:function(s,a,t){"use strict";t.r(a);var n=t(3),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,n=s._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天继续分享一道和位运算有关的题型,同样在难度上属于简单。我们还是从一道题开始吧")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("这道题,大家先想一想是用什么思路进行求解?")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第191题:位1的个数")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:00000000000000000000000000001011\n输出:3\n解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:00000000000000000000000010000000\n输出:1\n解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 3:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:11111111111111111111111111111101\n输出:31\n解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("提示:")])]),s._v(" "),n("ul",[n("li",[s._v("请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。")]),s._v(" "),n("li",[s._v("在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。")])]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("这道题仍然是**通过位运算来进行求解的非常典型的题目。**掩码是指使用一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("首先最容易想到的方法是:"),n("strong",[s._v("我们直接把目标数转化成二进制数,然后遍历每一位看看是不是1,如果是1就记录下来")]),s._v("。通过这种比较暴力的方式,来进行求解。比如Java中,int类型是32位,我们只要能计算出当前是第几位,就可以顺利进行求解。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("那如何计算当前是第几位呢,我们可以构造一个掩码来进行,说掩码可能大家听着有点懵逼,其实就是弄个1出来,1的二进制是这样:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:t(738),alt:"PNG"}}),s._v(" "),n("p",[s._v("我们只需要让这个掩码每次向左移动一位,然后与目标值求“&”,就可以判断目标值的当前位是不是1。比如目标值为21,21的二进制是这样:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:t(739),alt:"PNG"}}),s._v(" "),n("p",[s._v("然后每次移动掩码,来和当前位进行计算:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:t(740),alt:"PNG"}}),s._v(" "),n("p",[s._v("根据分析,完成代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("hammingWeight")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//初始化掩码为1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" mask "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("32")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" mask"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n result"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n mask "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mask "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:t(741),alt:"PNG"}}),s._v(" "),n("p",[s._v("注意:这里判断 n&mask 的时候,千万不要错写成 (n&mask) == 1,因为这里你对比的是十进制数。(恰好这个题我之前面试别人的时候问到过,对方就直接这么写了...)")]),s._v(" "),n("h2",{attrs:{id:"_03、继续优化"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、继续优化"}},[s._v("#")]),s._v(" 03、继续优化")]),s._v(" "),n("blockquote",[n("p",[s._v("位运算小技巧: 对于任意一个数,将 n 和 n-1 进行 & 运算,我们都可以把 n 中最低位的 1 变成 0")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("大家是否还记得昨天学会的技巧,昨天的题目我们通过计算 n & n-1 的值,来判断是否是 2 的幂。今天我们继续使用这个技巧,观察一下,"),n("strong",[s._v("对于任意一个数,将 n 和 n-1 进行 & 运算,我们都可以把 n 中最低位的 1 变成 0")]),s._v("。比如下面这两对数:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:t(742),alt:"PNG"}}),s._v(" "),n("p",[s._v("那下面就简单了,只需要不断进行这个操作就可以了。(翻CPP牌子,有没有好评的?)")]),s._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//c")]),s._v("\nclass Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\npublic"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("hammingWeight")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("uint32_t n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" count "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("p",[s._v("肯定有人又是看的一脸懵逼,我们拿 11 举个例子:(注意最后一位1变成0的过程)")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:t(743),alt:"PNG"}}),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);a.default=e.exports},738:function(s,a,t){s.exports=t.p+"assets/img/1.c6534889.jpg"},739:function(s,a){s.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAhIAAABSCAMAAAA2JM3IAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABiVBMVEX////29vbo6Oj7+/uzs7PFxcW+vr7CwsKKioqYmJisrKzf39/j4+OUlJQAAADLy8vm5uacnJx0dHTDw8Pv7++ZmZnX19fz8/Pv062EYUIpGAAhOGOEps7v///316VzQRgYYa3n//////fWmloYAAAYTYzO8////+/OklIhAAAAVaXvsmsAADlrps7v+//3472ETRgxfcb3////986UTRj/98aEMAAAABhapt7/871zGACMz///77VzJBhCcaXWsnsASZze///OjjExjs7/w3u9dQBSpucAUaXnplKbm5v//86MMAAAADH/36VSAAAAAITG//8Afcbc3Nz39/f//8aEAAAAAFKl4///46UAgsbGggBCmt7/25xCAAAAGITO///GfQD//96cRQCEx////+elVQBrsu9aqufemkIYhs4AYa2cSQD/661jAAAAAEqc2//3unMAGHu99//OhjkAJGOcz+/nvoRKGABKmt6lXRg5bbX/772EQRhCltbWroRjQSkpTWuUtt5zJAAlgZplAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAA6xJREFUeNrtnfdz0zAYhpWmoZCCKGGEPUKgQMseYZTRUiDsUWaZoey99+xfziXG1P6ukiMVayTv+0vs8z39NJ6zncSpGAuTYbF0xPbiB7NZyUGQvpOeNhsklABpjPS02SChBEhjpKfNBgklQBojPW02SCgB0hjpabNBQgmQxkhPmw0SSoA0Ror+RGcummmxva4uycHc9Bl5kM6RnbnuZpXoCDOzI5ZZHGmtzI7Mbnyye3qie8KzxBye00wBZGpknue1yabPEmIlupleCiBTI/N8rjYJJVqShBIgSaAESBIoAZIESoAkgRIgSaAESBIoAZIESoAkgRIgSaAESBIjSmTCzMvEMt+roWoXcipKLIjMbnyyi8Xo3gSDs4QHJC4cIEmgBEgSKAGSBEqAJIESIEmgBEgSV5VYuGgxX7J0mUaHbZCMLV+xchXTIB2sKVVCWjNNJUqry41nwNesVe2wDZKx3nXr+QaN6XGypkSJhJppKtFX7t+4iW3ewrduU+ywDZJt38G51vQ4WVOsRFLNFJXYuauyu/66Z2//PrUO2yAZG9h/4KDO9LhZU6xEUs0UlejjhwYbG0P8sFqHbZCNDOtMj5s1pfcSw3aUKB3hR8MGHBtU6bANMkhVY3ocrSlVovqflMiGKWZjOT55s0+cPPX3nHb6zNlzKh22QYZDdV580K+aCUpIaub5hcjsxid7ZCS6p6rExUuXrwRbVxWHygYZZIhfU54eR2tKlZDWVFDiX5q7cPioxCi/Lj7oV02pEtKa6d1LTDT7xs1bt/U6bI4Mcie8RPtfU6qEtGZ6StTu8rFgS3h/W3CHbOTeff5APFR+1ZQpIa+Z6juOh8HWI/5YqcM2yHCoxsRD5VfNBCUkNVP8XKLKnzQ+ga89FTlZcIhMHiq/ajqpxLPnL17WX1+VX79R67ANspFRjeu6ozUTbi+t3Euw0lv+7j0rffjIPyl22AaZPFR+1XRSCVb7HPw3rC+Tf74mGSobJPv6rQ5WvjNV0smaYiWSaqb6vETvj5/lyq/fgu/qZENlgxwY15weJ2tKvvYat6hEUvx6Tskv0tWnqhwcqnYhoQRIEigBkgQ/EwZJgp8JgyTBhQMkCZQASQIlQJJACZAkUAIkCZQASQIlQJJACZAkUAIkCZQASQIlQJJACZAklpXwaf3MdiGNrBOK1YTbJVNeTRhrjrcWqbDmuEgJhZXsQbYW6WmzQUIJkMZIT5sNEkqANEZ62myQUAKkMdLTZoNMjfwDt5iZcGPFT0QAAAAASUVORK5CYII="},740:function(s,a,t){s.exports=t.p+"assets/img/3.83aaac9c.jpg"},741:function(s,a){s.exports="data:image/jpeg;base64,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"},742:function(s,a,t){s.exports=t.p+"assets/img/5.faa33f79.jpg"},743:function(s,a,t){s.exports=t.p+"assets/img/6.983baa82.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/38.28f444ad.js b/learning/.vuepress/dist/assets/js/38.28f444ad.js deleted file mode 100644 index a949a937..00000000 --- a/learning/.vuepress/dist/assets/js/38.28f444ad.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{1108:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("今天继续为大家讲解二分法系列篇 - 旋转排序数组最小值Ⅱ(进阶版)。话不多说,直接看题:")]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("昨天为大家讲解了元素不可重复的版本,那如果元素重复该如何处理呢?")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第154题:旋转排序数组最小值Ⅱ")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。 注意数组中可能存在重复的元素。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1,3,5]\n输出: 1\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [2,2,2,0,1]\n输出: 0\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("ul",[n("li",[t._v("这道题是 "),n("RouterLink",{attrs:{to:"/1.9.二分法系列/1.9/904.html"}},[t._v("旋转排序数组中的最小值(153)")]),t._v(" 的延伸题目。")],1),t._v(" "),n("li",[t._v("允许重复会影响算法的时间复杂度吗?会如何影响,为什么?")])]),t._v(" "),n("h2",{attrs:{id:"_02、题目回顾"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目回顾"}},[t._v("#")]),t._v(" 02、题目回顾")]),t._v(" "),n("blockquote",[n("p",[t._v("之前我也说过,通过改变题中条件,使得题目难度上升的做法。在算法题目的设计中,是一种非常常见的手段。本题就是这样,从中等变成了困难。")])]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(759),alt:"PNG"}}),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(760),alt:"PNG"}}),t._v(" "),n("p",[t._v("在讲解本题之前,首先要对昨天的题目进行一个答疑。昨天有人问我为什么题目中讲的是与left进行比较,但是最后代码中写的时候变成了和right比较。这个确实是我讲的时候讲忘了,但是这其实是一个思维转化的问题:因为在旋转之前的原数组是一个递增序列,那一定是左边的数小,右边的数大,而我们要找的是最小值,所以比较偏向左找。那如果和left进行比较,其实也是完全ok的,那我们的思路就变成了找到偏右的最大值,进而向右再移动一位,自然也就是最小值。如果不能理解的话,可以回顾一下昨天的文章:")]),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.9.二分法系列/1.9/904.html"}},[t._v("旋转排序数组中的最小值(153)")])],1),t._v(" "),n("p",[t._v("并且我这里对昨天的题目,补上一个和left对比的版本,供大家参考学习(昨天没有给Go的示例,所以今天补一个Go的)")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("上面的代码有两处需要说明,第一:mid中最后加1的目的,是为了使得mid更加靠近right,增加容错性。当然,你写到里边也是可以的,甚至更好。我怕大家看不懂,所以写在外面了。第二:最后一行代码取模,是需要考虑最大值刚好在最右边的情况。")]),t._v(" "),n("h2",{attrs:{id:"_03、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题解分析"}},[t._v("#")]),t._v(" 03、题解分析")]),t._v(" "),n("blockquote",[n("p",[t._v("二分查找的本质,其实就是通过收敛查找空间,找到目标值的一种方式。请大家认真阅读这句话。不管是采用不同的mid定义方式,又或者是不一样的while条件,统统都是为了这个目的。在完成这个目的的基础上,我们才去考虑如何减少冗余代码,减少循环次数等等,完成进一步的优化。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("现在再来看今天的题目。相对比昨天题目而言,其实只是多了"),n("strong",[t._v("nums[mid] 等于 nums[right] 时的额外处理")]),t._v("。(当然, 如果是和left进行比较,就是nums[mid]等于nums[left])")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("对比一下下面两个图:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(761),alt:"PNG"}}),t._v(" "),n("center",[t._v("(无重复) ")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(762),alt:"PNG"}}),t._v(" "),n("center",[t._v("(有重复) ")]),t._v(" "),n("p",[t._v("其实直接就可以给出代码了:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findMin")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n right"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("p",[t._v("如果我们再对比一下代码的差异,就会非常的明显:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(763),alt:"PNG"}}),t._v(" "),n("center",[t._v("(左边是有重复,右边是无重复) ")]),t._v(" "),n("p",[t._v("可以看到在 nums[mid] 等于 nums[right] 时的情况下,我们只多了一个 right-1 的操作。这里需要额外说明的是,为什么要这样做?我看leetcode上的题解,这块很多都是长篇大论,其实没那么复杂,一句话就可以给你讲明白,看看下面这个!")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(764),alt:"PNG"}}),t._v(" "),n("p",[t._v("因为 mid 和 right 相等时,最小值既可能在左边,又可能在右边,所以此时自然二分思想作废,咱们就砍掉一个右边界。说白了,就是"),n("strong",[t._v("让子弹再飞一会儿")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])],1)}),[],!1,null,null,null);s.default=e.exports},759:function(t,s,a){t.exports=a.p+"assets/img/1.f32a0445.jpg"},760:function(t,s,a){t.exports=a.p+"assets/img/2.90adfc88.jpg"},761:function(t,s,a){t.exports=a.p+"assets/img/3.aacfd3e5.jpg"},762:function(t,s,a){t.exports=a.p+"assets/img/4.6b5d3d0b.jpg"},763:function(t,s,a){t.exports=a.p+"assets/img/5.807d5b53.jpg"},764:function(t,s,a){t.exports=a.p+"assets/img/6.919e5b4b.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/39.a4ecc565.js b/learning/.vuepress/dist/assets/js/39.a4ecc565.js deleted file mode 100644 index 158c4526..00000000 --- a/learning/.vuepress/dist/assets/js/39.a4ecc565.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{1115:function(s,a,t){"use strict";t.r(a);var A=t(3),n=Object(A.a)({},(function(){var s=this,a=s.$createElement,A=s._self._c||a;return A("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[A("blockquote",[A("p",[s._v("坐汽车、火车、飞机的时候,大家不知道有没有想过这样一个问题?如果自己的票弄丢了,那么自己屁股随机这么一蹲,坐到自己位置的概率有多大?今天就为大家分析一下这个问题。")])]),s._v(" "),A("h2",{attrs:{id:"_01、题目分析"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),A("table",[A("thead",[A("tr",[A("th",[s._v("第1227题:飞机座位分配概率")])])]),s._v(" "),A("tbody",[A("tr",[A("td",[s._v("有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。")])])])]),s._v(" "),A("p",[s._v("剩下的乘客将会:")]),s._v(" "),A("ul",[A("li",[s._v("如果他们自己的座位还空着,就坐到自己的座位上,")]),s._v(" "),A("li",[s._v("当他们自己的座位被占用时,随机选择其他座位")])]),s._v(" "),A("p",[s._v("第 n 位乘客坐在自己的座位上的概率是多少?")]),s._v(" "),A("br"),s._v(" "),A("p",[A("strong",[s._v("示例 1:")])]),s._v(" "),A("div",{staticClass:"language- line-numbers-mode"},[A("pre",{pre:!0,attrs:{class:"language-text"}},[A("code",[s._v("输入:n = 1\n输出:1.00000\n解释:第一个人只会坐在自己的位置上。\n")])]),s._v(" "),A("div",{staticClass:"line-numbers-wrapper"},[A("span",{staticClass:"line-number"},[s._v("1")]),A("br"),A("span",{staticClass:"line-number"},[s._v("2")]),A("br"),A("span",{staticClass:"line-number"},[s._v("3")]),A("br")])]),A("p",[A("strong",[s._v("示例 2:")])]),s._v(" "),A("div",{staticClass:"language- line-numbers-mode"},[A("pre",{pre:!0,attrs:{class:"language-text"}},[A("code",[s._v("输入: n = 2\n输出: 0.50000\n解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。\n")])]),s._v(" "),A("div",{staticClass:"line-numbers-wrapper"},[A("span",{staticClass:"line-number"},[s._v("1")]),A("br"),A("span",{staticClass:"line-number"},[s._v("2")]),A("br"),A("span",{staticClass:"line-number"},[s._v("3")]),A("br")])]),A("h2",{attrs:{id:"_02、题目图解"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[s._v("#")]),s._v(" 02、题目图解")]),s._v(" "),A("p",[s._v("对于这道题,不卖关子,直接分析:")]),s._v(" "),A("p",[s._v("一个位置一个人,一屁股蹲下,概率100%,这没啥可说的。")]),s._v(" "),A("img",{staticStyle:{zoom:"67%"},attrs:{src:t(785),alt:"PNG"}}),s._v(" "),A("p",[s._v("两个位置两个人,第一个人已经坐下,要么坐对了,要么坐错了。所以第二个人坐在自己位置上的概率是50%。")]),s._v(" "),A("img",{staticStyle:{zoom:"67%"},attrs:{src:t(786),alt:"PNG"}}),s._v(" "),A("p",[s._v("重点来了,三个位置三个人,第一个一屁股坐下,有三种坐法。"),A("img",{staticStyle:{zoom:"67%"},attrs:{src:t(787),alt:"PNG"}})]),s._v(" "),A("p",[s._v("如果恰好"),A("strong",[s._v("第一个人坐到了自己的座位")]),s._v("上(1/3),那这种情况下,第二个人也就可以直接坐在自己的座位上,第三个人一样。所以此时第三人坐在自己座位上的可能性是 100%。")]),s._v(" "),A("img",{staticStyle:{zoom:"67%"},attrs:{src:t(788),alt:"PNG"}}),s._v(" "),A("p",[s._v("如果"),A("strong",[s._v("第一个人占掉了第二个人的位置")]),s._v("(1/3)**。**此时第二人上来之后,要么坐在第一人的位置上,要么坐在第三人的位置上。(1/2)所以,在这种情况下,第三人的座位被占的可能性是 1/3*1/2=1/6。")]),s._v(" "),A("img",{staticStyle:{zoom:"67%"},attrs:{src:t(789),alt:"PNG"}}),s._v(" "),A("p",[s._v("那假如第一人直接一屁股坐在第三人的座位上,此时第三人的座位被占的可能性就是第一人选择第三人座位的可能性。(1/3)")]),s._v(" "),A("img",{staticStyle:{zoom:"67%"},attrs:{src:t(790),alt:"PNG"}}),s._v(" "),A("p",[s._v("所以,如果三个座位三个人,第三个人坐到自己位置上的概率就是:1-1/6-1/3=1/2。当然,也可以通过 1/3+1/6=1/2 来正向计算。")]),s._v(" "),A("br"),s._v(" "),A("p",[s._v("而对于 n>3 的情况,我们参照 3 个座位时进行分析:")]),s._v(" "),A("ul",[A("li",[s._v("如果第 1个乘客选择第 1 个座位,那么第n个人选择到第 n 个座位的可能性就是 100%。(1/n)")]),s._v(" "),A("li",[s._v("如果第1个乘客选择了第n个座位,那么第 n 个人选择第 n 个座位的可能性就是0。(0)")]),s._v(" "),A("li",[A("strong",[s._v("而对于第 1 个乘客选择除了第一个和第 n 个座位之外的座位k (1=3 的情况,等同于 n=2,全部的概率都为 1/2")]),s._v("。")]),s._v(" "),A("br"),s._v(" "),A("p",[s._v("如果还是不能理解的小伙伴,可以这样想。"),A("strong",[s._v("登机时座位被占的乘客 ,其实相当于和上一位坐错的乘客交换了身份")]),s._v("。直到完成终止条件(坐对位置 或者 坐到最后一个位置),否则该交换将一直进行下去。所以第n位乘客,坐到第n个位置,自然还是 1/2。")]),s._v(" "),A("h2",{attrs:{id:"_03、go语言示例"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[s._v("#")]),s._v(" 03、Go语言示例")]),s._v(" "),A("p",[s._v("根据分析,完成代码:")]),s._v(" "),A("div",{staticClass:"language-go line-numbers-mode"},[A("pre",{pre:!0,attrs:{class:"language-go"}},[A("code",[A("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token function"}},[s._v("nthPersonGetsNthSeat")]),A("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),A("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),A("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("float64")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),A("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" n "),A("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),A("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t"),A("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),A("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),A("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.5")]),s._v("\n"),A("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),A("div",{staticClass:"line-numbers-wrapper"},[A("span",{staticClass:"line-number"},[s._v("1")]),A("br"),A("span",{staticClass:"line-number"},[s._v("2")]),A("br"),A("span",{staticClass:"line-number"},[s._v("3")]),A("br"),A("span",{staticClass:"line-number"},[s._v("4")]),A("br"),A("span",{staticClass:"line-number"},[s._v("5")]),A("br"),A("span",{staticClass:"line-number"},[s._v("6")]),A("br")])]),A("br"),s._v(" "),A("blockquote",[A("p",[s._v("小伙伴都看懂了吗?")]),s._v(" "),A("p",[s._v("这里留下一个疑问,假如共有200个座位,平均有多少人没有坐到自己的位置呢?")]),s._v(" "),A("p",[s._v("评论区留下你的想法吧!")])])])}),[],!1,null,null,null);a.default=n.exports},785:function(s,a){s.exports="data:image/png;base64,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"},786:function(s,a,t){s.exports=t.p+"assets/img/2.2441502e.png"},787:function(s,a,t){s.exports=t.p+"assets/img/3.49d6ed2b.jpeg"},788:function(s,a,t){s.exports=t.p+"assets/img/4.2edb2d7e.png"},789:function(s,a,t){s.exports=t.p+"assets/img/5.865aaf84.png"},790:function(s,a,t){s.exports=t.p+"assets/img/6.2aa8b15e.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/4.54b78bf5.js b/learning/.vuepress/dist/assets/js/4.54b78bf5.js deleted file mode 100644 index 9f7be7af..00000000 --- a/learning/.vuepress/dist/assets/js/4.54b78bf5.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{1036:function(t,e,a){"use strict";a.r(e);var n=a(412),r=a(363),o=a(361),s={mixins:[o.a],components:{NavLink:n.a,ModuleTransition:r.a},computed:{actionLink:function(){return{link:this.$frontmatter.actionLink,text:this.$frontmatter.actionText}},heroImageStyle:function(){return this.$frontmatter.heroImageStyle||{maxHeight:"200px",margin:"6rem auto 1.5rem"}}}},i=(a(447),a(3)),c=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"home"},[a("div",{staticClass:"hero"},[a("ModuleTransition",[t.recoShowModule&&t.$frontmatter.heroImage?a("img",{style:t.heroImageStyle||{},attrs:{src:t.$withBase(t.$frontmatter.heroImage),alt:"hero"}}):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.04"}},[t.recoShowModule&&null!==t.$frontmatter.heroText?a("h1",[t._v(t._s(t.$frontmatter.heroText||t.$title||"vuePress-theme-reco"))]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&null!==t.$frontmatter.tagline?a("p",{staticClass:"description"},[t._v("\n "+t._s(t.$frontmatter.tagline||t.$description||"Welcome to your vuePress-theme-reco site")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[t.recoShowModule&&t.$frontmatter.actionText&&t.$frontmatter.actionLink?a("p",{staticClass:"action"},[a("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()])],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.24"}},[t.recoShowModule&&t.$frontmatter.features&&t.$frontmatter.features.length?a("div",{staticClass:"features"},t._l(t.$frontmatter.features,(function(e,n){return a("div",{key:n,staticClass:"feature"},[a("h2",[t._v(t._s(e.title))]),t._v(" "),a("p",[t._v(t._s(e.details))])])})),0):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.32"}},[a("Content",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-center",attrs:{custom:""}})],1)],1)}),[],!1,null,null,null).exports,l=(a(17),a(50),a(45)),u=a(381),h=(a(32),a(415)),f=a.n(h),g=a(362),d={data:function(){return{popupWindowStyle:{}}},computed:{dataAddColor:function(){var t=this.$themeConfig.friendLink;return t&&t.length>0?t=t.map((function(t){return Object(l.a)(Object(l.a)({},t),{},{color:Object(g.a)()})})):[]}},methods:{getMd5:function(t){return f()(t)},showDetail:function(t){var e=this,a=t.target,n=a.querySelector(".popup-window-wrapper"),r=a.querySelector(".popup-window");n.style.display="block";var o=a.clientWidth,s=r.clientWidth,i=r.clientHeight;this.popupWindowStyle={left:(o-s)/2+"px",top:-i+"px"},this.$nextTick((function(){e._adjustPosition(a.querySelector(".popup-window"))}))},hideDetail:function(t){t.target.querySelector(".popup-window-wrapper").style.display="none"},getImgUrl:function(t){var e=t.logo,a=t.email;return e&&/^http/.test(e)?e:e&&!/^http/.test(e)?this.$withBase(e):"//1.gravatar.com/avatar/".concat(this.getMd5(a||""),"?s=50&d=mm&r=x")},_adjustPosition:function(t){var e=document.body.offsetWidth,a=t.getBoundingClientRect(),n=e-(a.x+a.width);if(n<0){var r=t.offsetLeft;this.popupWindowStyle=Object(l.a)(Object(l.a)({},this.popupWindowStyle),{},{left:r+n+"px"})}}}},m=(a(449),Object(i.a)(d,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"friend-link-wrapper"},t._l(t.dataAddColor,(function(e,n){return a("div",{key:n,staticClass:"friend-link-item",attrs:{target:"_blank"},on:{mouseenter:function(e){return t.showDetail(e)},mouseleave:function(e){return t.hideDetail(e)}}},[a("span",{staticClass:"list-style",style:{backgroundColor:e.color}}),t._v("\n "+t._s(e.title)+"\n "),a("transition",{attrs:{name:"fade"}},[a("div",{staticClass:"popup-window-wrapper"},[a("div",{ref:"popupWindow",refInFor:!0,staticClass:"popup-window",style:t.popupWindowStyle},[a("div",{staticClass:"logo"},[a("img",{attrs:{src:t.getImgUrl(e)}})]),t._v(" "),a("div",{staticClass:"info"},[a("div",{staticClass:"title"},[a("h4",[t._v(t._s(e.title))]),t._v(" "),a("a",{staticClass:"btn-go",style:{backgroundColor:e.color},attrs:{href:e.link,target:"_blank"}},[t._v("GO")])]),t._v(" "),e.desc?a("p",[t._v(t._s(e.desc))]):t._e()])])])])],1)})),0)}),[],!1,null,"48a8cd70",null).exports),p=a(376),v=a(372),_=a(419),C={mixins:[v.a,o.a],components:{NoteAbstract:p.a,TagList:u.a,FriendLink:m,ModuleTransition:r.a,PersonalInfo:_.a},data:function(){return{recoShow:!1,currentPage:1,tags:[]}},computed:{homeBlogCfg:function(){return this.$recoLocals.homeBlog},actionLink:function(){var t=this.$frontmatter;return{link:t.actionLink,text:t.actionText}},heroImageStyle:function(){return this.$frontmatter.heroImageStyle||{maxHeight:"200px",margin:"6rem auto 1.5rem"}},bgImageStyle:function(){var t={height:"350px",textAlign:"center",overflow:"hidden"},e=this.$frontmatter.bgImageStyle;return e?Object(l.a)(Object(l.a)({},t),e):t},heroHeight:function(){return document.querySelector(".hero").clientHeight}},mounted:function(){this.recoShow=!0,this._setPage(this._getStoragePage())},methods:{getCurrentPage:function(t){var e=this;this._setPage(t),setTimeout((function(){window.scrollTo(0,e.heroHeight)}),100)},getPages:function(){var t=this.$site.pages;t=t.filter((function(t){var e=t.frontmatter,a=e.home,n=e.date;return!(1==a||void 0===n)})),this.pages=0==t.length?[]:t},getPagesByTags:function(t){this.$router.push({path:t.path})},_setPage:function(t){this.currentPage=t,this.$page.currentPage=t,this._setStoragePage(t)},getOneColor:g.a}},b=(a(450),Object(i.a)(C,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"home-blog"},[n("div",{staticClass:"hero",style:Object.assign({},t.bgImageStyle)},[n("div",{staticClass:"mask",style:{background:"url("+(t.$frontmatter.bgImage?t.$withBase(t.$frontmatter.bgImage):a(448))+") center/cover no-repeat"}}),t._v(" "),n("ModuleTransition",[t.recoShowModule&&t.$frontmatter.heroImage?n("img",{style:t.heroImageStyle||{},attrs:{src:t.$withBase(t.$frontmatter.heroImage),alt:"hero"}}):t._e()]),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.04"}},[t.recoShowModule&&null!==t.$frontmatter.heroText?n("h1",[t._v("\n "+t._s(t.$frontmatter.heroText||t.$title||"vuePress-theme-reco")+"\n ")]):t._e()]),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&null!==t.$frontmatter.tagline?n("p",{staticClass:"description"},[t._v("\n "+t._s(t.$frontmatter.tagline||t.$description||"Welcome to your vuePress-theme-reco site")+"\n ")]):t._e()])],1),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.16"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-blog-wrapper"},[n("div",{staticClass:"blog-list"},[n("note-abstract",{attrs:{data:t.$recoPosts,currentPage:t.currentPage}}),t._v(" "),n("pagation",{staticClass:"pagation",attrs:{total:t.$recoPosts.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],1),t._v(" "),n("div",{staticClass:"info-wrapper"},[n("PersonalInfo"),t._v(" "),n("h4",[n("i",{staticClass:"iconfont reco-category"}),t._v(" "+t._s(t.homeBlogCfg.category))]),t._v(" "),n("ul",{staticClass:"category-wrapper"},t._l(this.$categories.list,(function(e,a){return n("li",{key:a,staticClass:"category-item"},[n("router-link",{attrs:{to:e.path}},[n("span",{staticClass:"category-name"},[t._v(t._s(e.name))]),t._v(" "),n("span",{staticClass:"post-num",style:{backgroundColor:t.getOneColor()}},[t._v(t._s(e.pages.length))])])],1)})),0),t._v(" "),n("hr"),t._v(" "),0!==t.$tags.list.length?n("h4",[n("i",{staticClass:"iconfont reco-tag"}),t._v(" "+t._s(t.homeBlogCfg.tag))]):t._e(),t._v(" "),n("TagList",{on:{getCurrentTag:t.getPagesByTags}}),t._v(" "),t.$themeConfig.friendLink&&0!==t.$themeConfig.friendLink.length?n("h4",[n("i",{staticClass:"iconfont reco-friend"}),t._v(" "+t._s(t.homeBlogCfg.friendLink))]):t._e(),t._v(" "),n("FriendLink")],1)])]),t._v(" "),n("ModuleTransition",{attrs:{delay:"0.24"}},[n("Content",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-center",attrs:{custom:""}})],1)],1)}),[],!1,null,null,null).exports),w=(a(26),a(30),a(364)),$=a(49);function y(t,e,a){var n=[];!function t(e,a){for(var n=0,r=e.length;n0||a>0||r>0?Object(n.d)(t):Object(n.d)(t,"yyyy-MM-dd")}},methods:{goTags:function(t){this.$router.push({path:"/tags/".concat(t,"/")})}}},o=(a(369),a(3)),s=Object(o.a)(r,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title?a("i",{staticClass:"iconfont reco-account"},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("i",{staticClass:"iconfont reco-date"},[a("span",[t._v(t._s(t._f("formatDateValue")(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("i",{staticClass:"iconfont reco-eye"},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("i",{staticClass:"iconfont reco-tag tags"},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return t.goTags(e)}}},[t._v("\n "+t._s(e)+"\n ")])})),0):t._e()])}),[],!1,null,"484a899e",null);e.a=s.exports},366:function(t,e,a){var n=a(0),r=a(367);n({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},367:function(t,e,a){"use strict";var n=a(16),r=a(31),o=a(11),s=a(27),i=a(20),c=Math.min,l=[].lastIndexOf,u=!!l&&1/[1].lastIndexOf(1,-0)<0,h=s("lastIndexOf"),f=i("indexOf",{ACCESSORS:!0,1:0}),g=u||!h||!f;t.exports=g?function(t){if(u)return l.apply(this,arguments)||0;var e=n(this),a=o(e.length),s=a-1;for(arguments.length>1&&(s=c(s,r(arguments[1]))),s<0&&(s=a+s);s>=0;s--)if(s in e&&e[s]===t)return s||0;return-1}:l},368:function(t,e,a){"use strict";var n=a(7),r=a(4),o=a(107),s=a(21),i=a(5),c=a(34),l=a(177),u=a(35),h=a(1),f=a(52),g=a(51).f,d=a(33).f,m=a(8).f,p=a(378).trim,v=r.Number,_=v.prototype,C="Number"==c(f(_)),b=function(t){var e,a,n,r,o,s,i,c,l=u(t,!1);if("string"==typeof l&&l.length>2)if(43===(e=(l=p(l)).charCodeAt(0))||45===e){if(88===(a=l.charCodeAt(2))||120===a)return NaN}else if(48===e){switch(l.charCodeAt(1)){case 66:case 98:n=2,r=49;break;case 79:case 111:n=8,r=55;break;default:return+l}for(s=(o=l.slice(2)).length,i=0;ir)return NaN;return parseInt(o,n)}return+l};if(o("Number",!v(" 0o1")||!v("0b1")||v("+0x1"))){for(var w,$=function(t){var e=arguments.length<1?0:t,a=this;return a instanceof $&&(C?h((function(){_.valueOf.call(a)})):"Number"!=c(a))?l(new v(b(e)),a,$):b(e)},y=n?g(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),S=0;y.length>S;S++)i(v,w=y[S])&&!i($,w)&&m($,w,d(v,w));$.prototype=_,_.constructor=$,s(r,"Number",$)}},369:function(t,e,a){"use strict";var n=a(357);a.n(n).a},370:function(t,e,a){"use strict";var n=a(358);a.n(n).a},371:function(t,e,a){"use strict";var n=a(359);a.n(n).a},372:function(t,e,a){"use strict";a(377);e.a={methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",{page:1,path:""}),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}},374:function(t,e,a){},375:function(t,e,a){},376:function(t,e,a){"use strict";a(25);var n={components:{PageInfo:a(364).a},props:["item","currentPage","currentTag"]},r=(a(370),a(3)),o={components:{NoteAbstractItem:Object(r.a)(n,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item"},[t.item.frontmatter.sticky?a("i",{staticClass:"iconfont reco-sticky"}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("i",{staticClass:"iconfont reco-lock"}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("hr",{staticClass:"hr"}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"28f76ce9",null).exports},props:["data","currentPage","currentTag"],computed:{currentPageData:function(){var t=10*this.currentPage-10,e=10*this.currentPage;return this.data.slice(t,e)}}},s=(a(371),Object(r.a)(o,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),1)}),[],!1,null,"b014bc36",null));e.a=s.exports},379:function(t,e,a){"use strict";var n=a(360);a.n(n).a},381:function(t,e,a){"use strict";a(106);var n=a(22),r=a(362),o={props:{currentTag:{type:String,default:""}},computed:{tags:function(){return[{name:"全部",path:"/tag/"}].concat(Object(n.a)(this.$tags.list))}},methods:{tagClick:function(t){this.$emit("getCurrentTag",t)},getOneColor:r.a}},s=(a(379),a(3)),i=Object(s.a)(o,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,n){return a("span",{key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"36b9f66a",null);e.a=i.exports},401:function(t,e,a){},402:function(t,e,a){},403:function(t,e,a){},404:function(t,e,a){},405:function(t,e,a){},406:function(t,e,a){"use strict";var n=a(374);a.n(n).a},407:function(t,e,a){"use strict";var n=a(375);a.n(n).a},447:function(t,e,a){"use strict";var n=a(401);a.n(n).a},448:function(t,e,a){t.exports=a.p+"assets/img/home-bg.7b267d7c.jpg"},449:function(t,e,a){"use strict";var n=a(402);a.n(n).a},450:function(t,e,a){"use strict";var n=a(403);a.n(n).a},451:function(t,e,a){"use strict";var n=a(404);a.n(n).a},452:function(t){t.exports=JSON.parse('{"a":"1.4.5"}')},453:function(t,e,a){"use strict";var n=a(405);a.n(n).a}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/40.b4710b92.js b/learning/.vuepress/dist/assets/js/40.b4710b92.js deleted file mode 100644 index 9988c3a2..00000000 --- a/learning/.vuepress/dist/assets/js/40.b4710b92.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{1123:function(t,a,s){"use strict";s.r(a);var n=s(3),r=Object(n.a)({},(function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("上一篇为大家分享了不同路径的DP解法之后,有很多小伙伴后台给我留言,说直接用公式法一步就可以得到答案。给你们点个赞!确实是这样,我没有用公式法的原因,是因为我的目的是想层层推进难度为大家分析不同路径这一类题型。后面我会单独拉出一系列,专门为大家讲解公式法一类的题目。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("如果还没有学习上一篇内容,建议先进行学习:")]),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.99/13.html"}},[t._v("不同路径")])],1),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("多了一点障碍物之后,题目会有何不同?(这可是困难题目哦~")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("不同路径 - 障碍物")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("一个机器人位于一个 m x n 网格的左上角,起始点在下图中标记为“Start”。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,在下图中标记为“Finish”。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 问总共有多少条不同的路径?")])])])]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(828),alt:"PNG"}}),t._v(" "),n("p",[t._v("网格中的障碍物和空位置分别用 1 和 0 来表示。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("**说明:**m 和 n 的值均不超过 100。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:\n[\n [0,0,0],\n [0,1,0],\n [0,0,0]\n]\n输出: 2\n\n解释:\n3x3 网格的正中间有一个障碍物。\n从左上角到右下角一共有 2 条不同的路径:\n\\1. 向右 -> 向右 -> 向下 -> 向下\n\\2. 向下 -> 向下 -> 向右 -> 向右\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("因为只是多了一点障碍物,题目的本质并没什么不同,所以直接进行分析即可。")])]),t._v(" "),n("p",[t._v("首先我们还是定义状态,"),n("strong",[t._v("用****DP[i][j]表示到达i行j列的最多路径")]),t._v("。同时,因为第0行和第0列都只有一条路径,所以需要初始化为1。但有一点不一样的就是:"),n("strong",[t._v("如果在0行0列中遇到障碍物,后面的就都是0,意为此路不通")]),t._v("。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(829),alt:"PNG"}}),t._v(" "),n("p",[t._v("完成了初始化,下面就是状态转移方程。和没有障碍物的相比没什么特别的,仍然是dp[i][j] = dp[i-1][j] dp[i][j-1]。唯一需要处理的是:"),n("strong",[t._v("如果恰好[i][j]位置上有障碍物,则dp[i][j]为0")]),t._v("。比如下图,有dp[1][2]为0。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(830),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据分析,得出代码:(今天翻java牌子)")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//JAVA ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("uniquePathsWithObstacles")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" dp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(831),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、代码优化"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、代码优化"}},[t._v("#")]),t._v(" 03、代码优化")]),t._v(" "),n("blockquote",[n("p",[t._v("不啰嗦,我们当然要继续"),n("strong",[t._v("压缩内存")]),t._v("。")])]),t._v(" "),n("p",[t._v("为了大家更好的理解代码,我们还是绘图说明。假若我们的网格如下,其中黑色表示障碍物。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:s(832),alt:"PNG"}}),t._v(" "),n("p",[t._v("因为计算每一个格子能到达的最多路径,只需要左边和上边的元素,所以我们定义状态"),n("strong",[t._v("dp[j]表示到达当前行第j位置的最多路径")]),t._v("。这里有一个需要额外说的,就是我们把dp[0]初始化为1,因为在到达第一行的第一个元素时,路径只有一个。下面的图,左边的表示当前网格,右边的是指网格中对应dp数组的值。")]),t._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:s(833),alt:"PNG"}}),t._v(" "),n("p",[t._v("根据分析,得出代码:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//JAVA ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("uniquePathsWithObstacles")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" dp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" ints "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" obstacleGrid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ints"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br")])]),n("br"),t._v(" "),n("p",[t._v("**思考:**上面的代码其实还可以优化内存,大家想想怎么做")])])}),[],!1,null,null,null);a.default=r.exports},828:function(t,a,s){t.exports=s.p+"assets/img/1.4a84211e.jpg"},829:function(t,a){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAjUAAAEBCAMAAAC3yKSMAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACvlBMVEX////u7u79/f37+/v5+fmrq6ugoKCqqqqoqKinp6dzc3Nra2uDiY97gYe7wce6wMa4vsS3vcN9gYV2en7v7++Xl5cAAAASGR8xQ1QfKzVoaGihoaFnZ2dBQUFTWmBFWGksOENCQkJvb29ycnJmZmZxcXF4f4VHWWtkdoc0P0pwcHCjo6Nubm6enp5tbW3/36VSAACEx/+RwNzm9Pv/+/fm08GRdof3162EYTkhAAAAABgpQWOMtt73////78aEOACRy+z6///17uzm6vT6/f/66tD3x4Q5AAAAGCladYyMfWtKJAA5gsb/361rOABkn9jr//////fXtZdkksHX9P/rz6b/871zGAAAGFql3///+96lXRh7vvf/9+e9ilIYGACv3/v638FkueT/8tygdofenkpKnt7/25xKAAAAYa3v///GggAAJFKMvue9ggBkdrn///vcvIdkdsXc+f////TSqIf//+etXQAAAEKc2////96cRQAAAGu17//Gikpznsbn+/9kdtDm/////+/IiYdkdqbN7v/my4f//8aEAAAAAHvG//+9dQCdnZ1ks+D1/////+zDdofD6v/12rn/46UAGITO//9aqudsbGz/9uCqdoeq3Pf13L0AVaXn///eolJSpufnplLXsYcAAFqt5/94vORkqtzw///XuZ7r0ar/67VrGABzuvf68OwAACFKaXtkdpebwtzv0619gogQFRtdYmiFipA6PUELDhI/Qkd1dXU3Oj0WHychKTI5RVEYHSI0NDQvLy8wMDAzMzNLS0txeH4fKjUtLS1GWGgsOEJlZWVAQECzusBIWmszP0myub+wt72vtrx8gIUiLjoyPko6RlIYHiM2NjZ5eXkxMTE1NTUyMjJNTU1rb3NxdXljY2M/Pz+ysrJaWlpgYGBfX19eXl49PT0iIiIrKysqKiqoPZYqAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAACYxJREFUeNrt3PV3HFUDxvEhSYt7GEJb5IUXCF6cBg3S4hAo7u4v7u7eIgWKS4u7v4IWd3fpC0X/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"},830:function(t,a){t.exports="data:image/jpeg;base64,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"},831:function(t,a){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAk4AAABkCAAAAABVmuBQAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADsQAAA7EAZUrDhsAABsYSURBVHja7V1tdBPXmX5kO7bHcWAsMMERJMiIxMYEUDAlAdOS4pKkkdI2AScnIaHJqYJOj/fYu3tYw9lzutlf2CfbE7R1Uxl1mzjQHL7SbiPlCwRNip3gIFCgVqzEwkPAwsY28hgcj+3I1v6YD82MZmSLqGSbzvMH686dmXvvPPe9731neB/dODRoSBcyvukGaPg2QaOThjRCo5OGNEKjk4Y0QqOThjRCo5OGNEKjk4Y0QqOThjRCo5OGNEKjk4Y0QqOThjRCo5OGNEKjk4Y0QqOThjQi65tugIa/CWLDyNfd+NveIDoNvdaOctuN797fF5hjLYMo3LAqGwDlYPhiq0Vc5S90xu0P360DgNi5tz6P5pX98DYAiAX/dDFKrl+XDQAI//cD67+BHtwYOgVevfoN9O3vDV/8ZhBA394220y1KmFnHzB5/uX7nsoCoofejwEjJ89UVegQ8765sibnr6+Fn84CEH135qpvogtx38m/gwZA7/CLjvpdKVyK2k6pHKH3pplN/q1+WYlrq4c7wv0B5sVUGi9u7Q6/YrnrRUZWktiMxBL168kx4Bpk/+hsVvtEduA3fQCA2EeHARx+PwYAGN/nA8KHb99EZCx7sK0NADrObshXHzeq1jNFW1xTVVBBUutEHyhjjrq5H6ZqAi6f+LDYCE+BgrVHmGlXnho+vTH+g2kMAdamHr8TgGkX0cMWB8Mbv8Yd/M6ETpY7g+bUr2C1UOAa63FLKujrSMnv4/2YsbkMbQeZYHCp8vge78eMp5eMv3Uk9sHKQvqjmG71ozf37emMHinL+/zqWgLAwlzfymww75qWKTSJ8ZabASBAVMi7CXCPmK1IeMuMuA7I6TQofuoH9Y8RFkmfym0A/AfqSIBpBOiGiMK4JKLMGjlyPa1LBHtHoC7+UHLYcS/q5dpRxNepTxgmqmnrdEeJvRjTGC8pMflSoRP0dSSYRiBczA2PeCjphog+R1KdCSHz6aXAmpFDE2eXKl7xywAyq5Yi90eDJ+nzhd1XsPTJLNz6s1/29V02nkcRAORnR0azcTpsz0483eUDfNDXoTVSBwB2M9dNuqHKDMDTwdckLAHvdXm6yayTi+YfgzrsZvgPTFWJ3IyIrOjoEWzOO3g+VvhIOcQ+ZOzcW6HxDPKuDbepXGonAFeXmMCMYh1P65QkT4oIR9hSgcEAWOOsNH2YxhD7h1NehekI+SDmNFirILc9Y4O4xQAAJoJRseRffYmZiwBkrTiJy1jyMtfd2/sYWlJv6PDSRUrnl9sA/wG06H9BAJRD8R78FiDiQ2oLECCik8cN1BFWNwMnAKLGCLi66sYabdN5Jqc4QtVPf/fGDOJ4exTo+59LsfcmAfqNsz/PA2LvuCeBychHJ5Y+k692LhWoJKeyNJR3y/WxiXIwcKK8PG6dyJ0JlQSGCeQhtgEA/E67yIK5sBkIhuxmeWNdPqJG3nhCf+VaeBaAiwwKAABfHT5KZ9352DyhitCSqPjEa724WY8FbT0AMMgYcnF8ZEOmeg8HW6uSWYnceMvEtnl64OlksfgP1JFYTzVtNcLfDMBP/4LwhAen81BWrEdqKwkA4BMAQOxt7mfnH5/U4bN3J9lfsUujqnTyCks/B7cbIGrEJcwhRvAKUgtQGHfRDVVmyL1nyvMzAqBd/PSym+PkSW6efQjL1kjKwSi0Kaekc2LP00sm2/6AHNbxeRdA9NPPn14lDyCNfAAdb71jfQe6UTQHd793bjwbsfavyrMv/+VeQ5IGtepLUhmQlKC+2JnNoFu3yAjiY809uxCUqp3KNGLqZRIZGx7Kbt9zFSh4qmz8rSMx/zoDfGO456n86KU/UT+drXYeFZAbHqsFVJOwPhE1RuwNCWY6YX/ndwKwm5lG0gbA31xj9Lg5gyxCfLEDAMpRMEQAMNbZU/KfACqyFgCtKxBK6N2M4kW+H+y8+mt26MVNie6bbZJWjO7vxPw7uZEOAch/lEDhxtfcD2cdP7ZqVcybvS5ZBNOSs3cTCSCXjHeTnXsmfF2I6US9WUPSo6KCg8Vm0W7EVE3IXXG2HXr4vdOgjxx3W7Ow9Md7YllP3Y3cH10+c+2SAQzwnXxk3V49pBp6YQ4ZVGaXvo7knEpXoED1toyvgYSnmTSWttIk4DPMpXt2EXDtFnlEHhgkrrjfybIzh7rNqehOxIOOnFEUjGW7FT1AWOJ3lytSMm+jYwQAMPdR9qkUPLk4o33PVeb9hRJ2xN5rQ/4TItud8cRCACtn/PFfo+SP1mVRpx6elXzkaZfwuJRd8euGQCeqmfH+21FvBVEAgCgAAI/Pyu1GKMcWlUnJuuI5kaPiQeYciSmwMgtA6Ux69h0AspadwWUgEzhdmgvo1NfYo6Fygg1Y1KvtKl1d2/e4hXlQLj1I2ABUtNIo81Jm0F1VBGEDUNkUX9edVgvMop543Ha4bAB6w5XPOHoUFk/jLvZfke/ELZdWi7+VJnvIqafbwG9ZNqH3D09n8VdcWvXKxMVrM8T1fG/Hsp5YKCqY3KdfCOCu7QCA6Duz1CKYPh8APQhbw1F1F3u0XvRDdQFSAU8nF13lthEWg9MkTCPKO+2rLK5qTj1OkQUAGRnIvwkA8gAAK09FP/4YyFvw8EIVe015AdhsyVw1fxcfPIDSYseakrDZWOYtIdigkN8JgBaO2kteDAm1iRrau9344TnKCHgN64kahz+19c6YO4iuqimrTbzVj4KnyibbDjJtJfcJxQtvoccnxfXO7YvqfshPEWJbrO9A+/D+2jzheEfw6XxcPhQczzaJvHggvrMDmeRx0cQL8U3pdbviNnY2lZhCtdz8ohwV1LQvY/YFrivsJUfp2vdjAEY+/bRka55SBeZQWWKh2w0Q8QXFbEaSmCndwNQY6QYA5c29c73FJCgH0UDy+2bKs93BGSV2UQdgBlYHDlUTVKCS4MwGt6ZxOztZYIJuWMOSuQgAcvICBkw9OlcCyLctRMaazNcmPl4hhI0yZN98DLwyjFUPxOea7tZnHRe6u5YIA/SuaRnOvTznF4X9+/7rOeX4FUoM0worTW+VEUPmiveG7aQjbGAGWzoWVa6Xk5OhQ2queJpe72Y9vvid3hEACLb+QKlCEJv3yorGInYzqCZMY0GhR4GDet5xMBIBXNkI5lCZqPXGf6IhphKPzY17bV6D8Fp1Oju7UboIAIhSb+7CqTfIPVdRvAAAFhf2Xh7JVqk18mo/Fj0ueWr5d12YuCjQ6XTYnj2yH08WonDTLz0mxTkJYuNrNK0rAMIJrnhYFl1N8flJf3oJI7kLVC6AB4iEKT4WsVpkrni6oVu6FMDw70+jK6a03JkTF5rBGAkY6xlastAr+k5hw1z2DyoCgFzTMTqLK0BA2tuwPofb9nCrJmFr2ErUcESUhqLMiouf2UxH3NgGoKIVm6bu+WSM+yPzJkmxZKWL7u9E4U/z1K8ydHjpIvQPFM0GMHNO+LKKVTT+B/tvj6makLri0/Hy1CGlk99n56aR4lUHmYR4hpOz9RJML1CghGj74mwA+d/961fXxsXTJElQi9uE916RLINKvhPduoZAUaDXSLP2pMwbshMgyC6alDmKTEdkjJD6+VQEKfqHLbA3wwJQEbRMHV3W3/zl+Z55AD7rwa15OLYfGx7VAd3XcLPAr9h7bch/lguhtL88UWbPBoY/Q+Z8vsbxkQ2ZMgomAUPLHzM9DS8vCSR08jvZLezcWafoSoXKXiJhPEUvWSQxhuvD+N62OY8sISYvv/kVpEY3IJiRBPjYd2LehVM8bI8bVgtg6amH/vndADDXEDEC2NxYBxNbwiMYKXNViwsoB1Nuc21NJepEebeY4YTF47bDiTifqMgapepF84NXm566c7LtYFS3JBuL8oePFVRkBV6fQNnNXJWYV7ypmzer79N9j5D9+y5gFu9zsxFMwd/KSPKxbVifg2DILm/0NLy8JODp5HeiHAd4w17pNEliOzQD4eWGGOROztZTDgaw8i1J3YXjcPIk+n7LNWyl5EhPqWgacR821AOA3s7OJ3+gRvGSDM23mX8Da7MB2ClqJ/vPLvGgNm8xu2rLxTe0WgCbzeU0qdldiRcCgHJUmmGuKnoxvN2I7Y6OaoLfQpoUP2zLfqR7uO8lAIDpPuC2pR9G9+8HgMK1ANMYImqMQ8eiiP6WHSCrhXxwT6y1FQCyHuH6yEUwC2f3DswHBnpnF0puwQUK2HHpIAnGa5KF8OgDa77Wm06eTuYmfoyFX/wdGiKAqQQAHfdEKQcDvehVh3HXNO+XHKvz9nzJtevHS8QHaFrsfdjEjr9fXwKA8W5RmFZ+J0Ck9p0K5WD0RXsqzbBtaojUASDs7lA5Px42G7WDUWSU9HMBgHJUWgCsbiS3ATDucu2oMUoHVo6FzzSznZ//XB6QuWn4LACgwKb2fuA+2jPJjhVP/PNsBDPv8Zdff66w/3U8LvWy+ECB3wlAb8PYyDN8T5jGEGAngvqv9w2n7gYlM5S/p/K42c0R3RAx8fPWagHGP2ntGtfNLFX7ouBbjeG3fUMZcypXsdu6yZNv902Sqx4iwFsn0bcNrG/Y7f5UHF6K7h6sYaPllw8Fx7NLNt56o3two+ik4QZg5LM5hjRc5mtAo5OGNEL7f3Ya0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNTv/IGKfT/J/Ab5CenVh5LSFxg1hoRpzem3Iwd8RziHY7rurryPjZuoL712VP9/7fGghiHbwqh1gDT8Clt8+MZy+zChkvYq//Bau2ZAJg3L4hQUkhdvDzf0nvEN4YOkmU11JBd0hIFnpSJmIWi7xxwlZ0Q5r//xhKGnixlgPjwPjJM8/wObLCn4C4PxNA5OXhLYu//P1LP18IAOdOPTbzem+sDPli55LmTaZ3eGQHqV8xnPYdK3bn4VXeqNqttWqpfiXKa6lgooWXH6FPJx4NO4eSnezaIVW+Ab2Da6FLaCpVOz2xuQSoqPcpqOh5EobFozBQ6mqAyaCogefbx/49vu88WxD74CpWLAAQe+fSY2W6/Mfz9g0DGH+76B7FLrCPNGH4Epr8nwkVprBOFCNKOMmUN++oIyJ72TxN9AHwid0oBwOYdqqmw5Qqr/HJ5Ud2fZFzF1+l3Aag81djc2QpiYIUp30U6BfK2JSVI8feiV4+vwyqoLuKxaktHQyImrljLh8AaxMzxhZ7DV9HoETQhBCSHBKlXiqVdIDcFexmIVujVDMQibnJxCUJGngARo5EsWhLYf/vuobftWWCNU7563QArn1+y0IAM+edOb8EOBOyKT2yYLiGAEB38YnoRAuspK8YPChP2KxOJ66j8Rz45TZzSeNBW02DywaAcemrCb8TQC2su0A3VKonV5Uqr/GloW4Y7xBXi50Yw0pZVtqxEyYdAIx8EJNdNO/hscOxi8p04pyxiPBkym2cEhKnAwKC4B22Wr6OkJzV0zHtRLHso6Ub4iUVrallWDdVE6AbRNkaxan1KAeTNJGuogbexR4UPjsLhc+9dIUa0gOI/fkqls8DgMFrtxIAdLMm+oDhwyUKogaUg0E9YLW0RNxuvodWizAsor4aKxOmTpb4MgCv2aavIy0WVv9GXJvYBpBVB2gAQVQTMDdNa+wVldcmPpzAdySO4EA7ZibQo32gECz35NAVq97Q3ATQDcVJk52bmwBO5uf6ERLIGFdl4VJQK6U8FPYR9fIqdJfPDbm8FZ+iTxWKGngj47hjFoBC45WxIT2Abt44SdF25UklY5JbYwTTCLrVbgbgUl7weBPKpieNJzjOklwGTGOpJZ54nVGU8GTTaJtTVE6CoLzGJeXuDYG8k7simzHyrzSKE8Rp6JafAIi2TCRe7jwvvaGIFqZySktzNHKdbPI7gXpYRdZJITuowDCBPFzXPV7RLB1rLK0AWpjtRllufKYxpKg4M/nZOxdihZaVGUoaeKLEpjEuHfTEkWHOOKHglghDABOXM+fgyp9XLEjSw5bkMmUi2ouz9Cf1nYLhjfGV3GpJUAJgZ1stu7n3OacQZ+SV1zh8eg1LJElEx88gc7VM1i97YuL0/SRABTFjbExyaPT4MZB3q96NbpVNhdF6ACZpdmcvI4jApiYsZm6imrYaIRdg9vtsgvadoDTIkSepHhPTwcjNgIIgJ4uu3wDo+11gc7aCBp643ucgSAAXzgrGacbyI916YOALw4LY++OVSXbZdKDqejLDy0U0xLne6QNlRm4lpxxEBUh9ndXCuRx1AEzV5E54OqoJ/1YAxfGktEpp6uPKayxGTiLnXkl/vqAwT66oNq/gVH/HfaxX5efpxEvNIWtjIdTQIlcayK0xwtMhSPKZqgl6N7ZzlBN7P8LTBOxmTivLRVcTSqp38cWOPWcJTQIF2FGTYnbuAJbIBCyoZiL5RdrmPKxT08ADJ95STgITf2aQ8auh/FWP5AIPnNs38/aBVyeeyO8+8b1kiVjJnX6PBQBIIr5+12IqyOgUGHTEO3EwwmXAZxpD5TbAuM3fXBZfKePTzdwEuqF8ynvxymvsg+jGfImgUezEGJbKF6+Me9vHWpYTA+0ovCdxR//gCtU7Ud5KlQTZ5TZuUaEbYrmq5/Oqd3MNPjNAd60hElXvXOVSV9zj5kzcpYJ6RWMXD9dyGxw9PzF8dl/YLJOaqFRhU9ZD38/rb+5E65qCRA08ASOv9mPRQzqg6xPgKjB89MLP85BX/eavh7Lu/Od5E4fz1iZ/VozXIPRB2RVXapvsIVghjISfX+eYxhBXZpapmrp8AGoT5FFV09RzymucI75cYsEG2pGfuE+7wxikOpe20FihkF377cyHVOw1c4gxcH5vrYp+K91QXOmohwp41TtWRJFCBUiZ6t1ovd1sZlcj1iVyBbYHwhYAFGMlFFUUea9G4jsBAOzmcMd60FPLx3FDW/jsS/1D4QKZBp4IgnjLxFHeqHe+9xMgt4o1EZ1nN6lEMFk9u1Ksjhwwqqes94nCGSIRFUkb6N1lFhi4kaCa1waYF0X629w+RFhqYILNRjkM3Lrmcyb1QGTKa5c6QS6XVPiExqLEZOLZ93428eG808gXGT/WPo63vcG8NV/FeToa4gXLVV3xg8U2SpBRVphznOpdRWuLhdPpEKve+Z3E9oIdEVGbWrpeIAOtFSQYb9lq2FMV+Cs7NTZ4pWza1fXz+ye+UtPAE4u3XOqEbvWjN4f3nEdgA6/GgfHDhnsQ/fCdQSS8quJ2dsD6joNqGxWGFs0WNVfc47ZaALPdCQMAb2VFgJ0L3HaPfTiyxS7A8EaqOElCf0CuvHZmWOaIM58kOuIAsOz2LzqP9KPstmuyA9lrb3ot2rpYUZKb8lYlaDuyrviYYAGS7+kE1TuyuGN9b2ALpKp3ft/2Js4o8YS1WLgnEAzZuY0vL1zJ7ew4H0xoJC9hagCAglEqrK47kziYGVDXwBMrcnYO464nsjHvuV8OffmVcPxMyEZE9/g2rkXbwdCzyhOOqGyeVkRWvMeP02m0nmAdU7O9uQKADQkhB6ZDHlRjetYeb6y22abnO8WV10bOItMsWai6L6JQaeOat/KL4WPIWatAmztvoXu+nKF0I2/lCjmdaOIFEp6O0cjUidx7IFa9K2/uDRhKZKp3ZjMFBdtH2Bo8672C1O+0dnajrIkji/ePVqa6mVLTwBMpco4Ai7IBzCgUvZAaPlxSipNta9bpsDp87JP7lK9u9gXm0qXAWETuio+pjaIs7sSNlf+UYuWxSKV0sUMQpCm3MXW1sVA35kmikLETY1iuSI3lXhqy8Hkc48pSWwpTIazPASwWKib2B0aVfCeG5gPUVARAieEUJegLyVTvekiC291xqzz5vMOt52lnlFzdorjrt1goxmnfCaAyYEhBD4UNKqlo4MkVORPQduXJLHTElugA3aKj7Sp0go1VLR1kldVFrvhgTMWrSumLAoohIVnsmBZLAD8LCnxyFVmgEChIUF6b+HBC9jploF3iHokwe0kLMiuUvqP4XCz1BihpZMbB7ZqkQmaKvlMwvBEi1Tui1K2vgKLqHd2lZwhp+DvAIEXNJa9hjdNuBgJMKDh17Cv80rXba/KBoW5k58k18DhIFDlvBc5Hs4CBXmTz7/vZCObElDfjuwl5j1Tl4FL6fM5nkF3laK4RgHmbMJ49iufNm4VP99Hof4VXXpuuIw4AunX5mKfgo44f3zeBBTdLynzFao+S7ioHALp1igWFeXFrc40RsJTVb214Xg8AZUQxCWCzvm7roeclZ7foc6VKsv6tbuuujtpUvg3wBzautjr9cHm3W52ibXOAUVxPCg248Hsa/Xv6UDQfRfNxtSk4GW19Lapbws+4kVfEipwLSLS/Phy78MowTLewRVwEU3AfMtVbNxYxgPHKHzvTUaoyionWiW6IAFZS/JOTGqO7isVX6SGJuIhijj5sFqQa5YGCBOU13zCMerDbJ1M1AYychG6ZSrfmvTBxk8SSxZfbmVK9YEYs6hjh9l21AFBezsr+HVR5dTDIL2JC0+Oqd9zrk0TVO7+3Zm5jrRBJYxpDsJuBbVyYThFc3FNYBv1OuxGWMXIHXiCNBid7nscNoFzRVGV/LxQ9fRoAsn6QJ9fAY0fzs7NA/7+zba4xzv6umxv7Gfdzy1+YjWCWfty+XIdYu04anuADBQC3HgVDdhl5jkYqoAyBTsJCH9e5JXdKZW+piCDsycaMsVk4RpS63ZzsnQJkymsjHfJdXLgXhWpBF90tKgdAPCkN7Pbmiu6vl+j1utaQAKhLNQrTyuVTb7kK/E6YiN1bjNhGOZhaAHq7M2LlqEhsg3+rYqxL9rmAIE69npU2N+9q3FFHqrlZLMw//t9ofCilGniKo/fAwEcxAJjxUy5qzEcwVwZPzFuL4ydWSYUo+UAB+xrDakQ4Tmy/EzCVMB1VaovAjVKMkiivnXVOcF/tctYptrcFD/5Efg5vuljQDRHJx72YucSin34Dvj3ofiM0nr3YypFDrIHHDpj8U+lY8E8Xo/mrrPxIBp2bWPVYNu700Oo0fpGrCZD9w4G6Wvo3+8Zeo5OGNEL7j1Ea0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSCI1OGtIIjU4a0giNThrSiP8DC+zcujNwqbkAAAAASUVORK5CYII="},832:function(t,a,s){t.exports=s.p+"assets/img/5.b505cca6.jpg"},833:function(t,a,s){t.exports=s.p+"assets/img/6.3f8c796e.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/41.de5df3e2.js b/learning/.vuepress/dist/assets/js/41.de5df3e2.js deleted file mode 100644 index 9a48f86b..00000000 --- a/learning/.vuepress/dist/assets/js/41.de5df3e2.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{1125:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天给分享一道比较简单的扑克牌题目。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("拿到题目的小伙伴,可能觉得“我次奥”,这特么也能出一道题 ?不得不说《贱止offer》,嗯....不错!")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("扑克牌中的顺子")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [1,2,3,4,5]\n输出: True\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [0,0,1,2,5]\n输出: True\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("限制:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("数组长度为 5 \n数组的数取值为 [0, 13] \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("题目就是找一个顺子....啥?你不知道什么是顺子,看下面这个。")])]),s._v(" "),n("p",[s._v("顺子长这样:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(846),alt:"PNG"}}),s._v(" "),n("p",[s._v("因为此题本身属于简单到要屎系列,所以直接给题解。数组长度限制了是5,非常省事,意味着我们不需要一些额外的处理。拿到牌,第一个想法是啥?排序!我想打过牌的人,都会知道这点(想象那个插插插的过程)。"),n("strong",[s._v("因为是5连,无论接没接到大小王,最小值和最大值之间,一定小于5")]),s._v("。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(847),alt:"PNG"}}),s._v(" "),n("p",[s._v("排序后,我们通过累积每两张牌之间的差值,来计算最小值和最大值中间的总差值。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(848),alt:"PNG"}}),s._v(" "),n("p",[s._v("拿到了王,就相当于拿到了通行证,直接跳过。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("因为是排序的牌,如果接到对子,也就意味着不是五连,直接返回false。(怎么每次说到五连,我就想到“penta kill” )")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(849),alt:"PNG"}}),s._v(" "),n("p",[s._v("根据分析,得出代码:(翻个go的牌子吧)")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//go ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isStraight")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n sort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Ints")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n sub "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n sub "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" sub "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(850),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、不排序咋整"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、不排序咋整"}},[s._v("#")]),s._v(" 03、不排序咋整")]),s._v(" "),n("blockquote",[n("p",[s._v("“没吃过猪肉,也见过猪跑”这句话来源于《红楼梦》第十六回,有云:“偏你又怕他不在行了。谁都是在行的?孩子们这么大了,没吃过猪肉,也见过猪跑。”")])]),s._v(" "),n("p",[s._v("没吃过猪肉还没见过猪跑么,一模一样的整法!和排序本质上没啥区别,还是"),n("strong",[s._v("通过计算最大值和最小值之间的差值,来判断是否为五连")]),s._v("。唯一的区别,是需要记录一些数据。包括:用数组或者map记录下是否有重复牌,记录下最大值和最小值用来做最终差值计算。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("直接给代码:(好奇c 有木有人看?)")]),s._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//C ")]),s._v("\nclass Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n public"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" \n bool "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isStraight")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("arr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("14")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("14")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" false"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("min "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("14")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" min "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" max"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(851),alt:"PNG"}})])}),[],!1,null,null,null);t.default=r.exports},846:function(s,t,a){s.exports=a.p+"assets/img/1.048fe315.jpg"},847:function(s,t,a){s.exports=a.p+"assets/img/2.3bd5679a.jpg"},848:function(s,t,a){s.exports=a.p+"assets/img/3.f425d51a.jpg"},849:function(s,t,a){s.exports=a.p+"assets/img/4.639a8eb0.jpg"},850:function(s,t){s.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAjMAAABhCAAAAAAG4H/LAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAADsQAAA7EAZUrDhsAABfYSURBVHja7V1/cBPXnf/4R2yv64a1wAQqQipHNBDzowqiSQPc0cElbZGTXmNIJoHQZE6x58Y39s0NJ5i5SzP3x2FN7qaop0lllOvVhGYaQ9tLpDQhiFxS7DY0AjWpFYkivBAQNpjKSwJ+tiPQ/bGr1f6UtRniTHPv84/1dt/uvvd9n/fe971dfz9lU6CgMIXyz7oAFH9xoJyhMAvKGQqzoJyhMAvKGQqzoJyhMAvKGQqzoJyhMAvKGQqzoJyhMAvKGQqzoJyhMAvKmc81CJ+98TetnJmy55Ivnc3WLn/AMjOP+0vDRN9vc/YORmsofbud+0Vqqsr+4AK9ZOal98ar7hIvmAqi/caXtmxGvoXIHngzBwB1jy+dicf9pSEduAjYOxiNoXTtlov8TxYAKh9aW6ZJnvlx7RMLRn/yUdccAHi778nFN7640twU28kD4HfGZCdjQRN34nZwhufeEqqOK3sv3Liix9piqiPBtrB4RvwB8oyZKiD8DNGtWpf6SeQZdU7tEeP7qW/2wkUDQ+nabVDgCLIHTmiSUy9NbF2AhkdIXxbA5VeXLtKtThgA+J3T2Sasn6HY3MT3NZHDITFh72AQjMpPt7hKbQr+zVzZvd/7wgfPXbx8aEupF02LqMUms7s/BbT0DMcCAOy7mWHhcDLdava2xJ8Sflg8rHhonjWymDF9B4unOrFEuIz3ZhQ51KZjNrzF6xhK125TkSyWPtww2nty8mBjlSo5+sH8eQDmzB26YAWOjG+o0ClfxLoeADjSLB7gfHJqF+qNqNOhc72KM2Pyi/dbHmRcito53QBifR4WIP68KWTPMMC5P+OOh6tw2xM+cvrqF8w2ohb5JvAUqlkttMP8EbE08/N5uvN5BH8BAGIBqS66EFo01ldo0ubeERtMoMUFxPowOd4kpNldspPhEKzK7PO3MEf0DKVrt9E05m5l0fD4D0fT/FxV8tKVRTUAqurOjFlx4Tf3WLVlC4eALjCd8yKkO1/Wmk4bQPxLXMp6r0/o9pUi40yQ75i2c7U75M8wArmGRVUA5s0fuvqx7PjhQ9hSu/90ruF+J5Ivnc2y69dVAUDu1CupqXL2jg1f0r8fuwtAcEjOVaKbJzyg5TPvhZcFuDAxql1IGFstgn0FdBfIoIZAQQBd6izc+e68lQoF9afUnYzZAl7XULp2m8xiIQvAcuvo1FVNUoZcpGpdmU717B0MuB4kM14W4L26JpAGxi5ou5fImXAI8DAtIYIAAKbTBgSHPJN+93RDCAAc68vb1aDvSpOxamVPxnBkMAtc/K/zuYPXAf4X7/1dLZB7NXQduJ753dvLH6szeigXb2YBrqetyADARbZpyk+CjW4AsP29JnswCnQxT8rGGZeWIhKNJIY4egQuQNbFuJ42YCJi72AQhNwonI8YD3BqQ+na7bLYPcrKdZJz6vgJBpgYq63H6WMbZxvbhkRWF21bGc/VXo3IGZcr1udhsZ7rabMh1gsgxj/FhNNjpXBm5XrRTKbGbwF/AADkfi0mT/7qkTKceO26kMqdnzDkTIRZozwQCgFMp8IsB0h+CCiw+XDGsMnc7nCig9GMWEGnA0AYIn/sHYzEEOIvVrfhNDOpGsuCUWbHJ7BSyZhnP3npVuDsxcW3ZF+dfXeRnO9n1pi4rwKGc5PDAX5gm6p+UcEJFvyIJUaXKrtccZRv+HbV4PMfAvWPNk29cigXW2dFdBJ3PVqXPf8S9/05RtdxcfUQ0uIC1wNkhMIxnTbsS0nzhNRVSELRvWIBcVSVozA3AUAwXu8A0Ph8ouRKiYg4hwHCy+wUjtrN3sQcKlp3v/DEnA/23ry58o/JrXVFcq5s3bfaBgBWABPCHJoKyeptDBlnuJc7WX5Cdm5/o6MwocPewah9YCAAwIJY5BNbYllLJZZ/9/lc5aPLUPPAhXc/Om8FAb5Wh8qFHZdnGV1GDlgNNh4sHpb3bnYIja09PZJulqWC8R02hLtl4/Bl/1aFD0z8madZAJgkf/5XXWe/sJgUZis4xSVOBq17x9jJjNwPZVo/VcoAc7b/8t/Gq+56wEJes68ompNgj1QfAx/YAHnOcL0k8k+HI2uYegBMPQCEoy3ihM75tjn0Lxd84OrMYfnEz2wvvY6rKgEsmcXPuQ1A5Yp3cQGoAI4vqQHKjCfGwyknIzRWt9HKLTi04/mQRHmn4hznI7B4WO5Upw1wDRdWBymfhxVL73AA4L0Wz/MuG4BofVvo6U6decUtzHWywVWc3Sye6tq4bSxXyvR+4zDrceHv8XR7lX6OVBcABsyDw/uNPSsEZL+VxstzJshvDrkZlzVgr5bsGim5nHdu7m36hLN0JQCUl6PuJgCoBQCsOpb9/e+B2i9vvL1M/youIjaWsRMVG8qvv6F142y7EesD4rPnAYAzv5IORu0dSZmxnFuCjW4yEXEDXHzbPHfwgLnxlFkynH/GTOPy68sXYeL1/svlc7+zSrn0ENdNYFp9MYOhAGM5mdtl4AO7EQOAxfZUlzhQc741xvu6ajii8Rvo2S1Z+2YOwPj77y9uq9XLQA40aQ+GQgCDtEUkvcMBvT3YeiZdsNOw8lzQOT8hrILEYRrYnjdthLFBWAClxClI+LME4L2rC6NsfnXP1PMArAMj+W29GcaR8Q0V488OP7ZsKrLvzIMVunlsTZGS3iyoRyOlDzySbmd9aSsZ608sal6vXhQQPmXkAxcZ5Myj8qE7Xx0ZB4DkwDf1MiSxZZ/q0GSm3QGuB8Ns8SZiGxPrpRzzeZVt0nK+SKbd1sui4HKXtG4S/UIbesZMb0TfCFz4zT1WHDzZugI13zrd71ikn2uTbwQ5FuDH1D4wX1ZvfHMlZyKMjd0NrgbAfdpF52SmxaXygUuD5AVeLy1/2fLlAK787DiGcnqzk0M7pI7lWMDWrVilSCsg+ZTc7Cv4XtbIiA1A1CqfPgSnNRQquEmOdDekTXTX9J4bsx3hjNezC2BXh1rMDMAqQ+najRUbJnddLykgF6laVzZ5irEDqPzyH08YcIb9ATgASFuEFi34wNJwrQcFZ2LRdrE36XbXMaLZig7orc00a+2bKq6dzlYCI8Ngi5Qlj+zgnVUA6v7qjx9/NCXPL7BVF2LHGPmzYtbS8Wds2wLDbgBpAI6or9OGcLxTXlouk3YoN3xJAkwzzIAfaBn2eliQBAbWmPCBVYbStVtVJUY++iKQOYvqWZqkgNPHNs7G9Vypjx1WM4QUnVHlnIkFhN40b/YxXs9GEUbTZ2TvDhTLdCUWzL44+ML3vvDBTwi+Mv3sPrXv6Nz7lzLXL7z8MZSViTYa2l88Fbl92m7t2O1vA4B2FnCHuwHL0/K7ksjaAeU6PhhldsBnNeP+7resh9/rgdfiDXoLPCcJpr7odSpD6dqtwZo899OHG0Z7R2GbpUkCAITtvHJpiK4wfiJfVg8u3qyqm6rrqSByJhaAE31i52KaA3aF1XgCabdeDnaXOFFwPgJIo7BmxGa//nJuYAAAZt07vcHfeQcXnxNLt0p+giiYLO6LdAOApX1oMwDE4p26tyS8rOTy4mlfDuzDg6t9hZblfMTiZYHd3E7SbrTKEKfALoijbnDIw8B9mAs43dge9LQ7pJfd7cUHHZWhVMlgFO0OVP11Kjv4zwBQva4C6iQAIJHcWgdU334yZQOmTlbbFQ8R19oCopZq7ZY6OVC064mccfQAkF6+Cm9QRL54M4B9MQBeeIWO/P6G7EG23cVpsOFD8duhx27BtLi39nnxZVvldxWfaI3UyJnslvvdMctiACSyTaeusQDAlOKJBqNoSQ55GNvucOh8CIDTGZA2iW27EQxAjzbKl9YD+benbGPvDhsAd7Mv6i5100plKF27Ob4rfmTVeodOEkB+O+++U6/NXTb1yp9cSs7k19qcjwBMJ0P4zRKTg1GgheXGi65pZuY7PYNvFMMhoRF4b0bYU48F0OICpv4wMDRVNmuJ0Xvtzx8kCxT7tlMYZ6b5thPAwP52oXNNvN5/uXz+/SvKPkGJimCGOEMxc7j+p+t3VNyA+xiCcobCLOj/qlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYBeUMhVlQzlCYxQxp8VB8NshdQd0N/m/tGeMMeeM3fPnCjcsU5ed85LYuKWDeOd+HFg9b0GvQBg/8HOPy3kEx7PXUm/87hvpvrBODbqqSAooFAsjJRQCQ/tF9682WZVpU/MtMmCT9w+MTyPHRzFI5C/ij2SuNUpCMw3Ewa2rAHxWVzXJXYmcW18xE6T57xH90FvjSSgCZ3W8TgCROLKuBNikgu//Fsev4+NxR61xNMhfZt/gfHrjllxeWlQPIHsg+WPXJi2UAVU8OKuN68jvDqpPcfxJR60kQd5IUiriuti6jQJ+XfiwIFOV+97rqzLX+vPYdf1x73WBv0QgEwZ3KGIrgd4pFCEpl0UovFUVQX7EopqmaVvxIVw4pWJJ8FL/vQ/HX1L6zwo+hn2W1SRHFRJ7Sry/cxJSv+NbRowCQeG+DXixyUflK1HEqZg7dDMXnJo7IYmQRZ+9OD5PZJ8Sz4fuQDx7F+Qhg32UcO+zIKG7eunTqlUO5t1Y1KE8lOTE+YHxUOiZEYuFf/m3u9PBtRSw9JA+VxvkImM55k8EogJYeMikcjlhNC6VJmiKFOPM2JmImMql4B3vHpBB+S62QBE3so/q1hwgAJJNgNt2N/l9MDSaXapLi3YuJPP3pw7UMgNtroquqYBCLnESEGHhxKb5VTB5BulBvwkT04j4bckaMWi/JH8Hpdiz273d3eoNuACRo6WBiAQBdaNkN3ttsTJmrcVRsXo6aB8be4U+rODP5tr0MAMbfUkcMZB+58u7VjD5nxDpmpLDxTrcQfx1ifH0wTN4OXfk8hbCKQt2MNcuEFg0nCmVZPcCbCife7gDCCYzVFKJkFRCMMqqbNbVkDgEA3ruGjauBdVdC15JLNUkBRUWeTmM+ANRVZSaqDGKRB6NAFBYPBgRtiHaHGKJUjPlfqDfjiuv1FSl2fb4jRCEEg3e5gFivMlg7sx1gN/fxAJLoYODoQbgE5YiPr2LWIgCVK9+BRltw8FIDAKTOaYu28F2jOzp6AN7bWLTvO3oA4me1eTifdTcDxKKGl4pss8vFDDwFMqiRF4UQKSzLEj/vAVQqHFJIqwLYLRCGttxVMHYAuDNCxjRJEaWIPAH5WOQ6cLqBWB/6LU8xAOfTNUGeD0KdlN1LGmd0ZBKI7sgkBOd1GMUj1IEUcE5Pt5fv/xsA2f5rmjPXzqHiJuO79pNmYBrO6gnv8HuaXfo1IP4UELU8KRtn3Nrr8zQqMEQI5KjkcKzPA1wecLrVMarF8G/6mMj7NWV6SRFFRZ6+fHQYQljeGiNpQRFjA5uL9faaAs/VoaCL+TPJdGuhn7W4tNF5eW8G6BJ6UTQwrULl+FsoU0XIq7p27fg3WIBL4ubJScWpK79+FwsaDW/GD6gIPdENwN4hP8RFiCQ/KPX+/Raj1SezHUG4oXKsQZ5z2SQZp7wUlMgQA5k1EUMZi0qMTkcl7sZi2cFTU1XIDX7srNKXFpQwYPmkkriq2PXyuLB8X5NN7Gecj1kD1uJpcYleggeAvYPdhXCig4m1AWgsxPo00G/KvngSt35FeWxB/bHRxNeRe3sSq2J5zuQVBVD3kK7cAQCgH5uUB2o6bQgnJI0pewfD70Fe6aHQtvyQonuFQzqyLIW5CQDxp4dtAHH2Rk1G6B8/9M3hfFxzEftSzhsa5l+Dhta9oY2VR964+24jacE8XNX7NrEAalhIqlcBWb2NoeRMfMxXGJL2Z0Snn/hTTjdg2x7rbSoYuOAqOXrAe53TPAi5g0dR97Bq6Vd+z+Bk/1eZS4NouEuzKC7fdLvh3bhIs0F3dbrFeOW8N6ezvcMRuYqlP+NlEZRr7HDhTQofmPdadjEAmHRN/Bm9riDp5EoueYu4HDlvvzM+ySjFeCyb8Oli1c2/+scs+8C6Sq6otCAA8EGpPvo+sAEUnOEiLZAEsCQfkfhT4jGHA4qGDUYBdGlUKPVD4UZ/nat8WEOC22xJ7uTyfh4rtZJw139WsQr6IAeIVVzRdhlo2PLexmZft8H1sQBg72CSGQ8LbPEXVgdRvoMR3S+XCwDna9rkd7MAScx2B/VUv/K1lfkz4uxm75ic4BxF5SY+BdyxA5BikesiGgVgAeP2HjZ2JibkplNKAso5w+9pcsEaELwSrndtnDwjdqFAYdWekTwEO9xuTorpHg0YrCpEnPp5tuw72sGo6p4T13674DjqZKeEJ42/8epU3/wF+nc7nMor2xr6wPsb3ZzkyKn9DkePMI81sgCYJeJKmvhTTrdMGg8ta/Y0u0bG+11AMt3Jdvj3m5tZ2Ma0o0jA/U8TieTWOlw4kFREDhYgrpvAFpHd4plCRP8iPnA41OICHO0BWAFEmtfEhS5UcPzDiQ7V3BQn+eFG5s/o4dJ/X8Hd9+nMrysWnjl5aBRNX/pIdaJ2I0IfvqPPGS6yWaNIJvjAk5KwikHrsjIflyg3XchzrRFxeBGHaWAXMO/+3iYbiVjniUOK6DAVNocUMnp5hWlBqWF+wpnf1ptZkNfsK3Dq2blPNYz+/N+fWK6fabG1pK1K9bwhcWaiW1RkdbT3rgF01g8gCbXaChlee8Tf4XZP68+M/3QUix7SW6TVrjpz5Q1Ur9WuCsvujJAPpnRfl0SaV6o5wzNPswgnJjLF1goA5lmjUgOrttYYQT5Z4ksejvQeD5eWxFdKWjelhT9NkR58mjq3hjiebq8afxGPNKBh03+E7fprCaZ1L8+X1QNpjQ9cTIxHuT8jmMgRO6abdzLTrJybkARrr/FPv6uXffEkGr6vX/CvRnjAZvCOYOqa7mEdQqct1YDLxSk8zgmtP8M0ByQtJswf4FmAJBTTh+C0yqZjuIY9BQUQRc9UaB3Ij0ZT/g4XYGuKtpuYmiQS5/SSIkoRebr8+vJFGL00fw6AWXPTFwx4a/uB8HfY3sEofeBi2mlmvoXgCAvF3ET6XXH8bVIiTXC+C3pr7dzBo6h73ED3eM7SflSs0RlOcu8T1CqPB40F6cRKKuUf9fwZR4vgsQ0DWJ/weljsU+78xcd4lWvGDykUQUoxVXzbgL+DAT+EgkBqCWBAztoAvE9wizYpoBSRpyPjGypwvUSJNRBezRC+2Ixq5gsVpZ4agMM1NgCO7dIDh3Wvy0V0l0wiytbVYYGOXND4K68CSxRTFj9kOAOKp/iB5mlbyOUdaGtra4u3MmC2N3ra2vin5EMBP/DNFxVvsckzHng3e0p6Q52/5EDTve6Mn3BPN3oz/sLrSX7IUlzzbHkFfjmQzb55ENVLtEkBC2Zj8IUruTOSyJMiCeSlBVGeb9zyIq2ctlQjmVLblSs2o2rGGd6bAVpYeVLsY/xQo7w9hlmmoKdUbUk7JHKqfabLb2SRfU6QZNLZKl7w9LWbFNOWtKeHhV9T5JRe+QFAZqfwjqYLAJxOoZL7DTY3x+SvleUTiublAAk2tt7eXdjWigVg383A0RNrYzqNDCl/ZWoHiB9bwD45dDjU4sJT/p2dtrxhp9PXXmQ/QfbuBYDFNk2S+FNMp20akSfkpQWBhjkjl24FLo3MUb4YFtfaQnUTLEMidpXV+L7VRWbUPGds+Zm/YFB2l9K+XEYar2IBAO3YIp1jloRCosyTaZR90ehM/RblFmB8pawmFoUrEVzNAuDOd+q0STBaWtGIP4X2w9gCR08wFQCAFoQsXvGZjh6xzTRQvrTm83OzLT7gZQFme6y7xWXk+qjAfP9Z4YuZxkcrtUkR04o8nRa282ofevaFJxpGX4BqOz2/1o4FAFjcmBx/LG814k8B7UzSUuzrvpnQVZE+SFGNM5yPyN7w8t6M4tvOsvpV3/5MZIY/E3A+Mu23nRJni33bCSC7Z6xT6GwXDiSnqha3liC0ZgZUi+fzh/ETc6034DaGoJyhMIv/N1/2U9wwUM5QmAXlDIVZUM5QmAXlDIVZUM5QmAXlDIVZUM5QmAXlDIVZUM5QmAXlDIVZUM5QmAXlDIVZ/B8oFCD5JUjAlQAAAABJRU5ErkJggg=="},851:function(s,t){s.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/42.9ce52f1f.js b/learning/.vuepress/dist/assets/js/42.9ce52f1f.js deleted file mode 100644 index 2b074569..00000000 --- a/learning/.vuepress/dist/assets/js/42.9ce52f1f.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{1134:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天穿插为大家讲解一道臭长臭长的经典题目。我把字体加大了,加大了,加大了。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("本题是leetcode第12题,意为整数转罗马数字,题目难度中等,代码通过九万次,建议掌握。")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第12题:整数转罗马数字")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("罗马数字包含以下七种字符:I, V, X,L,C,D 和 M。")])])])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("字符 数值\nI 1\nV 5\nX 10\nL 50\nC 100\nD 500\nM 1000\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做 XXVII, 即为 XX + V + II 。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。")]),s._v(" "),n("p",[s._v("X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。")]),s._v(" "),n("p",[s._v("C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: 3\n输出: "III"\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: 4\n输出: "IV"\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 3:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: 9\n输出: "IX"\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 4:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: 58\n输出: "LVIII"\n解释: L = 50, V = 5, III = 3.\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 5:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: 1994\n输出: "MCMXCIV"\n解释: M = 1000, CM = 900, XC = 90, IV = 4.\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("看见长长的题目,别怂。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("因为题目很长,所以读懂题意很重要。这道题说是让我们转换罗马数字,其实说白了就是让我们用特殊的规则凑数。"),n("strong",[s._v("罗马数字本身就可以理解为一种特殊的数学规则。")])]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(898),alt:"PNG"}}),s._v(" "),n("p",[s._v("那如何来凑数?自然就需要读懂题意,比如 2 就是通过 1+1 凑;3 通过 1+1+1 凑;6 通过 5+1 凑。同时,在凑的过程中,又加入了一些奇怪的规则。比如说,4 不允许 1+1+1+1 凑,而是得 5-1 凑;而 9 不能 5+1+1+1+1 凑,而是得 10-1 凑;这个分析怎么出来的?题目中说的:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。")]),s._v(" "),n("li",[s._v("X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。")]),s._v(" "),n("li",[s._v("C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("看到这里,估计熟悉的小伙伴,能找到那么点感觉。凑数,凑数,凑钱。有一道很经典的题目 “硬币找零” 不也是一样的玩法吗。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("然后,我们把题目中所有的字符列出来:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(899),alt:"PNG"}}),s._v(" "),n("p",[s._v("当然,除了这些还不够。因为上面我们还分析出了一些特殊的规则,也得列出来:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(900),alt:"PNG"}}),s._v(" "),n("p",[s._v("然后我们利用这张表格,对给出的数字进行转化(拼凑)。假设我们要找的数为2834,大概的流程如下(其实是一种类似贪心的思想):")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(901),alt:"PNG"}}),s._v(" "),n("p",[s._v("对比着代码看更为明朗:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("intToRoman")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("900")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("500")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("400")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("90")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("50")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" romans "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"M"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"CM"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"D"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"CD"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"XC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"L"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"XL"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"X"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"IX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"V"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"IV"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"I"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringBuilder")]),s._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringBuilder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("index "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("romans"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n index "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(902),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、啰嗦一下"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、啰嗦一下"}},[s._v("#")]),s._v(" 03、啰嗦一下")]),s._v(" "),n("blockquote",[n("p",[s._v("这道题目限制了最大数为 3999,时间复杂度也就被限制成了O(1)。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("我还看到了一个西PP很骚的解法,拿出来大家瞅瞅:")]),s._v(" "),n("div",{staticClass:"language-cpp line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-cpp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//cpp")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n string "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("intToRoman")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"I"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"II"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"III"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"IV"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"V"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"VI"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"VII"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"VIII"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"IX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"X"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"XX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"XXX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"XL"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"L"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"LX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"LXX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"LXXX"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"XC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"CC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"CCC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"CD"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"D"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DCC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"DCCC"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"CM"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"M"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"MM"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"MMM"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n string roman"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n roman"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n roman"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n roman"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n roman"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" roman"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br")])]),n("p",[s._v("这个解法应该没什么解释的,就是把每一位 0-10 的情况枚举出来。这道题目稍微长了点,但是分析下来并没有什么难度。有的同学一看到题目很长,直接就怂了,这种其实就很不好。唔,再放一张女神照片:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(903),alt:"PNG"}}),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天的题目到这里就结束了。你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);t.default=r.exports},898:function(s,t,a){s.exports=a.p+"assets/img/1.78783a70.jpg"},899:function(s,t,a){s.exports=a.p+"assets/img/2.a3352c98.jpg"},900:function(s,t,a){s.exports=a.p+"assets/img/3.c3858898.jpg"},901:function(s,t,a){s.exports=a.p+"assets/img/4.b99fbd0c.jpg"},902:function(s,t,a){s.exports=a.p+"assets/img/5.672ce4c2.jpg"},903:function(s,t,a){s.exports=a.p+"assets/img/6.7579b251.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/43.cc935510.js b/learning/.vuepress/dist/assets/js/43.cc935510.js deleted file mode 100644 index 6cf5f82d..00000000 --- a/learning/.vuepress/dist/assets/js/43.cc935510.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{1136:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("69式是一种。。。咳咳,六九问题是一道很有趣的算法题。嗯,不服来辩。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("注意,num每一位上的数字都是 6 或者 9 。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("题目:1323. 6 和 9 组成的最大数字")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给你一个仅由数字 6 和 9 组成的正整数 "),n("code",[s._v("num")]),s._v("。")])])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("大概就是这么个意思:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(921),alt:"PNG"}}),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:num = 9669\n输出:9969\n\n解释:\n改变第一位数字可以得到 6669 。\n改变第二位数字可以得到 9969 。\n改变第三位数字可以得到 9699 。\n改变第四位数字可以得到 9666 。\n其中最大的数字是 9969 。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("因为题目太简单了,所以。。。。我也不知道为什么拿来讲。反正不是凑字数 😂(我一定不会告诉你我是因为标题污所以选它的)")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("我们只要找到 num 中最高位的 6,将其翻转成 9,就可以找到答案。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maximum69Number "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("replaceFirst")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"9"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("valueOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(922),alt:"PNG"}}),s._v(" "),n("br"),s._v(" "),n("p",[s._v("emmmmm,大概就是这样。。。。我感觉要被锤,溜了溜了。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(923),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、知识点总结"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、知识点总结"}},[s._v("#")]),s._v(" 03、知识点总结")]),s._v(" "),n("blockquote",[n("p",[s._v("写出上面的答案,大概率是被面试官锤了。那这道题到底是考察我们什么呢?")])]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(924),alt:"PNG"}}),s._v(" "),n("p",[s._v("大家可以看到,这是一道数学题。所以我们需要用数学的方法来进行求解。具体代码如下:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maximum69Number")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("300")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("30")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("其实这种解法,和上面的解法没什么区别。"),n("strong",[s._v("都是从高位到低位进行判断,遇到 6 就将其变为 9")]),s._v("。只不过,上面是通过 replaceFirst 来进行,下面通过数值相加的方式来进行。那这种方法的效率我们看看:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(925),alt:"PNG"}}),s._v(" "),n("p",[s._v("吊炸天有没有!难怪古人说,学好数理化,走遍天下都不怕。只会 replace 画,面试结束找妈妈。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(926),alt:"PNG"}}),s._v(" "),n("p",[s._v("现在你知道为什么你和别人一起去面试,面试官挂了你,而选择别人了吧。"),n("strong",[s._v("面试官的思维,往往就是这么朴实无华且枯燥。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);t.default=e.exports},921:function(s,t,a){s.exports=a.p+"assets/img/1.fee741e6.jpg"},922:function(s,t,a){s.exports=a.p+"assets/img/2.e6b05cdb.jpg"},923:function(s,t,a){s.exports=a.p+"assets/img/3.0c3a60cf.gif"},924:function(s,t,a){s.exports=a.p+"assets/img/4.577ac376.jpg"},925:function(s,t,a){s.exports=a.p+"assets/img/5.e942f55e.jpg"},926:function(s,t,a){s.exports=a.p+"assets/img/6.cc7c7072.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/44.aa82a8ef.js b/learning/.vuepress/dist/assets/js/44.aa82a8ef.js deleted file mode 100644 index 288eb242..00000000 --- a/learning/.vuepress/dist/assets/js/44.aa82a8ef.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{1018:function(s,t,a){s.exports=a.p+"assets/img/1.21ffa5ba.jpg"},1019:function(s,t,a){s.exports=a.p+"assets/img/2.21e27729.jpg"},1020:function(s,t){s.exports="data:image/jpeg;base64,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"},1021:function(s,t,a){s.exports=a.p+"assets/img/4.ce034acb.jpg"},1022:function(s,t,a){s.exports=a.p+"assets/img/5.0424dafc.jpg"},1023:function(s,t,a){s.exports=a.p+"assets/img/6.674c41b3.jpg"},1146:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天是小浩算法 “365刷题计划” 第 108 天。为大家讲解 leetcode 第 59 题,是一道中等难度的题目。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("大家也可以先看下该题的第一个版本:")]),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.99.其他补充题目/01.html"}},[s._v("螺旋矩阵Ⅰ(54)")])],1),s._v(" "),n("br"),s._v(" "),n("p",[s._v("本类题目在面试时出现的频率"),n("strong",[s._v("极高")]),s._v(",尤其是对于工作年限在三年内的同学。因为该题非常考验 coding 能力,"),n("strong",[s._v("尤其是对边界条件的处理")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("很容易筛选面试者。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1018),alt:"PNG"}}),s._v(" "),n("br"),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(1019),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("做这道题之前,可以通过上面的链接做一下螺旋矩阵Ⅰ")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第59题:螺旋矩阵Ⅱ")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个正整数 n,生成一个包含 1 到 n**2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。")])])])]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: 3\n输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("题目理解较为容易,给定 n = 3,那就生成一个 3^2 = 9 的矩阵。大家看下面的图可能更加直观一些:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(1020),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("螺旋矩阵类的题目,"),n("strong",[s._v("思路基本都为模拟路径,难点都是考察边界的处理")]),s._v("。虽然也有一些奇淫巧技,但万变不离其宗。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("既然要模拟路径,先分析下路径是什么:")]),s._v(" "),n("br"),s._v(" "),n("center",[s._v("右-下-左-上")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("然后模拟向内环绕的过程,逐层填充:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1021),alt:"PNG"}}),s._v(" "),n("p",[s._v("这种方法其实有一个专业点的名字,叫做:蛇形填数")]),s._v(" "),n("br"),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1022),alt:"PNG"}}),s._v(" "),n("br"),s._v(" "),n("p",[s._v("这里额外说一下,除了上面这种填充方式外,还有一种填充方式:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(1023),alt:"PNG"}}),s._v(" "),n("p",[s._v("两者的区别,只是边界条件设定不同。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("第一种填充方式的代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("generateMatrix")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" e "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v("e "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("p",[s._v("第二种填充方式的代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("generateMatrix")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" e "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" e "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" e "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("p",[s._v("看完这两种解法,有没有 get✔ 到这道题目的核心呢?正是大量的边界操作,让这道题目成为了面试官的香饽饽。如果 coding 能力比较差,基本都会栽到这道题目上。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,非常建议基础较差的同学,认真练习一下上面的两种实现。")]),s._v(" "),n("br"),s._v(" "),n("h2",{attrs:{id:"_03、相似题目"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、相似题目"}},[s._v("#")]),s._v(" 03、相似题目")]),s._v(" "),n("blockquote",[n("p",[s._v("然后这里我准备了几道同一类型的题目,建议大家刷一刷。完成之后可能会有一些不一样的思考。")])]),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.99.其他补充题目/01.html"}},[s._v("螺旋矩阵Ⅰ(54)")])],1),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.99.其他补充题目/51.html"}},[s._v("旋转图像(48)")])],1),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.99.其他补充题目/1.99.其他补充题目/31.html"}},[s._v("生命游戏(289)")])],1),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])],1)}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/45.308197a4.js b/learning/.vuepress/dist/assets/js/45.308197a4.js deleted file mode 100644 index 3d025123..00000000 --- a/learning/.vuepress/dist/assets/js/45.308197a4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{1046:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("p",[s._v("我们先来看一道题目:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第350题:两个数组的交集")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定两个数组,编写一个函数来计算它们的交集。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: nums1 = [1,2,2,1], nums2 = [2,2]\n\n输出: [2,2]\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]\n\n输出: [4,9]\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[s._v("说明:")]),s._v(" "),n("ul",[n("li",[s._v("输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。")]),s._v(" "),n("li",[s._v("我们可以不考虑输出结果的顺序。")])]),s._v(" "),n("p",[s._v("进阶:")]),s._v(" "),n("ul",[n("li",[s._v("如果给定的数组已经排好序呢?将如何优化你的算法呢?")])]),s._v(" "),n("p",[s._v("思路:设定两个为0的指针,比较两个指针的元素是否相等。如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。")]),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("首先拿到这道题,我们基本马上可以想到,此题可以看成是一道传统的"),n("strong",[s._v("映射题(map映射)")]),s._v(",为什么可以这样看呢,因为"),n("strong",[s._v("我们需找出两个数组的交集元素,同时应与两个数组中出现的次数一致。这样就导致了我们需要知道每个值出现的次数,所以映射关系就成了<元素,出现次数>")]),s._v("。剩下的就是顺利成章的解题。")])]),s._v(" "),n("p",[s._v("由于该种解法过于简单,我们不做进一步分析,直接给出题解:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//GO")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("intersect")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums1 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums2 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n m0 "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("map")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" v "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" nums1 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//遍历nums1,初始化map")]),s._v("\n m0"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" v "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" nums2 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//如果元素相同,将其存入nums2中,并将出现次数减1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" m0"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n m0"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("v"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" v\n k"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("p",[s._v("这个方法比较简单,相信大家都能看的懂!")]),s._v(" "),n("h2",{attrs:{id:"_03、题目进阶"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目进阶"}},[s._v("#")]),s._v(" 03、题目进阶")]),s._v(" "),n("blockquote",[n("p",[s._v("题目在进阶问题中问道:如果给定的数组已经排好序呢?你将如何优化你的算法?我们分析一下,假如两个数组都是有序的,分别为:arr1 = [1,2,3,4,4,13],arr2 = [1,2,3,9,10]")])]),s._v(" "),n("p",[n("img",{attrs:{src:a(462),alt:"PNG"}})]),s._v(" "),n("p",[s._v("对于两个已经排序好数组的题,我们可以很容易想到使用双指针的解法~")]),s._v(" "),n("p",[s._v("解题步骤如下:")]),s._v(" "),n("p",[s._v("<1>设定两个为0的指针,**比较两个指针的元素是否相等。**如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。下图中我们的指针分别指向第一个元素,判断元素相等之后,将相同元素放到空白的数组。")]),s._v(" "),n("p",[n("img",{attrs:{src:a(463),alt:"PNG"}})]),s._v(" "),n("p",[s._v("<2>如果两个指针的元素不相等,**我们将小的一个指针后移。**图中我们指针移到下一个元素,判断不相等之后,将元素小的指针向后移动,继续进行判断。")]),s._v(" "),n("p",[n("img",{attrs:{src:a(464),alt:"PNG"}})]),s._v(" "),n("p",[s._v("<3>反复以上步骤。")]),s._v(" "),n("p",[n("img",{attrs:{src:a(465),alt:"PNG"}})]),s._v(" "),n("p",[s._v("<4>直到任意一个数组终止。")]),s._v(" "),n("p",[n("img",{attrs:{src:a(466),alt:"PNG"}})]),s._v(" "),n("h2",{attrs:{id:"_04、题目解答"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、题目解答"}},[s._v("#")]),s._v(" 04、题目解答")]),s._v(" "),n("p",[s._v("根据分析,我们很容易得到下面的题解:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//GO")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("intersect")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums1 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums2 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\ti"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n\tsort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Ints")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\tsort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Ints")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\tj"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\ti"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\tnums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t\ti"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t\tj"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t\tk"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nums1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br")])]),n("blockquote",[n("p",[s._v("提示:解答中我们并没有创建空白数组,因为遍历后的数组其实就没用了。我们可以"),n("strong",[s._v("将相等的元素放入用过的数组中,就为我们节省下了空间")]),s._v("。")])])])}),[],!1,null,null,null);t.default=r.exports},462:function(s,t,a){s.exports=a.p+"assets/img/1.7a0a4d35.jpg"},463:function(s,t,a){s.exports=a.p+"assets/img/2.583ba8c5.png"},464:function(s,t,a){s.exports=a.p+"assets/img/3.53ddd978.png"},465:function(s,t,a){s.exports=a.p+"assets/img/4.2af867bd.png"},466:function(s,t,a){s.exports=a.p+"assets/img/5.16739550.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/46.2e7c9ee4.js b/learning/.vuepress/dist/assets/js/46.2e7c9ee4.js deleted file mode 100644 index d0aff8da..00000000 --- a/learning/.vuepress/dist/assets/js/46.2e7c9ee4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{1058:function(t,s,n){"use strict";n.r(s);var a=n(3),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"_01、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("第1题:两数之和")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。")])])])]),t._v(" "),a("p",[t._v("你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。")]),t._v(" "),a("p",[a("strong",[t._v("示例:")])]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("给定 nums = [2, 7, 11, 15], target = 9\n因为 nums[0] + nums[1] = 2 + 7 = 9\n所以返回 [0, 1]\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br")])]),a("br"),t._v(" "),a("blockquote",[a("p",[t._v("题目分析")])]),t._v(" "),a("p",[t._v("首先我们拿到题目一看,马上可以想到"),a("strong",[t._v("暴力题解")]),t._v("。我们只需要 “"),a("strong",[t._v("遍历每个元素 x,并查找是否存在一个值与 target - x 相等的目标元素。")]),t._v("”"),a("br"),t._v(" "),a("br"),t._v("\n由于该种解题思路过于简单,直接上代码(如果有问题请留言..):")]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("func twoSum(nums []int, target int) []int {\n\tfor i, v := range nums {\n\t\tfor k := i + 1; k < len(nums); k++ {\n\t\t\tif target-v == nums[k] {\n\t\t\t\treturn []int{i, k}\n\t\t\t}\n\t\t}\n\t}\n\treturn []int{}\n}\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br")])]),a("p",[t._v("执行结果:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(498),alt:"PNG"}}),t._v(" "),a("blockquote",[a("p",[t._v("运行成功,但是该种解题方式的时间复杂度过高,达到了O(n²)。为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。我们可以想到用"),a("strong",[t._v("哈希表")]),t._v("的方式,通过以空间换取时间的方式来进行。")])]),t._v(" "),a("h2",{attrs:{id:"_02、题目图解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),a("p",[t._v("假设 nums = [2, 7, 11, 15], target = 9")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("<1> 首先,我们还是先遍历数组 nums,i 为当前下标。我们需要将每一个遍历的值放入 map 中作为 key。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(499),alt:"PNG"}}),t._v(" "),a("p",[t._v("<2> 同时,对每个值都判断 map 中是否存在 "),a("strong",[t._v("target-nums[i]")]),t._v(" 的 key 值。在这里就是 9-7=2。我们可以看到 2 在 map 中已经存在。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(500),alt:"PNG"}}),t._v(" "),a("p",[t._v("<3> 所以,2 和 7 所在的 key 对应的 value,也就是 [0,1]。就是我们要找的两个数组下标。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(501),alt:"PNG"}}),t._v(" "),a("h2",{attrs:{id:"_03、go语言示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),a("p",[t._v("根据以上分析,我们可以得到下面的题解:")]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("func twoSum(nums []int, target int) []int {\n result := []int{}\n m := make(map[int]int)\n for i,k := range nums { \n if value,exist := m[target-k];exist {\n result = append(result,value)\n result = append(result,i)\n }\n m[k] = i\n }\n return result\n}\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br")])]),a("p",[t._v("执行结果:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(502),alt:"PNG"}})])}),[],!1,null,null,null);s.default=e.exports},498:function(t,s,n){t.exports=n.p+"assets/img/1.be7ce0b0.jpg"},499:function(t,s,n){t.exports=n.p+"assets/img/2.6c7de304.jpeg"},500:function(t,s,n){t.exports=n.p+"assets/img/3.5e716077.jpg"},501:function(t,s,n){t.exports=n.p+"assets/img/4.3a449284.jpg"},502:function(t,s,n){t.exports=n.p+"assets/img/5.e45f10c1.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/47.5add939a.js b/learning/.vuepress/dist/assets/js/47.5add939a.js deleted file mode 100644 index 1e4fc869..00000000 --- a/learning/.vuepress/dist/assets/js/47.5add939a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{1055:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("“时代中的一粒灰,落在个人那里,可能就是一座山。而我们偏偏处在一个尘土飞扬的时代之中。” 为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院于4月3日发布公告,决定 2020年4月4日 举行全国性哀悼活动。而我,在这里也致谢那些扛起大山的人!")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天给大家讲解一道经典鹅厂面试题,有一定难度。大家认真看哦。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("建议先回顾一下前面关于该题简化版,二数之和。")]),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.0.数组系列/1.0.数组系列/007.html"}},[s._v("两数之和(1)")])],1),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("该题为 二数之和 的进阶版本,当然还有一个进阶版本为 四数之和。我们将会一一进行分析!")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第15题:三数之和")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定数组 nums = [-1, 0, 1, 2, -1, -4],\n满足要求的三元组集合为:\n[\n [-1, 0, 1],\n [-1, -1, 2]\n]\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("本题的暴力题解可以仿照二数之和,直接三层遍历,取和为0的三元组,并记录下来,最后再去重。但是作为一个有智慧的人,我们不能这么去做。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("因为我们的目标是找数,当然使用指针的方式最简单。假若我们的数组为:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("[-1, 0, 1, 2, -1, -4]\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("求解过程如下:首先我们先把数组排个序(原因一会儿说),排完序长这样:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(486),alt:"PNG"}}),s._v(" "),n("p",[s._v("因为我们要同时找三个数,所以"),n("strong",[s._v("采取固定一个数,同时用双指针来查找另外两个数的方式")]),s._v("。所以初始化时,我们选择固定第一个元素(当然,这一轮走完了,这个蓝框框我们就要也往前移动),同时将下一个元素和末尾元素分别设上 left 和 right 指针。画出图来就是下面这个样子:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(487),alt:"PNG"}}),s._v(" "),n("p",[s._v("现在已经找到了三个数,当然是计算其三值是否满足三元组。但是这里因为我们已经排好了序,如果"),n("strong",[s._v("固定下来的数(上面蓝色框框)本身就大于 0,那三数之和必然无法等于 0")]),s._v("。比如下面这种:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(488),alt:"PNG"}}),s._v(" "),n("p",[s._v("然后自然用脚指头也能想到,我们需要移动指针。现在我们的排序就发挥出用处了,"),n("strong",[s._v("如果和大于0,那就说明 right 的值太大,需要左移。如果和小于0,那就说明 left 的值太小")]),s._v(",需要右移。(上面这个思考过程是本题的核心) 整个过程如下图所示:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(489),alt:"PNG"}}),s._v(" "),n("p",[s._v("其中:在第6行时,因为三数之和大于0,所以right进行了左移。最后一行,跳过了重复的-1。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("然后啰嗦一句,因为我们需要处理重复值的情况。除了固定下来的i值(蓝框框),left 和 right 当然也是需要处理重复的情况,所以对于 left 和 left+1,以及 right 和 right-1,我们都单独做一下重复值的处理。(其实没啥处理,就是简单的跳过)")]),s._v(" "),n("h2",{attrs:{id:"_03、代码展示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、代码展示"}},[s._v("#")]),s._v(" 03、代码展示")]),s._v(" "),n("blockquote",[n("p",[s._v("四数之和其实与本题解法差不太多,把固定一个数变成两个,同样还是使用双指针进行求解就可以了。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("根据上面的分析,顺利得出代码(给一个Java版本的):")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("threeSum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" target "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("asList")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" l"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("r "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" r"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n l"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n r"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n l"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v("\n r"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(490),alt:"PNG"}}),s._v(" "),n("p",[s._v("给一个python版本的(这个我就直接拿别人的代码了,思想都一样)")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("//")]),s._v("python\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("threeSum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n \n n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n res"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("not")]),s._v(" nums "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("or")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n res"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),s._v("\n L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("append"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("R "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("R "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("elif")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("R"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("L"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=r.exports},486:function(s,t,a){s.exports=a.p+"assets/img/1.0507c071.jpg"},487:function(s,t,a){s.exports=a.p+"assets/img/2.5e72397e.jpg"},488:function(s,t,a){s.exports=a.p+"assets/img/3.bb5bf3f0.jpg"},489:function(s,t,a){s.exports=a.p+"assets/img/4.78f043f5.jpg"},490:function(s,t,a){s.exports=a.p+"assets/img/5.1df63ac6.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/48.5773e413.js b/learning/.vuepress/dist/assets/js/48.5773e413.js deleted file mode 100644 index 5be622f1..00000000 --- a/learning/.vuepress/dist/assets/js/48.5773e413.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{1067:function(s,t,n){"use strict";n.r(t);var a=n(3),r=Object(a.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("blockquote",[a("p",[s._v("在前两篇中,我们分别学习了 “"),a("strong",[s._v("三角形最小路径和")]),s._v("” 以及“"),a("strong",[s._v("矩形最小路径和")]),s._v("” 的问题,相信已经掌握了这类题型的解题方式。我们只要"),a("strong",[s._v("明确状态的定义")]),s._v(",基本上都可以顺利求解。")]),s._v(" "),a("p",[s._v("在本节中,我们将回归一道简单点的题目,目的是剖析一下"),a("strong",[s._v("状态定义的过程")]),s._v(",并且举例说明如果状态定义错误,会对我们带来多大困扰!希望大家不要轻视!")])]),s._v(" "),a("h2",{attrs:{id:"_01、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("第198题:打家劫舍")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。")])])])]),s._v(" "),a("p",[s._v("给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。")]),s._v(" "),a("p",[a("strong",[s._v("示例 1:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入: [1,2,3,1]\n输出: 4\n解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。\n\t 偷窃到的最高金额 = 1 + 3 = 4 。\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[a("strong",[s._v("示例 2:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入: [2,7,9,3,1]\n输出: 12\n解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。\n 偷窃到的最高金额 = 2 + 9 + 1 = 12 。\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("br"),s._v(" "),a("blockquote",[a("p",[a("strong",[s._v("本题主要剖析状态定义的过程!强烈建议先进行前面5节内容的学习!")])]),s._v(" "),a("p",[a("strong",[s._v("以达到最好的学习效果!")])])]),s._v(" "),a("h2",{attrs:{id:"_02、题目图解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[s._v("#")]),s._v(" 02、题目图解")]),s._v(" "),a("p",[s._v("假设有i间房子,我们可能会定义出两种状态:")]),s._v(" "),a("ul",[a("li",[s._v("dp[i] : 偷盗 含 第 i个房子时,所获取的最大利益")]),s._v(" "),a("li",[s._v("dp[i] : 偷盗 至 第 i个房子时,所获取的最大利益")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("如果我们定义为状态一,因为我们没办法知道"),a("strong",[s._v("获取最高金额时")]),s._v(",小偷到底偷盗了哪些房屋。所以我们需要找到"),a("strong",[s._v("所有状态中的最大值")]),s._v(",才能找到我们的最终答案。即:")]),s._v(" "),a("blockquote",[a("center",[a("b",[s._v(" max(dp[0],dp[1],.....,dp[len(dp)-1]) ")])])],1),s._v(" "),a("p",[s._v("如果我们定义为状态二,因为小偷一定会"),a("strong",[s._v("从前偷到最后")]),s._v("(强调:偷盗至第i个房间,不代表小偷要从第i个房间中获取财物)。所以我们的最终答案很容易确定。即:")]),s._v(" "),a("center",[a("b",[s._v(" dp[i] ")])]),s._v(" "),a("p",[s._v("现在我们分析这两种状态定义下的状态转移方程:")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("如果是状态一,偷盗含第 i 个房间时能获取的最高金额,我们相当于要"),a("strong",[s._v("找到偷盗每一间房子时可以获取到的最大金额")]),s._v("。比如下图,我们要找到 dp[4] ,也就是偷盗 9 这间房子时,能获取到的最大金额。")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(537),alt:"PNG"}}),s._v(" "),a("p",[s._v("那我们就需要找到与9不相邻的前后两段中能获取到的最大金额。")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(538),alt:"PNG"}}),s._v(" "),a("p",[s._v("我们发现题目进入恶性循环,因为我们若要找到与9不相邻的两端中能偷盗的最大金额,根据 dp[i] 的定义,我们就又需要分析在这两段中盗取每一间房子时所能获取的最大利益!想想都很可怕!所以我们放弃掉这种状态的定义。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("如果是状态二,偷盗至第 i 个房子时,所能获取的最大利益。那我们可以想到,"),a("strong",[s._v("由于不可以在相邻的房屋闯入,所以 至i房屋可盗窃的最大值,要么就是至 i-1 房屋可盗窃的最大值,要么就是至 i-2 房屋可盗窃的最大值加上当前房屋的值,二者之间取最大值,即:")])]),s._v(" "),a("center",[a("b",[s._v(" dp[i] = max(dp[i-2]+nums[i], dp[i-1])")])]),s._v(" "),a("p",[s._v("如果不能理解可以看下图:")]),s._v(" "),a("p",[s._v("(相当于小贼背了个背包,里边装了之前偷来的财物,每到达下一个房间门口,来选择是偷还是不偷。)")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(539),alt:"PNG"}}),s._v(" "),a("h2",{attrs:{id:"_03、go语言示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[s._v("#")]),s._v(" 03、GO语言示例")]),s._v(" "),a("p",[s._v("分析完毕,我们根据第二种状态定义进行求解:")]),s._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n dp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("b "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" a "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" b "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" a\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" b\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("p",[s._v("运行结果:")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(540),alt:"PNG"}}),s._v(" "),a("p",[s._v("同样,运行上面的代码,我们发现使用的内存过大。有没有什么办法可以压缩内存呢?我们很容易想到,在小贼偷盗的过程中,不可能转回头去到自己已经偷过的房间!(太蠢)小偷只需要每次将财物搬到下一个房间就行!")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("根据上面思路,优化后的代码如下:")]),s._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("b "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" a "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" b "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" a\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" b\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br")])]),a("p",[s._v("运行结果:")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(541),alt:"PNG"}})],1)}),[],!1,null,null,null);t.default=r.exports},537:function(s,t,n){s.exports=n.p+"assets/img/1.a3360867.jpg"},538:function(s,t,n){s.exports=n.p+"assets/img/2.eeed6c30.jpg"},539:function(s,t,n){s.exports=n.p+"assets/img/3.369c22de.png"},540:function(s,t,n){s.exports=n.p+"assets/img/4.dbb7a6ee.jpg"},541:function(s,t,n){s.exports=n.p+"assets/img/5.8c39bbb1.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/49.ce9a72db.js b/learning/.vuepress/dist/assets/js/49.ce9a72db.js deleted file mode 100644 index 41b19c9d..00000000 --- a/learning/.vuepress/dist/assets/js/49.ce9a72db.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{1069:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("前几天的内容大家可能会觉得比较散。这是因为我目前正在筹划"),n("strong",[s._v("背包系列")]),s._v("和"),n("strong",[s._v("贪心系列")]),s._v("两个主题的内容,所以时间比较紧张,就拿出了之前写的一些题解凑凑数。不过呢,今天我将为大家开启一个新的篇章 - "),n("strong",[s._v("字符串匹配系列篇")]),s._v(",文章写得很用心,相信大家定有所获。")])]),s._v(" "),n("h2",{attrs:{id:"_01、实现-strstr"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、实现-strstr"}},[s._v("#")]),s._v(" 01、实现 strStr()")]),s._v(" "),n("blockquote",[n("p",[s._v("字符串匹配类型的题目,是字符串类型中占比很大的一个支类。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("题目:实现 strStr()")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: haystack = "hello", needle = "ll"\n输出: 2\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: haystack = "aaaaa", needle = "bba"\n输出: -1\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("说明:")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。")]),s._v(" "),n("h2",{attrs:{id:"_02、sunday-匹配"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、sunday-匹配"}},[s._v("#")]),s._v(" 02、Sunday 匹配")]),s._v(" "),n("blockquote",[n("p",[s._v("Sunday 算法是 Daniel M.Sunday 于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法"),n("strong",[s._v("能跳过尽可能多的字符")]),s._v("以进行下一步的匹配,从而提高了匹配效率。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("因为该问是字符串匹配篇第一讲,所以先普及几个概念:")]),s._v(" "),n("ul",[n("li",[s._v("串:串是字符串的简称")]),s._v(" "),n("li",[s._v("空串:长度为零的串称为空串")]),s._v(" "),n("li",[s._v("主串:包含子串的串相应地称为主串")]),s._v(" "),n("li",[s._v("子串:串中任意个连续字符组成的子序列称为该串的子串")]),s._v(" "),n("li",[s._v("模式串:子串的定位运算又称为串的模式匹配,是一种求子串第一个字符在主串中序号的运算。被匹配的主串称为目标串,子串称为模式串。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("了解这些基本概念,回到这个算法。Sunday匹配不是说这人在周末发现了这个算法,而是这人名字叫星期天(可能父母总加班,所以起了这么个名)。听起来牛叉的不得了,其实是个啥意思:")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("假若我们的目标串为:Here is a little Hao")]),s._v(" "),n("p",[s._v("模式串为:little")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("一般来讲,字符串匹配算法第一步,"),n("strong",[s._v("都是把目标串和模式串对齐")]),s._v("。不管是KMP,BM,SUNDAY都是这样。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(545),alt:"PNG"}}),s._v(" "),n("p",[s._v("而对于SUNDAY算法,我们"),n("strong",[s._v("从头部开始比较,一旦发现不匹配,直接找到主串中位于模式串后面的第一个字符")]),s._v(",即下面绿色的 “s”。(这里说明一下,为什么是找模式串后面的第一个字符。在把模式串和目标串对齐后,如果发现不匹配,那肯定需要移动模式串。问题是需要移动多少步。各字符串匹配算法之间的差别也来自于这个地方,对于KMP,是建立部分匹配表来计算。BM,是反向比较计算移动量。对于SUNDAY,就是找到模式串后的第一个字符。因为,无论模式串移动多少步,模式串后的第一个字符都要参与下一次比较,也就是这里的 “s”)")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(546),alt:"PNG"}}),s._v(" "),n("p",[s._v("找到了模式串后的第一个字符 “s”,接下来该怎么做?我们需要"),n("strong",[s._v("查看模式串中是否包含这个元素,如果不包含那就可以跳过一大片,从该字符的下一个字符开始比较。")])]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(547),alt:"PNG"}}),s._v(" "),n("p",[s._v("因为仍然不匹配(空格和l),我们继续重复上面的过程。找到模式串的下一个元素:t")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(548),alt:"PNG"}}),s._v(" "),n("p",[s._v("现在有意思了,我们发现 t 被包含于模式串中,并且 t 出现在模式串倒数第3个。所以我们把模式串向前移动3个单位:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(549),alt:"PNG"}}),s._v(" "),n("p",[s._v("有内味了,我们发现竟然匹配成功了,是不是很神奇?证明的过程今天暂且不谈(后面我会出一个算法证明篇,来证明之前讲过的一些算法。"),n("strong",[s._v("我需要你做的是,掌握上面这些!")]),s._v(")")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("捞干货,这个过程里我们做了一些什么:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("对齐目标串和模式串,从前向后匹配")]),s._v(" "),n("li",[n("strong",[s._v("关注主串中位于模式串后面的第一个元素(核心)")])]),s._v(" "),n("li",[s._v("如果关注的字符没有在子串中出现则直接跳过")]),s._v(" "),n("li",[s._v("否则开始移动模式串,移动位数 = 子串长度 - 该字符最右出现的位置(以0开始)")])]),s._v(" "),n("h2",{attrs:{id:"_03、算法应用"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、算法应用"}},[s._v("#")]),s._v(" 03、算法应用")]),s._v(" "),n("blockquote",[n("p",[s._v("自然是把这个算法应用到我们的题目中咯...")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("根据分析,得出代码:(给一个保证你能看的懂的JAVA版本的)")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("strStr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" origin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" aim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("origin "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" aim "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("origin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" aim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//目标串匹配索")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" originIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//模式串匹配索引")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" aimIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 成功匹配完终止条件:所有aim均成功匹配")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("aimIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" aim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 针对origin匹配完,但aim未匹配完情况处理 如 mississippi sippia")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("originIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" origin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("origin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("originIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" aim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("aimIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 匹配则index均加1")]),s._v("\n originIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n aimIndex"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//在我们上面的样例中,第一次计算值为6,第二次值为13")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" nextCharIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" originIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" aimIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" aim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//判断下一个目标字符(上面图里的那个绿框框)是否存在。")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nextCharIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" origin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 判断目标字符在模式串中匹配到,返回最后一个匹配的index")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" step "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" aim"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("lastIndexOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("origin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nextCharIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("step "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 不存在的话,设置到目标字符的下一个元素")]),s._v("\n originIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nextCharIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 存在的话,移动对应的数字(参考上文中的存在公式)")]),s._v("\n originIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nextCharIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" step"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//模式串总是从第一个开始匹配")]),s._v("\n aimIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" originIndex "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" aimIndex"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br")])]),n("h2",{attrs:{id:"_04、啰嗦吧唧"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、啰嗦吧唧"}},[s._v("#")]),s._v(" 04、啰嗦吧唧")]),s._v(" "),n("blockquote",[n("p",[s._v("**调研一下,这种通过题目来讲解知识的方式,大家是否喜欢?**如果喜欢,请留言区扣1。如果不喜欢,请说明理由~")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("发现网上上来就讲解字符串匹配算法的文章实在是太多了,也不缺我这一个。所以我尝试了这种通过“"),n("strong",[s._v("图解+题目+知识串讲")]),s._v("”的形式,文中我也尽可能的减少公式化的东西,让大家能看的进去。"),n("strong",[s._v("希望大家可以给我反馈")]),s._v(",如果大家觉得这种形式ok,那么我后面会更高频的去使用这种形式。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=e.exports},545:function(s,t,a){s.exports=a.p+"assets/img/1.f441ca2d.jpg"},546:function(s,t,a){s.exports=a.p+"assets/img/2.fc3a2c47.jpg"},547:function(s,t,a){s.exports=a.p+"assets/img/3.af2b4e20.jpg"},548:function(s,t,a){s.exports=a.p+"assets/img/4.73e083c6.jpg"},549:function(s,t,a){s.exports=a.p+"assets/img/5.607471fb.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/5.ac596411.js b/learning/.vuepress/dist/assets/js/5.ac596411.js deleted file mode 100644 index 0d074947..00000000 --- a/learning/.vuepress/dist/assets/js/5.ac596411.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{1039:function(t,e,a){"use strict";a.r(e);a(50);var n=a(380),r=a(376),s=a(381),o=a(372),c=a(363),i=a(46),u=a(361),f={mixins:[o.a,u.a],components:{Common:n.a,NoteAbstract:r.a,TagList:s.a,ModuleTransition:c.a},data:function(){return{currentPage:1,currentTag:"全部"}},computed:{posts:function(){var t=this.$currentTags.pages;return t=Object(i.a)(t),Object(i.c)(t),t}},mounted:function(){this._setPage(this._getStoragePage())},methods:{getCurrentTag:function(t){this.$emit("currentTag",t)},tagClick:function(t){this.$router.push({path:t.path})},getCurrentPage:function(t){this._setPage(t),setTimeout((function(){window.scrollTo(0,0)}),100)},_setPage:function(t){this.currentPage=t,this.$page.currentPage=t,this._setStoragePage(t)}},watch:{$route:function(){this._setPage(this._getStoragePage())}}},g=(a(365),a(399),a(454),a(3)),l=Object(g.a)(f,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"tag-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("TagList",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"tags",attrs:{currentTag:t.$currentTags.key},on:{getCurrentTag:t.tagClick}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.posts,currentPage:t.currentPage},on:{currentTag:t.$currentTags.key}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[a("pagation",{staticClass:"pagation",attrs:{total:t.posts.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],1)],1)}),[],!1,null,"7984cb6f",null);e.default=l.exports},356:function(t,e,a){},357:function(t,e,a){},358:function(t,e,a){},359:function(t,e,a){},360:function(t,e,a){},362:function(t,e,a){"use strict";function n(){var t=["#e15b64","#f47e60","#f8b26a","#abbd81","#849b87","#e15b64","#f47e60","#f8b26a","#f26d6d","#67cc86","#fb9b5f","#3498db"];return t[Math.floor(Math.random()*t.length)]}a.d(e,"a",(function(){return n}))},364:function(t,e,a){"use strict";a(366),a(25),a(368),a(26),a(30);var n=a(49),r={props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},data:function(){return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"}}},filters:{formatDateValue:function(t){if(!t)return"";t=t.replace("T"," ").slice(0,t.lastIndexOf("."));var e=Number(t.substr(11,2)),a=Number(t.substr(14,2)),r=Number(t.substr(17,2));return e>0||a>0||r>0?Object(n.d)(t):Object(n.d)(t,"yyyy-MM-dd")}},methods:{goTags:function(t){this.$router.push({path:"/tags/".concat(t,"/")})}}},s=(a(369),a(3)),o=Object(s.a)(r,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title?a("i",{staticClass:"iconfont reco-account"},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("i",{staticClass:"iconfont reco-date"},[a("span",[t._v(t._s(t._f("formatDateValue")(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("i",{staticClass:"iconfont reco-eye"},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("i",{staticClass:"iconfont reco-tag tags"},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return t.goTags(e)}}},[t._v("\n "+t._s(e)+"\n ")])})),0):t._e()])}),[],!1,null,"484a899e",null);e.a=o.exports},365:function(t,e,a){"use strict";var n=a(356);a.n(n).a},366:function(t,e,a){var n=a(0),r=a(367);n({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},367:function(t,e,a){"use strict";var n=a(16),r=a(31),s=a(11),o=a(27),c=a(20),i=Math.min,u=[].lastIndexOf,f=!!u&&1/[1].lastIndexOf(1,-0)<0,g=o("lastIndexOf"),l=c("indexOf",{ACCESSORS:!0,1:0}),p=f||!g||!l;t.exports=p?function(t){if(f)return u.apply(this,arguments)||0;var e=n(this),a=s(e.length),o=a-1;for(arguments.length>1&&(o=i(o,r(arguments[1]))),o<0&&(o=a+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:u},368:function(t,e,a){"use strict";var n=a(7),r=a(4),s=a(107),o=a(21),c=a(5),i=a(34),u=a(177),f=a(35),g=a(1),l=a(52),p=a(51).f,h=a(33).f,m=a(8).f,d=a(378).trim,v=r.Number,_=v.prototype,b="Number"==i(l(_)),I=function(t){var e,a,n,r,s,o,c,i,u=f(t,!1);if("string"==typeof u&&u.length>2)if(43===(e=(u=d(u)).charCodeAt(0))||45===e){if(88===(a=u.charCodeAt(2))||120===a)return NaN}else if(48===e){switch(u.charCodeAt(1)){case 66:case 98:n=2,r=49;break;case 79:case 111:n=8,r=55;break;default:return+u}for(o=(s=u.slice(2)).length,c=0;cr)return NaN;return parseInt(s,n)}return+u};if(s("Number",!v(" 0o1")||!v("0b1")||v("+0x1"))){for(var C,T=function(t){var e=arguments.length<1?0:t,a=this;return a instanceof T&&(b?g((function(){_.valueOf.call(a)})):"Number"!=i(a))?u(new v(I(e)),a,T):I(e)},N=n?p(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),P=0;N.length>P;P++)c(v,C=N[P])&&!c(T,C)&&m(T,C,h(v,C));T.prototype=_,_.constructor=T,o(r,"Number",T)}},369:function(t,e,a){"use strict";var n=a(357);a.n(n).a},370:function(t,e,a){"use strict";var n=a(358);a.n(n).a},371:function(t,e,a){"use strict";var n=a(359);a.n(n).a},372:function(t,e,a){"use strict";a(377);e.a={methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",{page:1,path:""}),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}},373:function(t,e,a){},376:function(t,e,a){"use strict";a(25);var n={components:{PageInfo:a(364).a},props:["item","currentPage","currentTag"]},r=(a(370),a(3)),s={components:{NoteAbstractItem:Object(r.a)(n,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item"},[t.item.frontmatter.sticky?a("i",{staticClass:"iconfont reco-sticky"}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("i",{staticClass:"iconfont reco-lock"}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("hr",{staticClass:"hr"}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"28f76ce9",null).exports},props:["data","currentPage","currentTag"],computed:{currentPageData:function(){var t=10*this.currentPage-10,e=10*this.currentPage;return this.data.slice(t,e)}}},o=(a(371),Object(r.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),1)}),[],!1,null,"b014bc36",null));e.a=o.exports},379:function(t,e,a){"use strict";var n=a(360);a.n(n).a},381:function(t,e,a){"use strict";a(106);var n=a(22),r=a(362),s={props:{currentTag:{type:String,default:""}},computed:{tags:function(){return[{name:"全部",path:"/tag/"}].concat(Object(n.a)(this.$tags.list))}},methods:{tagClick:function(t){this.$emit("getCurrentTag",t)},getOneColor:r.a}},o=(a(379),a(3)),c=Object(o.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,n){return a("span",{key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"36b9f66a",null);e.a=c.exports},399:function(t,e,a){"use strict";var n=a(373);a.n(n).a},408:function(t,e,a){},454:function(t,e,a){"use strict";var n=a(408);a.n(n).a}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/50.715a12c5.js b/learning/.vuepress/dist/assets/js/50.715a12c5.js deleted file mode 100644 index 240cc9b8..00000000 --- a/learning/.vuepress/dist/assets/js/50.715a12c5.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{1072:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("在计算机科学中,二叉树是"),n("strong",[s._v("每个结点最多有两个子树")]),s._v("的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于"),n("strong",[s._v("实现二叉查找树")]),s._v("和"),n("strong",[s._v("二叉堆")]),s._v("。树比链表稍微复杂,因为链表是线性数据结构,而树不是。树的问题很多都可以由"),n("strong",[s._v("广度优先搜索")]),s._v("或"),n("strong",[s._v("深度优先搜索解决")]),s._v("。")]),s._v(" "),n("p",[s._v("在本系列中,我们将通过一些例题,学习关于二叉树的经典操作!")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第104题:二叉树的最大深度")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数")])])])]),s._v(" "),n("p",[s._v("说明: 叶子节点是指没有子节点的节点。")]),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定二叉树 [3,9,20,null,null,15,7],\n 3 \n / \\ \n 9 20 \n / \\ \n 15 7\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("br"),s._v(" "),n("center",[n("b",[s._v(" 本系列内容均为必须掌握! ")])]),s._v(" "),n("h2",{attrs:{id:"_02、递归求解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、递归求解"}},[s._v("#")]),s._v(" 02、递归求解")]),s._v(" "),n("p",[s._v("我们知道,**每个节点的深度与它左右子树的深度有关,且等于其左右子树最大深度值加上 1 **。即:")]),s._v(" "),n("blockquote",[n("center",[n("b",[s._v(" maxDepth(root) = max(maxDepth(root.left), ")])]),s._v(" "),n("center",[n("b",[s._v(" maxDepth(root.right)) + 1")])])],1),s._v(" "),n("p",[s._v("以 [3,4,20,null,null,15,7] 为例:")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("<1>我们要对根节点的最大深度求解,就要对其左右子树的深度进行求解")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(554),alt:"img"}}),s._v(" "),n("p",[s._v("<2>我们看出。以4为根节点的子树没有左右节点,其深度为 1 。而以 20 为根节点的子树的深度,同样取决于它的左右子树深度。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(555),alt:"img"}}),s._v(" "),n("p",[s._v("<3>对于15和7的子树,我们可以一眼看出其深度为 1 。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(556),alt:"img"}}),s._v(" "),n("p",[s._v("<4>由此我们可以得到根节点的最大深度为:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("maxDepth(root-3)\n=max(**maxDepth**(sub-4),**maxDepth**(sub-20))+1\n=max(1,max(**maxDepth**(sub-15),**maxDepth**(sub-7))+1)+1\n=max(1,max(1,1)+1)+1\n=max(1,2)+1\n=3\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("根据分析,我们通过"),n("strong",[s._v("递归")]),s._v("进行求解代码如下:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" a\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" b\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("br"),s._v(" "),n("h2",{attrs:{id:"_03、dfs"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、dfs"}},[s._v("#")]),s._v(" 03、DFS")]),s._v(" "),n("p",[s._v("其实我们上面用的递归方式,本质上是使用了DFS的思想。先介绍一下DFS:深度优先搜索算法(Depth First Search),对于二叉树而言,它沿着"),n("strong",[s._v("树的深度遍历树的节点,尽可能深的搜索树的分支")]),s._v(","),n("strong",[s._v("这一过程一直进行到已发现从源节点可达的所有节点为止")]),s._v("。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(557),alt:"img"}}),s._v(" "),n("p",[s._v("如上图二叉树,它的访问顺序为:")]),s._v(" "),n("blockquote",[n("center",[n("b",[s._v(" A-B-D-E-C-F-G ")])])],1),s._v(" "),n("p",[s._v("A-B-D-E-C-F-G")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("到这里,我们思考一个问题?虽然我们用递归的方式根据DFS的思想顺利完成了题目。但是这种方式的缺点却显而易见。因为"),n("strong",[s._v("在递归中,如果层级过深,我们很可能保存过多的临时变量,导致栈溢出")]),s._v("。这也是为什么我们一般不在后台代码中使用递归的原因。如果不理解,下面我们详细说明:")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("事实上,函数调用的参数是通过栈空间来传递的,在调用过程中会"),n("strong",[s._v("占用线程的栈资源")]),s._v("。而递归调用,"),n("strong",[s._v("只有走到最后的结束点后函数才能依次退出")]),s._v(",而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,我们引出下面的话题:如何将递归的代码转化成非递归的形式。这里请记住,"),n("strong",[s._v("99%的递归转非递归,都可以通过栈来进行实现")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("非递归的DFS,代码如下:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("traversal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Stack")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" stack "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Stack")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n stack"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("stack"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("empty")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),s._v(" node "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" stack"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("peek")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n stack"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("pop")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n stack"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n stack"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("push")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("node"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])]),n("p",[s._v("上面的代码,唯一需要强调的是,为什么需要先右后左压入数据?是因为我们需要将先访问的数据,后压入栈(请思考栈的特点)。")]),s._v(" "),n("p",[s._v("如果不理解代码,请看下图:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(558),alt:"img"}}),s._v(" "),n("p",[s._v("1:首先将a压入栈")]),s._v(" "),n("p",[s._v("2:a弹栈,将c、b压入栈(注意顺序)")]),s._v(" "),n("p",[s._v("3:b弹栈,将e、d压入栈")]),s._v(" "),n("p",[s._v("4:d、e、c弹栈,将g、f压入栈")]),s._v(" "),n("p",[s._v("5:f、g弹栈")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("至此,非递归的DFS就讲解完毕了。那我们如何通过非递归DFS的方式,来进行本题求解呢?相信已经很简单了,留下课后作业,请自行实践!")])],1)}),[],!1,null,null,null);t.default=e.exports},554:function(s,t,a){s.exports=a.p+"assets/img/1.5b25afb3.jpg"},555:function(s,t,a){s.exports=a.p+"assets/img/2.cb4efa34.jpg"},556:function(s,t,a){s.exports=a.p+"assets/img/3.fbeca3fc.jpg"},557:function(s,t,a){s.exports=a.p+"assets/img/4.4bdfb1c2.jpg"},558:function(s,t,a){s.exports=a.p+"assets/img/5.5a7a80a4.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/51.d2c164a4.js b/learning/.vuepress/dist/assets/js/51.d2c164a4.js deleted file mode 100644 index 63eceac8..00000000 --- a/learning/.vuepress/dist/assets/js/51.d2c164a4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{1087:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("date: 2020-06-12")]),t._v(" "),n("blockquote",[n("p",[t._v("有读者小伙伴建议讲一下"),n("strong",[t._v("滑动窗口")]),t._v("相关题型,因为经常面试会被问到。所以就开了这个系列(所以如果大家有想让分享的题型都可以留言区告诉我,任何事情我觉得都需要有反馈。比如一个错误,你不反馈,我不知道..那就只能这样过去了..)闲话不啰嗦,直接看题!")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第239题:滑动窗口最大值")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。")])])])]),t._v(" "),n("p",[t._v("给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("返回滑动窗口中的最大值"),n("strong",[t._v("所构成的数组")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3\n输出: [3,3,5,5,6,7] \n解释: \n\n 滑动窗口的位置 最大值\n--------------- -----\n[1 3 -1] -3 5 3 6 7 3\n 1 [3 -1 -3] 5 3 6 7 3\n 1 3 [-1 -3 5] 3 6 7 5\n 1 3 -1 [-3 5 3] 6 7 5\n 1 3 -1 -3 [5 3 6] 7 6\n 1 3 -1 -3 5 [3 6 7] 7\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br")])]),n("blockquote",[n("p",[n("strong",[t._v("本题有一定难度!建议认真阅读")])]),t._v(" "),n("p",[n("strong",[t._v("并课后练习~")])])]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("p",[t._v("本题对于题目没有太多需要额外说明的,应该都能理解,直接进行分析。我们很容易想到,可以"),n("strong",[t._v("通过遍历所有的滑动窗口,找到每一个窗口的最大值,来进行暴力求解")]),t._v("。那一共有多少个滑动窗口呢,小学题目,可以得到共有 "),n("strong",[t._v("L-k+1")]),t._v(" 个窗口。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("假设 nums = [1,3,-1,-3,5,3,6,7],和 k = 3,窗口数为6")]),t._v(" "),n("img",{attrs:{src:a(677),alt:"img"}}),t._v(" "),n("p",[t._v("根据分析,直接完成代码:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("maxSlidingWindow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//遍历所有的滑动窗口")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MIN_VALUE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//找到每一个滑动窗口的最大值")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n win"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" win"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br")])]),n("p",[t._v("运行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(678),alt:"img"}}),t._v(" "),n("br"),t._v(" "),n("blockquote",[n("p",[t._v("It's Bullshit!结果令我们很不满意,时间复杂度达到了O(LK),如果面试问到这道题,基本上只写出这样的代码,一定就挂掉了。那我们怎么样优化时间复杂度呢?有没有可以O(L)的实现呢?=_=")])]),t._v(" "),n("h2",{attrs:{id:"_03、线性题解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、线性题解"}},[t._v("#")]),t._v(" 03、线性题解")]),t._v(" "),n("p",[t._v("这里不卖关子,其实这道题比较经典,我们可以采用队列,DP,堆等方式进行求解,所有思路的主要源头应该都是"),n("strong",[t._v("在窗口滑动的过程中,如何更快的完成查找最大值的过程")]),t._v("。但是最典型的解法还是使用"),n("strong",[t._v("双端队列")]),t._v("。具体怎么来求解,一起看一下。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("首先,我们了解一下,什么是双端队列:是一种具有"),n("strong",[t._v("队列和栈的性质的数据结构")]),t._v("。双端队列中的元素可以从两端弹出或者插入。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(679),alt:"img"}}),t._v(" "),n("p",[t._v("我们可以利用双端队列来实现一个窗口,目的是让该窗口可以做到"),n("strong",[t._v("张弛有度")]),t._v("(汉语博大精深,也就是长度动态变化。其实用游标或者其他解法的目的都是一样的,就是去维护一个可变长的窗口)")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("然后我们再做一件事,只要"),n("strong",[t._v("遍历该数组")]),t._v(",同时**在双端队列的头去维护当前窗口的最大值(在遍历过程中,发现当前元素比队列中的元素大,就将原来队列中的元素祭天),在整个遍历的过程中我们再记录下每一个窗口的最大值到结果数组中。**最终结果数组就是我们想要的,整体图解如下。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("假设 nums = [1,3,-1,-3,5,3,6,7],和 k = 3")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(680),alt:"img"}}),t._v(" "),n("blockquote",[n("p",[t._v("(小浩os:我觉得自己画的这个图对于双端队列的解法还是介绍的比较清晰的,大家好好看一下哦,这样我的努力也就没有白费呢。)")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("根据分析,得出代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("maxSlidingWindow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//用切片模拟一个双端队列")]),t._v("\n\tqueue "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//将比当前元素小的元素祭天")]),t._v("\n\t\t\tqueue "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//将当前元素放入queue中")]),t._v("\n\t\tqueue "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//维护队列,保证其头元素为当前窗口最大值")]),t._v("\n\t\t\tqueue "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//放入结果数组")]),t._v("\n\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" queue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(681),alt:"img"}}),t._v(" "),n("br"),t._v(" "),n("p",[t._v("Perfact~题目完成!看着一下子超越百分之99的用户,是不是感觉很爽呢~")])])}),[],!1,null,null,null);s.default=e.exports},677:function(t,s){t.exports="data:image/jpeg;base64,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"},678:function(t,s){t.exports="data:image/jpeg;base64,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"},679:function(t,s,a){t.exports=a.p+"assets/img/3.395c1e89.jpg"},680:function(t,s,a){t.exports=a.p+"assets/img/4.f3a9aa62.jpg"},681:function(t,s,a){t.exports=a.p+"assets/img/5.0b256752.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/52.138d6e9d.js b/learning/.vuepress/dist/assets/js/52.138d6e9d.js deleted file mode 100644 index d77b6944..00000000 --- a/learning/.vuepress/dist/assets/js/52.138d6e9d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{1084:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("之前的两节讲解了"),n("strong",[s._v("滑动窗口类")]),s._v("问题的"),n("strong",[s._v("模式解法")]),s._v(",相信大家对该类题型已不陌生**。**今天将继续完成一道题目,来进行巩固学习。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第438. 找到字符串中所有字母异位词")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。")])])])]),s._v(" "),n("p",[s._v("字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。")]),s._v(" "),n("p",[n("strong",[s._v("说明:")])]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("字母异位词指字母相同,但排列不同的字符串。")]),s._v(" "),n("li",[s._v("不考虑答案输出的顺序。")])]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入:s: "cbaebabacd" p: "abc"\n\n输出:[0, 6]\n\n解释:\n起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。\n起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入:s: "abab" p: "ab\n\n输出:[0, 1, 2]\n\n解释:\n起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。\n起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。\n起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("blockquote",[n("p",[n("strong",[s._v("提示:")])]),s._v(" "),n("p",[n("strong",[s._v("建议先完成上节内容的学习!")])]),s._v(" "),n("p",[n("strong",[s._v("否则可能理解会有一定困难!")])])]),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("p",[s._v("直接套用之前的模式,使用双指针来模拟一个滑动窗口进行解题。分析过程如下:")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("假设我们有字符串为“cbaebabacd”,目标串为“abc”")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("我们通过双指针维护一个窗口,由于我们只需要判断字母异位词,我们可以将窗口初始化大小和目标串保持一致。(当然,你也可以初始化窗口为1,逐步扩大)")]),s._v(" "),n("img",{attrs:{src:a(663),alt:"img"}}),s._v(" "),n("p",[s._v("而"),n("strong",[s._v("判断字母异位词")]),s._v(",我们需要"),n("strong",[s._v("保证窗口中的字母出现次数与目标串中的字母出现次数一致")]),s._v("。这里因为字母只有26个,直接使用数组来替代map进行存储(和上一讲中的ASCII使用256数组存储思想一致)。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("pArr为目标串数组,sArr为窗口数组。我们发现初始化数组,本身就满足,记录下来。("),n("strong",[s._v("这里图示用map模拟数组,便于理解")]),s._v(")")]),s._v(" "),n("img",{attrs:{src:a(664),alt:"img"}}),s._v(" "),n("p",[s._v("然后我们通过移动窗口,来更新窗口数组,进而和目标数组匹配,匹配成功进行记录。每一次窗口移动,"),n("strong",[s._v("左指针前移")]),s._v(",原来"),n("strong",[s._v("左指针位置处的数值减1,表示字母移出")]),s._v(";"),n("strong",[s._v("同时右指针前移")]),s._v(","),n("strong",[s._v("右指针位置处的数值加1,表示字母移入")]),s._v("。详细过程如下:")]),s._v(" "),n("img",{attrs:{src:a(665),alt:"img"}}),s._v(" "),n("img",{attrs:{src:a(666),alt:"img"}}),s._v(" "),n("p",[s._v("最终,当右指针到达边界,意味着匹配完成。")]),s._v(" "),n("h2",{attrs:{id:"_04、代码展示"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、代码展示"}},[s._v("#")]),s._v(" 04、代码展示")]),s._v(" "),n("p",[s._v("根据分析,完成代码:(下面pSize相关的忽略,调试忘删了)")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("findAnagrams")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" p "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("List")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" list "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" pArr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("26")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" pSize "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" sArr "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("26")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n sArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n pArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" index "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" sArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("index"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n pSize"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 窗口大小固定为p的长度")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isSame")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//sArr[s.charAt(i) - 'a']-- 左指针位置处字母减1")]),s._v("\n sArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//sArr[s.charAt(j) - 'a']++ 右指针位置处字母加1")]),s._v("\n sArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isSame")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v(" pArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sArr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" list"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isSame")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" arr2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" arr1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("arr1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" arr2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(667),alt:"img"}}),s._v(" "),n("p",[s._v("PS:本题属于模式解法,非最优解!这里留下思考内容,如何在本解法的基础上进行优化,近一步降低时间复杂度?")])])}),[],!1,null,null,null);t.default=r.exports},663:function(s,t,a){s.exports=a.p+"assets/img/1.1605b951.jpg"},664:function(s,t,a){s.exports=a.p+"assets/img/2.4a60b533.jpg"},665:function(s,t,a){s.exports=a.p+"assets/img/3.0dab3096.jpg"},666:function(s,t,a){s.exports=a.p+"assets/img/4.acb8c9b1.jpg"},667:function(s,t,a){s.exports=a.p+"assets/img/5.54fa5539.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/53.052e35bd.js b/learning/.vuepress/dist/assets/js/53.052e35bd.js deleted file mode 100644 index 0c59c7e8..00000000 --- a/learning/.vuepress/dist/assets/js/53.052e35bd.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{1092:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("昨天写了一篇感悟,没想到那么受欢迎。几百人转发,好几千人阅读,虚荣心得到了极大的满足。今天继续为大家分享一道经典面试题目。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("咕咕咕...一道很简单的题目~")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("题目:和为s的连续正数序列")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:target = 9\n输出:[[2,3,4],[4,5]]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:target = 15\n输出:[[1,2,3,4,5],[4,5,6],[7,8]]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("特别提醒:这两天有人问我,说浩哥,为什么看了你那么多题解,但是我一旦上机写,便啥都不记得了。这个我想说。。。你真牛掰。普通人应该都做不到看看题解,就能真的掌握一个题目(不信你看书学学KMP,再试试看能不能一次写出来)。题解只是给你提供一个思路,真正的提高,取决于coding的过程。大量的练习,忍受难受的过程,才能真正的进步!")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("这个题目比较简单,典型的一道"),n("strong",[t._v("滑动窗口")]),t._v("的题目。如果对滑动窗口陌生,可以先看下下面的题解:")]),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.5.滑动窗口系列/1.5.滑动窗口系列/501.html"}},[t._v("滑动窗口最大值(239)")])],1),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.5.滑动窗口系列/1.5.滑动窗口系列/502.html"}},[t._v("无重复字符的最长子串(3)")])],1),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.5.滑动窗口系列/1.5.滑动窗口系列/503.html"}},[t._v("找到字符串中所有字母异位词(438)")])],1),t._v(" "),n("p",[t._v("假若我们输入的 target 为 9,大脑中应该有下面这么个玩意:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(685),alt:"PNG"}}),t._v(" "),n("p",[t._v("然后我们通过左右指针来维护一个滑动窗口,同时计算窗口内的值是否是目标值:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(686),alt:"PNG"}}),t._v(" "),n("p",[t._v("如果窗口的值过小,我们就移动右边界。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(687),alt:"PNG"}}),t._v(" "),n("p",[t._v("如果窗口的值过大,我们就移动左边界。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(688),alt:"PNG"}}),t._v(" "),n("p",[t._v("剩下的就是反复上面的操作就可以了。到这里分析过程看似结束了。但是我们可以观察出一丢丢规律,用来优化我们的算法。"),n("strong",[t._v("对于任意一个正整数,总是小于它的中值与中值+1的和")]),t._v("。为了让大家直观,用下图举例:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(689),alt:"PNG"}}),t._v(" "),n("p",[t._v("比如这里的100,就一定小于50+51,换成其他数也一样。换句话说,"),n("strong",[t._v("一旦窗口左边界超过中值,窗口内的和一定会大于 target")]),t._v("。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("根据分析,得到题解:(好久没给Go语言的示例了,刻意把代码写的比较简单,没有用啥骚操作哈)")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findContinuousSequence")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("target "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" \n j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" \n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" \n arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("range")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" target "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" j\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" target "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-=")]),t._v(" i\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-=")]),t._v(" i\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("p",[t._v("同时也给一个java版本的:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findContinuousSequence")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ArrayList")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" target "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n win "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("toArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br")])]),n("h2",{attrs:{id:"_03、继续优化"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、继续优化"}},[t._v("#")]),t._v(" 03、继续优化")]),t._v(" "),n("blockquote",[n("p",[t._v("到这里你以为这个题目就结束了吗?...哈哈哈哈哈...其实真就结束了~囧!o(╯□╰)o")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("本题我使用滑动窗口进行求解,是期望给出一种通用解法。有很多基础差的同学,并不能每道题目都玩出来骚操作。但是本题除了常规的滑动窗口之外,其实还有数学法,递推法等多种解题思路。这里给出数学法的提示:"),n("strong",[t._v("等差数列求和公式")]),t._v(",希望大家下去自行思考一番,评论区留下你的想法!咱们明天见!")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=r.exports},685:function(t,s,a){t.exports=a.p+"assets/img/1.651abd82.jpg"},686:function(t,s,a){t.exports=a.p+"assets/img/2.5a2adb1f.jpg"},687:function(t,s,a){t.exports=a.p+"assets/img/3.b277e870.jpg"},688:function(t,s,a){t.exports=a.p+"assets/img/4.ae05f578.jpg"},689:function(t,s,a){t.exports=a.p+"assets/img/5.9dd4bda4.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/54.27092f93.js b/learning/.vuepress/dist/assets/js/54.27092f93.js deleted file mode 100644 index 6c5217bd..00000000 --- a/learning/.vuepress/dist/assets/js/54.27092f93.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{1096:function(q,l,u){"use strict";u.r(l);var A=u(3),S=Object(A.a)({},(function(){var q=this,l=q.$createElement,A=q._self._c||l;return A("ContentSlotsDistributor",{attrs:{"slot-key":q.$parent.slotKey}},[A("blockquote",[A("p",[q._v("这次小浩又出去面试,虽然面试官没让他修电暖气,但却给了他一块巧克力。。。(题目由读者在美团面试后提供)")])]),q._v(" "),A("h2",{attrs:{id:"_01、题目示例"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[q._v("#")]),q._v(" 01、题目示例")]),q._v(" "),A("blockquote",[A("p",[q._v("巧克力的凹槽是干嘛用的?大量的凹槽设计增加了巧克力的接触面积,可以使巧克力快速的凝固,并且保证凝固均匀。试想一下,如果是把巧克力放入平整的没有凹槽的方形盒子中,是不是凝固后很难取下来呢。")])]),q._v(" "),A("br"),q._v(" "),A("table",[A("thead",[A("tr",[A("th",[q._v("面试题:小浩出去面试时,面试官掏出一块10×10个小块的巧克力。首先,面试官把巧克力掰成两大块,并且吃掉其中一块,把另一块交给小浩。小浩再把剩下的巧克力掰成两大块,吃掉其中一块,把另一块交回给面试官。两个人就这样无聊且枯燥的掰呀掰。。。")])])]),q._v(" "),A("tbody",[A("tr",[A("td",[q._v("规定:谁没办法往下继续掰,谁就输了。如果面试官先开始掰的话,面试官和小浩谁有必胜策略?(面试官输了,小浩将赢得面试)")])])])]),q._v(" "),A("h2",{attrs:{id:"_02、题目分析"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[q._v("#")]),q._v(" 02、题目分析")]),q._v(" "),A("blockquote",[A("p",[q._v("原题由读者 venus 提供,小浩在其基础上改编而成。")])]),q._v(" "),A("br"),q._v(" "),A("p",[q._v("作为聪明机智的小浩(没见过这么夸自己的),最后当然是小浩获胜。获胜的方法:"),A("strong",[q._v("只要小浩一直保持巧克力是正方形就可以了")]),q._v("。刚开始,巧克力是10×10的,长这样:")]),q._v(" "),A("img",{staticStyle:{zoom:"50%"},attrs:{src:u(699),alt:"PNG"}}),q._v(" "),A("p",[q._v("不管面试官咋掰,最后都会掰成一个长宽不相等的正方形。举个栗子,假若面试官把巧克力掰成6×10的:")]),q._v(" "),A("img",{staticStyle:{zoom:"50%"},attrs:{src:u(700),alt:"PNG"}}),q._v(" "),A("p",[q._v("小浩就再把它掰成6×6的:")]),q._v(" "),A("img",{staticStyle:{zoom:"50%"},attrs:{src:u(701),alt:"PNG"}}),q._v(" "),A("p",[q._v("不管面试官咋整,小浩都将其变成正方形,直到最后一次将其变成一个1×1的巧克力,此时面试官就输掉了面试。哦不,是小浩赢得了面试。")]),q._v(" "),A("img",{staticStyle:{zoom:"50%"},attrs:{src:u(702),alt:"PNG"}}),q._v(" "),A("h2",{attrs:{id:"_03、超级改编版"}},[A("a",{staticClass:"header-anchor",attrs:{href:"#_03、超级改编版"}},[q._v("#")]),q._v(" 03、超级改编版")]),q._v(" "),A("blockquote",[A("p",[q._v("下面的问题不要陷入固定思维哈~")])]),q._v(" "),A("br"),q._v(" "),A("p",[q._v("如果巧克力换成边长为10的等边三角形,长这样:")]),q._v(" "),A("img",{staticStyle:{zoom:"50%"},attrs:{src:u(703),alt:"PNG"}}),q._v(" "),A("p",[q._v("每次只能"),A("strong",[q._v("沿着线条掰下一个小等边三角形吃掉")]),q._v(",假若还是由面试官开局,请问,谁必胜?评论区留下你的分析过程吧(另外小浩为了感谢广大读者一直以来的支持,后面每周都会送出"),A("strong",[q._v("百元红包")]),q._v(",得奖率20%,拉到最下面就可以参与了。如果可以的话,要是能帮我再点个"),A("strong",[q._v("在看")]),q._v(",我将感激涕零~)")]),q._v(" "),A("br"),q._v(" "),A("p",[q._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);l.default=S.exports},699:function(q,l){q.exports="data:image/jpeg;base64,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"},700:function(q,l){q.exports="data:image/jpeg;base64,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"},701:function(q,l){q.exports="data:image/jpeg;base64,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"},702:function(q,l,u){q.exports=u.p+"assets/img/4.7bc74c08.jpg"},703:function(q,l,u){q.exports=u.p+"assets/img/5.243e0f4d.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/55.82187afc.js b/learning/.vuepress/dist/assets/js/55.82187afc.js deleted file mode 100644 index 90cda0b1..00000000 --- a/learning/.vuepress/dist/assets/js/55.82187afc.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{1100:function(A,t,v){"use strict";v.r(t);var R=v(3),E=Object(R.a)({},(function(){var A=this,t=A.$createElement,R=A._self._c||t;return R("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[R("blockquote",[R("p",[A._v("十年前有一款很出名的游戏叫做“孢子”,不知道大家玩没玩过。玩家最初扮演一个单细胞生物,通过“大鱼吃小鱼,小鱼吃虾米,虾米吃水藻”的规则,逐步进化为宇宙文明生物。换句话说,大鱼之上总是有更大的鱼存在。当然我们这里不是讨论这个游戏,而是思考一个有趣的问题:倘若所有的鱼都是理性的,那会出现怎样的情况呢?")])]),A._v(" "),R("br"),A._v(" "),R("h2",{attrs:{id:"_01、题目分析"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[A._v("#")]),A._v(" 01、题目分析")]),A._v(" "),R("blockquote",[R("p",[A._v("总有一条更大的鱼(Always a Bigger Fish)不但是电影情节中的经典桥段,也是各种恶搞的灵感来源——小鱼总是被大鱼吃掉,而大鱼上面始终还有更大的鱼。久而久之,聪明的大鱼或许就不会去吃小鱼了,否则按照传统剧情,它身后会出现一条更大的鱼吃掉自己。让我们完整叙述一下问题:")])]),A._v(" "),R("br"),A._v(" "),R("table",[R("thead",[R("tr",[R("th",[A._v("大鱼小鱼的问题:假设有10条鱼,它们从小到大依次编号为1, 2, …, 10。我们规定,吃鱼必须要严格按顺序执行。也就是说,大鱼只能吃比自己小一级 的鱼,不能越级吃更小的鱼;并且只有等到第k条鱼吃了第 k-1 条鱼后,第 k+1条鱼 才能吃第 k 条鱼。")])])]),A._v(" "),R("tbody",[R("tr",[R("td",[A._v("同时:第1条鱼则啥都不能吃,只有被吃的份儿。我们假设,如果有小鱼 吃的话,大鱼肯定不会放过;但是,保全性命的优先级显然更高,在吃小鱼之前, 大鱼得先保证自己不会被吃掉才行。假设每条鱼都是无限聪明的(并且它们也都知 道这一点,并且它们也都知道它们知道这一点……),那么第1条鱼能存活下来吗?")])])])]),A._v(" "),R("h2",{attrs:{id:"_02、题目分析"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[A._v("#")]),A._v(" 02、题目分析")]),A._v(" "),R("blockquote",[R("p",[A._v("这个题目是相当有意思的....")])]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("首先,我想聪明的大家已经猜到这是一道什么类型的题。对,"),R("strong",[A._v("博弈论")]),A._v("!因为题中出现了博弈论中的经典条件“"),R("strong",[A._v("无限聪明")]),A._v("”。现在让我们思考该题:")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("我们是有十条鱼,分析起来是比较麻烦的。所以我们从最简单的两条鱼开始分析:")]),A._v(" "),R("img",{staticStyle:{zoom:"80%"},attrs:{src:v(719),alt:"PNG"}}),A._v(" "),R("p",[A._v("两条鱼的情况下,第二条鱼就是无敌的存在,他不用担心自己被吃掉!如果是三条鱼:")]),A._v(" "),R("img",{staticStyle:{zoom:"80%"},attrs:{src:v(720),alt:"PNG"}}),A._v(" "),R("p",[A._v("3条鱼的情况下,第2条鱼不能吃第1条鱼,否则将化为只有2条鱼的情形,它将会被第3条鱼吃掉。如果是四条鱼,就有意思了:")]),A._v(" "),R("img",{staticStyle:{zoom:"80%"},attrs:{src:v(721),alt:"PNG"}}),A._v(" "),R("p",[A._v("此时第2条鱼可以大胆地吃掉第1条鱼,因为根据前面的结论,它知道第3条鱼是不敢吃它的。问题来了,五条鱼会如何:")]),A._v(" "),R("img",{staticStyle:{zoom:"80%"},attrs:{src:v(722),alt:"PNG"}}),A._v(" "),R("p",[A._v("5条鱼的情况下,第2条鱼是不敢吃第1条鱼的,因为如果它吃了第一条鱼。问题转化为4条鱼的场景,原3号鱼就可以大胆吃掉原2号鱼,因为它知道4号鱼是不敢吃它的,否则5号鱼就会吃掉4号鱼(绕不绕)")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("我们发现一个有趣的结论,只要鱼有奇数个,那么第一条鱼将总是可以活下来。如果鱼是偶数个,那么第二条鱼将总是可以吃掉第一条鱼,将状态转化到奇数条鱼的场景。")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("所以该题的答案是:不能,在十条鱼的场景下,第一条鱼必死无疑。")]),A._v(" "),R("h2",{attrs:{id:"_03、改编版本"}},[R("a",{staticClass:"header-anchor",attrs:{href:"#_03、改编版本"}},[A._v("#")]),A._v(" 03、改编版本")]),A._v(" "),R("blockquote",[R("p",[A._v("下面这个和上面的题目如出一辙,建议大家自己思考一下。")])]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("假如你在旅途中遇到一个老头,老头向你推销一个魔壶,魔壶里有一个魔鬼,可以满足你的任何愿望。但是,使用了这个魔壶会让你死后永受炼狱之苦。唯一的解法,就是你把这个魔壶再以一个更低的价格卖给别人。问题是:你会不会买下这个魔壶?以什么价格买下?(假设你足够聪明)")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("简单分析一下这个问题:因为我们并不知道用什么价格来买这个魔壶,所以自然是从最小的价格还是尝试,假设我们用最小的货币单位 1 来购买这个魔壶,那么这个魔壶将永远都不能卖给下一个人,所以 1 货币单位 肯定是不行的。那么现在我们使用 2 货币单位来购买这个魔壶,你同样找不到下一个买家。事情开始变得有趣,你开始尝试 3 货币单位 到 N 货币单位,然后你发现:根据类推,你不应该以任何价钱去购买这个瓶子,因为每个都都知道他没办法卖掉这个瓶子。")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("问题来了,为什么会推出这样一个和现实完全背道而驰的“谬论”,这是因为在推理中,我们假设每个人都做出了最优的决策,并且就这一点达成了共识。注意,这里有两个条件:")]),A._v(" "),R("br"),A._v(" "),R("ul",[R("li",[A._v("最优决策")]),A._v(" "),R("li",[A._v("共识")])]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("最优决策好理解,那这个共识该如何理解呢?最优决策指的是,大家都足够聪明。而共识,指的是大家都知道大家足够聪明。那如果大家并不知道大家都是足够聪明的,这种情况就称之为“不完全信息”")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("这里值得强调的一点是,信息不对称 和 不完全信息,这两个的概念是有所不同的。划重点:不完全信息同时是经济学和博弈论中的概念,但是信息不对称大多指经济学中概念。这个大家了解一下即可(其实我个人觉得这种东东理解其本质就ok了,并不需要过于较真)下面的问题,摘自《经济学基础》题库")]),A._v(" "),R("img",{staticStyle:{zoom:"80%"},attrs:{src:v(723),alt:"PNG"}}),A._v(" "),R("p",[A._v("理论的东西就是这么枯燥,总之大家拿到这种题目知道怎么分析就ok了。")]),A._v(" "),R("br"),A._v(" "),R("p",[A._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=E.exports},719:function(A,t){A.exports="data:image/jpeg;base64,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"},720:function(A,t){A.exports="data:image/jpeg;base64,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"},721:function(A,t,v){A.exports=v.p+"assets/img/3.3ff6091a.jpg"},722:function(A,t,v){A.exports=v.p+"assets/img/4.f3de9102.jpg"},723:function(A,t,v){A.exports=v.p+"assets/img/5.18db8de2.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/56.5e6fed0a.js b/learning/.vuepress/dist/assets/js/56.5e6fed0a.js deleted file mode 100644 index c424c25f..00000000 --- a/learning/.vuepress/dist/assets/js/56.5e6fed0a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{1098:function(s,a,t){"use strict";t.r(a);var e=t(3),r=Object(e.a)({},(function(){var s=this,a=s.$createElement,e=s._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("blockquote",[e("p",[s._v("今天给大家分享一道比较简单但是很经典的题目。话不多说,直接看题。")])]),s._v(" "),e("h2",{attrs:{id:"_01、题目示例"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),e("blockquote",[e("p",[s._v("这道题,大家先想一想是用什么思路进行求解?")])]),s._v(" "),e("br"),s._v(" "),e("table",[e("thead",[e("tr",[e("th",[s._v("第231题:2的幂")])])]),s._v(" "),e("tbody",[e("tr",[e("td",[s._v("给定一个整数,编写一个函数来判断它是否是 2 的幂次方。")])])])]),s._v(" "),e("p",[e("strong",[s._v("示例 1:")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("输入: 1\n输出: true\n解释: 20 = 1\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[e("strong",[s._v("示例 2:")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("输入: 16\n输出: true\n解释: 24 = 16\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[e("strong",[s._v("示例 3:")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("输入: 218\n输出: false\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("br"),s._v(" "),e("p",[e("strong",[s._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),s._v(" "),e("h2",{attrs:{id:"_02、题目分析"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),e("blockquote",[e("p",[s._v("这道题是**通过位运算来进行求解的非常典型的题目。**当然,其他的题解也有很多:比如暴力求解,又或者是不停除以2通过递归的方式求解,等等。但是并不是今天我想说的。")])]),s._v(" "),e("br"),s._v(" "),e("p",[s._v("先观察一些是2的幂的二进制数:")]),s._v(" "),e("img",{staticStyle:{zoom:"50%"},attrs:{src:t(711),alt:"PNG"}}),s._v(" "),e("p",[e("strong",[s._v("可以发现这些数,都是最高位为1,其他位为0")]),s._v("。所以我们把问题转化为“判断一个数的二进制,除了最高位为1,是否还有别的1存在”。然后我们再观察下面这样的一组数,对应着上面的数减去1:")]),s._v(" "),e("img",{staticStyle:{zoom:"50%"},attrs:{src:t(712),alt:"PNG"}}),s._v(" "),e("p",[s._v("我们对两组数求“&”运算:")]),s._v(" "),e("img",{staticStyle:{zoom:"67%"},attrs:{src:t(713),alt:"PNG"}}),s._v(" "),e("p",[s._v("可以看到,对于N为2的幂的数,**都有 N&(N-1)=0 ,**所以这就是我们的判断条件。(这个技巧可以记忆下来,在一些别的位运算的题目中也是会用到的)")]),s._v(" "),e("br"),s._v(" "),e("p",[s._v("根据分析,完成代码:")]),s._v(" "),e("div",{staticClass:"language-go line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-go"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//go")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("isPowerOfTwo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),e("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br")])]),e("p",[s._v("执行结果:")]),s._v(" "),e("img",{staticStyle:{zoom:"80%"},attrs:{src:t(714),alt:"PNG"}}),s._v(" "),e("h2",{attrs:{id:"_03、证明过程"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_03、证明过程"}},[s._v("#")]),s._v(" 03、证明过程")]),s._v(" "),e("blockquote",[e("p",[s._v("“下里巴人”和“阳春白雪”是古代楚国的歌曲名,屈原的大弟子宋玉曾著有《对楚王问》:“客有歌于郢中者,其始曰下里巴人,国中属而和者数千人……其为阳春白雪,国中属而和者不过数十人。”“下里巴人”和“阳春白雪”一词后来被用来泛指通俗和高雅的文艺作品。 古琴十大名曲之一。")])]),s._v(" "),e("br"),s._v(" "),e("p",[s._v("“阳春白雪,下里巴人”这个比喻虽然有点牵强,但是却难掩位运算的重要性。位运算在整个算法体系里,不少人可能会觉得有点食之无味、弃之可惜的意思。但其实,完全不是这样!有这种想法的,大多是初学者。对于这点,应该C系的玩家,会深有感触。万丈高楼平地起,暂且不说位运算在底层运算中占据了多大比重,单是整个leetcode列表里,打着位运算标签的题目就超过80余道,我想已经说明了问题。**至少,在面试这块,你必须对位运算了如指掌!**所以,今天的题目算是一个引子,后面我会出一个位运算的专题,希望尽我所能,帮助大家攻克这一类型的问题。")]),s._v(" "),e("img",{staticStyle:{zoom:"50%"},attrs:{src:t(715),alt:"PNG"}}),s._v(" "),e("br"),s._v(" "),e("p",[s._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);a.default=r.exports},711:function(s,a,t){s.exports=t.p+"assets/img/1.baeb33a7.jpg"},712:function(s,a,t){s.exports=t.p+"assets/img/2.883bcd77.jpg"},713:function(s,a,t){s.exports=t.p+"assets/img/3.a8ce815b.jpg"},714:function(s,a){s.exports="data:image/jpeg;base64,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"},715:function(s,a,t){s.exports=t.p+"assets/img/5.54d5f79b.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/57.ca7cd96a.js b/learning/.vuepress/dist/assets/js/57.ca7cd96a.js deleted file mode 100644 index 3a8c26a3..00000000 --- a/learning/.vuepress/dist/assets/js/57.ca7cd96a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{1118:function(A,s,n){"use strict";n.r(s);var t=n(3),a=Object(t.a)({},(function(){var A=this,s=A.$createElement,t=A._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("blockquote",[t("p",[A._v('今天为大家分享一道关于**"电灯泡"**的题目。')]),A._v(" "),t("p",[A._v("话不多说,直接看题。")])]),A._v(" "),t("h2",{attrs:{id:"_01、题目示例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[A._v("#")]),A._v(" 01、题目示例")]),A._v(" "),t("table",[t("thead",[t("tr",[t("th",[A._v("第319题:开关灯泡")])])]),A._v(" "),t("tbody",[t("tr",[t("td",[A._v("初始时有 n 个灯泡关闭。第 1 轮,你打开所有的灯泡。第 2 轮,每两个灯泡关闭一次。第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。对于第 n 轮,你只切换最后一个灯泡的开关。找出 n 轮后有多少个亮着的灯泡。")])])])]),A._v(" "),t("p",[t("strong",[A._v("示例:")])]),A._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[A._v("输入: 3\n输出: 1 \n解释: \n初始时, 灯泡状态 [关闭, 关闭, 关闭].\n第一轮后, 灯泡状态 [开启, 开启, 开启].\n第二轮后, 灯泡状态 [开启, 关闭, 开启].\n第三轮后, 灯泡状态 [开启, 关闭, 关闭]. \n\n你应该返回 1,因为只有一个灯泡还亮着。\n")])]),A._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[A._v("1")]),t("br"),t("span",{staticClass:"line-number"},[A._v("2")]),t("br"),t("span",{staticClass:"line-number"},[A._v("3")]),t("br"),t("span",{staticClass:"line-number"},[A._v("4")]),t("br"),t("span",{staticClass:"line-number"},[A._v("5")]),t("br"),t("span",{staticClass:"line-number"},[A._v("6")]),t("br"),t("span",{staticClass:"line-number"},[A._v("7")]),t("br"),t("span",{staticClass:"line-number"},[A._v("8")]),t("br"),t("span",{staticClass:"line-number"},[A._v("9")]),t("br")])]),t("h2",{attrs:{id:"_02、题目图解"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[A._v("#")]),A._v(" 02、题目图解")]),A._v(" "),t("p",[A._v("这是一道难度评定为"),t("strong",[A._v("困难")]),A._v("的题目。但是,其实这并不是一道算法题,而是一个脑筋急转弯。只要我们模拟一下开关灯泡的过程,大家就会瞬间get,一起来分析一下:")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("我们模拟一下n从1到12的过程。在第一轮,你打开了12个灯泡:")]),A._v(" "),t("img",{staticStyle:{zoom:"67%"},attrs:{src:n(796),alt:"PNG"}}),A._v(" "),t("p",[A._v("因为对于大于n的灯泡你是不care的,所以我们用黑框框表示:")]),A._v(" "),t("img",{staticStyle:{zoom:"67%"},attrs:{src:n(797),alt:"PNG"}}),A._v(" "),t("p",[A._v("然后我们列出n从1-12的过程中所有的灯泡示意图:")]),A._v(" "),t("img",{staticStyle:{zoom:"67%"},attrs:{src:n(798),alt:"PNG"}}),A._v(" "),t("p",[A._v("可以得到如下表格:")]),A._v(" "),t("img",{staticStyle:{zoom:"50%"},attrs:{src:n(799),alt:"PNG"}}),A._v(" "),t("p",[A._v("观察一下,这是什么?观察不出来,咱们看看这个:")]),A._v(" "),t("div",{staticClass:"language-go line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-go"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[A._v("//go")]),A._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("func")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[A._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("for")]),A._v(" n "),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v(":=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v(" n "),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("<=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("12")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(";")]),A._v(" n"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("++")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("{")]),A._v("\n fmt"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[A._v("Println")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[A._v('"n="')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(",")]),A._v(" n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(",")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[A._v('"\\t灯泡数\\t"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(",")]),A._v(" math"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[A._v("Sqrt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),t("span",{pre:!0,attrs:{class:"token function"}},[A._v("float64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("(")]),A._v("n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v(")")]),A._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[A._v("}")]),A._v("\n")])]),A._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[A._v("1")]),t("br"),t("span",{staticClass:"line-number"},[A._v("2")]),t("br"),t("span",{staticClass:"line-number"},[A._v("3")]),t("br"),t("span",{staticClass:"line-number"},[A._v("4")]),t("br"),t("span",{staticClass:"line-number"},[A._v("5")]),t("br"),t("span",{staticClass:"line-number"},[A._v("6")]),t("br")])]),t("div",{staticClass:"language-go line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-go"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[A._v("//print")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("1")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("1")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("2")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("1.4142135623730951")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("3")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("1.7320508075688772")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("4")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("2")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("5")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("2.23606797749979")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("6")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("2.449489742783178")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("7")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("2.6457513110645907")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("8")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("2.8284271247461903")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("9")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("3")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("10")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("3.1622776601683795")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("11")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("3.3166247903554")]),A._v("\nn"),t("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("12")]),A._v(" 灯泡数 "),t("span",{pre:!0,attrs:{class:"token number"}},[A._v("3.4641016151377544")]),A._v("\n")])]),A._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[A._v("1")]),t("br"),t("span",{staticClass:"line-number"},[A._v("2")]),t("br"),t("span",{staticClass:"line-number"},[A._v("3")]),t("br"),t("span",{staticClass:"line-number"},[A._v("4")]),t("br"),t("span",{staticClass:"line-number"},[A._v("5")]),t("br"),t("span",{staticClass:"line-number"},[A._v("6")]),t("br"),t("span",{staticClass:"line-number"},[A._v("7")]),t("br"),t("span",{staticClass:"line-number"},[A._v("8")]),t("br"),t("span",{staticClass:"line-number"},[A._v("9")]),t("br"),t("span",{staticClass:"line-number"},[A._v("10")]),t("br"),t("span",{staticClass:"line-number"},[A._v("11")]),t("br"),t("span",{staticClass:"line-number"},[A._v("12")]),t("br"),t("span",{staticClass:"line-number"},[A._v("13")]),t("br")])]),t("p",[A._v("没错,只要我们对n进行开方,就可以得到最终的灯泡数。根据分析,得出代码:")]),A._v(" "),t("div",{staticClass:"language-c++ line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[A._v("//给一个c++版本的\nclass Solution {\npublic:\n int bulbSwitch(int n) {\n return sqrt(n);\n }\n};\n")])]),A._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[A._v("1")]),t("br"),t("span",{staticClass:"line-number"},[A._v("2")]),t("br"),t("span",{staticClass:"line-number"},[A._v("3")]),t("br"),t("span",{staticClass:"line-number"},[A._v("4")]),t("br"),t("span",{staticClass:"line-number"},[A._v("5")]),t("br"),t("span",{staticClass:"line-number"},[A._v("6")]),t("br"),t("span",{staticClass:"line-number"},[A._v("7")]),t("br")])]),t("p",[A._v("执行结果:")]),A._v(" "),t("img",{staticStyle:{zoom:"67%"},attrs:{src:n(800),alt:"PNG"}}),A._v(" "),t("h2",{attrs:{id:"_03、证明"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_03、证明"}},[A._v("#")]),A._v(" 03、证明")]),A._v(" "),t("p",[A._v("我不服,没有证明,你说毛线!证明如下:")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("从我们观察可以发现,如果一个灯泡有奇数个约数,那么最后这个灯泡一定会亮着。")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("什么,你问我奇数是什么?奇数(odd)指不能被2整除的整数 ,数学表达形式为:2k+1, 奇数可以分为正奇数和负奇数。")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("所以其实我们是求,"),t("strong",[A._v("从1-n有多少个数的约数有奇数个")]),A._v("。而**有奇数个约数的数一定是完全平方数。**这是因为,对于数n,如果m是它的约数,则n/m也是它的约数,若m≠n/m,则它的约数是以m、n/m的形式成对出现的。而m=n/m成立且n/m是正整数时,n是完全平方数,而它有奇数个约数。")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("我们再次转化问题,"),t("strong",[A._v("求1-n有多少个数是完全平方数")]),A._v("。")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("什么,你又不知道什么是完全平方数了?完全平方指用一个整数乘以自己例如1"),t("em",[A._v("1,2")]),A._v("2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,"),t("strong",[A._v("则称这个数为完全平方数")]),A._v("。")]),A._v(" "),t("br"),A._v(" "),t("p",[A._v("到这里,基本就很明朗了。剩下的,我想不需要再说了吧!")])])}),[],!1,null,null,null);s.default=a.exports},796:function(A,s){A.exports="data:image/jpeg;base64,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"},797:function(A,s){A.exports="data:image/png;base64,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"},798:function(A,s,n){A.exports=n.p+"assets/img/3.a40364f6.png"},799:function(A,s,n){A.exports=n.p+"assets/img/4.0c272c85.png"},800:function(A,s){A.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/58.c85a9198.js b/learning/.vuepress/dist/assets/js/58.c85a9198.js deleted file mode 100644 index 13cab4a3..00000000 --- a/learning/.vuepress/dist/assets/js/58.c85a9198.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{1119:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,出自美国的电视游戏节目Let's Make a Deal。今天为大家进行完整分析。")]),t._v(" "),n("p",[t._v("话不多说,直接看题目。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("三门问题")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("参赛者的面前有三扇关闭着的门,其中一扇的后面是天使,选中后天使会达成你的一个愿望,而另外两扇门后面则是恶魔,选中就会死亡。")])])])]),t._v(" "),n("p",[t._v("当你选定了一扇门,但未去开启它的时候,上帝会开启剩下两扇门中的一扇,露出其中一只恶魔。(上帝是全能的,必会打开恶魔门)随后上帝会问你要不要更换选择,选另一扇仍然关着的门。")]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("p",[t._v("按照常理,参赛者在做出最开始的决定时,对三扇门后面的事情一无所知,因此他选择正确的概率是1/3,这个应该大家都可以想到。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("接下来,主持人排除掉了一个错误答案(有恶魔的门),于是剩下的两扇门必然是一扇是天使,一扇是恶魔,那么此时无论选择哪一扇门,胜率都是1/2,依然合乎直觉。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以你作为参赛者,你会认为换不换都无必要,获胜概率均为1/2。但是,真的是这样吗?")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("正确的答案是,**如果你选择了换,碰见天使的概率会高达2/3,而不不换的话,碰见天使的概率只有1/3。**怎么来的?")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("我们用一个很通俗的方法,能让你一听就懂。首先刚开始选择的一扇门的概率为1/3,而另外两扇门的总概率为2/3。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(801),alt:"PNG"}}),t._v(" "),n("p",[t._v("现在上帝打开了其中一扇为恶魔的门,我们知道这个门后面不会再有天使,所以相当于这部分概率被第三个门持有。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(802),alt:"PNG"}}),t._v(" "),n("p",[t._v("剩下的那扇门的概率(2/3)相当于刚开始选择的门(1/3)的二倍。所以我们得换。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("如果还没有听懂。我们可以假设有一百扇门,里边有99只都是恶魔。现在你随机选择一扇门,选择到天使的概率是1/100。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(803),alt:"PNG"}}),t._v(" "),n("p",[t._v("这时,上帝打开其中的98扇,里边都是恶魔。这时候就相当于99/100的概率都集中在了另一扇门里。自然,我们需要选择换。"),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(804),alt:"PNG"}})]),t._v(" "),n("h2",{attrs:{id:"_04、代码证明"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、代码证明"}},[t._v("#")]),t._v(" 04、代码证明")]),t._v(" "),n("p",[t._v("为了验证结果,我用代码跑了一百万次。什么?用贝叶斯分析分析!太俗(请隔壁去找李永乐老师),咱们还是直接上代码。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//换门遇见天使的次数和不换门遇见天使的次数 changeAngelCount, unchangeAngelCount := 0, 0 for i := 0; i < 1000000; i++ { ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//门的总数 ")]),t._v("\n doors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//天使门和选中的门 angelDoor, selectedDoor := rand.Intn(3), rand.Intn(3) ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//上帝移除一扇恶魔门")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("doors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" doors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" selectedDoor "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" doors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" angelDoor "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n doors "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("doors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" doors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("break")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//统计 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" selectedDoor "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" angelDoor "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n unchangeAngelCount"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n changeAngelCount"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n fmt"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"不换门遇见天使次数:"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" unchangeAngelCount"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"比例:"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float32")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("unchangeAngelCount"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n fmt"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"换门遇见天使次数:"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" changeAngelCount"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"比例:"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("float32")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("changeAngelCount"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br")])]),n("p",[t._v("跑了一百万次,结果当然不让我们失望!执行结果为:")]),t._v(" "),n("img",{attrs:{src:a(805),alt:"PNG"}}),t._v(" "),n("p",[t._v("所以,今天的问题你听明白了吗?评论区留下你的想法吧!")])])}),[],!1,null,null,null);s.default=r.exports},801:function(t,s,a){t.exports=a.p+"assets/img/1.e6629cc3.jpg"},802:function(t,s,a){t.exports=a.p+"assets/img/2.44c23f2f.png"},803:function(t,s,a){t.exports=a.p+"assets/img/3.eb049027.jpeg"},804:function(t,s,a){t.exports=a.p+"assets/img/4.72302b38.jpeg"},805:function(t,s){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAX4AAAAoCAMAAADOpGGQAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAclBMVEU+PTInKCLMzMwnY5vBzMzMv5thKCKCrsyshCInKF6cv8zMzMGcYyInKH+szMwnhKzMrn9hmsHBzMHMzKyCKCKszKzBml6szMHBzKxhY5uCKH/Mv6ysv8zBv5ucv8GshF7MrpucmqycmsHBmpthKF7///9u3q6XAAAAAWJLR0QlwwHJDwAAAAlwSFlzAAAOxAAADsQBlSsOGwAABFZJREFUaN7tWouWojAMNUEHdQbBlWXc9/P/v3FP05Y2bdCRIt3jkFlXAWFyL+kl7Z3VaomcAUtkjIX+rHGZfjQvtyVvAKCNocuwEzD8KJ42cwhA754Wpx/9iOgHBH7MYxz7r/DLeDsh+kzXsP8yRlgCBufs9LN0LP2upvl+Rh2Gp8ZopFuK9POf0Y/zDcpL9BNfjlwUv+BVPw7SD8ENsif2FxBlq1gjbp4ASkTcAuz2iM8vANUBaX+NiA0AHFEfn4L+AMsg/SqXZoJMV4PZgEsgKgU3GjBKOboKYvhk8N6ckMk4Sw2y+PBC7/Wphepj61joAI5dCvUMn5FOk9cF+ssGqkMX7ro9U4F+ZBRy1XC3BfGN1e/rC6Mf3UGLvDo0QTJHvaN61aCKMwMF5TT0o8e2S2iYfuL4qOo9MdOYfvRqkel7UP2CpHBp8e4bRuf4BeegR/Tv9nqs1gaqwuiBIqyTVX/YEKA3GnjUpCin1ts1LtOVkAr6GV2gX3qgvu3RGz2q5UKrtaIqKd3SzekVVb0rKbWK2kBKxI/eq/R/Wp8+mzpPyXQlZGLVxPZeg/RzafGHDSOU95Y+1mCASHdAlxhJJ+EyNfasoRsB2O2T+I/odz8DWanKV/KSmulKSIRJs6tbgX7sm6Mr9LtN5EcxOByGlVKjrCShgcL6hyei3wMkBml/zbV/VKbBtCv43z2LhqqfHRafDuLEoD+JzxuER6/GaGvJ9hWlgW7bjXVq44kC/X4nxGO33zzpMq97NRmV6bXGM2iHBfqBtz5Cq4rRPfS7IH8/p7/WXbMSVKWoVkn9LrpxTXYS/ULPf4l++qUd9PSPzvQq/RFfII5Mznyk89j30xBhuzLDmSEwyj6c5t8rLtHfT3oDaen1Ht3stT/ibTnKpUrXTxbgxZcnWPa+MuZZdFhirljozxoL/VljoT9rLPRnjcFFh35L3ngIe1HImX+avfORVpYf0F6MQQtrhLnof3x7MQYdY52/+nPbizQ/V4skatq+1S6enqaX2qQrafaebi8O0R8gG6Q/MBtH5x1Xf7xmA0xI7movmgUquzBlV2uh/vJ161Zr0w2WAfrdGs+NZuPYvAXxyWgvFt/M8qBGsftuUFSHH8pMqs13J6c/1WwcnbdE/7DBAqGkcGlJthePP2klsXr9hdrQ+G3+gqAhL6/8o8f2nao/bA/ebjaOzjuiP6u9WD6/qAFcrBsazzV2NHCLc6tg7PanlsZ1ur0o0u9t3mg2js47evRerP5724vkEJUdOUPFuSU/qd78JQj6ZS3tRHvxCv23mo2j8xYevRntRXLiyo4MuuLcEhxVafRbN08Kpf2LgjR78Qr9t5qNo/OW+v589qKCpV7KmSsbsq2NdU3ZKzfbONqJ9mIEOs1sHJ330Kw3j72o7DnVs9m2WrXRHfQwlHie2insxRB0otk4Om+583l4ezEA/Z+Yje/GXuSxmI3vNBb6s8ZCf9ZY6M8a/wD4emdbC8aiIwAAAABJRU5ErkJggg=="}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/59.b0c3be29.js b/learning/.vuepress/dist/assets/js/59.b0c3be29.js deleted file mode 100644 index 971d1ad0..00000000 --- a/learning/.vuepress/dist/assets/js/59.b0c3be29.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{1129:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享一个"),n("strong",[t._v("脑筋急转弯")]),t._v("类型的算法题。leetcode这个脑筋急转弯的tag打的我措手不及...")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(868),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("分享这道题目的原因,是因为有很多同学,在拿到题目的一瞬间,如果发现题目很长,然后自己就慌了。其实,对于这种题目,如果认真的分析下去,非常简单。")])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第1033题:移动石子直到连续")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("三枚石子放置在数轴上,位置分别为 a,b,c。每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < z 且 k != y。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。要使游戏结束,你可以执行的最小和最大移动次数分别是多少?以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:a = 1, b = 2, c = 5\n输出:[1, 2]\n解释:将石子从 5 移动到 4 再移动到 3,或者我们可以直接将石子移动到 3。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:a = 4, b = 3, c = 2\n输出:[0, 0]\n解释:我们无法进行任何移动。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[n("strong",[t._v("提示:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("1 <= a <= 100\n1 <= b <= 100\n1 <= c <= 100\na != b, b != c, c != a\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这种题,基本上不慌,就赢了一半。")])]),t._v(" "),n("p",[t._v("通过分析题中的样例,就算再笨,画一画应该都能理解题意。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("比如:a = 1, b = 2, c = 5")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(869),alt:"PNG"}}),t._v(" "),n("p",[t._v("比如:a = 4, b = 3, c = 2")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(870),alt:"PNG"}}),t._v(" "),n("center",[t._v("(无法移动)")]),t._v(" "),n("p",[t._v("读懂了题意,开始进行分析。首先可以明确,每一次我们其实"),n("strong",[t._v("是从边上来挑选石子,然后往中间进行移动")]),t._v("。所以,我们首先得找到min(左),max(右)以及mid(中)三个值。我们设,min和mid中的距离为x,max和min中的距离为y。大概就是下面这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(871),alt:"PNG"}}),t._v(" "),n("p",[t._v("然后只需要计算x和y的和,就是我们要找的最大值。而最小值,就很容易了,只有0,1,2三种可能性。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("根据分析,得到代码:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("numMovesStones")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\tarr "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tsort"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Ints")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\tx "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\ty "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\tmax "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" y\n\tmin "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" y "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tmin "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\tmin "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br")])]),n("h2",{attrs:{id:"_03、c-代码"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、c-代码"}},[t._v("#")]),t._v(" 03、C 代码")]),t._v(" "),n("blockquote",[n("p",[t._v("当然,也可以不用排序,把代码写漂亮一点。像是下面这样...")])]),t._v(" "),n("p",[t._v("代码如下:")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[t._v("class Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\npublic"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("numMovesStones")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" maxMove "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" minMove "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n minMove "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n minMove "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" med "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n minMove "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" vector"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("minMove"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("maxMove"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(872),alt:"PNG"}})],1)}),[],!1,null,null,null);s.default=r.exports},868:function(t,s,a){t.exports=a.p+"assets/img/1.f5c13fd2.jpg"},869:function(t,s,a){t.exports=a.p+"assets/img/2.4349c876.jpg"},870:function(t,s){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAABtCAIAAAAtTjDmAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nO3deZhcVZ038O85525V1d3ZWVUmogMENCEkA2FAhXFBh3eYV5lnFAFBkdEhTvA1gguCIPjKKwy4IK9LcIcRERFQgRkVEGVJwIQQBCcJS0iAAAm9VNVdzjJ/nKrbt7fQna7urnv793l4Qvetul331D33nt89KzPGYDhJktRqtc7OTs75sG8ojN7e3kqlUuBkaq055729vZ2dnVN9LBOup6enq6vLJnmqj2WiaK2r1ep0OJt0bRYJXZtFMtK1WdhTSwghhJDJRCEFIYQQQlqAQgpCCCGEtACFFIQQQghpAQopCCGEENICFFIQQgghpAUopCCEEEJICzhTfQDtIjs/B2NsCo+EEJJF1yYh7WnotUm1FIQQQghpAQopCCGEENICFFIQQgghpAUcrfWwLyilABR4MvZUGIZBEAgh7K9GGwDaNL4WzvL9DQhHSCk9zwvD0PM83/eTJDHGeJ431YfWMlprxhhjTGsdx/GY9k2SBABnnHH7N0bbVG8sbRhnACZtX2TW3xn9LjlVr9d93x9TXk2/24k7qlbJXpvpcgnGmCL1F8lem/V6vauryyZ5qo9rohhtoigq9rWppBKOUEpxzoeuEeaMdO35vl+v1wFEUeS6brq9SNndGMM5V0plE2grbgTEVB1Vy3meZ+9Tvu9rrV3X7evrc5zi9MyNoqhUKiETAY8+FB5w6seiEQfsVsA5nn0B+L4vpQSgpLJBSfEYbdISd0w7jvO7nWTptWnvzowx+4Qz1cfVMnEc2+Rwzm0aCxxPoBkmAtBa5yKu3Q2MM2NMuVxWUg3aDoCNtBLpzTff3NfXJ4QIgsA+yTV2K1BIEQTBmjVrent7y+XykiVL7Eb7haRfS97Ta4xxXffee++t1+tBECxatMj3fWOMzffF4Lou5zwMw7Vr11ar1VKptGzZsiRJ0pqnXcjm/5Fq7IbKhiyMNS6iUe4+nn2thx56yD7wLVmyJAzD0e+YI9lrc/HixaPcK3u1tv+Va8vXe++9t1areZ5nr00MzJN55ziOEKJer69bt667u7tcLi9btiyO49Fcm3m0evXq9Noca41pXsRR3NHZ0dfbVyqXTjjhhEGvOt3d3cPu9vTTT69cuTKKokHb2/9CHb3spZve6IsXUthnIFtPldZDTvVxtdKg8tgmc0x/IS3ad8Pk7yuEsO2SBTuPWeMsVnORye0y30KI7DMbgCIVtzajTlvtnwl3Q3ptnnrqqcccc0y63SbWmTFjxrC7zZgxI4qik046KQiCIkXNWUEQbNiw4e677z755JPt8wEKF1LYquO1a9c++OCDp512mo2c4jje7Qr/NpTelDdt2nTfffd98IMfZIxJKYuabzdu3HjnnXeecsopnPM03xZMGIbr16/fsGHDySefnG2kK9I5lVI6jrNu3bo1a9Z84AMfcBynePlWa23rC13Xveaaaw455JCjjz4aI4caeU+71nrVqlULFy487LDDpvpYJop9Rl21alW5XO7q6hr06ogN6rYLxd57733ZZZdN8BFOGWPMihUr7rnnnj333DNNZsFCCsZYkiTLly9fv3797NmzL7nkEgDFa85MksR13TPPPPP3v/895/yqq66a6iOaQGefffZdd901Z86cK664Iu+34JEwxs4666x169Z1dnZeeeWV6fYipdd2Wly+fPnDDz88e/bsiy++2HZ4murjaiXblQ/Atddee8011wghvvGNb2Dk85j383vDDTesWrXKlrhTfSwT6Ic//OF3vvMd24NtkBFDClsUCSFsB+qJPLwpYxvgXdcd2v8075FEyhhj68njOPY8zwYT6XVeGK7r2r5CQRDYziLjaY9oc729vbb7CAqUUYcyxtimgezGIqXXtkJKKZMkcRzH932baYuUb4Uj7EmUUjLGHMexN5+RzmPez6+tLi1ST7Vh2c62w7YvjxhS2FJWKZWLVsndZs99th9N8WopGGM2NLRDeMIwLNiTUK1WC4KACy6EiONYax1Fked5Re1xXSqV4jguUsEzrLS/SPbOVaRzmob1Sqne3l40K9vyfs8ZhHMex7HnesYYx3G00QKiqLUUVvGqgbPSgR5jCymmCcdxkiQZOr42vaqLcXnbRz0bWNhxa9lX857GIAhsArXWSik7TAnI5URuo7mlJkliw0T7mDsJRzX50komO9I73W5YEYocK/v0Yrus2Qe5YhSrls2fnudFcQQgDEPOhpnMIJX3mZBsKWufUYu6Ng0XXEqptR62H/F0DykIaSujufVwzm0PqWLXIA7bBFm89KbJLNhjzCD9yeSswI2S08dIZzDfISEhhBBC2gSFFIQQQghpAWr4IIQQ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"},871:function(t,s,a){t.exports=a.p+"assets/img/4.cd0d1855.jpg"},872:function(t,s){t.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/6.9d44eeb3.js b/learning/.vuepress/dist/assets/js/6.9d44eeb3.js deleted file mode 100644 index a75afe7f..00000000 --- a/learning/.vuepress/dist/assets/js/6.9d44eeb3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{1040:function(t,e,a){"use strict";a.r(e);a(50);var r=a(380),n=a(381),s=a(376),o=a(372),i=a(363),c=a(361),u={mixins:[o.a,c.a],components:{Common:r.a,NoteAbstract:s.a,TagList:n.a,ModuleTransition:i.a},data:function(){return{tags:[],currentTag:"全部",currentPage:1,allTagName:"全部"}},created:function(){this.$tags.list.length>0&&(this.currentTag=this.$route.query.tag?this.$route.query.tag:this.currentTag)},mounted:function(){this._setPage(this._getStoragePage())},methods:{tagClick:function(t){this.$router.push({path:t.path})},getCurrentTag:function(t){this.$emit("currentTag",t)},getCurrentPage:function(t){this._setPage(t),setTimeout((function(){window.scrollTo(0,0)}),100)},_setPage:function(t){this.currentPage=t,this.$page.currentPage=t,this._setStoragePage(t)}}},f=(a(406),a(407),a(455),a(3)),g=Object(f.a)(u,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"tags-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("TagList",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],attrs:{currentTag:t.currentTag},on:{getCurrentTag:t.tagClick}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.$recoPosts,currentPage:t.currentPage,currentTag:t.currentTag},on:{currentTag:t.getCurrentTag}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[a("pagation",{staticClass:"pagation",attrs:{total:t.$recoPosts.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],1)],1)}),[],!1,null,"31ab3906",null);e.default=g.exports},357:function(t,e,a){},358:function(t,e,a){},359:function(t,e,a){},360:function(t,e,a){},362:function(t,e,a){"use strict";function r(){var t=["#e15b64","#f47e60","#f8b26a","#abbd81","#849b87","#e15b64","#f47e60","#f8b26a","#f26d6d","#67cc86","#fb9b5f","#3498db"];return t[Math.floor(Math.random()*t.length)]}a.d(e,"a",(function(){return r}))},364:function(t,e,a){"use strict";a(366),a(25),a(368),a(26),a(30);var r=a(49),n={props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},data:function(){return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"}}},filters:{formatDateValue:function(t){if(!t)return"";t=t.replace("T"," ").slice(0,t.lastIndexOf("."));var e=Number(t.substr(11,2)),a=Number(t.substr(14,2)),n=Number(t.substr(17,2));return e>0||a>0||n>0?Object(r.d)(t):Object(r.d)(t,"yyyy-MM-dd")}},methods:{goTags:function(t){this.$router.push({path:"/tags/".concat(t,"/")})}}},s=(a(369),a(3)),o=Object(s.a)(n,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title?a("i",{staticClass:"iconfont reco-account"},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("i",{staticClass:"iconfont reco-date"},[a("span",[t._v(t._s(t._f("formatDateValue")(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("i",{staticClass:"iconfont reco-eye"},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("i",{staticClass:"iconfont reco-tag tags"},t._l(t.pageInfo.frontmatter.tags,(function(e,r){return a("span",{key:r,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return t.goTags(e)}}},[t._v("\n "+t._s(e)+"\n ")])})),0):t._e()])}),[],!1,null,"484a899e",null);e.a=o.exports},366:function(t,e,a){var r=a(0),n=a(367);r({target:"Array",proto:!0,forced:n!==[].lastIndexOf},{lastIndexOf:n})},367:function(t,e,a){"use strict";var r=a(16),n=a(31),s=a(11),o=a(27),i=a(20),c=Math.min,u=[].lastIndexOf,f=!!u&&1/[1].lastIndexOf(1,-0)<0,g=o("lastIndexOf"),l=i("indexOf",{ACCESSORS:!0,1:0}),p=f||!g||!l;t.exports=p?function(t){if(f)return u.apply(this,arguments)||0;var e=r(this),a=s(e.length),o=a-1;for(arguments.length>1&&(o=c(o,n(arguments[1]))),o<0&&(o=a+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:u},368:function(t,e,a){"use strict";var r=a(7),n=a(4),s=a(107),o=a(21),i=a(5),c=a(34),u=a(177),f=a(35),g=a(1),l=a(52),p=a(51).f,h=a(33).f,m=a(8).f,d=a(378).trim,v=n.Number,_=v.prototype,b="Number"==c(l(_)),I=function(t){var e,a,r,n,s,o,i,c,u=f(t,!1);if("string"==typeof u&&u.length>2)if(43===(e=(u=d(u)).charCodeAt(0))||45===e){if(88===(a=u.charCodeAt(2))||120===a)return NaN}else if(48===e){switch(u.charCodeAt(1)){case 66:case 98:r=2,n=49;break;case 79:case 111:r=8,n=55;break;default:return+u}for(o=(s=u.slice(2)).length,i=0;in)return NaN;return parseInt(s,r)}return+u};if(s("Number",!v(" 0o1")||!v("0b1")||v("+0x1"))){for(var T,C=function(t){var e=arguments.length<1?0:t,a=this;return a instanceof C&&(b?g((function(){_.valueOf.call(a)})):"Number"!=c(a))?u(new v(I(e)),a,C):I(e)},N=r?p(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),P=0;N.length>P;P++)i(v,T=N[P])&&!i(C,T)&&m(C,T,h(v,T));C.prototype=_,_.constructor=C,o(n,"Number",C)}},369:function(t,e,a){"use strict";var r=a(357);a.n(r).a},370:function(t,e,a){"use strict";var r=a(358);a.n(r).a},371:function(t,e,a){"use strict";var r=a(359);a.n(r).a},372:function(t,e,a){"use strict";a(377);e.a={methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",{page:1,path:""}),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}},374:function(t,e,a){},375:function(t,e,a){},376:function(t,e,a){"use strict";a(25);var r={components:{PageInfo:a(364).a},props:["item","currentPage","currentTag"]},n=(a(370),a(3)),s={components:{NoteAbstractItem:Object(n.a)(r,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item"},[t.item.frontmatter.sticky?a("i",{staticClass:"iconfont reco-sticky"}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("i",{staticClass:"iconfont reco-lock"}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("hr",{staticClass:"hr"}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"28f76ce9",null).exports},props:["data","currentPage","currentTag"],computed:{currentPageData:function(){var t=10*this.currentPage-10,e=10*this.currentPage;return this.data.slice(t,e)}}},o=(a(371),Object(n.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),1)}),[],!1,null,"b014bc36",null));e.a=o.exports},379:function(t,e,a){"use strict";var r=a(360);a.n(r).a},381:function(t,e,a){"use strict";a(106);var r=a(22),n=a(362),s={props:{currentTag:{type:String,default:""}},computed:{tags:function(){return[{name:"全部",path:"/tag/"}].concat(Object(r.a)(this.$tags.list))}},methods:{tagClick:function(t){this.$emit("getCurrentTag",t)},getOneColor:n.a}},o=(a(379),a(3)),i=Object(o.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,r){return a("span",{key:r,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"36b9f66a",null);e.a=i.exports},406:function(t,e,a){"use strict";var r=a(374);a.n(r).a},407:function(t,e,a){"use strict";var r=a(375);a.n(r).a},409:function(t,e,a){},455:function(t,e,a){"use strict";var r=a(409);a.n(r).a}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/60.6a556d9b.js b/learning/.vuepress/dist/assets/js/60.6a556d9b.js deleted file mode 100644 index 9f5f9a3a..00000000 --- a/learning/.vuepress/dist/assets/js/60.6a556d9b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{1130:function(t,s,a){"use strict";a.r(s);var n=a(3),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("上一篇是为大家分享了一道打着“脑筋急转弯”tag的题目,然后我顺便就把这个类型的题目全部筛选出来看了看,发现总共没几个,所以就想的干脆一次全部讲完吧。")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(873),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("这个类型的题目,其实除了废话多一点,好像没什么特别的。")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第292题:Nim 游戏")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人,每一步都是最优解。编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: 4\n输出: false \n解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;\n 因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br")])]),n("br"),t._v(" "),n("p",[t._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")]),t._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这种问题,如果没有思路,可以先自己找个纸写写画画,找找规律")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("首先如果石头数小于4个,那么因为你是先手,一把拿走,肯定会赢。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(874),alt:"PNG"}}),t._v(" "),n("p",[t._v("而如果石头是4个,那不管你是拿了1,2,3个,最后一个都可以被你的对手拿走,所以怎么样都赢不了。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(875),alt:"PNG"}}),t._v(" "),n("p",[t._v("再继续分析到8个石头:对于5,6,7而言,你只需要对应的拿走1,2,3,然后留下4个,则对方必输。但是如果你要面对的是8,不管先拿(1,2,3)个,另一个人都可以通过 8-(1,2,3) ,使得你面对4个石头,则你必输无疑。通过观察,我们发现,好像是"),n("strong",[t._v("只要N是4的倍数,我们就必输无疑")]),t._v("。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(876),alt:"PNG"}}),t._v(" "),n("p",[t._v("尝试性的写下代码:(这个,什么语言都无所谓吧....)")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("canWinNim")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("bool")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(877),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、证明过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、证明过程"}},[t._v("#")]),t._v(" 03、证明过程")]),t._v(" "),n("blockquote",[n("p",[t._v("脑筋急转弯的题目不是很多见,但是某些公司的某些人却钟情于此,如果是本着考察对方的思维能力,那我觉得还是挺好的。但若是为了寻找作为面试官的一丝丝优越感,那就只能是。。呵,打扰了。。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("首先需要说下的是,这个问题属于"),n("strong",[t._v("博弈论")]),t._v("。NIM的意思就是“尼姆”,并不是什么高大上的英文缩写。所以,NIM游戏一般也称之为尼姆游戏。说白了,就是"),n("strong",[t._v("设置两个对手,通过回合制的方式来玩的一种数学战略游戏,"),n("strong",[t._v("在早期网络不发达的时候很火。毕竟那时候连梦幻都没有,更别说王者。(非戏说,很多回合制游戏,其实本质就是数学游戏。而对于王者这种多人实时竞技游戏更是如此,如果想玩好,数学学不好,基本就凉凉。有兴趣的,可以了解一下")]),t._v("游戏平衡师")]),t._v(")")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("回到本题,假若对于先手有N个石头,那么后手的可能性有N-1,N-2,N-3三种。"),n("strong",[t._v("只有当后手的这三种可能性都必胜时,N才会必败")]),t._v("。因为题目说了,我们都是聪明人(一般博弈论的问题都会有这句话),那如果后手的三种可能性中,有哪一种必败,作为先手,我们一定会走出这种可能性。那这种可能性是什么,其实就是让对方去面对4的倍数。如果先手我们遇到一个不是4的倍数的值x,有:")]),t._v(" "),n("center",[t._v("4k > N > 4(k-1)")]),t._v(" "),n("p",[t._v("N一定处于两个4的倍数之间,因为N本身不是4的倍数,那N距离最近的4的倍数的值最大为3。所以,只要我们不是面对4的倍数,作为先手,我们一定可以取走(12,3),使剩余的值变成4的倍数,则后手必输无疑。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])],1)}),[],!1,null,null,null);s.default=e.exports},873:function(t,s,a){t.exports=a.p+"assets/img/1.d68e1fd6.jpg"},874:function(t,s,a){t.exports=a.p+"assets/img/2.15ab51a5.jpg"},875:function(t,s,a){t.exports=a.p+"assets/img/3.8ad59b24.jpg"},876:function(t,s,a){t.exports=a.p+"assets/img/4.3c3af4f3.jpg"},877:function(t,s,a){t.exports=a.p+"assets/img/5.33763b0a.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/61.21073b19.js b/learning/.vuepress/dist/assets/js/61.21073b19.js deleted file mode 100644 index 1e9c12d1..00000000 --- a/learning/.vuepress/dist/assets/js/61.21073b19.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{1131:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天给大家分享一道美团面试题。话不多说,直接看题。")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v('这个题目的变形很多,比如找 "前 K 个高频元素"、 "数据流中的第K大元素" 、"最接近原点的 K 个值" 等等等等。')])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第215题:第K个最大元素")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [3,2,1,5,6,4] 和 k = 2\n输出: 5\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [3,2,3,1,2,4,5,5,6] 和 k = 4\n输出: 4\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[n("strong",[t._v("说明:")])]),t._v(" "),n("p",[t._v("你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_02、大顶堆"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、大顶堆"}},[t._v("#")]),t._v(" 02、大顶堆")]),t._v(" "),n("blockquote",[n("p",[t._v("堆在算法题目中的应用主要包括以下几点:")]),t._v(" "),n("ul",[n("li",[t._v("TopK 问题 (尤其是大数据处理)")]),t._v(" "),n("li",[t._v("优先队列")]),t._v(" "),n("li",[t._v("利用堆求中位数")])])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("这种题目,从个人来讲,我一般是比较偏好使用堆来做的。毕竟大小顶堆,刚好有着与本类题型契合的特性。如果对堆不太熟悉的话,可以先看下这篇文章:")]),t._v(" "),n("p",[t._v("那本题如何使用堆来做呢?假若我们的数组为[3,2,1,5,6,4],k=2,我们对其构造一个小顶堆(每个结点的值均不大于其左右孩子结点的值,堆顶元素为整个堆的最小值),整个过程是这样:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[n("p",[t._v("构造一个小顶堆,依次将元素放入堆中,并保证堆中元素为k。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(878),alt:"PNG"}})]),t._v(" "),n("li",[n("p",[t._v("如果当前元素小于堆顶元素,那基本就不用看了(因为我们要找的是 排序后的第 k 个最大的元素)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(879),alt:"PNG"}})]),t._v(" "),n("li",[n("p",[t._v("自然,如果我们遇到比堆顶元素大的元素,就把它放入到堆中。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(880),alt:"PNG"}})]),t._v(" "),n("li",[n("p",[t._v("重复上面的步骤:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(881),alt:"PNG"}})])]),t._v(" "),n("p",[t._v("然后根据分析,完成代码(今天就不手撕堆了,因为之前已经手撕过了。同时这里给大家一个建议,如果面试的时候,遇到这种TOPK的问题,"),n("strong",[t._v("假如特别有把握,肯定得手撕数据结构,一定会加分")]),t._v("。但是如果没有把握,那就先用API实现,以 BugFree 为目标吧!)")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findKthLargest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PriorityQueue")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" minQueue "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PriorityQueue")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" num "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("minQueue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" num "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" minQueue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("peek")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n minQueue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("offer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("minQueue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n minQueue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("poll")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" minQueue"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("peek")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br")])]),n("p",[t._v("我也不知道为啥,Python永远就是这么牛X,朴实无华且枯燥!")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("//")]),t._v("python\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findKthLargest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" heapq"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nlargest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# [6,5]")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br")])]),n("p",[t._v("**注:**python可以使用heapq.nlargest 或 heapq.nsmallest,来找出某个集合中找出最大或最小的N个元素。")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("//")]),t._v("python\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" heapq\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("37")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("heapq"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nlargest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("37")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("heapq"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("nsmallest"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br")])]),n("h2",{attrs:{id:"_03、快排"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、快排"}},[t._v("#")]),t._v(" 03、快排")]),t._v(" "),n("blockquote",[n("p",[t._v("快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那对于本题,我们就是使用快排的思想,选定一个基准值,把比基准值大的放在基准值的右边,把基准值小的放在基准值的左边。若基准值刚好位于倒数第k个数,则基准值为目标值;反之,则递归处理目标值所处的那一部分数组。")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("findKthLargest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n idx "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("idx"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pos "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n povit_idx "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" pos "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" povit_idx "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" povit_idx\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" pos "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" povit_idx "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("povit_idx "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pos"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" povit_idx "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pos"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("partition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n s "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" l\n povit_value "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" povit_value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n r"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" povit_value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n l"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("l"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" povit_value\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" l\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{attrs:{src:a(882),alt:"PNG"}}),t._v(" "),n("p",[t._v("整个快排的核心,其实就partition。partition 有 单向扫描,双向扫描 等多种写法。上面的代码,大家可以参考参考,看不懂也没关系,我后面是会单独安排一个快排的系列篇来进行讲解的,到时候一堆图解砸进来,保准你看的醍醐灌顶!")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=r.exports},878:function(t,s,a){t.exports=a.p+"assets/img/1.f9b4ce18.jpg"},879:function(t,s,a){t.exports=a.p+"assets/img/2.1d7ed267.jpg"},880:function(t,s,a){t.exports=a.p+"assets/img/3.1a17ae06.jpg"},881:function(t,s,a){t.exports=a.p+"assets/img/4.655c9c55.jpg"},882:function(t,s,a){t.exports=a.p+"assets/img/5.ccd57a30.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/62.e08e9348.js b/learning/.vuepress/dist/assets/js/62.e08e9348.js deleted file mode 100644 index f3b3b5f7..00000000 --- a/learning/.vuepress/dist/assets/js/62.e08e9348.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{1139:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天给大家分享一道很魔性的题目(很多槽点),也是一道入门级别的贪心算法题目。")])]),s._v(" "),n("h2",{attrs:{id:"_01、分发饼干"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、分发饼干"}},[s._v("#")]),s._v(" 01、分发饼干")]),s._v(" "),n("blockquote",[n("p",[s._v("贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("问题:分发饼干")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("假设你是一位很棒(多棒???)的家长,想要给你的孩子们一些小饼干(不能给大饼干吗???)但是,每个孩子最多只能给一块饼干(有毒吧。。。)")])])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("注意:你可以假设胃口值为正(特么不正难道往外吐吗???)。一个小朋友最多只能拥有一块饼干。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 :")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [1,2,3], [1,1] \n输出: 1 \n\n解释: \n你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。\n虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。\n所以你应该输出1。 \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(947),alt:"PNG"}}),s._v(" "),n("center",[s._v("(难道剩下一个饼干喂狗吗?????)")]),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("好吧。假如我们按照题目所说的策略来分析,尽可能的让孩纸满足,满足不了就一个饼干都不给他,忘掉那些懵逼的孩子。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("其实策略就很简单了:"),n("strong",[s._v("我们只需要在满足孩子胃口的前提下,尽可能分配小的饼干给到他")]),s._v("。典型的资本主义。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(948),alt:"PNG"}}),s._v(" "),n("p",[s._v("具体怎么做呢,我们把饼干和小朋友都按照"),n("strong",[s._v("从大到小")]),s._v("排列。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(949),alt:"PNG"}}),s._v(" "),n("ul",[n("li",[n("p",[s._v("如果最大的饼干可以满足肚子最大的孩子,那就给他吃,同时比较下一个。")])]),s._v(" "),n("li",[n("p",[s._v("如果最大的饼干不能满足肚子最大的孩子,"),n("strong",[s._v("那就让他饿着")]),s._v(",然后看看能不能满足第二个孩子。(有点黑暗系,"),n("strong",[s._v("放弃小朋友")]),s._v(")")])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("但是这里有个问题。凭什么就要先满足肚子最大的孩子。按道理讲,肚子越大应该越扛饿才对吧。所以我们换种思路,从"),n("strong",[s._v("肚子最小的孩子")]),s._v("开始。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(950),alt:"PNG"}}),s._v(" "),n("ul",[n("li",[n("p",[s._v("如果最小的饼干可以满足肚子最小的孩子,那就给他吃,同时比较下一个。")])]),s._v(" "),n("li",[n("p",[s._v("如果最小的饼干不能满足肚子最小的孩子,"),n("strong",[s._v("那就扔掉饼干")]),s._v(",看看下一个饼干能不能给他吃。("),n("strong",[s._v("放弃的是饼干")]),s._v(")")])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("那这两种其实都算是贪心:")]),s._v(" "),n("ul",[n("li",[s._v("一种是胃口太大轮到下一个孩子")]),s._v(" "),n("li",[s._v("一种是饼干太小轮到下一个饼干")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("因为要同时控制饼干和小孩,所以我们采用双指针。这里给出先满足小肚子孩子的代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("findContentChildren")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("grid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" size "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Arrays")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" gi "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" si "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gi "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" si "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("grid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("gi"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" size"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("si"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n gi"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n si"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" gi"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("如果想先满足大肚子,代码也大同小异。直接从尾部向前遍历即可。执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(951),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、一点分享"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、一点分享"}},[s._v("#")]),s._v(" 03、一点分享")]),s._v(" "),n("blockquote",[n("p",[s._v("前阵子状态很差,这两天逐步调整过来啦,多谢大家的关心。后面的内容我会换一个策略,提前拟定好目录以及学习纲领,更系统的来分享题解,希望大家继续支持!")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("我们遇到什么困难也不要怕,微笑着面对它!消除恐惧的最好办法就是面对恐惧!坚持,才是胜利。加油!奥利给!")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])],1)}),[],!1,null,null,null);t.default=r.exports},947:function(s,t,a){s.exports=a.p+"assets/img/1.5118c910.gif"},948:function(s,t,a){s.exports=a.p+"assets/img/2.a9aa4801.jpg"},949:function(s,t,a){s.exports=a.p+"assets/img/3.9a946a0e.jpg"},950:function(s,t,a){s.exports=a.p+"assets/img/4.c40e03a7.jpg"},951:function(s,t,a){s.exports=a.p+"assets/img/5.6e74812c.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/63.f8abca53.js b/learning/.vuepress/dist/assets/js/63.f8abca53.js deleted file mode 100644 index 518a4162..00000000 --- a/learning/.vuepress/dist/assets/js/63.f8abca53.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{1037:function(e,t,n){"use strict";n.r(t);var o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],r={computed:{noFoundPageByTencent:function(){return!1!==this.$themeConfig.noFoundPageByTencent}},mounted:function(){if(this.noFoundPageByTencent){var e=document.createElement("script");e.setAttribute("homePageName","回到首页"),e.setAttribute("homePageUrl","/"),e.setAttribute("src","//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"),document.body.append(e)}},methods:{getMsg:function(){return o[Math.floor(Math.random()*o.length)]}}},s=(n(365),n(421),n(3)),c=Object(s.a)(r,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.noFoundPageByTencent?e._e():n("section",{staticClass:"theme-container"},[n("article",{staticClass:"content"},[n("h1",[e._v("404")]),e._v(" "),n("blockquote",[e._v(e._s(e.getMsg()))]),e._v(" "),n("router-link",{attrs:{to:"/"}},[e._v("Take me home.")])],1)])}),[],!1,null,null,null);t.default=c.exports},356:function(e,t,n){},365:function(e,t,n){"use strict";var o=n(356);n.n(o).a},382:function(e,t,n){},421:function(e,t,n){"use strict";var o=n(382);n.n(o).a}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/64.1728ce32.js b/learning/.vuepress/dist/assets/js/64.1728ce32.js deleted file mode 100644 index d4214ef5..00000000 --- a/learning/.vuepress/dist/assets/js/64.1728ce32.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{1041:function(e,t,a){"use strict";a.r(t);a(106),a(178),a(179),a(76),a(26),a(30),a(180);var n=a(380),o=a(363),s={mixins:[a(361).a],name:"TimeLine",components:{Common:n.a,ModuleTransition:o.a},filters:{dateFormat:function(e,t){e=function(e){var t=new Date(e).toJSON();return new Date(+new Date(t)+288e5).toISOString().replace(/T/g," ").replace(/\.[\d]{3}Z/,"").replace(/-/g,"/")}(e);var a=new Date(e),n=a.getMonth()+1,o=a.getDate();return"".concat(n,"-").concat(o)}},methods:{go:function(e){this.$router.push({path:e})}}},r=(a(365),a(456),a(3)),i=Object(r.a)(s,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("Common",{staticClass:"timeline-wrapper",attrs:{sidebar:!1}},[a("ul",{staticClass:"timeline-content"},[a("ModuleTransition",[a("li",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"desc"},[e._v("Yesterday Once More!")])]),e._v(" "),e._l(e.$recoPostsForTimeline,(function(t,n){return a("ModuleTransition",{key:n,attrs:{delay:String(.08*(n+1))}},[a("li",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}]},[a("h3",{staticClass:"year"},[e._v(e._s(t.year))]),e._v(" "),a("ul",{staticClass:"year-wrapper"},e._l(t.data,(function(t,n){return a("li",{key:n},[a("span",{staticClass:"date"},[e._v(e._s(e._f("dateFormat")(t.frontmatter.date)))]),e._v(" "),a("span",{staticClass:"title",on:{click:function(a){return e.go(t.path)}}},[e._v(e._s(t.title))])])})),0)])])}))],2)])}),[],!1,null,"8590c612",null);t.default=i.exports},356:function(e,t,a){},365:function(e,t,a){"use strict";var n=a(356);a.n(n).a},410:function(e,t,a){},456:function(e,t,a){"use strict";var n=a(410);a.n(n).a}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/65.91695191.js b/learning/.vuepress/dist/assets/js/65.91695191.js deleted file mode 100644 index 2efebf6c..00000000 --- a/learning/.vuepress/dist/assets/js/65.91695191.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{1042:function(t,_,v){"use strict";v.r(_);var a=v(3),r=Object(a.a)({},(function(){var t=this,_=t.$createElement,a=t._self._c||_;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("blockquote",[a("p",[t._v("**今天是小浩算法“365刷题计划” - 刷题指导篇(小白篇)。**三年高考,五年刷题。leetcode不算从其他各处收录的题目,单就自己的题库,总共有1600+,如果按照每天刷一道的话,总共需要5年。那我们真的需要把这些题目全部刷完吗?如果不是,刷多少合适?又该怎么刷呢?本文我尽量言简意赅,直击大家的疑惑。(本文适合算法初学者)")])]),t._v(" "),a("h2",{attrs:{id:"_01、刷多少题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、刷多少题"}},[t._v("#")]),t._v(" 01、刷多少题")]),t._v(" "),a("blockquote",[a("p",[t._v("不下百人问过我这个问题。我的建议是,对于大部分的人,200道是一个合适的数字。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("估计到这里,有人会喷我。你不设前提,不谈目的,直接就说200道,这不是扯淡吗。我想说的是,这不是扯淡。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("前面我已经说了,"),a("strong",[t._v("对于大部分人")]),t._v(",我的建议是200道。大部分人指的是什么呢?我这里统指"),a("strong",[t._v("没有系统刷题经验的同学")]),t._v("。无论是工作3-5年的职场老司机,还是即将毕业的应届生,只要没怎么刷过题,通通归为此类。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("对于上面这个群体(请先自行判断是否可以归为此类),"),a("strong",[t._v("刷题的目的基本是为了面试")]),t._v("。不管我多么巧舌如簧,告诉你算法可以提高思维,增强逻辑,是成为top coder的必然条件,等等等等。但最终都还是会回归到这个目的:"),a("strong",[t._v("面试")]),t._v("。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:v(457),alt:"PNG"}}),t._v(" "),a("p",[t._v("所以现在我们换掉问题:"),a("strong",[t._v("没什么刷题经验的同学为了面试需要刷多少道题")]),t._v("?我的答案是:200道。")]),t._v(" "),a("h2",{attrs:{id:"_02、为什么是200"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、为什么是200"}},[t._v("#")]),t._v(" 02、为什么是200")]),t._v(" "),a("blockquote",[a("p",[t._v("这个问题,不妨换做 ”刷完200道题可以掌握到什么程度?“")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("常见tag无外乎那么七八种,200道题听起来很多,但是分散到每一个tag,每种也就只包含二三十个。倘若我们算多点,每一个tag包含30道题,其中大概是15-20道easy,5-10道medium,2-3道hard。200道不多不少,基本可以完美覆盖整个算法体系,所以我认为200道是一个不错的数字。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("那么回到问题 “刷完200道题可以掌握到什么程度?” 我当然可以给你一些信心,告诉你200道题可以让你吊打面试官,完虐BAT。但是呢,"),a("strong",[t._v("其实这都是骗小孩子的,或者就是骗 ¥")]),t._v("。那真实的200道题能让你到达一个什么程度呢?")]),t._v(" "),a("br"),t._v(" "),a("ul",[a("li",[t._v("在算法方面超过大概80%的同行(这里单指基础算法,非ML、AI等)")]),t._v(" "),a("li",[t._v("在面试时不至于对方拿出一道题目整个人就陷入懵逼,而是有资格享受面试思考题目的过程")]),t._v(" "),a("li",[t._v("身边有朋友聊到算法敢过去和他们交流,而不是默默的走开")]),t._v(" "),a("li",[t._v("对于应届生,谋取一份拿到offer的可能性")]),t._v(" "),a("li",[t._v("对于老司机,去大厂镀金的必备条件")]),t._v(" "),a("li",[t._v("对于培训生,极大的缩小和科班学生的差距")])]),t._v(" "),a("h2",{attrs:{id:"_03、200道刷多久"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、200道刷多久"}},[t._v("#")]),t._v(" 03、200道刷多久")]),t._v(" "),a("blockquote",[a("p",[t._v("“我之前立了个flag,一天刷一道都没坚持下来。你特么让我刷两百道,我一年都搞不定。这不扯淡吗?”")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("如果你有上面的疑惑,那么:你错了。坚持不下来一天一道的人和刷完200道题,毛关系都没有。回到我上面的例子,200道题目里。大概easy在130-150道左右,medium在30-50道,hard只占据了不到20道题。")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:v(458),alt:"PNG"}}),t._v(" "),a("p",[t._v("跑步和刷题不同。跑步是越来越慢,刷题却是越来越快的。对于初学者(正常人),在每一个tag刷了10道左右简单题之后,基本同类型的题目可以提高到每天2-3道easy题目,有的掌握好的,甚至能提高到每天刷5-10题。很多同类型题目,基本都是一个模子刻出来的。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("所以我认为,200道题刷的特别慢的话大概在150天左右完成,中不溜的在100天左右,刷的快的话在60天左右。同时,如果我们再把这里边的 medium 和 hard 通通remove 掉。再不济,也应该在3个月左右掌握大概100-150道简单题目。剩下的,just do it。")]),t._v(" "),a("h2",{attrs:{id:"_04、刷完就忘"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_04、刷完就忘"}},[t._v("#")]),t._v(" 04、刷完就忘")]),t._v(" "),a("blockquote",[a("p",[t._v("你忘我也忘,大家都旺旺。")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("忘就对了。如果你在刷题的时候发现怎么也写不出来,别担心,这是正常的。如果你还发现,之前明明刷过的题,过段时间再做的时候,自己还是不会。别担心,这特么还是正常的。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("作为一个正常人,大脑就会忘记,如果不忘,可能说明你大脑出了问题。这个不是我说的,是医生说的:")]),t._v(" "),a("br"),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:v(459),alt:"PNG"}}),t._v(" "),a("br"),t._v(" "),a("p",[t._v("所以如果有些题你刷了好多遍都还是不会,那就需要进行总结。思考到底是哪一环节卡住了你,反复进行练习。当然,这里有人建议是每道题都刷个3遍,其实我觉得倒是没有这个必要。我建议是找个小本本,记一下每一道的核心要素与考察要点。在刷题的这段时间里,没啥事就瞅瞅翻翻。")]),t._v(" "),a("h2",{attrs:{id:"_05、没基础怎么办"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_05、没基础怎么办"}},[t._v("#")]),t._v(" 05、没基础怎么办")]),t._v(" "),a("blockquote",[a("p",[t._v("我没学过算法和数据结构,能不能刷题?")])]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("能。刷题本身就是一个学习的过程。比如二叉树的题,刷个30道,你一定会遇到BST。所以我个人认为学习系统的算法知识(也就是你们问我的,要不要买一本书,先看一遍再进行刷题)和 刷题 本身并不矛盾。你可以双管齐下,也可以单点突破,都ok。主要是,干就对了。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:v(460),alt:"PNG"}}),t._v(" "),a("p",[t._v("到这里就会出现另一个问题,“我是从头刷,还是分类刷?” 我的建议是,如果稍微有点算法基础,你就从头刷leetcode前200道题。如果完全没有算法基础,可以考虑分tag来刷。并不是说按照tag的方式更好,而是在没有算法基础的前提下分tag来刷,除了掌握题型之外,对于知识的掌握很有益处。(想一想初高中是如何学习的)那为什么又说从头刷也是可以的?这个是因为,如果一直刷某一种类型的题,容易出现刷完一类忘掉前一类的问题,也容易对某一类题目疲惫。总之,"),a("strong",[t._v("使用哪种方式取决于你")]),t._v("。关键是:干就对了!")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("另外,我认为leetcode前200题是相当经典的。可能大家不知道,早期leetcode总共也就一百来道题。这些题目基本都是精华,后面的很多题目都是在这些题目的基础上进行演化而成。比如 合并两个有序链表,后来就演化成 合并K个有序链表。并且前200道题基本覆盖了所有的算法类型,我是很建议大家刷一遍的。")]),t._v(" "),a("h2",{attrs:{id:"_06、其他"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_06、其他"}},[t._v("#")]),t._v(" 06、其他")]),t._v(" "),a("blockquote",[a("p",[t._v("初学者拿到题目没有思路怎么办?为什么看完题解自己还是写不出来?别人的代码为什么可以那么简单?为了面试要不要尽可能多的掌握最优解?等等等等,这些我打算出在下一次的算法指导篇中。")])]),t._v(" "),a("p",[t._v("今天基本就到这里了,还有很多想和大家说的,后面我再一一分享出来。如果意犹未尽,那么下面这篇文章是必看的:")]),t._v(" "),a("p",[a("RouterLink",{attrs:{to:"/0.0.学习须知/0.0.学习须知/011.html"}},[t._v("算法指导篇")])],1)])}),[],!1,null,null,null);_.default=r.exports},457:function(t,_,v){t.exports=v.p+"assets/img/1.f0787d40.gif"},458:function(t,_,v){t.exports=v.p+"assets/img/2.85163e0d.gif"},459:function(t,_,v){t.exports=v.p+"assets/img/3.4a7ea697.jpg"},460:function(t,_,v){t.exports=v.p+"assets/img/4.b038e351.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/66.cd05794a.js b/learning/.vuepress/dist/assets/js/66.cd05794a.js deleted file mode 100644 index 7ccdc393..00000000 --- a/learning/.vuepress/dist/assets/js/66.cd05794a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{1056:function(t,s,r){"use strict";r.r(s);var a=r(3),n=Object(a.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"_01、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("第21题:合并两个有序链表")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。")])])])]),t._v(" "),a("p",[a("strong",[t._v("示例:")])]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("输入:1->2->4, 1->3->4\n输出:1->1->2->3->4->4\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("br"),t._v(" "),a("p",[t._v("首先我们拿到题目乍眼一看,类似这种"),a("strong",[t._v("链表的合并问题")]),t._v("。基本上马上可以想到"),a("strong",[t._v("需要设置一个哨兵节点,这可以在最后让我们比较容易地返回合并后的链表。")]),t._v("(不懂哨兵节点的同学,可以先移驾到 "),a("RouterLink",{attrs:{to:"/1.1.链表系列/c1/006.html"}},[t._v("06.删除链表倒数第N个节点(19)")]),t._v(" 进行学习)")],1),t._v(" "),a("br"),t._v(" "),a("p",[t._v("假设我们的链表分别为:")]),t._v(" "),a("p",[t._v("l1 = [1,2,4]")]),t._v(" "),a("p",[t._v("l2 = [1,3,4]")]),t._v(" "),a("p",[t._v('同时我们设定一个 "prehead" 的哨兵节点,大概是下面这样:')]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:r(491),alt:"PNG"}}),t._v(" "),a("h2",{attrs:{id:"_02、题目图解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),a("p",[t._v("如上图所示,首先我们"),a("strong",[t._v("维护一个 prehead 的哨兵节点")]),t._v("。我们其实"),a("strong",[t._v("只需要调整它的 next 指针")]),t._v("。让它总是"),a("strong",[t._v("指向l1或者l2中较小的一个,直到l1或者l2任一指向null")]),t._v("。这样到了最后,如果l1还是l2中任意一方还有余下元素没有用到,那"),a("strong",[t._v("余下的这些元素一定大于prehead已经合并完的链表(因为是有序链表)")]),t._v("。我们只需要将这些元素全部追加到prehead合并完的链表后,最终就得到了我们需要的链表。大概流程如下:")]),t._v(" "),a("ol",[a("li",[a("p",[t._v("首先我们将 prehead 指向 l1 或者 l2 中比较小的一个。如果相等,则任意一个都可以。此时的 l1 为 [2,4],l2 为 [1,3,4]")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:r(492),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("我们继续上面的步骤。将 prehead 的链表指向 l1 和 l2 中较小的一个。现在这里就是指向1。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:r(493),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("反复上图步骤。")]),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:r(494),alt:"PNG"}})]),t._v(" "),a("li",[a("p",[t._v("现在 prehead.Next 就是我们需要的链表。")]),t._v(" "),a("br")])]),t._v(" "),a("h2",{attrs:{id:"_03、go语言示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),a("p",[t._v("根据以上分析,我们可以得到下面的题解:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mergeTwoLists")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("ListNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("ListNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("ListNode "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n prehead "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("ListNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" prehead\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" l2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n prehead"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l1\n l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n prehead"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2\n l2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n prehead "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" prehead"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n prehead"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l1\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" l2 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n prehead"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" l2\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Next\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br")])])])}),[],!1,null,null,null);s.default=n.exports},491:function(t,s){t.exports="data:image/png;base64,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"},492:function(t,s){t.exports="data:image/png;base64,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"},493:function(t,s,r){t.exports=r.p+"assets/img/3.32f5ea8f.jpg"},494:function(t,s,r){t.exports=r.p+"assets/img/4.f931992f.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/67.5366b7a3.js b/learning/.vuepress/dist/assets/js/67.5366b7a3.js deleted file mode 100644 index 19cc0354..00000000 --- a/learning/.vuepress/dist/assets/js/67.5366b7a3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{1078:function(t,s,n){"use strict";n.r(s);var a=n(3),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("blockquote",[a("p",[t._v("在上一节中,我们通过例题学习了二叉树的DFS(深度优先搜索),其实就是"),a("strong",[t._v("沿着一个方向一直向下遍历")]),t._v("。那我们可不可以"),a("strong",[t._v("按照高度一层一层的访问树中的数据")]),t._v("呢?当然可以,就是本节中我们要讲的BFS(宽度优先搜索),同时也被称为广度优先搜索。")]),t._v(" "),a("p",[t._v("我们仍然通过例题进行讲解。")])]),t._v(" "),a("h2",{attrs:{id:"_01、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("第102题:二叉树的层次遍历")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。")])])])]),t._v(" "),a("p",[a("strong",[t._v("示例:")])]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("给定二叉树 [3,9,20,null,null,15,7],\n 3 \n / \\ \n 9 20 \n / \\ \n 15 7\n返回其层次遍历结果:[[3],[9,20],[15,7]]\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br")])]),a("br"),t._v(" "),a("blockquote",[a("center",[a("b",[t._v(" 本系列内容均为必须掌握! ")])])],1),t._v(" "),a("h2",{attrs:{id:"_02、bfs介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、bfs介绍"}},[t._v("#")]),t._v(" 02、BFS介绍")]),t._v(" "),a("p",[t._v("BFS,广度/宽度优先。其实就是"),a("strong",[t._v("从上到下,先把每一层遍历完之后再遍历一下一层")]),t._v("。假如我们的树如下:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(630),alt:"img"}}),t._v(" "),a("p",[t._v("按照BFS,访问顺序如下:")]),t._v(" "),a("blockquote",[a("center",[a("b",[t._v("a->b->c->d->e->f->g ")])])],1),t._v(" "),a("p",[t._v("了解了BFS,我们开始对本题进行分析。")]),t._v(" "),a("h2",{attrs:{id:"_03、递归求解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、递归求解"}},[t._v("#")]),t._v(" 03、递归求解")]),t._v(" "),a("p",[t._v("同样,我们先考虑本题的递归解法。想到递归,我们一般先想到DFS。我们可以对该二叉树进行"),a("strong",[t._v("先序遍历(根左右的顺序)")]),t._v(",同时,记录节点所在的层次level,并且对每一层都定义一个数组,然后将访问到的节点值放入对应层的数组中。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("假设给定二叉树为[3,9,20,null,null,15,7],图解如下:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(631),alt:"img"}}),t._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(632),alt:"img"}}),t._v(" "),a("p",[t._v("根据以上分析,代码如下:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("levelOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" level "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" level "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tres "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tres"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("level"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("level"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tres "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" level"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\tres "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("dfs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" level"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" res\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br")])]),a("h2",{attrs:{id:"_04、bfs求解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_04、bfs求解"}},[t._v("#")]),t._v(" 04、BFS求解")]),t._v(" "),a("p",[t._v("上面的解法,其实相当于是用DFS的方法实现了二叉树的BFS。那我们能不能直接使用BFS的方式进行解题呢?当然,我们可以使用Queue的数据结构。我们将root节点初始化进队列,通过"),a("strong",[t._v("消耗尾部,插入头部")]),t._v("的方式来完成BFS。")]),t._v(" "),a("br"),t._v(" "),a("p",[t._v("具体步骤如下图:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(633),alt:"img"}}),t._v(" "),a("p",[t._v("根据以上分析,代码如下:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("levelOrder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" root "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 定义一个双向队列")]),t._v("\n\tqueue "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" list"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("New")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 头部插入根节点")]),t._v("\n\tqueue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("PushFront")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("root"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 进行广度搜索")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" queue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" current "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v("\n\t\tlistLength "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" queue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" listLength"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 消耗尾部")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// queue.Remove(queue.Back()).(*TreeNode):移除最后一个元素并将其转化为TreeNode类型")]),t._v("\n\t\t\tnode "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" queue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Remove")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("queue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Back")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("TreeNode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\tcurrent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("current"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" node"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Val"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" node"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//插入头部")]),t._v("\n\t\t\t\tqueue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("PushFront")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Left"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" node"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("nil")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tqueue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("PushFront")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("node"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Right"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" current"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br"),a("span",{staticClass:"line-number"},[t._v("30")]),a("br")])])])}),[],!1,null,null,null);s.default=e.exports},630:function(t,s,n){t.exports=n.p+"assets/img/1.6f166662.jpg"},631:function(t,s,n){t.exports=n.p+"assets/img/2.5e908ad4.jpg"},632:function(t,s,n){t.exports=n.p+"assets/img/3.77fc440f.jpeg"},633:function(t,s,n){t.exports=n.p+"assets/img/4.371c25ec.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/68.25f9db17.js b/learning/.vuepress/dist/assets/js/68.25f9db17.js deleted file mode 100644 index 29d85a11..00000000 --- a/learning/.vuepress/dist/assets/js/68.25f9db17.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{1076:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("在上一节中,我们分别学习了DFS与BFS。在本节中,我们将继续学习一种特殊的二叉树结构 —— "),n("strong",[s._v("二叉搜索树(BST)")]),s._v("。")])]),s._v(" "),n("h2",{attrs:{id:"_01、二叉搜索树"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、二叉搜索树"}},[s._v("#")]),s._v(" 01、二叉搜索树")]),s._v(" "),n("p",[s._v("先看定义:二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是"),n("strong",[s._v("一棵空树")]),s._v(",或者是具有下列性质的二叉树:若"),n("strong",[s._v("它的左子树不空,则左子树上所有结点的值均小于它的根结点的值")]),s._v(";若"),n("strong",[s._v("它的右子树不空,则右子树上所有结点的值均大于它的根结点的值")]),s._v(";它的左、右子树也分别为"),n("strong",[s._v("二叉搜索树")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("这里强调一下子树的概念:设T是有根树,a是T中的一个顶点,由**a以及a的所有后裔(后代)**导出的子图称为有向树T的子树。具体来说,"),n("strong",[s._v("子树就是树的其中一个节点以及其下面的所有的节点")]),s._v("所构成的树。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("比如下面这就是一颗二叉搜索树:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(620),alt:"img"}}),s._v(" "),n("p",[s._v("下面这两个都不是:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(621),alt:"img"}}),s._v(" "),n("p",[s._v("<1>图中4节点位置的数值应该大于根节点")]),s._v(" "),n("p",[s._v("<2>图中3节点位置的数值应该大于根节点")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("那我们如何来验证一颗二叉搜索树?我们看题。")]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第98题:验证二叉搜索树")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个二叉树,判断其是否是一个有效的二叉搜索树。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:\n 5\n / \\\n 1 4\n / \\\n 3 6\n输出: false\n解释: 输入为: [5,1,4,null,null,3,6]。\n 根节点的值为 5 ,但是其右子节点值为 4 。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入:\n 5\n / \\\n 1 4\n / \\\n 3 6\n输出: false\n解释: 输入为: [5,1,4,null,null,3,6]。\n 根节点的值为 5 ,但是其右子节点值为 4 。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[s._v("首先看完题目,我们很容易想到 遍历整棵树,比较所有节点,通过 左节点值<节点值,右节点值>节点值 的方式来进行求解。但是这种解法是错误的,因为"),n("strong",[s._v("对于任意一个节点")]),s._v(",我们不光需要左节点值小于该节点,并且"),n("strong",[s._v("左子树上的所有节点值都需要小于该节点")]),s._v("。(右节点一致)所以我们在此引入上界与下界,用以保存之前的节点中出现的"),n("strong",[s._v("最大值与最小值")]),s._v("。")]),s._v(" "),n("h2",{attrs:{id:"_03、递归求解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、递归求解"}},[s._v("#")]),s._v(" 03、递归求解")]),s._v(" "),n("p",[s._v("明确了题目,我们直接使用递归进行求解。这里需要强调的是,在每次递归中,我们除了"),n("strong",[s._v("进行左右节点的校验,还需要与上下界进行判断")]),s._v("。由于该递归分析有一定难度,所以我们先展示代码:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isValidBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("MinInt64"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("MaxInt64"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" max "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" min "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Val "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" max "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("min"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("max"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])]),n("p",[s._v("运行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(622),alt:"img"}}),s._v(" "),n("p",[s._v("如果觉得上文中的递归不太容易理解,可以通过下图理解:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(623),alt:"img"}})])}),[],!1,null,null,null);t.default=r.exports},620:function(s,t,a){s.exports=a.p+"assets/img/1.03e01a60.jpg"},621:function(s,t,a){s.exports=a.p+"assets/img/2.55e8dff6.jpg"},622:function(s,t){s.exports="data:image/png;base64,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"},623:function(s,t,a){s.exports=a.p+"assets/img/4.89740a2c.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/69.56ccb500.js b/learning/.vuepress/dist/assets/js/69.56ccb500.js deleted file mode 100644 index 05a1aeb3..00000000 --- a/learning/.vuepress/dist/assets/js/69.56ccb500.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{1094:function(t,s,a){"use strict";a.r(s);var _=a(3),r=Object(_.a)({},(function(){var t=this,s=t.$createElement,_=t._self._c||s;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("blockquote",[_("p",[t._v("今天继续为大家分享一道有趣的概率类问题(是有小伙伴咨询我的,在面试时会被问到哈~)")])]),t._v(" "),_("h2",{attrs:{id:"_01、硬币问题"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_01、硬币问题"}},[t._v("#")]),t._v(" 01、硬币问题")]),t._v(" "),_("blockquote",[_("p",[t._v("小知识:硬币类型的问题经常会被用来考察DP或者贪心。")])]),t._v(" "),_("br"),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("题目:A和B两人为了竞价一个拍卖品,决定用抛掷硬币的办法来判断谁有资格。为了让游戏过程更加刺激,A提出了这样一个方案:连续抛掷硬币,直到最近三次硬币抛掷结果是“正反反”或者“反反正”。如果是前者,那么A获胜;如果是后者,那么B获胜")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("问题是:B应该接受A的提议吗?换句话说,这个游戏是公平的吗?")])])])]),t._v(" "),_("h2",{attrs:{id:"_02、题目分析"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),_("blockquote",[_("p",[t._v("遇到这种看上去“貌似”一眼就可以得出答案的题目,一定要认真思考。直觉 != 正确")])]),t._v(" "),_("br"),t._v(" "),_("p",[t._v("连续投掷三次,能产生八种结果,“正反反”和“反反正”两种可能性各占 1/8,序列也完全对称,获胜概率怎么说都应该是一样的。")]),t._v(" "),_("img",{staticStyle:{zoom:"67%"},attrs:{src:a(693),alt:"PNG"}}),t._v(" "),_("p",[t._v("所以对B而言,不应该有任何理由来怀疑该玩法的公平性。但是,答案真的是这样吗?事实,该游戏并不公平。虽然“正反反”和“反反正”在频率上出现的一样,但是其之间却有一个竞争关系:"),_("strong",[t._v("一旦抛硬币产生其中一种序列,游戏即结束")]),t._v("。所以不论何时,只要抛出一个正面,也就意味着B必输无疑。换句话说,在整个游戏的前两次抛掷中,只要出现“正正”,“正反”,“反正”其中任一,A则一定会取得胜利。A和B的概率比达到3:1,优势不言而喻。")]),t._v(" "),_("img",{staticStyle:{zoom:"67%"},attrs:{src:a(694),alt:"PNG"}}),t._v(" "),_("img",{staticStyle:{zoom:"67%"},attrs:{src:a(695),alt:"PNG"}}),t._v(" "),_("h2",{attrs:{id:"_03、加强版"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_03、加强版"}},[t._v("#")]),t._v(" 03、加强版")]),t._v(" "),_("blockquote",[_("p",[t._v("扑克牌有四种花色,分别为:黑桃、红桃、梅花、方块。四个花色分别代表了春夏秋冬,其中红心、方片代表白昼,黑桃、梅花代表黑夜。扑克牌其实是历法的缩影,54张牌中大王代表太阳,小王代表月亮,剩下的52张牌代表一年有五十二个星期。每一个季节为13个星期,所以扑克牌中每种花色为13张;而每一个季节为91天,13张牌点数相加相加刚好是91点,再加上小王的1点,一共为365点代表了365天;加上大王的1点则表示闰年的366天。")])]),t._v(" "),_("br"),t._v(" "),_("p",[t._v("一副扑克牌不算大小王刚好是52张,随意洗牌。如果出现连续三张牌,花色依次是红黑黑,那么玩家A加一分;同时把翻开了的牌都丢掉,继续一张张翻没翻开的牌;类似地,一 旦出现连续三张牌恰好是黑黑红,则玩家B得一分,弃掉已翻开的牌后继续。结果会如何呢?(大家不妨写一个程序来进行验证)")]),t._v(" "),_("img",{staticStyle:{zoom:"67%"},attrs:{src:a(696),alt:"PNG"}}),t._v(" "),_("p",[t._v("上面的问题请认真思考(毕竟硬币题目只是简化版本,下面这种才是面试时更容易被问到的),评论区留下你们的想法,写的好的顶你到天花板。")]),t._v(" "),_("br"),t._v(" "),_("p",[t._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);s.default=r.exports},693:function(t,s,a){t.exports=a.p+"assets/img/1.57963985.jpg"},694:function(t,s,a){t.exports=a.p+"assets/img/2.a51900c0.jpg"},695:function(t,s,a){t.exports=a.p+"assets/img/3.790bbcab.jpg"},696:function(t,s,a){t.exports=a.p+"assets/img/4.4b928156.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/7.1850882c.js b/learning/.vuepress/dist/assets/js/7.1850882c.js deleted file mode 100644 index 83230c44..00000000 --- a/learning/.vuepress/dist/assets/js/7.1850882c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{1038:function(t,e,a){"use strict";a.r(e);a(50);var r=a(380),n=a(376),s=a(363),o=a(372),i=a(46),c=a(362),u=a(361),f={mixins:[o.a,u.a],components:{Common:r.a,NoteAbstract:n.a,ModuleTransition:s.a},data:function(){return{currentPage:1}},computed:{posts:function(){var t=this.$currentCategories.pages;return t=Object(i.a)(t),Object(i.c)(t),t},title:function(){return this.$currentCategories.key}},mounted:function(){this._setPage(this._getStoragePage())},methods:{getCurrentTag:function(t){this.$emit("currentTag",t)},getCurrentPage:function(t){this._setPage(t),setTimeout((function(){window.scrollTo(0,0)}),100)},_setPage:function(t){this.currentPage=t,this.$page.currentPage=t,this._setStoragePage(t)},getOneColor:c.a},watch:{$route:function(){this._setPage(this._getStoragePage())}}},l=(a(365),a(399),a(446),a(3)),g=Object(l.a)(f,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"categories-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("ul",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"category-wrapper"},t._l(this.$categories.list,(function(e,r){return a("li",{key:r,staticClass:"category-item",class:t.title==e.name?"active":""},[a("router-link",{attrs:{to:e.path}},[a("span",{staticClass:"category-name"},[t._v(t._s(e.name))]),t._v(" "),a("span",{staticClass:"post-num",style:{backgroundColor:t.getOneColor()}},[t._v(t._s(e.pages.length))])])],1)})),0)]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.posts,currentPage:t.currentPage},on:{currentTag:t.getCurrentTag}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[a("pagation",{staticClass:"pagation",attrs:{total:t.posts.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],1)],1)}),[],!1,null,"e7537b8a",null);e.default=g.exports},356:function(t,e,a){},357:function(t,e,a){},358:function(t,e,a){},359:function(t,e,a){},362:function(t,e,a){"use strict";function r(){var t=["#e15b64","#f47e60","#f8b26a","#abbd81","#849b87","#e15b64","#f47e60","#f8b26a","#f26d6d","#67cc86","#fb9b5f","#3498db"];return t[Math.floor(Math.random()*t.length)]}a.d(e,"a",(function(){return r}))},364:function(t,e,a){"use strict";a(366),a(25),a(368),a(26),a(30);var r=a(49),n={props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},data:function(){return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"}}},filters:{formatDateValue:function(t){if(!t)return"";t=t.replace("T"," ").slice(0,t.lastIndexOf("."));var e=Number(t.substr(11,2)),a=Number(t.substr(14,2)),n=Number(t.substr(17,2));return e>0||a>0||n>0?Object(r.d)(t):Object(r.d)(t,"yyyy-MM-dd")}},methods:{goTags:function(t){this.$router.push({path:"/tags/".concat(t,"/")})}}},s=(a(369),a(3)),o=Object(s.a)(n,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title?a("i",{staticClass:"iconfont reco-account"},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author||t.$site.title))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("i",{staticClass:"iconfont reco-date"},[a("span",[t._v(t._s(t._f("formatDateValue")(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("i",{staticClass:"iconfont reco-eye"},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("i",{staticClass:"iconfont reco-tag tags"},t._l(t.pageInfo.frontmatter.tags,(function(e,r){return a("span",{key:r,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return t.goTags(e)}}},[t._v("\n "+t._s(e)+"\n ")])})),0):t._e()])}),[],!1,null,"484a899e",null);e.a=o.exports},365:function(t,e,a){"use strict";var r=a(356);a.n(r).a},366:function(t,e,a){var r=a(0),n=a(367);r({target:"Array",proto:!0,forced:n!==[].lastIndexOf},{lastIndexOf:n})},367:function(t,e,a){"use strict";var r=a(16),n=a(31),s=a(11),o=a(27),i=a(20),c=Math.min,u=[].lastIndexOf,f=!!u&&1/[1].lastIndexOf(1,-0)<0,l=o("lastIndexOf"),g=i("indexOf",{ACCESSORS:!0,1:0}),p=f||!l||!g;t.exports=p?function(t){if(f)return u.apply(this,arguments)||0;var e=r(this),a=s(e.length),o=a-1;for(arguments.length>1&&(o=c(o,n(arguments[1]))),o<0&&(o=a+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:u},368:function(t,e,a){"use strict";var r=a(7),n=a(4),s=a(107),o=a(21),i=a(5),c=a(34),u=a(177),f=a(35),l=a(1),g=a(52),p=a(51).f,m=a(33).f,h=a(8).f,d=a(378).trim,_=n.Number,v=_.prototype,b="Number"==c(g(v)),I=function(t){var e,a,r,n,s,o,i,c,u=f(t,!1);if("string"==typeof u&&u.length>2)if(43===(e=(u=d(u)).charCodeAt(0))||45===e){if(88===(a=u.charCodeAt(2))||120===a)return NaN}else if(48===e){switch(u.charCodeAt(1)){case 66:case 98:r=2,n=49;break;case 79:case 111:r=8,n=55;break;default:return+u}for(o=(s=u.slice(2)).length,i=0;in)return NaN;return parseInt(s,r)}return+u};if(s("Number",!_(" 0o1")||!_("0b1")||_("+0x1"))){for(var C,N=function(t){var e=arguments.length<1?0:t,a=this;return a instanceof N&&(b?l((function(){v.valueOf.call(a)})):"Number"!=c(a))?u(new _(I(e)),a,N):I(e)},P=r?p(_):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;P.length>w;w++)i(_,C=P[w])&&!i(N,C)&&h(N,C,m(_,C));N.prototype=v,v.constructor=N,o(n,"Number",N)}},369:function(t,e,a){"use strict";var r=a(357);a.n(r).a},370:function(t,e,a){"use strict";var r=a(358);a.n(r).a},371:function(t,e,a){"use strict";var r=a(359);a.n(r).a},372:function(t,e,a){"use strict";a(377);e.a={methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",{page:1,path:""}),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}},373:function(t,e,a){},376:function(t,e,a){"use strict";a(25);var r={components:{PageInfo:a(364).a},props:["item","currentPage","currentTag"]},n=(a(370),a(3)),s={components:{NoteAbstractItem:Object(n.a)(r,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item"},[t.item.frontmatter.sticky?a("i",{staticClass:"iconfont reco-sticky"}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("i",{staticClass:"iconfont reco-lock"}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("hr",{staticClass:"hr"}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"28f76ce9",null).exports},props:["data","currentPage","currentTag"],computed:{currentPageData:function(){var t=10*this.currentPage-10,e=10*this.currentPage;return this.data.slice(t,e)}}},o=(a(371),Object(n.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),1)}),[],!1,null,"b014bc36",null));e.a=o.exports},399:function(t,e,a){"use strict";var r=a(373);a.n(r).a},400:function(t,e,a){},446:function(t,e,a){"use strict";var r=a(400);a.n(r).a}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/70.51572475.js b/learning/.vuepress/dist/assets/js/70.51572475.js deleted file mode 100644 index 4ba3b0f0..00000000 --- a/learning/.vuepress/dist/assets/js/70.51572475.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{1105:function(s,t,a){"use strict";a.r(t);var n=a(3),A=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("不知道为什么叫做爱吃香蕉的阿珂,难道不应该是爱吃香蕉的猴子么...或者爱吃队友的露娜么?")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第875题:阿珂喜欢吃香蕉")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("这里总共有 N 堆香蕉,第 i 堆中有piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 阿珂可以决定她吃香蕉的速度 K (单位:根/小时),每个小时,她将会选择一堆香蕉,从中吃掉 K 根。")])])])]),s._v(" "),n("p",[s._v("如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: piles = [3,6,7,11], H = 8\n输出: 4\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: piles = [30,11,23,4,20], H = 5\n输出: 30\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 3:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: piles = [30,11,23,4,20], H = 6\n输出: 23\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("提示:")])]),s._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[s._v("1 <= piles.length <= 10^4\npiles.length <= H <= 10^9\n1 <= piles[i] <= 10^9\n")])])]),n("br"),s._v(" "),n("p",[n("strong",[s._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),s._v(" "),n("br"),s._v(" "),n("h2",{attrs:{id:"_02、二分查找"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、二分查找"}},[s._v("#")]),s._v(" 02、二分查找")]),s._v(" "),n("blockquote",[n("p",[s._v('十个二分九个错,该算法被形容 "思路很简单,细节是魔鬼"。第一个二分查找算法于 1946 年出现,然而第一个完全正确的二分查找算法实现直到 1962 年才出现。下面的二分查找,其实是二分查找里最简单的一个模板,在后面的文章系列里,我将逐步为大家讲解二分查找的其他变形形式。')])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("二分查找是计算机科学中最基本、最有用的算法之一。它描述了"),n("strong",[s._v("在有序集合中搜索特定值的过程")]),s._v("。一般二分查找由以下几个术语构成:")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("目标 Target —— 你要查找的值")])]),s._v(" "),n("li",[n("p",[s._v("索引 Index —— 你要查找的当前位置")])]),s._v(" "),n("li",[n("p",[s._v("左、右指示符 Left,Right —— 我们用来维持查找空间的指标")])]),s._v(" "),n("li",[n("p",[s._v("中间指示符 Mid —— 我们用来应用条件来确定我们应该向左查找还是向右查找的索引")]),s._v(" "),n("br")])]),s._v(" "),n("p",[s._v("在最简单的形式中,二分查找对具有指定左索引和右索引的"),n("strong",[s._v("连续序列")]),s._v("进行操作。我们也称之为"),n("strong",[s._v("查找空间")]),s._v("。二分查找维护查找空间的左、右和中间指示符,并比较查找目标;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(747),alt:"PNG"}}),s._v(" "),n("p",[s._v("举例说明:比如你需要找1-100中的一个数字,你的目标是"),n("strong",[s._v("用最少的次数")]),s._v("猜到这个数字。你每次猜测后,我会说大了或者小了。而你只需要每次猜测中间的数字,就可以将余下的数字排除一半。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(748),alt:"PNG"}}),s._v(" "),n("p",[s._v("不管我心里想的数字如何,你在7次之内都能猜到,这就是一个典型的二分查找。每次筛选掉一半数据,所以我们也称之为 "),n("strong",[s._v("折半查找")]),s._v("。一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(749),alt:"PNG"}}),s._v(" "),n("p",[s._v("当然,一般题目不太可能给你一个如此现成的题型,让你上手就可以使用二分,所以我们需要思考,如何来构造一个成功的二分查找。大部分的二分查找,基本都由以下三步组成:")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("预处理过程(大部分场景就是对未排序的集合进行排序)")])]),s._v(" "),n("li",[n("p",[s._v("二分查找过程(找到合适的循环条件,每一次将查找空间一分为二)")])]),s._v(" "),n("li",[n("p",[s._v("后处理过程(在剩余的空间中,找到合适的目标值)")]),s._v(" "),n("br")])]),s._v(" "),n("p",[s._v("了解了二分查找的过程,我们对二分查找进行"),n("strong",[s._v("一般实现")]),s._v("(这里给出一个Java版本,比较正派的代码,没有用一些缩写形式)")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("binarySearch")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" array"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" des"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" low "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" high "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" array"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("low "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" low "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("high "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" low"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("des "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" array"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("des "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" array"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n high "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n low "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("注意:上面的代码,mid 使用 low + (high - low)/2 的目的,是防止 high low 溢出内存。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("为什么说是一般实现?")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("1、"),n("strong",[s._v("根据边界的不同(开闭区间调整),有时需要弹性调整low与high的值,以及循环的终止条件")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("2、根据元素是否有重复值,以及是否需要找到重复值区间,有时需要对原算法进行改进。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("那上面我们说了,一般二分查找的过程分为:预处理 - 二分查找 - 后处理,上面的代码,就没有后处理的过程,因为在每一步中,你都检查了元素,如果到达末尾,也已经知道没有找到元素。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("总结一下一般实现的几个条件:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[n("strong",[s._v("初始条件:left = 0, right = length-1")])]),s._v(" "),n("li",[n("strong",[s._v("终止:left > right")])]),s._v(" "),n("li",[n("strong",[s._v("向左查找:right = mid-1")])]),s._v(" "),n("li",[n("strong",[s._v("向右查找:left = mid +1")])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("请大家记住这个模板原形,在后面的系列中,我们将介绍二分查找其他的模板类型。")]),s._v(" "),n("h2",{attrs:{id:"_03、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目分析"}},[s._v("#")]),s._v(" 03、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("简单复习了二分查找,我们来看本题。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("注意,绝大部分**「在递增递减区间中搜索目标值」** 的问题,都可以转化为二分查找问题。并且,二分查找的题目,基本逃不出三种:找特定值,找大于特定值的元素(上界),找小于特定值的元素(下界)。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("而根据这三种,代码又最终会转化为以下这些问题:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[n("p",[s._v("low、high 要初始化为 0、n-1 还是 0、n 又或者 1,n?")])]),s._v(" "),n("li",[n("p",[s._v("循环的判定条件是 low < high 还是 low <= high?")])]),s._v(" "),n("li",[n("p",[s._v("if 的判定条件应该怎么写?")])]),s._v(" "),n("li",[n("p",[s._v("if 条件正确时,应该移动哪边的边界?")])]),s._v(" "),n("li",[n("p",[s._v("更新 low 和 high 时,mid 如何处理?")]),s._v(" "),n("br")])]),s._v(" "),n("p",[s._v("处理好了上面的问题,自然就可以顺利解决问题。将上面的思想代入到本题,我们要找 “"),n("strong",[s._v("阿珂在 H 小时吃掉所有香蕉的最小速度 K")]),s._v("”。那最笨的就是阿珂吃的特别慢,每小时只吃掉 1 根香蕉,然后我们逐渐递增阿珂吃香蕉的速度到 i,刚好满足在 H 小时可以吃掉所有香蕉,此时 i 就是我们要找的最小速度。当然,我们没有这么笨,所以可以想到使用二分的思想来进行优化。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("然后就简单了,我们寻找二分查找模板中初始条件和终止条件(注意,这里的 high、low、mid 都代表的是速度):")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//这里我把最小速度定义成了1,可能大家会觉得奇怪,模板里不是0吗?")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//所以这里我其实是想说,算法千变万化,大家不要生搬硬套。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//从字面理解,如果定义成0,意味着阿珂会选择一个香蕉都不吃,难道阿珂傻? ")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" low "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//最大的速度,当然等于吃掉最大一堆的香蕉,毕竟一小时只能吃一堆,再大也没有意义")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" high "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxArr")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("piles"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//中间速度")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("low "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" high"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("br"),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("minEatingSpeed")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" piles"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("H")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" maxVal "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" pile "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" piles"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n maxVal "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("maxVal"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" pile"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" maxVal"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("canEat")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("piles"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("H")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("canEat")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" piles"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" speed"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("H")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" pile "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" piles"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//向上取整")]),s._v("\n sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ceil")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pile "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1.0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" speed"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("H")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(750),alt:"PNG"}}),s._v(" "),n("br"),s._v(" "),n("p",[s._v("额外补充(昨天有人问我的问题):")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("第一:"),n("strong",[s._v("就是不需要再对原数组进行排序了")]),s._v(",因为我们是把这样一个问题转化为二分查找的问题,而通过 canEat,计算在 mid 速度下吃完 piles 共需要多少小时。已经将 piles 利用进去了,所以此时并不需要对 piles 排序。")]),s._v(" "),n("li",[s._v("第二:就是昨天有人私下问我,对 (pile speed - 1)/speed 不能理解。这个其实就是向上取整的一个小技巧,相当于 Math.ceil(pile * 1.0 / speed)。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("留下一个问题,假如我们的阿珂就是笨笨的,将 low 初始化成了 0,此时的循环条件应该如何写?if 条件如果成立,low 和 high 又该如何进行调整?大家可以尝试一下!(一百个人有一百个二分,不要妄图和别人写出一模一样的代码,这是没有意义的。只有自己理解了,一步步的分析问题,写出自己的代码,才是真正属于你的)")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=A.exports},747:function(s,t,a){s.exports=a.p+"assets/img/1.fae9c798.gif"},748:function(s,t,a){s.exports=a.p+"assets/img/2.b3d11d61.jpg"},749:function(s,t){s.exports="data:image/jpeg;base64,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"},750:function(s,t){s.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/71.70e158f7.js b/learning/.vuepress/dist/assets/js/71.70e158f7.js deleted file mode 100644 index 1c00977d..00000000 --- a/learning/.vuepress/dist/assets/js/71.70e158f7.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{1116:function(A,v,t){"use strict";t.r(v);var r=t(3),a=Object(r.a)({},(function(){var A=this,v=A.$createElement,r=A._self._c||v;return r("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[r("blockquote",[r("p",[A._v("今天为大家分享一道非常经典的面试题,和马有关。无论是校招,还是社招,在各大公司都出现过,我也曾经问过别人。")]),A._v(" "),r("p",[A._v("话不多说,直接看题吧。")])]),A._v(" "),r("h2",{attrs:{id:"_01、题目示例"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[A._v("#")]),A._v(" 01、题目示例")]),A._v(" "),r("table",[r("thead",[r("tr",[r("th",[A._v("25匹马的问题")])])]),A._v(" "),r("tbody",[r("tr",[r("td",[A._v("有一个赛场上共有25匹马,赛场有5个跑道,不使用计时器进行比赛(也就是每次比赛只能得到本次的比赛的顺序)")])])])]),A._v(" "),r("p",[A._v("试问最少比多少场才能选出最快的三匹马?并给出分析过程!")]),A._v(" "),r("h2",{attrs:{id:"_02、题目分析"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[A._v("#")]),A._v(" 02、题目分析")]),A._v(" "),r("p",[A._v("实在不想和那些答主一样,磨磨唧唧的分析完毕之后,再给你们扔出来正确答案。答案是7次,**懂得走人,今日合格,咱不浪费时间。**懵对的和猜错的往下看,"),r("strong",[A._v("只会3匹马的也请往下看")]),A._v("。")]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("分析过程:")]),A._v(" "),r("ul",[r("li",[r("p",[A._v("5次:首先我们把25匹马分成5组(A、B、C、D、E),跑上五次,得到每组的第一名。")]),A._v(" "),r("img",{staticStyle:{zoom:"67%"},attrs:{src:t(791),alt:"PNG"}})]),A._v(" "),r("li",[r("p",[A._v("1次:然后我们让这5个第一名跑上一次,得到其中的前三名。"),r("strong",[A._v("注意:这里就可以得到所有马中跑的最快的第一名A1了。并且,D1和E1所在的组可以直接淘汰。第二名和第三名一定不会在其中产生!")])]),A._v(" "),r("img",{staticStyle:{zoom:"67%"},attrs:{src:t(792),alt:"PNG"}})]),A._v(" "),r("li",[r("p",[A._v("1次:因为我们已经跑出了第一名,所以A1不需要再参加比赛,同时,D1和E1所在的组已经淘汰。C1作为第三组的第一名,C组不会有跑的比C1快的。而B2有可能是比C1跑的快的第三名。同理,A2和A3也有可能是比B1和B2跑的快的。所以第7次比赛,我们让"),r("strong",[A._v("A2,A3,B1,B2,C1")]),A._v("来一起完成。(求大家不要怪我啰嗦,,,我是实在担心有那么几个同学听不懂...)")]),A._v(" "),r("img",{staticStyle:{zoom:"67%"},attrs:{src:t(793),alt:"PNG"}})])]),A._v(" "),r("p",[A._v("最终,我们"),r("strong",[A._v("通过7次比赛")]),A._v(",得到25匹马中的前三名。")]),A._v(" "),r("h2",{attrs:{id:"_03、升级版本"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_03、升级版本"}},[A._v("#")]),A._v(" 03、升级版本")]),A._v(" "),r("p",[A._v("还是25匹马,如果我们要找到其中跑的最快的"),r("strong",[A._v("前五名")]),A._v(",最少需要比赛几次呢?(这里我想说一下,我看到"),r("strong",[A._v("网上有不少地方把这个题讲错了")]),A._v(",所以不会的同学建议还是认真看一看)")]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("在上面的的分析中,我们已经明确了第一名。**但是第二名和第三名,是可以在A2-A3-B1-B2-C1中产生的,**我们需要分别进行讨论。")]),A._v(" "),r("img",{staticStyle:{zoom:"80%"},attrs:{src:t(794),alt:"PNG"}}),A._v(" "),r("ul",[r("li",[r("p",[A._v("假若二三名分别为:A2,A3")]),A._v(" "),r("p",[A._v("对于这种情况,"),r("strong",[A._v("第四名可能是A4")]),A._v(",此时第五名是A5或者B1。"),r("strong",[A._v("第四名也可能是B1")]),A._v(",此时第五名是B2或者C1。所以我们只需要让[A4,B1,A5,B2,C1]参加一次比赛,就可以得到前五名。")])]),A._v(" "),r("li",[r("p",[A._v("假若二三名分别为:A2,B1")]),A._v(" "),r("p",[A._v("对于这种情况,第四名可能是A3、B2、C1。"),r("strong",[A._v("假设第4名为A3")]),A._v(",第5名可能为A4、B2、C1。"),r("strong",[A._v("假设第4名为B2")]),A._v(",第5名可能为A3、B3、C1。"),r("strong",[A._v("假设第4名为C1")]),A._v(",第5名可能为A3、B2、C2、D1。此时我们需要至少两次比赛,才能在[A3,A4,B2,B3,C1,C2,D1]中找到第四名和第五名,所以就需要9次。")])])]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("其他的可能性还有:")]),A._v(" "),r("ul",[r("li",[A._v("假若二三名分别为:B1,A2")]),A._v(" "),r("li",[A._v("假若二三名分别为:B1,B2")]),A._v(" "),r("li",[A._v("假若二三名分别为:B1,C1")])]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("上面这三种情况分析的方法一致,就不一一说明了,大概的思路就是,我们需要"),r("strong",[A._v("根据第三名,分析出可能的第四名")]),A._v("。"),r("strong",[A._v("再根据第四名,分析出对应情况下的第五名")]),A._v("。最终再在这些马匹里,抉择出真正的第四名和第五名。")]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("因为题中问的是"),r("strong",[A._v("最少比多少场可以跑出前五名")]),A._v("。所以根据分析,假如"),r("strong",[A._v("第二名和第三名是A2和A3的话,只需要8次就可以跑出前五名")]),A._v("。最少次数是8。(这个题目其实是不严谨的,所以如果有面试官问到这个题,最好是给出所有可能性的推导过程)")]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("我看到很多答主有讲这道题,上来就给一个8,但是都没有说清楚原因。之前我去成电校招的时候,也问过一个学生这个问题,对方上来就给我一个8,问其过程,一脸懵逼。我希望看过这篇文章的朋友,下次遇到这个问题,能直接给出所有的分析结果,"),r("strong",[A._v("挂掉面试官")]),A._v("。"),r("strong",[A._v("毕竟我们这些懂得人,就是这样朴实无华且枯燥。")])]),A._v(" "),r("br"),A._v(" "),r("p",[A._v("所以,今天的问题你听明白了吗?评论区留下你的想法吧!")])])}),[],!1,null,null,null);v.default=a.exports},791:function(A,v,t){A.exports=t.p+"assets/img/1.c0e67383.png"},792:function(A,v){A.exports="data:image/png;base64,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"},793:function(A,v,t){A.exports=t.p+"assets/img/3.57538b3d.png"},794:function(A,v,t){A.exports=t.p+"assets/img/4.ee799e61.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/72.af7e1095.js b/learning/.vuepress/dist/assets/js/72.af7e1095.js deleted file mode 100644 index a5055883..00000000 --- a/learning/.vuepress/dist/assets/js/72.af7e1095.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{1133:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("这两天熟悉的朋友该知道我情绪不太好。但总不能借着由头,便拖期延稿诉衷肠。毕竟消除恐惧的最好方法就是面对恐惧。微笑着面对它,坚持才是胜利,加油!奥利给!")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("王者荣耀新赛季出了个“镜”,那我也出个“镜”呗。那个不会玩,这个总该会“玩”吧?")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第858题:镜面反射")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0,1,以及 2。正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: p = 2, q = 1\n输出: 2\n解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[s._v("上面的题目绕得很,大概就是这么个意思:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(894),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("这是一道数学题...不喜勿喷")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("我们知道光是由西南角发出的,也就是左下角。发出之后可能会出现多种情况(注意,下图略过了部分光线反射的情况)。看起来是十分复杂,无迹可寻。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(895),alt:"PNG"}}),s._v(" "),n("p",[s._v("但是如果我们把光线的运动轨迹拆开来看,就可以观测到,"),n("strong",[s._v("光线每经过一次折反,都会在纵向距离上移动 q")]),s._v("(首次与东墙相距的距离)。同时,**一旦其向上行走的距离为 p 的整数倍,就一定会碰到某个接收点("),n("strong",[s._v("注意:这里我们不需要考虑北面墙是否存在,根据光的反射定律可得")]),s._v(")**可以参考一下下面这张图:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(896),alt:"PNG"}}),s._v(" "),n("p",[s._v("问题变得简单了,"),n("strong",[s._v("光线最终向上走的距离,其实就是 p 和 q 的最小公倍数")]),s._v("。我们设最小公倍数为 L,会发现如果 L 是 p 的"),n("strong",[s._v("奇数倍")]),s._v(",光线则到达"),n("strong",[s._v("北墙")]),s._v("(可以参考上面的图)当 L 是 p 的 "),n("strong",[s._v("偶数倍")]),s._v(",光线将会射到"),n("strong",[s._v("南墙")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("问题来了,如果光线是射向南墙,因为只有一个接收器了,必定只能遇到接收器 0。但是如果射到了北墙,如何区分是 1 和 2。这回到了一个初中数学题,我们可以通过"),n("strong",[s._v("光线与东西墙的接触次数,来判断最终的落点是 1 还是 2。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("根据分析,得出代码(这道题应该不需要给多语言版本吧,都长一样....):")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mirrorReflection")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n r "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n m "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("p "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("q "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(897),alt:"PNG"}}),s._v(" "),n("p",[s._v("这道题学会了吗?如果不会就不要玩镜了吧(皮一个)。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);t.default=r.exports},894:function(s,t,a){s.exports=a.p+"assets/img/1.c1a9953b.jpg"},895:function(s,t,a){s.exports=a.p+"assets/img/2.3fcd5ea8.jpg"},896:function(s,t,a){s.exports=a.p+"assets/img/3.b63f9142.jpg"},897:function(s,t,a){s.exports=a.p+"assets/img/4.0c5afe33.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/73.d8920180.js b/learning/.vuepress/dist/assets/js/73.d8920180.js deleted file mode 100644 index b610689c..00000000 --- a/learning/.vuepress/dist/assets/js/73.d8920180.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{1057:function(s,t,a){"use strict";a.r(t);var e=a(3),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h2",{attrs:{id:"_01、哨兵节点"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_01、哨兵节点"}},[s._v("#")]),s._v(" 01、哨兵节点")]),s._v(" "),e("p",[s._v("在链表的题目中,十道有九道会用到"),e("strong",[s._v("哨兵节点")]),s._v(",所以我们先讲一下什么是哨兵节点。")]),s._v(" "),e("p",[s._v("哨兵节点,其实就是一个"),e("strong",[s._v("附加在原链表最前面用来简化边界条件的附加节点,它的值域不存储任何东西,只是为了操作方便而引入。")])]),s._v(" "),e("p",[s._v("比如原链表为a->b->c,则加了哨兵节点的链表即为x->a->b>c,如下图:")]),s._v(" "),e("img",{staticStyle:{zoom:"80%"},attrs:{src:a(495),alt:"PNG"}}),s._v(" "),e("p",[s._v("那我们为什么需要引入哨兵节点呢?举个例子,比如我们要删除某链表的第一个元素,"),e("strong",[s._v("常见的删除链表的操作是找到要删元素的前一个元素")]),s._v(",假如我们记为 pre。我们通过:")]),s._v(" "),e("blockquote",[e("center",[e("b",[s._v(" pre.Next = pre.Next.Next ")])])],1),s._v(" "),e("p",[s._v("来进行删除链表的操作。但是此时若是删除第一个元素的话,你就很难进行了,因为按道理来讲,此时第一个元素的前一个元素就是nil(空的),如果使用pre就会报错。那如果此时你设置了哨兵节点的话,此时的pre就是哨兵节点了。这样对于链表中的任何一个元素,你要删除都可以通过pre.Next=pre.Next.Next的方式来进行,这就是哨兵节点的作用。")]),s._v(" "),e("p",[s._v("下面我们看一道题目,看一下哨兵节点的应用")]),s._v(" "),e("h2",{attrs:{id:"_02、题目讲解"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目讲解"}},[s._v("#")]),s._v(" 02、题目讲解")]),s._v(" "),e("table",[e("thead",[e("tr",[e("th",[s._v("第19题:删除链表倒数第N个节点")])])]),s._v(" "),e("tbody",[e("tr",[e("td",[s._v("给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。")])])])]),s._v(" "),e("p",[e("strong",[s._v("示例:")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("给定一个链表: 1->2->3->4->5, 和 n = 2.\n当删除了倒数第二个节点后,链表变为 1->2->3->5.\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("说明:")]),s._v(" "),e("ul",[e("li",[s._v("给定的 n 保证是有效的。")])]),s._v(" "),e("p",[s._v("进阶:")]),s._v(" "),e("ul",[e("li",[s._v("你能尝试使用一趟扫描实现吗?")])]),s._v(" "),e("br"),s._v(" "),e("p",[s._v("思路分析:")]),s._v(" "),e("blockquote",[e("p",[s._v("首先我们思考,让我们删除倒数第N个元素,那我们"),e("strong",[s._v("只要找到倒数第N个元素就可以了")]),s._v(",那怎么找呢?我们**只需要设置两个指针变量,中间间隔N-1元素。当后面的指针遍历完所有元素指向nil时,前面的指针就指向了我们要删除的元素。**如下图所示:")])]),s._v(" "),e("img",{staticStyle:{zoom:"80%"},attrs:{src:a(496),alt:"PNG"}}),s._v(" "),e("p",[s._v("接下来,我们只要同时定位到要删除的元素的前1个元素,通过前面讲过的删除操作,就可以很顺利的完成这道题目啦。")]),s._v(" "),e("h2",{attrs:{id:"_03、解题过程"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_03、解题过程"}},[s._v("#")]),s._v(" 03、解题过程")]),s._v(" "),e("p",[s._v("现在我们来完整捋一遍解题过程:")]),s._v(" "),e("ol",[e("li",[s._v("首先我们定义好哨兵节点result,指向哨兵节点的目标元素指针cur,以及目标指针cur的前一个指针pre,此时pre指向nil。")]),s._v(" "),e("li",[s._v("接下来我们开始遍历整个链表。")]),s._v(" "),e("li",[s._v("当head移动到距离目标元素cur的距离为N-1时,同时开始移动cur。")]),s._v(" "),e("li",[s._v("当链表遍历完之后,此时head指向nil,这时的cur就是我们要找的待删除的目标元素。")]),s._v(" "),e("li",[s._v("最后我们通过pre.Next = pre.Next.Next完成删除操作,就完成了整个解题过程。")])]),s._v(" "),e("p",[s._v("下面是解题过程图,可以看得更清楚哦。")]),s._v(" "),e("img",{staticStyle:{zoom:"67%"},attrs:{src:a(497),alt:"PNG"}}),s._v(" "),e("h2",{attrs:{id:"_04、题目解答"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_04、题目解答"}},[s._v("#")]),s._v(" 04、题目解答")]),s._v(" "),e("p",[s._v("根据以上分析,我们可以得到下面的题解:")]),s._v(" "),e("div",{staticClass:"language-go line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-go"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("removeNthFromEnd")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ListNode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" n "),e("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ListNode "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n result "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ListNode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" head\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("var")]),s._v(" pre "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ListNode\n cur "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" result\n i "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" head "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" i "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n pre "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cur\n cur "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" cur"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n head "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next\n i"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n pre"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" pre"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Next\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br")])])])}),[],!1,null,null,null);t.default=n.exports},495:function(s,t){s.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoUAAAEqCAAAAABG4HWuAAAgI0lEQVR42u2deWBU1dnGn3tnJpkQEwgQ9r0gCMTKIqDIJrJKKbhbqFqrVlCwfF8tUj+1dUHrUu1i61KpFqpi5VP6ueICWgsIbUHUyBpkDRKQJSSZmbuc748k49xzLnPuTO7lQPP+/iFzeOY979z7zP7micZQSw0ypKxbptdwge3s7EMVs7yjD1USB9r5UKXmSBsfqlRVtfKhSmWihQ9VDrMiH6p8HS50/488AOH6Czmp/5NwXgRsM6xz19Y4iWXxkoQWkUnsrKpENOeKrufIJAk97FwwbV7C+F5EiYcqpi5U4RaYIVbhJIiH5FVCIeeKwfgqIb6KILFNeZWw7UcVoZdUjyWPh7OMxlUFdGGFW2CWB0mIs5gmlwi92NB5L0MqEXqx7RDvZU0qEXqxIK1iCTfR0GUSsYop3kRBwuRVeIlm6vIq/NYGpO4QJTovST31wskiiBMOuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQT3KyyznlyoSh1wS/kJUkzivkEthSiSmXuFSJ8e3LJbDkVUSJsGCaMok/VQxTXsUwpL0wP6oYx6vimHJ1jMkx8IN1jF+AJpV4qcJLXK4jl2gnUZWT6RaduF7kpz5tL0kXRlMVNVrUeRUrEREmGzmJafASoYpp5Aiz1lJJjZ7rXDBMXmLoUZnEpUouf6DEKrykRhgYtniJFYryEm6BxcIRiQQJvkrc5hbsOF9FkKDGlleJhGVVIvxKjAnuCIclEkTCfJUUA9HrQkI95EJCPeRCQj3kQkI95EJCPeRCQj3kQkI95EJCPeRCQj3kQkI95EJCPeRCQj3kQkI95EJCPeRCQj3JubA9qasmuHkxl0BJa49MYspjKZnpR5XK+c243pi0ioukevT53EbcUXDrhZfseLpAshGzxF74KonElAHpJczig0LFKuteyef6h7SKIEENpndveC/VOjdrXb9R+1QXOlKHhURhy4zwj5qHC2WSuCatwirlVXRumtO0eEn1QvhC4RRuoxzOPwmxF06C6mf96aX3KMdFw+amdFkixJ1oQYL9C/zpZWx/x8UE4zayjTB3vxIMBDtUcHxJ8pY4NC6z1jn8rLXGVTUNXhIWB6lz+VlrvUAmCbtMSXOSY7j0/oYf623jcpzNGGZUPmvNS5pgzk0N72XFdbnOXuJ2HnfkXGatOQmieOS7De9l0c/znL3EGLeRlYgIs9Z8LzVh7kynzlrzD5ynKIXfaniNRMNLAACKfOhlk0+9tPKhl2KfekkDvTsh1EMuJNRDLiTUQy4k1EMuJNRDLiTUQy4k1EMuJNRDLiTUQy4k1EMuJNRDLiTUQy4k1PMfkSgsBP9miRDAm0WisNB+lhj8TtnkEvvUS0Lai1+Jwo4HRZt/jGRMCBDWpBIPVfyRiOm1WeLcSWkv3OHN5kD59kTnRy8a75dUSdKFjlHSGo2bLHVLFOYkbonCgkRMFJZKPCQK8zPG2RJ2FsoqUTgH/sD1EucHqe14SJhy5Y+DX8OjEWfhGBPcISYKC71wNwixlNNGrwsJ9ZALCfWQCwn1kAsJ9ZALCfWQCwn1kAsJ9ZALG4pfX5b4gV9flpxoyIUNZe8Te72LK9591w6uFbZ5YYXqw5EV5MKGUvjm95/52qt4y/3zTa/azNEiL1zz0jHVByQLyIUNpdmVK26Z9LJHb8W/2hdkL51Hv/XDye+oPiKZ01hcyFhQlUNDRlatunTY29WW+l6iIwYcWz72gg9qPD/tB9dLJvyHpCWlp6r84KH8Zm2LQj7UEml/5epqrJ405oZBxREP8lhZRbxV+6Jg7v59LtwQx3urLry2X0svN/bA7gNWy/atfZtJypbG4MKjzy9YC7SdNLMkEBtGhp63DDDfXHnBRed2kprr6IKnS9H6kplnBHLq88a9vhao/uvyiVMGt5Oq1/9h6VdoOnFeSRCtZELShc4XNox7nWPDEh66M5dYMIUhM6nErRfuCSf9izL7jfuNmc33r3o6595maYWwnIVsmFyKJmxuKwZTQ+exaw4DOLLkw+HjR8uel/fMHTKresXjB56NptdxOzEIO7v0AvQd8Xk1gAN/fuf88SMkveye8/e+F0c+/GvF0iYZHReXU+/ai7OGdhxJONWF3LCsMDtr8TeJ+SFhWVWRHBSOyvd23Tmn4PDzv1h5TOLCN7N867CnroGKJR/27yATj7+7W/zV+5Z+MC69bOHq7HrZVncPLf/L+4PSP9Gxpz/q+MjA8Fuz3/10cPqaFn8G5CdNkNi24S4JH3fK1UMWMIRB2GwShe0sqogpvuknS3Mu7z+5KZq2za+UPU5tanB4ZcX7fWWS+/qi4LLXdi6XuPBf/2poL+Xvp79HHHnDvHxkCBM//vyQpBI35eolUVg+5ZoqcZ/4Fy4yYcBfkNheJHoWEr6sJqykfzGWN2rQ2hfLSj891FVysHHT3Y6LhjBIHdM5w9dK3rjjy7rLg38eHpN+jy7dARSe9d4Xkl4euN5xMWFzz+Aszs8310oW3nug7vL5d2y7Lt0O+45gSAjIu9uSzYdrkl8l8OAOceI/9TqN4N2JtXzuJ5FwiMnflUabOy56zbU+supLANCjJT+ZEl4p2aOlDgDNw7IvOZo4e/Gaa31gxQEA0PMG3j4G6b/U2Z9ATwCQvEA9ETQCF356z4Yh3xnQZeetR4Kpb695B4DWomTa1OZydZkFAPsNHwKn3Xp5+58AQi37Xz0pX6aN6th3BoDd1cVFwRwZzzQCF27+ouOTfcDW78vzoZgLR97cAhQPmjRZ/tEIgK83nQUcKa3pF0gv5W/uBtqdM3mCh0j09lEsHwUcmFd63/hgjoxnGoELmW2YsL9Y8lXHQL4nYBuXoHjEhDEdPerv+H2H2NJ1LSYE0Yv18XtoO3rCqLZexK2GbH59Ws/4y28d6O5FHiSNwIXdeqyeM7xiw5Ym+x+7rY3/5eMvHLn44nPkH1fX81q8o7F6509PD+KmHnjFvMrLx9UAgMiP3/90xplVKw7dLH3bFjSNwIUlN+5dvtY848FP/vj01QG4cNf+5wa19PLVHQBo2tnDnogj9yezgvgah5XlLOrXwnPlPov/e8VKu8mP5wbzzWYGNAIXRqeNXHf07E7Ry39wtHcA5Yv/lOv9O+HzVunh29YZZ7b265fnnZzxeE4G30+HBr29a0t+j1Z+hQpkTyNwIcKdOwNASPqBclY0y0QcPg0oHhvUDdUy6gXQ8nv1CqqXjGgsk13EyQy5kFAPuZBQD7mQUA+5kFAPuZBQDyUKp0CJwu6cUonC/OOqSxVhml8u8VDFtwd0PlFY6IU/CsH1omfcS3CJwlwv4kYeejlhicJheaKwdNZalLgkCvOSgFJ8DZMf6q7RhflCXuL1uzwZIS5RmClMFA5TojDxnw+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQT3IubHvqqgVuVJDZOj/lam2XSSxhEFaQsARXxWbSKqJkP5ZNavihOIYjzmY89cKPXZZj0ccN72U/DvK9CGdE3ksFHnmx4b3swFfSXoQDxRsIcf2Iu6RrqgsdETtxfoTVMoToiW3tZBIh+VSUsC+5KqYprWKafMSqjl27Gn60gXxnMy5ZrvxkqWHxGZQ7sXmzH70043vxmOWaShHWr/ejlxbOXoSNbGEGWjAQDoabHl/iPmstxk1rOdJZa0EiDlJrubJZ65AuSPhZa13njdpuC5d9Zpi58oltPqg1Vs5lV+mC3W0+y1UTZq0H7ujkXEhYXG4ii/EprIIERyvbcyshftaa8VUgzFp/p5xLh3JJhI2EJRIctLkwRCbMWoOvwuSz1oxmrYmTCnIhoR5yIaEeciGhHnIhoR5yIaEeciGhHnIhoR5yIaEeciGhHnIhoR5yIaEeciGhHo8u9OvvGAby9xCDgkkXTmwdNTfap27TVjnBicK8xJ9EYVMucanCZwEn5BIvicJyiUsVIQvYlEo8JAobHqo0IAs4oyomvCQKO2YDvcxaa5kP3IoSm5dkNWvNND+q6GIv/Eylh1nrkOZHFV2XVfEya61JexGriFPSOn8lD+dVrCL0kipJutAxvlmj8VPSibAw5cqPQNtiorAgEROFeYmYKMxLxERhTS5xqcLPp9q6WEWeKMxLDJfQYecCs0IRiQRhvkqccQsuicJMqGLJq4SFKVehCr8SY4I7QmGJBOEwXyXFQPTuhFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQT3Iixzl/yrhxVAbT4q8ql4hVDH4y0GUjSKvwEpOX2PIqNgx5FWF205ZXESXC9K/FZBKhChOryCWWJa9i2TKJyWRVmIcqlnacKjmpLuQcJHjO5heYXCKvwkSJsMCkEksuOcWq2La8ivxw2x56OWFV0t2ipAsdIbExTZ4orEVlEg9VGF8lq0RhU4/KJEIVMS5Y46tklShsh6ISCRPmU8UsYCMelUi8JArHbFkVOyFMuTK+SoRfESQuicJClXCEr+KWKMyfEuEiP/EvLniQaPwzsriR5stGUomHjfzqRXoUtCzKsoCOgsaEX+1gfhwFLZ2E3p0Q6iEXEuohFxLqIRcS6iEXEuohFxLqIRcS6iEXEuohFxLqIRcS6iEXEuohFxLqIRcS6knO1HCDl8JF5iEXVybxUMXTRj71IruOB4mnvGDpTfS0USASL70wX3pxqVu7oKW60Bl7y4QUXCEzVpSIicJSCfNQxZZKTFESl1fhJQkPVSxhVFNMFI7JJB6qJEx5FTFRmJcY/lRh8ipiojAvMXGcKgoShflAWCaXCPm7LlW0zKsElQV8ohKFYQnpzEFV8SVRWOhFYaJwWJooLEjELGBBosklbrnE/PGXS06mRGFLlyYKhzxUCYVlVfxJFA6FKFGYOKkhFxLqIRcS6iEXEuohFxLqIRcS6iEXEuohFxLqIRcS6iEXEuohFxLqIRcS6iEXEuohFxLqIRcS6tHq57A3pq4K4ZYQkxQnckGtjGnCwJ4mkyAx4qeSjTz0cmg6P8LH+HuXSy+8hJmXXCPbGbIUUHxxKzf2l1Uvtj1jYqZHQZSseIQb+xM2Es+I2IvF7hrY8F7EYeU6Sa/UKdeeqYoYpHHB2A5fOMuxsVuiMJ9LLMYF7yvzpxfD2UtWicJfb/Onl4izl6wShf+91Z9emjl7ySpReH+kiDuWKR5LnnItFeclTdM0CEs4nzWcarGsfEHoBfihD72UetnaQy93+9DL63xdTzuL7S70oZfHfenFxVPJK9PrQuIkgFxIqIdcSKiHXEioh1xIqIdcSKiHXEioh1xIqIdcSKiHXEioh1xIqIdcSKiHXEiopwGJwv7A1c0qUdiv1sRehH08JOf61Uz6y14OVEDHJbteWCCJwj4hxPhmkSgsBP9miRAG7CFRWMgl9qkXg+8li1xiv06ZvBd5LrG3ROGw8yrcBKVth8S/Uu8LmnMncSNTiOgVJGH4g9ALX1joxWK8JAR/4NJRhY2YpXOvpk6mXgQDQdfDx5ckf3IMEZsaN1NsJUJ+3SS+O+dOYqKw0IsYF+yXC7lJasMO8/cIPsWXWeGA7hHcTjbjdhYThQWJfy50FrbAu0PIJbbEXvgx9dQq9O6EUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUM+p6cIq1Q2cnL2watUdZMmp6cKvv/+Z6haS7Lp5i3fxzgULLO/qTGHrf7ZT9eHIilPThR0x9OZNRkDzFZn2svu823eYHsXbfvVwgC7UO3w87MGvAtwgsMZVN5Adc/H46Ds/qVTdBgDkzaiaP+rBjSfFE3PbaRVzR/6+7JR7Yj5FXdhtOvY8cPEv/3HYo57FvD5aZYx+5mRsv33qY2uOer2G5dfcjUDk3OHYOPviJ9Z5vU+wROxkeEbx68t3jkMffdVzcA6OfFzec0DEh3o80Sv+thtl9y25cPzZTeXq8lVfVOW2GdIr10vpjCme+v5X2HjnyxeO75fv5dC8u9VsN7xXMMMh3SauOYT1X/S7cNyZXm7sho/22sXnDFL+UBSQC+2Vz7Rf1Mf6x08S8wcEUV/vM/W3ADaWvTXi4nOjEvG+X766A2hactvYIO4QCJ8zcjFgr9/0xqhLz5aaq3zO8n0o7Pc/owOZlMsZt/R9IL76s/+74PIzpeq//uaTSuT1uWtSEK1kQtKFzmlNxg1vMhgZPaUVTV7+8UPP7n/si2vOk5x5i9tYHM20xV6AvAteLwOQ+Hzb28Ou65B+h0XPtVrYoezFdxYObpm+F5PvRZy4FXpJAM3HfFgOoGbdptdH3iCbLD380vQJhxd8UL1c8rgp9CJO3Npcb4gDHS7492EAx9aUvjruWskp+/y2nWOm5T777qzzmqUXGpJeGEwL6SUwxSvVLuSmulC4SRyZTfzrg67e/sKkrcsHXd9WonyzUyZ1U45M3VuT2Ladrw5Oqzz86eHHrgidV7jxE9mr9qdfyK6X+LHaf6s3lb3SUya+6b48u+fsf718dXrZnQ9k10usrpdjpVtfbpVWyR7eccZTbbQuX5StHZO+JuPd4MEdtqCwjy9JujAv9f9rND5ROJGT2QuZ0FV//+ulaHnVENkTDz/Pz+SJ2kwDYCVvt51If58vnHfdty3DqIb0ox0zy15Mz70A+p2nITSsb+k/JS7MtpdESi/pP7M5sNa6pgMw8JZS2TnKcZgDMea8DCsR4V7ZCRJEwtxKaqJwQK8LgfzbV28PDZsufeE7+WXHRdPI5a5So3Ovsw0zV4f9zqzaD4tzWw+d3blduh0iHWr+XLpra1niW7JeZj3MbRTlzk9NiItxT1hRDfZf5u0BAETbjLqlamj6PXoUAAj1fU32UfeDsxwX4zZ3Eu14mHutE7fzAOvX9x4CADRpN37mumnpdtgXRwkAzJYdluAJzIVoXrQ991s5PhRy5chbWwAg0nXYZcOj5WmllS88tLt9qy5tPwmql/I39wBAtPuIK84JrZSIa60T1QP6tKbsjUMAkN9z1LR+WJdWethAO69lAyYwF1b/YVPh0aWjxgfzKQD7/H8BoMe4iec0k2k3PLnn+gu6Fn/+XwF9sGytXg5A7z1+4tmnydVfJnIAtjvePZBejLfXAcg5c/zE/tJPagrC2NoXYB/s79cjmCPjmaBcyN75S9Wjb7/7x+6nB1K+5qWdQJfLxn+7uVy7o6zb7O6wl+0u8lI5cype2Qf0uHJMiYdPLoFjK8cC+0rjg72IM2b7G18DJd87v7eH+0OHKN6bAmy/d/Mz/6ku3Lxg56U3DPps2YDZBUGU374Qbb932enSx0EAyM3dUdHd/OiJQwWBfE1gf/o3dLlmSjevt3PGq32OLVjbeXIQvRgrP8TpP5rQycun52h+0aa/XTG06tk1lWcF0UsmBOTCYy+8UXxHk34//skfzhkVxMezD9k/uqlHrrfKZ5S8O37Yru25zXf94Jlu/rdS80T0xus7ef9apmx4c1Yem98igKOCfc8XzbuqtccX4/qslzdO7lqzLfFES29XCI6AXFj6SuHPeiBv6pp3F/UL4IlwV83f5d8M1NP7tsObPsgZfseaX63z/FVvBuxs8ZH3Vx05zaaMnX+Atfz5tCBeL9s7z3q6s3d58errl23W2t96XUCBB94JyIWDat+QdlscTPmijOqOfmfTsb6tMfji6q4B9NLxqQzEQz8Crt1o9QjkZQq0fkMz0he+eGBHtPNpyk0Y4Cc1QeLhtXcqzWrfCgTzuUSGvQC53w7oqEBrkukViouD6iUjlI9TEAS5kDgJIBcS6iEXEuohFxLq8ThfaIszZj7B1WUus2vcChNW/GpN7EVLrwAEiW8pvpKZPoZ0A3snYS/iaaxd0L3PWvuXTit0y+8kbCT2kpBczhZLGg9sn7BeTH6nLNKNfUsUlvYiJgpLZ63rJXnHzXI1ICSHhgJ67uaSWi0hP9XQ+JxQ+wTlpwobMVPnE4UD64WLPjX5cFSxF/NEZbmaTOoOwUDQ+ejZVIl7rrV45q3AEoX5BG3hBvG9MEHimwudhZiYKMz3YoOX+HWYdEmWtG3qQorvCcq1FkKrLUsIrRZ7CaXJtaZ3J4R6yIWEesiFhHrIhYR6yIWEesiFhHrIhYR6yIWEesiFhHrIhYR6yIWEesiFhHrIhYR6yIWEesiFhHqSM14bMr7qCl8i849kvrHAAfxpYcOrMFT40Ms2/OLehlexsdeHXnbhBz/0o5cvfeiFabvd/+PMVBc6cl+8JAq344d/IfySBjSZBEZ3Z+CM1yxXB/vb84Ow2fTCrB7OXrxmuTpXfOnFZj2dvXjNcnWwrQN30rLqxcIZzl6yShTeH+ZC/vxJFH6nt/OyafBGFbwsWszeIk0j90DRCi6TUjSqi5d5/8TK/YixOWMlFxefsLgTwmK8fwQJjla296GXkWvbOBdcvMz7R/TyQTvwGBF6XUioh1xIqIdcSKiHXEioh1xIqIdcSKiHXEioh1xIqIdcSKiHXEioh1xIAPvr/jUD+etYcsiFBFj9n/MOa7EGlsoOcmGjxzFFE1ViiOREBRcMyl20XVJ7OQmTS2zYjL+SVAImbsT4K0klLu1amqSKy41m0httixJLXsWSVXHpX16FSSUMtqU7DlX4IP9n9HJqaq+kJ29qWDhQzNLtpEJjACytvmztD3ZUyGuurRJKdaEzCZcJwbhCZGxWEj7jlsklHqqYtryKXGKIkoS8SiKLKmIWMC8xrRNWZUN/4I4hrQcCeLRn7CK0qnTaMHRaTVwLRWrCoQdvrJ3U0yPL+tb9AUebQYvuKNZMPffRS9rm/uritkAOe2V0nmZH3uzRAWDQc2o0DbBQNf8Ot14yShTmM0v5KGAXiZDCKkqYL1U0voqnXGI+89YWq/ASQ0wUFiV+VAlzIb5ZJgrr8iqhAQCmnrVGA9Bv+Aca2LHWTs1HPcMHW1d/b2HOmhm119aqF/257v8O7++Gis6rzgqFsNkMo8yIQAvhEgAWJgDA5o6hf7P+a/vpIc3eeVyPeU4U1oV4Wj4hVpAYooTPArblEqEXA7yEyUOH3XKJZXHBokS8R4CXhFxCh7myhi6TQNdkccFeEoV1qcQ2mQZgIDsXAM5no8GWadyAbe9NG99blL8UeKV+5a1I+dUAetzz9dwOj+rFXxavHRrCeU1DGFoUBspvfHLVc09U3W09tuIp4C/FA/b97vW30QZ5i5yHO+VGn5p/jZHwjapcAPXvT7Sbx40Zq8Nw3od7lIzC/fH+kx+IwdjyEmA/e33bZQBQNb/VPTrQ6aGuIeAqANPxYf+KPy7F1KnAc8AlPUsAoM2s7+BhjOn6FFB60SS3JsiFRJLyjb8DY0AEYN88xOfECgr+/Y9b2+Pjm6OIADiCCwCAbZzbZ14hAP3mYy+v/eUNXw6cP2Mb/th+KmbtqL3mC1v/PhOIRbWuKKksMFfdgJLerhuTCxs5Kb8atOPYqOTPWmX9n3CuKjDsxIpbRgCDz639lZREQR4AJG65+srax8z13aZcAjzZFfh9d2AgfltfJQxgT27kcAuM21+YyBt3vCbo88JGTs7K5I87+sD+fhzA85cBBfWfqyT+vOn+6H+NAXBbHlB2yF6J2l8k0ydP0wG8dhMWf+WsecPYWqpMAO1KF111FGgVLVx03CbosbCxk3wcWvh94JOFS6YCwy4HsK/uj5oXXfhpvOzGpPzGduW9ax8mIzcD2Jg3aRLQVAOGFwDDCwEAT9WLwwC04We3yF+yvdekpVsAvP+S2181Jxc2dgb/4q7aHzoB6GdexICODEC7pKLPSCz7Rm91Dx3YdxVww9hLAODGzgCKQ8B0AFdiQ2EX4KYva6Uv1X6CnDepsutpAw49ObEHUOIapUAubOxoc+c8CtR/ORNmqH/LHK83TBQrRtb9WB7vEmpZiTbLAMQKltTX2PpsybWTjIHzZ2zD7C7A4/Xrde4yZjzWH38qnqnbx3kBSC5s9ER/Wfuv8PcT61yo5e+cP3TDPABYvLp8pkuF4o4Ph48Zr+XUvjvBxsV3LVgP3PPZYowAACxlhTj64m06llzq3gK5kKjKYVf3uiGfz2SofyjMw72jIxhxe+qak3nmUzM+a5P84q/XXbgWAIYOBXa0zEfsmdk5+FPnEag6b/1ZrgXIhUT5M8OeQ+WhAc7Vpd+t+yG6qnw+CrsJV/tmCGLv7VOx+Oy6C1tnDplbejuA51f/BsBD38bzrceATZqpIz//jT4Rtw7IhYQ+OwcoLMSTP0pd7VX/Q+L+K1qiRw+AG+ypqPtgm5XPGX3Rps9vqlvuvgwVD/e/swkQvfAWAKh66dYw9uzdVFa298aJ741364BcSNT77Yfz7v9m8Zlk5tyzp10CvPYbAJixsSmAUgDbFld/Vv89yCMdLtszZ0J34GgNALZt0crRP9IA1H2KuLDDSJRf27Zj17HtO61ZPMbtz+WSC4l6wj+/7YH6nzddm1we3SsX2HrVdAD4fS8A5gSgY0nBlD61/6/NKdKN8TMAlLfKA7QtRb87PcYAbKm16fQRIbRdbISbA2j/HdffKdBcV73kF5YGkhyXVX6hsSOQ5Lis8gurDgaSHJdVfuGheKbJcZ/97sKxun1PzU9TpruE5Dj/8wuTLnT8woGX/MuybjKJl7TInV18qGLu7eRDlURFex+q1Bxu60OVqqpWPlQ5mmiZcRXrkNGkQK/49c+a1K8cZkU+9HIw3NRdEk19RhZG8SFbkEs8VDmJJIx6AaC3AMBa3vPNOgv+TCdd6HgE9fKMrHGPudk9I4tVsnlG1vNkEg/PyJpYJYtnZDuUx0uyeEY24txKVs/IMVteRZ7lWs2vZPWMHAnzVVKekWmmhlAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUA+5kFAPuZBQD7mQUI+mKMmYIL6BHgsJ9ZALCfWQCwn1/D9tvRrVdGQhhwAAAABJRU5ErkJggg=="},496:function(s,t,a){s.exports=a.p+"assets/img/2.6ab27c2d.png"},497:function(s,t,a){s.exports=a.p+"assets/img/3.5be4a6f5.jpeg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/74.18b8450c.js b/learning/.vuepress/dist/assets/js/74.18b8450c.js deleted file mode 100644 index 26f0666e..00000000 --- a/learning/.vuepress/dist/assets/js/74.18b8450c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{1070:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("穿插着为大家分享一道经典面试题目。额外说明的一点是,这道题本身很简单,但是却可以作为很多 中等/困难 题目的基础,比如 超级次方,实现pow(x,n) 等等,在面试时需要额外小心。建议大家掌握!话不多说,直接看题。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("本题原始版本出自《剑指offer》,leetcode或许是因为自身原因,并没有很好的进行移植。当然,这道题本身也确实不太好移植,尤其是测试样例的构建,很容易把系统搞崩掉,所以一些测试样例处理成内存溢出,也是情有可原。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("题目:大数打印")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: n = 1 \n输出: [1,2,3,4,5,6,7,8,9]\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("br"),s._v(" "),n("p",[n("strong",[s._v("说明:")])]),s._v(" "),n("ul",[n("li",[s._v("用返回一个整数列表来代替打印")]),s._v(" "),n("li",[s._v("n 为正整数")])]),s._v(" "),n("h2",{attrs:{id:"_02、简单解法"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、简单解法"}},[s._v("#")]),s._v(" 02、简单解法")]),s._v(" "),n("blockquote",[n("p",[s._v("如果是第一次看到本题,应该是会想到👇👇👇的解法。")])]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("直接通过 Math.pow 函数,计算出最大的 n 位十进制数,通过遍历求解")]),s._v("。因为过于简单,所以直接上代码:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("printNumbers")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Math")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("pow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("p",[s._v("补一个c++版本的:")]),s._v(" "),n("div",{staticClass:"language-c++ line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("//c++ \nclass Solution { \n public: \n vector printNumbers(int n) { \n vector res; \n if (n == 0) return res; \n //打印到数组中 \n for (int i=1,max=pow(10,n);i=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//取第i位的数字转化位int")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" nSum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" carryFlag"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//最低位加1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("nSum"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nSum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n isBreak "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//进位之后减10,并把进位标识设置为1")]),s._v("\n nSum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n carryFlag "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" nSum"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nSum "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" isBreak"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("saveNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" isBegin0 "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" number"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("isBegin0 "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n isBegin0 "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("isBegin0"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 到这里并没有继续往下实现一个存储数组的版本,是因为原题其实就是要求打印数值。")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 这道题目在leetcode上被改动成返回int数组的形式,也只是为了测试方便,")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 本身leetcode并没有提供对应的大数测试样例,也是担心其内存溢出。")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 总之大家知道本题的考察点所在就可以了。")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br")])]),n("p",[s._v("上面的代码强调两点:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("对最低位 nSum 的值递增(也就是字符串加1运算),当大于等于10时,我们把进位标识改为1,同时恢复对 nSum 减10(29-31)")]),s._v(" "),n("li",[s._v("通过判断首位是否进位来判断到达最大的n位数情况。比如 n=4,只有对 9999 加 1,才会对第一个字符进位。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("同样,我也实验了一下,如果我硬性的把代码改成数组的形式,然后在leetcode测试用例中构造 n = 10,就会出现这个:")]),s._v(" "),n("img",{attrs:{src:a(552),alt:"PNG"}}),s._v(" "),n("p",[s._v("所以建议大家是在IDE里练习,今天的题目到这里就结束了。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=r.exports},550:function(s,t){s.exports="data:image/jpeg;base64,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"},551:function(s,t,a){s.exports=a.p+"assets/img/2.f30b0c60.jpg"},552:function(s,t){s.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAABACAYAAADI4wqdAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQEElEQVR42u3daXRUZZ7H8e+tNSEVAkkICTEIASKENeGQsAhRHHuQLdPCoXva5fQoLqD2nGmHHgenB1sP2DY6OsMg4kGWI6toy5ykI6gYZ2hZBAQiIEsWspOkslal9qo7LwoqFAkQIUVI9//zitR96t6nnuLc333u89ynFFVVVYQQQogQ0HR3BYQQQvzlkpARQggRMhIyQgghQkZCRgghRMjoOnrR6/Vit9vxeDzIvAAhhBA3S7l6dpnX68VisWAwGNDpdCiK0t11FEII0UO168nY7XYMBgN6vb676yaEEKKHazcm4/F40Ol0N7c3IYQQ4grtQkZVVblFJoQQokvI7DIhhBAhIyEjhBAiZCRkhBBChIyEjBBCiJCRkBFCCBEyEjJCCCFCRkJGCCFEyEjICCGECBkJGSGEECEjISOEECJkJGSEEEKEjKyE2Y1Urw8cblSPFzxe8Mlv9wCgUUCnRdFpIUyPopVrISF6KgmZbqB6fWBzojrc3V2VO5NPBZcH1eUBmxPC9NDLKGEjRA8kIXObqXYXqtXR3dXoUVSHGxxuMIWhhBu6uzpCiB9BLg1vI7XVKQFzC1SrA7XV2d3VEEL8CBIyt4lqd6Ha5AR5q1SbE9Xu6u5qCCE6SULmNlC9vk71YDw3GUKqz4fX8eNOvC6LrdP79rm9IWoYFdXn63ibTwW144kQqtXhH9cSQtzxQjYmo146QVz+lU2fz4eiKF32q5tX7/8yn8+HRnOHZWcnw+Pg8//Bvev/FYBzm/bgsdqDtg9ecD/h/aIAMB8rJDZtKADNhVUUbfyM8SueAsBaYUYbpic8NqrD43hdbg49/zZTN73ccUWumOVWvvsw1pJqUhdlty+nAIrC+c1f0FpyEQBtmJ7YiSOp2XciqKhpYDxDH/0bABpOXcBSXE3UPUkUb/mC9N/9Q6Ccs8mKsY+Jk29/TNy0McRNuOfabRoZfnu/RyHEjxaykNmxYwepqamMGTMGgN27dxMVFcWUKVM6LO9wOHj//fd55plnKCkpoa6url2ZzMxMDAb/wO/x48c5f/48CxYsCGy3WCysWrWKpUuXtntvTk5Oh/u8bPbs2cTFxXV5O6he3w1nkRVt3UtreS2uphYK3tiGaXACd/1kApV7j+JzuEmckcHZNbv8oXMpZE6/tZVpm/+9w/1VfXGE8IQYkmZMAMBaVou1vDaw3dPqQPV6ufjNyaD3xU8ZBcB3yzZgr/a3la36Ir3i4/nm6T+0O07irCkM+um9NHx3jtRfzUf1qZxd8ymWokr6jhxMwvQ0AJzmFk6v+iQQMpW7v6X5+0KqIyNw1Jg58i9r0UaEM+alv+fob9Yw+f0lN25Xh1tmnAnRA4R8dpmqqpSVldHU1ITb7aa0tBSNRkNSUlKgjMvl4oMPPmDSpEkYjUY0Gk2HvZHLvRZVVcnLy2PhwoUArFq1CpfLhdfrpaamhrfeeguAESNGMHPmTABOnTrF4sWLMZlMlJeXk5uby6JFiwDYtGkTVqs1JCFDJ6YpJ82ZhM/lofl0MSkLZ6Ex6NBHhFF/6DRj/+1xwvv39X9ZvYw3VYWq/GO0ltYQlXo3ALaKOnSmCGzV9YEypdv2ED9lBQDprz3hf9//nqD2/woY99vHbngMfWQ4FZ99y4C/zaS1opbqLw/TWFAMgM/V1gb22iZs5TVMXP1rmouquPBRPmOXPnpzPVyHGyJurk2EELdHl4dMa2sr69evp6qqiuLiYnw+HxcuXKCqqgqj0Yiqqhw4cIA33ngDruh9TJ06ldTUVH744QdGjBhBSkrKNY9x/PhxBg4cSExMDBs2bOCpp55CURSsVivvvfcezz//PABarTbofVu3bkWn02Gz2aisrGT9+vUAFBcXk5WVFVT2zJkz7N+/nyeeeOKW2kP13Hg8w2luwefxgs+Hs8GCPiKM0+98Qt+xw9AYdFR9fQJbWTXhcX2C3mcprgbAVmnGY3ME/nY1WghPiAkqG5OewsDZEwEo+eM+NHodyfPbPnPFp18HlffaXRRv/BPjVz7Hd8s2YDlbErTdENOXSav/qe1z+lTq9heQ+Z//SOGWL0j4SSaJD6QD4DA3c+qdnQDoTeH0GZlM0fZ8XA3N2KtqKdr2FQADLvV8fkzbds3NVyFEqHR5yERERPDCCy+wffv2wO2ycePGkZeXF7hddvTo0bYK6HQsWLCAoUOHsm7dOkaPHs3OnTvxetufnAcPHsz48ePZtWsXaWlprF27liFDhmCxWGhsbMRms+F0OiktLQUgMTERna7tIz7yyCNERkZSXl5OTk5OoCe0YcOGdseKjo4mOTn51hukEyFT8lE+7mYrPrebM2t2EZ2WQt+xQ7h7ziTstU00fl9M2vJn4Iqr/chhAwMnbp/DibO+MfA3QNyU0dc83sW9R3A3tdDy0ER6J8d3WObUf31CvynjCI+NChozsdc1U/D6ZpLmBN/2dJqbUX0qGr0/2BtPFOK1+8eiPK1tkx4UjdIWgKqKxmAI9NS0Rn2Xt60QonuF/HZZS0sL9fX1uN3uwHjKlcLDwxk6dCgHDx7EarWSmZmJqqqBgf36+npOnDjB9OnTiYmJQavVkp6ejslkoqqqiqeffprDhw9TUFAAwIABA/jqK/+V8UMPPURERAQAvXv3ZuXKlSiKgtvtxmq1smzZMgA8Hg8PPPBAUL3i4uK65vZZJ5aKGfzz6SgaDefW5ZLy5CxMA+MozTnA0ZfXBcqcfe9/SPvdE4GTeNqyXwa2NZ2rCBr4v57aw2cBGPvKQgqWbyTjnV9hiOwVVKZw85fU7jvCsGfmB71ur2vm6G9Wk/riL4geNShoW1hcH3oPG0j1vu/9L6jgarDQWHCe/lnpJM29FwBtmIF+E+7B0dCCotXSdLqEyCEJABhjend52wohuldIQsbpdNLU1MSWLVuYMWMGhw4doq6u7pq3nvbv38/mzZuZNWsWABMnTgxsKy8vp6KigkmTJgVey87O5uOPP+bhhx9Gr9czefJkJk+efN06LV68OGifOTk5Qa91p7pvzwROsJWfH6FP6t1Yi6tJeHACkYP9J+Dvf7/50nRfLUXb89Ea9Qz66b3X3Oe+x15j6oe/DXrNVlXPmXe2k/riL4galkjS32Vx/JWNTFj5bNt319BCzddHScqeDoCl5CLOJisArRV16Hqb8Lk9mI8VYogyBfWEkuZOpmjz55gGJxCbOYK7HhzPoRffJXlBFqdWfYqxr4mYsUMo/uhrLOdKUXQ6HNW1FG/5kuZT58na9mp3fxVCiC7W5SFTVlbGu+++i1arZd68eWRkZJCVlcWrr75Kbm4ugwYNChorsVgs5Ofnk52djcfj6dQxCgsLqaysJDk5mU2bNnHffffx5ptvEhYWFijj8Xh4++23AVi6dClud9vgs9frxel0smRJ8CymmTNncv/99wf+djqdGI23OLCsUW54xe2qbyE8PhoAn9vjH58BeiXGEjmov383V95KUlXUG+zz6udPvE43R5b8N4MffYjY9GEA3D1nEo0nCin706FAOWN0bya++2su/PHPANQe+oHmHy7429Rqx1ljpmzXPgCiRgwKCpleCdHYq+swXQpGFIU+I5P59p/XEDn0LmLGtN1+TH50Boa+psAU5m+efOPm2lYIcUfr8pBJTExk+fLl7Ny5M3DSt9vtuN1upk+fzrZt2wIzx7xeL5GRkSxZsoRjx45hNps7dYydO3diMBi4ePEi06ZNQ6/XM3LkSJ59tu2K/PKtMIAVK1YE/r1nzx6sVivl5eWYTCbmzZtH37592x1j//795OTk8Prrr99iC2vBdf3wtFWbafjuDMbYPiTNmohpYBwNxwqp2fc9LecrAXA3WW6pGlqjnrTXniYyOSHo9dEv/gy0Gkq3f95W1tAWaEN+3ha6zecrKfpwT9AYzWWVXxyl+vODJDyYidfZ9mDoXTMmUPv1Eca98sugMaUOaTT0TbuHTtNpO19WCNEtujxkrp7RBVBQUEB6ejrTpk0jMzOTlStX4vF4AjPBOhqruZ6XXnopMOW1tbX1us+/XKaqKrt378bpdJKRkUFNTQ3z589n3bp1PPbYY/Tv3z+o/KhRowLjObdC0Wn9qwlfu2I4qs0MfXIOJ3+/kdZKM70SYug/bQwthZV4bP5B88TZ96K54qTafPoCZZd6N/baRhzmRspyDwa2+9ztj3l1wABoww34PN4Oy7erqvfaA+3xU0eTvCDLP7a0cTe2iw2cXZeHoteSsuhhjixZw/gVT2GMbj/ucuHTP+Ox2dAadIxYNNdf/070ahUJGSHueCEb+L88O8xisZCXlxeYVmw0GomPj+fAgQP07n3jgV7fVbd9VFXl9OnTnDlzhrNnz6IoCrNnz8ZqtVJUVBQod+WttxMnTpCXl8e4cePIzs6moqICgD59+vD444+zZcsWEhMTmTVrVtBEgbFjx956Q4Tpr/vEv93cQu8Rg4nLHE7a8kWU7PiKwg25oPpP6oqiAcV/+8tV38LwZ+f428XlDsza0keEk/BARtAsrs5orTRT8PqHeG0OIu4ecO3vwO2l4A/bsBaWETtpTIdltGEGlEs9VGddMx67k/j704jLHO7vGSkK5z74jNFLfkb/KaPolRATWNomPCGG9BX+Z5bOrsvDUlSB5dwFUhbOunHbCiHuaIqqBi8Q1djYiMlkuukdut1u1qxZQ0lJCS+//DK5ubmkpqaSkZERKHPy5EnWrl3Lc889x/DhwwE4dOgQZrM5MPh//vx58vPzqaysJD09nexs/7ImPp+PHTt2MHz4cFJSUoiIiKCqqorVq1czcuTIwDGOHTvGypUrcTgcbN26lblz5xIbGwsdDPyrqsrevXsxGo1MnTq1yxtZtdiv+9S/z+MN6qXcyOU1zq73cKbd3BxYVsbZaEHRadvNIkNVcVntKIqC3hS8RIuzoQU0Gox9/P8XrGW1KFoNEYmx7Y5lKa0hIjH2xp/BpwaNo3gdLuzmFkx3te3T0+rA63KjN/UKzKTriBKmR5FlZYS443V5yHCp9xIWFoZer8flcnV4O8ztdqPXt12Jtra24vF4iIrynxhdLheNjY3o9Xqio6OvezyPx4PFYgkaW6mrq6Nfv34dlne73TQ3NwdCJ9RUrw+1wXpbjvXXQok2yZIyQvQAIQkZ0Z78WFnXUeTHy4ToMeRS8DZRwg0oN7n2mGij9DJKwAjRg0jI3EZKhBHFFNYFe/rrpJjCUGRBTCF6lJAvKyOCKeEGMOjA5rzhTwAIPyVML8v6C9FDSch0A0Wr8f/gVi8jONz+lZo9XlmL6zKNAjqt/zmYML2EixA9mIRMN1K0GogwynL1Qoi/WHKJKIQQImQkZIQQQoSMhIwQQoiQkZARQggRMhIyQgghQkZCRgghRMhIyAghhAgZCRkhhBAhIyEjhBAiZCRkhBBChIyEjBBCiJCRkBFCCBEyEjJCCCFCRkJGCCFEyEjICCGECBkJGSGEECEjISOEECJkJGSEEEKEzP8DHYEhO3lQhf0AAAAASUVORK5CYII="}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/75.a640c292.js b/learning/.vuepress/dist/assets/js/75.a640c292.js deleted file mode 100644 index 33ce3847..00000000 --- a/learning/.vuepress/dist/assets/js/75.a640c292.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{1068:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("**今天是小浩算法 “365刷题计划”- 储备日。**难顶,我本来今天在写最长回文子串这个题目。然后我突然在想,直接讲这个会不会仍然有同学看不懂,为什么不从最简单的讲起呢。于是,今天的文章诞生了。于是,小浩又熬夜到了凌晨。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("见微知著,发现一组数据很有趣,分享给大家。leetcode 第一题通过次数为 993,335,第二题通过次数为 396,160,第三题通过次数为 69,508。我想说什么,请自己悟。")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第125题:验证回文串")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。")])])])]),s._v(" "),n("p",[s._v("**说明:**本题中,我们将空字符串定义为有效的回文串。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: "A man, a plan, a canal: Panama"\n输出: true\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: "race a car"\n输出: false\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h2",{attrs:{id:"_02、图解教程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、图解教程"}},[s._v("#")]),s._v(" 02、图解教程")]),s._v(" "),n("blockquote",[n("p",[s._v("经典题目,你需要像掌握反转字符串一样掌握本题。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("首先,我想确保你知道什么是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("当然,对于本题而言,因为原字符串还包括了除字母,数字之外的一些幺蛾子,所以我们第一步可以考虑将其替换。因为使用正则实在是方便,所以直接用正则替了。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\ns "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toLowerCase")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("replaceAll")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[^0-9a-z]"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[s._v("假若原字符串为:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("A man, a plan, a canal: Panama\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("替换完就是这样:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("amanaplanacanalpanama\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("剩下的就很简单了,我们同时遍历两边的字符,如果不等直接就返回 false,代码基本就是这样(因为实在简单到无地自容,所以我不知道如何画图....)")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isPalindrome")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toLowerCase")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("replaceAll")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[^0-9a-z]"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toCharArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(542),alt:"PNG"}}),s._v(" "),n("p",[s._v("然后上面的代码大家肯定也觉得简单的一批。但是既然我们都知道哪些字符是幺蛾子("),n("strong",[s._v("除了字母和数字,都是幺蛾子")]),s._v("),为啥子不直接遍历的时候跳过嘞?这样是不是就不用先做一个替换的预处理了。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isPalindrome")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toLowerCase")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toCharArray")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'9'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'z'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'9'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'a'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'z'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(543),alt:"PNG"}}),s._v(" "),n("p",[s._v("好吧,那既然我们都可以把幺蛾子跳过了,那有木有现成的跳过幺蛾子的API来用嘞?我找了找,java 中没有特别现成的拿来主义,但是我又不想造轮子,那就去别的语言里找找呗。")]),s._v(" "),n("div",{staticClass:"language-cpp line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-cpp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//CPP")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isPalindrome")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("string s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isalnum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isalnum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toupper")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("toupper")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("p",[s._v("提示:isalnum() 方法检测字符串是否由字母和数字组成,是c++标准库函数。当然,c库也有")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("但是这样感觉代码还是好长好难受,有没有更加简洁的写法?祭出大杀器!")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("//")]),s._v("py3\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" isPalindrome"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("str")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("list")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("filter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("str")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("isalnum"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("lower"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("然后,我还想祭出终极大杀器 之 战斗魔鬼!")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(544),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、总结"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、总结"}},[s._v("#")]),s._v(" 03、总结")]),s._v(" "),n("blockquote",[n("p",[s._v("万丈高楼平地起,盘龙卧虎高山齐。希望大家对于回文串的判断烂熟于心,为后面的题目做好准备~")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天的题目到这里就结束了。你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);t.default=r.exports},542:function(s,t){s.exports="data:image/jpeg;base64,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"},543:function(s,t){s.exports="data:image/jpeg;base64,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"},544:function(s,t,a){s.exports=a.p+"assets/img/3.65076092.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/76.cb3e391a.js b/learning/.vuepress/dist/assets/js/76.cb3e391a.js deleted file mode 100644 index 682b97c2..00000000 --- a/learning/.vuepress/dist/assets/js/76.cb3e391a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{1075:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天是小浩算法 “365刷题计划” 第107天。满血,复活!")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("即日起,我们从这个题目开始,把 leetcode 前 200 道题,还没有讲过的,全部讲一遍。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("暂定的目标是一周 3-5 篇题解。希望大家支持!一起进步!奥利给!")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(617),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("这是一道简单题,只需要普通的遍历就可以完成。不过会遇到一些坑,如果不注意,还是挺容易出错的。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第58题:最后一个单词的长度")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: "Hello World" \n输出: 5\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[s._v("**说明:**一个单词是指仅由字母组成、不包含任何空格字符的 "),n("strong",[s._v("最大子字符串")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("因为我们要获取的是"),n("strong",[s._v("最后一个单词的长度")]),s._v(",不难想到可以从尾开始遍历。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("题中的陷阱在于,"),n("strong",[s._v("结尾处仍然可能有空格")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以一般的解题思路为,先去掉末尾的空格,然后从尾向前开始遍历,直到遇到第一个空格处结束。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("但这里可以取一个巧,我们可以通过一个 count 来记数,"),n("strong",[s._v("从第一个不为空格的数开始记起")]),s._v("。换句话说,如果末尾处为空格,此时 count 值为 0,可以直接略过。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(618),alt:"PNG"}}),s._v(" "),n("p",[s._v("实现代码如下:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("lengthOfLastWord")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" count "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("charAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' '")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("count "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n count"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("当然,并不是说我们不能直接用 API,来进行一些“机智”的解题,大不了就是被挂。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("lengthOfLastWord")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n s "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("trim")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" start "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("lastIndexOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('" "')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("substring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("start"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("这个代码应该大家都能看懂,首先 trim 掉两边的空格,然后直接定位到最后一个单词的位置,将其截取下来获取长度。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("额。既然我们 trim 都用了,那为什么我们不直接使用 split 得到最后一个单词的长度呢?")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("lengthOfLastWord")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" words "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("split")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('" "')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("words"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" words"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("words"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("length")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("h2",{attrs:{id:"_03、函数学习"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、函数学习"}},[s._v("#")]),s._v(" 03、函数学习")]),s._v(" "),n("blockquote",[n("p",[s._v("上面的题解中用到了 trim,那 trim 除了去除两边的空格,是否还会去除其他字符呢?一起来看下 trim 的源码。")])]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("trim")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" st "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" val "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("/* avoid getfield opcode */")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("st "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("st"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' '")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n st"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("st "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' '")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n len"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("st "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("?")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("substring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("st"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("this")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("p",[s._v("可以看到,Java 中的 trim 函数除了去除空格之外,还去除了所有在 ASCII 码表中排行小于等于空格的字符。")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(619),alt:"PNG"}}),s._v(" "),n("p",[s._v("空格在 ASCII 码表中排行是 32位,可以看到 tab,换行,回车等都在 trim 的控制范围内。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])])}),[],!1,null,null,null);t.default=r.exports},617:function(s,t,a){s.exports=a.p+"assets/img/1.3cb2cf78.jpg"},618:function(s,t,a){s.exports=a.p+"assets/img/2.8946b15e.jpg"},619:function(s,t,a){s.exports=a.p+"assets/img/3.ad8c5615.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/77.d2c8e10b.js b/learning/.vuepress/dist/assets/js/77.d2c8e10b.js deleted file mode 100644 index bfa67013..00000000 --- a/learning/.vuepress/dist/assets/js/77.d2c8e10b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{1081:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("在之前的系列中,我们已经学习了"),n("strong",[s._v("二叉树的深度")]),s._v("以及"),n("strong",[s._v("DFS")]),s._v(",如果不会可以先查看之前的文章。今天我们将对其进行应用,直接看题目。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第110题:平衡二叉树")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个二叉树,判断它是否是高度平衡的二叉树。")])])])]),s._v(" "),n("p",[s._v("本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定二叉树 [3,9,20,null,null,15,7]\n\n 3\n / \\\n 9 20\n / \\\n 15 7 \n\n返回 true 。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定二叉树 [1,2,2,3,3,null,null,4,4]\n\n 1\n / \\\n 2 2\n / \\\n 3 3\n / \\\n 4 4\n \n返回 false 。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("h2",{attrs:{id:"_02、图解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、图解分析"}},[s._v("#")]),s._v(" 02、图解分析")]),s._v(" "),n("p",[s._v("首先分析题目,这道题思路很简单,我们想判断一棵树是否满足平衡二叉树,无非就是判断当前结点的两个孩子是否满足平衡,同时两个孩子的高度差是否超过1。那只要我们可以得到高度,再基于高度进行判断即可。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("我们先复习一下之前对于树高度的求解:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(645),alt:"img"}}),s._v(" "),n("p",[s._v("这里唯一要注意的是,当我们判定"),n("strong",[s._v("其中任意一个节点如果不满足平衡二叉树时,那说明整棵树已经不是一颗平衡二叉树")]),s._v(",我们可以"),n("strong",[s._v("对其进行阻断,不需要继续递归下去")]),s._v("。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("另外,需要注意的是,下面这棵并不是平衡二叉树:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(646),alt:"img"}}),s._v(" "),n("h2",{attrs:{id:"_03、代码分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、代码分析"}},[s._v("#")]),s._v(" 03、代码分析")]),s._v(" "),n("p",[s._v("根据分析,逻辑非常清晰,顺利得出代码:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBalanced")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBalanced")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBalanced")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n leftH "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n rightH "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("abs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("leftH"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("rightH"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("TreeNode"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("nil")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("maxDepth")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" a\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" b\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("abs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("a\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" a \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(647),alt:"img"}})])}),[],!1,null,null,null);t.default=r.exports},645:function(s,t,a){s.exports=a.p+"assets/img/1.f2fa777d.jpg"},646:function(s,t,a){s.exports=a.p+"assets/img/2.a57eb659.jpg"},647:function(s,t,a){s.exports=a.p+"assets/img/3.ee5b366a.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/78.f6987552.js b/learning/.vuepress/dist/assets/js/78.f6987552.js deleted file mode 100644 index 0da9072d..00000000 --- a/learning/.vuepress/dist/assets/js/78.f6987552.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{1093:function(t,_,v){"use strict";v.r(_);var s=v(3),a=Object(s.a)({},(function(){var t=this,_=t.$createElement,s=t._self._c||_;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("blockquote",[s("p",[t._v("长时间的二分估计大家也看的头晕眼花了,所以今天为大家分享一个非常有趣的概率题目。")])]),t._v(" "),s("h2",{attrs:{id:"_01、生娃的问题"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_01、生娃的问题"}},[t._v("#")]),t._v(" 01、生娃的问题")]),t._v(" "),s("blockquote",[s("p",[t._v("问:国家开放二胎的意义是什么?")]),t._v(" "),s("p",[t._v("答:大号练废了,重新开小号。")]),t._v(" "),s("p",[t._v("回:滚!")])]),t._v(" "),s("br"),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("题目:国家为了调控男女比例,制定了一个政策:新婚夫妇都必须生娃(接地气),如果生出的是男娃就不能再生了,如果生出的是女娃就必须继续生下去,直到生出第一个男娃为止(出题人牛P)。")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("问题是:若干年后,该国的男女比例会发生怎样的变化?")])])])]),t._v(" "),s("h2",{attrs:{id:"_02、题目分析"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),s("blockquote",[s("p",[t._v("“娃”字最初的意思是成熟美丽的女人。《说文解字》中对于“娃”的解释是“圜深目皃(貌)。或曰,吴楚之闲(间)谓好曰娃。从女,圭声。”“好”的本义也是美貌。在汉代,大约是最初使用“娃”这个字的时候,它的意思是“美女”,是形容成熟的女人。明以后的“娃”字的年龄降得更低。到了今天的俗语中,除了亲昵的小名,“娃”字则更多地用于婴幼儿。在我国一些地区,“娃”就是孩子的方言。")])]),t._v(" "),s("br"),t._v(" "),s("p",[t._v("其实这个问题答案是比较反直觉的:"),s("strong",[t._v("没有变化")]),t._v("。原因是因为:"),s("strong",[t._v("生男生女的概率永远都是百分之50")]),t._v("。不相信的话,你可以尝试去当一下妇产科大夫,若干年后一定可以得出这个结论。")]),t._v(" "),s("img",{staticStyle:{zoom:"67%"},attrs:{src:v(690),alt:"PNG"}}),t._v(" "),s("p",[t._v("或者我们也可以换一种思路:我们不妨假设把一大批新婚夫妇关在一个超大的屋子里,逼着他们进行一轮一轮的生孩子游戏。第一轮里,有一半的夫妇生了男娃,退出了游戏;另一半夫妇得到的是女娃,进入第二轮。在第二轮里面,又有一半由于生出男娃而退出,自然,另一半生出女娃的夫妇进入第三轮……注意到,在每一轮里,新生男娃和新生女娃都是一样多的,因此把所有轮数合在一起看,男娃的总数和女娃的总数也一定是相同的。")]),t._v(" "),s("h2",{attrs:{id:"_03、小知识"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_03、小知识"}},[t._v("#")]),t._v(" 03、小知识")]),t._v(" "),s("blockquote",[s("p",[t._v("既然科学上生男生女几率是一样的,那为什么很多国家男女比例还失衡呢?以下知识本人未核实,特此说明!")])]),t._v(" "),s("br"),t._v(" "),s("p",[t._v("1、"),s("strong",[t._v("气候变暖促使染色体活动变强")]),t._v("。孩子的性别是由染色体决定。男的有X和Y,女的只有X。随着全球气候变暖,染色体Y的活动会更加活跃,所以男宝宝出生的概率也随之升高。(我有点好奇,难道说X就不会受到温度影响???)")]),t._v(" "),s("br"),t._v(" "),s("p",[t._v("2、**身体酸碱度。**酸性体质容易疲惫,让人感觉到累。所以很多养生专家建议让身体处于碱性环境。前面这个,我觉得还是没问题的。但是养生专家同时也说:碱性环境下生孩子的几率会大一点。(这个我就搞不懂了??)")]),t._v(" "),s("img",{staticStyle:{zoom:"50%"},attrs:{src:v(691),alt:"PNG"}}),t._v(" "),s("p",[t._v("3、先有人后,才做数据统计,其他自己悟。如果悟不出来,可以看看家后面的那口井,只能说细思极恐。(并且我个人认为这是主要原因。。)")]),t._v(" "),s("img",{staticStyle:{zoom:"67%"},attrs:{src:v(692),alt:"PNG"}}),t._v(" "),s("p",[t._v("4、突然写到这里就不想写了,看到上面结论有点难受。。。就这样吧。。")]),t._v(" "),s("br"),t._v(" "),s("p",[t._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);_.default=a.exports},690:function(t,_,v){t.exports=v.p+"assets/img/1.7d598a13.jpg"},691:function(t,_,v){t.exports=v.p+"assets/img/2.fe0036fa.jpg"},692:function(t,_,v){t.exports=v.p+"assets/img/3.ff524e61.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/79.6ae32026.js b/learning/.vuepress/dist/assets/js/79.6ae32026.js deleted file mode 100644 index b2a83388..00000000 --- a/learning/.vuepress/dist/assets/js/79.6ae32026.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{1099:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天为大家分享一道本应很简单的题目,但是却因增加了特殊条件,而大幅增加了难度。话不多说,直接看题。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("该题很容易出现在各大厂的面试中,属于必须掌握的题型。")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("连续n个数的和")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("求 1 2 ... n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: n = 3 输出: 6\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: n = 9 输出: 45\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[n("strong",[s._v("限制:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("1 <= n <= 10000\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("这道题目出自《贱指offer》,因为比较有趣,就拿来分享给大家。")])]),s._v(" "),n("p",[s._v("题目上手,因为不能使用公式直接计算(公式中包含乘除法),所以考虑使用递归进行求解,但是"),n("strong",[s._v("递归中一般又需要使用if来指定返回条件(这里不允许使用if)")]),s._v(",所以没办法使用普通的递归思路。那该怎么办呢?这里我们直接上代码(本题将展示多个语言),再进行分析。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("boolean")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("p",[s._v("首先我们了解一下 && 的特性,比如有 A&&B")]),s._v(" "),n("ul",[n("li",[s._v("如果A为true,返回B的布尔值(继续往下执行)")]),s._v(" "),n("li",[s._v("如果A为false,直接返回false(相当于短路)")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("利用这一特性,我们"),n("strong",[s._v("将递归的返回条件取非然后作为 && 的第一个条件,递归主体转换为第二个条件语句")]),s._v("。我知道肯定有人又会懵圈了,所以我们绘图说明。假若这里n=3,大概就是下面这样:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(716),alt:"PNG"}}),s._v(" "),n("p",[s._v("这里还有一点要强调的就是,受制于各语言的语法规则,我们需要做一些额外的处理。比如Java,这里如果去掉前面的变量申明,就会直接报错。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(717),alt:"PNG"}}),s._v(" "),n("p",[s._v("但是如果是C 就没有这样的问题:")]),s._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//c ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[s._v("python就是下面这样:")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("//")]),s._v("py3\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" sumNums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("and")]),s._v(" n self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sumNums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("Go怎么搞?")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//go ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("plus")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("bool")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" b \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),s._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("_")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("plus")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n10"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("什么,还要我给一个PHP的?惹不起..惹不起...大佬请拿走...")]),s._v(" "),n("div",{staticClass:"language-php line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-php"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//PHP")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$n")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$n")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$n")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$this")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$n")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$n")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("h2",{attrs:{id:"_03、额外福利"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、额外福利"}},[s._v("#")]),s._v(" 03、额外福利")]),s._v(" "),n("blockquote",[n("p",[s._v("另外,我还看到这样一个解法,感觉很有趣(思想很简单)。因为不是自己写的,所以这里得额外说明,咱不能白嫖,对不?(所以你们这些白嫖的不去给我点个star嘛...)")])]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//go")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sumNums")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("math"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Pow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("float64")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(718),alt:"PNG"}})])}),[],!1,null,null,null);t.default=e.exports},716:function(s,t,a){s.exports=a.p+"assets/img/1.01bdd0e0.jpg"},717:function(s,t,a){s.exports=a.p+"assets/img/2.394d94e3.jpg"},718:function(s,t,a){s.exports=a.p+"assets/img/3.330ade79.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/8.cb530e31.js b/learning/.vuepress/dist/assets/js/8.cb530e31.js deleted file mode 100644 index 05927b8a..00000000 --- a/learning/.vuepress/dist/assets/js/8.cb530e31.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{1e3:function(t,s,_){t.exports=_.p+"assets/img/14.79bfef1d.jpg"},1001:function(t,s,_){t.exports=_.p+"assets/img/15.161e5f96.jpg"},1002:function(t,s,_){t.exports=_.p+"assets/img/16.30313cbf.jpg"},1003:function(t,s,_){t.exports=_.p+"assets/img/17.8417ebd0.jpg"},1004:function(t,s,_){t.exports=_.p+"assets/img/18.4a63b81e.jpg"},1144:function(t,s,_){"use strict";_.r(s);var v=_(3),a=Object(v.a)({},(function(){var t=this,s=t.$createElement,v=t._self._c||s;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("img",{staticStyle:{zoom:"67%"},attrs:{src:_(987),alt:"PNG"}}),t._v(" "),v("blockquote",[v("p",[t._v("今天和大家聊聊关于图的一些知识。")])]),t._v(" "),v("h2",{attrs:{id:"_01、图是什么"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_01、图是什么"}},[t._v("#")]),t._v(" 01、图是什么")]),t._v(" "),v("blockquote",[v("p",[t._v("图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("在数据结构中,图是什么呢?喏,就是这样:")]),t._v(" "),v("img",{attrs:{src:_(988),alt:"PNG"}}),t._v(" "),v("p",[t._v("Emmmm.....或者说常见一点的:")]),t._v(" "),v("img",{attrs:{src:_(989),alt:"PNG"}}),t._v(" "),v("p",[t._v("图是一个比树形关系复杂一点点,比线性关系复杂两点点的东东。")]),t._v(" "),v("br"),t._v(" "),v("ul",[v("li",[t._v("线性关系是一对一:一个前驱一个后继。")]),t._v(" "),v("li",[t._v("树形结构是一对多:一个父多个子")]),t._v(" "),v("li",[t._v("图形结构是多对多:任意两个顶点(图中的节点叫做顶点)都有可能相关,是一种多对多的关系。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("图我们一般表示为 G = (V,E)")]),t._v(" "),v("ul",[v("li",[t._v("V:代表点")]),t._v(" "),v("li",[t._v("E:代表边")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("啥意思嘞,比如就上面那个绿油油的图,就可以表示为:")]),t._v(" "),v("ul",[v("li",[t._v("V={1,2,3,4,5,6}")]),t._v(" "),v("li",[t._v("E={(1,2),(1,5),(2,3),(2,5),(3,4),(4,5),(4,6)}")])]),t._v(" "),v("h2",{attrs:{id:"_02、图的术语"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_02、图的术语"}},[t._v("#")]),t._v(" 02、图的术语")]),t._v(" "),v("blockquote",[v("p",[t._v("然后我们介绍一下图的一些术语。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("图里最基本的单元是顶点(vertex),相当于树中的节点。顶点之间的关联关系,被称为边(edge)。而边可以分配一个数值(正负都ok),这个数值就叫做权重。")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(990),alt:"PNG"}}),t._v(" "),v("center",[t._v("(数据取自真实数据.....)")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(991),alt:"PNG"}}),t._v(" "),v("p",[t._v("当然,这里值得一提的是,树也可以被当做简单的图,而链表也可以被当做简单的树。")]),t._v(" "),v("h2",{attrs:{id:"_03、无向图和有向图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_03、无向图和有向图"}},[t._v("#")]),t._v(" 03、无向图和有向图")]),t._v(" "),v("blockquote",[v("p",[t._v("有方向的图就是有向图,无方向的图就是无向图。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("**边没有方向的图称为无向图。**比如说我微信里同时加了这5个妹子,这5个妹子也都认识我。")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(992),alt:"PNG"}}),t._v(" "),v("p",[t._v("突然有一天,除了小花,其他四个妹子同时间都把我拉黑了。我的微信里能看到她们,她们却看不到我。")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(993),alt:"PNG"}}),t._v(" "),v("p",[t._v("然后嘞,无向图就变成了有向图:")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(994),alt:"PNG"}}),t._v(" "),v("h2",{attrs:{id:"_04、完全图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_04、完全图"}},[t._v("#")]),t._v(" 04、完全图")]),t._v(" "),v("blockquote",[v("p",[t._v("所有的顶点互相连接在一起,那就是完全图。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图。大概就是这样:")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(995),alt:"PNG"}}),t._v(" "),v("p",[t._v("而在有向图中,若每对顶点之间都有二条有向边相互连接,也算是完全图。")]),t._v(" "),v("h2",{attrs:{id:"_05、循环图-和-dag"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_05、循环图-和-dag"}},[t._v("#")]),t._v(" 05、循环图 和 DAG")]),t._v(" "),v("blockquote",[v("p",[t._v("所有的这些概念,都是顺利成章产生的。")])]),t._v(" "),v("br"),t._v(" "),v("p",[v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(996),alt:"PNG"}}),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(997),alt:"PNG"}})]),t._v(" "),v("p",[t._v("循环图中的循环二字,指的是"),v("strong",[t._v("起点和终点是同一节点时")]),t._v("产生的路径。所以,"),v("strong",[t._v("循环图和有向图或无向图并没有什么关系,因为都有可能产生循环")]),t._v("。有向图,那就遵循边的方向。无向图,那只要成环就行。")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(998),alt:"PNG"}}),t._v(" "),v("p",[t._v("这三个:")]),t._v(" "),v("ul",[v("li",[t._v("第一个就是无向循环图")]),t._v(" "),v("li",[t._v("第二个就是有向非循环图")]),t._v(" "),v("li",[t._v("第三个就是有向循环图")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("那第二个,更多的是被称为,有向无环图 DAG(Directed Acyclic Graph。那下面这个也是 :")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(999),alt:"PNG"}}),t._v(" "),v("p",[t._v("那上面这个像不像一棵树。。。。。所以计算机结构中的树(大多都是有向的),其实就是一个DAG。")]),t._v(" "),v("h2",{attrs:{id:"_06、加权图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_06、加权图"}},[t._v("#")]),t._v(" 06、加权图")]),t._v(" "),v("blockquote",[v("p",[t._v("用数学语言讲,设G为图,对图的每一条边e来说,都对应于一个实数W(e)(可以通俗的理解为边的“长度”,只是在数学定义中图的权可以为负数),我们把W(e)称为e的“权”。把这样的图G称为“加权图”。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("这个没啥好说的了,就是边有长度的图("),v("strong",[t._v("这个长度可以是各种含义")]),t._v(")。大部分我们接触到的图,都是加权图。")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(1e3),alt:"PNG"}}),t._v(" "),v("p",[t._v("但是这里如果细分的话,又分出来了。**顶点加权图和边加权图。**说白了,就是有人发现如果只给边加上权值(就是长度)并不够用,有时候也需要给顶点加上权值。")]),t._v(" "),v("img",{staticStyle:{zoom:"67%"},attrs:{src:_(1001),alt:"PNG"}}),t._v(" "),v("h2",{attrs:{id:"_07、连通图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_07、连通图"}},[t._v("#")]),t._v(" 07、连通图")]),t._v(" "),v("blockquote",[v("p",[t._v("在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称i和j是连通的。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("连通的图,就是连通图:")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(1002),alt:"PNG"}}),t._v(" "),v("p",[t._v("如果不通了,就是非连通图:(这是一个图)")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(1003),alt:"PNG"}}),t._v(" "),v("p",[t._v("那没有连通在一起的这两坨(或者说移动的这两坨),我们叫作"),v("strong",[t._v("岛")]),t._v("。(画外音,也许当年给联通移动起名的,就是程序员。从这里看,联通和移动本身就是对立的)")]),t._v(" "),v("img",{staticStyle:{zoom:"50%"},attrs:{src:_(1004),alt:"PNG"}}),t._v(" "),v("p",[t._v("所以,如果我们的图里包含岛,那就是非连通图。")]),t._v(" "),v("h2",{attrs:{id:"_08、稠密图和稀疏图"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_08、稠密图和稀疏图"}},[t._v("#")]),t._v(" 08、稠密图和稀疏图")]),t._v(" "),v("blockquote",[v("p",[t._v("终于出现一个有学问的。你看 连通图-非连通图,加权图-非加权图,循环图-非循环图。。。。。人家稠密,终于知道对应一个稀疏了。")])]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("如何定义稠密和稀疏?"),v("strong",[t._v("梵蒂冈也有人觉得他们的圣彼得大教堂拥挤")]),t._v(",所以稠密稀疏本身就是一个主观定义。")]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("我们可以简单的认为,稀疏图的边数远远少于完全图,反之,稠密图的边数接近于或等于完全图。")]),t._v(" "),v("br"),t._v(" "),v("p",[t._v("本文主要介绍了图的基础知识,下一章会继续讲解图算法。希望大家多多支持!周末写文不容易,求个转发,来个评论。感谢~")])],1)}),[],!1,null,null,null);s.default=a.exports},987:function(t,s,_){t.exports=_.p+"assets/img/1.309ccfa3.gif"},988:function(t,s,_){t.exports=_.p+"assets/img/2.be442deb.jpg"},989:function(t,s,_){t.exports=_.p+"assets/img/3.74675f3c.jpg"},990:function(t,s,_){t.exports=_.p+"assets/img/4.f3d885a0.jpg"},991:function(t,s,_){t.exports=_.p+"assets/img/5.404ed413.jpg"},992:function(t,s,_){t.exports=_.p+"assets/img/6.4c450ae2.jpg"},993:function(t,s,_){t.exports=_.p+"assets/img/7.c99ba323.jpg"},994:function(t,s,_){t.exports=_.p+"assets/img/8.29b9373e.jpg"},995:function(t,s,_){t.exports=_.p+"assets/img/9.360c4c9d.jpg"},996:function(t,s,_){t.exports=_.p+"assets/img/10.b3a11a41.jpg"},997:function(t,s,_){t.exports=_.p+"assets/img/11.ec2b1f7f.jpg"},998:function(t,s,_){t.exports=_.p+"assets/img/12.af85a7e4.jpg"},999:function(t,s,_){t.exports=_.p+"assets/img/13.7a6723fa.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/80.e7e8ebda.js b/learning/.vuepress/dist/assets/js/80.e7e8ebda.js deleted file mode 100644 index 3ec554ef..00000000 --- a/learning/.vuepress/dist/assets/js/80.e7e8ebda.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{1104:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("上一篇题目的难度可能对很多同学引起了不适,今天将回归一道比较简单的题目,大概耗时2-3分钟即可学习!")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("有兴趣回顾上一篇题目的:")]),s._v(" "),n("br"),s._v(" "),n("p",[n("RouterLink",{attrs:{to:"/1.8.位运算系列/learning/1.8/805.html"}},[s._v("只出现一次的数字Ⅱ(137)")])],1),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("本题比较简单哈~尽可能多的给出解法吧!")])]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第268题:缺失数字")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。")])])])]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [3,0,1]\n输出: 2\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [9,6,4,2,3,5,7,0,1]\n输出: 8\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("说明:")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("说高斯公式,估计大家听着懵逼,其实就是那个 1 2 3 ... n = (1 n) * n / 2,即:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(744),alt:"PNG"}})]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("首先求出数组的和,然后再利用公式求出前n 1项之和,最终求差值,即为缺失的值!比如下面长度为4的数组,缺失4。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(745),alt:"PNG"}}),s._v(" "),n("ul",[n("li",[s._v("2 + 3 + 1 + 5 = 11")]),s._v(" "),n("li",[s._v("(1 5) * 5 / 2=15")]),s._v(" "),n("li",[s._v("15 - 11 = 4")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("根据分析完成题解:(翻一个CPP牌子吧)")]),s._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//CPP ")]),s._v("\nclass Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n public"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("missingNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" length"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("size")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" result"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n result"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-=")]),s._v("e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" result"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("p",[s._v("时间复杂度O(N),空间复杂度O(1)")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(746),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、位运算求解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、位运算求解"}},[s._v("#")]),s._v(" 03、位运算求解")]),s._v(" "),n("blockquote",[n("p",[s._v("位运算的方式,本质和数学法一样,都是通过与无序序列抵消,然后找到缺失值。所以不能说哪个更好,都掌握最好~")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("直接使用“异或”进行求解。这个其实讲了好多次了,就是利用“"),n("strong",[s._v("两个相同的数,使用异或可以相消除")]),s._v("”的原理。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("先给一个Go语言的示例:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//Go")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("missingNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n result "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^=")]),s._v(" k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^")]),s._v(" i\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("再给一个Java的版本:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//java")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("missingNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[s._v("为了照顾各语言大爷们的情绪,我还是会尽可能的多给出几种语言示例,但是,请记住:"),n("strong",[s._v("算法思想才是最重要的。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("最后再补一个python的吧,毕竟这种语言,对于这种短短的题目,往往都可以弄出来一行代码求解的骚操作....")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#python")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" missingNumber"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=r.exports},744:function(s,t){s.exports="data:image/jpeg;base64,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"},745:function(s,t){s.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAa8AAACKCAMAAAAqozUCAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACmlBMVEX////o6Oj7+/u/v786OjpAQEA/Pz8wMDAPDw8QEBCurq4AAACPj4+8vLznx6WEYUI5JAAAABgpQWNznrXe7////+/etpRrVTkhAAAYLEJSaZS12+/eploYAABSpuf//86EGAAAVaXn////886UVSEAGEqMz/f/78aEQRhCfb3v///3x4Q5AAD/46VSAAD//96lXRg5YZStz97v7+/v386tkmNCGAAAADmMz/+MOABKeaW91+fez62MVSE5hs73///vw4T/w3sAAEJ7qr29vr29y+fvsms5gsb315QASZze///nplJapt4AAEqc2///++e9hkremkIAAHvG/////+elVQAAMIzO///OijGcRQD/25xCAABaquf///fnvoxSJAC9dQAAXa3/77VrAAAxjs7/x4SEx/+lfWtSRTlCjs4Yhs4YQXOtvpyMMAD/36VjRUJCLBgAACFSir3n+///561aAABzuvcAADG1dRj/y4xagq3W7/+UvsalimtSQSkhOFJrkrX/88Z7MAD/+/fex6WEVSHeolIAGEKEw+/Ggjn//8aEAAAAJFKMvudjkq3O3+/n172lglKEx/cYXaUhSXOl0++1eUJCQSkYOITG7/8AOIzeqmMAOITG8///9+fOz97OjjneoloAOGu13/9aGAAAGHO98/8AgsbGhkIAOHu96//enkprsu//+96lYSEYTYzO8/8hYaXe+//3+///971zAAAAdb2EOAD/26VCLCH/z4wxAABCmt5Kjs4Ydb3GgjG9dRi1aRjvunsYXa29eRgxgsYAAFKMtr3O4/dSgqWccUIAJGOt3///461CcZyUZUL/361rOAAYQXv/37XO7/+1aQD/++/OrowAGClCYXOctt5rVUIpGACcvufNrLBIAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAABalJREFUeNrtnfd3FGUUhjdls5Ar6qIrURmjooiaXdRVogYVEcUGGLvgKiau3SD2rrGhYMFeQCliL9gL2HvvUiz/iyc7sxs3G8j99nw33Jvz3p/mMAnPe79n6jdzJrFYedXE+q/aWm8rwPDA0JABDD5DQwYw+AwNGcDgMzRkAIPP0JABDD5DQwYw+AwNGcDgMzRkAIPP0JABDD5DQwYw+AwNGcDgMzRkAIPP0JABDD5DQwYw+AwNGcDgMzRkAIPP0JABDD4jqrr6eP/V0OBtRWLY8AQYvBXx+nhdH4Fl1UgoZdVYJqjv/kUUl64EGPwiqtvo8XCA9T5qMzDYNZAP+NLFgC9bDPiyxYAvWwz4ssWAL1sM+LLFgC9bDPiyxYAvWwz4ssWAL1sM+LLFgC9bDPiyxYAvWwz4ssWAL1sM+LLFgC9bDPiyxaj0UVtWI4ZIn0OFUUc0okwQfKlmVPqqWD8k+hwqDJy/bDHgyxYDvmwx4MsWA75sMeDLFgO+bDHgyxYDvmwx4MsWA75sMeDLFgO+bDHgyxbDt6/Nt9iSkiO32lqwz9Q2o5po2+22d+qzmrEcHewgyGjesfQFlJ12Zv+WX19jdokS7DpWrM/dxoWI5O57iDEKtWcLSfpKZza5r/F7Ee29T3bf/SZQ6/5CfTYfQMkD27ITDyI6+BCpseypSRNI1NehNPmwKWEdzm/Eq68jAppaQB+ZoaOOlunzGEoeGwu3jWnT+aPj6mvGcQHJ+mqn409w+u8L5dPXiSfRyaeEi6fSZP5guvQ5/rTiljBzFp3O79NtLHNnnFk4UAn6ys2ms/iHwVL59NXRSWdHi3mic0T6HHPueeeHS+kMXcDv081XnoguvCgj6av54tJguZRPX11zLik2KOartyT3rzzNvfSytKivy6+gK92blrr/aqer+BccVflKXS14/rrm2usKO7CgrzxNu/6GGwO66Wanex+Z90W7bymdybyPZaFuve326LpDjiHr647S1fy8Ox0YIu+L5u5yOlU7j+X8BUR09z1iYxmWqK/cbKJ5996XXXh/E7U+wGeIvC86OqAH+Zfz7mPZ0dmzXT70sNBYRiXqK/XIo489Xlia1EJP8I9FEuevRU20+EmhPgv11JLwntxhu9Tm63+1lByuPAR8LQto+dPyfXatoGeelWQMlq+Zs+g59g9795V6PqAXXhyMPl8ielmSMVi+5i9wmED07euVV4lWvuYWuMo+u1xumOGr3+oeR/T6G46Bq+wznXE4jqjzlcu+GS299Ta9w57w9eur+12iqS6POZz7fG/O+8WJk1Wr6QMRRlSivvK9dzyrVjtwfD9PSX7o8JCjij7TGfooJOQ+Fp5DEfXV0Vmct8594jJR49XXUoqep7iV033Lp9Qazgd81kKf8ye4tfnKfVGcn1kW0Jeb5vlXOkNffT2lWN+I9NlzGT/327bswu8C+v4HmbHsbUfw/PXjCkr+1Jad+HPgdLPq01d72Z9l4ffqNpa//BoBfnO5a1DnK/Z7sY+VfzgwPPpK/TkovmJr1o5qonXr/3K6rtHnK7Zm7d//0Lr1/zqdQfA+my0GfNliwJctBnzZYsCXLQZ82WLAly0GfNliwJctBnzZYsCXLQa+L2qLge+L2mLg+6K2GDh/2WLAly0GfNliwJctBnzZYsCXLQZ82WLAly0GfNliwJctBnzZYsCXLQZ82WLAly0GfNliwJctBnzZYsCXLQZ82WLAly0GfNliwJctBsNXXLoSYPCrwldNWTUSSlk1lgnqu3/Vb8BzQ4O3FYlhwxNg8FbE6+MbP+bWbODfK94Ern4FGB4YGjKAwWdoyAAGn6EhAxh8hoYMYPAZGjKAwWdoyAAGn6EhAxh8hoYMYPAZGjKAwWdoyAAGn6EhAxh8hoYMYPAZGjKAwWdoyAAGn6EhAxh8hoYMYAzM+A8kHTJLXh1BAQAAAABJRU5ErkJggg=="},746:function(s,t){s.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/81.65140f29.js b/learning/.vuepress/dist/assets/js/81.65140f29.js deleted file mode 100644 index c8f7f8da..00000000 --- a/learning/.vuepress/dist/assets/js/81.65140f29.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{1110:function(s,t,n){"use strict";n.r(t);var a=n(3),e=Object(a.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("blockquote",[a("p",[s._v("当然不能让你真的去修供暖器,但是如果你真的很有兴趣,可以参考下面步骤:")])]),s._v(" "),a("img",{staticStyle:{zoom:"50%"},attrs:{src:n(767),alt:"PNG"}}),s._v(" "),a("p",[s._v("今天为大家分享一道腾讯校招面试题,话不多说,一起来看题吧。")]),s._v(" "),a("h2",{attrs:{id:"_01、题目示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),a("blockquote",[a("p",[s._v("这道题的重点在于对"),a("strong",[s._v("题意的理解")]),s._v(",建议先自行思考,再看题解。")])]),s._v(" "),a("table",[a("thead",[a("tr",[a("th",[s._v("第475题:供暖器")])])]),s._v(" "),a("tbody",[a("tr",[a("td",[s._v("冬季已经来临。你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。")])])])]),s._v(" "),a("p",[a("strong",[s._v("说明:")])]),s._v(" "),a("ul",[a("li",[a("p",[s._v("给出的房屋和供暖器的数目是非负数且不会超过 25000。")])]),s._v(" "),a("li",[a("p",[s._v("给出的房屋和供暖器的位置均是非负数且不会超过10^9。")])]),s._v(" "),a("li",[a("p",[s._v("只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。")])]),s._v(" "),a("li",[a("p",[s._v("所有供暖器都遵循你的半径标准,加热的半径也一样。")]),s._v(" "),a("br")])]),s._v(" "),a("p",[a("strong",[s._v("示例 1:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入: [1,2,3],[2]\n输出: 1\n解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[a("strong",[s._v("示例 2:")])]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("输入: [1,2,3,4],[1,4]\n输出: 1\n解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("h2",{attrs:{id:"_02、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),a("blockquote",[a("p",[s._v("这道题目容易进入两个极端,要么就是没有读懂题意完全不知所云,要么就是觉得非常简单没什么可说的。")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("这个题目还是比较有趣的,解题的关键在于读懂题意:我们要对任意一个房屋供暖,要么用前面的暖气,要么用后面的暖气,两者之间取最近的,这就是距离。同时,如果要覆盖到所有的房屋,我们要选择上述距离中最大的一段,这就是最小的加热半径。")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(768),alt:"PNG"}}),s._v(" "),a("p",[s._v("当然,我们可以采用暴力题解,通过双层遍历,第一层:遍历所有的房子,第二层:遍历加热器,找出距离该房子的最小距离。但是我们其实可以通过二分搜索来优化这个过程。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("根据分析,得出代码:(再不写CPP,有读者就要给我寄刀片了)")]),s._v(" "),a("div",{staticClass:"language-c++ line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("//c++\nclass Solution {\npublic:\n int findRadius(vector& houses, vector& heaters) {\n //找到每个房屋位置所需要的最小半径的最大值\n int res = 0;\n int n = heaters.size();\n sort(heaters.begin(), heaters.end());\n for (auto house : houses)\n {\n //二分法找不小于house的第一个值\n int left = 0, right = n;\n while (left < right)\n {\n int mid = left + (right - left)/2;\n if (house > heaters[mid]) left = mid + 1;\n else right = mid;\n }\n int dist1 = (right == 0) ? INT_MAX : abs(house - heaters[right - 1]);\n int dist2 = (right == n) ? INT_MAX : abs(house - heaters[right]);\n res = max(res, min(dist1, dist2));\n }\n return res;\n }\n};\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br")])]),a("p",[s._v("这个代码逻辑还是比较简单的,不需要额外补充。另外,其实本题还可以使用滑动窗口来进行求解,但是考虑到输入规模,"),a("strong",[s._v("房屋数量有可能远远大于供暖器数量")]),s._v(",所以还是建议使用二分。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("最后还有一点要强调的就是:代码在刚开始的时候进行了一次排序。这个也是容易进入的误区,题目给的样例给人一种错觉 “提供的就是有序数组”,其实题中并没有说明,我第一次就犯了这样的错误。如果去掉排序的代码,就会报错:")]),s._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(769),alt:"PNG"}}),s._v(" "),a("h2",{attrs:{id:"_03、其他"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、其他"}},[s._v("#")]),s._v(" 03、其他")]),s._v(" "),a("blockquote",[a("p",[s._v("大家可以尝试用滑动窗口的方式来解答本题,也是很容易的。提供一个思路:首先还是保证数组"),a("strong",[s._v("有序")]),s._v(",同时维护一个双指针,记录每一个房子左边的暖气,并且让其成为下一个房子左边的起始值,最后滑动窗口即可。")])]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("今天看到很多IT行业的自媒体,都发表了 “前端大佬司徒正美去世” 的相关推文,这个行为我不做评论,说不上好或坏,因为是我的话,我不太愿意炒作去世的人。但是,换个角度,也许这样的炒作又可以为其家人带来一些体恤。“逝者已矣,生者如斯”,想说的是:这个行业还是蛮不容易的,钱一辈子挣不完,健康才是第一位,希望大家都能照顾好自己的身体,珍惜眼前人,幸福安康。")]),s._v(" "),a("br"),s._v(" "),a("p",[s._v("所以,今天的问题你学会了吗,评论区留下你的想法!")])])}),[],!1,null,null,null);t.default=e.exports},767:function(s,t,n){s.exports=n.p+"assets/img/1.6b32d5f0.jpg"},768:function(s,t,n){s.exports=n.p+"assets/img/2.48a1792a.jpg"},769:function(s,t,n){s.exports=n.p+"assets/img/3.acd93ea4.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/82.154e9eba.js b/learning/.vuepress/dist/assets/js/82.154e9eba.js deleted file mode 100644 index 365c915b..00000000 --- a/learning/.vuepress/dist/assets/js/82.154e9eba.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{1120:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天为大家分享一道非常经典的题目,"),n("strong",[s._v("猜数字")]),s._v("。话不多说,直接看题。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第299题:猜数字(Bulls and Cows)游戏")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。")])])])]),s._v(" "),n("p",[s._v("请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("请注意秘密数字和朋友的猜测数都可能含有重复数字。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: secret = "1807", guess = "7810"\n输出: "1A3B"\n解释: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: secret = "1123", guess = "0111"\n输出: "1A1B"\n解释: 朋友猜测数中的第一个 1 是公牛,第二个或第三个 1 可被视为奶牛。\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("br"),s._v(" "),n("p",[n("strong",[s._v("说明:")]),s._v(" 你可以假设秘密数字和朋友的猜测数都只包含数字,并且它们的长度永远相等。")]),s._v(" "),n("h2",{attrs:{id:"_02、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[s._v("#")]),s._v(" 02、题目图解")]),s._v(" "),n("p",[s._v("这道题,虽然被评定为“简单”,但是其实非常有趣。基本拿到题目,我们就能想到可以使用hashmap进行求解,一起来分析一下。")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("因为secret数字和guess数字长度相等,所以我们遍历secret数字。")])]),s._v(" "),n("li",[n("p",[s._v("如果当前索引两个数字相同,就将公牛数加1。")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(806),alt:"PNG"}})]),s._v(" "),n("li",[n("p",[n("strong",[s._v("如果不相同,我们将secret和guess当前索引位置处的数字通过map记录下来,统计他们出现的次数。"),n("strong",[s._v("当然,之前我们讲过。有限的map,比如数字 0-10,字母 a-z,都可以通过")]),s._v("数组")]),s._v("来进行替换,用以压缩空间。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(807),alt:"PNG"}})]),s._v(" "),n("li",[n("p",[s._v("最后,如果记录的两个map中,"),n("strong",[s._v("数字出现重叠")]),s._v("(可以通过最小值来判断),则意味着该数字在两边都出现过,就将母牛数加一(我就想说是母牛,不服来辩)")])])]),s._v(" "),n("h2",{attrs:{id:"_03、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[s._v("#")]),s._v(" 03、GO语言示例")]),s._v(" "),n("p",[s._v("根据分析,完成代码(这次翻Go的牌子):")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getHint")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("secret "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" guess "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("string")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\ta"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n\tmapS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" mapG "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" secret "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//注意:这里是获取对应数字的ASCII码")]),s._v("\n\t\ttmp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" charGuess "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" secret"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" guess"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" tmp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" guess"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\ta"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\tmapS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("tmp"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t\tmapG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("charGuess"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'0'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//找到重叠的")]),s._v("\n\t\tb "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mapS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" mapG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//strconv.Itoa : 整数转字符串")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" strconv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Itoa")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"A"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" strconv"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Itoa")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"B"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("min")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" b\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" a\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(808),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_04、奇怪的知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、奇怪的知识"}},[s._v("#")]),s._v(" 04、奇怪的知识")]),s._v(" "),n("p",[n("strong",[s._v("奶牛包不包括公牛?"),n("strong",[s._v("为了研究这个问题,我google了好一会儿。首先,国际定义,"),n("strong",[s._v("奶牛包括公牛")]),s._v("。那公奶牛能不能产奶呢?答案是")]),s._v("不能")]),s._v("。那现在就有意思了,为什么公牛不产奶,还可以被称为奶牛?这是因为公奶牛是用来交配的,他们要保证所有的母奶牛都在哺乳期,所以他们需要不停的交配。一般一个养殖场,公母的比例大约是8:100。母牛当然舒服了,挤挤奶就成。但是这些公牛,却是相当辛苦。正所谓,“吃水不忘挖井人”,如此含辛茹苦的公牛,凭什么就不能被称为奶牛呢?")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("所以,今天的问题你听明白了吗?评论区留下你的想法吧!")])])}),[],!1,null,null,null);t.default=e.exports},806:function(s,t,a){s.exports=a.p+"assets/img/1.1afc39f1.png"},807:function(s,t,a){s.exports=a.p+"assets/img/2.915bf0c2.jpg"},808:function(s,t){s.exports="data:image/jpeg;base64,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"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/83.09191e62.js b/learning/.vuepress/dist/assets/js/83.09191e62.js deleted file mode 100644 index f479651f..00000000 --- a/learning/.vuepress/dist/assets/js/83.09191e62.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{1141:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("问:程序员最讨厌康熙的哪个儿子。")]),t._v(" "),n("p",[t._v("答:胤禩。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天依旧给大家分享一个面试的高频题目。话不多,来看题吧。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目非常的高频!看起来是在考察矩阵搜索,其实和矩阵一点关系都没有....")])]),t._v(" "),n("br"),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第74题:搜索二维矩阵")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。")])])])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("该矩阵具有如下特性:")]),t._v(" "),n("ul",[n("li",[t._v("每行中的整数从左到右按升序排列。")]),t._v(" "),n("li",[t._v("每行的第一个整数大于前一行的最后一个整数。")])]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:\nmatrix = [\n [1, 3, 5, 7],\n [10, 11, 16, 20],\n [23, 30, 34, 50]\n]\ntarget = 3\n\n输出: true\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入:\nmatrix = [\n [1, 3, 5, 7],\n [10, 11, 16, 20],\n [23, 30, 34, 50]\n]\ntarget = 13\n\n输出: false\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("br"),t._v(" "),n("p",[t._v("题目本身还是比较容易理解的,没有太多额外补充。")]),t._v(" "),n("br"),t._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[t._v("#")]),t._v(" 02、题解分析")]),t._v(" "),n("blockquote",[n("p",[t._v("说白了,这就是一道考察二分的题目。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("最重要的是题中给出的两个条件:")]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[n("p",[t._v("每行的第一个整数大于前一行的最后一个整数。")])]),t._v(" "),n("li",[n("p",[t._v("每行中的整数从左到右按升序排列。")]),t._v(" "),n("br")])]),t._v(" "),n("p",[t._v("第一个条件意味着可以通过二分搜索确定哪行;")]),t._v(" "),n("p",[t._v("第二个条件意味着可以在行里进行二分搜索确定哪个元素;")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(962),alt:"PNG"}}),t._v(" "),n("p",[t._v("如何使用二分查找找到哪行呢?只需要一个上下边界,再每次拿着中间行最大的值和目标值比一比。")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//二分法找到target所在的行 ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bottom "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" bottom"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" bottom"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n bottom "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" top"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br")])]),n("p",[t._v("找到是哪行之后,就和正常的二分查找没有什么区别了:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//二分查找")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("然后再把代码拼凑到一起:")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//java")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("searchMatrix")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" row "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("row"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bottom "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" col "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" bottom"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" bottom"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("matrix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("col"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n top "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n bottom "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" top"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" r"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" target"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n l "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n r "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br")])]),n("h2",{attrs:{id:"_03、小知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、小知识"}},[t._v("#")]),t._v(" 03、小知识")]),t._v(" "),n("blockquote",[n("p",[t._v("斐波那契数列是以兔子繁殖为例子而引入的,所以又称为“兔子数列”。指的是这样一个数列:从第3项开始,每一项都等于前两项之和。")])]),t._v(" "),n("br"),t._v(" "),n("p",[n("strong",[t._v("1,1,2,3,5,8,13,21,34,55,89,144........")])]),t._v(" "),n("img",{attrs:{src:a(963),alt:"PNG"}}),t._v(" "),n("center",[t._v("(1+1=2,2+1=3,2+3=5.....21+5+8=21+13=34)")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(964),alt:"PNG"}}),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])],1)}),[],!1,null,null,null);s.default=r.exports},962:function(t,s,a){t.exports=a.p+"assets/img/1.167e9c39.jpg"},963:function(t,s,a){t.exports=a.p+"assets/img/2.d4084b13.jpg"},964:function(t,s,a){t.exports=a.p+"assets/img/3.5fcd1024.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/84.7155dbc0.js b/learning/.vuepress/dist/assets/js/84.7155dbc0.js deleted file mode 100644 index 6e10562e..00000000 --- a/learning/.vuepress/dist/assets/js/84.7155dbc0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{1035:function(t,e,n){"use strict";var a=n(411);n.n(a).a},1159:function(t,e,n){"use strict";n.r(e);var a={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,a=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||a().default)}},i=(n(1035),n(3)),r=Object(i.a)(a,void 0,void 0,!1,null,"312e2a2a",null);e.default=r.exports},411:function(t,e,n){}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/85.41496216.js b/learning/.vuepress/dist/assets/js/85.41496216.js deleted file mode 100644 index 16b0ed41..00000000 --- a/learning/.vuepress/dist/assets/js/85.41496216.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{1050:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("p",[s._v("首先还是看下题目:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("题目14: 最长公共前缀")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v('编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回""')])])])]),s._v(" "),n("p",[n("strong",[s._v("示例1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: ["flower","flow","flight"]\n输出: "fl"\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v('输入: ["dog","racecar","car"]\n输出: ""\n')])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[s._v("解释:")]),s._v(" "),n("ul",[n("li",[s._v("输入不存在公共前缀。")])]),s._v(" "),n("p",[s._v("说明:")]),s._v(" "),n("ul",[n("li",[s._v("所有输入只包含小写字母 a-z")])]),s._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[s._v("#")]),s._v(" 02、题解分析")]),s._v(" "),n("blockquote",[n("p",[s._v("我们要想寻找最长公共前缀,那么"),n("strong",[s._v("首先这个前缀是公共的,我们可以从任意一个元素中找到它")]),s._v('。假定我们现在就从一个数组中寻找最长公共前缀,那么首先,我们可以将第一个元素设置为基准元素x0。假如数组为["flow","flower","flight"],flow就是我们的基准元素x0。')])]),s._v(" "),n("p",[s._v("然后我们只需要"),n("strong",[s._v("依次将基准元素和后面的元素进行比较")]),s._v("(假定后面的元素依次为x1,x2,x3....),"),n("strong",[s._v("不断更新基准元素,直到基准元素和所有元素都满足最长公共前缀的条件")]),s._v(",就可以得到最长公共前缀。")]),s._v(" "),n("p",[s._v("具体比对过程如下:")]),s._v(" "),n("ul",[n("li",[s._v("如果strings.Index(x1,x) == 0,则直接跳过(因为此时x就是x1的最长公共前缀),对比下一个元素。(如flower和flow进行比较)")]),s._v(" "),n("li",[s._v("如果strings.Index(x1,x) != 0, 则截取掉基准元素x的最后一个元素,再次和x1进行比较,直至满足string.Index(x1,x) == 0,此时截取后的x为x和x1的最长公共前缀。(如flight和flow进行比较,依次截取出flow-flo-fl,直到fl被截取出,此时fl为flight和flow的最长公共前缀)")])]),s._v(" "),n("p",[s._v("具体过程如下图所示:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(470),alt:"PNG"}}),s._v(" "),n("blockquote",[n("p",[s._v("我们需要注意的是,在处理基准元素的过程中,"),n("strong",[s._v("如果基准元素和任一一个元素无法匹配,则说明不存在最长公共元素。")])])]),s._v(" "),n("p",[s._v("最后,我们记得处理一下临界条件。如果给定数组是空,也说明没有最长公共元素。")]),s._v(" "),n("p",[s._v("然后我们就可以开始写我们的代码了。")]),s._v(" "),n("h2",{attrs:{id:"_03、代码分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、代码分析"}},[s._v("#")]),s._v(" 03、代码分析")]),s._v(" "),n("p",[s._v("根据分析,我们很容易得到下面的题解:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//GO")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("longestCommonPrefix")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("strs "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("string")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("strs"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n prefix "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" strs"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("_")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("k "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("range")]),s._v(" strs "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" strings"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("Index")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("k"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("prefix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("prefix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n prefix "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" prefix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("prefix"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" prefix\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])]),n("p",[s._v("运行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"50%"},attrs:{src:a(471),alt:"PNG"}}),s._v(" "),n("p",[s._v("当然,我们也可以用分治法或者其他方法来解答这道题目。你可以自己尝试尝试哈。我们下期见!")])])}),[],!1,null,null,null);t.default=r.exports},470:function(s,t,a){s.exports=a.p+"assets/img/1.ca86a52f.png"},471:function(s,t,a){s.exports=a.p+"assets/img/2.f9414b45.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/86.ad8a1ea5.js b/learning/.vuepress/dist/assets/js/86.ad8a1ea5.js deleted file mode 100644 index 8645f13b..00000000 --- a/learning/.vuepress/dist/assets/js/86.ad8a1ea5.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[86],{1049:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("p",[t._v("在leetcode上,股票相关的题目有8道之多:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(468),alt:"PNG"}}),t._v(" "),n("p",[t._v("而且这一类型的题,面试时出现的频率非常的高。稍微改一改条件,就让我们防不胜防。那我们如何攻克这一类题型呢?我们从最简单的一道开始看起:")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("第122题:买卖股票的最佳时机 II")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。")])])])]),t._v(" "),n("p",[t._v("如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。")]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [7,1,5,3,6,4]\n输出: 7\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。")]),t._v(" "),n("p",[t._v("​ 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。")]),t._v(" "),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1,2,3,4,5]\n输出: 4\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。")]),t._v(" "),n("p",[t._v("​ 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。")]),t._v(" "),n("p",[t._v("​ 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。")]),t._v(" "),n("p",[n("strong",[t._v("示例 3:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [7,6,4,3,1]\n输出: 0\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。")]),t._v(" "),n("p",[t._v("题目分析:首先我们看一下题目中给出的两个条件:")]),t._v(" "),n("p",[t._v("1、"),n("strong",[t._v("不能参与多笔交易")]),t._v("。换句话讲,我们只能在手上没有股票的时候买入,也就是"),n("strong",[t._v("必须在再次购买前出售掉之前的股票")]),t._v("。像我们平时买股票时的追涨杀跌是不可以的。")]),t._v(" "),n("p",[t._v("2、"),n("strong",[t._v("尽可能地多进行交易")]),t._v("。这个非常好理解。像是黄金,一年基本上都有2-3次涨跌。我们只要把握住机会,在每一次涨跌的时候,低价卖入高价卖出,就可以使利益达到最大化。这个条件也是相当重要的,如果我们把这里变成,最多完成两笔交易,就变成另一道题。")]),t._v(" "),n("p",[t._v("现在题目搞清楚了,我们来思考一下。")]),t._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[t._v("#")]),t._v(" 02、题解分析")]),t._v(" "),n("p",[t._v("假设给定的数组为:[7, 1, 5, 3, 6, 4] 我们将其绘制成折线图,大概是下面这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(469),alt:"PNG"}}),t._v(" "),n("p",[t._v("如我们上面分析,我们要在满足1和2的条件下获取最大利益,其实就是尽可能多的低价买入高价卖出。而"),n("strong",[t._v("每一次上升波段,其实就是一次低价买入高价卖出")]),t._v("。而我们没有限制交易次数,也就是我们需要"),n("strong",[t._v("求出所有的上升波段的和")]),t._v("。上图里就是A+B,也就是(5-1)+(6-3) = 7,就是我们能获取到的最大利益。")]),t._v(" "),n("p",[t._v("其实也就是尽可能多的低价买入,高价卖出啦。")]),t._v(" "),n("h2",{attrs:{id:"_03、代码分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、代码分析"}},[t._v("#")]),t._v(" 03、代码分析")]),t._v(" "),n("p",[t._v("根据以上分析,我们很容易得到下面的题解:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//GO")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("maxProfit")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("prices "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n dp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("prices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("b "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br")])]),n("h2",{attrs:{id:"_04、题目扩展"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、题目扩展"}},[t._v("#")]),t._v(" 04、题目扩展")]),t._v(" "),n("p",[t._v("图解的方式其实在各种算法题中,屡见不鲜。而我们通过图解的方式,也可以抽丝剥茧一样,一层一层剥掉算法题目的外壳,寻找到最直观的解题思路,直捣黄....咳咳,直奔核心。那我们又如何用图解的观察方式,来对本系列的其他题目寻找到一种通用解法,来规避题目中的陷阱呢?浩仔讲算法,我们下期再见喽!")])])}),[],!1,null,null,null);s.default=r.exports},468:function(t,s,a){t.exports=a.p+"assets/img/1.d58fcd9b.jpg"},469:function(t,s,a){t.exports=a.p+"assets/img/2.6915c926.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/87.c0c21a1d.js b/learning/.vuepress/dist/assets/js/87.c0c21a1d.js deleted file mode 100644 index a89362d2..00000000 --- a/learning/.vuepress/dist/assets/js/87.c0c21a1d.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{1052:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("题目189: 旋转数组")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。")])])])]),t._v(" "),n("p",[n("strong",[t._v("示例 1:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [1,2,3,4,5,6,7] 和 k = 3\n输出: [5,6,7,1,2,3,4]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("解释:")]),t._v(" "),n("ul",[n("li",[t._v("向右旋转 1 步: [7,1,2,3,4,5,6]")]),t._v(" "),n("li",[t._v("向右旋转 2 步: [6,7,1,2,3,4,5]")]),t._v(" "),n("li",[t._v("向右旋转 3 步: [5,6,7,1,2,3,4]")])]),t._v(" "),n("p",[n("strong",[t._v("示例 2:")])]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("输入: [-1,-100,3,99] 和 k = 2\n输出: [3,99,-1,-100]\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("解释:")]),t._v(" "),n("ul",[n("li",[t._v("向右旋转 1 步: [99,-1,-100,3]")]),t._v(" "),n("li",[t._v("向右旋转 2 步: [3,99,-1,-100]")])]),t._v(" "),n("p",[t._v("说明:")]),t._v(" "),n("p",[t._v("尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。")]),t._v(" "),n("p",[n("strong",[t._v("要求使用空间复杂度为 O(1) 的 原地 算法。")])]),t._v(" "),n("br"),t._v(" "),n("blockquote",[n("p",[t._v("这道题如果不要求原地翻转的话,其实相当简单。但是原地翻转的方法却并不容易想到,我们直接看题解。")])]),t._v(" "),n("h2",{attrs:{id:"_02、题目图解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),n("blockquote",[n("p",[t._v("这个方法基于这个事实:"),n("strong",[t._v("若我们需要将数组中的元素向右移动 k 个位置, 那么 k%l (l为数组长度) 的尾部元素会被移动到头部,剩下的元素会被向后移动。")])])]),t._v(" "),n("p",[t._v("假设 我们现在数组为[1,2,3,4,5,6,7], l=7 且 k=3 。")]),t._v(" "),n("p",[t._v("如下图可以看到5,6,7 被移动到 数组头部。")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(474),alt:"PNG"}}),t._v(" "),n("p",[t._v("通过观察我们可以得到,我们要得到最终的结果。"),n("strong",[t._v("我们只需要将所有元素反转,然后反转前 k 个元素,再反转后面l-k个元素,就能得到想要的结果。")])]),t._v(" "),n("p",[t._v("如下图:")]),t._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(475),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、题目解答"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目解答"}},[t._v("#")]),t._v(" 03、题目解答")]),t._v(" "),n("p",[t._v("根据分析,我们可以得到下面的题解:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//GO")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("rotate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" k "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("k"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("reverse")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tarr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arr"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br")])])])}),[],!1,null,null,null);s.default=r.exports},474:function(t,s,a){t.exports=a.p+"assets/img/1.c67a662e.png"},475:function(t,s,a){t.exports=a.p+"assets/img/2.cbeec2a0.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/88.3c06c1dc.js b/learning/.vuepress/dist/assets/js/88.3c06c1dc.js deleted file mode 100644 index 7a9a4a87..00000000 --- a/learning/.vuepress/dist/assets/js/88.3c06c1dc.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{1051:function(s,t,a){"use strict";a.r(t);var n=a(3),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("题目27:移除元素")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。")])])])]),s._v(" "),n("p",[s._v("不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。")]),s._v(" "),n("p",[s._v("元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。")]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定 nums = [3,2,2,3], val = 3,\n函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。\n你不需要考虑数组中超出新长度后面的元素。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("blockquote",[n("p",[s._v("这道题比较简单哦,只要把握好“原地删除”这个关键字,就可以顺利求解啦!")])]),s._v(" "),n("p",[s._v("具体过程如下图所示:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(472),alt:"PNG"}}),s._v(" "),n("p",[s._v("根据分析,我们可以得到下面的题解:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//GO")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("removeElement")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" val "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" val "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n nums "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("...")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n retunums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("和这道题类似的还有LeetCode 26题,大家可以尝试自己先做一做,然后再看答案哦。")]),s._v(" "),n("h2",{attrs:{id:"_02、类似题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、类似题目分析"}},[s._v("#")]),s._v(" 02、类似题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("题目26:删除排序数组中的重复项")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次。")])])])]),s._v(" "),n("p",[s._v("返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。")]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定数组 nums = [1,1,2],\n函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。\n你不需要考虑数组中超出新长度后面的元素。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定 nums = [0,0,1,1,1,2,2,3,3,4],\n函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。\n你不需要考虑数组中超出新长度后面的元素。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("br"),s._v(" "),n("blockquote",[n("p",[s._v("这道题的重点是原地两个字,也就是要求必须在O(1)的空间下完成。并且题中已经告知了数组为有序数组,这样重复的元素一定是连在一起的,我们只需要一个一个移除重复的元素即可,具体方案方案怎么做,我们看看下面就会明白了。")])]),s._v(" "),n("p",[s._v("移除的具体过程:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(473),alt:"PNG"}}),s._v(" "),n("p",[s._v("根据分析,我们可以得到下面的题解:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//GO")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("removeDuplicates")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n nums "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("append")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("...")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("br"),s._v(" "),n("p",[s._v("好啦,关于数组原地操作的两道题就讲到这里啦,如果大家有兴趣的话,可以参考做一下LeetCode 283题(移动O),也是一样的做法哦!")])])}),[],!1,null,null,null);t.default=e.exports},472:function(s,t,a){s.exports=a.p+"assets/img/1.df8eb526.jpg"},473:function(s,t,a){s.exports=a.p+"assets/img/2.07279503.jpeg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/89.dc7b2d6f.js b/learning/.vuepress/dist/assets/js/89.dc7b2d6f.js deleted file mode 100644 index 656eca8d..00000000 --- a/learning/.vuepress/dist/assets/js/89.dc7b2d6f.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{1054:function(s,n,a){"use strict";a.r(n);var t=a(3),e=Object(t.a)({},(function(){var s=this,n=s.$createElement,t=s._self._c||n;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("blockquote",[t("p",[s._v("看到这个标题,大家肯定会觉得,不就是“加1”嘛,这么简单的问题我可以!但是就是这么简单的“加1”可是面试的高频题哦,所以我们就一起来看看吧。按照往例,我们还是从一道LeetCode题开始吧。")])]),s._v(" "),t("h2",{attrs:{id:"_01、题目分析"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),t("table",[t("thead",[t("tr",[t("th",[s._v("第66题:加一")])])]),s._v(" "),t("tbody",[t("tr",[t("td",[s._v("给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。")])])])]),s._v(" "),t("p",[s._v("最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。")]),s._v(" "),t("p",[t("strong",[s._v("示例 1:")])]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("输入: [1,2,3]\n输出: [1,2,4]\n解释: 输入数组表示数字 123。\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[t("strong",[s._v("示例 2:")])]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("输入: [4,3,2,1]\n输出: [4,3,2,2]\n解释: 输入数组表示数字 4321。\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("br"),s._v(" "),t("blockquote",[t("p",[s._v("题目分析:")])]),s._v(" "),t("p",[s._v("根据题目,我们需要加一!没错,加一很重要。因为它只是加一,所以我们会考虑到两种情况:")]),s._v(" "),t("ul",[t("li",[t("p",[t("strong",[s._v("普通情况,除9之外的数字加1。")])])]),s._v(" "),t("li",[t("p",[t("strong",[s._v("特殊情况,9加1。(因为9加1需要进位)")])])])]),s._v(" "),t("p",[s._v("所以我们只需要模拟这两种运算,就可以顺利进行求解!")]),s._v(" "),t("h2",{attrs:{id:"_02、题目图解"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[s._v("#")]),s._v(" 02、题目图解")]),s._v(" "),t("p",[s._v("假设我们的数为[1,9,9]")]),s._v(" "),t("p",[s._v("大概是下面这样:(这个图解...真的有点太简单了...)")]),s._v(" "),t("img",{staticStyle:{zoom:"80%"},attrs:{src:a(484),alt:"PNG"}}),s._v(" "),t("p",[s._v("当然,这里我们需要考虑一种特殊情况,就是类似99,或者999,我们需要进行拼接数组。具体如下图:")]),s._v(" "),t("img",{staticStyle:{zoom:"80%"},attrs:{src:a(485),alt:"PNG"}}),s._v(" "),t("p",[s._v("通过以上分析,我们最后只需要将其转换成代码即可!这样看来,“加1”是不是也不像想象中的那么简单?")]),s._v(" "),t("h2",{attrs:{id:"_03、go语言示例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[s._v("#")]),s._v(" 03、GO语言示例")]),s._v(" "),t("p",[s._v("根据以上分析,我们可以得到下面的题解:")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("func plusOne(digits []int) []int {\n var result []int\n addon := 0\n for i := len(digits) - 1;i >= 0; i-- {\n digits[i]+=addon\n addon = 0\n if i == len(digits) - 1 {\n digits[i]++\n }\n if digits[i] == 10 {\n addon = 1\n digits[i] = digits[i] % 10\n }\n }\n if addon == 1 {\n result = make([]int, 1)\n result[0] = 1\n result = append(result,digits...)\n }else{\n result = digits\n }\n return result\n}\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br")])]),t("p",[t("strong",[s._v("提示:")])]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("append(a,b...) 的含义是:将b切片中的元素追加到a中。\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])])])}),[],!1,null,null,null);n.default=e.exports},484:function(s,n,a){s.exports=a.p+"assets/img/1.7c9cc0a7.png"},485:function(s,n,a){s.exports=a.p+"assets/img/2.eac5c299.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/9.4aa8aaeb.js b/learning/.vuepress/dist/assets/js/9.4aa8aaeb.js deleted file mode 100644 index 7d6572a9..00000000 --- a/learning/.vuepress/dist/assets/js/9.4aa8aaeb.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{1135:function(t,s,a){"use strict";a.r(s);var n=a(3),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("今天为大家分享经典的荷兰国旗问题。最近折腾了挺多事情,状态有点乱糟糟的。这两天刚刚调整好,全副武装,横戈马上行!")])]),t._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),n("blockquote",[n("p",[t._v('"荷兰国旗问题" 是计算机科学中的一个经典题目,它是由Edsger Dijkstra提出的。荷兰国旗由红、白、蓝三色组成。')])]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("荷兰国旗问题:现在有若干个红、白、蓝三种颜色的球随机排列成一条直线。现在我们的任务是把这些球按照红、白、蓝排序。")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。")])])])]),t._v(" "),n("p",[t._v("大概就是这么个意思:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(904),alt:"PNG"}}),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(905),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_02、题解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题解分析"}},[t._v("#")]),t._v(" 02、题解分析")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题很经典,很高频。")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("便于分析,我们把上面的图稍微改一下:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(906),alt:"PNG"}}),t._v(" "),n("p",[t._v("改成这样:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(907),alt:"PNG"}}),t._v(" "),n("p",[t._v("好了,这道题结束了。O(∩_∩)O")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("Emmmm....不开玩笑,现在我们讲解如何完成这个过程。")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("首先,用脚趾头都可以想到的是,最终排序完成后的数组是分成三份的:")]),t._v(" "),n("br"),t._v(" "),n("center",[t._v("红-白-蓝")]),t._v(" "),n("p",[t._v("红-白-蓝")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("那总共就三个颜色,我们要区分开来,是不是最少需要两条分隔线?A线的左侧为0,右侧为1。B线的左侧为1,右侧为2。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(908),alt:"PNG"}}),t._v(" "),n("p",[t._v("但是刚开始的时候,红-白-蓝 三色是乱序的,所以此时的两条线我们是不是可以看成在最两侧?")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(909),alt:"PNG"}}),t._v(" "),n("p",[t._v("那我们剩下的是不是只需要把 A线 和 B线 间的数据维护成满足 AB 线的规则就可以了?那要维护 AB 线间的数据,是不是至少你得遍历下 AB 线间的数据?")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(910),alt:"PNG"}}),t._v(" "),n("p",[t._v("我们从 C 位置处开始,"),n("strong",[t._v("我们发现此时 C 等于0。是不是意味着,我们应把这个元素放到 A 的左侧,所以我们移动 A线。当然,我们也需要移动一下 C 的位置。(CASE-1)")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(911),alt:"PNG"}}),t._v(" "),n("p",[t._v("然后我们发现"),n("strong",[t._v("新的 C 位置处等于2,那是不是说明这个元素应该位于 B 的右侧。所以我们要把该位置的元素 和 B位置处的元素进行交换,同时移动B。(CASE-2)")])]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(912),alt:"PNG"}}),t._v(" "),n("p",[t._v("但是这里要注意,"),n("strong",[t._v("C 交换完毕后,C 不能向前移")]),t._v("。因为C指向的元素可能是属于前部的,若此时 C 前进则会导致该位置不能被交换到前部。继续向下遍历。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(913),alt:"PNG"}}),t._v(" "),n("p",[t._v("有意思了,**我们发现 C 指向位置处等于1。有没有发现这种本身就满足规则了?所以我们忽略就可以了。(CASE-3)**继续移动 C。")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(914),alt:"PNG"}}),t._v(" "),n("p",[t._v("主要就这三种 CASE,我们把剩下的图都绘制出来:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(915),alt:"PNG"}}),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(916),alt:"PNG"}}),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(917),alt:"PNG"}}),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(918),alt:"PNG"}}),t._v(" "),n("p",[n("strong",[t._v("总结一下:")])]),t._v(" "),n("br"),t._v(" "),n("ul",[n("li",[n("p",[t._v("1)若遍历到的位置为0,则说明它一定位于A的左侧。于是就和A处的元素交换,同时向右移动A和C。")])]),t._v(" "),n("li",[n("p",[t._v("2)若遍历到的位置为1,则说明它一定位于AB之间,满足规则,不需要动弹。只需向右移动C。")])]),t._v(" "),n("li",[n("p",[t._v("3)若遍历到的位置为2,则说明它一定位于B的右侧。于是就和B处的元素交换,交换后只把B向左移动,C仍然指向原位置。(因为交换后的C可能是属于A之前的,所以C仍然指向原位置)")])])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("大概就是这么一个分析过程,代码其实就很简单了(注意体会一下下面两种代码 C 的处理逻辑):")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("python版本:")]),t._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("//")]),t._v("py3 \n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" sortColors"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("None")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" \n b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("elif")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br")])]),n("p",[t._v("go版本:")]),t._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//go ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sortColors")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n a "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" \n b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" c "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("a"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \n a"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("b"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("c"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n c"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n b"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("--")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br")])]),n("p",[t._v("执行结果:")]),t._v(" "),n("img",{attrs:{src:a(919),alt:"PNG"}}),t._v(" "),n("h2",{attrs:{id:"_03、总结"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、总结"}},[t._v("#")]),t._v(" 03、总结")]),t._v(" "),n("blockquote",[n("p",[t._v("这道题目限制了最大数为 3999,时间复杂度也就被限制成了O(1)。(这句话忽略!上次的文章忘记删除了。。)")])]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("好吧,基本就是这样了。这道题目在 leetcode 上对应的是:")]),t._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(920),alt:"PNG"}}),t._v(" "),n("p",[t._v("我觉得我讲的还是可以的。大家要是认为ok的话,给我来个转发吧~感谢!")]),t._v(" "),n("br"),t._v(" "),n("p",[t._v("今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!")])],1)}),[],!1,null,null,null);s.default=r.exports},904:function(t,s){t.exports="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAUEAAADlCAMAAAD6KrVPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAh1BMVEX////8/Pzw8PC+Jia8JCTrv7/u7u6yAADgtLTYDwC6AwDlFAD5+fnpvb1zXV1yV1dzV1fIp6dmZmZ6c3PR0dF8fHzJqKh9fX319fXY2Nh7e3vNzc3W1tZda3Onu8g1fKUZa5woiLkccaKovMkmhLsAbq8UlNUboeIEdre/2uu92Okkgrm0z+CZQGbdAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAxJJREFUeNrt3dtO21AURdEkUNILhdYlvVPohZak/P/39TUoUY6lnHqtxZ7zMURbW0O2X45MZrPt5vPZnhZ7Ptv7zfEfPr2ZvpulzPTdLGWm72YpM303S5npu1nKTN/NUmb6bpYy03ezlJm+m6XM9N0sZabvZikzfTdLmem7WcpM381SZvpuljLTd7OUmb6bpcz03Sxl5qG/nZye9C9m5rOm0mK7s7PFbqfLyj3fBXmsNOYaXL4o28tl+xocJfiqaggiqA5BBNUhiKA6BBFUhyCC6hBEUB2CCKpDEEF1CE4hON/u/Hy+W23B17sgj5UQPFqQu/iwIM9BBBHMDkEE1SGIoDoEEVSHIILqEERQHYIIqkMQQXUITiHIOclhQU6a/r8gd/FhQZ6DCCKYHYIIqkMQQXUIIqgOQQTVIYigOgQRVIcgguoQnEKwfU5ycfmmbpdvO5w0XQyVawu27+J3w1XZVsP7Ds/BD8PVx6qthk8IIohgdAgiqA5BBNUhiKA6BBFUhyCC6hBEUB2CCKpDcArB9u80fS4t+KXD7zRxDXIXI4hgbggiqA5BBNUhiKA6BBFUhyCC6hBEUB2CCKpDcArB9hs5tQW/dninCcFj32mqLchzEEEEs0MQQXUIIqgOQQTVIYigOgQRVIcgguoQRFAdglMIts9JrodV3YZvHU6artX/wE5aW7B9F9/cfi/bj9ufHZ6Dv+5+/6na/d0aQQQRjA5BBNUhiKA6BBFUhyCC6hBEUB2CCKpDEEF1YwTb5yS1BTcdTpoQPPakqbYgz0EEEcwOQQTVIYigOgQRVIcgguoQRFAdggiqQxBBdQgiqG6MYPt3mv6WFnzo8DtNXIPcxQgimBuCCKpDEEF1CCKoDkEE1SGIoDoEEVSHIILqEJxCcMwbOfd16/ROU+V6vNO0fljvttkc9WHQzA7Pwdli7DfHf/j0ZvpuljLTd7OUmb6bpcz03Sxlpu9mKTN9N0uZ6btZykzfzVJm+m6WMtN3s5SZvpulzPTdLGWm72YpM303S5npu1nKTN/NUmb6bmY/8x8tLlFlMZp2egAAAABJRU5ErkJggg=="},905:function(t,s,a){t.exports=a.p+"assets/img/2.a8d7369c.jpg"},906:function(t,s,a){t.exports=a.p+"assets/img/3.c301cca8.jpg"},907:function(t,s,a){t.exports=a.p+"assets/img/4.cf1947cb.jpg"},908:function(t,s,a){t.exports=a.p+"assets/img/5.ab912240.jpg"},909:function(t,s,a){t.exports=a.p+"assets/img/6.c7796e6a.jpg"},910:function(t,s,a){t.exports=a.p+"assets/img/7.3e8ddcf3.jpg"},911:function(t,s,a){t.exports=a.p+"assets/img/8.2d128253.jpg"},912:function(t,s,a){t.exports=a.p+"assets/img/9.b5669156.jpg"},913:function(t,s,a){t.exports=a.p+"assets/img/10.75d5930d.jpg"},914:function(t,s,a){t.exports=a.p+"assets/img/11.fda608bf.jpg"},915:function(t,s,a){t.exports=a.p+"assets/img/12.0f33a19f.jpg"},916:function(t,s,a){t.exports=a.p+"assets/img/13.e94b5ec0.jpg"},917:function(t,s,a){t.exports=a.p+"assets/img/14.6eb82e3c.jpg"},918:function(t,s,a){t.exports=a.p+"assets/img/15.b59c6be6.jpg"},919:function(t,s,a){t.exports=a.p+"assets/img/16.da98407a.jpg"},920:function(t,s,a){t.exports=a.p+"assets/img/17.45ce22f3.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/90.6f49bf17.js b/learning/.vuepress/dist/assets/js/90.6f49bf17.js deleted file mode 100644 index 0f352e18..00000000 --- a/learning/.vuepress/dist/assets/js/90.6f49bf17.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[90],{1061:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"_01、概念讲解"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、概念讲解"}},[s._v("#")]),s._v(" 01、概念讲解")]),s._v(" "),n("blockquote",[n("p",[s._v("关于动态规划的资料很多,官方的定义是"),n("strong",[s._v("指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解")]),s._v("。概念中的"),n("strong",[s._v("各阶段之间的关系")]),s._v(",其实指的就是"),n("strong",[s._v("状态转移方程")]),s._v("。很多人觉得DP难(下文统称动态规划为DP),根本原因是因为"),n("strong",[s._v("DP跟一些固定形式的算法不同")]),s._v("(比如DFS、二分法、KMP),它没有实际的步骤规定第一步、第二步来做什么,所以准确来说,"),n("strong",[s._v("DP其实是一种解决问题的思想")]),s._v("。")])]),s._v(" "),n("p",[n("br"),s._v("这种思想的本质是:"),n("strong",[s._v("一个规模比较大的问题")]),s._v("(可以用两三个参数表示的问题),可以"),n("strong",[s._v("通过若干规模较小的问题的结果来得到")]),s._v("的(通常会寻求到一些特殊的计算逻辑,如求最值等),如下图所示,一个大规模的问题由若干个子问题组成。")]),s._v(" "),n("p",[n("br"),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(510),alt:"img"}})]),s._v(" "),n("p",[n("br"),s._v("那么我们应该如何通过子问题去得到大规模问题呢?这就用到了"),n("strong",[s._v("状态转移方程")]),s._v("(上面有介绍状态转移方程哦,不懂的请往上翻哦),我们一般看到的状态转移方程,基本都是这样:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("opt :指代特殊的计算逻辑,通常为 max or min。\n\ni,j,k 都是在定义DP方程中用到的参数。\n\ndp[i] = opt(dp[i-1])+1\n\ndp[i][j] = w(i,j,k) + opt(dp[i-1][k])\n\ndp[i][j] = opt(dp[i-1][j] + xi, dp[i][j-1] + yj, ...)\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[n("br"),s._v("每一个状态转移方程,多少都有一些细微的差别。这个其实很容易理解,世间的关系多了去了,不可能抽象出完全可以套用的公式。所以我个人其实"),n("strong",[s._v("不建议去死记硬背各种类型的状态转移方程")]),s._v("。但是DP的题型真的就完全无法掌握,无法归类进行分析吗?我认为不是的。在本系列中,我将由简入深为大家讲解动态规划这个主题。")]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("p",[s._v("我们先看一道最简单的DP题目,熟悉DP的概念:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("第70题:爬楼梯")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[s._v("假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? **注意:**给定 "),n("em",[s._v("n")]),s._v(" 是一个正整数。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。\n1. 1 阶 + 1 阶\n2. 2 阶\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。\n1. 1 阶 + 1 阶 + 1 阶\n2. 1 阶 + 2 阶\n3. 2 阶 + 1 阶\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("h2",{attrs:{id:"_03-、图解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03-、图解分析"}},[s._v("#")]),s._v(" 03 、图解分析")]),s._v(" "),n("p",[s._v("通过分析我们可以明确,该题可以被分解为一些包含最优子结构的子问题,即它的"),n("strong",[s._v("最优解可以从其子问题的最优解来有效地构建")]),s._v("。满足“"),n("strong",[s._v("将大问题分解为若干个规模较小的问题")]),s._v("”的条件。所我们令 "),n("strong",[s._v("dp[n] 表示能到达第 n 阶")]),s._v("的方法总数,可以得到如下状态转移方程:")]),s._v(" "),n("blockquote",[n("center",[n("b",[s._v(" dp[n]=dp[n-1]+dp[n-2] ")])])],1),s._v(" "),n("ul",[n("li",[n("p",[s._v("上 1 阶台阶:有1种方式。")])]),s._v(" "),n("li",[n("p",[s._v("上 2 阶台阶:有1+1和2两种方式。")])]),s._v(" "),n("li",[n("p",[s._v("上 3 阶台阶:到达第3阶的方法总数就是到第1阶和第2阶的方法数之和。")])]),s._v(" "),n("li",[n("p",[s._v("上 n 阶台阶,到达第n阶的方法总数就是到第 (n-1) 阶和第 (n-2) 阶的方法数之和。")])])]),s._v(" "),n("p",[n("br"),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(511),alt:"img"}})]),s._v(" "),n("h2",{attrs:{id:"_04、go语言示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、go语言示例"}},[s._v("#")]),s._v(" 04、GO语言示例")]),s._v(" "),n("p",[s._v("根据以上分析,可以得到代码如下:")]),s._v(" "),n("div",{staticClass:"language-go line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-go"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("func")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("climbStairs")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("n "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\tdp "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tdp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" dp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br")])])])}),[],!1,null,null,null);t.default=r.exports},510:function(s,t,a){s.exports=a.p+"assets/img/1.04bdda04.png"},511:function(s,t,a){s.exports=a.p+"assets/img/2.93e61020.png"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/91.d20dff4e.js b/learning/.vuepress/dist/assets/js/91.d20dff4e.js deleted file mode 100644 index a83356cd..00000000 --- a/learning/.vuepress/dist/assets/js/91.d20dff4e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{1062:function(t,s,n){"use strict";n.r(s);var a=n(3),r=Object(a.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("blockquote",[a("p",[t._v('在上一篇中,我们了解了什么是DP(动态规划),并且通过DP中的经典问题 "最大子序和",学习了'),a("strong",[t._v("状态转移方程")]),t._v("应该如何定义。在本节中,我们将沿用之前的分析方法,通过一道例题,进一步巩固之前的内容!")])]),t._v(" "),a("h2",{attrs:{id:"_01、题目分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[t._v("#")]),t._v(" 01、题目分析")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("第300题:最长上升子序列")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("给定一个无序的整数数组,找到其中最长上升子序列的长度。")])])])]),t._v(" "),a("p",[a("strong",[t._v("示例:")])]),t._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("输入: [10,9,2,5,3,7,101,18]\n输出: 4 \n解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br")])]),a("p",[t._v("说明:")]),t._v(" "),a("ul",[a("li",[t._v("可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。")])]),t._v(" "),a("blockquote",[a("p",[a("b",[t._v(" 这道题有一定难度哦!如果没有思路请回顾上一篇的学习内容!")]),t._v(" "),a("b",[t._v(" 不建议直接看题解!")])])]),t._v(" "),a("h2",{attrs:{id:"_02、题目图解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目图解"}},[t._v("#")]),t._v(" 02、题目图解")]),t._v(" "),a("p",[t._v("首先我们分析题目,要找的是"),a("strong",[t._v("最长上升子序列")]),t._v("(Longest Increasing Subsequence,LIS)。因为题目中没有要求连续,所以**LIS可能是连续的,也可能是非连续的。**同时,"),a("strong",[t._v("LIS符合可以从其子问题的最优解来进行构建")]),t._v("的条件。所以我们可以尝试用动态规划来进行求解。首先我们定义状态:")]),t._v(" "),a("br"),t._v("\n> "),a("center",[a("b",[t._v(" dp[i] :表示以nums[i]结尾的最长上升子序列的长度 ")])]),t._v(" "),a("p",[t._v("我们假定nums为[1,9,5,9,3],如下图:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(512),alt:"PNG"}}),t._v(" "),a("p",[t._v("我们分两种情况进行讨论:")]),t._v(" "),a("ul",[a("li",[t._v("如果nums[i]比前面的所有元素都小,那么dp[i]等于1(即它本身)(该结论正确)")]),t._v(" "),a("li",[t._v("如果nums[i]前面存在比他小的元素nums[j],那么dp[i]就等于dp[j]+1("),a("strong",[t._v("该结论错误,比如nums[3]>nums[0],即9>1,但是dp[3]并不等于dp[0]+1)")])])]),t._v(" "),a("br"),t._v("\n我们先初步得出上面的结论,但是我们发现了一些问题。**因为dp[i]前面比他小的元素,不一定只有一个!**\n"),a("p",[t._v("可能除了 nums[j],还包括 nums[k],nums[p] "),a("strong",[t._v("等等等等")]),t._v("。所以 dp[i] 除了可能等于 dp[j]+1,还有可能等于 dp[k]+1,dp[p]+1 "),a("strong",[t._v("等等等等")]),t._v("。所以我们求 dp[i],需要找到 dp[j]+1,dp[k]+1,dp[p]+1 "),a("strong",[t._v("等等等等")]),t._v(" 中的最大值。(我在3个等等等等上都进行了加粗,主要是因为初学者非常容易在这里摔跟斗!这里强调的目的是希望能记住这道题型!) 即:")]),t._v(" "),a("br"),t._v("\n> "),a("center",[a("b",[t._v(" dp[i] = max(dp[j]+1,dp[k]+1,dp[p]+1,.....) ")])]),t._v("\n> "),a("center",[a("b",[t._v(" 只要满足:")])]),t._v("\n> "),a("center",[a("b",[t._v(" nums[i] > nums[j] ")])]),t._v("\n> "),a("center",[a("b",[t._v(" nums[i] > nums[k] ")])]),t._v("\n> "),a("center",[a("b",[t._v(" nums[i] > nums[p] ")])]),t._v("\n> "),a("center",[a("b",[t._v(" .... ")])]),t._v(" "),a("br"),t._v("\n最后,我们只需要找到dp数组中的最大值,就是我们要找的答案。\n"),a("p",[t._v("分析完毕,我们绘制成图:")]),t._v(" "),a("img",{staticStyle:{zoom:"67%"},attrs:{src:n(513),alt:"PNG"}}),t._v(" "),a("h2",{attrs:{id:"_03、go语言示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_03、go语言示例"}},[t._v("#")]),t._v(" 03、Go语言示例")]),t._v(" "),a("p",[t._v("根据以上分析,可以得到代码如下:")]),t._v(" "),a("div",{staticClass:"language-go line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-go"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("lengthOfLIS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\tdp "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("len")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tdp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" nums"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\tdp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("j"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\tresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("func")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("max")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("int")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" a "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" b "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" a\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br")])])],1)}),[],!1,null,null,null);s.default=r.exports},512:function(t,s){t.exports="data:image/png;base64,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"},513:function(t,s,n){t.exports=n.p+"assets/img/2.c5b636d0.jpeg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/92.2b29456e.js b/learning/.vuepress/dist/assets/js/92.2b29456e.js deleted file mode 100644 index 91031734..00000000 --- a/learning/.vuepress/dist/assets/js/92.2b29456e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{1079:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("在上一节中,我们学习了"),n("strong",[s._v("二叉搜索树")]),s._v("。那我们如何"),n("strong",[s._v("在二叉搜索树中查找一个元素")]),s._v("呢?和普通的二叉树又有何不同?我们将在本节内容中进行学习!")]),s._v(" "),n("p",[s._v("下面我们仍然通过例题进行讲解。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目分析"}},[s._v("#")]),s._v(" 01、题目分析")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第700题:二叉搜索树中的搜索")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定二叉搜索树(BST)的根节点和一个值。你需要在 BST 中找到节点值等于给定值的节点。返回以该节点为根的子树。如果节点不存在,则返回 NULL 。")])])])]),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定二叉搜索树:\n\n 4\n / \\\n 2 7\n / \\\n 1 3\n \n和值: 2\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[s._v("你应该返回如下子树:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v(" 2 \n / \\ \n 1 3\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("p",[s._v("在上述示例中,如果要找的值是 5 ,但因为没有节点值为 5 ,我们应该返回 NULL 。")]),s._v(" "),n("br"),s._v(" "),n("blockquote",[n("p",[n("b",[s._v(" 本题为必须掌握! 需要非常熟悉")])]),s._v(" "),n("p",[n("b",[s._v(" 为后续题目打基础!")])])]),s._v(" "),n("h2",{attrs:{id:"_02、复习巩固"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、复习巩固"}},[s._v("#")]),s._v(" 02、复习巩固")]),s._v(" "),n("p",[s._v("先复习一下,"),n("strong",[s._v("二叉搜索树")]),s._v("(BST)的特性:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[n("strong",[s._v("若它的左子树不为空,则所有左子树上的值均小于其根节点的值")])]),s._v(" "),n("li",[n("strong",[s._v("若它的右子树不为空,则所有右子树上的值均大于其根节点得值")])]),s._v(" "),n("li",[n("strong",[s._v("它的左右子树也分别为二叉搜索树")])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("如下图就是一棵典型的BST:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(634),alt:"img"}}),s._v(" "),n("h2",{attrs:{id:"_03、图解分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、图解分析"}},[s._v("#")]),s._v(" 03、图解分析")]),s._v(" "),n("p",[s._v("假设目标值为 val,根据BST的特性,我们可以很容易想到查找过程")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("如果val小于当前结点的值,转向其左子树继续搜索;")]),s._v(" "),n("li",[s._v("如果val大于当前结点的值,转向其右子树继续搜索;")]),s._v(" "),n("li",[s._v("如果已找到,则返回当前结点。")])]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(635),alt:"img"}}),s._v(" "),n("blockquote",[n("center",[n("b",[s._v(" 很简单,不是吗?")])])],1),s._v(" "),n("h2",{attrs:{id:"_04、代码示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_04、代码示例"}},[s._v("#")]),s._v(" 04、代码示例")]),s._v(" "),n("p",[s._v("给出递归和迭代两种解法:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//递归 ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("searchBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("searchBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("searchBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//迭代")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("searchBST")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TreeNode")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("val "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" val"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n root "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" root"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br")])]),n("br"),s._v(" "),n("blockquote",[n("p",[n("b",[s._v(" 递归与迭代的区别")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("递归:重复调用函数自身实现循环称为递归;")]),s._v(" "),n("p",[s._v("迭代:利用变量的原值推出新值称为迭代,或者说迭代是函数内某段代码实现循环;")])]),s._v(" "),n("p",[n("strong",[s._v("特别说明")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("本题确实很简单!专门拉出来讲解的目的有二。第一BST确实很重要,第二希望通过重复,能加深大家对BST的印象,不至于和后面的内容出现交叉感染!")])])}),[],!1,null,null,null);t.default=r.exports},634:function(s,t,a){s.exports=a.p+"assets/img/1.03e01a60.jpg"},635:function(s,t,a){s.exports=a.p+"assets/img/2.92dd024b.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/93.d66b344b.js b/learning/.vuepress/dist/assets/js/93.d66b344b.js deleted file mode 100644 index e7f74c15..00000000 --- a/learning/.vuepress/dist/assets/js/93.d66b344b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{1089:function(t,_,v){"use strict";v.r(_);var r=v(3),e=Object(r.a)({},(function(){var t=this,_=t.$createElement,r=t._self._c||_;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("blockquote",[r("p",[t._v("本系列主要为大家带来一整套的"),r("strong",[t._v("博弈论问题(广义)")]),t._v("。因为在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,而这类问题中,很多都有博弈论的影子存在。这些公司里以FLAG(Facebook, LinkedIn, Amazon, Google)为典型,特别喜欢考察本类题型。同时,本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高分析问题的能力~")])]),t._v(" "),r("h2",{attrs:{id:"_01、辛普森悖论"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_01、辛普森悖论"}},[t._v("#")]),t._v(" 01、辛普森悖论")]),t._v(" "),r("table",[r("thead",[r("tr",[r("th",[t._v("辛普森悖论")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[t._v("羊羊医院里统计了两种胆结石治疗方案的治愈率。在统计过程中,医生将病人分为大胆结石和小胆结石两组。统计结果如下:")])])])]),t._v(" "),r("img",{staticStyle:{zoom:"50%"},attrs:{src:v(682),alt:"img"}}),t._v(" "),r("ul",[r("li",[r("p",[t._v("对于小胆结石而言,手术A的治愈率(93%)高于 手术B(87%)")])]),t._v(" "),r("li",[r("p",[t._v("对于大胆结石而言,手术A的治愈率(73%)高于 手术B(69%)")]),t._v(" "),r("center",[r("b",[t._v("羊羊医院的医生得出结论: ")])]),t._v(" "),r("center",[t._v(" 无论是对于大小胆结石,手术A的治愈率都胜过手术B。")])],1)]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("但是真的是这样吗?当然不是,我们根据样本统计出大小胆结石总计的治愈率,发现"),r("strong",[t._v("手术B(治愈率83%)其实是要高于手术A(治愈率78%)")]),t._v("。")]),t._v(" "),r("img",{staticStyle:{zoom:"50%"},attrs:{src:v(683),alt:"img"}}),t._v(" "),r("p",[t._v("为什么会出现这样的结果?这就是著名的"),r("strong",[t._v("辛普森悖论。")])]),t._v(" "),r("h2",{attrs:{id:"_02、直觉的缺陷"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_02、直觉的缺陷"}},[t._v("#")]),t._v(" 02、直觉的缺陷")]),t._v(" "),r("p",[t._v("得到了结论,我们来思考背后的东西。在我们的直觉里有这样一个逻辑:**如果一个事物的各部分都分别大于另一个事物的各部分,那么这个事物大于另一个事物。**比如:我们的直觉告诉我们如果手术A在两组病人中都更好,那么在所有病人中也应该更好。")]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("我们可以将其公式化("),r("strong",[t._v("该公式错误")]),t._v("),假设:")]),t._v(" "),r("blockquote",[r("center",[r("b",[t._v("A=A1+A2+....+An ")])]),t._v(" "),r("center",[r("b",[t._v("B=B1+B2+....+Bn")])]),t._v(" "),r("center",[r("b",[t._v("如果对i=1,2...,n都有Ai>Bi,则A>B")])])],1),t._v(" "),r("p",[t._v("乍一看,我们觉得该公式没有问题~所以这个公式也就代表了我们大部分人的思维工作。其实在这个公式中,隐藏掉了一个很重要的条件:"),r("strong",[t._v("A1、A2、An 以及 B1、B2、Bn 并不能简单的通过“加”来得到 A 或者 B")]),t._v("。这就是"),r("strong",[t._v("可加性")]),t._v("的前提。在大脑的思维过程中,因为我们很难直接看到这个前提,进而就导致了我们错误的思考!")]),t._v(" "),r("h2",{attrs:{id:"_03、辛普森悖论举例"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_03、辛普森悖论举例"}},[t._v("#")]),t._v(" 03、辛普森悖论举例")]),t._v(" "),r("p",[t._v("下面我们举一些在生活中常见的辛普森悖论例子:")]),t._v(" "),r("br"),t._v(" "),r("ul",[r("li",[t._v("打麻将的时候,把把都赢小钱,造成赢钱的假象,其实不如别人赢一把大的。")]),t._v(" "),r("li",[t._v("在苹果和安卓的竞争中,你听见身边的人都在逃离苹果,奔向安卓。但是其实苹果的流入率还是要高于安卓。(有数据证明,很经典的案例)")]),t._v(" "),r("li",[t._v("你男票,这里比别人差,那里比别人差,但是其实他真的比别的男生差吗?(这个纯属本人胡扯了..)")])]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("好啦,这篇内容就到这里了,你学会了吗?")])])}),[],!1,null,null,null);_.default=e.exports},682:function(t,_,v){t.exports=v.p+"assets/img/1.1fdf7c8b.jpg"},683:function(t,_,v){t.exports=v.p+"assets/img/2.deff66b7.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/94.86fe33e7.js b/learning/.vuepress/dist/assets/js/94.86fe33e7.js deleted file mode 100644 index 452cd67d..00000000 --- a/learning/.vuepress/dist/assets/js/94.86fe33e7.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{1095:function(t,_,v){"use strict";v.r(_);var r=v(3),a=Object(r.a)({},(function(){var t=this,_=t.$createElement,r=t._self._c||_;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("blockquote",[r("p",[t._v("这次小浩又出去面试了,面试官说想和我画圈圈(原题为狼厂校招面试题),想起来还有点羞羞的。")])]),t._v(" "),r("h2",{attrs:{id:"_01、题目示例"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[t._v("#")]),t._v(" 01、题目示例")]),t._v(" "),r("table",[r("thead",[r("tr",[r("th",[t._v("面试题:小浩出去面试时,面试官拿出一张纸,在纸上从左到右画了一百个小圆圈(手速快,没办法)接下来,面试官要求两人轮流涂掉其中一个或者两个相邻的小圆圈。")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[t._v("规定:谁涂掉最后一个小圆圈谁就赢了(换句话说,谁没有涂的了谁就输了)。问题是:小浩应该选取先涂还是后涂?如何才能有必胜策略?")])])])]),t._v(" "),r("h2",{attrs:{id:"_02、题目分析"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[t._v("#")]),t._v(" 02、题目分析")]),t._v(" "),r("blockquote",[r("p",[t._v("策梅洛定理(英语:Zermelo's theorem)是博弈论的一条定理,以恩斯特·策梅洛命名。策梅洛的论文于1913年以德文发表。表示在二人的有限游戏中,如果双方皆拥有完全的资讯,并且运气因素并不牵涉在游戏中,那先行或后行者当一必有一方有必胜/必不败的策略。")])]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("作为聪明机智的小浩(没见过这么夸自己的),最后当然是小浩获胜。获胜的方法:"),r("strong",[t._v("小浩强烈要求先手进行游戏,并且在游戏开始时,先把正中间的两个小圆圈涂黑,于是左右两边各剩下了49个圆圈")]),t._v("。像是下面这样:")]),t._v(" "),r("img",{staticStyle:{zoom:"80%"},attrs:{src:v(697),alt:"PNG"}}),t._v(" "),r("p",[t._v("然后小浩开始模仿(逼死)面试官,面试官在左边涂掉哪些圆圈,小浩就对称地在右边涂掉哪些圆圈;面试官在右边涂掉哪些圆圈, 小浩就对称地在左边涂掉哪些圆圈。因此,只要面试官有走的,小浩就一定有走的,最终保证能获胜。")]),t._v(" "),r("img",{staticStyle:{zoom:"80%"},attrs:{src:v(698),alt:"PNG"}}),t._v(" "),r("h2",{attrs:{id:"_03、改编版"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_03、改编版"}},[t._v("#")]),t._v(" 03、改编版")]),t._v(" "),r("blockquote",[r("p",[t._v("大概的思想还是一致,想办法找到可以使用 “对称大法”的时机,就可以必胜。")])]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("假若刚开始的时候,100小圆圈成环排列,游戏规则完全相同,此时如何可以让小浩有必胜策略?评论区留下你的想法吧!(为了让大家不对纯粹的算法题产生疲惫,以后采取 算法题 - 逻辑题 穿插的形式来进行讲解)")]),t._v(" "),r("h2",{attrs:{id:"_04、补充说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_04、补充说明"}},[t._v("#")]),t._v(" 04、补充说明")]),t._v(" "),r("blockquote",[r("p",[t._v("在组合博弈论里,无偏博弈是一类任意局势对于游戏双方都是平等的回合制双人游戏。这里平等的意思是所有可行的走法仅仅依赖于当前的局势,而与现在正要行动的是哪一方无关。换句话说,两个游戏者除了先后手之外毫无区别。")])]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("有兴趣的可以看一下 掰巧克力 的题目:")]),t._v(" "),r("p",[r("RouterLink",{attrs:{to:"/1.6.博弈论系列/1.9.二分法系列/907.html"}},[t._v("巧克力问题")])],1),t._v(" "),r("p",[t._v("本题,以及之前的掰巧克力题目,其实都属于博弈论中的一类问题,它们有三个共同特征:")]),t._v(" "),r("ul",[r("li",[t._v("游戏信完全透明的,每个人都知道对方可以怎么走,结果会怎么样;")]),t._v(" "),r("li",[t._v("下一步可以怎么走与下一步是谁走没有关系,换句话说我能以哪些方式操作哪些棋子,你就能以哪些方式操作哪些棋子(排除了象棋之类的游戏);")]),t._v(" "),r("li",[t._v("整个游戏必然会在有限步之内结束,谁先没走的了谁就输了。")])]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("在博弈论中,这类游戏就叫做“"),r("strong",[t._v("无偏博弈")]),t._v("”(impartial game)。"),r("strong",[t._v("在无偏博弈中,如果对于某个棋局状态,谁遇到了它谁就有办法必胜,我们就把它叫做“必胜态”;如果对于某个棋局状态,谁遇到了它对手就会有办法必胜,我们就把它叫做“必败态”")]),t._v("。")]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("一般而言,根据题意我们可以立即判断出,那些不能走的状态就是必败态了。从这些必败态出发,我们可以按照下面两条规则,自底向上地推出其他所有状态的性质:有办法走到必败态的状态就是必胜态,只能走到必胜态的状态就是必败态。最终,我们总会得出初始状态的性质:它要么是必胜的,要么是必败的。因而,我们可以证明,在一切无偏博弈中,总有一个玩家有必胜策略。")]),t._v(" "),r("br"),t._v(" "),r("p",[t._v("如果后面再给大家分享博弈论的问题,我将会讲解一些“非无偏”类型的题目,供大家学习和参考。")])])}),[],!1,null,null,null);_.default=a.exports},697:function(t,_,v){t.exports=v.p+"assets/img/1.d9839c79.jpg"},698:function(t,_,v){t.exports=v.p+"assets/img/2.652e2a32.gif"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/95.015011f3.js b/learning/.vuepress/dist/assets/js/95.015011f3.js deleted file mode 100644 index 974e6649..00000000 --- a/learning/.vuepress/dist/assets/js/95.015011f3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{1101:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("今天仍然分享一道关于位运算颇为简单的题型,同时,从明天开始将会提高难度,大家做好准备。")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("blockquote",[n("p",[s._v("这道题,大家先想一想是用什么思路进行求解?")])]),s._v(" "),n("br"),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第136题:只出现一次的数字")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。")])])])]),s._v(" "),n("p",[n("strong",[s._v("说明:")])]),s._v(" "),n("p",[s._v("你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例 1:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [2,2,1]\n输出: 1\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[n("strong",[s._v("示例 2:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("输入: [4,1,2,1,2]\n输出: 4\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("br"),s._v(" "),n("p",[n("strong",[s._v("PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。")])]),s._v(" "),n("h2",{attrs:{id:"_02、题目分析"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、题目分析"}},[s._v("#")]),s._v(" 02、题目分析")]),s._v(" "),n("blockquote",[n("p",[s._v("位运算的题目我们已经讲了好几道了,这道也不例外,也是其中一个非常典型的例子!属于必须掌握的题型。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("直接分析,"),n("strong",[s._v("我们要找只出现一次的数字,并且已知了其他的数字都只出现了两次。"),n("strong",[s._v("那么这种一听其实就应该想到需使用")]),s._v("位运算")]),s._v("来进行求解。最好的,就是在读完题目的瞬间,直接条件反射!(当然,如果你现在第一反应是想到 通过遍历统计,或者其他如使用hashmap 等方式来进行求解,那我觉得你的位运算这块,是有必要加强练习力度的。如果你第一反应,连思路都没有,那我觉得对于整个算法的能力这块,都是比较欠缺的,需要下苦功!)")]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("回到题目,如何使用位运算进行求解呢?对于任意两个数a和b,我们对其使用 “"),n("strong",[s._v("异或")]),s._v("”操作,应该有以下性质:")]),s._v(" "),n("ul",[n("li",[s._v("任意一个数和0异或仍然为自己:")])]),s._v(" "),n("center",[s._v(" a⊕0 = a ")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("任意一个数和自己异或是0:")]),s._v(" "),n("center",[s._v(" a⊕a=0 ")])],1),s._v(" "),n("li",[n("p",[s._v("异或操作满足交换律和结合律:")]),s._v(" "),n("center",[s._v(" a⊕b⊕a=(a⊕a)⊕b=0⊕b=b ")])],1)]),s._v(" "),n("p",[s._v("可能有人直接都不知道异或是什么,所以还是举个例子,比如5异或3,也就是5⊕3,也就是5^3,是下面这样:")]),s._v(" "),n("img",{staticStyle:{zoom:"67%"},attrs:{src:a(724),alt:"PNG"}}),s._v(" "),n("p",[s._v("根据分析,得出代码:(c 版本)")]),s._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//CPP")]),s._v("\nclass Solution "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\npublic"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("vector"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" ans "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" num "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ans "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^=")]),s._v(" num"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" ans"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("p",[s._v("(java版本)")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" ans "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("length"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ans "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ans "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" ans"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[s._v("(python版本)")]),s._v(" "),n("div",{staticClass:"language-python line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("//")]),s._v("py\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("singleNumber")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" List"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("int")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("range")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("len")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("^")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" nums"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("p",[s._v("执行结果:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(725),alt:"PNG"}}),s._v(" "),n("h2",{attrs:{id:"_03、题目进阶"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_03、题目进阶"}},[s._v("#")]),s._v(" 03、题目进阶")]),s._v(" "),n("blockquote",[n("p",[s._v("如果修改上面的题目,除了某个元素只出现一次,其余元素都出现了3次以上,那么该如何求解?")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("修改一个条件之后,本题的难度大幅度提升!“异或”的方式看起来似乎没办法运用在“其余数出现3次以上”的条件中。那对于这种问题又该如何求解?我这里给出几种思路,大家下去分析一下,明天我会公布这道衍化题型的解决方案:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[n("p",[s._v("思路1:使用hashmap,统计每个数字出现的次数,最后返回次数为1的数字。。。然后等待一段时间,接到很遗憾的通知。")])]),s._v(" "),n("li",[n("p",[s._v("思路2:上面的题目,对于相同的两个数,进行异或运算,我们可以进行“抵消”,那是否可以找到一种方式,来让相同的三个数进行相互抵消呢?")])]),s._v(" "),n("li",[n("p",[s._v("思路3:是不是可以通过数学的方式来进行计算?")]),s._v(" "),n("br")])]),s._v(" "),n("p",[s._v("所以,今天的问题你学会了吗?评论区留下你的想法!")])],1)}),[],!1,null,null,null);t.default=r.exports},724:function(s,t,a){s.exports=a.p+"assets/img/1.85b7a011.jpg"},725:function(s,t,a){s.exports=a.p+"assets/img/2.35fc1054.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/96.11feee99.js b/learning/.vuepress/dist/assets/js/96.11feee99.js deleted file mode 100644 index cc475fd8..00000000 --- a/learning/.vuepress/dist/assets/js/96.11feee99.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{1109:function(s,t,a){"use strict";a.r(t);var n=a(3),r=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("blockquote",[n("p",[s._v("如果你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的,所以我们需要回滚代码,那如何能找到错误的版本呢?")])]),s._v(" "),n("h2",{attrs:{id:"_01、题目示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_01、题目示例"}},[s._v("#")]),s._v(" 01、题目示例")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("第278题:第一个错误的版本")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。")])])])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。")]),s._v(" "),n("br"),s._v(" "),n("p",[n("strong",[s._v("示例:")])]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("给定 n = 5,并且 version = 4 是第一个错误的版本。\n\n调用 isBadVersion(3) -> false\n调用 isBadVersion(5) -> true\n调用 isBadVersion(4) -> true\n\n所以,4 是第一个错误的版本。\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("h2",{attrs:{id:"_02、推导过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_02、推导过程"}},[s._v("#")]),s._v(" 02、推导过程")]),s._v(" "),n("blockquote",[n("p",[s._v("这个题目还是相当简单的....我拿出来讲的原因,是因为我的开发生涯中,真的遇到过这样一件事。当时我们做一套算薪系统,算薪系统主要复杂在业务上,尤其是销售的薪资,设计到数百个变量,并且还需要考虑异动(比如说销售A是团队经理,但是下调到B团队成为一名普通销售,然后就需要根据A异动的时间,来切分他的业绩组成。同时,最恶心的是,普通销售会影响到其团队经理的薪资,团队经理又会影响到营业部经理的薪资,一直到最上层,影响到整个大区经理的薪资构成)要知道,当时我司的销售有近万名,每个月异动的人就有好几千,这是非常非常复杂的。然后我们遇到的问题,就是同一个月,有几十个团队找上来,说当月薪资计算不正确(放在个人来讲,有时候差个几十块,别人也是会来找的)最后,在一阵漫无目的的排查之后,我们采用二分的思想,通过切变量,最终切到错误的异动逻辑上,进行了修正。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("回到本题,我们当然可以一个版本一个版本的进行遍历,直到找到最终的错误版本。但是如果是这样,还讲毛线呢。。。")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("firstBadVersion")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBadVersion")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[s._v("我们自然是采用二分的思想,来进行查找。举个例子,比如我们版本号对应如下:")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(765),alt:"PNG"}}),s._v(" "),n("p",[s._v("如果中间的mid如果是错误版本,那我们就知道 mid 右侧都不可能是第一个错误的版本。那我们就令 right = mid,把下一次搜索空间变成[left, mid],然后自然我们很顺利查找到目标。")]),s._v(" "),n("img",{staticStyle:{zoom:"80%"},attrs:{src:a(766),alt:"PNG"}}),s._v(" "),n("p",[s._v("根据分析,代码如下:")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("firstBadVersion")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBadVersion")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("p",[s._v("额外补充:")]),s._v(" "),n("br"),s._v(" "),n("ul",[n("li",[s._v("请大家习惯这种返回left的写法,保持代码简洁的同时,也简化了思考过程,何乐而不为呢。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("当然,代码也可以写成下面这个样子(是不是感觉差点意思?)")]),s._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//JAVA ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Solution")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("extends")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("VersionControl")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("firstBadVersion")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" right"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" left"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("isBadVersion")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n res "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n right "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n left "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mid "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" res"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("p",[s._v("03、杂谈")]),s._v(" "),n("blockquote",[n("p",[s._v("据查,医书有服用响豆的方法,响豆就是槐树果实在夜里爆响的,这种豆一棵树上只有一个,辨认不出来。取这种豆的方法是,在槐树刚开花时,就用丝网罩在树上,以防鸟雀啄食。结果成熟后,缝制许多布囊贮存豆荚。夜里用来当枕头,没有听到声音,便扔掉。就这么轮着枕,肯定有一个囊里有爆响声。然后把这一囊的豆类又分成几个小囊装好,夜里再枕着听。听到响声再一分为二,装进囊中枕着听。这么分下去到最后只剩下两颗,再分开枕听,就找到响豆了。")])]),s._v(" "),n("br"),s._v(" "),n("p",[s._v("前三章的题目,都是比较简单的,目的是让大家对二分能有一些深层次的思考。下面我就会增大难度,为大家讲解一些,不那么容易可以直接想到使用二分法进行求解的题目,希望大家支持!")])])}),[],!1,null,null,null);t.default=r.exports},765:function(s,t,a){s.exports=a.p+"assets/img/1.e443c271.jpg"},766:function(s,t,a){s.exports=a.p+"assets/img/2.f2d22ba1.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/97.8b830a67.js b/learning/.vuepress/dist/assets/js/97.8b830a67.js deleted file mode 100644 index fe733211..00000000 --- a/learning/.vuepress/dist/assets/js/97.8b830a67.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{1025:function(t,r,a){t.exports=a.p+"assets/img/sort-0.7ce95224.png"},1026:function(t,r,a){t.exports=a.p+"assets/img/sort-1.5b9670d7.png"},1148:function(t,r,a){"use strict";a.r(r);var s=a(3),o=Object(s.a)({},(function(){var t=this,r=t.$createElement,s=t._self._c||r;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。是《数据结构与算法》中最基本的算法之一。")]),t._v(" "),s("blockquote",[s("p",[t._v("我们常说的十大排序算法为:冒泡、选择、插入、希尔、归并、快速、堆、计数、桶、基数")])]),t._v(" "),s("h2",{attrs:{id:"基本分类"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基本分类"}},[t._v("#")]),t._v(" 基本分类")]),t._v(" "),s("p",[t._v("我们常根据是否可以在线性时间内比较对其分类:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(1025),alt:"总体分类"}})]),t._v(" "),s("h2",{attrs:{id:"时间复杂度:"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#时间复杂度:"}},[t._v("#")]),t._v(" 时间复杂度:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(1026),alt:"时间复杂度"}})]),t._v(" "),s("h2",{attrs:{id:"如何记忆时间复杂度呢?"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#如何记忆时间复杂度呢?"}},[t._v("#")]),t._v(" 如何记忆时间复杂度呢?")]),t._v(" "),s("ol",[s("li",[t._v("平方阶 (O(n2)) 插入、选择、冒泡")]),t._v(" "),s("li",[t._v("线性对数阶 (O(nlog2n)) 快速、归并、堆")]),t._v(" "),s("li",[t._v("特殊的希尔 O(n^(1.3—2))")]),t._v(" "),s("li",[t._v("牛皮的线性 基数、桶、箱、计数")])]),t._v(" "),s("h2",{attrs:{id:"啥是稳定:"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#啥是稳定:"}},[t._v("#")]),t._v(" 啥是稳定:")]),t._v(" "),s("p",[t._v("稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面。"),s("br"),t._v("\n不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面。")]),t._v(" "),s("h2",{attrs:{id:"哪些稳定:"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#哪些稳定:"}},[t._v("#")]),t._v(" 哪些稳定:")]),t._v(" "),s("p",[t._v("稳定:冒泡、插入、归并和基数。\n不稳定:选择、快速、希尔、堆。")]),t._v(" "),s("p",[s("strong",[t._v("排序算法大纲")])]),t._v(" "),s("ol",[s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/1.bubbleSort.html"}},[t._v("冒泡排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/2.selectionSort.html"}},[t._v("选择排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/3.insertionSort.html"}},[t._v("插入排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/4.shellSort.html"}},[t._v("希尔排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/5.mergeSort.html"}},[t._v("归并排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/6.quickSort.html"}},[t._v("快速排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/7.heapSort.html"}},[t._v("堆排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/8.countingSort.html"}},[t._v("计数排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/9.bucketSort.html"}},[t._v("桶排序")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/2.0.排序系列/10.radixSort.html"}},[t._v("基数排序")])],1)]),t._v(" "),s("hr")])}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/98.9d1b91e1.js b/learning/.vuepress/dist/assets/js/98.9d1b91e1.js deleted file mode 100644 index 50a3c843..00000000 --- a/learning/.vuepress/dist/assets/js/98.9d1b91e1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[98],{1044:function(_,v,t){"use strict";t.r(v);var r=t(3),s=Object(r.a)({},(function(){var _=this,v=_.$createElement,r=_._self._c||v;return r("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[r("blockquote",[r("p",[_._v("我们暂停一天,我自己有个很喜欢的话,叫做 “练习 - 坚持 - 总结 - 提高”,我们已经练习了 70 天,如果不进行一些问题的总结,永远只低头看路,恐怕就会迷路。所以今儿咱们不讲算法题,而是讲一讲到底如何“解决问题”,本文"),r("strong",[_._v("非常非常非常重要")]),_._v(",是我很长一段时间的心血与积累,大家一定要耐心看完,共包含3节:")]),_._v(" "),r("ul",[r("li",[_._v("算法对个人的意义")]),_._v(" "),r("li",[_._v("解决问题的策略")]),_._v(" "),r("li",[_._v("算法问题汇总")])])]),_._v(" "),r("br"),_._v(" "),r("h2",{attrs:{id:"_01、算法对个人的意义"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_01、算法对个人的意义"}},[_._v("#")]),_._v(" 01、算法对个人的意义")]),_._v(" "),r("blockquote",[r("p",[_._v("在实际项目中,算法的使用场景有很多,如“Java8中Hashmap使用红黑树来实现”、“Redis底层使用LRU来进做淘汰策略”、“大数据领域很多问题都基于TopK”、“JS原型链里使了类似链表的成环检测”、“特别复杂的业务逻辑经常涉及到DAG”、“MySql为什么索引要用B+树”、“Oracle里的开窗函数如何实现” 等等等等,这些今天我们统统不谈。而我,更多的是想和大家聊一聊,算法对个人有什么意义?")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("市面上大部分的算法书籍,第一章介绍算法,都会给大家列一列类似上面的那些话,或者就是使用栈或队列来做一个引子,告诉大家算法很重要,你得需要去学,吧啦吧啦....但是不知道大家有没有想过这样一个问题,算法对于个人而言到底有什么意义呢?如果这个问题大家陌生,那你一定会听到有写了几年业务逻辑的老程序员,说过“我这些年从来没有用过算法,除了出去面试的时候”之类的话。其实,我这里真想说一句脏话,这些思想真的是TMD害人不浅啊。甚至我怀疑大多数说这句话本身的人,有两种:一种就是严重缺乏自信心,觉得自己一辈子都没办法学好算法了,所以就这样吧。第二种就是故意误人子弟,驱动来源于自己不会,方式采用侃大山,反正忽悠一个是一个,再来身边也没有其他这方面厉害的朋友,说完之后自己都没意识到哪里有问题,却对别人带去很不好的影响。"),r("strong",[_._v("所以如果你今天看到我的这篇文章,我希望你能记住一世,这辈子都不要说出这种类似的话来,保持对这个学科基本的尊重,哪怕多一点点匠心精神")]),_._v("。算法对个人的意义如下:")]),_._v(" "),r("br"),_._v(" "),r("ul",[r("li",[_._v("算法题目的程序规模大多都是比较小的,也就意味着切入点很小。使得每一个做题人,可以最大化的投入时间研究问题的本身。而在工作中,稍大一点的项目,基本上是没办法随意改变代码结构的,甚至还会为了整体性能牺牲程序的简洁与优雅。所以"),r("strong",[_._v("算法题是可以让你通过练习编写出好代码的最好的方式,没有之一")]),_._v("。")]),_._v(" "),r("li",[_._v("算法题目中基本不会有图形化界面,只利用文本进行输入和输出。"),r("strong",[_._v("你可以相当专注的去解决问题")]),_._v("。而在工作中,你能获得专注去研究一个问题的机会,几乎很难。想一想,假如你用JAVA写一个后台功能,其核心代码不到10行逻辑,但是MVC得占据你三分之一工作量,定义接口占据你三分之一工作量,公司假如没前端,再占据你三分之一工作量。整个这个过程,我有一个Amazon的朋友形容的很贴切,"),r("strong",[_._v("“掏粪”")]),_._v("。")]),_._v(" "),r("li",[r("strong",[_._v("预测能力的构建")]),_._v(",在大多数算法练习平台中,因为会将运算时间和内存使用状况等信息实时提供给做题人,所以做题人甚至可以一边修改代码,一边观察修改对程序产生的影响。这个是不得了的,在工作中,绝对不可能有这样的机会。而在这个过程中,做题人可以提高对逻辑结构复杂程序进行性能预测的能力,该能力将伴随其一身。")]),_._v(" "),r("li",[r("strong",[_._v("提升coding能力的最好方式")]),_._v("。假如我们打王者荣耀,你要上王者,不开排位,一直打电脑,能上的去吗?在工作中,你来回接触的就那么几个人,有几个能写出特别优秀的代码,见到了,那说明老天眷顾你,大部分人都见不到。但是在算法平台的练习中,基本上我们每一个问题,我们都能看到全世界最优秀的人提交的代码。没有对比,虽然不成伤害,却更难成为进步!只有我们去阅读别人优秀的逻辑,读懂别人思考的过程,与全世界顶尖的程序员编写代码的能力进行比较,才可以成为真正的大牛。")]),_._v(" "),r("li",[r("strong",[_._v("算法题让你难受")]),_._v("。用脚指头想一个问题,在各行各业中,想成为其行业的佼佼者,是不是一定有一个难受的过程。假如天天写CRUD,并且还得意洋洋,我用一套Generator生成只需要5分钟,其他时间就可以打打炉石,勾搭勾搭妹子。不经历一个难受的过程,如何可以进步?就连郭德纲出名之前,也在玻璃窗里被关过两天两夜。罗马不是一天建成的,但是如果不修,那就永远建不成。难受就是真理,说明你正在进步。")]),_._v(" "),r("li",[r("strong",[_._v("单测都是“骗人的”")]),_._v("。请大家不要高估工作中QA的能力(当然,也有牛逼的QA,我见过...),大部分的公司里,QA来做单测时,基本上是重新走了一遍开发者的逻辑。更有甚者,开发直接说出“我写完都已经测完了,要QA有什么用处”,其实这并不是一个段子,因为大部分QA是做不到完美的cover业务逻辑的,换句话说,也就不可能构建出完美的测试用例测出你代码的问题。但是算法不是,大部分的算法平台,都提供了实时反馈的机制,如果自己编写的代码可以得到快速,客观的意见反馈,这绝对是有如神助。就好像是你打王者,旁边有个小精灵,总是会在合适的时机告诉你,“去下路,中路没人”,“小心草丛”。那如果不被带飞,你信吗?")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("总之,"),r("strong",[_._v("正是因为算法题目中只保留了必备的要素,舍弃了其他无关紧要的部分,所以可以对每一位做题人都构建一个学习解决问题的最佳环境")]),_._v(",而在这个环境中的成长与提高,将对一个软件工程师的生涯产生深远影响,乃至一世。所以,请大家能有一颗匠心,你可以选择不去了解学习掌握算法,但是请不要耽误他人进步。山高水长,江湖路远,珍重万千,有缘再见!")]),_._v(" "),r("br"),_._v(" "),r("h2",{attrs:{id:"_02、解决问题的策略"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_02、解决问题的策略"}},[_._v("#")]),_._v(" 02、解决问题的策略")]),_._v(" "),r("blockquote",[r("p",[_._v("解决简单的问题时,直接利用已知的技术便可轻松解决问题。但是如果遇到难题,恐怕就需要用各种手段。管他是花猫野猫,抓住耗子都是好猫。在解决问题的策略构建中,我们首先要对问题和答案结构有一个直观的感受,或者说猜测。如果可以把控住当前算法的问题,具备一个什么样的形态,然后就可以把毫无头绪的事情,变得有迹可循。在这样一个过程中,一点点的积累经验,最终就可以提升自己。")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("上面说的内容,玄而又玄,那到底如何来构建策略。假如我们遇到一个问题,让我们找一个国家铁路网中,两个城市的最短路径。这种问题,大家肯定首先想到的就是使用迪杰斯特拉算法。但是如果问题变成“换乘火车次数少于N次,寻找最短路径”,这种问题将不能直接套用最短路径的算法。有时候只是改变题中条件,就可以让整个题目完全走向另一个逻辑,这就需要大家对原算法的原理和执行过程特别了解,并且熟读题意。所以这里我们抽象出两个步骤:")]),_._v(" "),r("br"),_._v(" "),r("ul",[r("li",[_._v("读题")]),_._v(" "),r("li",[_._v("重构")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("读题的目的,就是阅读并理解问题。不管是是不是算法老手,在这上面栽跟头的绝对不是一个两个,审题不清是所有人的共性(绝不是你的个人问题),人的天性就期望可以快速得到反馈,这是身体欲望导致的,和你看到漂亮的妹子下半身竖立本质没有什么区别。所以这就引出我们的解决方法 - 重构。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("什么是重构,重构其实就是一个抽象化的过程。"),r("strong",[_._v("借用我们已经掌握的数学/计算机知识,将其表达成现实世界概念")]),_._v("。大部分的现实世界概念都是比较复杂的,我们对其抽茧剥丝,保留本质,表述成易于理解的形式。而对其重构的过程,就可以决定其程序设计的方向。举一个最简单的例子,比如我们要用代码实现一个整数平方根的开方,可以选用牛顿法或者二分法,那这两种方法是如何被想到的。假如我们把问题重构成图形的表达方式,就比较容易会推出牛顿法。假如我们把问题重构成已有的知识概念,自然就可以想到二分法。而如果我们把问题抽象成公式,甚至可以通过数学法来进行解题。划重点,"),r("strong",[_._v("不同的重构方式,决定最终程序的走向")]),_._v("。")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("在重构的基础上,其实我们就可以来进行解题了。但是这里我还要对其加一个步骤,"),r("strong",[_._v("化简")]),_._v("。什么又是化简,如何化简?假如我们有一个题,我们有一个二维网格,里边有N个点,两点的距离是X坐标和Y坐标的的和。比如坐标(5,1)和(4,7)的点间距就是1+6=7。我们要找到给出的N个点距离之和最小的新点的坐标。")]),_._v(" "),r("img",{staticStyle:{zoom:"50%"},attrs:{src:t(461),alt:"PNG"}}),_._v(" "),r("p",[_._v("题目因为本身是二维的,我们写代码其实不是很好写。所以我们可以将其化简为一维。我们把每一个点的左边,通过映射的方式,分别映射到 x轴 和 y轴。然后我们把问题转化成"),r("strong",[_._v("在直线上寻找到给出点的距离之和最小的点")]),_._v("。这就是化简。万物之始,大道至简,至拙至美。生活中咱们也说透过现象看本质,放在算法里你就不会了?")]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("读题-重构-化简,下来自然就是解题了。那如何解题?这个范畴虽然很大,但也不是无迹可寻,下面两点:")]),_._v(" "),r("br"),_._v(" "),r("ul",[r("li",[_._v("基本数据结构和算法的掌握(略)")]),_._v(" "),r("li",[_._v("常见算法问题的汇总")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("基本数据结构和算法的掌握,这个自不必说,是人都知道,那么常见算法问题的汇总又是什么,我们看下一节。")]),_._v(" "),r("br"),_._v(" "),r("h2",{attrs:{id:"_03、算法问题汇总"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_03、算法问题汇总"}},[_._v("#")]),_._v(" 03、算法问题汇总")]),_._v(" "),r("blockquote",[r("p",[_._v("写算法最怕什么?当然是出错。"),r("strong",[_._v("与其重复相同的错误,不如从错误中吸取教训。与其从自己的错误中吸取教训,不如从别人的错误中学习经验")]),_._v("。总结常见的算法问题,我总不能和你去说我们需要掌握数组、链表、二叉树、Map等这些数据结构。我认为的总结,就是错误的总结。所以为了快速拔高大家的水准,我准备了以下这些错误,请一定耐心看完,反复阅读。")])]),_._v(" "),r("br"),_._v(" "),r("ul",[r("li",[r("strong",[_._v("递归,防止死循环和内存泄露")]),_._v("。由于递归需要堆栈,"),r("strong",[_._v("所以内存消耗要比非递归代码要大很多")]),_._v("。而且,如果递归深度太大,可能系统撑不住。内存会存在突然飙升的情况。如果是数据错误导致无限循环,那问题就大了。所以这方面问题在开发的时候需要注意。")]),_._v(" "),r("li",[r("strong",[_._v("访问数组越界")]),_._v(",绝大多数的数组越界,根本原因在于对定义混淆。比如定义的时候想的是“以0起始”,但是写的时候写成了“以1起始”。究其根本,数组越界的问题,其实是对区间把控的问题。")]),_._v(" "),r("li",[_._v("**区间表意不明。**大部分的语言中,数组都以0为起始元素,但是人的思维习惯于以1为起始。那为什么数组要以0为起始元素,历史原因有很多,咱不说。对咱们有用的,3个。第一,因为我们选择左闭右开区间,比如 [0,n),我们可以很容易通过 n-0 得到数组中元素个数。这点大家要形成条件发射,看到数组,明确其个数。第二,闭区间很难去表示一个空数组,不信你试试,非常难受。第三,左闭右开的区间,迭代器只需要最少的操作符。可以让代码写起来非常的舒服,STL的算法和容器中基本都是如此。")]),_._v(" "),r("li",[_._v("**差一问题(栅栏错误)。**建造一条直栅栏(即不围圈),长30米、每条栅栏柱间相隔3米,需要多少条栅栏柱? 求数组 A[i]到 A[j] 的平均值,A[i] 到 A[j] 的和应该除以多少,是 j-i+1,还是 j-i?二分法中的 while 条件,到底是用 <= 还是 < ?这些都是差一问题,这类问题如何解决。"),r("strong",[_._v("利用最小的的输入值测试代码的执行过程,长期反复,达到条件反射")]),_._v("。这个过程一定是在大量的题目练习中掌握的,如果你到目前还在纠结这个问题,请先扣心自问,是否刷过至少200道算法题。如果没有,请不要纠结,干就对了。如果有,来找我。")]),_._v(" "),r("li",[r("strong",[_._v("内存溢出问题")]),_._v("。分为两种,一种是因为运算超出变量取值范围发生的内存溢出,比如二分法中的mid,就要使用 left+(right-left)>>1。另一种就是因为代码不严谨,比如递归没有退出条件,while死循环,等等导致内存溢出。")]),_._v(" "),r("li",[_._v("**初学者定义问题。**比如统计26个字母出现的次数,初学者会用hashmap,其实这种已知值范围的,定义成数组就可以了。其他类似数字0-9,每个月的天数,都是一样的")]),_._v(" "),r("li",[_._v("**写一半忘记题意。**这个根本原因还是因为思维脉络不清晰导致的,有时候初学者还会遇到一个问题。定义一个函数,比如叫做 juge() 返回 bool 值,本来应该是判断某条件成立时返回true,但是用的时候却以为,在条件不成立的时候返回true,最终导致结果错误。")]),_._v(" "),r("li",[_._v("**变量名错误。**不管是和方法参数中的变量名称冲突,还是因为本身表意不明,最终出现赋值错误,或者编译不通过。")]),_._v(" "),r("li",[_._v("**运算优先级错误。**比如位运算,各个语言中的优先级定义是略有不同的。有时候需要加括号,有时候不需要加。")]),_._v(" "),r("li",[_._v("**特殊值的处理。**一些找规律的题目,往往在等于0,等于1的时候,规律和其他的数不同,所以这种题目,需要对这种特殊值进行特殊处理。")])]),_._v(" "),r("br"),_._v(" "),r("p",[_._v("以上就是我挑选过的一些具有代表性的错误示例(后续还会补充),同时,算法指导篇我打算出一个系列,包括算法中常用技巧,常见错误,题目常见误导 等等,都是我的珍藏。今天的文章呕心泣血,希望大家可以帮我转发,我想如果你身边有学习计算机的朋友看到,他一定会感谢你。支持我的朋友们,还没有关注的,快点来个关注。最后,山高水长,江湖路远,珍重万千,下期再见!")])])}),[],!1,null,null,null);v.default=s.exports},461:function(_,v,t){_.exports=t.p+"assets/img/1.88792000.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/99.7a4a82e9.js b/learning/.vuepress/dist/assets/js/99.7a4a82e9.js deleted file mode 100644 index aba49a43..00000000 --- a/learning/.vuepress/dist/assets/js/99.7a4a82e9.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{1047:function(v,_,r){"use strict";r.r(_);var t=r(3),o=Object(t.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("p",[v._v("今天的文章,不浪,没图。给大家加加油!")]),v._v(" "),t("img",{staticStyle:{zoom:"33%"},attrs:{src:r(467),alt:"PNG"}}),v._v(" "),t("p",[v._v("回顾过去一年,京东、知乎、美团、微博、去哪儿、滴滴等。爆出裁员的有多少,虽然最终都被官方辟谣。"),t("strong",[v._v("但是,你们懂的。")])]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("互联网寒冬之下,所有公司都勒紧裤腰带过活。那么,对于个体的你,不努力,不学习,想去大厂?凭什么。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("请大家原谅我说话的直白。2020年就目前来看,对于企业是明显的买方市场(供过于求)。"),t("strong",[v._v("而且,未来几年应该都是这样")]),v._v("。所以,大部分企业在招聘时,是要在很多优秀的人中去选出一个更优秀的人,而不是在一群普通人中选择一个优秀的人。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("毕竟,如果你不够格,可能简历都过不了。"),t("strong",[v._v("而对于应届生,如果不能多维度的获取你的信息。那么出几道难题,在没有更好的替代方案之前,目前是唯一的选择。")])]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("所以我最终很直白的告诉这位同学,刷题,你还是得刷。该记的,你还是得记。尤其如果目标本身就是一个好的offer,那更应是如此。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("但是,"),t("strong",[v._v("这样的回答其实是不负责任的")]),v._v("。虽然我考虑到给对方一点压力,很直白的回复了他。但如果放开这一切,我们为什么学算法?为什么学数据结构?")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("“面试造火箭,工作拧螺丝” ,工作四五年,别说红黑树,就连普通二叉树基本都没手写过,"),t("strong",[v._v("我知道很多人都是这个状态")]),v._v("。这种状态正常吗?"),t("strong",[v._v("正常")]),v._v("。但不写不等于不用。就算真的不用,也不等于不需要知道怎么用。")]),v._v(" "),t("br"),v._v(" "),t("p",[t("strong",[v._v("其实,很多学生学习数据结构是有问题的")]),v._v("。就这位同学而言,至少出现背代码,就是绝对错误的。数据结构的本质,在我看来是去契合一些应用场景,自然而然的产生,而不是死记硬背。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("比如说红黑树,我们需要知道这是一种常用的平衡二叉树(或者说特殊的平衡二叉树)知道其对于查找, 插入,删除的复杂度都是log(n) --- n 这里是说树中元素的个数。如果你是java栈,你可能还需要知道 hashmap 为什么选用红黑树来实现。要知道红黑树可以在一些非实时任务调度中,可以高效公平的调度任务。要知道其所有的应用,都是围绕着“平衡”二字。这才是数据结构的核心。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("至于实现的细枝末节,"),t("strong",[v._v("知道固然好,但没必要去逼着自己记忆")]),v._v("。因为,我们的职业生涯里,绝对不可能出现让你手写红黑树的节点删除的场景。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("但你需要知道为什么创造/引入它,它有什么特殊的,它满足哪些场景,又不满足哪些场景,不满足的场景又如何替代。这才是对数据结构的良好理解。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("其实,除了算法,在我看来很多别的知识也是这样。"),t("strong",[v._v("只是说算法,更容易在面试的时候去展示而已。本身而言,并没有什么特殊的。")])]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("比如学习操作系统。那我们为什么学习操作系统?难道是让我们造出来一个操作系统吗?显而易见并不是。学习操作系统是让我们了解为什么会提出OS,如果没有OS又会是什么样子。它怎么样做任务调度,怎么样做进程管理,怎么样对可用的硬件做成抽象,死锁是如何产生的,内存是怎么管理的,文件系统是如何实现的,通信是指谁与谁的通信。不是说应付了考试就算学了,而是带着脑子掌握这个东西的脉络,这才是核心。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("比如学习数据库原理,不是说让你去造一个数据库。当然你有这本事,那也ok。更多的是去了解数据库是如何来抽象数据管理的,大数据在什么场景下应运而生。学了之后,你会知道关系型数据库只是数据库中的冰山一角。你知道缓存,索引,批处理,中间件之中都是有着数据库的影子。你用 git 你会知道 .git 文件下,其实就用几个很简单的数据结构,就构建了一个数据库的雏形。你知道事务控制,其实最初只是想把事情做正确,你知道 ACID 是在保证什么。你知道数据库的整个设计中,很多时候我们是在性能和正确性中做选择。你知道除了程序员之外,还有 DBA 更加会关注高可用。你不会再觉得读写分离,主从备份多么高大上,因为你知道除了读写分离之外,还有快慢分离,异地多活,"),t("strong",[v._v("Replication 和 Failover 很多东东")]),v._v(",都是上个世纪就有了完美的理论支撑。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("比如学习计算机网络,不是说让你去死记硬背几层网络模型,都各自是什么。而是让你知道全球互联网是如何运作的,知道TCP为了保证数据可靠做了多少额外的工作,握手为什么是3次,不是456次。知道滑动窗口并不等于leetcode上的几道题。知道层与层之间是如何划分的。知道在计算机网络的基础下,还有计算机网络安全一大块基石。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("比如学习编译原理,没人让你死记硬背那些分词算法。而是去知道为什么要划分词法,语法,语义分析。知道为什么很多语言要提出中间代码这个东东。知道编译原理很多东西,其实就是 NLP 的基础,其实就是智能机器人的基础。知道在 ES 的设计中,其实也参考很多编译器的设计。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("当然,我们很可能不会完美的掌握上面所说的所有。"),t("strong",[v._v("但我们会在这个过程中,去发现自己的知识盲点,进而刻意提高")]),v._v("。而不是一直陷入“学不会-理解不了-记不住”的死循环。")]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("当然,对于要找工作的人,我们可以直接去击打一些面试痛点,更好的兼容社会。"),t("strong",[v._v("但我们面试过后,总归是要知识落地,这才能体现你的最终价值。")])]),v._v(" "),t("br"),v._v(" "),t("p",[v._v("不要说什么“面试造火箭,工作拧螺丝”,拧螺丝的人,只能一直留在位置上拧螺丝。而努力拧螺丝的人,说不定就有机会去造火箭。而那些有造火箭能力的人,他们终究会造上火箭。")])])}),[],!1,null,null,null);_.default=o.exports},467:function(v,_,r){v.exports=r.p+"assets/img/1.910339d0.jpg"}}]); \ No newline at end of file diff --git a/learning/.vuepress/dist/assets/js/app.e2b8fa5c.js b/learning/.vuepress/dist/assets/js/app.e2b8fa5c.js deleted file mode 100644 index 9e26a5d7..00000000 --- a/learning/.vuepress/dist/assets/js/app.e2b8fa5c.js +++ /dev/null @@ -1,80 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],l=e[1],c=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(12);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(7),o=n(8),i=n(36);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){t.exports=n(327)},function(t,e,n){var r=n(54),o=n(12);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(0),o=n(41).filter,i=n(53),a=n(20),s=i("filter"),l=a("filter");r({target:"Array",proto:!0,forced:!s||!l},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(141),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(7),o=n(1),i=n(5),a=Object.defineProperty,s={},l=function(t){throw t};t.exports=function(t,e){if(i(s,t))return s[t];e||(e={});var n=[][t],c=!!i(e,"ACCESSORS")&&e.ACCESSORS,u=i(e,0)?e[0]:l,f=i(e,1)?e[1]:void 0;return s[t]=!!n&&!o((function(){if(c&&!r)return!0;var t={length:-1};c?a(t,1,{enumerable:!0,get:l}):t[1]=1,n.call(t,u,f)}))}},function(t,e,n){var r=n(4),o=n(14),i=n(5),a=n(79),s=n(115),l=n(37),c=l.get,u=l.enforce,f=String(String).split("String");(t.exports=function(t,e,n,s){var l=!!s&&!!s.unsafe,c=!!s&&!!s.enumerable,p=!!s&&!!s.noTargetGet;"function"==typeof n&&("string"!=typeof e||i(n,"name")||o(n,"name",e),u(n).source=f.join("string"==typeof e?e:"")),t!==r?(l?!p&&t[e]&&(c=!0):delete t[e],c?t[e]=n:o(t,e,n)):c?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&c(this).source||s(this)}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(47);var o=n(72);function i(t){return function(t){if(Array.isArray(t))return Object(r.a)(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||Object(o.a)(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(t,e,n){var r=n(222),o=n(225);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e,n){var r=n(313),o=n(162),i=/[T ]/,a=/:/,s=/^(\d{2})$/,l=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],c=/^(\d{4})/,u=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],f=/^-(\d{2})$/,p=/^-?(\d{3})$/,d=/^-?(\d{2})-?(\d{2})$/,h=/^-?W(\d{2})$/,v=/^-?W(\d{2})-?(\d{1})$/,m=/^(\d{2}([.,]\d*)?)$/,g=/^(\d{2}):?(\d{2}([.,]\d*)?)$/,y=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,E=/([Z+-].*)$/,b=/^(Z)$/,B=/^([+-])(\d{2})$/,A=/^([+-])(\d{2}):?(\d{2})$/;function _(t,e,n){e=e||0,n=n||0;var r=new Date(0);r.setUTCFullYear(t,0,4);var o=7*e+n+1-(r.getUTCDay()||7);return r.setUTCDate(r.getUTCDate()+o),r}t.exports=function(t,e){if(o(t))return new Date(t.getTime());if("string"!=typeof t)return new Date(t);var n=(e||{}).additionalDigits;n=null==n?2:Number(n);var w=function(t){var e,n={},r=t.split(i);a.test(r[0])?(n.date=null,e=r[0]):(n.date=r[0],e=r[1]);if(e){var o=E.exec(e);o?(n.time=e.replace(o[1],""),n.timezone=o[1]):n.time=e}return n}(t),x=function(t,e){var n,r=l[e],o=u[e];if(n=c.exec(t)||o.exec(t)){var i=n[1];return{year:parseInt(i,10),restDateString:t.slice(i.length)}}if(n=s.exec(t)||r.exec(t)){var a=n[1];return{year:100*parseInt(a,10),restDateString:t.slice(a.length)}}return{year:null}}(w.date,n),k=x.year,C=function(t,e){if(null===e)return null;var n,r,o,i;if(0===t.length)return(r=new Date(0)).setUTCFullYear(e),r;if(n=f.exec(t))return r=new Date(0),o=parseInt(n[1],10)-1,r.setUTCFullYear(e,o),r;if(n=p.exec(t)){r=new Date(0);var a=parseInt(n[1],10);return r.setUTCFullYear(e,0,a),r}if(n=d.exec(t)){r=new Date(0),o=parseInt(n[1],10)-1;var s=parseInt(n[2],10);return r.setUTCFullYear(e,o,s),r}if(n=h.exec(t))return i=parseInt(n[1],10)-1,_(e,i);if(n=v.exec(t)){i=parseInt(n[1],10)-1;var l=parseInt(n[2],10)-1;return _(e,i,l)}return null}(x.restDateString,k);if(C){var S,P=C.getTime(),$=0;if(w.time&&($=function(t){var e,n,r;if(e=m.exec(t))return(n=parseFloat(e[1].replace(",",".")))%24*36e5;if(e=g.exec(t))return n=parseInt(e[1],10),r=parseFloat(e[2].replace(",",".")),n%24*36e5+6e4*r;if(e=y.exec(t)){n=parseInt(e[1],10),r=parseInt(e[2],10);var o=parseFloat(e[3].replace(",","."));return n%24*36e5+6e4*r+1e3*o}return null}(w.time)),w.timezone)S=6e4*function(t){var e,n;if(e=b.exec(t))return 0;if(e=B.exec(t))return n=60*parseInt(e[2],10),"+"===e[1]?-n:n;if(e=A.exec(t))return n=60*parseInt(e[2],10)+parseInt(e[3],10),"+"===e[1]?-n:n;return 0}(w.timezone);else{var O=P+$,T=new Date(O);S=r(T);var j=new Date(O);j.setDate(T.getDate()+1);var I=r(j)-r(T);I>0&&(S+=I)}return new Date(P+$+S)}return new Date(t)}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=n(42),a=n(109),s=n(11),l=n(16),c=n(78),u=n(2),f=n(53),p=n(20),d=f("slice"),h=p("slice",{ACCESSORS:!0,0:0,1:2}),v=u("species"),m=[].slice,g=Math.max;r({target:"Array",proto:!0,forced:!d||!h},{slice:function(t,e){var n,r,u,f=l(this),p=s(f.length),d=a(t,p),h=a(void 0===e?p:e,p);if(i(f)&&("function"!=typeof(n=f.constructor)||n!==Array&&!i(n.prototype)?o(n)&&null===(n=n[v])&&(n=void 0):n=void 0,n===Array||void 0===n))return m.call(f,d,h);for(r=new(void 0===n?Array:n)(g(h-d,0)),u=0;d]*>)/g,v=/\$([$&'`]|\d\d?)/g;r("replace",2,(function(t,e,n,r){var m=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,g=r.REPLACE_KEEPS_$0,y=m?"$":"$0";return[function(n,r){var o=l(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,o,r):e.call(String(o),n,r)},function(t,r){if(!m&&g||"string"==typeof r&&-1===r.indexOf(y)){var i=n(e,t,this,r);if(i.done)return i.value}var l=o(t),d=String(this),h="function"==typeof r;h||(r=String(r));var v=l.global;if(v){var b=l.unicode;l.lastIndex=0}for(var B=[];;){var A=u(l,d);if(null===A)break;if(B.push(A),!v)break;""===String(A[0])&&(l.lastIndex=c(d,a(l.lastIndex),b))}for(var _,w="",x=0,k=0;k=x&&(w+=d.slice(x,S)+j,x=S+C.length)}return w+d.slice(x)}];function E(t,n,r,o,a,s){var l=r+t.length,c=o.length,u=v;return void 0!==a&&(a=i(a),u=h),e.call(s,u,(function(e,i){var s;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(l);case"<":s=a[i.slice(1,-1)];break;default:var u=+i;if(0===u)return e;if(u>c){var f=d(u/10);return 0===f?e:f<=c?void 0===o[f-1]?i.charAt(1):o[f-1]+i.charAt(1):e}s=o[u-1]}return void 0===s?"":s}))}}))},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){"use strict";var r=n(0),o=n(41).map,i=n(53),a=n(20),s=i("map"),l=a("map");r({target:"Array",proto:!0,forced:!s||!l},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(7),o=n(112),i=n(36),a=n(16),s=n(35),l=n(5),c=n(113),u=Object.getOwnPropertyDescriptor;e.f=r?u:function(t,e){if(t=a(t),e=s(e,!0),c)try{return u(t,e)}catch(t){}if(l(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(6);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r,o,i,a=n(186),s=n(4),l=n(6),c=n(14),u=n(5),f=n(55),p=n(39),d=s.WeakMap;if(a){var h=new d,v=h.get,m=h.has,g=h.set;r=function(t,e){return g.call(h,t,e),e},o=function(t){return v.call(h,t)||{}},i=function(t){return m.call(h,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return c(t,y,e),e},o=function(t){return u(t,y)?t[y]:{}},i=function(t){return u(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!l(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e){t.exports=!1},function(t,e){t.exports={}},function(t,e,n){var r=n(119),o=n(4),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e,n){var r=n(187),o=n(54),i=n(13),a=n(11),s=n(110),l=[].push,c=function(t){var e=1==t,n=2==t,c=3==t,u=4==t,f=6==t,p=5==t||f;return function(d,h,v,m){for(var g,y,E=i(d),b=o(E),B=r(h,v,3),A=a(b.length),_=0,w=m||s,x=e?w(d,A):n?w(d,0):void 0;A>_;_++)if((p||_ in b)&&(y=B(g=b[_],_,E),t))if(e)x[_]=y;else if(y)switch(t){case 3:return!0;case 5:return g;case 6:return _;case 2:l.call(x,g)}else if(u)return!1;return f?-1:c||u?u:x}};t.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6)}},function(t,e,n){var r=n(34);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(18).Symbol;t.exports=r},function(t,e,n){var r=n(43),o=n(207),i=n(208),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(48);function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n3&&void 0!==arguments[3]?arguments[3]:1;if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});o>3&&console.error("[vuepress] detected a too deep nested sidebar group.");var i=e.children||[];return 0===i.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:i.map((function(e){return t(e,n,r,o+1)})),collapsable:!1!==e.collapsable}}(t,o,c)})):[]}return[]}function v(t){var e;return(t=t.map((function(t){return Object.assign({},t)}))).forEach((function(t){2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)})),t.filter((function(t){return 2===t.level}))}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}function g(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"yyyy-MM-dd hh:mm:ss";t=t.replace(/-/g,"/");var n=new Date(t);/(y+)/.test(e)&&(e=e.replace(RegExp.$1,n.getFullYear()+"").substr(4-RegExp.$1.length));var r={"M+":n.getMonth()+1,"d+":n.getDate(),"h+":n.getHours(),"m+":n.getMinutes(),"s+":n.getSeconds()};for(var o in r)if(RegExp("(".concat(o,")")).test(e)){var i=r[o]+"";e=e.replace(RegExp.$1,2===i.length?i:"0"+i)}return e}function y(t){return new Date(t.frontmatter.date).getTime()}function E(t,e){return y(e)-y(t)}},function(t,e,n){var r=n(0),o=n(4),i=n(124),a=[].slice,s=function(t){return function(e,n){var r=arguments.length>2,o=r?a.call(arguments,2):void 0;return t(r?function(){("function"==typeof e?e:Function(e)).apply(this,o)}:e,n)}};r({global:!0,bind:!0,forced:/MSIE .\./.test(i)},{setTimeout:s(o.setTimeout),setInterval:s(o.setInterval)})},function(t,e,n){var r=n(120),o=n(82).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){var r,o=n(9),i=n(191),a=n(82),s=n(39),l=n(192),c=n(114),u=n(55),f=u("IE_PROTO"),p=function(){},d=function(t){return" - - diff --git a/learning/.vuepress/dist/code-2.jpg b/learning/.vuepress/dist/code-2.jpg deleted file mode 100644 index be466d72..00000000 Binary files a/learning/.vuepress/dist/code-2.jpg and /dev/null differ diff --git a/learning/.vuepress/dist/code.jpeg b/learning/.vuepress/dist/code.jpeg deleted file mode 100644 index 14bab389..00000000 Binary files a/learning/.vuepress/dist/code.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/code.png b/learning/.vuepress/dist/code.png deleted file mode 100644 index 14bab389..00000000 Binary files a/learning/.vuepress/dist/code.png and /dev/null differ diff --git a/learning/.vuepress/dist/contact.jpeg b/learning/.vuepress/dist/contact.jpeg deleted file mode 100644 index ce2f3dbf..00000000 Binary files a/learning/.vuepress/dist/contact.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/daotu-1.png b/learning/.vuepress/dist/daotu-1.png deleted file mode 100644 index 77974f64..00000000 Binary files a/learning/.vuepress/dist/daotu-1.png and /dev/null differ diff --git a/learning/.vuepress/dist/daotu-2.png b/learning/.vuepress/dist/daotu-2.png deleted file mode 100644 index c65b7f63..00000000 Binary files a/learning/.vuepress/dist/daotu-2.png and /dev/null differ diff --git a/learning/.vuepress/dist/demo-1.png b/learning/.vuepress/dist/demo-1.png deleted file mode 100644 index c65b7f63..00000000 Binary files a/learning/.vuepress/dist/demo-1.png and /dev/null differ diff --git a/learning/.vuepress/dist/demo.png b/learning/.vuepress/dist/demo.png deleted file mode 100644 index 550093fd..00000000 Binary files a/learning/.vuepress/dist/demo.png and /dev/null differ diff --git a/learning/.vuepress/dist/index.html b/learning/.vuepress/dist/index.html deleted file mode 100644 index c1770af8..00000000 --- a/learning/.vuepress/dist/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - 奥利给 | 小浩算法 - - - - - - - -
文章修订于: 7/9/2020, 3:07:35 PM

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓

- - - diff --git a/learning/.vuepress/dist/suggest.jpeg b/learning/.vuepress/dist/suggest.jpeg deleted file mode 100644 index f4022145..00000000 Binary files a/learning/.vuepress/dist/suggest.jpeg and /dev/null differ diff --git a/learning/.vuepress/dist/tag/index.html b/learning/.vuepress/dist/tag/index.html deleted file mode 100644 index e37f486a..00000000 --- a/learning/.vuepress/dist/tag/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Tags | 小浩算法 - - - - - - - -

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓

- - - diff --git a/learning/.vuepress/dist/timeline/index.html b/learning/.vuepress/dist/timeline/index.html deleted file mode 100644 index 58ae3b6f..00000000 --- a/learning/.vuepress/dist/timeline/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Timeline | 小浩算法 - - - - - - - -

公告

🐳 扫码回复【进群】🐳
🎉 加入每日刷题群 🎉
🍓 下载高清《图解算法》🍓

- - - diff --git a/learning/.vuepress/nohup.out b/learning/.vuepress/nohup.out deleted file mode 100644 index 289e118c..00000000 --- a/learning/.vuepress/nohup.out +++ /dev/null @@ -1,34 +0,0 @@ -Usage: hexo - -Commands: - help Get help on a command. - init Create a new Hexo folder. - version Display version information. - -Global Options: - --config Specify config file instead of using _config.yml - --cwd Specify the CWD - --debug Display all verbose messages in the terminal - --draft Display draft posts - --safe Disable all plugins and scripts - --silent Hide output on console - -For more help, you can use 'hexo help [command]' for the detailed information -or you can check the docs: http://hexo.io/docs/ -Usage: hexo - -Commands: - help Get help on a command. - init Create a new Hexo folder. - version Display version information. - -Global Options: - --config Specify config file instead of using _config.yml - --cwd Specify the CWD - --debug Display all verbose messages in the terminal - --draft Display draft posts - --safe Disable all plugins and scripts - --silent Hide output on console - -For more help, you can use 'hexo help [command]' for the detailed information -or you can check the docs: http://hexo.io/docs/ diff --git a/lib/Notification.js b/lib/Notification.js deleted file mode 100644 index 3f1ae06d..00000000 --- a/lib/Notification.js +++ /dev/null @@ -1,17 +0,0 @@ -const path = require("path"); -module.exports = { - enhanceAppFiles: [ - path.resolve(__dirname, 'enhanceAppFile.js') - ], - - globalUIComponents: ['Notification'], - async ready() { - console.log('ready') - }, - async generated(pagePaths) { - console.log('generated') - }, - updated() { - console.log('updated') - } -} diff --git a/lib/Notification.vue b/lib/Notification.vue deleted file mode 100644 index 20e9bf22..00000000 --- a/lib/Notification.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - \ No newline at end of file diff --git a/lib/autobar.js b/lib/autobar.js deleted file mode 100644 index 22d365fa..00000000 --- a/lib/autobar.js +++ /dev/null @@ -1,306 +0,0 @@ -const sortBy = require("lodash.sortby"); -const glob = require("glob"); -const markdownIt = require("markdown-it"); -const meta = require("markdown-it-meta"); -const {lstatSync, readdirSync, readFileSync, existsSync} = require("fs"); -const {join, normalize, sep} = require("path"); -const startCase = require("lodash.startcase"); -const escapeRegExp = require("lodash.escaperegexp"); -const slugify = require('transliteration').slugify; - -const isDirectory = source => lstatSync(source).isDirectory(); -const getDirectories = source => - readdirSync(source).filter(name => !(name === ".vuepress") && isDirectory(join(source, name))); - -function getName(dir, {navPrefix, stripNumbers} = {}) { - let name = dir.split(sep).pop(); - const argsIndex = name.lastIndexOf("--"); - if (argsIndex > -1) { - name = name.substring(0, argsIndex); - } - - if (navPrefix) { - // "nav.001.xyz" or "nav-001.xyz" or "nav_001.xyz" or "nav 001.xyz" -> "nav" - const pattern = new RegExp(`^${escapeRegExp(navPrefix)}[.-_ ]?`); - name = name.replace(pattern, ""); - } - if (stripNumbers) { - // "001.guide" or "001-guide" or "001_guide" or "001 guide" -> "guide" - // replace - name = name.replace(/^\d+[.\-_ ]?/, "").replace(/^\d+[.\-_ ]?/, ""); - } - return startCase(name); -} - -// Load all MD files in a specified directory and order by metadata 'order' value -const getChildren = function (parent_path, dir, recursive = true) { - // CREDITS: https://github.com/benjivm (from: https://github.com/vuejs/vuepress/issues/613#issuecomment-495751473) - parent_path = normalize(parent_path); - parent_path = parent_path.endsWith(sep) ? parent_path.slice(0, -1) : parent_path; // Remove last / if exists. - const pattern = recursive ? "/**/*.md" : "/*.md"; - files = glob.sync(parent_path + (dir ? `/${dir}` : "") + pattern).map(path => { - // Instantiate MarkdownIt - md = new markdownIt(); - // Add markdown-it-meta - md.use(meta); - // Get the order value - file = readFileSync(path, "utf8"); - md.render(file); - order = md.meta.order; - // Remove "parent_path" and ".md" - path = path.slice(parent_path.length + 1, -3); - // Remove "README", making it the de facto index page - if (path.endsWith("README") || path.endsWith("readme")) { - path = path.slice(0, -6); - } - - return { - path, - order: path === "" && order === undefined ? 0 : order // README is first if it hasn't order - }; - }); - - // Return the ordered list of files, sort by 'order' then 'path' - return sortBy(files, ["order", "path"]).map(file => file.path); -}; - -/** - * Return sidebar config for given baseDir. - * @param {String} baseDir - Absolute path of directory to get sidebar config for. - * @param {Object} options - Options - * @param {String} relativeDir - Relative directory to add to baseDir - * @param {Number} currentLevel - Current level of items. - * @returns {Array.} - Recursion level - */ -function side( - baseDir, - {stripNumbers, maxLevel, navPrefix, skipEmptySidebar, setHomepage} = {}, - relativeDir = "", - currentLevel = 1 -) { - const fileLinks = getChildren(baseDir, relativeDir, currentLevel > maxLevel); - - if (currentLevel <= maxLevel) { - getDirectories(join(baseDir, relativeDir)) - .filter(subDir => !subDir.startsWith(navPrefix)) - .forEach(subDir => { - const children = side( - baseDir, - {stripNumbers, maxLevel, navPrefix, skipEmptySidebar}, - join(relativeDir, subDir), - currentLevel + 1 - ); - if (children.length > 0 || !skipEmptySidebar) { - fileLinks.push({ - title: subDir, - ...parseSidebarParameters(subDir), - children - }); - } - }); - } - - /** - * setHomepage: 'hide' | 'toGroup' | 'top' - * 'hide': Remove first README.md from sidebar. - * 'toGroup': Remove README.md from first position and add it to first group. - * 'top': Homepage appear at top of sidebar. - */ - if (setHomepage !== 'top' && fileLinks[0] === "" && typeof fileLinks[1] === "object") { - fileLinks.shift(); - if (setHomepage === 'toGroup') fileLinks[0].children.unshift(""); - } - - // sort file and folder by name - fileLinks.sort((a, b) => { - let aName = typeof a === "string" ? a : a.title; - let bName = typeof b === "string" ? b : b.title; - aName = aName.split('/').pop(); - bName = bName.split('/').pop() - - let aNum = /^(\d+)[\.\-_ ]?/.test(aName) ? Number(aName.match(/^(\d+)[\.\-_ ]?/)[1]) - : aName; - let bNum = /^(\d+)[\.\-_ ]?/.test(bName) ? Number(bName.match(/^(\d+)[\.\-_ ]?/)[1]) - : bName; - - return aNum > bNum - }) - - // strip number of folder's name - fileLinks.forEach(item => { - if (typeof item === "string") return; - item.title = getName(item.title, {stripNumbers, navPrefix}) - }) - - return fileLinks; -} - -/** - * Gets sidebar parameters from directory name. Arguments are given after double dash `--` and separated by comma. - * - `nc` sets collapsable to `false`. - * - `dX` sets sidebarDepth to `X`. - * - * @param {String} dirname - Name of the directory. - * @returns {Object} - sidebar parameters. - * @example - * parseSidebarParameters("docs/api--nc,d2"); { collapsable: false, sidebarDepth: 2 } - */ -function parseSidebarParameters(dirname) { - const parameters = {}; - parameters.collapsable = false; - return parameters; -} - -/** - * Returns navbar configuration for given path. - * @param {String} rootDir - Path of the directory to get navbar configuration for. - * @param {OBject} options - Options - * @param {String} relativeDir - (Used internally for recursion) Relative directory to `rootDir` to get navconfig for. - * @param {Number} currentNavLevel - (Used internally for recursion) Recursion level. - * @returns {Array.} - */ -function nav(rootDir, {navPrefix, stripNumbers, skipEmptyNavbar}, relativeDir = "/", currentNavLevel = 1) { - const baseDir = join(rootDir, relativeDir); - const childrenDirs = getDirectories(baseDir).filter(subDir => subDir.startsWith(navPrefix)); - const options = {navPrefix, stripNumbers, skipEmptyNavbar}; - let result; - - if (currentNavLevel > 1 && childrenDirs.length === 0) { - if (!existsSync(join(baseDir, "README.md"))) { - if (skipEmptyNavbar) { - return; - } else { - throw new Error( - `README.md file cannot be found in ${baseDir}. VuePress would return 404 for that NavBar link.` - ); - } - } - result = {text: getName(baseDir, {stripNumbers, navPrefix}), link: relativeDir + sep}; - } else if (childrenDirs.length > 0) { - const items = childrenDirs - .map(subDir => nav(rootDir, options, join(relativeDir, subDir), currentNavLevel + 1)) - .filter(Boolean); - result = currentNavLevel === 1 ? items : {text: getName(baseDir, {stripNumbers, navPrefix}), items}; - } - - return result; -} - -/** - * Returns multiple sidebars for given directory. - * @param {String} rootDir - Directory to get navbars for. - * @param {Object} nav - Navigation configuration (Used for calculating sidebars' roots.) - * @param {Object} options - Options - * @param {Number} currentLevel - Recursion level. - * @returns {Object} - Multiple navbars. - */ -function multiSide( - rootDir, - nav, - {stripNumbers, maxLevel, navPrefix, skipEmptySidebar, setHomepage}, - currentLevel = 1 -) { - const sideBar = {}; - const options = {stripNumbers, maxLevel, navPrefix, skipEmptySidebar, setHomepage}; - - nav.forEach(navItem => { - if (navItem.link) { - sideBar[navItem.link] = side(join(rootDir, navItem.link), options); - } else { - Object.assign(sideBar, multiSide(rootDir, navItem.items, options), currentLevel + 1); - } - }); - - if (skipEmptySidebar) { - Object.keys(sideBar).forEach(key => { - if (sideBar[key].length === 0) { - delete sideBar[key]; - } - }); - } - - if (currentLevel === 1) { - const fallBackSide = side(rootDir, options); - if (!skipEmptySidebar || fallBackSide.length > 0) { - sideBar["/"] = side(rootDir, options); - } - } - - return sideBar; -} - -/** - * Returns `nav` and `sidebar` configuration for VuePress calculated using structrue of directory and files in given path. - * @param {String} rootDir - Directory to get configuration for. - * @param {Object} options - Options - * @returns {Object} - { nav: ..., sidebar: ... } configuration. - */ -function getConfig( - rootDir, - { - stripNumbers = true, - maxLevel = 2, - navPrefix = "nav", - skipEmptySidebar = true, - skipEmptyNavbar = true, - multipleSideBar = true, - setHomepage = 'hide' - } = {} -) { - rootDir = normalize(rootDir); - rootDir = rootDir.endsWith(sep) ? rootDir.slice(0, -1) : rootDir; // Remove last / if exists. - const options = { - stripNumbers, - maxLevel, - navPrefix, - skipEmptySidebar, - skipEmptyNavbar, - multipleSideBar, - setHomepage - }; - const navItems = nav(rootDir, options); - - return { - nav: navItems || [], - sidebar: multipleSideBar && navItems ? multiSide(rootDir, navItems, options) : side(rootDir, options) - }; -} - -/** - * Translate chinese to pinyin. - * Compatible with vuepress-pluin-permalink-pinyin. - * @param {Array} navArr - */ -function translitePinyin(navArr) { - navArr.map(nav => { - if (nav.link) { - nav.link = slugify(nav.link, {ignore: ['/', '.']}) - } - if (nav.items) { - translitePinyin(nav.items) - } - }) -} - -module.exports = (options, ctx) => { - return { - async ready() { - const {themeConfig} = ctx.getSiteData ? ctx.getSiteData() : ctx; - const {rootDir = ctx.sourceDir} = options; - const {nav, sidebar} = await getConfig(rootDir, options); - - if (options.pinyinNav && nav.length) { - translitePinyin(nav); - } - - if (themeConfig.nav && themeConfig.nav.length) { - themeConfig.nav = [...nav, ...themeConfig.nav] - } else { - themeConfig.nav = nav - } - - themeConfig.sidebar = sidebar; - return {nav, sidebar}; - } - } -} diff --git a/lib/enhanceAppFile.js b/lib/enhanceAppFile.js deleted file mode 100644 index 0fe74437..00000000 --- a/lib/enhanceAppFile.js +++ /dev/null @@ -1,8 +0,0 @@ -import Notification from './Notification.vue' - -export default ({ Vue }) => { - // eslint-disable-next-line vue/match-component-file-name - - console.log('enhance entered') - Vue.component('Notification', Notification) -} \ No newline at end of file diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/.DS_Store" b/mindMap_100/.DS_Store similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/.DS_Store" rename to mindMap_100/.DS_Store diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" "b/mindMap_100/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" rename to "mindMap_100/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" "b/mindMap_100/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" rename to "mindMap_100/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/.DS_Store" "b/mindMap_100/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/.DS_Store" "b/mindMap_100/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/.DS_Store" "b/mindMap_100/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/44.\347\233\221\346\216\247\347\233\270\345\205\263/.DS_Store" "b/mindMap_100/44.\347\233\221\346\216\247\347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/44.\347\233\221\346\216\247\347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/44.\347\233\221\346\216\247\347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/.DS_Store" "b/mindMap_100/45.python\347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/45.python\347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/.DS_Store" "b/mindMap_100/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/.DS_Store" rename to "mindMap_100/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/47.NetworkProtocol/.DS_Store" b/mindMap_100/47.NetworkProtocol/.DS_Store similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/47.NetworkProtocol/.DS_Store" rename to mindMap_100/47.NetworkProtocol/.DS_Store diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/48.MYSQL \347\233\270\345\205\263/.DS_Store" "b/mindMap_100/48.MYSQL \347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/48.MYSQL \347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/48.MYSQL \347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/.DS_Store" "b/mindMap_100/49.\345\211\215\347\253\257\347\233\270\345\205\263/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/.DS_Store" rename to "mindMap_100/49.\345\211\215\347\253\257\347\233\270\345\205\263/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/.DS_Store" "b/mindMap_100/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/.DS_Store" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/.DS_Store" rename to "mindMap_100/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/.DS_Store" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/.DS_Store" b/mindMap_100/img/.DS_Store similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/.DS_Store" rename to mindMap_100/img/.DS_Store diff --git a/mindmap_100/machine-learning-mindmap/Machine Learning - White BG.pdf b/mindmap_100/machine-learning-mindmap/Machine Learning - White BG.pdf new file mode 100644 index 00000000..a8011b7d Binary files /dev/null and b/mindmap_100/machine-learning-mindmap/Machine Learning - White BG.pdf differ diff --git a/mindmap_100/machine-learning-mindmap/Machine Learning.pdf b/mindmap_100/machine-learning-mindmap/Machine Learning.pdf new file mode 100644 index 00000000..38a4c29f Binary files /dev/null and b/mindmap_100/machine-learning-mindmap/Machine Learning.pdf differ diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/01.Docker \345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/docker.pdf" "b/mindmap_100/surprise/01.Docker \345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/docker.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/01.Docker \345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/docker.pdf" rename to "mindmap_100/surprise/01.Docker \345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/docker.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/02.Git\345\237\272\347\241\200\357\274\210\347\262\276\346\240\241\357\274\211/Git\345\237\272\347\241\200.pdf" "b/mindmap_100/surprise/02.Git\345\237\272\347\241\200\357\274\210\347\262\276\346\240\241\357\274\211/Git\345\237\272\347\241\200.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/02.Git\345\237\272\347\241\200\357\274\210\347\262\276\346\240\241\357\274\211/Git\345\237\272\347\241\200.pdf" rename to "mindmap_100/surprise/02.Git\345\237\272\347\241\200\357\274\210\347\262\276\346\240\241\357\274\211/Git\345\237\272\347\241\200.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/03.Java\345\271\266\345\217\221\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/Java\345\271\266\345\217\221\344\275\223\347\263\273.pdf" "b/mindmap_100/surprise/03.Java\345\271\266\345\217\221\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/Java\345\271\266\345\217\221\344\275\223\347\263\273.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/03.Java\345\271\266\345\217\221\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/Java\345\271\266\345\217\221\344\275\223\347\263\273.pdf" rename to "mindmap_100/surprise/03.Java\345\271\266\345\217\221\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/Java\345\271\266\345\217\221\344\275\223\347\263\273.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/04.JVM\345\222\214\346\200\247\350\203\275\350\260\203\344\274\230\357\274\210\347\262\276\346\240\241\357\274\211/JVM\345\222\214\346\200\247\350\203\275\344\274\230\345\214\226.pdf" "b/mindmap_100/surprise/04.JVM\345\222\214\346\200\247\350\203\275\350\260\203\344\274\230\357\274\210\347\262\276\346\240\241\357\274\211/JVM\345\222\214\346\200\247\350\203\275\344\274\230\345\214\226.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/04.JVM\345\222\214\346\200\247\350\203\275\350\260\203\344\274\230\357\274\210\347\262\276\346\240\241\357\274\211/JVM\345\222\214\346\200\247\350\203\275\344\274\230\345\214\226.pdf" rename to "mindmap_100/surprise/04.JVM\345\222\214\346\200\247\350\203\275\350\260\203\344\274\230\357\274\210\347\262\276\346\240\241\357\274\211/JVM\345\222\214\346\200\247\350\203\275\344\274\230\345\214\226.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/05.Kafka\357\274\210\347\262\276\346\240\241\357\274\211/kafka.pdf" "b/mindmap_100/surprise/05.Kafka\357\274\210\347\262\276\346\240\241\357\274\211/kafka.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/05.Kafka\357\274\210\347\262\276\346\240\241\357\274\211/kafka.pdf" rename to "mindmap_100/surprise/05.Kafka\357\274\210\347\262\276\346\240\241\357\274\211/kafka.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/06.Mysql \346\225\264\345\220\210\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/MySQL.pdf" "b/mindmap_100/surprise/06.Mysql \346\225\264\345\220\210\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/MySQL.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/06.Mysql \346\225\264\345\220\210\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/MySQL.pdf" rename to "mindmap_100/surprise/06.Mysql \346\225\264\345\220\210\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/MySQL.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.pdf" "b/mindmap_100/surprise/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.pdf" rename to "mindmap_100/surprise/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.png" "b/mindmap_100/surprise/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.png" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.png" rename to "mindmap_100/surprise/07.Redis\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260\357\274\210\347\262\276\346\240\241\357\274\211/Redis.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/08.Springboot\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/springboot\345\255\246\344\271\240\347\254\224\350\256\260.pdf" "b/mindmap_100/surprise/08.Springboot\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/springboot\345\255\246\344\271\240\347\254\224\350\256\260.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/08.Springboot\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/springboot\345\255\246\344\271\240\347\254\224\350\256\260.pdf" rename to "mindmap_100/surprise/08.Springboot\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/springboot\345\255\246\344\271\240\347\254\224\350\256\260.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.pdf" "b/mindmap_100/surprise/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.pdf" rename to "mindmap_100/surprise/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.png" "b/mindmap_100/surprise/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.png" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.png" rename to "mindmap_100/surprise/09.Spring\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/Spring\345\255\246\344\271\240\347\254\224\350\256\260.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/10.Python14\345\274\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/10.Python14\345\274\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/10.Python14\345\274\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/10.Python14\345\274\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266.pdf" "b/mindmap_100/surprise/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266.pdf" rename to "mindmap_100/surprise/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/algorithm.xmind" "b/mindmap_100/surprise/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/algorithm.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/algorithm.xmind" rename to "mindmap_100/surprise/11.\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\241\206\346\236\266\357\274\210\347\262\276\346\240\241\357\274\211/algorithm.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/12.\346\223\215\344\275\234\347\263\273\347\273\237\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\223\215\344\275\234\347\263\273\347\273\237.pdf" "b/mindmap_100/surprise/12.\346\223\215\344\275\234\347\263\273\347\273\237\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\223\215\344\275\234\347\263\273\347\273\237.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/12.\346\223\215\344\275\234\347\263\273\347\273\237\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\223\215\344\275\234\347\263\273\347\273\237.pdf" rename to "mindmap_100/surprise/12.\346\223\215\344\275\234\347\263\273\347\273\237\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\223\215\344\275\234\347\263\273\347\273\237.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/13.Java\345\237\272\347\241\20014\345\274\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/13.Java\345\237\272\347\241\20014\345\274\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/13.Java\345\237\272\347\241\20014\345\274\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/13.Java\345\237\272\347\241\20014\345\274\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\225.JPG" "b/mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\225.JPG" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\225.JPG" rename to "mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\225.JPG" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\2251.JPG" "b/mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\2251.JPG" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\2251.JPG" rename to "mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/C++\350\257\255\346\263\2251.JPG" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/cpp.md" "b/mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/cpp.md" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/cpp.md" rename to "mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/cpp.md" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/14.c++\345\237\272\347\241\200\345\222\214API\350\256\276\350\256\241 \357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/15.Hadoop\350\266\205\350\257\246\347\273\206\357\274\210\347\262\276\346\240\241\357\274\211/Hadoop.pdf" "b/mindmap_100/surprise/15.Hadoop\350\266\205\350\257\246\347\273\206\357\274\210\347\262\276\346\240\241\357\274\211/Hadoop.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/15.Hadoop\350\266\205\350\257\246\347\273\206\357\274\210\347\262\276\346\240\241\357\274\211/Hadoop.pdf" rename to "mindmap_100/surprise/15.Hadoop\350\266\205\350\257\246\347\273\206\357\274\210\347\262\276\346\240\241\357\274\211/Hadoop.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/16.linux\345\237\272\347\241\200\347\237\245\350\257\206\357\274\210\347\262\276\346\240\241\357\274\211/linux\345\237\272\347\241\200\347\237\245\350\257\206.pdf" "b/mindmap_100/surprise/16.linux\345\237\272\347\241\200\347\237\245\350\257\206\357\274\210\347\262\276\346\240\241\357\274\211/linux\345\237\272\347\241\200\347\237\245\350\257\206.pdf" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/16.linux\345\237\272\347\241\200\347\237\245\350\257\206\357\274\210\347\262\276\346\240\241\357\274\211/linux\345\237\272\347\241\200\347\237\245\350\257\206.pdf" rename to "mindmap_100/surprise/16.linux\345\237\272\347\241\200\347\237\245\350\257\206\357\274\210\347\262\276\346\240\241\357\274\211/linux\345\237\272\347\241\200\347\237\245\350\257\206.pdf" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/17.js\347\237\245\350\257\206\345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/17.js\347\237\245\350\257\206\345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/17.js\347\237\245\350\257\206\345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/17.js\347\237\245\350\257\206\345\255\246\344\271\240\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/18.Vue\346\241\206\346\236\266\346\200\235\347\273\264\345\257\274\345\233\276\347\254\224\350\256\260\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/18.Vue\346\241\206\346\236\266\346\200\235\347\273\264\345\257\274\345\233\276\347\254\224\350\256\260\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/18.Vue\346\241\206\346\236\266\346\200\235\347\273\264\345\257\274\345\233\276\347\254\224\350\256\260\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/18.Vue\346\241\206\346\236\266\346\200\235\347\273\264\345\257\274\345\233\276\347\254\224\350\256\260\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/19.CSS\345\222\214HTML\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/19.CSS\345\222\214HTML\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/19.CSS\345\222\214HTML\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/19.CSS\345\222\214HTML\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/20.28\345\274\240 \346\236\266\346\236\204\345\270\210\346\212\200\350\203\275\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/20.28\345\274\240 \346\236\266\346\236\204\345\270\210\346\212\200\350\203\275\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/20.28\345\274\240 \346\236\266\346\236\204\345\270\210\346\212\200\350\203\275\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/20.28\345\274\240 \346\236\266\346\236\204\345\270\210\346\212\200\350\203\275\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/21.\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\350\266\205\345\205\250\345\255\246\344\271\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/21.\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\350\266\205\345\205\250\345\255\246\344\271\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/21.\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\350\266\205\345\205\250\345\255\246\344\271\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/21.\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\350\266\205\345\205\250\345\255\246\344\271\240\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/22.MySQL\351\253\230\347\272\247\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/22.MySQL\351\253\230\347\272\247\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/22.MySQL\351\253\230\347\272\247\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/22.MySQL\351\253\230\347\272\247\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/23.MySQL\345\237\272\347\241\200\344\270\216\346\200\247\350\203\275\344\274\230\345\214\226\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/23.MySQL\345\237\272\347\241\200\344\270\216\346\200\247\350\203\275\344\274\230\345\214\226\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/23.MySQL\345\237\272\347\241\200\344\270\216\346\200\247\350\203\275\344\274\230\345\214\226\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/23.MySQL\345\237\272\347\241\200\344\270\216\346\200\247\350\203\275\344\274\230\345\214\226\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/24.\346\225\260\345\255\246\350\266\205\345\205\250\345\257\274\345\233\276\345\220\210\351\233\206\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/24.\346\225\260\345\255\246\350\266\205\345\205\250\345\257\274\345\233\276\345\220\210\351\233\206\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/24.\346\225\260\345\255\246\350\266\205\345\205\250\345\257\274\345\233\276\345\220\210\351\233\206\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/24.\346\225\260\345\255\246\350\266\205\345\205\250\345\257\274\345\233\276\345\220\210\351\233\206\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/25.NPDP \347\237\245\350\257\206\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/25.NPDP \347\237\245\350\257\206\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/25.NPDP \347\237\245\350\257\206\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/25.NPDP \347\237\245\350\257\206\344\275\223\347\263\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/26.JAVA\351\235\242\350\257\225\346\200\235\347\273\264\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/26.JAVA\351\235\242\350\257\225\346\200\235\347\273\264\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/26.JAVA\351\235\242\350\257\225\346\200\235\347\273\264\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/26.JAVA\351\235\242\350\257\225\346\200\235\347\273\264\345\257\274\345\233\276\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/27.\346\267\261\345\272\246\345\255\246\344\271\240\345\233\276\345\203\217\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/27.\346\267\261\345\272\246\345\255\246\344\271\240\345\233\276\345\203\217\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/27.\346\267\261\345\272\246\345\255\246\344\271\240\345\233\276\345\203\217\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/27.\346\267\261\345\272\246\345\255\246\344\271\240\345\233\276\345\203\217\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/28.\345\260\217\347\231\275\347\232\204\345\211\215\347\253\257\345\257\274\345\233\276\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" "b/mindmap_100/surprise/28.\345\260\217\347\231\275\347\232\204\345\211\215\347\253\257\345\257\274\345\233\276\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/28.\345\260\217\347\231\275\347\232\204\345\211\215\347\253\257\345\257\274\345\233\276\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" rename to "mindmap_100/surprise/28.\345\260\217\347\231\275\347\232\204\345\211\215\347\253\257\345\257\274\345\233\276\346\261\207\346\200\273\357\274\210\347\262\276\346\240\241\357\274\211/\346\226\207\344\273\266\350\277\207\345\244\247,\344\270\213\346\226\271\351\223\276\346\216\245\344\270\213\350\275\275.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225.xmind" "b/mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225.xmind" rename to "mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225\345\234\272\346\231\257.xmind" "b/mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225\345\234\272\346\231\257.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225\345\234\272\346\231\257.xmind" rename to "mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\345\216\213\345\212\233\346\265\213\350\257\225\345\234\272\346\231\257.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\346\265\213\350\257\225\347\237\245\350\257\206\344\275\223\347\263\273.xmind" "b/mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\346\265\213\350\257\225\347\237\245\350\257\206\344\275\223\347\263\273.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\346\265\213\350\257\225\347\237\245\350\257\206\344\275\223\347\263\273.xmind" rename to "mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\346\265\213\350\257\225\347\237\245\350\257\206\344\275\223\347\263\273.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\347\247\273\345\212\250\345\256\242\346\210\267\347\253\257\351\200\232\347\224\250\346\265\213\350\257\225.xmind" "b/mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\347\247\273\345\212\250\345\256\242\346\210\267\347\253\257\351\200\232\347\224\250\346\265\213\350\257\225.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/29.\346\265\213\350\257\225\347\233\270\345\205\263/\347\247\273\345\212\250\345\256\242\346\210\267\347\253\257\351\200\232\347\224\250\346\265\213\350\257\225.xmind" rename to "mindmap_100/surprise/29.\346\265\213\350\257\225\347\233\270\345\205\263/\347\247\273\345\212\250\345\256\242\346\210\267\347\253\257\351\200\232\347\224\250\346\265\213\350\257\225.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/30.Security\345\256\211\345\205\250\347\233\270\345\205\263/\345\256\211\345\205\250.xmind" "b/mindmap_100/surprise/30.Security\345\256\211\345\205\250\347\233\270\345\205\263/\345\256\211\345\205\250.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/30.Security\345\256\211\345\205\250\347\233\270\345\205\263/\345\256\211\345\205\250.xmind" rename to "mindmap_100/surprise/30.Security\345\256\211\345\205\250\347\233\270\345\205\263/\345\256\211\345\205\250.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/Redis.md" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/Redis.md" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/Redis.md" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/Redis.md" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/Redis\345\206\205\345\255\230.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/Redis\345\206\205\345\255\230.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/Redis\345\206\205\345\255\230.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/Redis\345\206\205\345\255\230.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/redis\345\206\205\345\255\230\344\274\230\345\214\226.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/redis\345\206\205\345\255\230\344\274\230\345\214\226.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/redis\345\206\205\345\255\230\344\274\230\345\214\226.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/redis\345\206\205\345\255\230\344\274\230\345\214\226.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\345\223\250\345\205\265.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\345\223\250\345\205\265.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\345\223\250\345\205\265.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\345\223\250\345\205\265.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\345\244\215\345\210\266.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\345\244\215\345\210\266.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\345\244\215\345\210\266.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\345\244\215\345\210\266.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\346\214\201\344\271\205\345\214\226.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\346\214\201\344\271\205\345\214\226.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\346\214\201\344\271\205\345\214\226.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\346\214\201\344\271\205\345\214\226.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\347\274\223\345\255\230\350\256\276\350\256\241.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\347\274\223\345\255\230\350\256\276\350\256\241.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\347\274\223\345\255\230\350\256\276\350\256\241.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\347\274\223\345\255\230\350\256\276\350\256\241.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\351\230\273\345\241\236.png" "b/mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\351\230\273\345\241\236.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/31.Redis\347\233\270\345\205\263/\351\230\273\345\241\236.png" rename to "mindmap_100/surprise/31.Redis\347\233\270\345\205\263/\351\230\273\345\241\236.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/32.Zookeeper\347\233\270\345\205\263/Zookeeper.xmind" "b/mindmap_100/surprise/32.Zookeeper\347\233\270\345\205\263/Zookeeper.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/32.Zookeeper\347\233\270\345\205\263/Zookeeper.xmind" rename to "mindmap_100/surprise/32.Zookeeper\347\233\270\345\205\263/Zookeeper.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/1.jpg" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/1.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/1.jpg" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/1.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/2.jpg" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/2.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/2.jpg" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/2.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/3.jpg" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/3.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/3.jpg" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/3.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/4.jpg" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/4.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/4.jpg" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/4.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/5.jpg" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/5.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/5.jpg" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/5.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/6.jpg" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/6.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/6.jpg" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/6.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/Docker\347\256\200\344\273\213\345\222\214\345\237\272\346\234\254\346\246\202\345\277\265.png" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/Docker\347\256\200\344\273\213\345\222\214\345\237\272\346\234\254\346\246\202\345\277\265.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/Docker\347\256\200\344\273\213\345\222\214\345\237\272\346\234\254\346\246\202\345\277\265.png" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/Docker\347\256\200\344\273\213\345\222\214\345\237\272\346\234\254\346\246\202\345\277\265.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/docker.md" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/docker.md" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/docker.md" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/docker.md" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\345\205\266\344\273\226.png" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\345\205\266\344\273\226.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\345\205\266\344\273\226.png" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\345\205\266\344\273\226.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\351\225\234\345\203\217\344\270\216\345\256\271\345\231\250.png" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\351\225\234\345\203\217\344\270\216\345\256\271\345\231\250.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\351\225\234\345\203\217\344\270\216\345\256\271\345\231\250.png" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Docker/\351\225\234\345\203\217\344\270\216\345\256\271\345\231\250.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Microservice" "b/mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Microservice" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Microservice" rename to "mindmap_100/surprise/33.\345\276\256\346\234\215\345\212\241\347\233\270\345\205\263/Microservice" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/34.IO\346\265\201\347\233\270\345\205\263/IO Pattern.xmind" "b/mindmap_100/surprise/34.IO\346\265\201\347\233\270\345\205\263/IO Pattern.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/34.IO\346\265\201\347\233\270\345\205\263/IO Pattern.xmind" rename to "mindmap_100/surprise/34.IO\346\265\201\347\233\270\345\205\263/IO Pattern.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/Git_V2.16.2.png" "b/mindmap_100/surprise/35.Git\347\233\270\345\205\263/Git_V2.16.2.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/Git_V2.16.2.png" rename to "mindmap_100/surprise/35.Git\347\233\270\345\205\263/Git_V2.16.2.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git \346\223\215\344\275\234\346\211\213\345\206\214.xmind" "b/mindmap_100/surprise/35.Git\347\233\270\345\205\263/git \346\223\215\344\275\234\346\211\213\345\206\214.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git \346\223\215\344\275\234\346\211\213\345\206\214.xmind" rename to "mindmap_100/surprise/35.Git\347\233\270\345\205\263/git \346\223\215\344\275\234\346\211\213\345\206\214.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git \347\232\204\344\275\277\347\224\250.xmind" "b/mindmap_100/surprise/35.Git\347\233\270\345\205\263/git \347\232\204\344\275\277\347\224\250.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git \347\232\204\344\275\277\347\224\250.xmind" rename to "mindmap_100/surprise/35.Git\347\233\270\345\205\263/git \347\232\204\344\275\277\347\224\250.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git1.png" "b/mindmap_100/surprise/35.Git\347\233\270\345\205\263/git1.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git1.png" rename to "mindmap_100/surprise/35.Git\347\233\270\345\205\263/git1.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git\345\210\206\346\224\257\347\256\241\347\220\206\346\250\241\345\236\213.JPG" "b/mindmap_100/surprise/35.Git\347\233\270\345\205\263/git\345\210\206\346\224\257\347\256\241\347\220\206\346\250\241\345\236\213.JPG" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git\345\210\206\346\224\257\347\256\241\347\220\206\346\250\241\345\236\213.JPG" rename to "mindmap_100/surprise/35.Git\347\233\270\345\205\263/git\345\210\206\346\224\257\347\256\241\347\220\206\346\250\241\345\236\213.JPG" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git\350\217\234\345\215\225.pptx" "b/mindmap_100/surprise/35.Git\347\233\270\345\205\263/git\350\217\234\345\215\225.pptx" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/35.Git\347\233\270\345\205\263/git\350\217\234\345\215\225.pptx" rename to "mindmap_100/surprise/35.Git\347\233\270\345\205\263/git\350\217\234\345\215\225.pptx" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/36.Distributed/distributed.xmind" b/mindmap_100/surprise/36.Distributed/distributed.xmind old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/36.Distributed/distributed.xmind" rename to mindmap_100/surprise/36.Distributed/distributed.xmind diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/37.Javascript \347\233\270\345\205\263/JavaScript.xmind" "b/mindmap_100/surprise/37.Javascript \347\233\270\345\205\263/JavaScript.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/37.Javascript \347\233\270\345\205\263/JavaScript.xmind" rename to "mindmap_100/surprise/37.Javascript \347\233\270\345\205\263/JavaScript.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/37.Javascript \347\233\270\345\205\263/JavaScript\347\224\237\346\200\201\347\263\273\347\273\237.PNG" "b/mindmap_100/surprise/37.Javascript \347\233\270\345\205\263/JavaScript\347\224\237\346\200\201\347\263\273\347\273\237.PNG" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/37.Javascript \347\233\270\345\205\263/JavaScript\347\224\237\346\200\201\347\263\273\347\273\237.PNG" rename to "mindmap_100/surprise/37.Javascript \347\233\270\345\205\263/JavaScript\347\224\237\346\200\201\347\263\273\347\273\237.PNG" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/38.Linux \347\233\270\345\205\263/Linux Security Coaching.png" "b/mindmap_100/surprise/38.Linux \347\233\270\345\205\263/Linux Security Coaching.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/38.Linux \347\233\270\345\205\263/Linux Security Coaching.png" rename to "mindmap_100/surprise/38.Linux \347\233\270\345\205\263/Linux Security Coaching.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/38.Linux \347\233\270\345\205\263/Linux\345\255\246\344\271\240.xmind" "b/mindmap_100/surprise/38.Linux \347\233\270\345\205\263/Linux\345\255\246\344\271\240.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/38.Linux \347\233\270\345\205\263/Linux\345\255\246\344\271\240.xmind" rename to "mindmap_100/surprise/38.Linux \347\233\270\345\205\263/Linux\345\255\246\344\271\240.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/39.SEO \347\233\270\345\205\263/SEO\347\231\276\347\247\221.xmind" "b/mindmap_100/surprise/39.SEO \347\233\270\345\205\263/SEO\347\231\276\347\247\221.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/39.SEO \347\233\270\345\205\263/SEO\347\231\276\347\247\221.xmind" rename to "mindmap_100/surprise/39.SEO \347\233\270\345\205\263/SEO\347\231\276\347\247\221.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/39.SEO \347\233\270\345\205\263/SEO\347\233\270\345\205\263.xmind" "b/mindmap_100/surprise/39.SEO \347\233\270\345\205\263/SEO\347\233\270\345\205\263.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/39.SEO \347\233\270\345\205\263/SEO\347\233\270\345\205\263.xmind" rename to "mindmap_100/surprise/39.SEO \347\233\270\345\205\263/SEO\347\233\270\345\205\263.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.xmind" "b/mindmap_100/surprise/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.xmind" rename to "mindmap_100/surprise/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/nmap\346\200\235\347\273\264\345\257\274\345\233\276.zip" "b/mindmap_100/surprise/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/nmap\346\200\235\347\273\264\345\257\274\345\233\276.zip" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/nmap\346\200\235\347\273\264\345\257\274\345\233\276.zip" rename to "mindmap_100/surprise/40.javaweb \345\272\224\347\224\250\345\256\211\345\205\250/nmap\346\200\235\347\273\264\345\257\274\345\233\276.zip" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/41.Nodejs \347\233\270\345\205\263/Nodejs.xmind" "b/mindmap_100/surprise/41.Nodejs \347\233\270\345\205\263/Nodejs.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/41.Nodejs \347\233\270\345\205\263/Nodejs.xmind" rename to "mindmap_100/surprise/41.Nodejs \347\233\270\345\205\263/Nodejs.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/Java.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/Java.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/Java.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/Java.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/NoSQL \351\235\236\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/NoSQL \351\235\236\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/NoSQL \351\235\236\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/NoSQL \351\235\236\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/RESTful.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/RESTful.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/RESTful.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/RESTful.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java NIO,socket.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java NIO,socket.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java NIO,socket.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java NIO,socket.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\210\206\345\270\203\345\274\217\347\263\273\347\273\237.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\210\206\345\270\203\345\274\217\347\263\273\347\273\237.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\210\206\345\270\203\345\274\217\347\263\273\347\273\237.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\210\206\345\270\203\345\274\217\347\263\273\347\273\237.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\271\266\345\217\221(\345\220\253volatile,\345\215\225\344\276\213,\347\272\277\347\250\213\346\261\240,\346\266\210\346\201\257\351\230\237\345\210\227,\344\272\213\345\212\241).xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\271\266\345\217\221(\345\220\253volatile,\345\215\225\344\276\213,\347\272\277\347\250\213\346\261\240,\346\266\210\346\201\257\351\230\237\345\210\227,\344\272\213\345\212\241).xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\271\266\345\217\221(\345\220\253volatile,\345\215\225\344\276\213,\347\272\277\347\250\213\346\261\240,\346\266\210\346\201\257\351\230\237\345\210\227,\344\272\213\345\212\241).xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\345\271\266\345\217\221(\345\220\253volatile,\345\215\225\344\276\213,\347\272\277\347\250\213\346\261\240,\346\266\210\346\201\257\351\230\237\345\210\227,\344\272\213\345\212\241).xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\212\200\346\234\257\350\267\257\347\272\277.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\212\200\346\234\257\350\267\257\347\272\277.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\212\200\346\234\257\350\267\257\347\272\277.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\212\200\346\234\257\350\267\257\347\272\277.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\234\215\345\212\241\347\253\257\350\204\232\346\211\213\346\236\266.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\234\215\345\212\241\347\253\257\350\204\232\346\211\213\346\236\266.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\234\215\345\212\241\347\253\257\350\204\232\346\211\213\346\236\266.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\234\215\345\212\241\347\253\257\350\204\232\346\211\213\346\236\266.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\236\266\346\236\204\347\233\270\345\205\263.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\236\266\346\236\204\347\233\270\345\205\263.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\236\266\346\236\204\347\233\270\345\205\263.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/java\346\236\266\346\236\204\347\233\270\345\205\263.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/jvm\347\233\270\345\205\263.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/jvm\347\233\270\345\205\263.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/jvm\347\233\270\345\205\263.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/jvm\347\233\270\345\205\263.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log4j.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log4j.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log4j.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/log4j.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/spring-shiro \347\233\270\345\205\263.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/spring-shiro \347\233\270\345\205\263.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/spring-shiro \347\233\270\345\205\263.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/spring-shiro \347\233\270\345\205\263.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\346\265\201\347\250\213\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\346\265\201\347\250\213\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\346\265\201\347\250\213\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\346\265\201\347\250\213\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\351\205\215\347\275\256\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\351\205\215\347\275\256\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\351\205\215\347\275\256\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\343\200\220Shiro-\351\205\215\347\275\256\343\200\221\345\256\211\345\205\250\346\241\206\346\236\266&cas\345\215\225\347\202\271\347\231\273\345\275\225.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\344\272\213\345\212\241\347\233\270\345\205\263.xlsx" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\344\272\213\345\212\241\347\233\270\345\205\263.xlsx" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\344\272\213\345\212\241\347\233\270\345\205\263.xlsx" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\344\272\213\345\212\241\347\233\270\345\205\263.xlsx" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\212\240\345\257\206 \350\247\243\347\240\201.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\212\240\345\257\206 \350\247\243\347\240\201.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\212\240\345\257\206 \350\247\243\347\240\201.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\212\240\345\257\206 \350\247\243\347\240\201.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\256\211\345\205\250-\345\257\206\347\240\201.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\256\211\345\205\250-\345\257\206\347\240\201.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\256\211\345\205\250-\345\257\206\347\240\201.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\345\256\211\345\205\250-\345\257\206\347\240\201.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\216\250\351\200\201\346\212\200\346\234\257,\346\234\215\345\212\241\347\253\257push,\345\256\236\346\227\266\345\214\226.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\216\250\351\200\201\346\212\200\346\234\257,\346\234\215\345\212\241\347\253\257push,\345\256\236\346\227\266\345\214\226.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\216\250\351\200\201\346\212\200\346\234\257,\346\234\215\345\212\241\347\253\257push,\345\256\236\346\227\266\345\214\226.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\216\250\351\200\201\346\212\200\346\234\257,\346\234\215\345\212\241\347\253\257push,\345\256\236\346\227\266\345\214\226.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\245\274\345\256\207\346\231\272\350\203\275\345\214\226\350\277\220\347\273\264\347\263\273\347\273\237-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\245\274\345\256\207\346\231\272\350\203\275\345\214\226\350\277\220\347\273\264\347\263\273\347\273\237-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\245\274\345\256\207\346\231\272\350\203\275\345\214\226\350\277\220\347\273\264\347\263\273\347\273\237-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\346\245\274\345\256\207\346\231\272\350\203\275\345\214\226\350\277\220\347\273\264\347\263\273\347\273\237-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\211\251\350\201\224\347\275\221\347\233\270\345\205\263\350\277\220\347\273\264\347\263\273\347\273\237.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\211\251\350\201\224\347\275\221\347\233\270\345\205\263\350\277\220\347\273\264\347\263\273\347\273\237.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\211\251\350\201\224\347\275\221\347\233\270\345\205\263\350\277\220\347\273\264\347\263\273\347\273\237.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\211\251\350\201\224\347\275\221\347\233\270\345\205\263\350\277\220\347\273\264\347\263\273\347\273\237.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\225\214\351\235\242&\345\220\216\345\217\260\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\347\246\273.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\225\214\351\235\242&\345\220\216\345\217\260\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\347\246\273.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\225\214\351\235\242&\345\220\216\345\217\260\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\347\246\273.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\225\214\351\235\242&\345\220\216\345\217\260\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\347\246\273.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\274\223\345\255\230\346\234\215\345\212\241\346\212\200\346\234\257.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\274\223\345\255\230\346\234\215\345\212\241\346\212\200\346\234\257.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\274\223\345\255\230\346\234\215\345\212\241\346\212\200\346\234\257.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\274\223\345\255\230\346\234\215\345\212\241\346\212\200\346\234\257.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\275\221\347\273\234\347\274\226\347\250\213.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\275\221\347\273\234\347\274\226\347\250\213.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\275\221\347\273\234\347\274\226\347\250\213.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\347\275\221\347\273\234\347\274\226\347\250\213.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217-23.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217-23.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217-23.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217-23.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217\350\256\244\350\257\206.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217\350\256\244\350\257\206.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217\350\256\244\350\257\206.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\256\276\350\256\241\346\250\241\345\274\217\350\256\244\350\257\206.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\272\253\344\273\275\350\256\244\350\257\201.xmind" "b/mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\272\253\344\273\275\350\256\244\350\257\201.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\272\253\344\273\275\350\256\244\350\257\201.xmind" rename to "mindmap_100/surprise/42.Java\346\212\200\346\234\257\347\233\270\345\205\263/\345\220\216\347\253\257/\350\272\253\344\273\275\350\256\244\350\257\201.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/Kafka.xmind" "b/mindmap_100/surprise/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/Kafka.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/Kafka.xmind" rename to "mindmap_100/surprise/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/Kafka.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/MQ.xmind" "b/mindmap_100/surprise/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/MQ.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/MQ.xmind" rename to "mindmap_100/surprise/43.\344\270\255\351\227\264\344\273\266\347\233\270\345\205\263/MQ.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/44.\347\233\221\346\216\247\347\233\270\345\205\263/monitor.xmind" "b/mindmap_100/surprise/44.\347\233\221\346\216\247\347\233\270\345\205\263/monitor.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/44.\347\233\221\346\216\247\347\233\270\345\205\263/monitor.xmind" rename to "mindmap_100/surprise/44.\347\233\221\346\216\247\347\233\270\345\205\263/monitor.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261465529.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261465529.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261465529.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261465529.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261467755.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261467755.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261467755.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261467755.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261471948.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261471948.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261471948.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261471948.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261475857.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261475857.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261475857.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261475857.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261479530.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261479530.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261479530.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261479530.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261484177.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261484177.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261484177.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261484177.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261487767.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261487767.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261487767.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261487767.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261490937.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261490937.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261490937.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261490937.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261494981.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261494981.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261494981.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261494981.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261498535.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261498535.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261498535.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261498535.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261502948.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261502948.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261502948.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261502948.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261506823.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261506823.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261506823.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261506823.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261510612.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261510612.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261510612.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261510612.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261514286.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261514286.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261514286.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261514286.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261518395.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261518395.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/mmexport1508261518395.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/mmexport1508261518395.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/readme.md" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/readme.md" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/readme.md" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/readme.md" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Dict\345\222\214Set\347\261\273\345\236\213.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Dict\345\222\214Set\347\261\273\345\236\213.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Dict\345\222\214Set\347\261\273\345\236\213.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Dict\345\222\214Set\347\261\273\345\236\213.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/List\345\222\214Tuple\347\261\273\345\236\213.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/List\345\222\214Tuple\347\261\273\345\236\213.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/List\345\222\214Tuple\347\261\273\345\236\213.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/List\345\222\214Tuple\347\261\273\345\236\213.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\207\275\346\225\260.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\207\275\346\225\260.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\207\275\346\225\260.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\207\275\346\225\260.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\207\347\211\207.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\207\347\211\207.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\207\347\211\207.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\207\347\211\207.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\345\210\227\350\241\250\347\224\237\346\210\220\345\274\217.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\347\224\237\346\210\220\345\231\250.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\347\224\237\346\210\220\345\231\250.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\347\224\237\346\210\220\345\231\250.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\347\224\237\346\210\220\345\231\250.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\257\255\346\263\225\345\233\276.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\257\255\346\263\225\345\233\276.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\257\255\346\263\225\345\233\276.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\257\255\346\263\225\345\233\276.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\224\345\233\236\345\207\275\346\225\260\345\222\214\351\227\255\345\214\205.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\224\345\233\236\345\207\275\346\225\260\345\222\214\351\227\255\345\214\205.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\224\345\233\236\345\207\275\346\225\260\345\222\214\351\227\255\345\214\205.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\224\345\233\236\345\207\275\346\225\260\345\222\214\351\227\255\345\214\205.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\255\344\273\243.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\255\344\273\243.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\255\344\273\243.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\350\277\255\344\273\243.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\351\253\230\351\230\266\345\207\275\346\225\260.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\351\253\230\351\230\266\345\207\275\346\225\260.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\351\253\230\351\230\266\345\207\275\346\225\260.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/Python\351\253\230\351\230\266\345\207\275\346\225\260.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/readme.md" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/readme.md" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/readme.md" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/readme.md" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\217\230\351\207\217\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\217\230\351\207\217\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\217\230\351\207\217\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\217\230\351\207\217\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\276\252\347\216\257\350\257\255\345\217\245.jpg" "b/mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\276\252\347\216\257\350\257\255\345\217\245.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\276\252\347\216\257\350\257\255\345\217\245.jpg" rename to "mindmap_100/surprise/45.python\347\233\270\345\205\263/\350\237\222\350\233\207\345\237\272\347\241\200/\345\276\252\347\216\257\350\257\255\345\217\245.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/db.xmind" "b/mindmap_100/surprise/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/db.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/db.xmind" rename to "mindmap_100/surprise/46.\346\225\260\346\215\256\345\272\223\347\233\270\345\205\263\357\274\210\345\210\206\345\272\223\345\210\206\350\241\250\357\274\211/db.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/47.NetworkProtocol/Network Protocol.xmind" b/mindmap_100/surprise/47.NetworkProtocol/Network Protocol.xmind old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/47.NetworkProtocol/Network Protocol.xmind" rename to mindmap_100/surprise/47.NetworkProtocol/Network Protocol.xmind diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/48.MYSQL \347\233\270\345\205\263/MySql.xmind" "b/mindmap_100/surprise/48.MYSQL \347\233\270\345\205\263/MySql.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/48.MYSQL \347\233\270\345\205\263/MySql.xmind" rename to "mindmap_100/surprise/48.MYSQL \347\233\270\345\205\263/MySql.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/Ajax.jpg" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/Ajax.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/Ajax.jpg" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/Ajax.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2340.jpg" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2340.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2340.jpg" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2340.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2341.jpg" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2341.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2341.jpg" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/DOM\346\223\215\344\275\2341.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/Jquery\344\270\255\345\277\203\344\270\273\351\242\230.jpg" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/Jquery\344\270\255\345\277\203\344\270\273\351\242\230.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/Jquery\344\270\255\345\277\203\344\270\273\351\242\230.jpg" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/Jquery\344\270\255\345\277\203\344\270\273\351\242\230.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/call,apply,bind.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/call,apply,bind.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/call,apply,bind.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/call,apply,bind.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/cookie & session.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/cookie & session.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/cookie & session.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/cookie & session.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/css\345\256\232\344\275\215.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/css\345\256\232\344\275\215.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/css\345\256\232\344\275\215.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/css\345\256\232\344\275\215.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/generator-gulp-angular,Gulp.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/generator-gulp-angular,Gulp.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/generator-gulp-angular,Gulp.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/generator-gulp-angular,Gulp.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript Html jsp \346\223\215\347\272\265\345\205\263\347\263\273.txt" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript Html jsp \346\223\215\347\272\265\345\205\263\347\263\273.txt" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript Html jsp \346\223\215\347\272\265\345\205\263\347\263\273.txt" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript Html jsp \346\223\215\347\272\265\345\205\263\347\263\273.txt" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/BOM\345\222\214DOM\347\232\204\347\273\223\346\236\204\345\205\263\347\263\273\347\244\272\346\204\217\345\233\276.jpg" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/BOM\345\222\214DOM\347\232\204\347\273\223\346\236\204\345\205\263\347\263\273\347\244\272\346\204\217\345\233\276.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/BOM\345\222\214DOM\347\232\204\347\273\223\346\236\204\345\205\263\347\263\273\347\244\272\346\204\217\345\233\276.jpg" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/BOM\345\222\214DOM\347\232\204\347\273\223\346\236\204\345\205\263\347\263\273\347\244\272\346\204\217\345\233\276.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javaScript\350\277\220\347\256\227\347\254\246.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javaScript\350\277\220\347\256\227\347\254\246.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javaScript\350\277\220\347\256\227\347\254\246.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javaScript\350\277\220\347\256\227\347\254\246.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\207\275\346\225\260\345\237\272\347\241\200.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\207\275\346\225\260\345\237\272\347\241\200.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\207\275\346\225\260\345\237\272\347\241\200.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\207\275\346\225\260\345\237\272\347\241\200.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\217\230\351\207\217.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\217\230\351\207\217.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\217\230\351\207\217.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\217\230\351\207\217.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\237\272\347\241\200DOM\346\223\215\344\275\234.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\237\272\347\241\200DOM\346\223\215\344\275\234.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\237\272\347\241\200DOM\346\223\215\344\275\234.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\237\272\347\241\200DOM\346\223\215\344\275\234.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\345\255\227\347\254\246\344\270\262\345\207\275\346\225\260.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\225\260\347\273\204.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\225\260\347\273\204.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\225\260\347\273\204.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\225\260\347\273\204.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\265\201\347\250\213\350\257\255\345\217\245.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\265\201\347\250\213\350\257\255\345\217\245.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\265\201\347\250\213\350\257\255\345\217\245.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/javascript\346\265\201\347\250\213\350\257\255\345\217\245.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/window\345\257\271\350\261\241.gif" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/window\345\257\271\350\261\241.gif" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/window\345\257\271\350\261\241.gif" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/window\345\257\271\350\261\241.gif" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML jQuery.png" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML jQuery.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML jQuery.png" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML jQuery.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML javascript Dom.png" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML javascript Dom.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML javascript Dom.png" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript-png/\346\223\215\344\275\234HTML javascript Dom.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\344\272\213\344\273\266.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\344\272\213\344\273\266.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\344\272\213\344\273\266.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\344\272\213\344\273\266.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\345\216\237\345\236\213\351\223\276.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\345\216\237\345\236\213\351\223\276.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\345\216\237\345\236\213\351\223\276.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/javaScript\345\216\237\345\236\213\351\223\276.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/js jsp html \345\205\263\347\263\273.pptx" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/js jsp html \345\205\263\347\263\273.pptx" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/js jsp html \345\205\263\347\263\273.pptx" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/js jsp html \345\205\263\347\263\273.pptx" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/readme.md" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/readme.md" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/readme.md" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/readme.md" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/web\350\267\250\345\237\237.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/web\350\267\250\345\237\237.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/web\350\267\250\345\237\237.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/web\350\267\250\345\237\237.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\345\256\211\345\205\250 \350\256\244\350\257\201.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\345\256\211\345\205\250 \350\256\244\350\257\201.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\345\256\211\345\205\250 \350\256\244\350\257\201.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\345\256\211\345\205\250 \350\256\244\350\257\201.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-all.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-all.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-all.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-all.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-lib.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-lib.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-lib.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-lib.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\270\270\350\257\206.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\270\270\350\257\206.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\270\270\350\257\206.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\270\270\350\257\206.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\272\224\347\224\250.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\272\224\347\224\250.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\272\224\347\224\250.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\345\272\224\347\224\250.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\346\241\206\346\236\266.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\346\241\206\346\236\266.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\346\241\206\346\236\266.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\212\200\346\234\257-\346\241\206\346\236\266.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\241\206\346\236\266\351\200\211\345\236\213.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\241\206\346\236\266\351\200\211\345\236\213.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\241\206\346\236\266\351\200\211\345\236\213.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\211\215\347\253\257\346\241\206\346\236\266\351\200\211\345\236\213.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\212\250\346\200\201this\345\200\274.xmind" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\212\250\346\200\201this\345\200\274.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\212\250\346\200\201this\345\200\274.xmind" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\345\212\250\346\200\201this\345\200\274.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\351\200\211\346\213\251\345\231\250.jpg" "b/mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\351\200\211\346\213\251\345\231\250.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/49.\345\211\215\347\253\257\347\233\270\345\205\263/\351\200\211\346\213\251\345\231\250.jpg" rename to "mindmap_100/surprise/49.\345\211\215\347\253\257\347\233\270\345\205\263/\351\200\211\346\213\251\345\231\250.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/ABP\346\241\206\346\236\266\347\232\204\345\255\246\344\271\240\350\267\257\347\272\277\345\233\276-\347\276\244\345\217\213\347\211\210.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/ABP\346\241\206\346\236\266\347\232\204\345\255\246\344\271\240\350\267\257\347\272\277\345\233\276-\347\276\244\345\217\213\347\211\210.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/ABP\346\241\206\346\236\266\347\232\204\345\255\246\344\271\240\350\267\257\347\272\277\345\233\276-\347\276\244\345\217\213\347\211\210.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/ABP\346\241\206\346\236\266\347\232\204\345\255\246\344\271\240\350\267\257\347\272\277\345\233\276-\347\276\244\345\217\213\347\211\210.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/App Store\346\234\200\346\226\260\345\256\241\346\240\270\346\214\207\345\215\227.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/App Store\346\234\200\346\226\260\345\256\241\346\240\270\346\214\207\345\215\227.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/App Store\346\234\200\346\226\260\345\256\241\346\240\270\346\214\207\345\215\227.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/App Store\346\234\200\346\226\260\345\256\241\346\240\270\346\214\207\345\215\227.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Asp.net Core Architecture.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Asp.net Core Architecture.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Asp.net Core Architecture.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Asp.net Core Architecture.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C Sharp\347\274\226\350\257\221.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C Sharp\347\274\226\350\257\221.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C Sharp\347\274\226\350\257\221.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C Sharp\347\274\226\350\257\221.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C#\345\205\250\346\240\210.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C#\345\205\250\346\240\210.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C#\345\205\250\346\240\210.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/C#\345\205\250\346\240\210.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Computer.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Computer.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Computer.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Computer.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/DB(sql server).png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/DB(sql server).png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/DB(sql server).png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/DB(sql server).png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Development Stack.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Development Stack.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Development Stack.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Development Stack.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/JavaWeb\345\272\224\347\224\250\345\256\211\345\205\250.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Nmap \346\200\235\347\273\264\345\257\274\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Nmap \346\200\235\347\273\264\345\257\274\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Nmap \346\200\235\347\273\264\345\257\274\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Nmap \346\200\235\347\273\264\345\257\274\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/PHP\344\273\243\347\240\201\345\256\241\350\256\241\350\204\221\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/PHP\344\273\243\347\240\201\345\256\241\350\256\241\350\204\221\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/PHP\344\273\243\347\240\201\345\256\241\350\256\241\350\204\221\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/PHP\344\273\243\347\240\201\345\256\241\350\256\241\350\204\221\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Redis.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Redis.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Redis.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Redis.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SQLmap\350\204\221\345\233\276.jpg" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SQLmap\350\204\221\345\233\276.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SQLmap\350\204\221\345\233\276.jpg" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SQLmap\350\204\221\345\233\276.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SSRF\350\204\221\345\233\276.jpg" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SSRF\350\204\221\345\233\276.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SSRF\350\204\221\345\233\276.jpg" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/SSRF\350\204\221\345\233\276.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/WPF\344\275\223\347\263\273\347\273\223\346\236\204.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/WPF\344\275\223\347\263\273\347\273\223\346\236\204.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/WPF\344\275\223\347\263\273\347\273\223\346\236\204.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/WPF\344\275\223\347\263\273\347\273\223\346\236\204.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web Front End Stack.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web Front End Stack.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web Front End Stack.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web Front End Stack.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web\345\272\224\347\224\250\345\256\211\345\205\250(By Neeao).jpg" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web\345\272\224\347\224\250\345\256\211\345\205\250(By Neeao).jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web\345\272\224\347\224\250\345\256\211\345\205\250(By Neeao).jpg" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/Web\345\272\224\347\224\250\345\256\211\345\205\250(By Neeao).jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XML\345\256\211\345\205\250\346\261\207\346\200\273.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XML\345\256\211\345\205\250\346\261\207\346\200\273.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XML\345\256\211\345\205\250\346\261\207\346\200\273.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XML\345\256\211\345\205\250\346\261\207\346\200\273.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS2.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS2.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS2.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS2.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS\350\204\221\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS\350\204\221\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS\350\204\221\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/XSS\350\204\221\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/aspnetcore-developer-roadmap.zh-Hans.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/aspnetcore-developer-roadmap.zh-Hans.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/aspnetcore-developer-roadmap.zh-Hans.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/aspnetcore-developer-roadmap.zh-Hans.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/backend.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/backend.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/backend.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/backend.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/devops.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/devops.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/devops.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/devops.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/frontend-v2.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/frontend-v2.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/frontend-v2.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/frontend-v2.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\347\211\210\350\267\257\347\272\277\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\347\211\210\350\267\257\347\272\277\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\347\211\210\350\267\257\347\272\277\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\347\211\210\350\267\257\347\272\277\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\350\257\201\344\271\246&\346\211\223\345\214\205&\344\270\212\346\236\266.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\350\257\201\344\271\246&\346\211\223\345\214\205&\344\270\212\346\236\266.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\350\257\201\344\271\246&\346\211\223\345\214\205&\344\270\212\346\236\266.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/iOS\350\257\201\344\271\246&\346\211\223\345\214\205&\344\270\212\346\236\266.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/nmap\346\270\227\351\200\217\346\265\213\350\257\225\346\214\207\345\215\227.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/nmap\346\270\227\351\200\217\346\265\213\350\257\225\346\214\207\345\215\227.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/nmap\346\270\227\351\200\217\346\265\213\350\257\225\346\214\207\345\215\227.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/nmap\346\270\227\351\200\217\346\265\213\350\257\225\346\214\207\345\215\227.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/xss virus 1.0.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/xss virus 1.0.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/xss virus 1.0.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/xss virus 1.0.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\270\232\345\212\241\345\256\211\345\205\250top10.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\270\232\345\212\241\345\256\211\345\205\250top10.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\270\232\345\212\241\345\256\211\345\205\250top10.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\270\232\345\212\241\345\256\211\345\205\250top10.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\273\243\347\240\201\345\256\241\350\256\241\347\232\204\346\272\242\345\207\272\350\204\221\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\273\243\347\240\201\345\256\241\350\256\241\347\232\204\346\272\242\345\207\272\350\204\221\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\273\243\347\240\201\345\256\241\350\256\241\347\232\204\346\272\242\345\207\272\350\204\221\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\273\243\347\240\201\345\256\241\350\256\241\347\232\204\346\272\242\345\207\272\350\204\221\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\274\201\344\270\232\345\256\211\345\205\250\351\230\262\345\276\241\346\200\235\347\273\264\345\257\274\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\274\201\344\270\232\345\256\211\345\205\250\351\230\262\345\276\241\346\200\235\347\273\264\345\257\274\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\274\201\344\270\232\345\256\211\345\205\250\351\230\262\345\276\241\346\200\235\347\273\264\345\257\274\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\344\274\201\344\270\232\345\256\211\345\205\250\351\230\262\345\276\241\346\200\235\347\273\264\345\257\274\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\205\245\351\227\250\344\272\214\350\277\233\345\210\266\346\274\217\346\264\236\345\210\206\346\236\220\350\204\221\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\205\245\351\227\250\344\272\214\350\277\233\345\210\266\346\274\217\346\264\236\345\210\206\346\236\220\350\204\221\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\205\245\351\227\250\344\272\214\350\277\233\345\210\266\346\274\217\346\264\236\345\210\206\346\236\220\350\204\221\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\205\245\351\227\250\344\272\214\350\277\233\345\210\266\346\274\217\346\264\236\345\210\206\346\236\220\350\204\221\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\256\211\345\205\250\350\277\220\347\273\264\350\204\221\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\256\211\345\205\250\350\277\220\347\273\264\350\204\221\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\256\211\345\205\250\350\277\220\347\273\264\350\204\221\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\256\211\345\205\250\350\277\220\347\273\264\350\204\221\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\257\206\347\240\201\346\211\276\345\233\236\351\200\273\350\276\221\346\274\217\346\264\236.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\257\206\347\240\201\346\211\276\345\233\236\351\200\273\350\276\221\346\274\217\346\264\236.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\257\206\347\240\201\346\211\276\345\233\236\351\200\273\350\276\221\346\274\217\346\264\236.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\257\206\347\240\201\346\211\276\345\233\236\351\200\273\350\276\221\346\274\217\346\264\236.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235QQ,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235QQ,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235QQ,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235QQ,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235\345\276\256\344\277\241,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235\345\276\256\344\277\241,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235\345\276\256\344\277\241,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\272\224\347\224\250\345\256\235\345\276\256\344\277\241,APP\344\270\213\350\275\275\345\274\225\345\257\274\346\265\201\347\250\213.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\274\200\346\272\220\351\241\271\347\233\256&\347\275\221\347\253\231\346\250\241\346\235\277.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\274\200\346\272\220\351\241\271\347\233\256&\347\275\221\347\253\231\346\250\241\346\235\277.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\274\200\346\272\220\351\241\271\347\233\256&\347\275\221\347\253\231\346\250\241\346\235\277.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\345\274\200\346\272\220\351\241\271\347\233\256&\347\275\221\347\253\231\346\250\241\346\235\277.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\203\205\346\212\245\346\224\266\351\233\206\350\204\221\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\203\205\346\212\245\346\224\266\351\233\206\350\204\221\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\203\205\346\212\245\346\224\266\351\233\206\350\204\221\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\203\205\346\212\245\346\224\266\351\233\206\350\204\221\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\212\200\346\234\257\346\240\210.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\212\200\346\234\257\346\240\210.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\212\200\346\234\257\346\240\210.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\212\200\346\234\257\346\240\210.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\225\260\346\215\256\345\272\223\351\224\201.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\225\260\346\215\256\345\272\223\351\224\201.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\225\260\346\215\256\345\272\223\351\224\201.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\225\260\346\215\256\345\272\223\351\224\201.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\265\217\350\247\210\345\231\250\345\256\211\345\205\250\346\200\235\347\273\264\345\257\274\345\233\276.jpg" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\265\217\350\247\210\345\231\250\345\256\211\345\205\250\346\200\235\347\273\264\345\257\274\345\233\276.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\265\217\350\247\210\345\231\250\345\256\211\345\205\250\346\200\235\347\273\264\345\257\274\345\233\276.jpg" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\265\217\350\247\210\345\231\250\345\256\211\345\205\250\346\200\235\347\273\264\345\257\274\345\233\276.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\346\265\213\350\257\225.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\346\265\213\350\257\225.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\346\265\213\350\257\225.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\346\265\213\350\257\225.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\347\232\204\350\211\272\346\234\257.jpg" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\347\232\204\350\211\272\346\234\257.jpg" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\347\232\204\350\211\272\346\234\257.jpg" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\346\270\227\351\200\217\347\232\204\350\211\272\346\234\257.jpg" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\347\247\273\345\212\250\345\274\200\345\217\221\350\267\257\347\272\277\345\233\276.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\347\247\273\345\212\250\345\274\200\345\217\221\350\267\257\347\272\277\345\233\276.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\347\247\273\345\212\250\345\274\200\345\217\221\350\267\257\347\272\277\345\233\276.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\347\247\273\345\212\250\345\274\200\345\217\221\350\267\257\347\272\277\345\233\276.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Android.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Android.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Android.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Android.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Java.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Java.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Java.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-Java.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272 v2.0 .xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272 v2.0 .xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272 v2.0 .xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272 v2.0 .xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\201\214\350\203\275\345\234\260\345\233\276-\344\270\252\344\272\272.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213(\346\262\203\350\265\233).mpp" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213(\346\262\203\350\265\233).mpp" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213(\346\262\203\350\265\233).mpp" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213(\346\262\203\350\265\233).mpp" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213-\351\233\206\346\210\220\346\265\213\350\257\225\350\277\207\347\250\213.mpp" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213-\351\233\206\346\210\220\346\265\213\350\257\225\350\277\207\347\250\213.mpp" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213-\351\233\206\346\210\220\346\265\213\350\257\225\350\277\207\347\250\213.mpp" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213-\351\233\206\346\210\220\346\265\213\350\257\225\350\277\207\347\250\213.mpp" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213\346\226\207\346\241\243.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213\346\226\207\346\241\243.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213\346\226\207\346\241\243.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\344\273\266\350\277\207\347\250\213\346\226\207\346\241\243.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\344\277\241\346\201\257\347\263\273\347\273\237\351\241\271\347\233\256\347\256\241\347\220\206\345\270\210.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\344\277\241\346\201\257\347\263\273\347\273\237\351\241\271\347\233\256\347\256\241\347\220\206\345\270\210.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\344\277\241\346\201\257\347\263\273\347\273\237\351\241\271\347\233\256\347\256\241\347\220\206\345\270\210.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\344\277\241\346\201\257\347\263\273\347\273\237\351\241\271\347\233\256\347\256\241\347\220\206\345\270\210.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\347\263\273\347\273\237\345\210\206\346\236\220\345\270\210.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\347\263\273\347\273\237\345\210\206\346\236\220\345\270\210.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\347\263\273\347\273\237\345\210\206\346\236\220\345\270\210.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\275\257\350\200\203-\347\263\273\347\273\237\345\210\206\346\236\220\345\270\210.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\256\211\345\205\250.png" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\256\211\345\205\250.png" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\256\211\345\205\250.png" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\256\211\345\205\250.png" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\267\245\344\275\234.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\267\245\344\275\234.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\267\245\344\275\234.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\350\277\220\347\273\264\345\267\245\344\275\234.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\230\277\351\207\214\344\272\221\347\233\276.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\230\277\351\207\214\344\272\221\347\233\276.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\230\277\351\207\214\344\272\221\347\233\276.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\230\277\351\207\214\344\272\221\347\233\276.xmind" diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\235\242\345\220\221\345\257\271\350\261\241\345\210\206\346\236\220\345\222\214\350\256\276\350\256\241.xmind" "b/mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\235\242\345\220\221\345\257\271\350\261\241\345\210\206\346\236\220\345\222\214\350\256\276\350\256\241.xmind" old mode 100755 new mode 100644 similarity index 100% rename from "\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\235\242\345\220\221\345\257\271\350\261\241\345\210\206\346\236\220\345\222\214\350\256\276\350\256\241.xmind" rename to "mindmap_100/surprise/99.\345\205\266\344\273\226\350\204\221\345\233\276 100 \345\274\240/\351\235\242\345\220\221\345\257\271\350\261\241\345\210\206\346\236\220\345\222\214\350\256\276\350\256\241.xmind" diff --git a/mindmap_100/surprise/README.md b/mindmap_100/surprise/README.md new file mode 100644 index 00000000..9121ee10 --- /dev/null +++ b/mindmap_100/surprise/README.md @@ -0,0 +1,5 @@ +### I spent a lot of time editing more than 100 mind maps, covering all areas of programming. But my English ability is average, I need you to complete the help! + +### example: + +> [![Click to view](https://www.geekxh.com/demo-1.png)](https://www.geekxh.com/demo-1.png) \ No newline at end of file diff --git a/mybook/README.md b/mybook/README.md new file mode 100644 index 00000000..872463a6 --- /dev/null +++ b/mybook/README.md @@ -0,0 +1,7 @@ +How did I write this book in a month? + +It's just that the epidemic is too boring!!!!! + +If you'd like to translate for me..... + +Please have hot pot in Beijing later !!! \ No newline at end of file diff --git "a/\345\260\217\346\265\251\347\256\227\346\263\225\345\233\276\350\247\243 100 \351\201\223/\345\222\214\345\260\217\346\265\251\345\255\246\347\256\227\346\263\225(0701\347\211\210\346\234\254).pdf" "b/mybook/\345\222\214\345\260\217\346\265\251\345\255\246\347\256\227\346\263\225(0701\347\211\210\346\234\254).pdf" old mode 100755 new mode 100644 similarity index 100% rename from "\345\260\217\346\265\251\347\256\227\346\263\225\345\233\276\350\247\243 100 \351\201\223/\345\222\214\345\260\217\346\265\251\345\255\246\347\256\227\346\263\225(0701\347\211\210\346\234\254).pdf" rename to "mybook/\345\222\214\345\260\217\346\265\251\345\255\246\347\256\227\346\263\225(0701\347\211\210\346\234\254).pdf" diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7faeec09..00000000 --- a/package-lock.json +++ /dev/null @@ -1,12150 +0,0 @@ -{ - "name": "geekxh.com", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@algolia/cache-browser-local-storage": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.2.0.tgz", - "integrity": "sha512-uji5zxBxwNu8qKtyqghg9lUsN0OOZ58NfRKk0Il4IZCcCo78E0KfT3Uxr7XiYCJMRnqIsvbKWf0xA67tYNBSbA==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.2.0" - } - }, - "@algolia/cache-common": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.2.0.tgz", - "integrity": "sha512-ATBQCBBLt4hPNKIKn06y5zqZPWQmI+PBF0287rFVj8BGmEr82BzoKMa5XIkvgpjtxwx6c5nSKxZaYkEFqtrxtQ==", - "dev": true - }, - "@algolia/cache-in-memory": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.2.0.tgz", - "integrity": "sha512-NsVOR6ixK6jvurLW+1+h80/9N18QjU/AXdAZJoVeu4JXb2NPuej4Ld1zXFYvz/ypCFQE+dU8haaQnJIuTbD4vg==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.2.0" - } - }, - "@algolia/client-account": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.2.0.tgz", - "integrity": "sha512-xz5OXU9DQ9pegABAgmTPV23f9tXmbUPO3w5J/b2QcP6jzfNnNfW3CkTwywgNLr16jIKLxmmClN5yqyJp6XmHBA==", - "dev": true, - "requires": { - "@algolia/client-common": "4.2.0", - "@algolia/client-search": "4.2.0", - "@algolia/transporter": "4.2.0" - } - }, - "@algolia/client-analytics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.2.0.tgz", - "integrity": "sha512-UNuZQOYuKPYl5fCgm1HZzoZ6Ewxtqrc4Cv5Dhdy5VatIV6lYEWOtdn+g+5qvWFGb6fv6688dg5EVJnXZNvVVZQ==", - "dev": true, - "requires": { - "@algolia/client-common": "4.2.0", - "@algolia/client-search": "4.2.0", - "@algolia/requester-common": "4.2.0", - "@algolia/transporter": "4.2.0" - } - }, - "@algolia/client-common": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.2.0.tgz", - "integrity": "sha512-KxZTWXf9FSl188iTAz9rhTMeBtbF/uaJcxw99jbWHxyK9KR87obZzTlTFYnIWLEBaTG1MmlgPSsDogAE4CHLOQ==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.2.0", - "@algolia/transporter": "4.2.0" - } - }, - "@algolia/client-recommendation": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.2.0.tgz", - "integrity": "sha512-5QwvUJ5hpZVDz99o+EPgMg+z7maLWOZGUrUt5z8s+esl+taTb2h1PtyLpikAvC2d/BjYCEKyObTiRDYdzhqcoA==", - "dev": true, - "requires": { - "@algolia/client-common": "4.2.0", - "@algolia/requester-common": "4.2.0", - "@algolia/transporter": "4.2.0" - } - }, - "@algolia/client-search": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.2.0.tgz", - "integrity": "sha512-2SAz1/undr+RM7FNj3G0taWFG+8QEMQcYHxUhoOJKMIY9sPQN7UNCJRHYsulM+/g45oF67tXX09NSt14ewen0Q==", - "dev": true, - "requires": { - "@algolia/client-common": "4.2.0", - "@algolia/requester-common": "4.2.0", - "@algolia/transporter": "4.2.0" - } - }, - "@algolia/logger-common": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.2.0.tgz", - "integrity": "sha512-VQcJE5lr78oc+lbcGfPonCDTRwLNSxwtPrUP6Tj+CoDedsVHZhODAlHzLHhxc4vuyrU7xomvKJLqTUgfDNxzXQ==", - "dev": true - }, - "@algolia/logger-console": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.2.0.tgz", - "integrity": "sha512-/1GE43jY0xKfJUi5ZGtEqq+oTyOzs+EgGKj7/zEHIpUc5NyxokIPWTqt3q6pzGSWFEkNbaA1gAVgXM1zCMVWYw==", - "dev": true, - "requires": { - "@algolia/logger-common": "4.2.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.2.0.tgz", - "integrity": "sha512-+PZKOe+UBdZYQg/h/8AbKQ2Ha4uDeoLnpZFv00IMr/elym0m2hl76xAeIBiIqGYsLCmGybGBFUF9n1imsKJUJQ==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.2.0" - } - }, - "@algolia/requester-common": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.2.0.tgz", - "integrity": "sha512-SSKPRM/7UP54/dxyK6EYt4p6nTeJxYb1P6xVh/Ic6noBTCfqg5vBEKDa1DZD5MBtCvABoODd97UOfAo3ECG/jg==", - "dev": true - }, - "@algolia/requester-node-http": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.2.0.tgz", - "integrity": "sha512-mRQgSM8qrMfjXaBnMjTmymR0NKwbr82Qwh1a5TgYyzMOBuRO5nRikawvTVgpNaEnQS0uesIiwd2ohOJ2gNu6oA==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.2.0" - } - }, - "@algolia/transporter": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.2.0.tgz", - "integrity": "sha512-7CiwMYsEhrHySA8q70euIYOyhGtz/wz+MEC3nwGONBC82nGI6ntVqTFhCkpLIJqqbGbNlFgnCpwnLmSqLhRP3A==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.2.0", - "@algolia/logger-common": "4.2.0", - "@algolia/requester-common": "4.2.0" - } - }, - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/compat-data": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", - "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", - "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", - "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", - "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.1", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", - "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", - "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-regex": "^7.10.1", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", - "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", - "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", - "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", - "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", - "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", - "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-wrap-function": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", - "dev": true, - "requires": { - "@babel/types": "^7.10.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", - "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", - "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", - "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz", - "integrity": "sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-decorators": "^7.10.1" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", - "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", - "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", - "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", - "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-numeric-separator": "^7.10.1" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", - "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", - "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", - "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", - "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", - "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", - "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz", - "integrity": "sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", - "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", - "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", - "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", - "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", - "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", - "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", - "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", - "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-define-map": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", - "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", - "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", - "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", - "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", - "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", - "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", - "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", - "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", - "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", - "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", - "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", - "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.1", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", - "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", - "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", - "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", - "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", - "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", - "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", - "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz", - "integrity": "sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", - "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", - "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", - "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-regex": "^7.10.1" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", - "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", - "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", - "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", - "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" - } - }, - "@babel/preset-env": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", - "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.2", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.1", - "@babel/plugin-proposal-json-strings": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-private-methods": "^7.10.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.1", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.1", - "@babel/plugin-transform-arrow-functions": "^7.10.1", - "@babel/plugin-transform-async-to-generator": "^7.10.1", - "@babel/plugin-transform-block-scoped-functions": "^7.10.1", - "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", - "@babel/plugin-transform-destructuring": "^7.10.1", - "@babel/plugin-transform-dotall-regex": "^7.10.1", - "@babel/plugin-transform-duplicate-keys": "^7.10.1", - "@babel/plugin-transform-exponentiation-operator": "^7.10.1", - "@babel/plugin-transform-for-of": "^7.10.1", - "@babel/plugin-transform-function-name": "^7.10.1", - "@babel/plugin-transform-literals": "^7.10.1", - "@babel/plugin-transform-member-expression-literals": "^7.10.1", - "@babel/plugin-transform-modules-amd": "^7.10.1", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", - "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.10.1", - "@babel/plugin-transform-object-super": "^7.10.1", - "@babel/plugin-transform-parameters": "^7.10.1", - "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", - "@babel/plugin-transform-reserved-words": "^7.10.1", - "@babel/plugin-transform-shorthand-properties": "^7.10.1", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", - "@babel/plugin-transform-typeof-symbol": "^7.10.1", - "@babel/plugin-transform-unicode-escapes": "^7.10.1", - "@babel/plugin-transform-unicode-regex": "^7.10.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.2", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", - "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs2": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.10.2.tgz", - "integrity": "sha512-ZLwsFnNm3WpIARU1aLFtufjMHsmEnc8TjtrfAjmbgMbeoyR+LuQoyESoNdTfeDhL6IdY12SpeycXMgSgl8XGXA==", - "dev": true, - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" - } - }, - "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@leancloud/adapter-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@leancloud/adapter-types/-/adapter-types-3.0.0.tgz", - "integrity": "sha512-/1l2PWJ6pXizHphBorMN7B0d2YjmxZJf1s+bitvLALt7wBid5qbGpHqGGKE/yRdNlCKwl9FbXG1x5wUFZfQwHQ==", - "dev": true - }, - "@leancloud/adapters-superagent": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@leancloud/adapters-superagent/-/adapters-superagent-1.0.4.tgz", - "integrity": "sha512-B8WndkFVoCRXJVZVV8FgSq2SQaSy2vDPwf2s20uKoUtCxe1Je/XuDnPd0Ujdr1Kt46a2w+uivxxuMPlW6JSOnQ==", - "dev": true, - "requires": { - "@leancloud/adapter-types": "^3.0.0", - "@types/superagent": "^4.1.7", - "superagent": "^5.2.2" - }, - "dependencies": { - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "superagent": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.2.tgz", - "integrity": "sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ==", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.1", - "methods": "^1.1.2", - "mime": "^2.4.4", - "qs": "^6.9.1", - "readable-stream": "^3.4.0", - "semver": "^6.3.0" - } - } - } - }, - "@leancloud/platform-adapters-browser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@leancloud/platform-adapters-browser/-/platform-adapters-browser-1.1.0.tgz", - "integrity": "sha512-XOCSOH4fiMxU0ykEwMpkxNLllLtZCfoH0y/NrWXpi/P2hmAJQchrPNbRcv2bUVevaoNiRG5HXZZAHzPxxYICUA==", - "dev": true, - "requires": { - "@leancloud/adapter-types": "^3.0.0", - "@leancloud/adapters-superagent": "^1.0.4" - } - }, - "@leancloud/platform-adapters-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@leancloud/platform-adapters-node/-/platform-adapters-node-1.1.0.tgz", - "integrity": "sha512-ewVJxTdgeSny9iUQ5jGwOaZpoHvWFTocInbpRCFfZjTCeY1LrgUsxHPdNXqMXRSfvI7kSeA0W3YFfnhu0g5s8g==", - "dev": true, - "requires": { - "@leancloud/adapter-types": "^3.0.0", - "@leancloud/adapters-superagent": "^1.0.4", - "@types/ws": "^7.2.2", - "localstorage-memory": "^1.0.2", - "ws": "^5.2.2" - }, - "dependencies": { - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "@leancloud/platform-adapters-weapp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@leancloud/platform-adapters-weapp/-/platform-adapters-weapp-1.2.0.tgz", - "integrity": "sha512-U5v/4yVfKzkw7ZaWaIgwLWHuC/2FXyXxSQCupPkn0Rvmk3nJbj8PbquZZiVL0FA6Qe+u5INAbJ+WSCdasgDA5g==", - "dev": true, - "requires": { - "@leancloud/adapter-types": "^3.0.0", - "event-target-shim": "^5.0.1", - "miniprogram-api-typings": "^2.10.2" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", - "dev": true - }, - "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", - "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/superagent": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.7.tgz", - "integrity": "sha512-JSwNPgRYjIC4pIeOqLwWwfGj6iP1n5NE6kNBEbGx2V8H78xCPwx7QpNp9plaI30+W3cFEzJO7BIIsXE+dbtaGg==", - "dev": true, - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "@types/ws": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.5.tgz", - "integrity": "sha512-4UEih9BI1nBKii385G9id1oFrSkLcClbwtDfcYj8HJLQqZVAtb/42vXVrYvRWCcufNF/a+rZD3MxNwghA7UmCg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@vssue/api-bitbucket-v2": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vssue/api-bitbucket-v2/-/api-bitbucket-v2-1.4.0.tgz", - "integrity": "sha512-xy0+5xOxDWj8i5NG5GM3irFz/MbxKMn40SZlE7cIc1V0d8seBHAbRTdBK7rYGObJh6710C2rxqF5Wb/sZDfBPw==", - "dev": true, - "requires": { - "@vssue/utils": "^1.4.0", - "axios": "^0.18.1" - } - }, - "@vssue/api-gitee-v5": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@vssue/api-gitee-v5/-/api-gitee-v5-1.4.4.tgz", - "integrity": "sha512-fQ4dt7H0lb770jZfga7ZkrdRv5wFXjcA+wyJekq2waS9pJvgHcJHmIHjqB4FiFsano0i9UBiP7qEXdTOyaR2Xg==", - "dev": true, - "requires": { - "@vssue/utils": "^1.4.0", - "axios": "^0.18.1" - } - }, - "@vssue/api-github-v3": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@vssue/api-github-v3/-/api-github-v3-1.4.4.tgz", - "integrity": "sha512-/ZQwO+/XgHz7hnVX6zLIWA0L1fmI4LBzQoRp1J56tonH6gbDpvl/VZ8VHIcSldHnpEsjf8wYmbIEz8rJd7jG2Q==", - "dev": true, - "requires": { - "@vssue/utils": "^1.4.0", - "axios": "^0.18.1" - } - }, - "@vssue/api-github-v4": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vssue/api-github-v4/-/api-github-v4-1.4.0.tgz", - "integrity": "sha512-AdMYX62zXolvbJl0YoLjMQfoyIaK+pso2TVb34L+tjqfxgfubRm6mE/pWU7cKLiWMn6IaiS0LotC2O4y/omqDQ==", - "dev": true, - "requires": { - "@vssue/utils": "^1.4.0", - "axios": "^0.18.1" - } - }, - "@vssue/api-gitlab-v4": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vssue/api-gitlab-v4/-/api-gitlab-v4-1.4.0.tgz", - "integrity": "sha512-NVjDsmIgswUFGw7jVnRlEr7RFH0+aqhfDRD/zFpgb+JG+FZNbM/h2d5A/HftYjNXzJglnl1q67yFUBrIxM78jQ==", - "dev": true, - "requires": { - "@vssue/utils": "^1.4.0", - "axios": "^0.18.1" - } - }, - "@vssue/utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vssue/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-3d9WCYNurdFKApFzU8i7YD1GCGhunEVYnwSJxwQ2rDmEdpLneAYNJWg9+QS6bqzB+Pw7ymtwLf/Sqti9+xUGqA==", - "dev": true, - "requires": { - "date-fns": "^1.29.0", - "qs": "^6.6.0" - } - }, - "@vssue/vuepress-plugin-vssue": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@vssue/vuepress-plugin-vssue/-/vuepress-plugin-vssue-1.4.6.tgz", - "integrity": "sha512-oP63mMvue54ASrfMJVTpmT74is4eU2OeAqDqSOLYUytpqgba2AKPXnq6xhY8fua/+hxpttq0pOVajF6GL4WTgg==", - "dev": true, - "requires": { - "vssue": "^1.4.6" - } - }, - "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", - "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==", - "dev": true - }, - "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz", - "integrity": "sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - } - }, - "@vue/babel-preset-app": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.4.1.tgz", - "integrity": "sha512-VHVROEBBiW0dnuNuzlFElkncXo+zxh5Px0MZ51Th5da8UPbQodf43mnpotMnFtmCPTXAFL58tzDttu1FgrgfpQ==", - "dev": true, - "requires": { - "@babel/core": "^7.9.6", - "@babel/helper-compilation-targets": "^7.9.6", - "@babel/helper-module-imports": "^7.8.3", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.9.6", - "@babel/preset-env": "^7.9.6", - "@babel/runtime": "^7.9.6", - "@vue/babel-preset-jsx": "^1.1.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.6.5", - "core-js-compat": "^3.6.5", - "semver": "^6.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@vue/babel-preset-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz", - "integrity": "sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==", - "dev": true, - "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "@vue/babel-sugar-functional-vue": "^1.1.2", - "@vue/babel-sugar-inject-h": "^1.1.2", - "@vue/babel-sugar-v-model": "^1.1.2", - "@vue/babel-sugar-v-on": "^1.1.2" - } - }, - "@vue/babel-sugar-functional-vue": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz", - "integrity": "sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-inject-h": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz", - "integrity": "sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-v-model": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz", - "integrity": "sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - } - }, - "@vue/babel-sugar-v-on": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz", - "integrity": "sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "camelcase": "^5.0.0" - } - }, - "@vue/component-compiler-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz", - "integrity": "sha512-QLq9z8m79mCinpaEeSURhnNCN6djxpHw0lpP/bodMlt5kALfONpryMthvnrQOlTcIKoF+VoPi+lPHUYeDFPXug==", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "@vuepress-reco/vuepress-plugin-back-to-top": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vuepress-reco/vuepress-plugin-back-to-top/-/vuepress-plugin-back-to-top-1.4.0.tgz", - "integrity": "sha512-h2pMkHTH/yTqVAyLsZSrS5Oh4RJpqM0xxtDMKZth4EaxnGeiB5VqrG+M6Fht8nxjUHFZ8Zy9JIduIe4tgP1jOw==", - "dev": true - }, - "@vuepress-reco/vuepress-plugin-comments": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@vuepress-reco/vuepress-plugin-comments/-/vuepress-plugin-comments-1.4.6.tgz", - "integrity": "sha512-T9Ny4EHVtIURxk+/m+QCCHshoDIRc6pn2tBkjpuStdbLunVijvOBQBBIz4g/uE0dBFXZnd4jtGpy/mOE+bHeyg==", - "dev": true, - "requires": { - "@vssue/api-bitbucket-v2": "^1.1.1", - "@vssue/api-gitee-v5": "^1.4.4", - "@vssue/api-github-v3": "^1.4.4", - "@vssue/api-github-v4": "^1.2.0", - "@vssue/api-gitlab-v4": "^1.1.1", - "valine": "^1.4.14", - "vssue": "^1.4.6" - }, - "dependencies": { - "valine": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/valine/-/valine-1.4.14.tgz", - "integrity": "sha512-1gVRXZUDqzTt2I43xivOotXchGdYCCW+Av+laXImzcUVI3DrGR4AQbh3LbDsFpZq+N26u+p+qzB9mjliLYO3YQ==", - "dev": true, - "requires": { - "balajs": "^1.0.7", - "balalaika": "^1.0.1", - "element-closest": "^3.0.2", - "leancloud-storage": "^3.0.4", - "storejs": "^1.0.25", - "xss": "^1.0.6" - } - } - } - }, - "@vuepress-reco/vuepress-plugin-loading-page": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vuepress-reco/vuepress-plugin-loading-page/-/vuepress-plugin-loading-page-1.4.0.tgz", - "integrity": "sha512-wDXvtZLKPEiEISPJBVrZQ/Xva5zMyQtmuUuPQpkEj96M5lnVPpJiFWlgZ4T2T9ANe2A7at8t59SszzVnSY1whw==", - "dev": true - }, - "@vuepress-reco/vuepress-plugin-pagation": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@vuepress-reco/vuepress-plugin-pagation/-/vuepress-plugin-pagation-1.4.6.tgz", - "integrity": "sha512-Y4n+MdkyOY10RMKtjhWQ7M4TlZ5KEkyGAin7BkBj8iJ5gudHB6vqCDX8aXzTrRpTECWZqnNhNs1uw02YU14eoQ==", - "dev": true - }, - "@vuepress/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.4.1.tgz", - "integrity": "sha512-R1oJeSiDQPw8sVo70mrP1Zn2H0nCqnAHb6DV9mpJBQ6ur4VT6qQnCpd2onKU+bZRLlEhm4G8IQNDEV+DuE7zZQ==", - "dev": true, - "requires": { - "@babel/core": "^7.8.4", - "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.4.1", - "@vuepress/markdown-loader": "1.4.1", - "@vuepress/plugin-last-updated": "1.4.1", - "@vuepress/plugin-register-components": "1.4.1", - "@vuepress/shared-utils": "1.4.1", - "autoprefixer": "^9.5.1", - "babel-loader": "^8.0.4", - "cache-loader": "^3.0.0", - "chokidar": "^2.0.3", - "connect-history-api-fallback": "^1.5.0", - "copy-webpack-plugin": "^5.0.2", - "core-js": "^3.6.4", - "cross-spawn": "^6.0.5", - "css-loader": "^2.1.1", - "file-loader": "^3.0.1", - "js-yaml": "^3.13.1", - "lru-cache": "^5.1.1", - "mini-css-extract-plugin": "0.6.0", - "optimize-css-assets-webpack-plugin": "^5.0.1", - "portfinder": "^1.0.13", - "postcss-loader": "^3.0.0", - "postcss-safe-parser": "^4.0.1", - "toml": "^3.0.0", - "url-loader": "^1.0.1", - "vue": "^2.6.10", - "vue-loader": "^15.7.1", - "vue-router": "^3.1.3", - "vue-server-renderer": "^2.6.10", - "vue-template-compiler": "^2.6.10", - "vuepress-html-webpack-plugin": "^3.2.0", - "vuepress-plugin-container": "^2.0.2", - "webpack": "^4.8.1", - "webpack-chain": "^6.0.0", - "webpack-dev-server": "^3.5.1", - "webpack-merge": "^4.1.2", - "webpackbar": "3.2.0" - } - }, - "@vuepress/markdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.4.1.tgz", - "integrity": "sha512-5a69ufnu1A3NXqQtzAE5LiR7EbtsQ1qe8UcIr+KizNO4gCg8+E8/uu3hxvDOLs2ElS6b0AihKIuwmeIgZkfeKA==", - "dev": true, - "requires": { - "@vuepress/shared-utils": "1.4.1", - "markdown-it": "^8.4.1", - "markdown-it-anchor": "^5.0.2", - "markdown-it-chain": "^1.3.0", - "markdown-it-emoji": "^1.4.0", - "markdown-it-table-of-contents": "^0.4.0", - "prismjs": "^1.13.0" - } - }, - "@vuepress/markdown-loader": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.4.1.tgz", - "integrity": "sha512-FGtZ15rRwo9iVMcJ0eX4tf1bxWSKKpC4NGNLJuYzaPlO9ND/U04jsj4Xj454piokr2JzBSmaJlIZTAG1EuiTNw==", - "dev": true, - "requires": { - "@vuepress/markdown": "1.4.1", - "loader-utils": "^1.1.0", - "lru-cache": "^5.1.1" - } - }, - "@vuepress/plugin-active-header-links": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.4.1.tgz", - "integrity": "sha512-xv/qDY6S8rHzLGDHtwn3XV7Gi3Fnevp6d3H18PFK3sNwT2KGzKIe2c7lbn1qHDRUWcxY7+EoT7zmdJwIeG6dWQ==", - "dev": true, - "requires": { - "lodash.debounce": "^4.0.8" - } - }, - "@vuepress/plugin-blog": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-1.9.2.tgz", - "integrity": "sha512-1y4C7miuJyhP2YV9+8SGPzcwbyNqQWB1WQQf1AYdWvlAK/QrFdTXOtFyBKoViJppHxIkLLz+45bvOm5sIqjv6w==", - "dev": true, - "requires": { - "@vssue/api-github-v3": "^1.1.2", - "@vssue/vuepress-plugin-vssue": "^1.2.0", - "dayjs": "^1.8.19", - "vuejs-paginate": "^2.1.0", - "vuepress-plugin-disqus": "^0.2.0", - "vuepress-plugin-feed": "^0.1.8", - "vuepress-plugin-mailchimp": "^1.4.1", - "vuepress-plugin-sitemap": "^2.3.1" - } - }, - "@vuepress/plugin-last-updated": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.4.1.tgz", - "integrity": "sha512-67ouc9cB3C19zcDqeJwhwqO9CXjy8G67tcXUgPpL/GsuK11oQbnR4rkupILvNa9HoemtCcF2aaxXSGsi/1VEtA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5" - } - }, - "@vuepress/plugin-medium-zoom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.4.1.tgz", - "integrity": "sha512-dMo8eDbmM1Y+zRRECjmCcqtuTirkpYn7FbByURRSauh2hFqjHSN/uOKOHEj71TTzs1vwrLCynHvKo6tFEuUMNA==", - "dev": true, - "requires": { - "medium-zoom": "^1.0.4" - } - }, - "@vuepress/plugin-nprogress": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.4.1.tgz", - "integrity": "sha512-CIhIuIgKtvk/ULENjefkZAJQqUstdZcqiM/Gs8CDyTKJITpwyqoZcgolFZ+1ZofUQuHuqDj1hKKm3AQ1cG3cBA==", - "dev": true, - "requires": { - "nprogress": "^0.2.0" - } - }, - "@vuepress/plugin-register-components": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.4.1.tgz", - "integrity": "sha512-6yI4J/tMhOASSLmlP+5p4ccljlWuNBRsyYSKiD5jWAV181oMmN32LtuoCggXBhSvQUgn2grxyjmYw+tcSV5KGQ==", - "dev": true, - "requires": { - "@vuepress/shared-utils": "1.4.1" - } - }, - "@vuepress/plugin-search": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.4.1.tgz", - "integrity": "sha512-J4JyXD6M1oOU013s4ZLKMkKEGd7qEtSIsAw2nZY2mckZ7ETX49R5Pv2S5uCqLRQfUQSIGR5TEABL22q0B8uCVA==", - "dev": true - }, - "@vuepress/shared-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.4.1.tgz", - "integrity": "sha512-FBUHFhvR7vk6glQy/qUntBz8bVeWiNYZ2/G16EKaerKKn15xAiD7tUFCQ3L/KjtQJ8TV38GK47UEXh7UTcRwQg==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "diacritics": "^1.3.0", - "escape-html": "^1.0.3", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "gray-matter": "^4.0.1", - "hash-sum": "^1.0.2", - "semver": "^6.0.0", - "upath": "^1.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@vuepress/theme-default": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.4.1.tgz", - "integrity": "sha512-QhU1ORj20xmGr9Gk5szWJyzHm8i+NqxotBTeOF4WsKewB/3SPamJUoipgX4VdChw9jVew1oJQw0TpyDZfiHx+A==", - "dev": true, - "requires": { - "@vuepress/plugin-active-header-links": "1.4.1", - "@vuepress/plugin-nprogress": "1.4.1", - "@vuepress/plugin-search": "1.4.1", - "docsearch.js": "^2.5.2", - "lodash": "^4.17.15", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.2", - "vuepress-plugin-container": "^2.0.2", - "vuepress-plugin-smooth-scroll": "^0.0.3" - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "agentkeepalive": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", - "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=", - "dev": true - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "algoliasearch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.2.0.tgz", - "integrity": "sha512-CgbyDBGMSzNISBFezPt68xAseknork+wNe/Oour1Hluk4OwbtobysRawFf93ZbLSQw/KbeGlVmVAvujeVIVdnQ==", - "dev": true, - "requires": { - "@algolia/cache-browser-local-storage": "4.2.0", - "@algolia/cache-common": "4.2.0", - "@algolia/cache-in-memory": "4.2.0", - "@algolia/client-account": "4.2.0", - "@algolia/client-analytics": "4.2.0", - "@algolia/client-common": "4.2.0", - "@algolia/client-recommendation": "4.2.0", - "@algolia/client-search": "4.2.0", - "@algolia/logger-common": "4.2.0", - "@algolia/logger-console": "4.2.0", - "@algolia/requester-browser-xhr": "4.2.0", - "@algolia/requester-common": "4.2.0", - "@algolia/requester-node-http": "4.2.0", - "@algolia/transporter": "4.2.0" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - } - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "dev": true, - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autocomplete.js": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", - "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", - "dev": true, - "requires": { - "immediate": "^3.2.3" - } - }, - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", - "dev": true, - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "balajs": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/balajs/-/balajs-1.0.7.tgz", - "integrity": "sha512-ef6Gb4Nb44Y3fh1NHj1U9cjnkrj5pcz/16USEziNX+qZd0SEoXegU2IEl2DEcBUAKZnL9hWPT2yOPlBPAlCRSA==", - "dev": true - }, - "balalaika": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/balalaika/-/balalaika-1.0.1.tgz", - "integrity": "sha1-BmQUeiV+oq1K5mRRcR5SZoMNUdk=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", - "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "dev": true, - "requires": { - "long": "~3" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cac": { - "version": "6.5.10", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.5.10.tgz", - "integrity": "sha512-uxyxsID5p5kYlFFnhw86A4c8K5QTLRp6JM4AY2OtCq5lnnn4DGxV8YI1Z5rlt6KUjEKpA4qM+WZQshMoJY6dQQ==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", - "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", - "dev": true, - "requires": { - "buffer-json": "^2.0.0", - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.2.3", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001081", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001081.tgz", - "integrity": "sha512-iZdh3lu09jsUtLE6Bp8NAbJskco4Y3UDtkR3GTCJGsbMowBU5IWDFF79sV2ws7lSqTzWyKazxam2thasHymENQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", - "dev": true - }, - "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "consola": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.12.2.tgz", - "integrity": "sha512-c9mzemrAk57s3UIjepn8KKkuEH5fauMdot5kFSJUnqHcnApVS9Db8Rbv5AZ1Iz6lXzaGe9z1crQXhJtGX4h/Og==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", - "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", - "dev": true, - "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "requires": { - "css": "^2.0.0" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=", - "dev": true - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "dayjs": { - "version": "1.8.28", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.28.tgz", - "integrity": "sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg==", - "dev": true - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "dev": true - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "diacritics": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", - "integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "docsearch.js": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", - "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", - "dev": true, - "requires": { - "algoliasearch": "^3.24.5", - "autocomplete.js": "0.36.0", - "hogan.js": "^3.0.2", - "request": "^2.87.0", - "stack-utils": "^1.0.1", - "to-factory": "^1.0.0", - "zepto": "^1.2.0" - }, - "dependencies": { - "algoliasearch": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", - "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", - "dev": true, - "requires": { - "agentkeepalive": "^2.2.0", - "debug": "^2.6.9", - "envify": "^4.0.0", - "es6-promise": "^4.1.0", - "events": "^1.1.0", - "foreach": "^2.0.5", - "global": "^4.3.2", - "inherits": "^2.0.1", - "isarray": "^2.0.1", - "load-script": "^1.0.0", - "object-keys": "^1.0.11", - "querystring-es3": "^0.2.1", - "reduce": "^1.0.1", - "semver": "^5.1.0", - "tunnel-agent": "^0.6.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "dev": true - } - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.467", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.467.tgz", - "integrity": "sha512-U+QgsL8TZDU/n+rDnYDa3hY5uy3C4iry9mrJS0PNBBGwnocuQ+aHSfgY44mdlaK9744X5YqrrGUvD9PxCLY1HA==", - "dev": true - }, - "element-closest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/element-closest/-/element-closest-3.0.2.tgz", - "integrity": "sha512-JxKQiJKX0Zr5Q2/bCaTx8P+UbfyMET1OQd61qu5xQFeWr1km3fGaxelSJtnfT27XQ5Uoztn2yIyeamAc/VX13g==", - "dev": true - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "envify": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", - "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", - "dev": true, - "requires": { - "esprima": "^4.0.0", - "through": "~2.3.4" - } - }, - "envinfo": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", - "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "feed": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/feed/-/feed-2.0.4.tgz", - "integrity": "sha512-sWatfulDP6d18qVaWcu34qmq9ml6UeN6nHSBJpNZ2muBqxjPAdT375whPYAHP+gqLfyabtYU5qf2Dv4nqtlp0w==", - "dev": true, - "requires": { - "luxon": "^1.3.3", - "xml": "^1.0.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", - "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-markdown-css": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/github-markdown-css/-/github-markdown-css-3.0.1.tgz", - "integrity": "sha512-9G5CIPsHoyk5ObDsb/H4KTi23J8KE1oDd4KYU51qwqeM+lKWAiO7abpSgCkyWswgmSKBiuE7/4f8xUz7f2qAiQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", - "dev": true, - "requires": { - "ini": "^1.3.5" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "gray-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", - "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", - "dev": true, - "requires": { - "js-yaml": "^3.11.0", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hogan.js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", - "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=", - "dev": true, - "requires": { - "mkdirp": "0.3.0", - "nopt": "1.0.10" - }, - "dependencies": { - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - } - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - } - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - } - } - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "javascript-state-machine": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/javascript-state-machine/-/javascript-state-machine-2.4.0.tgz", - "integrity": "sha1-2L4x7DjySsGhgy8LZy/DzV95yW4=", - "dev": true - }, - "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz", - "integrity": "sha1-pltPoPEL2nGaBUQep7lMVfPhW64=", - "dev": true, - "requires": { - "debug": "^2.1.3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "leancloud-realtime": { - "version": "5.0.0-rc.3", - "resolved": "https://registry.npmjs.org/leancloud-realtime/-/leancloud-realtime-5.0.0-rc.3.tgz", - "integrity": "sha512-LGhxz2LY8/G7+dK4SQydaKdlBOcnaNi4r7Cl2otxOV6IyWPDRNiwSTjhAZLV7wHSDep6clrZVoZZGA0YuV24Lg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs2": "^7.10.2", - "@leancloud/adapter-types": "^3.0.0", - "@leancloud/platform-adapters-browser": "^1.1.0", - "@leancloud/platform-adapters-node": "^1.1.0", - "@leancloud/platform-adapters-weapp": "^1.2.0", - "base64-arraybuffer": "^0.1.5", - "debug": "^3.1.0", - "eventemitter3": "^3.0.0", - "javascript-state-machine": "^2.3.5", - "lodash": "^4.17.10", - "promise-timeout": "^1.3.0", - "protobufjs": "^5.0.1", - "uuid": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - } - } - }, - "leancloud-realtime-plugin-live-query": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/leancloud-realtime-plugin-live-query/-/leancloud-realtime-plugin-live-query-1.2.0.tgz", - "integrity": "sha512-eJooIH8/FyUoozr3Eeby2DpDnmX39m1bfxfxlYPuojkio+i/DLwPD+aTHnRDH6QXJcT6tNTt85RcxVR/Txg98Q==", - "dev": true - }, - "leancloud-storage": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/leancloud-storage/-/leancloud-storage-3.15.0.tgz", - "integrity": "sha512-UbR6pLA0tVYPcY7AND0pey45iFsB2PkIo8Wz0DZ9BabKyqndA1ey2LKzYpFDGNh3ODrmT3fValVn9yY4bgf9Uw==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "es6-promise": "4.2.3", - "eventemitter3": "^2.0.3", - "leancloud-realtime": "^5.0.0-alpha.3", - "leancloud-realtime-plugin-live-query": "^1.2.0", - "localstorage-memory": "^1.0.1", - "md5": "^2.0.0", - "superagent": "^3.3.1", - "underscore": "^1.8.3", - "uuid": "^3.3.2" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "es6-promise": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.3.tgz", - "integrity": "sha512-vLf5iali3jKqlJoo6SryDwe3nxCmiueNjbjLWDIpNbAcKnQXAsAdZk+pM17nSYp3AQMbTmAQVCQSeDLfA87SNA==", - "dev": true - }, - "eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=", - "dev": true - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-script": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", - "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=", - "dev": true - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "localstorage-memory": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/localstorage-memory/-/localstorage-memory-1.0.3.tgz", - "integrity": "sha512-t9P8WB6DcVttbw/W4PIE8HOqum8Qlvx5SjR6oInwR9Uia0EEmyUeBh7S+weKByW+l/f45Bj4L/dgZikGFDM6ng==", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.chunk": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", - "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.trimend": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", - "integrity": "sha1-EoBENyhrmMrYmWt5QU4RMAEUCC8=", - "dev": true - }, - "lodash.trimstart": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", - "integrity": "sha1-j/TexTLYJIavWVc8OURZFOlEp/E=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", - "dev": true - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "luxon": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.24.1.tgz", - "integrity": "sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "markdown-it-anchor": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", - "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", - "dev": true - }, - "markdown-it-chain": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", - "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", - "dev": true, - "requires": { - "webpack-chain": "^4.9.0" - }, - "dependencies": { - "webpack-chain": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", - "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^1.6.0" - } - } - } - }, - "markdown-it-container": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", - "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=", - "dev": true - }, - "markdown-it-emoji": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", - "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=", - "dev": true - }, - "markdown-it-meta": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/markdown-it-meta/-/markdown-it-meta-0.0.1.tgz", - "integrity": "sha1-11to8RVlnK9WjkrUPLRgpHEkjDk=", - "dev": true, - "requires": { - "js-yaml": "^3.8.1" - } - }, - "markdown-it-table-of-contents": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", - "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==", - "dev": true - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "medium-zoom": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.5.tgz", - "integrity": "sha512-aLGa6WlTuFKWvH88bqTrY5ztJMN+D0hd8UX6BYc4YSoPayppzETjZUcdVcksgaoQEMg4cZSmXPg846fTp2rjRQ==", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "mini-css-extract-plugin": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", - "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "^2.0.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "miniprogram-api-typings": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/miniprogram-api-typings/-/miniprogram-api-typings-2.11.0.tgz", - "integrity": "sha512-W+V267Ys4YqyMpLrAmpYCOzDlDAjd3Hhy7UKOAoztoyS/hDZgNQ1OhM2/pGnqVyLmz78U3oqxGx8Z+/SMrMZaQ==", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", - "dev": true - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=", - "dev": true - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", - "dev": true - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "portfinder": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", - "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "requires": { - "postcss": "^7.0.26" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "optional": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "dev": true - }, - "prismjs": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz", - "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==", - "dev": true, - "requires": { - "clipboard": "^2.0.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-timeout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz", - "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==", - "dev": true - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "dev": true, - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "reduce": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", - "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", - "dev": true, - "requires": { - "object-keys": "^1.1.0" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-markdown": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz", - "integrity": "sha1-XktmdJOpNXlyjz1S7MHbnKUF3Jg=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true, - "optional": true - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sitemap": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-3.2.2.tgz", - "integrity": "sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg==", - "dev": true, - "requires": { - "lodash.chunk": "^4.2.0", - "lodash.padstart": "^4.6.1", - "whatwg-url": "^7.0.0", - "xmlbuilder": "^13.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "smoothscroll-polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", - "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "std-env": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", - "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", - "dev": true, - "requires": { - "ci-info": "^1.6.0" - } - }, - "storejs": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/storejs/-/storejs-1.0.25.tgz", - "integrity": "sha512-UPHetMA+eg1il3GZI1Lnu5/uVszkEkozgnekbjyEFrRHmkjYygbTGJcdKz65Fae6myA+/VnVoes9835E6WS0zw==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "striptags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", - "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=", - "dev": true - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", - "dev": true, - "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.3", - "mkdirp": "~0.5.x", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.0.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "stylus-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", - "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "lodash.clonedeep": "^4.5.0", - "when": "~3.6.x" - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "dev": true, - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", - "dev": true - }, - "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, - "optional": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-factory": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", - "integrity": "sha1-hzivi9lxIK0dQEeXKtpVY7+UebE=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "transliteration": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.1.11.tgz", - "integrity": "sha512-CMCKB2VHgc9JabQ3NiC2aXG5hEd3FKoU+F+zRQJoDRtZFdQwLYKfRSK8zH/B/4HML4WnOx8U0xmob1ehlt/xvw==", - "dev": true, - "requires": { - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "underscore": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", - "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-notifier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", - "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "valine": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/valine/-/valine-1.4.4.tgz", - "integrity": "sha512-iy78hTnsFFsRmWtKRfTIZFe3LBU/d0MlRo81zY42Vbw6hIAhFr9eXQzZFK9LWfBhUvmhp+DjtT7a8413i/YpZg==", - "dev": true, - "requires": { - "balajs": "^1.0.7", - "balalaika": "^1.0.1", - "element-closest": "^3.0.2", - "leancloud-storage": "^3.0.4", - "storejs": "^1.0.25", - "xss": "^1.0.6" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "vssue": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/vssue/-/vssue-1.4.6.tgz", - "integrity": "sha512-s92qMIaI/9LzBQCUUaX0fpNlA3kRRGtm0hQxDN/YBziOB4NXTWgPvoimLreyjP75hRItHvVhKzkXiZ8bIMjy7A==", - "dev": true, - "requires": { - "@vssue/utils": "^1.4.0", - "github-markdown-css": "^3.0.1", - "vue": "^2.6.10", - "vue-i18n": "^8.11.2", - "vue-property-decorator": "^8.1.1" - } - }, - "vue": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", - "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==", - "dev": true - }, - "vue-class-component": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.3.tgz", - "integrity": "sha512-oEqYpXKaFN+TaXU+mRLEx8dX0ah85aAJEe61mpdoUrq0Bhe/6sWhyZX1JjMQLhVsHAkncyhedhmCdDVSasUtDw==", - "dev": true - }, - "vue-click-outside": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vue-click-outside/-/vue-click-outside-1.1.0.tgz", - "integrity": "sha512-pNyvAA9mRXJwPHlHJyjMb4IONSc7khS5lxGcMyE2EIKgNMAO279PWM9Hyq0d5J4FkiSRdmFLwnbjDd5UtPizHQ==", - "dev": true - }, - "vue-disqus": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vue-disqus/-/vue-disqus-3.0.5.tgz", - "integrity": "sha512-T3Y68lXf5W2lYt6j4Y3kZ4opLPH0EAzqriy11MS4D4Q2+UN0tFuUXeYP1MxfvdyaCEboXSM6CUswxsULuNV70Q==", - "dev": true - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true - }, - "vue-i18n": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.18.2.tgz", - "integrity": "sha512-0X5nBTCZAVjlwcrPaYJwNs3iipBBTv0AUHwQUOa8yP3XbQGWKbRHqBb3OhCYtum/IHDD21d/df5Xd2VgyxbxfA==", - "dev": true - }, - "vue-loader": { - "version": "15.9.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.2.tgz", - "integrity": "sha512-oXBubaY//CYEISBlHX+c2YPJbmOH68xXPXjFv4MAgPqQvUsnjrBAjCJi8HXZ/r/yfn0tPL5VZj1Zcp8mJPI8VA==", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - } - }, - "vue-property-decorator": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.4.2.tgz", - "integrity": "sha512-IqbARlvgPE2pzKfbecKxsu2yEH0Wv7hfHR6m4eZA3LTnNw9hveAX77vDfLFyTeMISS5N7Kucp/xRSHjcQ6bAfQ==", - "dev": true, - "requires": { - "vue-class-component": "^7.1.0" - } - }, - "vue-router": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.3.2.tgz", - "integrity": "sha512-5sEbcfb7MW8mY8lbUVbF4kgcipGXsagkM/X+pb6n0MhjP+RorWIUTPAPSqgPaiPOxVCXgAItBl8Vwz8vq78faA==", - "dev": true - }, - "vue-server-renderer": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.11.tgz", - "integrity": "sha512-V3faFJHr2KYfdSIalL+JjinZSHYUhlrvJ9pzCIjjwSh77+pkrsXpK4PucdPcng57+N77pd1LrKqwbqjQdktU1A==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "hash-sum": "^1.0.2", - "he": "^1.1.0", - "lodash.template": "^4.5.0", - "lodash.uniq": "^4.5.0", - "resolve": "^1.2.0", - "serialize-javascript": "^2.1.2", - "source-map": "0.5.6" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", - "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz", - "integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==", - "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "vuejs-paginate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vuejs-paginate/-/vuejs-paginate-2.1.0.tgz", - "integrity": "sha512-gnwyXlmCiDOu9MLWxN5UJ4PGijKGNOMpHG8ujsrynCzTJljn/rp7Jq0WiDGDAMi5/u0AHuYIHhced+tUW4jblA==" - }, - "vuepress": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.4.1.tgz", - "integrity": "sha512-vFePZLEx9FRJf5buDqSSBHHbTrPzBsL1u3Z4LX0HI9iQmHjkP+cGA8MMS0zVYy/xyYf28xWLWo3L/gj0rdMy7w==", - "dev": true, - "requires": { - "@vuepress/core": "1.4.1", - "@vuepress/theme-default": "1.4.1", - "cac": "^6.5.6", - "envinfo": "^7.2.0", - "opencollective-postinstall": "^2.0.2", - "update-notifier": "^4.0.0" - } - }, - "vuepress-html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } - } - }, - "vuepress-plugin-autobar": { - "version": "github:boboidream/vuepress-bar#70525e843c81c8b2f8006245377a11bfdc6e323f", - "from": "github:boboidream/vuepress-bar", - "dev": true, - "requires": { - "glob": "^7.1.4", - "lodash.escaperegexp": "^4.1.2", - "lodash.sortby": "^4.7.0", - "lodash.startcase": "^4.4.0", - "markdown-it": "^8.4.2", - "markdown-it-meta": "0.0.1", - "transliteration": "^2.1.2" - } - }, - "vuepress-plugin-container": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.4.tgz", - "integrity": "sha512-l+EkeL+rC6DJch1wAZUFIkNDaz2TNOg4NQTHa3yMAsYkC+QaSRubGdN6YwOSmfjxVmM9s9D3gwBWw0O7OBhqRg==", - "dev": true, - "requires": { - "markdown-it-container": "^2.0.0" - } - }, - "vuepress-plugin-disqus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/vuepress-plugin-disqus/-/vuepress-plugin-disqus-0.2.0.tgz", - "integrity": "sha512-kx+AeVzjJ9lx9bufLt1/X35V1VXfnQ1srkDMIzFKD9NyQ3eycsWQRcGO1dFe1HMrY3+7fTu+1/JeUEUEpGZ5tw==", - "dev": true, - "requires": { - "vue-disqus": "^3.0.5" - } - }, - "vuepress-plugin-feed": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/vuepress-plugin-feed/-/vuepress-plugin-feed-0.1.8.tgz", - "integrity": "sha512-ZDJ2KTAxdeXiykBKOWTht4qleImaY9OEbm9cqQdc/54j0P45ax1PhJjsq5aTs3GcIE1nbZKLCd4fSzhRY6bijg==", - "dev": true, - "requires": { - "feed": "2.0.4", - "lodash.defaultsdeep": "4.6.1", - "lodash.isempty": "4.4.0", - "lodash.trimend": "^4.5.1", - "lodash.trimstart": "^4.5.1", - "remove-markdown": "0.3.0", - "striptags": "3.1.1" - } - }, - "vuepress-plugin-mailchimp": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/vuepress-plugin-mailchimp/-/vuepress-plugin-mailchimp-1.4.2.tgz", - "integrity": "sha512-4t5ZaKZXu5ZkwgE+WW//7CgXgz6DEhRefGrO5aql4PwapauNXlHKgQ2JMf9FRe5y5WHjNpDHYveEDNzISZmxJw==", - "dev": true, - "requires": { - "jsonp": "^0.2.1", - "query-string": "^6.9.0" - }, - "dependencies": { - "query-string": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", - "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "dev": true - } - } - }, - "vuepress-plugin-sitemap": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/vuepress-plugin-sitemap/-/vuepress-plugin-sitemap-2.3.1.tgz", - "integrity": "sha512-n+8lbukhrKrsI9H/EX0EBgkE1pn85LAQFvQ5dIvrZP4Kz6JxPOPPNTQmZMhahQV1tXbLZQCEN7A1WZH4x+arJQ==", - "dev": true, - "requires": { - "sitemap": "^3.0.0" - } - }, - "vuepress-plugin-smooth-scroll": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", - "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", - "dev": true, - "requires": { - "smoothscroll-polyfill": "^0.4.3" - } - }, - "vuepress-theme-reco": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/vuepress-theme-reco/-/vuepress-theme-reco-1.4.5.tgz", - "integrity": "sha512-6PUIzDIzfs8ZCdnUiPdYuCc1IHpRDuNXvD0RuBCbw8N6LsBsPSJy7aiffcDebjDyOpFFkEzTBDNH1EtVGkbExg==", - "dev": true, - "requires": { - "@vuepress-reco/vuepress-plugin-back-to-top": "^1.4.0", - "@vuepress-reco/vuepress-plugin-comments": "^1.4.3", - "@vuepress-reco/vuepress-plugin-loading-page": "^1.4.0", - "@vuepress-reco/vuepress-plugin-pagation": "^1.4.0", - "@vuepress/plugin-blog": "1.9.2", - "@vuepress/plugin-medium-zoom": "1.4.1", - "docsearch.js": "2.6.3", - "md5": "2.2.1", - "valine": "1.4.4", - "vue-click-outside": "1.1.0" - } - }, - "watchpack": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", - "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", - "dev": true, - "requires": { - "chokidar": "^3.4.0", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.1", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-chain": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.4.0.tgz", - "integrity": "sha512-f97PYqxU+9/u0IUqp/ekAHRhBD1IQwhBv3wlJo2nvyELpr2vNnUqO3XQEk+qneg0uWGP54iciotszpjfnEExFA==", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^2.0.1" - }, - "dependencies": { - "javascript-stringify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", - "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpackbar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", - "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.1.0", - "chalk": "^2.4.1", - "consola": "^2.6.0", - "figures": "^3.0.0", - "pretty-time": "^1.1.0", - "std-env": "^2.2.1", - "text-table": "^0.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "xmlbuilder": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", - "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", - "dev": true - }, - "xss": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.7.tgz", - "integrity": "sha512-A9v7tblGvxu8TWXQC9rlpW96a+LN1lyw6wyhpTmmGW+FwRMactchBR3ROKSi33UPCUcUHSu8s9YP6F+K3Mw//w==", - "dev": true, - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "zepto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", - "integrity": "sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 54330ab8..00000000 --- a/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "geekxh.com", - "version": "1.0.0", - "author": "geek小浩", - "scripts": { - "dev": "vuepress dev website", - "build": "vuepress build website" - }, - "devDependencies": { - "algoliasearch": "^4.2.0", - "vuepress": "^1.4.1", - "vuepress-theme-reco": "^1.4.5", - "vuepress-plugin-autobar": "github:boboidream/vuepress-bar" - }, - "description": "易懂的算法教程", - "dependencies": { - "vuejs-paginate": "^2.1.0" - } -} diff --git a/run.js b/run.js deleted file mode 100644 index 1f0d46f0..00000000 --- a/run.js +++ /dev/null @@ -1,9 +0,0 @@ -const { exec } = require('child_process') -exec('npm run build',(error, stdout, stderr) => { - if(error){ - console.log(`exec error: ${error}`) - return - } - console.log(`stdout: ${stdout}`); - console.log(`stderr: ${stderr}`); -}) diff --git a/showmecode_100/C++/Arrays/Trapping the rain water.cpp b/showmecode_100/C++/Arrays/Trapping the rain water.cpp new file mode 100644 index 00000000..07f2fbf8 --- /dev/null +++ b/showmecode_100/C++/Arrays/Trapping the rain water.cpp @@ -0,0 +1,25 @@ +#include +using namespace std; + +int trapped_water(int array[],int size){ + int amount = 0; + int left[size],right[size]; + left[0] = array[0]; right[size-1] = array[size-1]; + for(int i = 1; i < size; i++){ + left[i] = max(left[i-1],array[i]); + } + for(int i = size-2; i >=0; i--){ + right[i] = max(right[i+1],array[i]); + } + for(int i = 0 ; i < size;i++){ + amount += min(left[i],right[i]) - array[i]; + } + return amount; +} + +int main(){ + int array[] = {1,0,3,4,5,0,5,7,7,8,9,0}; + int size = sizeof(array) / sizeof(int); + cout << trapped_water(array,size); + return 0; +} diff --git a/showmecode_100/C++/Bit Manipulation/Checking Whether K-th Bit is Set or Not.cpp b/showmecode_100/C++/Bit Manipulation/Checking Whether K-th Bit is Set or Not.cpp new file mode 100644 index 00000000..32c171df --- /dev/null +++ b/showmecode_100/C++/Bit Manipulation/Checking Whether K-th Bit is Set or Not.cpp @@ -0,0 +1,15 @@ +#include +using namespace std; +int main(){ + int n,k; + cout << "Enter the number and the value of K : "; + cin >> n >> k; + int mask = 1 << (k-1); + if(n & mask){ + cout << "Yes K-th bit is set" << endl; + } + else{ + cout << "No K-th bit is not set" << endl; + } + return 0; +} diff --git a/showmecode_100/C++/Bit Manipulation/Clearing the K-th bit of a number.cpp b/showmecode_100/C++/Bit Manipulation/Clearing the K-th bit of a number.cpp new file mode 100644 index 00000000..4b06ba17 --- /dev/null +++ b/showmecode_100/C++/Bit Manipulation/Clearing the K-th bit of a number.cpp @@ -0,0 +1,11 @@ +#include +using namespace std; +int main(){ + int n,k,mask; + cout << "Enter the number and the value of K : "; + cin >> n >> k; + mask = ~(1 << (k-1)); + n = n&mask; + cout << "The number after clearing the K-th bit is : " << n << endl; + return 0; +} diff --git a/showmecode_100/C++/Bit Manipulation/Setting the K-th bit of a number.cpp b/showmecode_100/C++/Bit Manipulation/Setting the K-th bit of a number.cpp new file mode 100644 index 00000000..26c30852 --- /dev/null +++ b/showmecode_100/C++/Bit Manipulation/Setting the K-th bit of a number.cpp @@ -0,0 +1,11 @@ +#include +using namespace std; +int main(){ + int n,k; + cout << "Enter the number and the value of K :"; + cin >> n >> k; + int mask = 1 << (k - 1); + n = n | mask; + cout << "The number after setting the K-th bit is:" << n; + return 0; +} diff --git a/showmecode_100/C++/Bit Manipulation/Toggling Rightmost Set Bit of a number.cpp b/showmecode_100/C++/Bit Manipulation/Toggling Rightmost Set Bit of a number.cpp new file mode 100644 index 00000000..f1c03644 --- /dev/null +++ b/showmecode_100/C++/Bit Manipulation/Toggling Rightmost Set Bit of a number.cpp @@ -0,0 +1,10 @@ +#include +using namespace std; +int main(){ + int n; + cout << "Enter the number : "; + cin >> n ; + n = n & (n-1); + cout << "The number after toggling right most set bit : " << n << endl; + return 0; +} diff --git a/showmecode_100/C++/Bit Manipulation/Toggling the K-th bit of a number.cpp b/showmecode_100/C++/Bit Manipulation/Toggling the K-th bit of a number.cpp new file mode 100644 index 00000000..ce89f1b5 --- /dev/null +++ b/showmecode_100/C++/Bit Manipulation/Toggling the K-th bit of a number.cpp @@ -0,0 +1,11 @@ +#include +using namespace std; +int main(){ + int n,k,mask; + cout << "Enter the number and the value of K : "; + cin >> n >> k; + mask = 1 << (k-1); + n = n ^ mask; + cout << "The number after toggling the K-th bit is : " << n << endl; + return 0; +} diff --git a/showmecode_100/C++/Dynamic Programming/Edit Distance.cpp b/showmecode_100/C++/Dynamic Programming/Edit Distance.cpp new file mode 100644 index 00000000..0b9618a6 --- /dev/null +++ b/showmecode_100/C++/Dynamic Programming/Edit Distance.cpp @@ -0,0 +1,19 @@ +int editDistance(string s1, string s2){ + int m = s1.length(); + int n = s2.length(); + int dp[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 (s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1]; + else dp[i][j] = 1 + min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1]); + } + } + return dp[m][n]; +} diff --git a/showmecode_100/C++/Dynamic Programming/Longest Common Subsequence.cpp b/showmecode_100/C++/Dynamic Programming/Longest Common Subsequence.cpp new file mode 100644 index 00000000..472ff097 --- /dev/null +++ b/showmecode_100/C++/Dynamic Programming/Longest Common Subsequence.cpp @@ -0,0 +1,21 @@ +int lcs(string x,string y){ + int m = x.size(),n = y.size(); + int dp[m+1][n+1]; + for(int i=0;i<=m;i++){ + dp[i][0] = 0; + } + for(int j=0;j<=m;j++){ + dp[0][j] = 0; + } + for(int i=1;i<=m;i++){ + for(int j=1;j<=n;j++){ + if(x[i-1] == y[j-1]){ + dp[i][j] = dp[i-1][j-1]+1; + } + else{ + dp[i][j] = max(dp[i][j-1],dp[i-1][j]); + } + } + } + return dp[m][n]; +} diff --git a/showmecode_100/C++/Dynamic Programming/Longest Common Substring.cpp b/showmecode_100/C++/Dynamic Programming/Longest Common Substring.cpp new file mode 100644 index 00000000..05eb7c78 --- /dev/null +++ b/showmecode_100/C++/Dynamic Programming/Longest Common Substring.cpp @@ -0,0 +1,31 @@ +#include +using namespace std; + +int longest_common_substring(string x,string y){ + int m = x.size(); + int n = y.size(); + int lcs[m+1][n+1]; + for(int i = 0 ; i < m; i++){ + lcs[i][0] = 0; + } + for(int j = 0; j < n; j++){ + lcs[0][j] = 0; + } + for(int i = 1; i <= m; i++){ + for(int j = 1; j <=n; j++){ + if(x[i-1] == y[j-1]){ + lcs[i][j] = 1 + lcs[i-1][j-1]; + } + else{ + lcs[i][j] = 0; + } + } + } + return lcs[m][n]; +} +int main(){ + string x,y; + cin >> x >> y; + cout << longest_common_substring(x,y); + return 0; +} \ No newline at end of file diff --git a/showmecode_100/C++/Dynamic Programming/Longest Increasing Subsequence.cpp b/showmecode_100/C++/Dynamic Programming/Longest Increasing Subsequence.cpp new file mode 100644 index 00000000..756129d7 --- /dev/null +++ b/showmecode_100/C++/Dynamic Programming/Longest Increasing Subsequence.cpp @@ -0,0 +1,19 @@ +int lis(int array[],int n){ + int dp[n],lis_value = -1; + for(int i=0;i array[j] and dp[i] < dp[j]+1){ + dp[i] = dp[j] + 1; + } + } + } + for(int i=0;i +using namespace std; +int longest_palindromic_subsequence(string str){ + int table[str.size()][str.size()]; + for(int i = 0 ; i < str.size(); i++){ + table[i][i] = 1; + } + for(int l = 1 ; l < str.size() ; l++){ + int i = 0, j = l; + while(j != str.size()){ + if(str[i] == str[j]){ + table[i][j] = 2 + table[i+1][j-1]; + } + else{ + table[i][j] = max(table[i+1][j],table[i][j-1]); + } + i++;j++; + } + } + return table[0][str.size()-1]; +} +int main(){ + string str; + cin >> str; + cout << longest_palindromic_subsequence(str); + return 0; +} \ No newline at end of file diff --git a/showmecode_100/C++/Dynamic Programming/Matrix Chain Multiplication.cpp b/showmecode_100/C++/Dynamic Programming/Matrix Chain Multiplication.cpp new file mode 100644 index 00000000..e3584f11 --- /dev/null +++ b/showmecode_100/C++/Dynamic Programming/Matrix Chain Multiplication.cpp @@ -0,0 +1,18 @@ +int mcm(int p[], int n){ + int m[n][n]; + int i, j, k, L, q; + for (i = 1; i < n; i++) + m[i][i] = 0; + for (L=2; L +#include +using namespace std; + +void floydWarshall(vector> &graph){ + for (int k=0; k> graph; + int v,e,src,des,weight; + cin >> v >> e; + graph.resize(v,vector(v,0)); + while(e--){ + cin >> src >> des >> weight; + graph[src][des] = weight; + } + floydWarshall(graph); + for(int i=0;i +#include +#include +#include +using namespace std; +void breadth_first_search(vector> graph,int src){ + vectorvisited(graph.size(),false); + queueQ; + Q.push(src); + visited[src] = true; + while(!Q.empty()){ + int vertex = Q.front(); Q.pop(); + cout << vertex << " "; + for(list::iterator itr = graph[vertex].begin();itr!=graph[vertex].end();itr++){ + if(!visited[*itr]) + Q.push(*itr); + visited[*itr] = true; + } + } +} +int main(){ + vector> graph; + int v,e,src,des; + cin >> v >> e; + graph.resize(v); + while(e--){ + cin >> src >> des; + graph[src].push_back(des); + graph[des].push_back(src); + } + cin >> src; + breadth_first_search(graph,src); + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Connected Components Algorithm DFS.cpp b/showmecode_100/C++/Graph Algorithms/Connected Components Algorithm DFS.cpp new file mode 100644 index 00000000..c29867d6 --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Connected Components Algorithm DFS.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +using namespace std; + +void connectedComponentsDFS(vector> graph,int src,vector &visited){ + if(!visited[src]){ + visited[src] = true; + for(list::iterator itr = graph[src].begin();itr != graph[src].end();itr++){ + connectedComponentsDFS(graph,*itr,visited); + } + } +} + +int connectedComponents(vector> graph){ + int components = 0; + vector visited(graph.size(),false); + for(int src = 0; src < graph.size();src++){ + if(!visited[src]){ + components++; + connectedComponentsDFS(graph,src,visited); + } + } + return components; +} + +int main(){ + vector> graph; + int v,e,src,des; + cin >> v >> e; + graph.resize(v); + while(e--){ + cin >> src >> des; + graph[src].push_back(des); + } + cout << connectedComponents(graph); + return 0; +} + diff --git a/showmecode_100/C++/Graph Algorithms/Depth First Search.cpp b/showmecode_100/C++/Graph Algorithms/Depth First Search.cpp new file mode 100644 index 00000000..3c0bb9ae --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Depth First Search.cpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include +using namespace std; +void depth_first_search(vector> graph,int src){ + vectorvisited(graph.size(),false); + stackS; + S.push(src); + visited[src] = true; + while(!S.empty()){ + int vertex = S.top(); S.pop(); + cout << vertex << " "; + for(list::iterator itr = graph[vertex].begin();itr!=graph[vertex].end();itr++){ + if(!visited[*itr]) + S.push(*itr); + visited[*itr] = true; + } + } +} +int main(){ + vector> graph; + int v,e,src,des; + cin >> v >> e; + graph.resize(v); + while(e--){ + cin >> src >> des; + graph[src].push_back(des); + graph[des].push_back(src); + } + cin >> src; + depth_first_search(graph,src); + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Kruskal's Minimum Spanning Tree Algorithm.cpp b/showmecode_100/C++/Graph Algorithms/Kruskal's Minimum Spanning Tree Algorithm.cpp new file mode 100644 index 00000000..aa3db2a0 --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Kruskal's Minimum Spanning Tree Algorithm.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +using namespace std; + +struct edge{int src,des,weight;}; + +class UnionFind { + int *parent, *ranks, _size; +public: + UnionFind(){ + } + UnionFind(int size){ + parent = new int[size]; ranks = new int[size]; + for(int element = 0 ; element < size ; element++){ + parent[element] = element , ranks[element] = 0 ; + } + _size = size; + } + void resize(int size){ + parent = new int[size]; ranks = new int[size]; + for(int element = 0 ; element < size ; element++){ + parent[element] = element , ranks[element] = 0 ; + } + _size = size; + } + int find(int element){ + if(parent[element] == element){ + return element; + } + else{ + return parent[element] = find(parent[element]); // Path Compression algorithm + } + } + bool connected(int x,int y){ + if(find(x) == find(y)){ + return true; + } + else{ + return false; + } + } + void merge(int x,int y){ + x = find(x); + y = find(y); + if(x != y){ // Union by Rank algorithm + if(ranks[x] > ranks[y]){ + parent[y] = x; + } + else if(ranks[x] < ranks[y]){ + parent[x] = y; + } + else{ + parent[x] = y; ranks[y] ++ ; + } + _size--; + } + } + void clear(){ + delete [] parent; delete [] ranks; + } + int size(){ + return _size; + } +}; +bool comparator(const edge &a,const edge &b){ + return a.weight < b.weight; +} + +vector kruskalsAlgorithm(vectorgraph,int vertices){ + UnionFind uf(vertices); + vectorspanningTree; + sort(graph.begin(),graph.end(),comparator); + spanningTree.push_back(graph[0]); + uf.merge(graph[0].src,graph[0].des); + for(int i=1;igraph; + int e,v; + cin >> e >> v; + graph.resize(e); + for(int i=0;i> graph[i].src >> graph[i].des >> graph[i].weight; + } + vector spanningTree = kruskalsAlgorithm(graph,v); + for(edge x : spanningTree){ + cout << x.src << " " << x.des << " " << x.weight << endl; + } + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Prims Minimum Spanning Tree Algorithm.cpp b/showmecode_100/C++/Graph Algorithms/Prims Minimum Spanning Tree Algorithm.cpp new file mode 100644 index 00000000..3d150289 --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Prims Minimum Spanning Tree Algorithm.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +using namespace std; + +const int INF = INT_MAX; + +class edge{ public: int src,des,weight; edge(){}edge(int s,int d,int w): src(s),des(d),weight(w){}}; +class compare { public: bool operator()(const edge &a,const edge &b){ return a.weight < b.weight; }}; + +vector primsAlgorithm(vector>> graph,edge minEdge){ + vectorspanningTree; + priority_queue,compare> Q; + while(spanningTree.size() == graph.size()-1){ + spanningTree.push_back(minEdge); + for(list>::iterator it = graph[minEdge.src].begin();it!=graph[minEdge.src].end();it++){ + Q.push(edge(minEdge.src,it->first,it->second)); + } + for(list>::iterator it = graph[minEdge.des].begin();it!=graph[minEdge.des].end();it++){ + Q.push(edge(minEdge.des,it->first,it->second)); + } + minEdge = Q.top(); Q.pop(); + } + return spanningTree; +} + +int main(){ + vector>>graph; + int v,e,src,des,weight; + cin >> v >> e; + graph.resize(v); + edge minEdge; + minEdge.weight = INF; + while(e--){ + cin >> src >> des >> weight; + graph[src].push_back(make_pair(des,weight)); + graph[des].push_back(make_pair(src,weight)); + if(weight < minEdge.weight){ + minEdge.src = src, minEdge.des = des, minEdge.weight = weight; + } + } + vector spanningTree = primsAlgorithm(graph,minEdge); + for(edge x : spanningTree){ + cout << x.src << " " << x.des << " " << x.weight << endl; + } + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Recursive Depth First Search.cpp b/showmecode_100/C++/Graph Algorithms/Recursive Depth First Search.cpp new file mode 100644 index 00000000..2c0483ea --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Recursive Depth First Search.cpp @@ -0,0 +1,28 @@ +#include +#include +#include +using namespace std; +void depth_first_search(vector> graph,int src,vector &visited){ + if(!visited[src]){ + cout << src << " "; + visited[src] = true; + for(list::iterator itr = graph[src].begin();itr != graph[src].end();itr++){ + depth_first_search(graph,*itr,visited); + } + } +} +int main(){ + vector> graph; + vector visited; + int v,e,src,des; + cin >> v >> e; + graph.resize(v); + visited.resize(v,false); + while(e--){ + cin >> src >> des; + graph[src].push_back(des); + } + cin >> src; + depth_first_search(graph,src,visited); + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Single Shortest Path Bellman Ford Algorithm.cpp b/showmecode_100/C++/Graph Algorithms/Single Shortest Path Bellman Ford Algorithm.cpp new file mode 100644 index 00000000..8f498784 --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Single Shortest Path Bellman Ford Algorithm.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +using namespace std; + +struct edge {int src, des, weight;}; + +pair> bellmanFord(vector graph,int vertex,int source){ + vector distances(vertex,INT_MAX); + distances[source] = 0; + for(int i=0;i distances[graph[j].src] + graph[j].weight){ + distances[graph[j].des] = distances[graph[j].src] + graph[j].weight; + } + } + } + for(int j=0;j distances[graph[j].src] + graph[j].weight){ + return make_pair(false,vector()); + } + } + return make_pair(true,distances); +} + +int main(){ + int edges,source,vertex; + vector graph; + cin >> edges >> vertex; + for(int i = 0; i < edges; i++){ + cin >> graph[i].src >> graph[i].des >> graph[i].weight; + } + cin >> source; + pair> result = bellmanFord(graph,vertex,source); + if(result.first == true){ + cout << "No Cycle Exist ! " << endl; + for(vector::iterator itr = (result.second).begin();itr!=(result.second).end();itr++){ + cout << *itr << " "; + } + } + else{ + cout << "Graph Has Negative Weight Cycle" << endl; + } + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Single Source Shortest Path Dijkstra Algorithm.cpp b/showmecode_100/C++/Graph Algorithms/Single Source Shortest Path Dijkstra Algorithm.cpp new file mode 100644 index 00000000..59cf730f --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Single Source Shortest Path Dijkstra Algorithm.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +using namespace std; +struct compare{ + bool operator()(const pair &a,const pair &b){ + return a.second > b.second; + } +}; +vector dijkshtra(vector>> graph,int src){ + priority_queue,vector>,compare> Q; + vector distances(graph.size(),INT_MAX); + vector visited(graph.size(),false); + distances[src] = 0; + Q.push(make_pair(src,0)); + while(!Q.empty()){ + pair current = Q.top(); Q.pop(); + cout << "Currently at" << current.first << endl; + if(!visited[current.first]){ + visited[current.first] = true; + for(list> :: iterator vertex = graph[current.first].begin();vertex != graph[current.first].end();vertex++){ + if(current.second + vertex->second < distances[vertex->first]){ + distances[vertex->first] = current.second + vertex->second; + Q.push(make_pair(vertex->first,distances[vertex->first])); + } + } + } + } + return distances; +} +int main(){ + vector>> graph; + int v,e,src,des,weight; + cin >> v >> e; + graph.resize(v); + while(e--){ + cin >> src >> des >> weight; + graph[src].push_back(make_pair(des,weight)); + } + cin >> src; + vector distances = dijkshtra(graph,src); + for(vector :: iterator itr = distances.begin();itr != distances.end();itr++){ + cout << *itr << " "; + } + return 0; +} diff --git a/showmecode_100/C++/Graph Algorithms/Topological Sorting.cpp b/showmecode_100/C++/Graph Algorithms/Topological Sorting.cpp new file mode 100644 index 00000000..6aebfeb5 --- /dev/null +++ b/showmecode_100/C++/Graph Algorithms/Topological Sorting.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +using namespace std; + +void topologicalSortDFS(vector> graph,int src,vector &visited,list &topologicalSortedList){ + if(!visited[src]){ + visited[src] = true; + for(list::iterator itr = graph[src].begin();itr != graph[src].end();itr++){ + topologicalSortDFS(graph,*itr,visited,topologicalSortedList); + } + topologicalSortedList.push_front(src); + } +} + +list topologicalSort(vector> graph){ + list topologicalSortedList; + vector visited(graph.size(),false); + for(int src = 0; src < graph.size();src++){ + topologicalSortDFS(graph,src,visited,topologicalSortedList); + } + return topologicalSortedList; +} + +int main(){ + vector> graph; + int v,e,src,des; + cin >> v >> e; + graph.resize(v); + while(e--){ + cin >> src >> des; + graph[src].push_back(des); + } + list topologicalSortedList = topologicalSort(graph); + for(list::iterator itr = topologicalSortedList.begin();itr!=topologicalSortedList.end();itr++){ + cout << *itr << " "; + } + return 0; +} diff --git a/showmecode_100/C++/Heaps - Priority Queues/K-th Largest element of the stream.cpp b/showmecode_100/C++/Heaps - Priority Queues/K-th Largest element of the stream.cpp new file mode 100644 index 00000000..6c0851af --- /dev/null +++ b/showmecode_100/C++/Heaps - Priority Queues/K-th Largest element of the stream.cpp @@ -0,0 +1,31 @@ +#include +#include +using namespace std; + +int main(){ + int n,k; + priority_queue,greater>Q; + cout << "Enter the the value of K : "; + cin >> k; + while(cin >> n){ + cout << k << "-th largest element of the stream : "; + if(Q.size() < k){ + Q.push(n); + if(Q.size() == k){ + cout << Q.top() 3<< endl; + } + else{ + cout << "NULL" << endl; + } + } + else{ + if(Q.top() < n){ + Q.pop(); + Q.push(n); + } + cout << Q.top() << endl; + } + cout << "Enter next element of the stream : "; + } + return 0; +} diff --git a/showmecode_100/C++/Linked List/Reverse a linked list recursively.cpp b/showmecode_100/C++/Linked List/Reverse a linked list recursively.cpp new file mode 100644 index 00000000..c98b38cf --- /dev/null +++ b/showmecode_100/C++/Linked List/Reverse a linked list recursively.cpp @@ -0,0 +1,3 @@ +void reverse_list(list_node *head){ + list_node * +} diff --git a/showmecode_100/C++/Number Theory Algorithms/Divisors.cpp b/showmecode_100/C++/Number Theory Algorithms/Divisors.cpp new file mode 100644 index 00000000..0617826f --- /dev/null +++ b/showmecode_100/C++/Number Theory Algorithms/Divisors.cpp @@ -0,0 +1,22 @@ +#include +#include +using namespace std; +set generateDivisors(long long int num){ + set divisors; + for(int i = 1 ; i*i <= num; i++ ){ + if(num % i == 0){ + divisors.insert(i); + if( i != num/i ){ + divisors.insert(num/i); + } + } + } + return divisors; +} +int main(){ + set d = generateDivisors(23); + for(int x : d){ + cout << x << " "; + } + return 0; +} diff --git a/showmecode_100/C++/Number Theory Algorithms/Sieve of Eratosthenes.cpp b/showmecode_100/C++/Number Theory Algorithms/Sieve of Eratosthenes.cpp new file mode 100644 index 00000000..c1e03044 --- /dev/null +++ b/showmecode_100/C++/Number Theory Algorithms/Sieve of Eratosthenes.cpp @@ -0,0 +1,25 @@ +#include +#include +#include +using namespace std; + +const int MAX = 1000*1000; +const int LMT = 1000; + +vector prime(MAX+1,true); + +int seiveEratosthenes(){ + prime[0] = prime[1] = false; + for(int i = 2; i <= LMT; i++){ + if(prime[i]){ + for(int j = i + i; j <= MAX ; j += i){ + prime[j] = false; + } + } + } + return count_if(prime.begin(),prime.end(),[](bool p){ return p == true;}); +} +int main(){ + cout << seiveEratosthenes(); + return 0; +} diff --git a/showmecode_100/C++/Recursion/Partition of array on the pivot.cpp b/showmecode_100/C++/Recursion/Partition of array on the pivot.cpp new file mode 100644 index 00000000..a1ac0a26 --- /dev/null +++ b/showmecode_100/C++/Recursion/Partition of array on the pivot.cpp @@ -0,0 +1,19 @@ +#include +using namespace std; +void partition(int array[],int low,int high){ + int i = low-1, pivot = array[high-1]; + for(int j = low ; j < high ; j++){ + if(array[j] <= pivot){ + i++; + swap(array[i],array[j]); + } + } + swap(array[i+1],array[high-1]); +} +int main(){ + int n; + cin >> n; + int array[n]; + partition(array,0,n); + return 0; +} diff --git a/showmecode_100/C++/Recursion/Permutation of a string.cpp b/showmecode_100/C++/Recursion/Permutation of a string.cpp new file mode 100644 index 00000000..6733132f --- /dev/null +++ b/showmecode_100/C++/Recursion/Permutation of a string.cpp @@ -0,0 +1,23 @@ +#include +using namespace std; + +void permutation(char str[],int k,int n){ + if(k == n){ + for(int j = 0; j < n; j++){ + cout << str[j]; + } + cout << endl; + } + else{ + for(int i = k ; i < n; i++){ + swap(str[i],str[k]); + permutation(str,k+1,n); + swap(str[i],str[k]); + } + } +} +int main(){ + char str[] = {'A','B','C','D'}; + permutation(str,0,4); + return 0; +} diff --git a/showmecode_100/C++/Segment Tree/Segment Tree.cpp b/showmecode_100/C++/Segment Tree/Segment Tree.cpp new file mode 100644 index 00000000..17b88cea --- /dev/null +++ b/showmecode_100/C++/Segment Tree/Segment Tree.cpp @@ -0,0 +1,31 @@ +void buildTree (int tree[],int array[], int index, int low, int high) { + if (low == high) + tree[index] = array[low]; + else { + int mid = (low + high) >> 1; + buildTree (tree,array, index*2, low, mid); + buildTree (tree,array, index*2+1, mid+1, high); + tree[index] = tree[index*2] + tree[index*2+1]; + } +} +int rangeQuery (int tree[],int index, int low, int high, int l, int r) { + if (l > r) + return 0; + if (l == low && r == high) + return tree[index]; + int mid = (low + high) >> 1; + return rangeQuery (tree,index*2, low, mid, l, min(r,mid)) + + rangeQuery (tree,index*2+1, mid+1, high, max(l,mid+1), r); +} +void updateQuery (int tree[],int index, int low, int high, int pos, int delta) { + if (low == high) + tree[index] = delta; + else { + int mid = (low + high) >> 1; + if (pos <= mid) + updateQuery (tree,index*2, low, mid, pos, delta); + else + updateQuery (tree,index*2+1, mid+1, high, pos, delta); + tree[index] = tree[index*2] + tree[index*2+1]; + } +} diff --git a/showmecode_100/C++/Stacks - Queue/CircularQueue.cpp b/showmecode_100/C++/Stacks - Queue/CircularQueue.cpp new file mode 100644 index 00000000..94bc66a2 --- /dev/null +++ b/showmecode_100/C++/Stacks - Queue/CircularQueue.cpp @@ -0,0 +1,86 @@ +#include +using namespace std; +class circular_queue +{ + private : + int *array ; + int front, back ; + int MAX; + public : + circular_queue( int maxsize = 10 ) ; + void enqueue ( int item ) ; + int dequeue( ) ; + void display( ) ; +} ; +circular_queue :: circular_queue( int maxsize ) +{ + MAX = maxsize ; + array = new int [ MAX ]; + front = back = -1 ; + for ( int i = 0 ; i < MAX ; i++ ) + array[i] = 0 ; +} +void circular_queue :: enqueue(int item){ + if((back+1)%MAX == front){ + cout << "Queue is full" << endl; + return ; + } + back = ( back + 1 ) % MAX; + array[back] = item ; + if ( front == -1 ) + front = 0 ; +} +int circular_queue :: dequeue(){ + int data ; + if ( front == -1 ) + { + cout << "\nQueue is empty" ; + return NULL ; + } + + data = array[front] ; + array[front] = 0 ; + if ( front == back ) + { + front = -1 ; + back = -1 ; + } + else + front = ( front + 1 ) % MAX; + return data ; +} +void circular_queue :: display() +{ + cout << endl ; + for ( int i = 0 ; i < MAX ; i++ ) + cout << array[i] << " " ; + cout << endl ; +} +int main(){ + circular_queue cq(10) ; + cq.enqueue(14); + cq.enqueue(22); + cq.enqueue(13); + cq.enqueue(-6); + cq.enqueue(25); + cout << "\nElements in the circular queue: " ; + cq.display(); + int i = cq.dequeue() ; + cout << "Item deleted: " << i ; + i = cq.dequeue(); + cout << "\nItem deleted: " << i ; + cout << "\nElements in the circular queue after deletion: " ; + cq.display(); + cq.enqueue(21); + cq.enqueue(17); + cq.enqueue(18); + cq.enqueue(9); + cq.enqueue(20); + cout << "Elements in the circular queue after addition: " ; + cq.display(); + cq.enqueue(32); + cout << "Elements in the circular queue after addition: " ; + cq.display(); + return 0; +} + diff --git a/showmecode_100/C++/String Algorithms/KMP.cpp b/showmecode_100/C++/String Algorithms/KMP.cpp new file mode 100644 index 00000000..275f1d10 --- /dev/null +++ b/showmecode_100/C++/String Algorithms/KMP.cpp @@ -0,0 +1,33 @@ +vector computePrefix(string pat){ + int m = pat.size(); + vector longestPrefix(m); + for(int i = 1, k = 0; i < m; i++){ + while(k > 0 && pat[k] != pat[i]){ + k = longestPrefix[k - 1]; + } + if(pat[i] == pat[k]){ + longestPrefix[i] = ++k; + } + else{ + longestPrefix[i] = k; + } + } + return longestPrefix; +} +void KMP(string str,string pat){ + int n = str.size(); + int m = pat.size(); + vector longestPrefix = computePrefix(pat); + for(int i = 0, k = 0; i < n; i++){ + while(k > 0 && pat[k] != str[i]){ + k = longestPrefix[k - 1]; + } + if(str[i] == pat[k]){ + k++; + } + if(k == m){ + cout << i - m + 1 << "\n"; + k = longestPrefix[k - 1]; + } + } +} diff --git a/showmecode_100/C++/String Algorithms/Trie.cpp b/showmecode_100/C++/String Algorithms/Trie.cpp new file mode 100644 index 00000000..a24cdcdc --- /dev/null +++ b/showmecode_100/C++/String Algorithms/Trie.cpp @@ -0,0 +1,42 @@ +struct Trie { + Trie* child[26]; + bool isLeaf; + + Trie() { + memset(child, 0, sizeof(child)); + isLeaf = 0; + } + + void pushWord(char *str) { + if(*str == '\0') + isLeaf = 1; + else { + int cur = *str - 'a'; + if(child[cur] == 0 ) + child[cur] = new Trie(); + child[cur]->pushWord(str+1); + } + } + + bool wordExist(char* str) { + if(*str == '\0') + return isLeaf; + + int cur = *str - 'a'; + if(child[cur] == 0 ) + return false; + + return child[cur]->wordExist(str+1); + } + + bool prefixExist(char* str) { + if(*str == '\0') + return true; + + int cur = *str - 'a'; + if(child[cur] == 0 ) + return false; + + return child[cur]->prefixExist(str+1); + } +}; diff --git a/showmecode_100/C++/Union Find/Union Find.cpp b/showmecode_100/C++/Union Find/Union Find.cpp new file mode 100644 index 00000000..edff0ed1 --- /dev/null +++ b/showmecode_100/C++/Union Find/Union Find.cpp @@ -0,0 +1,75 @@ +#include +using namespace std; + +class UnionFind { + int *parent, *ranks, _size; +public: + UnionFind(){ + } + UnionFind(int size){ + parent = new int[size]; ranks = new int[size]; + for(int element = 0 ; element < size ; element++){ + parent[element] = element , ranks[element] = 0 ; + } + _size = size; + } + void resize(int size){ + parent = new int[size]; ranks = new int[size]; + for(int element = 0 ; element < size ; element++){ + parent[element] = element , ranks[element] = 0 ; + } + _size = size; + } + int find(int element){ + if(parent[element] == element){ + return element; + } + else{ + return parent[element] = find(parent[element]); // Path Compression algorithm + } + } + bool connected(int x,int y){ + if(find(x) == find(y)){ + return true; + } + else{ + return false; + } + } + void merge(int x,int y){ + x = find(x); + y = find(y); + if(x != y){ // Union by Rank algorithm + if(ranks[x] > ranks[y]){ + parent[y] = x; + } + else if(ranks[x] < ranks[y]){ + parent[x] = y; + } + else{ + parent[x] = y; ranks[y] ++ ; + } + _size--; + } + } + void clear(){ + delete [] parent; delete [] ranks; + } + int size(){ + return _size; + } +}; + + +int main(){ + UnionFind uf(5); + cout << uf.size() << endl; // 5 disjoint sets are there + uf.merge(0,1); + cout << uf.size() << endl; // 4 disjoint sets are there + uf.merge(0,2); + cout << uf.size() << endl; // 3 disjoint sets are there + uf.merge(1,2); + cout << uf.size() << endl; // 3 disjoint sets are there + uf.clear(); + return 0; +} diff --git a/showmecode_100/README.md b/showmecode_100/README.md new file mode 100644 index 00000000..aa6584c9 --- /dev/null +++ b/showmecode_100/README.md @@ -0,0 +1,27 @@ + +

Please visit my wiki link for full list of questions

+

https://github.com/mission-peace/interview/wiki

+ +

Like my facebook page for latest updates on my youtube channel

+

https://www.facebook.com/tusharroy25

+ +

Contribution

+Please contribute to this repository to help it make better. Any change like new question, code improvement, doc improvement etc. is very welcome. Just send me a pull request and I will review the request and approve it if it looks good. + +

How to use this repository

+ +

Softwares to install

+* Install JDK8 https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html +* Install Git https://git-scm.com/book/en/v2/Getting-Started-Installing-Git +* Install either Intellij https://www.jetbrains.com/idea/download/ +* If you like eclipse instead of intellij install eclipse https://eclipse.org/downloads/ + +

Set up your desktop

+* Pull the git repository. Go to command line and type git clone https://github.com/mission-peace/interview.git +* Go to root directory of checked out project. +* Run ./gradlew idea to generate idea related classes +* Fire up intellij. Go to Open. Go to git repo folder and open interview.ipr . On file menu go to project structure. Update language level support to 8 +* If you use eclipse, do ./gradlew eclipse . This will generate eclipse related files. Go to eclipse and open up folder containing this repo. +* Go to any program and run that program +* Go to any test and run the junit test. +* Run ./gradlew build to create classes, run tests and create jar. diff --git a/showmecode_100/build.gradle b/showmecode_100/build.gradle new file mode 100644 index 00000000..740cd093 --- /dev/null +++ b/showmecode_100/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'eclipse' +apply plugin: "jacoco" + +sourceCompatibility = '1.8' +targetCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + testCompile 'junit:junit:4.12' +} + +sourceSets { + main { + java { + srcDir 'src' + } + } + + test { + java { + srcDir 'test' + } + } +} + +jacocoTestReport { + reports { + xml.enabled false + csv.enabled false + html.destination "${buildDir}/jacocoHtml" + } +} \ No newline at end of file diff --git a/showmecode_100/gradlew b/showmecode_100/gradlew new file mode 100644 index 00000000..9d82f789 --- /dev/null +++ b/showmecode_100/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/showmecode_100/java/com/interview/array/AdditiveNumber.java b/showmecode_100/java/com/interview/array/AdditiveNumber.java new file mode 100644 index 00000000..b2480e91 --- /dev/null +++ b/showmecode_100/java/com/interview/array/AdditiveNumber.java @@ -0,0 +1,48 @@ +package com.interview.array; + +import java.math.BigInteger; + +/** + * Date 04/24/2016 + * @author Tushar Roy + * + * Additive number is a string whose digits can form additive sequence. + * A valid additive sequence should contain at least three numbers. + * Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two. + * + * https://leetcode.com/problems/additive-number/ + */ +public class AdditiveNumber { + + public boolean isAdditiveNumber(String num) { + if (num.length() < 3) { + return false; + } + for (int i = 0; i <= num.length()/2; i++) { + if (num.charAt(0) == '0' && i > 0) { + break; + } + BigInteger x1 = new BigInteger(num.substring(0, i + 1)); + //make sure remaining size is at least size of first and second integer. + for (int j = i + 1; Math.max(i, j - (i + 1)) + 1 <= num.length() - j - 1 ; j++) { + if (num.charAt(i + 1) == '0' && j > i + 1) { + break; + } + BigInteger x2 = new BigInteger(num.substring(i + 1, j + 1)); + if (isValid(num, j + 1, x1, x2)) { + return true; + } + } + } + return false; + } + + private boolean isValid(String num, int start, BigInteger x1, BigInteger x2) { + if (start == num.length()) { + return true; + } + BigInteger x3 = x1.add(x2); + //if num starts with x3 from offset start means x3 is found. So look for next number. + return num.startsWith(x3.toString(), start) && isValid(num, start + x3.toString().length(), x2, x3); + } +} diff --git a/showmecode_100/java/com/interview/array/ArrayAddition.java b/showmecode_100/java/com/interview/array/ArrayAddition.java new file mode 100644 index 00000000..7ad37269 --- /dev/null +++ b/showmecode_100/java/com/interview/array/ArrayAddition.java @@ -0,0 +1,49 @@ +package com.interview.array; + +public class ArrayAddition { + + public int[] add(int arr1[], int arr2[]){ + int l = Math.max(arr1.length, arr2.length); + int[] result = new int[l]; + int c=0; + int i = arr1.length-1; + int j= arr2.length-1; + int r=0; + l--; + while(i >=0 && j >=0){ + r = arr1[i--] + arr2[j--] + c; + c = r/10; + result[l--] = r%10; + } + while(i>=0){ + r = arr1[i--] + c; + c = r/10; + result[l--] = r%10; + } + while(j>=0){ + r = arr2[j--] + c; + c = r/10; + result[l--] = r%10; + } + if(c != 0){ + int[] newResult = new int[result.length+1]; + for(int t= newResult.length-1; t> 0; t--){ + newResult[t] = result[t-1]; + } + newResult[0] = c; + return newResult; + } + return result; + } + + public static void main(String args[]){ + + int arr1[] = {9,9,9,9,9,9,9}; + int arr2[] = {1,6,8,2,6,7}; + ArrayAddition aa = new ArrayAddition(); + int result[] = aa.add(arr1, arr2); + for(int i=0; i < result.length; i++){ + System.out.print(" " + result[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/array/BestMeetingPoint.java b/showmecode_100/java/com/interview/array/BestMeetingPoint.java new file mode 100644 index 00000000..a2c9a845 --- /dev/null +++ b/showmecode_100/java/com/interview/array/BestMeetingPoint.java @@ -0,0 +1,61 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Date 03/24/2016 + * @author Tushar Roy + * + * A group of two or more people wants to meet and minimize the total travel distance. + * You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. + * The distance is calculated using Manhattan Distance, where distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|. + * Find the total distance that needs to be travelled to reach this meeting point. + * + * Time complexity O(m*n) + * Space complexity O(m + n) + * + * https://leetcode.com/problems/best-meeting-point/ + */ +public class BestMeetingPoint { + public int minTotalDistance(int[][] grid) { + if (grid.length == 0 || grid[0].length == 0) { + return 0; + } + List vertical = new ArrayList<>(); + List horizontal = new ArrayList<>(); + + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[0].length; j++) { + if (grid[i][j] == 1) { + vertical.add(i); + horizontal.add(j); + } + } + } + + Collections.sort(vertical); + Collections.sort(horizontal); + + int size = vertical.size()/2; + int x = vertical.get(size); + int y = horizontal.get(size); + int distance = 0; + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[0].length; j++) { + if (grid[i][j] == 1) { + distance += Math.abs(x - i) + Math.abs(y - j); + } + } + } + + return distance; + } + + public static void main(String args[]) { + BestMeetingPoint bmp = new BestMeetingPoint(); + int[][] grid = {{1, 0, 0, 0, 1}, {0, 0, 0, 0, 0},{0, 0, 1, 0, 0}}; + System.out.print(bmp.minTotalDistance(grid)); + } +} diff --git a/showmecode_100/java/com/interview/array/BuySellStockProfit.java b/showmecode_100/java/com/interview/array/BuySellStockProfit.java new file mode 100644 index 00000000..44dd67d9 --- /dev/null +++ b/showmecode_100/java/com/interview/array/BuySellStockProfit.java @@ -0,0 +1,51 @@ +package com.interview.array; + +/** + * Date 03/04/2016 + * @author Tushar Roy + * + * Best time to buy and sell stocks. + * 1) Only 1 transaction is allowed + * 2) Infinite number transactions are allowed + * + * Time complexity O(n) + * Space complexity O(1) + * + * https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ + * https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ + */ +public class BuySellStockProfit { + + public int oneProfit(int arr[]){ + int minPrice = arr[0]; + int maxProfit = 0; + for(int i=1; i < arr.length; i++){ + if(arr[i] - minPrice > maxProfit){ + maxProfit = arr[i] - minPrice; + } + if(arr[i] < minPrice){ + minPrice = arr[i]; + } + } + return maxProfit; + } + + public int allTimeProfit(int arr[]){ + int profit = 0; + for(int i=1; i < arr.length;i++){ + if(arr[i-1] < arr[i]){ + profit += arr[i] - arr[i-1]; + } + } + return profit; + } + + public static void main(String args[]){ + int arr[] = {7,10,15,5,11,2,7,9,3}; + int arr1[] = {6,4,1,3,5,7,3,1,3,4,7,9,2,5,6,0,1,2}; + BuySellStockProfit bss = new BuySellStockProfit(); + System.out.println(bss.oneProfit(arr)); + System.out.print(bss.allTimeProfit(arr1)); + + } +} diff --git a/showmecode_100/java/com/interview/array/CheckIfArrayElementsAreConsecutive.java b/showmecode_100/java/com/interview/array/CheckIfArrayElementsAreConsecutive.java new file mode 100644 index 00000000..8878f3e8 --- /dev/null +++ b/showmecode_100/java/com/interview/array/CheckIfArrayElementsAreConsecutive.java @@ -0,0 +1,35 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/check-if-array-elements-are-consecutive/ + */ +public class CheckIfArrayElementsAreConsecutive { + + public boolean areConsecutive(int input[]){ + int min = Integer.MAX_VALUE; + for(int i=0; i < input.length; i++){ + if(input[i] < min){ + min = input[i]; + } + } + for(int i=0; i < input.length; i++){ + if(Math.abs(input[i]) - min >= input.length){ + return false; + } + if(input[Math.abs(input[i]) - min] < 0){ + return false; + } + input[Math.abs(input[i]) - min] = -input[Math.abs(input[i]) - min]; + } + for(int i=0; i < input.length ; i++){ + input[i] = Math.abs(input[i]); + } + return true; + } + + public static void main(String args[]){ + int input[] = {76,78,76,77,73,74}; + CheckIfArrayElementsAreConsecutive cia = new CheckIfArrayElementsAreConsecutive(); + System.out.println(cia.areConsecutive(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/ChunkMerge.java b/showmecode_100/java/com/interview/array/ChunkMerge.java new file mode 100644 index 00000000..7071ad36 --- /dev/null +++ b/showmecode_100/java/com/interview/array/ChunkMerge.java @@ -0,0 +1,158 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.PriorityQueue; + +/** + * Given a list of lists. Each element in the list is sorted. Sort the + * entire list. + * Test cases + * One or more lists are empty + * All elements in one list are smaller than all elements in another list + */ +public class ChunkMerge { + + class Triplet implements Comparable{ + int pos; + int val; + int index; + @Override + public int compareTo(Triplet o) { + if(val <= o.val){ + return -1; + }else{ + return 1; + } + } + } + + public List mergeUsingHeap(List> chunks){ + List result = new ArrayList(); + PriorityQueue queue = new PriorityQueue(); + //add first element of every chunk into queue + for(int i=0; i < chunks.size(); i++){ + Triplet p = new Triplet(); + p.pos = i; + p.val = chunks.get(i).get(0); + p.index = 1; + queue.add(p); + } + + while(!queue.isEmpty()){ + Triplet p = queue.poll(); + result.add(p.val); + if(p.index < chunks.get(p.pos).size()){ + p.val = chunks.get(p.pos).get(p.index); + p.index += 1; + queue.add(p); + } + } + return result; + } + + public List mergeChunksOfDifferentSize(List> chunks){ + List result = new ArrayList(); + + int sum[] = new int[chunks.size()+1]; + sum[0] = 0; + for(int i =1; i < sum.length;i++){ + sum[i] = sum[i-1] + chunks.get(i-1).size(); + } + + for(List chunk : chunks){ + for(Integer i : chunk){ + result.add(i); + } + } + mergeSort(result,0,chunks.size()-1,sum); + return result; + } + + private void mergeSort(List result,int start,int end,int sum[]){ + if(start >= end){ + return; + } + int mid = (start + end)/2; + mergeSort(result,start,mid,sum); + mergeSort(result,mid+1,end,sum); + sortedMerge(result,start,end,sum); + } + + private void sortedMerge(List result,int start,int end,int sum[]){ + + /** + * If chunks are of equal size then + * i = size*start to (mid+1)*size -1 + * j = (mid+1)*size to size*(end+1) + */ + + int mid = (start + end)/2; + int i = sum[start]; + int j = sum[mid+1]; + List temp = new ArrayList(); + while(i < sum[mid+1] && j < sum[end+1]){ + if(result.get(i) < result.get(j)){ + temp.add(result.get(i)); + i++; + }else{ + temp.add(result.get(j)); + j++; + } + } + while(i < sum[mid+1]){ + temp.add(result.get(i)); + i++; + } + while(j < sum[end+1]){ + temp.add(result.get(j)); + j++; + } + int index = sum[start]; + for(int k : temp){ + result.set(index, k); + index++; + } + } + public static void main(String args[]){ + Integer arr1[] = {1,5,6,9,21}; + Integer arr2[] = {4,6,11,14}; + Integer arr3[] = {-1,0,7}; + Integer arr4[] = {-4,-2,11,14,18}; + Integer arr5[] = {2,6}; + Integer arr6[] = {-5,-2,1,5,7,11,14}; + Integer arr7[] = {-6,-1,0,15,17,22,24}; + + List list1 = Arrays.asList(arr1); + List list2 = Arrays.asList(arr2); + List list3 = Arrays.asList(arr3); + List list4 = Arrays.asList(arr4); + List list5 = Arrays.asList(arr5); + List list6 = Arrays.asList(arr6); + List list7 = Arrays.asList(arr7); + + + List> chunks = new ArrayList>(); + chunks.add(list1); + chunks.add(list2); + chunks.add(list3); + chunks.add(list4); + chunks.add(list5); + chunks.add(list6); + chunks.add(list7); + + ChunkMerge cm = new ChunkMerge(); + List result = cm.mergeChunksOfDifferentSize(chunks); + System.out.println(result.size()); + for(Integer r : result){ + System.out.print(r + " "); + } + + result = cm.mergeUsingHeap(chunks); + System.out.println(); + for(Integer r : result){ + System.out.print(r + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/array/CommonThreeSortedArray.java b/showmecode_100/java/com/interview/array/CommonThreeSortedArray.java new file mode 100644 index 00000000..84dd3040 --- /dev/null +++ b/showmecode_100/java/com/interview/array/CommonThreeSortedArray.java @@ -0,0 +1,49 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 01/01/2016 + * @author Tushar Roy + * + * Given 3 sorted array find common elements in these 3 sorted array. + * + * Time complexity is O(m + n + k) + * + * http://www.geeksforgeeks.org/find-common-elements-three-sorted-arrays/ + */ +public class CommonThreeSortedArray { + + public List commonElements(int input1[], int input2[], int input3[]) { + int i = 0; + int j = 0; + int k = 0; + List result = new ArrayList<>(); + while (i < input1.length && j < input2.length && k < input3.length) { + if (input1[i] == input2[j] && input2[j] == input3[k]) { + result.add(input1[i]); + i++; + j++; + k++; + } else if (input1[i] < input2[j]) { + i++; + } else if (input2[j] < input3[k]) { + j++; + } else { + k++; + } + } + return result; + } + + public static void main(String args[]) { + int input1[] = {1, 5, 10, 20, 40, 80}; + int input2[] = {6, 7, 20, 80, 100}; + int input3[] = {3, 4, 15, 20, 30, 70, 80, 120}; + + CommonThreeSortedArray cts = new CommonThreeSortedArray(); + List result = cts.commonElements(input1, input2, input3); + result.forEach(i -> System.out.print(i + " ")); + } +} diff --git a/showmecode_100/java/com/interview/array/ConvertAnArrayIntoDecreaseIncreaseFashion.java b/showmecode_100/java/com/interview/array/ConvertAnArrayIntoDecreaseIncreaseFashion.java new file mode 100644 index 00000000..b0fb1f19 --- /dev/null +++ b/showmecode_100/java/com/interview/array/ConvertAnArrayIntoDecreaseIncreaseFashion.java @@ -0,0 +1,67 @@ +package com.interview.array; + +import java.util.Arrays; + + +/** + * Convert an unsorted array into an array such that + * a < b > c < d > e < f and so on + */ +public class ConvertAnArrayIntoDecreaseIncreaseFashion { + + public void convert(int arr[]){ + int k = 0; + if(arr.length % 2 ==0){ + k = arr.length/2 ; + }else{ + k = arr.length/2+1; + } + KthElementInArray kthElement = new KthElementInArray(); + kthElement.kthElement(arr, k); + + int high = k; + int low = 1; + while(low < high && high < arr.length){ + swap(arr,low,high); + high++; + low += 2; + } + + } + + /** + * Sort the array first. + * Then swap every adjacent element to get final result + * @param arr + */ + public void convert1(int arr[]){ + Arrays.sort(arr); + for(int i=1; i < arr.length; i+=2){ + if(i+1 < arr.length){ + swap(arr, i, i+1); + } + } + } + + private void swap(int arr[],int low,int high){ + int temp = arr[low]; + arr[low] = arr[high]; + arr[high] = temp; + } + + public static void main(String args[]){ + ConvertAnArrayIntoDecreaseIncreaseFashion can = new ConvertAnArrayIntoDecreaseIncreaseFashion(); + int arr[] = {0,6,9,13,10,-1,8,2,4,14,-5}; + can.convert(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i] + " "); + } + System.out.println(); + int arr1[] = {0,6,9,13,10,-1,8,2,4,14,-5}; + can.convert1(arr1); + for(int i=0; i < arr1.length; i++){ + System.out.print(arr1[i] + " "); + } + } + +} diff --git a/showmecode_100/java/com/interview/array/CountInversionOfSize3.java b/showmecode_100/java/com/interview/array/CountInversionOfSize3.java new file mode 100644 index 00000000..1d10f0f1 --- /dev/null +++ b/showmecode_100/java/com/interview/array/CountInversionOfSize3.java @@ -0,0 +1,42 @@ +package com.interview.array; + +/** + * Date 12/29/15 + * @author Tushar Roy + * + * Given input array find number of inversions where i < j < k and input[i] > input[j] > input[k] + * + * http://www.geeksforgeeks.org/count-inversions-of-size-three-in-a-give-array/ + */ +public class CountInversionOfSize3 { + + /** + * Time complexity of this method is O(n^2) + * Space complexity is O(1) + */ + public int findInversions(int input[]) { + int inversion = 0; + for (int i = 1; i < input.length - 1 ; i++) { + int larger = 0; + for (int k = 0; k < i; k++) { + if (input[k] > input[i]) { + larger++; + } + } + int smaller = 0; + for (int k = i+1; k < input.length; k++) { + if (input[k] < input[i]) { + smaller++; + } + } + inversion += smaller*larger; + } + return inversion; + } + + public static void main(String args[]) { + int input[] = {9, 6, 4, 5, 8}; + CountInversionOfSize3 ci = new CountInversionOfSize3(); + System.out.print(ci.findInversions(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/CountSmallerOnRight.java b/showmecode_100/java/com/interview/array/CountSmallerOnRight.java new file mode 100644 index 00000000..46a82304 --- /dev/null +++ b/showmecode_100/java/com/interview/array/CountSmallerOnRight.java @@ -0,0 +1,92 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 03/01/2016 + * @author Tushar Roy + * + * Count number of smaller elements on right side of an array for every element. + * + * Time complexity is O(nlogn) + * Space complexity is O(n) + * + * https://leetcode.com/problems/count-of-smaller-numbers-after-self/ + */ +public class CountSmallerOnRight { + static class NumberIndex { + int val; + int index; + NumberIndex(int val, int index) { + this.val = val; + this.index = index; + } + } + + public List countSmaller(int[] nums) { + if (nums.length == 0) { + return new ArrayList<>(); + } + NumberIndex[] input = new NumberIndex[nums.length]; + for (int i = 0; i < nums.length; i++) { + input[i] = new NumberIndex(nums[i], i); + } + + int result[] = new int[nums.length]; + + mergeUtil(input, result, 0, input.length - 1); + + List r = new ArrayList<>(); + for (int s : result) { + r.add(s); + } + return r; + } + + private void mergeUtil(NumberIndex[] nums, int[] result, int low, int high) { + if (low == high) { + return; + } + int mid = (low + high)/2; + mergeUtil(nums, result, low, mid); + mergeUtil(nums, result, mid + 1, high); + + int i = low; + int j = mid + 1; + NumberIndex[] t = new NumberIndex[high - low + 1]; + int k = 0; + int tempResult[] = new int[high - low + 1]; + while (i <= mid && j <= high) { + if (nums[i].val <= nums[j].val) { + tempResult[nums[i].index - low] = j - mid - 1; + t[k++] = nums[i++]; + } else { + tempResult[nums[i].index - low] = j - mid; + t[k++] = nums[j++]; + } + } + int i1= i; + while (i1 <= mid) { + tempResult[nums[i1].index - low] = j - mid - 1; + t[k++] = nums[i1++]; + } + + while (j <= high) { + t[k++] = nums[j++]; + } + + k = 0; + for (i = low; i <= high; i++) { + nums[i] = t[k]; + result[i] += tempResult[k++]; + } + } + + public static void main(String args[]) { + CountSmallerOnRight csr = new CountSmallerOnRight(); + int nums[] = {5, 2, 6, 1, 0, 3}; + List result = csr.countSmaller(nums); + result.forEach(r -> System.out.print(r + " ")); + } +} diff --git a/showmecode_100/java/com/interview/array/DivideNumbersInEqualGroupWithClosestSum.java b/showmecode_100/java/com/interview/array/DivideNumbersInEqualGroupWithClosestSum.java new file mode 100644 index 00000000..1d986087 --- /dev/null +++ b/showmecode_100/java/com/interview/array/DivideNumbersInEqualGroupWithClosestSum.java @@ -0,0 +1,51 @@ +package com.interview.array; + +/** + * This solution is incorrect. It is greedy approach which will not work + * e.g 1,6,6,8,9,10 - Result should be 1,9,10 and 6,6,8 but it will not give this result + * since it will greedily break 9 and 10 into different sets + * + * INCORRECT SOLUTION.(Still keeping the code in case I can improve it) + * + */ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class DivideNumbersInEqualGroupWithClosestSum { + + public void divide(int arr[],List list1, List list2){ + Arrays.sort(arr); + int len = arr.length; + int sum1 = 0; + int sum2 = 0; + for(int i = len-1 ; i >=0; i--){ + if((sum1 < sum2 && list1.size() < len/2) || (list2.size() >= len/2)){ + list1.add(arr[i]); + sum1 = sum1 + arr[i]; + }else{ + list2.add(arr[i]); + sum2 = sum2 + arr[i]; + } + } + } + + public static void main(String args[]){ + List list1 = new ArrayList(); + List list2 = new ArrayList(); + int arr[] = {15,14,13,1,3,2,}; + int arr1[] = {23, 45, 34, 12,11, 98, 99, 4, 189, 1,7,19,105, 201}; + + DivideNumbersInEqualGroupWithClosestSum dn = new DivideNumbersInEqualGroupWithClosestSum(); + dn.divide(arr, list1, list2); + System.out.println(list1); + System.out.println(list2); + + list1.clear(); + list2.clear(); + dn.divide(arr1, list1, list2); + System.out.println(list1); + System.out.println(list2); + + } +} diff --git a/showmecode_100/java/com/interview/array/DuplicateNumberDetection.java b/showmecode_100/java/com/interview/array/DuplicateNumberDetection.java new file mode 100644 index 00000000..47af7ef7 --- /dev/null +++ b/showmecode_100/java/com/interview/array/DuplicateNumberDetection.java @@ -0,0 +1,39 @@ +package com.interview.array; + +/** + * Date 03/04/2016 + * @author Tushar Roy + * + * Given an array of size n + 1 with elements from 1 to n. One element is duplicated mulitiple times. + * Find that element in O(1) space. Array cannot be changed. + * + * Reference + * https://leetcode.com/problems/find-the-duplicate-number/ + */ +public class DuplicateNumberDetection { + public int findDuplicate(int[] nums) { + if (nums.length == 0 || nums.length == 1) { + return -1; + } + + int slow = nums[0]; + int fast = nums[nums[0]]; + while (slow != fast) { + slow = nums[slow]; + fast = nums[nums[fast]]; + } + fast = 0; + while (slow != fast) { + slow = nums[slow]; + fast = nums[fast]; + } + + return fast; + } + + public static void main(String args[]) { + int[] input = {2,1,3,4,3}; + DuplicateNumberDetection dd = new DuplicateNumberDetection(); + System.out.println(dd.findDuplicate(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/DuplicateWithinkIndices.java b/showmecode_100/java/com/interview/array/DuplicateWithinkIndices.java new file mode 100644 index 00000000..b78cb43d --- /dev/null +++ b/showmecode_100/java/com/interview/array/DuplicateWithinkIndices.java @@ -0,0 +1,31 @@ +package com.interview.array; + +import java.util.HashSet; +import java.util.Set; + +/** + * Write a function that determines whether a array contains duplicate + * characters within k indices of each other + */ +public class DuplicateWithinkIndices { + + public boolean duplicate(int arr[],int k){ + Set visited = new HashSet(); + for(int i=0; i < arr.length; i++){ + if(visited.contains(arr[i])){ + return true; + } + if(i >= k){ + visited.remove(arr[i-k]); + } + visited.add(arr[i]); + } + return false; + } + + public static void main(String args[]){ + int arr[] = {1,2,3,11,2,5,6}; + DuplicateWithinkIndices dk = new DuplicateWithinkIndices(); + System.out.println(dk.duplicate(arr, 3)); + } +} diff --git a/showmecode_100/java/com/interview/array/FindElementsOccurringNByKTimesTetris.java b/showmecode_100/java/com/interview/array/FindElementsOccurringNByKTimesTetris.java new file mode 100644 index 00000000..9aaa5058 --- /dev/null +++ b/showmecode_100/java/com/interview/array/FindElementsOccurringNByKTimesTetris.java @@ -0,0 +1,73 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/given-an-array-of-of-size-n-finds-all-the-elements-that-appear-more-than-nk-times/ + * The reason this algorithm works is there can never be more than k-1 elements of size + * more than n/k + * + * This question does not make much sense. Why not just use a map and keep count and + * check if occurrence is more than n/k. This is way too much effort to find elements more than + * n by k even though it saves some space. + */ +public class FindElementsOccurringNByKTimesTetris { + + public static class Pair{ + public int element; + public int count; + } + + public void printElementsOccurringKTimes(int arr[],int k){ + Pair[] p = new Pair[k]; + for(int i=0; i < k; i++){ + p[i] = new Pair(); + } + for(int i=0; i < arr.length; i++){ + + int j=0; + for(j=0; j < k; j++){ + if(p[j].element == arr[i]){ + p[j].count++; + break; + } + } + + if(j == k){ + int l=0; + for(l =0; l < k ; l++){ + if(p[l].count == 0){ + p[l].element = arr[i]; + p[l].count = 1; + break; + } + } + if(l == k){ + for(int t =0; t < k ; t++){ + p[t].count--; + } + } + } + } + + for(int i=0; i < k ; i++){ + if(p[i].count > 0){ + int count =0; + for(int j=0; j < arr.length; j++){ + if(arr[j] == p[i].element){ + count++; + } + } + if(count >= arr.length/k){ + System.out.println(p[i].element); + } + } + } + } + + public static void main(String args[]){ + int arr[] = {3,2,2,1,1,2,3,3,4,5,3,1}; + FindElementsOccurringNByKTimesTetris fe = new FindElementsOccurringNByKTimesTetris(); + fe.printElementsOccurringKTimes(arr, 3); + } + + +} diff --git a/showmecode_100/java/com/interview/array/FirstPositiveMissing.java b/showmecode_100/java/com/interview/array/FirstPositiveMissing.java new file mode 100644 index 00000000..fe32d857 --- /dev/null +++ b/showmecode_100/java/com/interview/array/FirstPositiveMissing.java @@ -0,0 +1,43 @@ +package com.interview.array; + +/** + * https://leetcode.com/problems/first-missing-positive/ + */ +public class FirstPositiveMissing { + public int firstMissingPositive(int[] nums) { + int startOfPositive = segregate(nums); + for (int i = startOfPositive; i < nums.length; i++) { + int index = Math.abs(nums[i]) + startOfPositive - 1; + if (index < nums.length) { + nums[index] = -Math.abs(nums[index]); + } + } + for (int i = startOfPositive; i < nums.length; i++) { + if (nums[i] > 0) { + return i - startOfPositive + 1; + } + } + return nums.length - startOfPositive + 1; + } + + private int segregate(int[] nums) { + int start = 0; + int end = nums.length -1 ; + while (start <= end) { + if (nums[start] <= 0) { + start++; + } else if (nums[end] > 0) { + end--; + } else { + swap(nums, start, end); + } + } + return start; + } + + private void swap(int[] nums, int start, int end) { + int t = nums[start]; + nums[start] = nums[end]; + nums[end] = t; + } +} diff --git a/showmecode_100/java/com/interview/array/Flip0sMaximum1s.java b/showmecode_100/java/com/interview/array/Flip0sMaximum1s.java new file mode 100644 index 00000000..e34667f6 --- /dev/null +++ b/showmecode_100/java/com/interview/array/Flip0sMaximum1s.java @@ -0,0 +1,48 @@ +package com.interview.array; + +/** + * Date 12/29/2015 + * @author Tushar Roy + * + * Given input array of 0s and 1s and number of flips allowed from 0 to 1, what is maximum consecutive 1s we can have + * in array + * + * Time complexity - O(n) + * Space complexity - O(1) + * + * http://www.geeksforgeeks.org/find-zeroes-to-be-flipped-so-that-number-of-consecutive-1s-is-maximized/ + */ +public class Flip0sMaximum1s { + + public int flip0sToMaximizeConsecutive1s(int input[], int flipsAllowed) { + + int windowStart = 0; + int countZero = 0; + int result = 0; + for (int i = 0 ; i < input.length; i++) { + if (input[i] == 1) { + result = Math.max(result, i - windowStart + 1); + } else { + if (countZero < flipsAllowed) { + countZero++; + result = Math.max(result, i - windowStart + 1); + } else { + while(true) { + if (input[windowStart] == 0) { + windowStart++; + break; + } + windowStart++; + } + } + } + } + return result; + } + + public static void main(String args[]) { + int input[] = {0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1}; + Flip0sMaximum1s fm = new Flip0sMaximum1s(); + System.out.print(fm.flip0sToMaximizeConsecutive1s(input, 1)); + } +} diff --git a/showmecode_100/java/com/interview/array/FourSum.java b/showmecode_100/java/com/interview/array/FourSum.java new file mode 100644 index 00000000..01cd30c9 --- /dev/null +++ b/showmecode_100/java/com/interview/array/FourSum.java @@ -0,0 +1,90 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Date 07/31/2016 + * @author Tushar Roy + * + * Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? + * Find all unique quadruplets in the array which gives the sum of target. + * + * Time complexity O(n^3) + * Space complexity O(1) + * + * Reference + * https://leetcode.com/problems/4sum/ + */ +public class FourSum { + + public List> fourSum(int[] nums, int target) { + if (nums.length < 4) { + return Collections.EMPTY_LIST; + } + Arrays.sort(nums); + List> result = new ArrayList<>(); + for (int i = 0; i < nums.length - 3; i++) { + if (i != 0 && nums[i] == nums[i - 1]) { + continue; + } + if(nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target) { + break; + } + if(nums[i] + nums[nums.length - 3] + nums[nums.length - 2] + nums[nums.length - 1] < target) { + continue; + } + for (int j = i + 1; j < nums.length - 2; j++) { + if (j != i + 1 && nums[j] == nums[j - 1]) { + continue; + } + if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) { + break; + } + if (nums[i] + nums[j] + nums[nums.length - 1] + nums[nums.length - 1] < target) { + continue; + } + int low = j + 1; + int high = nums.length - 1; + while (low < high) { + if (low != j + 1 && nums[low] == nums[low - 1]) { + low++; + continue; + } + if (high != nums.length - 1 && nums[high] == nums[high + 1]) { + high--; + continue; + } + + int sum = nums[i] + nums[j] + nums[low] + nums[high]; + if (sum == target) { + List r = new ArrayList<>(); + r.add(nums[i]); + r.add(nums[j]); + r.add(nums[low]); + r.add(nums[high]); + result.add(r); + low++; + high--; + } else if (sum < target) { + low++; + } else { + high--; + } + } + } + } + return result; + } + + public static void main(String args[]) { + int[] nums = {1, 1, 4, 5, 9, 11}; + int[] nums1 = {1, 0, -1, 0, -2, 2}; + int target = 0; + FourSum fourSum = new FourSum(); + List> result = fourSum.fourSum(nums1, target); + result.forEach(System.out::print); + } +} diff --git a/showmecode_100/java/com/interview/array/GasStationCircle.java b/showmecode_100/java/com/interview/array/GasStationCircle.java new file mode 100644 index 00000000..4428b088 --- /dev/null +++ b/showmecode_100/java/com/interview/array/GasStationCircle.java @@ -0,0 +1,85 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/find-a-tour-that-visits-all-stations/ + * You can solve this one using kadane wrap since it finds max contiguous sum + * for wrapped array. That start point is a best place to start a tour. + * Test cases + * Check if length of both input array is same + * Check that there exists a path after kadane wrap responds + * Check that there is at least one positive difference before you call kadane + */ +public class GasStationCircle { + + public int startTour(int gasAvailable[],int gasRequired[]){ + int start = -1; + int end = 0; + int currentGas = 0; + boolean visitedOnce = false; + while(start != end){ + currentGas += gasAvailable[end] - gasRequired[end]; + if(start == -1){ + start = end; + } + if(end == gasAvailable.length-1 && visitedOnce == false){ + visitedOnce = true; + }else if(end == gasAvailable.length-1 && visitedOnce == true){ + return -1; + } + if(currentGas < 0){ + start = -1; + currentGas = 0; + } + end = (end + 1)%gasAvailable.length; + } + + return end; + } + + /** + * If it is not guaranteed that tour exists then once you get + * result of kadanewrap make an actual trip to see if value is positive + * @return -1 if no solution exists otherwise returns gas station at which to start. + */ + public int startTour1(int gasAvailable[], int gasRequired[]){ + int diff[] = new int[gasAvailable.length]; + for(int i=0; i < diff.length; i++){ + diff[i] = gasAvailable[i] - gasRequired[i]; + } + + boolean allNegative = true; + for (int i = 0; i < diff.length; i++) { + if (diff[i] >= 0) { + allNegative = false; + break; + } + } + + if (allNegative) { + return -1; + } + + KadaneWrapArray kwa = new KadaneWrapArray(); + Triplet t = kwa.kadaneWrap(diff); + //make sure this solution leads to answer + int i = t.start; + int netGas = 0; + do { + netGas += diff[i]; + i = (i + 1)%diff.length; + if (netGas < 0) { + return -1; + } + } while (i != t.start); + + return t.start; + } + + public static void main(String args[]){ + GasStationCircle gsc = new GasStationCircle(); + int[] gasAvailable = {4, 4, 6}; + int[] gasRequired = {5, 6, 1}; + System.out.println(gsc.startTour(gasAvailable, gasRequired)); + System.out.println(gsc.startTour1(gasAvailable, gasRequired)); + } +} diff --git a/showmecode_100/java/com/interview/array/GreedyTextJustification.java b/showmecode_100/java/com/interview/array/GreedyTextJustification.java new file mode 100644 index 00000000..1136eecf --- /dev/null +++ b/showmecode_100/java/com/interview/array/GreedyTextJustification.java @@ -0,0 +1,137 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 03/12/2016 + * @author Tushar Roy + * + * Given an array of words and a length L, format the text such that each line has exactly L characters and is fully + * (left and right) justified. + * You should pack your words in a greedy approach; that is, pack as many words as you can in each line. + * + * Time complexity - O(n) where n is the number of words + * Space complexity - O(1) + * + * https://leetcode.com/problems/text-justification/ + */ +public class GreedyTextJustification { + public List fullJustify(String[] words, int maxWidth) { + List result = new ArrayList<>(); + for (int i = 0; i < words.length; ) { + int total = words[i].length(); + int j = i + 1; + StringBuffer buff = new StringBuffer(); + buff.append(words[i]); + while(j < words.length && total + words[j].length() + 1 <= maxWidth) { + total += words[j].length() + 1; + j++; + } + int remaining = maxWidth - total; + //since j is not word length means its not a last line. So pad accordingly. + if (j != words.length) { + int count = j - i - 1; + if (count == 0) { + padSpace(buff, remaining); + } else { + int q = remaining/count; + int r = remaining % count; + for (int k = i + 1; k < j; k++) { + padSpace(buff, q); + if (r > 0) { + buff.append(" "); + r--; + } + buff.append(" ").append(words[k]); + } + } + } else { //if it is last line then left justify all the words. + for (int k = i + 1; k < j; k++) { + buff.append(" ").append(words[k]); + } + padSpace(buff, remaining); + } + result.add(buff.toString()); + i = j; + } + return result; + } + + private void padSpace(StringBuffer buff, int count) { + for (int i = 0; i < count; i++) { + buff.append(" "); + } + } + + public List fullJustify1(String[] words, int maxWidth) { + int currentLength = 0; + int prevIndex = 0; + List result = new ArrayList<>(); + + for (int i = 0; i < words.length; i++) { + //keep track of length for currentLine. For first word only use length while for remaining words use + //lenght + 1 since there will be a space b/w them. + currentLength += (words[i].length() + (i == prevIndex ? 0 : 1)); + + //if currentLength exceeds maxWidth it means currentWord cannot in same line. + if (currentLength > maxWidth) { + //subtract current word's length from currentLength + currentLength -= words[i].length() + 1; + StringBuffer builder = new StringBuffer(); + + //find number of words which will find in the line. + int gaps = i - 1 - prevIndex; + if (gaps > 0) {//if more than one word fits in the gap. + //available number of spaces is below. Subtract gaps because that many spaces have been accounted + //for in currentLength. + int availableSpace = maxWidth - currentLength + gaps; + + //first remaining gaps get one extra space. + int remaining = availableSpace % gaps; + + //every gap gets this much extra space. + int atleast = availableSpace / gaps; + for (int j = prevIndex; j <= i - 2; j++) { + builder.append(words[j]); + padSpace(builder, atleast); + if (j - prevIndex < remaining) { + padSpace(builder, 1); + } + } + builder.append(words[i - 1]); + } else { //if only one word can fit in a one line then left specify it. + builder.append(words[i - 1]); + padSpace(builder, maxWidth - words[i - 1].length()); + } + result.add(builder.toString()); + prevIndex = i; + currentLength = words[i].length(); + } + } + //handle the last line. Left justify the remaining words + if (prevIndex < words.length) { + StringBuffer builder = new StringBuffer(); + int count = 0; + while (prevIndex < words.length) { + builder.append(words[prevIndex]).append(" "); + count += words[prevIndex].length() + 1; + prevIndex++; + } + count--; + //delete extra space added by above for looop. + builder.deleteCharAt(builder.length() - 1); + //whatever spae is left just put it at the end. + padSpace(builder, maxWidth - count); + result.add(builder.toString()); + } + return result; + } + + public static void main(String args[]) { + String[] input = {"What","must","be","shall","be."}; + GreedyTextJustification gtj = new GreedyTextJustification(); + List result = gtj.fullJustify(input, 12); + System.out.print(result); + } +} diff --git a/showmecode_100/java/com/interview/array/GroupElementsInSizeM.java b/showmecode_100/java/com/interview/array/GroupElementsInSizeM.java new file mode 100644 index 00000000..39b0758c --- /dev/null +++ b/showmecode_100/java/com/interview/array/GroupElementsInSizeM.java @@ -0,0 +1,87 @@ +package com.interview.array; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.PriorityQueue; + +/** + * http://www.careercup.com/question?id=6026101998485504 + * This answer two questions. + * Group elements in size m such that in every group only unique elements are possible. + * It also answers question where rearrange array such that same elements are exactly m + * distance from each other + */ +class Pair{ + int num; + int count; + Pair(int num,int count){ + this.count = count; + this.num = num; + } +} + +class Comparators implements Comparator{ + + @Override + public int compare(Pair o1, Pair o2) { + if(o1.count <= o2.count){ + return 1; + }else{ + return -1; + } + } + +} + +public class GroupElementsInSizeM { + + public boolean group(int input[],int m){ + Map count = new HashMap(); + for(Integer i : input){ + int c = 1; + if(count.containsKey(i)){ + c = count.get(i); + c++; + } + count.put(i, c); + } + + PriorityQueue maxHeap = new PriorityQueue(count.size(),new Comparators()); + for(Integer s : count.keySet()){ + int c = count.get(s); + //if any count is greater than len/m then this arrangement is not possible + if(c > Math.ceil(input.length*1.0/m)){ + return false; + } + maxHeap.offer(new Pair(s,c)); + } + int current = 0; + int start = current; + while(maxHeap.size() > 0){ + Pair p = maxHeap.poll(); + int i =0; + while(i < p.count){ + input[start] = p.num; + start = start + m; + if(start >= input.length){ + current++; + start = current; + } + i++; + } + } + return true; + } + + public static void main(String args[]){ + int input[] = {2,1,5,1,3,5,3,3,4}; + int input1[] = {1,2,3,8,8,8,7,8}; + GroupElementsInSizeM gps = new GroupElementsInSizeM(); + boolean r = gps.group(input1, 3); + System.out.println(r); + for(int i=0; i < input1.length; i++){ + System.out.println(input1[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/array/HIndex.java b/showmecode_100/java/com/interview/array/HIndex.java new file mode 100644 index 00000000..19d39137 --- /dev/null +++ b/showmecode_100/java/com/interview/array/HIndex.java @@ -0,0 +1,47 @@ +package com.interview.array; + +/** + * Given an array of citations (each citation is a non-negative integer) of a researcher, + * write a function to compute the researcher's h-index. + * https://leetcode.com/problems/h-index/ + */ +public class HIndex { + public int hIndex(int[] citations) { + int[] count = new int[citations.length + 1]; + for (int c : citations) { + if (c <= citations.length) { + count[c]++; + } else { + count[citations.length]++; + } + } + + int sum = 0; + int max = 0; + for (int i = 0; i < count.length; i++) { + sum += count[i]; + //we are trying to see if i is answer. + //already everything before i has less than i citations. + //so only thing to check is that p >= i where p is + //total number of papers with i or more citations. + int p = citations.length - sum + count[i]; + if (i <= p) { + max = i; + } + } + return max; + } + + public static void main(String args[]) { + HIndex hi = new HIndex(); + int[] input = {0, 1, 1, 1, 1, 6, 7 ,8}; + System.out.print(hi.hIndex(input)); + } +} + +//0 1 2 6 6 6 6 7 +//0 1 2 3 4 5 6 7 +//0 1 1 1 3 6 7 8 +//0 1 2 3 4 5 6 7 + +//0 1 2 5 6 diff --git a/showmecode_100/java/com/interview/array/IncreasingSubsequnceOfLength3WithMaxProduct.java b/showmecode_100/java/com/interview/array/IncreasingSubsequnceOfLength3WithMaxProduct.java new file mode 100644 index 00000000..7c90d36b --- /dev/null +++ b/showmecode_100/java/com/interview/array/IncreasingSubsequnceOfLength3WithMaxProduct.java @@ -0,0 +1,68 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/increasing-subsequence-of-length-three-with-maximum-product/ + * Keep two arrays which keeps max from current position to right side + * Other array keeps max on left size which is smaller than current element + * Once you have these two arrays from 2nd to 2nd last position keep multiplying + * elements at 3 arrays index position to get max product + * Test cases + * Negative numbers + * 0 in the input + */ +public class IncreasingSubsequnceOfLength3WithMaxProduct { + + public int maxProduct(int arr[]){ + int RGN[] = new int[arr.length]; + int LGN[] = new int[arr.length]; + RGN[arr.length-1] = arr[arr.length-1]; + int max = arr[arr.length-1]; + for(int i=arr.length-2; i>=0; i--){ + if(max < arr[i]){ + max = arr[i]; + } + if(max > arr[i]){ + RGN[i] = max; + } + else{ + RGN[i] = 0; + } + } + LGN[0] = 0; + //This can be implemented using an AVL tree instead of this way which will + //make it O(nLogn) operation insteado ofO(n2). + for(int i=1; i < arr.length; i++){ + getLGN(arr,i,LGN); + } + int maxProduct = 0; + for(int i=1; i < arr.length-1; i++){ + int product = arr[i]*LGN[i]*RGN[i]; + if(maxProduct < product){ + maxProduct = product; + } + } + return maxProduct; + } + + private void getLGN(int arr[],int pos,int LGN[]){ + int max = 0; + int i =0; + while(i < pos){ + if(arr[i] < arr[pos]){ + if(arr[i] > max){ + max = arr[i]; + } + } + i++; + } + LGN[pos] = max; + } + + public static void main(String args[]){ + int arr[] = {6, 7, 8, 1, 2, 3, 9, 10}; + IncreasingSubsequnceOfLength3WithMaxProduct iss = new IncreasingSubsequnceOfLength3WithMaxProduct(); + System.out.println(iss.maxProduct(arr)); + int arr1[] = {1, 5, 10, 8, 9}; + System.out.println(iss.maxProduct(arr1)); + } +} diff --git a/showmecode_100/java/com/interview/array/IncreasingTripletSubsequence.java b/showmecode_100/java/com/interview/array/IncreasingTripletSubsequence.java new file mode 100644 index 00000000..c6fe384f --- /dev/null +++ b/showmecode_100/java/com/interview/array/IncreasingTripletSubsequence.java @@ -0,0 +1,43 @@ +package com.interview.array; + +/** + * Date 03/06/2016 + * @author Tushar Roy + * + * Find if there exists an increasing triplet subsequence. + * Similar method to longest increasing subsequence in nlogn time. + * + * Time complexity is O(n) + * Space complexity is O(1) + * + * https://leetcode.com/problems/increasing-triplet-subsequence/ + */ +public class IncreasingTripletSubsequence { + public boolean increasingTriplet(int[] nums) { + int T[] = new int[3]; + int len = 0; + for (int i = 0; i < nums.length; i++) { + boolean found = false; + for (int j = 0; j < len; j++) { + if (T[j] >= nums[i]) { + T[j] = nums[i]; + found = true; + break; + } + } + if (!found) { + T[len++] = nums[i]; + } + if (len == 3) { + return true; + } + } + return false; + } + + public static void main(String args[]) { + IncreasingTripletSubsequence tripletSubsequence = new IncreasingTripletSubsequence(); + int input[] = {9, 10, -2, 12, 6, 7, -1}; + System.out.print(tripletSubsequence.increasingTriplet(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/JumpGame.java b/showmecode_100/java/com/interview/array/JumpGame.java new file mode 100644 index 00000000..e2f67997 --- /dev/null +++ b/showmecode_100/java/com/interview/array/JumpGame.java @@ -0,0 +1,57 @@ +package com.interview.array; + +/** + * Date 07/31/2016 + * @author Tushar Roy + * + * Given an array of non-negative integers, you are initially positioned at the first index of the array. + * Each element in the array represents your maximum jump length at that position. + * Determine if you are able to reach the last index. + * + * Time complexity O(n) + * Space complexity O(1) + * + * https://leetcode.com/problems/jump-game/ + * + * Given an array of non-negative integers, you are initially positioned at the first index of the array. + * Each element in the array represents your maximum jump length at that position. + * Your goal is to reach the last index in the minimum number of jumps. + * + * Time complexity O(n) + * Space complexity O(1) + * + * https://leetcode.com/problems/jump-game-ii/ + */ +public class JumpGame { + + public boolean canJump(int[] nums) { + int jump = 0; + int i; + for (i = 0; i < nums.length && i <= jump; i++) { + jump = Math.max(jump, i + nums[i]); + } + return i == nums.length; + } + + public int jump(int[] nums) { + int current = 0; + int max = 0; + int count = 0; + for (int i = 0; i < nums.length - 1; i++) { + max = Math.max(max, i + nums[i]); + if (current == i) { + count++; + current = max; + } + } + return count; + } + + public static void main(String args[]) { + JumpGame jumpGame = new JumpGame(); + int[] nums = {3, 2, 3, 0, 2, 1}; + System.out.println(jumpGame.jump(nums)); + int[] nums1 = {3, 0, 2, 0, 0, 1}; + System.out.println(jumpGame.canJump(nums1)); + } +} diff --git a/showmecode_100/java/com/interview/array/KadaneWrapArray.java b/showmecode_100/java/com/interview/array/KadaneWrapArray.java new file mode 100644 index 00000000..f4951b12 --- /dev/null +++ b/showmecode_100/java/com/interview/array/KadaneWrapArray.java @@ -0,0 +1,82 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/maximum-contiguous-circular-sum/ + * Test cases + * All negative + * All positives + * all 0s + */ + +class Triplet{ + int start; + int end; + int sum; + @Override + public String toString() { + return "Triplet [start=" + start + ", end=" + end + ", sum=" + sum + + "]"; + } + +} +public class KadaneWrapArray { + + public Triplet kadaneWrap(int arr[]){ + Triplet straightKadane = kadane(arr); + int sum =0; + for(int i=0; i < arr.length; i++){ + sum += arr[i]; + arr[i] = -arr[i]; + } + Triplet wrappedNegKadane = kadane(arr); + for(int i=0; i < arr.length; i++){ + arr[i] = -arr[i]; + } + if(straightKadane.sum < sum + wrappedNegKadane.sum){ + straightKadane.sum = wrappedNegKadane.sum + sum; + straightKadane.start = wrappedNegKadane.end+1; + straightKadane.end = wrappedNegKadane.start-1; + } + return straightKadane; + } + + /** + * This method assumes there is at least one positive number in the array. + * Otherwise it will break + * @param arr + * @return + */ + public Triplet kadane(int arr[]){ + int sum =0; + int cStart = 0; + int mStart = 0; + int end = 0; + int maxSum = Integer.MIN_VALUE; + for(int i=0; i < arr.length; i++){ + sum += arr[i]; + if(sum <= 0){ + sum = 0; + cStart = i+1; + }else{ + if(sum > maxSum){ + maxSum = sum; + mStart = cStart; + end = i; + } + } + } + Triplet p = new Triplet(); + p.sum = maxSum; + p.start = mStart; + p.end = end; + return p; + } + + public static void main(String args[]){ + KadaneWrapArray kwa = new KadaneWrapArray(); + int input[] = {12, -2, -6, 5, 9, -7, 3}; + int input1[] = {8, -8, 9, -9, 10, -11, 12}; + System.out.println(kwa.kadaneWrap(input)); + System.out.println(kwa.kadaneWrap(input1)); + } +} diff --git a/showmecode_100/java/com/interview/array/KthElementInArray.java b/showmecode_100/java/com/interview/array/KthElementInArray.java new file mode 100644 index 00000000..82c6c121 --- /dev/null +++ b/showmecode_100/java/com/interview/array/KthElementInArray.java @@ -0,0 +1,65 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Kth largest element in an array. + * Use quickselect of quicksort to find the solution in hopefully O(nlogn) time. + * Test cases + * Sorted array + * Reverse sorted array + */ +public class KthElementInArray { + + public int kthElement(int arr[],int k){ + int low = 0; + int high = arr.length-1; + int pos =0; + while(true){ + pos = quickSelect(arr,low,high); + if(pos == (k+low)){ + return arr[pos]; + } + if(pos > k + low){ + high = pos-1; + }else{ + k = k - (pos - low + 1); + low = pos+1; + } + } + } + + private int quickSelect(int arr[],int low,int high){ + int pivot = low; + low++; + while(low <= high){ + if(arr[pivot] > arr[low]){ + low++; + continue; + } + if(arr[pivot] <= arr[high]){ + high--; + continue; + } + swap(arr,low,high); + } + if(arr[high] < arr[pivot]){ + swap(arr,pivot,high); + } + return high; + } + + private void swap(int arr[],int low,int high){ + int temp = arr[low]; + arr[low] = arr[high]; + arr[high] = temp; + } + + public static void main(String args[]){ + int arr[] = {6, 2, 1, 6, 8, 9, 6}; + KthElementInArray kthElement = new KthElementInArray(); + System.out.print(kthElement.kthElement(arr, arr.length/2)); + System.out.print(Arrays.toString(arr)); + } + +} diff --git a/showmecode_100/java/com/interview/array/KthLargestInTwoSortedArray.java b/showmecode_100/java/com/interview/array/KthLargestInTwoSortedArray.java new file mode 100644 index 00000000..4be56503 --- /dev/null +++ b/showmecode_100/java/com/interview/array/KthLargestInTwoSortedArray.java @@ -0,0 +1,123 @@ +package com.interview.array; + +/** + * http://stackoverflow.com/questions/4686823/given-2-sorted-arrays-of-integers-find-the-nth-largest-number-in-sublinear-time + * http://articles.leetcode.com/2011/01/find-k-th-smallest-element-in-union-of.html + */ +public class KthLargestInTwoSortedArray { + + + public int kthLargest1(int arr1[],int arr2[],int low1,int high1,int low2,int high2,int k){ + int len1 = high1-low1 +1; + int len2 = high2 - low2+1; + + if(len1 == 0){ + return arr2[low2+k]; + } + if(len2 ==0){ + return arr1[low1+k]; + } + if(k == 0){ + return Math.min(arr1[low1], arr2[low2]); + } + + + int mid1 = len1*k/(len1 + len2); + int mid2 = k - mid1 - 1; + + mid1 = low1+mid1; + mid2 = low2 + mid2; + + if(arr1[mid1] > arr2[mid2]){ + k = k - mid2 + low2 -1; + high1 = mid1; + low2 = mid2 + 1; + }else{ + k = k - mid1 + low1 -1; + high2 = mid2; + low1 = mid1+1; + } + return kthLargest(arr1, arr2, low1, high1, low2, high2, k); + } + + + + public int kthLargest(int input1[],int input2[],int k){ + return kthLargest(input1, input2, 0, input1.length-1, 0, input2.length-1, k); + } + + private int kthLargest(int input1[],int input2[],int l1, int h1, int l2,int h2,int k){ + if(l1 > h1){ + return input2[k-1]; + } + if(l2 > h2){ + return input1[k-1]; + } + + if((h1 - l1 + 1) + (h2 - l2 + 1) == k){ + return Math.max(input1[h1], input2[h2]); + } + + if(k == 1){ + return Math.min(input1[l1],input2[l2]); + } + + //handle the situation where only one element is left + //in either of array. + //e.g k =2 and arr1 = 8 arr2 = 1,9,11 + //we try to find if 8 is before 9 betweenn 1 and 9 + //or before 1. In all these cases k will be either + //1 8 or 9 + if(l2 == h2 || l1 == h1){ + if(l2 == h2){ + if(input1[l1+k-1] < input2[l2]){ + return input1[l1+k-1]; + }else if(input1[l1+k-2] > input2[l2]){ + return input1[l1+k-2]; + }else{ + return input2[l2]; + } + } + if(l1 == h1){ + if(input2[l2+k-1] < input1[l1]){ + return input2[l2+k-1]; + }else if(input2[l2+k-2] > input1[l1]){ + return input2[l2+k-2]; + }else{ + return input1[l1]; + } + } + } + + + int m1 = (h1 + l1)/2; + int m2 = (h2 + l2)/2; + + int diff1 = m1 - l1+1; + int diff2 = m2 - l2+1; + if(diff1 + diff2 >= k){ + if(input1[m1] < input2[m2]){ + return kthLargest(input1, input2, l1, h1, l2, m2, k); + }else{ + return kthLargest(input1, input2, l1, m1, l2, h2, k); + } + }else{ + if(input1[m1] < input2[m2]){ + return kthLargest(input1, input2,m1+1, h1, l2, h2, k - diff1); + }else{ + return kthLargest(input1, input2, l1, h1, m2+1, h2, k -diff2); + } + } + } + + public static void main(String args[]){ + KthLargestInTwoSortedArray kis = new KthLargestInTwoSortedArray(); + int input1[] = {1,4,7,11,17,21}; + int input2[] = {-4,-1,3,4,6,28,35,41,56,70}; + for(int i = 0; i < input1.length + input2.length; i++){ + System.out.println(kis.kthLargest(input1, input2, i+1)); + } +// System.out.println(kis.kthLargest(input1, input2, 6)); + + } +} diff --git a/showmecode_100/java/com/interview/array/LargerElementOnRight.java b/showmecode_100/java/com/interview/array/LargerElementOnRight.java new file mode 100644 index 00000000..f74be571 --- /dev/null +++ b/showmecode_100/java/com/interview/array/LargerElementOnRight.java @@ -0,0 +1,52 @@ +package com.interview.array; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * http://www.geeksforgeeks.org/next-greater-element/ + * Find next larger element on right side of a number in array for + * all positions in array + * This is different than finding largest element on right side which can + * be done by keeping max while iterating from right + * It is also different from find next higher number on right side which can + * be found by keeping AVL tree and finding ceiling. + */ +public class LargerElementOnRight { + + public int[] larger(int input[]){ + Deque stack = new LinkedList(); + int result[] = new int[input.length]; + for(int i=0; i < result.length; i++){ + result[i] = -1; + } + + stack.offerFirst(0); + for(int i=1; i < input.length; i++){ + while(stack.size() > 0){ + int t = stack.peekFirst(); + if(input[t] < input[i]){ + result[t] = i; + stack.pollFirst(); + }else{ + break; + } + } + stack.offerFirst(i); + } + return result; + } + + public static void main(String args[]){ + LargerElementOnRight leo = new LargerElementOnRight(); + int input[] = {4,2,-8,6,0,-3,-1,1,9}; + int result[] = leo.larger(input); + for(int i=0; i < result.length; i++){ + if(result[i] != -1){ + System.out.print(input[result[i]] + " "); + }else{ + System.out.print("NIL "); + } + } + } +} diff --git a/showmecode_100/java/com/interview/array/LargestMountain.java b/showmecode_100/java/com/interview/array/LargestMountain.java new file mode 100644 index 00000000..1a95e2b3 --- /dev/null +++ b/showmecode_100/java/com/interview/array/LargestMountain.java @@ -0,0 +1,45 @@ +package com.interview.array; + +/** + * https://leetcode.com/problems/longest-mountain-in-array/description/ + */ +public class LargestMountain { + + public int longestMountain(int[] nums) { + int start = 0; + int max = 0; + State state = State.STARTED; + for (int i = 1; i < nums.length; i++) { + if (nums[i] == nums[i - 1]) { + start = i; + state = State.STARTED; + } + else if (nums[i] > nums[i - 1]) { + if (state == State.DECREASING || state == State.STARTED) { + start = i - 1; + state = State.INCREASING; + } + } else { + if (state == State.INCREASING || state == State.DECREASING) { + state = State.DECREASING; + max = Math.max(max, i - start + 1); + } else { + start = i; + } + } + } + return max; + } + + enum State { + STARTED, + INCREASING, + DECREASING; + } + + public static void main(String[] args) { + LargestMountain lm = new LargestMountain(); + int[] nums = {2, 1, 4, 7, 3, 2, 5}; + System.out.println(lm.longestMountain(nums)); + } +} diff --git a/showmecode_100/java/com/interview/array/LargestSubArrayWithEqual0sAnd1s.java b/showmecode_100/java/com/interview/array/LargestSubArrayWithEqual0sAnd1s.java new file mode 100644 index 00000000..23f509bd --- /dev/null +++ b/showmecode_100/java/com/interview/array/LargestSubArrayWithEqual0sAnd1s.java @@ -0,0 +1,46 @@ +package com.interview.array; + +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.geeksforgeeks.org/largest-subarray-with-equal-number-of-0s-and-1s/ + * Test cases + * Starting with either 0 or 1 + * Maximum length of 0 1 2 or more + * +*/ +public class LargestSubArrayWithEqual0sAnd1s { + + public int equalNumber(int arr[]){ + + int sum[] = new int[arr.length]; + sum[0] = arr[0] == 0? -1 : 1; + for(int i=1; i < sum.length; i++){ + sum[i] = sum[i-1] + (arr[i] == 0? -1 : 1); + } + + Map pos = new HashMap(); + int maxLen = 0; + int i = 0; + for(int s : sum){ + if(s == 0){ + maxLen = Math.max(maxLen, i+1); + } + if(pos.containsKey(s)){ + maxLen = Math.max(maxLen, i-pos.get(s)); + }else{ + pos.put(s, i); + } + i++; + } + return maxLen; + } + + public static void main(String args[]){ + int arr[] = {0,0,0,1,0,1,0,0,1,0,0,0}; + LargestSubArrayWithEqual0sAnd1s mse = new LargestSubArrayWithEqual0sAnd1s(); + System.out.println(mse.equalNumber(arr)); + } + +} diff --git a/showmecode_100/java/com/interview/array/LeetCodeCandy.java b/showmecode_100/java/com/interview/array/LeetCodeCandy.java new file mode 100644 index 00000000..44dd6232 --- /dev/null +++ b/showmecode_100/java/com/interview/array/LeetCodeCandy.java @@ -0,0 +1,43 @@ +package com.interview.array; + +/** + * References + * https://leetcode.com/problems/candy/ + */ +public class LeetCodeCandy { + public int candy(int[] ratings) { + int pointOfChange = 0; + int totalCandies = 1; + int currentCandy = 1; + boolean isIndependent = true; + int maxHeight = 0; + int diff = 0; + for (int i = 1; i < ratings.length; i++) { + diff = 0; + if (ratings[i] > ratings[i-1]) { + currentCandy += 1; + } else if (ratings[i] == ratings[i-1]) { + isIndependent = true; + pointOfChange = i; + currentCandy = 1; + } else { + if (currentCandy == 1) { + if (!isIndependent) { + if (i - pointOfChange == maxHeight - 1) { + pointOfChange--; + } + } + } + else { + maxHeight = currentCandy; + currentCandy = 1; + isIndependent = false; + pointOfChange = i; + } + diff = i - pointOfChange; + } + totalCandies += (diff + currentCandy); + } + return totalCandies; + } +} diff --git a/showmecode_100/java/com/interview/array/LongestConsecutiveSubsequence.java b/showmecode_100/java/com/interview/array/LongestConsecutiveSubsequence.java new file mode 100644 index 00000000..f7ead4fa --- /dev/null +++ b/showmecode_100/java/com/interview/array/LongestConsecutiveSubsequence.java @@ -0,0 +1,43 @@ +package com.interview.array; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 12/03/2016 + * @author Tushar Roy + * + * Find longest consecutive subsequence in unsorted array. + * + * Time complexity O(n) + * Space complexity O(n) + * + * Reference + * https://leetcode.com/problems/longest-consecutive-sequence/ + */ +public class LongestConsecutiveSubsequence { + public int longestConsecutive(int[] nums) { + Map map = new HashMap(); + int result = 1; + for (int i : nums) { + if (map.containsKey(i)) { + continue; + } + int left = map.containsKey(i - 1) ? map.get(i - 1) : 0; + int right = map.containsKey(i + 1) ? map.get(i + 1) : 0; + + int sum = left + right + 1; + map.put(i, sum); + result = Math.max(sum, result); + map.put(i - left, sum); + map.put(i + right, sum); + } + return result; + } + + public static void main(String args[]) { + LongestConsecutiveSubsequence lcs = new LongestConsecutiveSubsequence(); + int[] input = {100, 4, 200, 1, 3, 2}; + System.out.println(lcs.longestConsecutive(input)); + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/array/LongestIncreasingSubSequenceOlogNMethod.java b/showmecode_100/java/com/interview/array/LongestIncreasingSubSequenceOlogNMethod.java new file mode 100644 index 00000000..cf4ace2d --- /dev/null +++ b/showmecode_100/java/com/interview/array/LongestIncreasingSubSequenceOlogNMethod.java @@ -0,0 +1,77 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 08/01/2015 + * @author Tushar Roy + * + * Given an array, find longest increasing subsequence in nlogn time complexity + * + * References + * http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/ + * http://www.geeksforgeeks.org/construction-of-longest-monotonically-increasing-subsequence-n-log-n/ + */ +public class LongestIncreasingSubSequenceOlogNMethod { + + /** + * Returns index in T for ceiling of s + */ + private int ceilIndex(int input[], int T[], int end, int s){ + int start = 0; + int middle; + int len = end; + while(start <= end){ + middle = (start + end)/2; + if(middle < len && input[T[middle]] < s && s <= input[T[middle+1]]){ + return middle+1; + }else if(input[T[middle]] < s){ + start = middle+1; + }else{ + end = middle-1; + } + } + return -1; + } + + public int longestIncreasingSubSequence(int input[]){ + int T[] = new int[input.length]; + int R[] = new int[input.length]; + for(int i=0; i < R.length ; i++) { + R[i] = -1; + } + T[0] = 0; + int len = 0; + for(int i=1; i < input.length; i++){ + if(input[T[0]] > input[i]){ //if input[i] is less than 0th value of T then replace it there. + T[0] = i; + }else if(input[T[len]] < input[i]){ //if input[i] is greater than last value of T then append it in T + len++; + T[len] = i; + R[T[len]] = T[len-1]; + }else{ //do a binary search to find ceiling of input[i] and put it there. + int index = ceilIndex(input, T, len,input[i]); + T[index] = i; + R[T[index]] = T[index-1]; + } + } + + //this prints increasing subsequence in reverse order. + System.out.print("Longest increasing subsequence "); + int index = T[len]; + while(index != -1) { + System.out.print(input[index] + " "); + index = R[index]; + } + + System.out.println(); + return len+1; + } + + public static void main(String args[]){ + //int input[] = {2,5,3,1,2,10,6,7,8}; + int input[] = {3, 4, -1, 5, 8, 2, 3, 12, 7, 9, 10}; + LongestIncreasingSubSequenceOlogNMethod lis = new LongestIncreasingSubSequenceOlogNMethod(); + System.out.println("Maximum length " + lis.longestIncreasingSubSequence(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/LongestSameSumSpan.java b/showmecode_100/java/com/interview/array/LongestSameSumSpan.java new file mode 100644 index 00000000..f7daa55d --- /dev/null +++ b/showmecode_100/java/com/interview/array/LongestSameSumSpan.java @@ -0,0 +1,48 @@ +package com.interview.array; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 12/29/2015 + * @author Tushar Roy + * + * Give two arrays of same size consisting of 0s and 1s find span (i, j) such that + * sum of input1[i..j] = sum of input2[i..j] + * + * Time complexity O(n) + * Space complexity O(n) + * + * http://www.geeksforgeeks.org/longest-span-sum-two-binary-arrays/ + */ +public class LongestSameSumSpan { + + public int longestSpan(int input1[], int input2[]) { + if (input1.length != input2.length) { + throw new IllegalArgumentException("Not same length input"); + } + Map diff = new HashMap<>(); + int prefix1 = 0, prefix2 = 0; + int maxSpan = 0; + diff.put(0, -1); + for (int i = 0; i < input1.length ; i++) { + prefix1 += input1[i]; + prefix2 += input2[i]; + int currDiff = prefix1 - prefix2; + if (diff.containsKey(currDiff)) { + maxSpan = Math.max(maxSpan, i - diff.get(currDiff)); + } else { + diff.put(currDiff, i); + } + } + return maxSpan; + } + + public static void main(String args[]) { + int input1[] = {1, 0, 0, 1, 1, 0}; + int input2[] = {0, 1, 1, 0, 1, 1}; + LongestSameSumSpan lsss = new LongestSameSumSpan(); + System.out.print(lsss.longestSpan(input1, input2)); + } + +} diff --git a/showmecode_100/java/com/interview/array/LongestSubstringWithAtMost2Char.java b/showmecode_100/java/com/interview/array/LongestSubstringWithAtMost2Char.java new file mode 100644 index 00000000..a8109dd5 --- /dev/null +++ b/showmecode_100/java/com/interview/array/LongestSubstringWithAtMost2Char.java @@ -0,0 +1,55 @@ +package com.interview.array; + +/** + * Longest Substring with At Most Two Distinct Characters + * https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/ + */ +public class LongestSubstringWithAtMost2Char { + public int lengthOfLongestSubstringTwoDistinct(String s) { + int count1 = 0; + int count2 = 0; + char c1 = 0; + char c2 = 0; + int start = 0; + int current = 0; + int max = 0; + for (char ch: s.toCharArray()) { + if (ch == c1 || ch == c2) { + if (ch == c1) { + count1++; + } else { + count2++; + } + } else { + if (count1 != 0 && count2 != 0) { + while (start < current) { + if (s.charAt(start) == c1) { + count1--; + } else if (s.charAt(start) == c2) { + count2--; + } + start++; + if (count1 == 0 || count2 == 0) { + break; + } + } + } + if (count1 == 0) { + c1 = ch; + count1 = 1; + } else { + c2 = ch; + count2 = 1; + } + } + max = Math.max(max, current - start + 1); + current++; + } + return max; + } + + public static void main(String args[]) { + LongestSubstringWithAtMost2Char lc = new LongestSubstringWithAtMost2Char(); + System.out.print(lc.lengthOfLongestSubstringTwoDistinct("eceba")); + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/array/MaxNumberFromTwoArray.java b/showmecode_100/java/com/interview/array/MaxNumberFromTwoArray.java new file mode 100644 index 00000000..e75fad4e --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaxNumberFromTwoArray.java @@ -0,0 +1,102 @@ +package com.interview.array; + +import java.util.Arrays; +import java.util.Deque; +import java.util.LinkedList; + +/** + * Date 03/01/2016 + * @author Tushar Roy + * + * Given two arrays of length m and n with digits 0-9 representing two numbers. + * Create the maximum number of length k <= m + n from digits of the two + * + * e.g + * nums1 = [3, 4, 6, 5] + * nums2 = [9, 1, 2, 5, 8, 3] + * k = 5 + * return [9, 8, 6, 5, 3] + * + * https://leetcode.com/problems/create-maximum-number/ + */ +public class MaxNumberFromTwoArray { + public int[] maxNumber(int[] nums1, int[] nums2, int k) { + int[] max = new int[k]; + for (int i = 0; i <= k; i++) { + if (nums1.length < i || nums2.length < k - i) { + continue; + } + int[] a = merge(findLargest1(nums1, i), findLargest1(nums2, k - i)); + if (isGreater(a, max, 0, 0)) { + max = a; + } + } + return max; + } + + private int[] merge(int[] a1, int[] a2) { + int[] result = new int[a1.length + a2.length]; + int i = 0; + int j = 0; + int k = 0; + while (i < a1.length || j < a2.length) { + if (i == a1.length) { + result[k++] = a2[j++]; + } else if (j == a2.length) { + result[k++] = a1[i++]; + } else if (a1[i] > a2[j]) { + result[k++] = a1[i++]; + } else if (a1[i] < a2[j]) { + result[k++] = a2[j++]; + } else { + if (isGreater(a1, a2, i, j)) { + result[k++] = a1[i++]; + } else { + result[k++] = a2[j++]; + } + } + } + return result; + } + + private boolean isGreater(int[] a, int[] b, int i, int j) { + while (i < a.length && j < b.length) { + if (a[i] > b[j]) { + return true; + } else if (a[i] < b[j]) { + return false; + } + i++; + j++; + } + return j == b.length; + } + + private int[] findLargest1(int[] nums, int k) { + if (k == 0) { + return new int[0]; + } + int[] result = new int[k]; + int index = 0; + for (int i = 0; i < nums.length; i++) { + while (index > 0 && index + (nums.length - i - 1) >= k && result[index - 1] < nums[i]) { + index--; + } + if (index < k) { + result[index++] = nums[i]; + } + } + return result; + } + + public static void main(String args[]) { + MaxNumberFromTwoArray max = new MaxNumberFromTwoArray(); + int[] input1 = {9,1,2,5,8,3}; + int[] input2 = {3,4,6,5}; + + int[] input3 = {2,5,6,4,4,0}; + int[] input4 = {7,3,8,0,6,5,7,6,2}; + int[] result = max.maxNumber(input3, input4, 15); + System.out.print(Arrays.toString(result)); + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/array/MaxProductSubarray.java b/showmecode_100/java/com/interview/array/MaxProductSubarray.java new file mode 100644 index 00000000..d8133a06 --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaxProductSubarray.java @@ -0,0 +1,53 @@ +package com.interview.array; + +/** + * Date 04/`7/2016 + * @author Tushar Roy + * + * Find the contiguous subarray within an array (containing at least one number) which has the largest product. + * + * Time complexity is O(n) + * Space complexity is O(1) + * + * http://www.geeksforgeeks.org/maximum-product-subarray/ + * https://leetcode.com/problems/maximum-product-subarray/ + */ +public class MaxProductSubarray { + + public int maxProduct(int[] nums) { + //neg maintains the multiplication which is negative since last 0 + //pos maintains the multiplication which is positive since last 0 + int neg = 1; + int pos = 1; + int maxProduct = nums[0]; + for (int i = 0; i < nums.length; i++) { + if (nums[i] == 0) { + neg = 1; + pos = 1; + maxProduct = Math.max(maxProduct, 0); + } else if (nums[i] < 0) { + int temp = pos; + if (neg < 0) { + pos = neg * nums[i]; + maxProduct = Math.max(pos, maxProduct); + } else { + pos = 1; + } + neg = temp * nums[i]; + } else { + if (neg < 0) { + neg *= nums[i]; + } + pos *= nums[i]; + maxProduct = Math.max(pos, maxProduct); + } + } + return maxProduct; + } + + public static void main(String args[]){ + MaxProductSubarray mps = new MaxProductSubarray(); + int input[] = {-6, -3, 8, -9, -1, -1, 3, 6, 9, 0, 3, -1}; + System.out.println(mps.maxProduct(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/MaxRepeatingNumber.java b/showmecode_100/java/com/interview/array/MaxRepeatingNumber.java new file mode 100644 index 00000000..6711554b --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaxRepeatingNumber.java @@ -0,0 +1,35 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/find-the-maximum-repeating-number-in-ok-time/ + * Given an array of size n, the array contains numbers in range from 0 to k-1 + * where k is a positive integer and k <= n. + * Find the maximum repeating number in this array + */ +public class MaxRepeatingNumber { + + public int maxRepeatingNumber(int arr[], int k){ + int len = k; + for(int i=0; i < arr.length; i++){ + arr[arr[i]%len] += len; + } + int maxRepeating = 0; + int maxRepeatingIndex =0; + for(int i=0; i < len; i++){ + if(maxRepeating < arr[i]){ + maxRepeating = arr[i]; + maxRepeatingIndex = i; + } + } + for(int i=0; i < len; i++){ + arr[i] = arr[i] % len; + } + return maxRepeatingIndex; + } + + public static void main(String args[]){ + MaxRepeatingNumber mrn = new MaxRepeatingNumber(); + int arr[] = {2,2,1,3,1,2,0,3,0,0,0,4,5,4,4,4,4}; + System.out.println(mrn.maxRepeatingNumber(arr, 6)); + } +} diff --git a/showmecode_100/java/com/interview/array/MaximumGap.java b/showmecode_100/java/com/interview/array/MaximumGap.java new file mode 100644 index 00000000..c4913dde --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaximumGap.java @@ -0,0 +1,78 @@ +package com.interview.array; + +/** + * Date 03/12/2016 + * @author Tushar Roy + * + * Given an unsorted array find maximum gap between consecutive element in sorted array. + * + * Time complexity O(n) + * Space complexity O(n) + * + * Reference + * https://leetcode.com/problems/maximum-gap/ + */ +public class MaximumGap { + + class Bucket { + int low ; + int high; + boolean isSet = false; + void update(int val) { + if (!isSet) { + low = val; + high = val; + isSet = true; + } else { + low = Math.min(low, val); + high = Math.max(high, val); + } + } + } + + public int maximumGap(int[] input) { + if (input == null || input.length < 2) { + return 0; + } + int min = Integer.MAX_VALUE; + int max = Integer.MIN_VALUE; + + for (int i = 0; i < input.length; i++) { + min = Math.min(min, input[i]); + max = Math.max(max, input[i]); + } + + int gap = (int) Math.ceil((double) (max - min) / (input.length - 1)); + + Bucket[] buckets = new Bucket[input.length - 1]; + + for (int i = 0; i < buckets.length; i++) { + buckets[i] = new Bucket(); + } + + for (int i = 0; i < input.length; i++) { + if (input[i] == max || input[i] == min) { + continue; + } + buckets[(input[i] - min) / gap].update(input[i]); + } + + int prev = min; + int maxGap = 0; + for (int i = 0; i < buckets.length; i++) { + if (!buckets[i].isSet) { + continue; + } + maxGap = Math.max(maxGap, buckets[i].low - prev); + prev = buckets[i].high; + } + + return Math.max(maxGap, max - prev); + } + + public static void main(String args[]) { + int[] input = {4, 3, 13, 2, 9, 7}; + MaximumGap mg = new MaximumGap(); + System.out.println(mg.maximumGap(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/MaximumIminusJSuchThatAiGTAj.java b/showmecode_100/java/com/interview/array/MaximumIminusJSuchThatAiGTAj.java new file mode 100644 index 00000000..6fc50dde --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaximumIminusJSuchThatAiGTAj.java @@ -0,0 +1,56 @@ +package com.interview.array; + +import java.util.Iterator; +import java.util.LinkedList; + +/** + * http://www.geeksforgeeks.org/given-an-array-arr-find-the-maximum-j-i-such-that-arrj-arri/ + */ +public class MaximumIminusJSuchThatAiGTAj { + + class Node{ + int index; + int size; + } + + public int maximumGeeks(int input[]){ + int lhs[] = new int[input.length]; + int rhs[] = new int[input.length]; + lhs[0] = 0; + for(int i=1; i < lhs.length; i++){ + if(input[lhs[i-1]] < input[i]){ + lhs[i] = lhs[i-1]; + }else{ + lhs[i] = i; + } + } + rhs[input.length-1] = input.length-1; + for(int i=input.length-2; i >= 0; i--){ + if(input[rhs[i+1]] > input[i]){ + rhs[i] = rhs[i+1]; + }else{ + rhs[i] = i; + } + } + + int i=0; + int j=0; + int max = 0; + for(;j < input.length;){ + if(input[lhs[i]] < input[rhs[j]]){ + max = Math.max(max, j-i); + j++; + }else{ + i++; + } + } + return max; + } + + public static void main(String args[]){ + MaximumIminusJSuchThatAiGTAj mj = new MaximumIminusJSuchThatAiGTAj(); + int input[] = {11,14,13,1,4,13,1,10}; + System.out.println(mj.maximumGeeks(input)); + } + +} diff --git a/showmecode_100/java/com/interview/array/MaximumMinimumArrangement.java b/showmecode_100/java/com/interview/array/MaximumMinimumArrangement.java new file mode 100644 index 00000000..df746f3c --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaximumMinimumArrangement.java @@ -0,0 +1,43 @@ +package com.interview.array; + +/** + * Date 04/16/2016 + * @author Tushar Roy + * + * Given a sorted array of positive integers, rearrange the array alternately i.e first element should be maximum value, + * second minimum value, third second max, fourth second min and so on. + * + * Time complexity O(n) + * Space complexity O(1) + * + * http://www.geeksforgeeks.org/rearrange-array-maximum-minimum-form/ + */ +public class MaximumMinimumArrangement { + + public void rearrange(int[] input) { + for (int i = 0; i < input.length; i++) { + int t = input[i]; + if (t < 0) { + continue; + } + int i1 = i; + while (true) { + int j = i1 < input.length/2 ? 2 * i1 + 1 : (input.length - 1 - i1) * 2; + if (j == i1) { + break; + } + if (input[j] < 0) { + break; + } + int t1 = input[j]; + input[j] = -t; + t = t1; + i1 = j; + } + } + + for (int i = 0; i < input.length; i++) { + input[i] = Math.abs(input[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/array/MaximumOfSubarrayOfSizeK.java b/showmecode_100/java/com/interview/array/MaximumOfSubarrayOfSizeK.java new file mode 100644 index 00000000..383c836c --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaximumOfSubarrayOfSizeK.java @@ -0,0 +1,64 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/maximum-of-all-subarrays-of-size-k/ + * Test cases + * input containg neg and pos values + * val of k is neg 0 or pos + * val of k is larger than size of input + * val of k is same as size of input + */ +import java.util.Deque; +import java.util.LinkedList; + +public class MaximumOfSubarrayOfSizeK { + + public int[] maxSubArray(int input[], int k) { + Deque queue = new LinkedList(); + int max[] = new int[input.length - k + 1]; + int maxVal = Integer.MIN_VALUE; + //first find max of first k values and make it 0th element of max array + for (int i = 0; i < k; i++) { + if(maxVal < input[i]){ + maxVal = input[i]; + } + if (queue.isEmpty()) { + queue.offerLast(i); + } else { + while (!queue.isEmpty() && input[queue.peekLast()] <= input[i]) { + queue.pollLast(); + } + queue.offerLast(i); + } + + } + max[0] = maxVal; + int index=1; + //continue from k till end of the input array + for (int i = k; i < input.length; i++) { + //if index of peek is k distance from i then its no value to us. + //throw it away + if (i - k + 1 > queue.peekFirst()) { + queue.pollFirst(); + } + while (!queue.isEmpty() && input[queue.peekLast()] <= input[i]) { + queue.pollLast(); + } + queue.offerLast(i); + //Only reason first element survived was because it was biggest element. + //make it the max value for this k + max[index] = input[queue.peekFirst()]; + index++; + } + return max; + } + + public static void main(String args[]){ + int input[] = {8, 5, 10, 7, 9, 4, 15, 12, 90, 13}; + MaximumOfSubarrayOfSizeK msa = new MaximumOfSubarrayOfSizeK(); + int max[] = msa.maxSubArray(input, 4); + for(int i : max){ + System.out.print(i + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/array/MaximumSumPathTwoArrays.java b/showmecode_100/java/com/interview/array/MaximumSumPathTwoArrays.java new file mode 100644 index 00000000..64108bcd --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaximumSumPathTwoArrays.java @@ -0,0 +1,62 @@ +package com.interview.array; + +/** + * Date 12/31/2015 + * @author Tushar Roy + * + * Given two sorted arrays such the arrays may have some common elements. Find the sum of the maximum sum + * path to reach from beginning of any array to end of any of the two arrays. We can switch from one array + * to another array only at common elements. + * + * Time complexity is O(n + m) + * Space complexity is O(1) + * + * http://www.geeksforgeeks.org/maximum-sum-path-across-two-arrays/ + */ +public class MaximumSumPathTwoArrays { + + public int maxSum(int input1[], int input2[]) { + int maxSum = 0; + int i = 0, j = 0; + int sum1 = 0; + int sum2 = 0; + while (i < input1.length && j < input2.length) { + if (input1[i] == input2[j]) { + if (sum1 > sum2) { + maxSum += sum1 + input1[i]; + } else { + maxSum += sum2 + input2[j]; + } + i++; + j++; + sum1 = 0; + sum2 = 0; + } else if (input1[i] < input2[j]) { + sum1 += input1[i++]; + } else { + sum2 += input2[j++]; + } + } + while(i < input1.length) { + sum1 += input1[i++]; + } + while(j < input2.length) { + sum2 += input2[j++]; + } + + if (sum1 > sum2) { + maxSum += sum1; + } else { + maxSum += sum2; + } + return maxSum; + } + + public static void main(String args[]) { + int input1[] = {2, 3, 7, 10, 12, 15, 30, 34}; + int input2[] = {1, 5, 7, 8, 10, 15, 16, 19}; + + MaximumSumPathTwoArrays msp = new MaximumSumPathTwoArrays(); + System.out.println(msp.maxSum(input1, input2)); + } +} diff --git a/showmecode_100/java/com/interview/array/MaximumSumThreeNonOverlappingSubarray.java b/showmecode_100/java/com/interview/array/MaximumSumThreeNonOverlappingSubarray.java new file mode 100644 index 00000000..efb9ff07 --- /dev/null +++ b/showmecode_100/java/com/interview/array/MaximumSumThreeNonOverlappingSubarray.java @@ -0,0 +1,69 @@ +package com.interview.array; + +import java.util.Arrays; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +/** + *https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/description/ + */ +public class MaximumSumThreeNonOverlappingSubarray { + + public int[] maxSumOfThreeSubarrays(int[] nums, int k) { + int sum = 0; + int[] sumArray = new int[nums.length - k + 1]; + for (int i = 0; i < nums.length; i++) { + if (i < k) { + sum += nums[i]; + } else { + sumArray[i - k] = sum; + sum += nums[i]; + sum -= nums[i - k]; + } + } + sumArray[sumArray.length - 1] = sum; + + int[][] dp = new int[4][sumArray.length + 1]; + + for (int i = 1; i <= 3; i++) { + for (int j = 1; j <= sumArray.length; j++) { + if (j >= k) { + if (dp[i][j - 1] >= sumArray[j - 1] + dp[i - 1][j - k]) { + dp[i][j] = dp[i][j - 1]; + } else { + dp[i][j] = sumArray[j - 1] + dp[i - 1][j - k]; + } + } else { + if (dp[i][j - 1] >= sumArray[j - 1]) { + dp[i][j] = dp[i][j - 1]; + } else { + dp[i][j] = sumArray[j - 1]; + } + } + } + } + int[] output = new int[3]; + int j = dp[0].length - 1; + for (int i = 3; i > 0;) { + if (dp[i][j] == dp[i][j - 1]) { + j--; + } else { + output[i - 1] = j - 1; + i--; + j = j - k; + } + } + return output; + } + + public static void main(String[] args) { + MaximumSumThreeNonOverlappingSubarray mss = new MaximumSumThreeNonOverlappingSubarray(); + int[] input = {3, 2, 2, 1, 1, 0, 5}; + int[] input1 = {1, 2, 1, 2, 6, 7, 5, 1}; + int[] output = mss.maxSumOfThreeSubarrays(input1, 2); + for (int i : output) { + System.out.println(i); + } + } +} diff --git a/showmecode_100/java/com/interview/array/MeetingRooms.java b/showmecode_100/java/com/interview/array/MeetingRooms.java new file mode 100644 index 00000000..11b0cf8e --- /dev/null +++ b/showmecode_100/java/com/interview/array/MeetingRooms.java @@ -0,0 +1,71 @@ +package com.interview.array; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * Date 05/01/2016 + * @author Tushar Roy + * + * Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), + * find the minimum number of conference rooms required. + * + * Both methods have time comlexity of nlogn + * Method 1 has space complexity of O(1) + * + * https://leetcode.com/problems/meeting-rooms-ii/ + */ +public class MeetingRooms { + + public static class Interval { + int start; + int end; + Interval() { start = 0; end = 0; } + Interval(int s, int e) { start = s; end = e; } + } + + public int minMeetingRooms1(Interval[] intervals) { + int[] start = new int[intervals.length]; + int[] end = new int[intervals.length]; + + for (int i = 0; i < intervals.length; i++) { + start[i] = intervals[i].start; + end[i] = intervals[i].end; + } + + Arrays.sort(start); + Arrays.sort(end); + + int j = 0; + int rooms = 0; + for (int i = 0; i < start.length; i++) { + if (start[i] < end[j]) { + rooms++; + } else { + j++; + } + } + return rooms; + } + + public int minMeetingRooms(Interval[] intervals) { + if (intervals.length == 0) { + return 0; + } + Arrays.sort(intervals, (a, b) -> a.start - b.start); + PriorityQueue pq = new PriorityQueue<>((a, b) -> a.end - b.end); + pq.offer(intervals[0]); + int rooms = 1; + for (int i = 1; i < intervals.length; i++) { + Interval it = pq.poll(); + if (it.end <= intervals[i].start) { + it = new Interval(it.start, intervals[i].end); + } else { + rooms++; + pq.offer(intervals[i]); + } + pq.offer(it); + } + return rooms; + } +} diff --git a/showmecode_100/java/com/interview/array/MinimumDistanceBetweenTwoNumbers.java b/showmecode_100/java/com/interview/array/MinimumDistanceBetweenTwoNumbers.java new file mode 100644 index 00000000..46ae1e6f --- /dev/null +++ b/showmecode_100/java/com/interview/array/MinimumDistanceBetweenTwoNumbers.java @@ -0,0 +1,45 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/find-the-minimum-distance-between-two-numbers/ + */ +public class MinimumDistanceBetweenTwoNumbers { + + public int minDistance(int input[],int x, int y){ + int prev = -1; + int prevFound = -1; + int min = 10000; + for(int i=0; i < input.length; i++){ + if(input[i] == x){ + if(prevFound == -1){ + prevFound = x; + prev = i; + }else if(prevFound == x){ + prev = i; + }else{ + min = min > i - prev ? i -prev : min; + prev = i; + prevFound = x; + } + }else if(input[i] == y){ + if(prevFound == -1){ + prevFound = y; + prev = i; + }else if(prevFound == y){ + prev =i; + }else{ + min = min > i - prev ? i -prev : min; + prevFound = y; + prev = i; + } + } + } + return min; + } + + public static void main(String args[]){ + MinimumDistanceBetweenTwoNumbers mdb = new MinimumDistanceBetweenTwoNumbers(); + int input[] = {6,4,1,5,6,9,10,4,6,6}; + System.out.println(mdb.minDistance(input, 5, 6)); + } +} diff --git a/showmecode_100/java/com/interview/array/MinimumNumberFromSequence.java b/showmecode_100/java/com/interview/array/MinimumNumberFromSequence.java new file mode 100644 index 00000000..c3fc95e8 --- /dev/null +++ b/showmecode_100/java/com/interview/array/MinimumNumberFromSequence.java @@ -0,0 +1,51 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 02/26/2016 + * @author Tushar Roy + * + * Time complexity : O(n^2) + * Space complexity : O(n) + * + * Reference + * http://www.geeksforgeeks.org/form-minimum-number-from-given-sequence/ + */ +public class MinimumNumberFromSequence { + + public int[] find(char[] input) { + int[] output = new int[input.length + 1]; + output[0] = 1; + int low = 0; + int start = 0; + for (int i = 0; i < input.length; i++) { + if (input[i] == 'D') { + output[i + 1] = output[i] - 1; + if (output[i+1] == low) { + for (int j = start; j <= i + 1; j++) { + output[j] = output[j] + 1; + } + } + } else { + low = output[start]; + output[i + 1] = low + 1; + start = i + 1; + } + } + return output; + } + + public static void main(String args[]) { + MinimumNumberFromSequence ms = new MinimumNumberFromSequence(); + int output[] = ms.find("DDIDDIID".toCharArray()); + System.out.println(Arrays.toString(output)); + + output = ms.find("IIDDD".toCharArray()); + System.out.println(Arrays.toString(output)); + + output = ms.find("DIDI".toCharArray()); + System.out.println(Arrays.toString(output)); + + } +} diff --git a/showmecode_100/java/com/interview/array/MinimumSortedWhichSortsEntireArray.java b/showmecode_100/java/com/interview/array/MinimumSortedWhichSortsEntireArray.java new file mode 100644 index 00000000..05f6c51e --- /dev/null +++ b/showmecode_100/java/com/interview/array/MinimumSortedWhichSortsEntireArray.java @@ -0,0 +1,57 @@ +package com.interview.array; + +/** + *http://www.geeksforgeeks.org/minimum-length-unsorted-subarray-sorting-which-makes-the-complete-array-sorted/ + */ +public class MinimumSortedWhichSortsEntireArray { + + public int minLength(int arr[]){ + int i=0; + while(i < arr.length -1 && arr[i] < arr[i+1]){ + i++; + } + if(i == arr.length-1){ + return 0; + } + int j = arr.length-1; + while(j > 0 && arr[j] > arr[j-1]){ + j--; + } + + int max = Integer.MIN_VALUE; + int min = Integer.MAX_VALUE; + for(int k = i; k <= j; k++){ + if(max < arr[k]){ + max = arr[k]; + } + if(min > arr[k]){ + min = arr[k]; + } + } + int x = i-1; + while(x >=0){ + if(min > arr[x]){ + break; + } + x--; + } + + int y = j +1; + while(y < arr.length){ + if(max < arr[y]){ + break; + } + y++; + } + return y -x -2 + 1; + } + + public static void main(String args[]){ + int arr[] = {4,5,10,21,18,23,7,8,19,34,38}; + int arr1[] = {4,5,6,12,11,15}; + int arr2[] = {4,5,6,10,11,15}; + MinimumSortedWhichSortsEntireArray msw = new MinimumSortedWhichSortsEntireArray(); + System.out.println(msw.minLength(arr1)); + } + +} diff --git a/showmecode_100/java/com/interview/array/MissingRanges.java b/showmecode_100/java/com/interview/array/MissingRanges.java new file mode 100644 index 00000000..87c09f2f --- /dev/null +++ b/showmecode_100/java/com/interview/array/MissingRanges.java @@ -0,0 +1,45 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], return its missing ranges. + * For example, given [0, 1, 3, 50, 75], lower = 0 and upper = 99, return ["2", "4->49", "51->74", "76->99"]. + * + * Time complexity O(n) + * + * https://leetcode.com/problems/missing-ranges/ + */ +public class MissingRanges { + public List findMissingRanges(int[] nums, int lower, int upper) { + if (nums.length == 0) { + return Collections.singletonList(makeRange(lower, upper)); + } + List result = new ArrayList<>(); + if (lower < nums[0]) { + result.add(makeRange(lower, nums[0] - 1)); + } + for (int i = 0; i < nums.length - 1; i++) { + if (nums[i] == nums[i + 1]) { + continue; + } + if ((nums[i] + 1) != nums[i + 1]) { + result.add(makeRange(nums[i] + 1, nums[i + 1] - 1)); + } + } + if (nums[nums.length - 1] < upper) { + result.add(makeRange(nums[nums.length - 1] + 1, upper)); + } + return result; + } + + private String makeRange(int a, int b) { + if (a == b) { + return String.valueOf(a); + } else { + return a + "->" + b; + } + } +} diff --git a/showmecode_100/java/com/interview/array/MoveAllZerosToEnd.java b/showmecode_100/java/com/interview/array/MoveAllZerosToEnd.java new file mode 100644 index 00000000..4a7616f9 --- /dev/null +++ b/showmecode_100/java/com/interview/array/MoveAllZerosToEnd.java @@ -0,0 +1,30 @@ +package com.interview.array; + +public class MoveAllZerosToEnd { + + public void moveZeros(int arr[]){ + int slow =0; + int fast =0; + while(fast < arr.length){ + if(arr[fast] == 0){ + fast++; + continue; + } + arr[slow] = arr[fast]; + slow++; + fast++; + } + while(slow < arr.length){ + arr[slow++] = 0; + } + } + + public static void main(String args[]){ + MoveAllZerosToEnd maz = new MoveAllZerosToEnd(); + int arr[] = {0,0,1,2,0,5,6,7,0}; + maz.moveZeros(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/array/MultiplyAllFieldsExceptOwnPosition.java b/showmecode_100/java/com/interview/array/MultiplyAllFieldsExceptOwnPosition.java new file mode 100644 index 00000000..73a1813c --- /dev/null +++ b/showmecode_100/java/com/interview/array/MultiplyAllFieldsExceptOwnPosition.java @@ -0,0 +1,25 @@ +package com.interview.array; + +/** + * https://leetcode.com/problems/product-of-array-except-self/ + */ +public class MultiplyAllFieldsExceptOwnPosition { + + public int[] multiply(int nums[]) { + if (nums.length == 0) { + return new int[0]; + } + int[] output = new int[nums.length]; + output[0] = 1; + for (int i = 1; i < nums.length; i++) { + output[i] = output[i - 1] * nums[i - 1]; + } + + int mult = 1; + for (int i = nums.length - 1; i >= 0; i--) { + output[i] *= mult; + mult *= nums[i]; + } + return output; + } +} diff --git a/showmecode_100/java/com/interview/array/NthElementOfCountNumberSequence.java b/showmecode_100/java/com/interview/array/NthElementOfCountNumberSequence.java new file mode 100644 index 00000000..bcdc88c2 --- /dev/null +++ b/showmecode_100/java/com/interview/array/NthElementOfCountNumberSequence.java @@ -0,0 +1,51 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 07/20/2015 + * @author Tushar Roy + * + * Given a sequence like + * 1 11 21 1211 111221 312211 + * Print nth element of this sequence. + */ +public class NthElementOfCountNumberSequence { + + public List nthElement(int n) { + int i = 1; + List current = new ArrayList<>(); + current.add(1); + List result = new ArrayList<>(); + while(i < n) { + int count = 1; + int index = 0; + for(int j = 1; j < current.size(); j++) { + if(current.get(index) == current.get(j)) { + count++; + } else { + result.add(count); + result.add(current.get(index)); + count = 1; + index = j; + } + } + result.add(count); + result.add(current.get(index)); + current = result; + result = new ArrayList<>(); + i++; + } + return current; + } + + public static void main(String args[]) { + NthElementOfCountNumberSequence nes = new NthElementOfCountNumberSequence(); + for(int i = 1 ; i <= 10; i++) { + List result = nes.nthElement(i); + result.forEach(System.out::print); + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/array/NumberOfTrianglesInUnsortedArray.java b/showmecode_100/java/com/interview/array/NumberOfTrianglesInUnsortedArray.java new file mode 100644 index 00000000..a51d1531 --- /dev/null +++ b/showmecode_100/java/com/interview/array/NumberOfTrianglesInUnsortedArray.java @@ -0,0 +1,32 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * http://www.geeksforgeeks.org/find-number-of-triangles-possible/ + */ +public class NumberOfTrianglesInUnsortedArray { + + public int numberOfTriangles(int input[]){ + Arrays.sort(input); + + int count = 0; + for(int i=0; i < input.length-2; i++){ + int k = i+2; + for(int j=i+1; j < input.length; j++){ + while(k < input.length && input[i] + input[j] > input[k]){ + k++; + } + count += k - j -1; + } + } + return count; + + } + + public static void main(String args[]){ + int input[] = {3, 4, 5, 6, 8, 9, 15}; + NumberOfTrianglesInUnsortedArray not = new NumberOfTrianglesInUnsortedArray(); + System.out.println(not.numberOfTriangles(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/PositiveAndNegativeNumberAlternatively.java b/showmecode_100/java/com/interview/array/PositiveAndNegativeNumberAlternatively.java new file mode 100644 index 00000000..3a808569 --- /dev/null +++ b/showmecode_100/java/com/interview/array/PositiveAndNegativeNumberAlternatively.java @@ -0,0 +1,48 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/rearrange-positive-and-negative-numbers-publish/ + */ +public class PositiveAndNegativeNumberAlternatively { + + public void arrange(int arr[]){ + int startOfPos = segregate(arr); + + int startOfNeg = 1; + while(startOfNeg < startOfPos && startOfPos < arr.length){ + swap(arr,startOfNeg,startOfPos); + startOfNeg+=2; + startOfPos++; + } + } + + private int segregate(int arr[]){ + int low =0; + int high = arr.length-1; + while(low < high){ + if(arr[low] < 0){ + low++; + }else if(arr[high] >= 0){ + high--; + }else{ + swap(arr,low,high); + } + } + return low; + } + + private void swap(int arr[],int i,int j){ + int t = arr[i]; + arr[i] = arr[j]; + arr[j] = t; + } + + public static void main(String args[]){ + int arr[] = {-1,-2,-3,-4,-5,1,2,3,4,5}; + PositiveAndNegativeNumberAlternatively pan = new PositiveAndNegativeNumberAlternatively(); + pan.arrange(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i]+ " "); + } + } +} diff --git a/showmecode_100/java/com/interview/array/PositiveAndNegativeNumberAlternativelyMaintainingOrder.java b/showmecode_100/java/com/interview/array/PositiveAndNegativeNumberAlternativelyMaintainingOrder.java new file mode 100644 index 00000000..ccf8d3b5 --- /dev/null +++ b/showmecode_100/java/com/interview/array/PositiveAndNegativeNumberAlternativelyMaintainingOrder.java @@ -0,0 +1,63 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 12/31/2015 + * @author Tushar Roy + * + * Given an array of positive and negative integers arrange them alternatively maintaining initial order. + * If there are more +ve or -ve integer then push them to the end together. + * + * Time complexity is O(n) + * Space complexity is O(1) + * + * http://www.geeksforgeeks.org/rearrange-array-alternating-positive-negative-items-o1-extra-space/ + */ +public class PositiveAndNegativeNumberAlternativelyMaintainingOrder { + + public void rearrange(int input[]) { + + for (int i = 0; i < input.length; i++) { + if (i % 2 == 0 && input[i] >= 0) { + int indexOfNextNegative = findNext(input, i + 1, false); + if (indexOfNextNegative == -1) { + return; + } else { + rightRotate(input, i, indexOfNextNegative); + } + } else if (i % 2 != 0 && input[i] < 0) { + int indexOfNextPositive = findNext(input, i + 1, true); + if (indexOfNextPositive == -1) { + return; + } else { + rightRotate(input, i, indexOfNextPositive); + } + } + } + } + + private int findNext(int input[], int start, boolean isPositive) { + for (int i = start; i < input.length; i++) { + if ((isPositive && input[i] >= 0) || (!isPositive && input[i] < 0)) { + return i; + } + } + return -1; + } + + private void rightRotate(int input[], int start, int end) { + int t = input[end]; + for (int i = end; i > start; i--) { + input[i] = input[i - 1]; + } + input[start] = t; + } + + public static void main(String args[]) { + int input[] = {-5, -2, 5, 2, 4, 7, 1, 8, 0, -8}; + PositiveAndNegativeNumberAlternativelyMaintainingOrder pss = new PositiveAndNegativeNumberAlternativelyMaintainingOrder(); + pss.rearrange(input); + Arrays.stream(input).forEach(i -> System.out.print(i + " ")); + } +} diff --git a/showmecode_100/java/com/interview/array/RearrangeArrayPerIndex.java b/showmecode_100/java/com/interview/array/RearrangeArrayPerIndex.java new file mode 100644 index 00000000..be19a140 --- /dev/null +++ b/showmecode_100/java/com/interview/array/RearrangeArrayPerIndex.java @@ -0,0 +1,53 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 12/30/2015 + * + * Given an array of size n where elements are in range 0 to n-1. Rearrange elements of array + * such that if arr[i] = j then arr[j] becomes i. + * + * Time complexity O(n) + * Space complexity O(1) + * + * http://www.geeksforgeeks.org/rearrange-array-arrj-becomes-arri-j/ + */ +public class RearrangeArrayPerIndex { + + public void rearrange(int input[]) { + + for (int i = 0; i < input.length; i++) { + input[i]++; + } + + for (int i = 0; i < input.length; i++) { + if (input[i] > 0) { + rearrangeUtil(input, i); + } + } + + for (int i = 0; i < input.length; i++) { + input[i] = -input[i] - 1; + } + } + + private void rearrangeUtil(int input[], int start) { + int i = start + 1; + int v = input[start]; + while (v > 0) { + int t = input[v - 1]; + input[v - 1] = -i; + i = v; + v = t; + } + } + + public static void main(String args[]) { + RearrangeArrayPerIndex rai = new RearrangeArrayPerIndex(); + int input[] = {1, 2, 0, 5, 3, 4}; + rai.rearrange(input); + Arrays.stream(input).forEach(i -> System.out.print(i + " ")); + } + +} diff --git a/showmecode_100/java/com/interview/array/RearrangeSuchThatArriBecomesArrArri.java b/showmecode_100/java/com/interview/array/RearrangeSuchThatArriBecomesArrArri.java new file mode 100644 index 00000000..ceacc8fb --- /dev/null +++ b/showmecode_100/java/com/interview/array/RearrangeSuchThatArriBecomesArrArri.java @@ -0,0 +1,33 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/rearrange-given-array-place/ + */ +public class RearrangeSuchThatArriBecomesArrArri { + + public void rearrange(int arr[]){ + for(int i=0; i < arr.length; i++){ + int temp; + if(arr[arr[i]] > arr.length-1){ + temp = arr[arr[i]]/arr.length-1; + }else{ + temp = arr[arr[i]]; + } + arr[i] = temp + arr.length*(arr[i]+1); + } + + for(int i=0; i < arr.length;i++){ + arr[i] = arr[i] % arr.length; + } + } + + public static void main(String args[]){ + int arr[] = {4,2,0,1,3}; + RearrangeSuchThatArriBecomesArrArri rss = new RearrangeSuchThatArriBecomesArrArri(); + rss.rearrange(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i]); + } + } +} + diff --git a/showmecode_100/java/com/interview/array/ReorderArrayByIndex.java b/showmecode_100/java/com/interview/array/ReorderArrayByIndex.java new file mode 100644 index 00000000..04761b15 --- /dev/null +++ b/showmecode_100/java/com/interview/array/ReorderArrayByIndex.java @@ -0,0 +1,45 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 12/29/2015 + * @author Tushar Roy + * + * Given two arrays one with values and other with index where values should be positioned. Move values to correct + * position + * + * Time complexity - O(n) + * Space complexity - O(1) + * + * http://www.geeksforgeeks.org/reorder-a-array-according-to-given-indexes/ + */ +public class ReorderArrayByIndex { + public void reorder(int input[], int index[]) { + if(index.length != input.length) { + throw new IllegalArgumentException(); + } + for (int i = 0 ; i < index.length; i++) { + while (index[i] != i) { + int sIndex = index[index[i]]; + int sVal = input[index[i]]; + + index[index[i]] = index[i]; + input[index[i]] = input[i]; + + index[i] = sIndex; + input[i] = sVal; + } + } + } + + public static void main(String args[]) { + int input[] = {50, 40, 70, 60, 90}; + int index[] = {3, 0, 4, 1, 2}; + ReorderArrayByIndex reorderArrayByIndex = new ReorderArrayByIndex(); + reorderArrayByIndex.reorder(input, index); + Arrays.stream(input).forEach(i -> System.out.print(i + " ")); + System.out.println(); + Arrays.stream(index).forEach(i -> System.out.print(i + " ")); + } +} diff --git a/showmecode_100/java/com/interview/array/RepeatingAndMissingNumber.java b/showmecode_100/java/com/interview/array/RepeatingAndMissingNumber.java new file mode 100644 index 00000000..41dd79aa --- /dev/null +++ b/showmecode_100/java/com/interview/array/RepeatingAndMissingNumber.java @@ -0,0 +1,41 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/find-a-repeating-and-a-missing-number/ + */ +public class RepeatingAndMissingNumber { + + class Pair{ + int repeating; + int missing; + public String toString(){ + return repeating + " " + missing; + } + } + + public Pair findNumbers(int input[]){ + Pair p = new Pair(); + for(int i=0; i < input.length; i++){ + if(input[Math.abs(input[i])-1] < 0){ + p.repeating = Math.abs(input[i]); + }else{ + input[Math.abs(input[i])-1] = -input[Math.abs(input[i])-1]; + } + } + + for(int i=0; i < input.length; i++){ + if(input[i] < 0){ + input[i] = -input[i]; + }else{ + p.missing = i + 1; + } + } + return p; + } + + public static void main(String args[]){ + RepeatingAndMissingNumber rmn = new RepeatingAndMissingNumber(); + int input[] = {3,1,2,4,6,8,2,7}; + System.out.println(rmn.findNumbers(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/RotationWithMaxSum.java b/showmecode_100/java/com/interview/array/RotationWithMaxSum.java new file mode 100644 index 00000000..5ef9343a --- /dev/null +++ b/showmecode_100/java/com/interview/array/RotationWithMaxSum.java @@ -0,0 +1,37 @@ +package com.interview.array; + +/** + * Date 12/30/2015 + * @author Tushar Roy + * + * Given an input array find which rotation will give max sum of i * arr[i] + * + * Time complexity - O(n) + * Space complexity - O(1) + * + * http://www.geeksforgeeks.org/find-maximum-value-of-sum-iarri-with-only-rotations-on-given-array-allowed/ + */ +public class RotationWithMaxSum { + int maxSum(int input[]) { + int arrSum = 0; + int rotationSum = 0; + for (int i =0; i < input.length; i++) { + arrSum += input[i]; + rotationSum += i*input[i]; + } + + int maxRotationSum = rotationSum; + + for (int i = 1; i < input.length; i++) { + rotationSum += input.length*input[i - 1] - arrSum; + maxRotationSum = Math.max(maxRotationSum, rotationSum); + } + return maxRotationSum; + } + + public static void main(String args[]) { + int input[] = {10, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + RotationWithMaxSum rms = new RotationWithMaxSum(); + System.out.print(rms.maxSum(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/SelfCrossing.java b/showmecode_100/java/com/interview/array/SelfCrossing.java new file mode 100644 index 00000000..c6dd3d98 --- /dev/null +++ b/showmecode_100/java/com/interview/array/SelfCrossing.java @@ -0,0 +1,45 @@ +package com.interview.array; + +/** + * Created by tushar_v_roy on 3/10/16. + */ +public class SelfCrossing { + + public boolean isSelfCrossing(int[] x) { + if (x.length < 4) { + return false; + } + int v1 = -x[0]; + int v2 = -x[1]; + + int i = 2; + while (i < x.length) { + if (i % 2 == 0) { + if (i % 4 == 0) { + v1 -= x[i]; + } else { + v1 += x[i]; + } + } else { + if ((i + 1) % 4 == 0) { + v2 += x[i]; + } else { + v2 -= x[i]; + } + } + if (i % 2 != 0) { + if ((v1 >= 0 && v2 <= 0) || (v1 <= 0 && v2 >= 0)) { + return true; + } + } + i++; + } + return false; + } + + public static void main(String args[]) { + SelfCrossing sc = new SelfCrossing(); + int input[] = {3, 3, 4, 2, 2}; + System.out.print(sc.isSelfCrossing(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/ShortestPalindrome.java b/showmecode_100/java/com/interview/array/ShortestPalindrome.java new file mode 100644 index 00000000..3df18acc --- /dev/null +++ b/showmecode_100/java/com/interview/array/ShortestPalindrome.java @@ -0,0 +1,81 @@ +package com.interview.array; + +/** + * Date 03/04/2016 + * @author Tushar Roy + * + * How to append minimum numbers of characters in front of string to make it a palindrome. + * + * Idea is to create a new string which is original ttring + $ + reverse of original string + * Get value of suffix which is also prefix using KMP. + * This part of string is good. Rest needs to be copied in the front. + * + * Time complexity is O(n) + * Space complexity is O(n) + * + * https://leetcode.com/problems/shortest-palindrome/ + */ +public class ShortestPalindrome { + public String shortestPalindrome(String s) { + char[] input = createInput(s); + int val = kmp(input); + + StringBuffer sb = new StringBuffer(); + int remaining = s.length() - val; + int i = s.length() - 1; + while (remaining > 0) { + sb.append(s.charAt(i)); + i--; + remaining--; + } + sb.append(s); + return sb.toString(); + + } + + private int kmp(char[] input) { + int T[] = new int[input.length]; + + int j = 1; + int i = 0; + + T[0] = 0; + + while (j < input.length) { + if (input[i] == input[j]) { + T[j] = i + 1; + i++; + } else { + while (i != 0) { + i = T[i-1]; + if (input[j] == input[i]) { + T[j] = i + 1; + i++; + break; + } + } + } + j++; + } + return T[input.length - 1]; + } + + private char[] createInput(String s) { + char[] input = new char[2*s.length() + 1]; + int index = 0; + for (char ch: s.toCharArray()) { + input[index++] = ch; + } + input[index++] = '$'; + + for (int i = s.length() - 1; i >= 0; i--) { + input[index++] = s.charAt(i); + } + return input; + } + + public static void main(String args[]) { + ShortestPalindrome sp = new ShortestPalindrome(); + System.out.print(sp.shortestPalindrome("aacecaaa")); + } + } diff --git a/showmecode_100/java/com/interview/array/SmallestIntegerNotRepresentedBySubsetSum.java b/showmecode_100/java/com/interview/array/SmallestIntegerNotRepresentedBySubsetSum.java new file mode 100644 index 00000000..15cc9daa --- /dev/null +++ b/showmecode_100/java/com/interview/array/SmallestIntegerNotRepresentedBySubsetSum.java @@ -0,0 +1,56 @@ +package com.interview.array; + +/** + * Date 12/31/2015 + * @author Tushar Roy + * + * Given array in non decreasing order find smallest integer which cannot be represented by + * subset sum of these integers. + * + * Time complexity is O(n) + * + * http://www.geeksforgeeks.org/find-smallest-value-represented-sum-subset-given-array/ + */ +public class SmallestIntegerNotRepresentedBySubsetSum { + + public int findSmallestInteger(int input[]) { + int result = 1; + for (int i = 0; i < input.length; i++) { + if (input[i] <= result) { + result += input[i]; + } else { + break; + } + } + return result; + } + + /** + * Leetcode variation https://leetcode.com/problems/patching-array/ + */ + public int minPatches(int[] nums, int n) { + int patch = 0; + long t = 1; + int i = 0; + while(t <= n) { + if (i == nums.length || t < nums[i]) { + patch++; + t += t; + } else { + t = nums[i] + t; + i++; + } + } + return patch; + } + + + public static void main(String args[]) { + int input[] = {1, 2, 3, 8}; + SmallestIntegerNotRepresentedBySubsetSum ss = new SmallestIntegerNotRepresentedBySubsetSum(); + System.out.println(ss.findSmallestInteger(input)); + + int input1[] = {}; + System.out.println(ss.minPatches(input1, 7)); + } +} diff --git a/showmecode_100/java/com/interview/array/SmallestSubarrayWithAtleastKSum.java b/showmecode_100/java/com/interview/array/SmallestSubarrayWithAtleastKSum.java new file mode 100644 index 00000000..f43439ef --- /dev/null +++ b/showmecode_100/java/com/interview/array/SmallestSubarrayWithAtleastKSum.java @@ -0,0 +1,52 @@ +package com.interview.array; + +/** + * https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/description/ + */ +public class SmallestSubarrayWithAtleastKSum { + + public int shortestSubarray(int[] A, int K) { + int[] skip = new int[A.length]; + + int sum = 0; + int start = A.length - 1; + skip[A.length - 1] = 1; + for (int i = A.length - 1; i > 0; i--) { + skip[i - 1] = 1; + sum += A[i]; + if (sum <= 0) { + skip[i - 1] = start - i + 1; + } else { + start = i; + sum = 0; + } + } + + start = 0; + int end = 0; + sum = 0; + int min = Integer.MAX_VALUE; + while (end < A.length) { + sum += A[end++]; + while (start <= end && sum >= K) { + min = Math.min(end - start, min); + for (int j = start; j < start + skip[start]; j++) { + sum -= A[j]; + } + start = start + skip[start]; + } + if (sum <= 0) { + start = end; + sum = 0; + } + } + + return min == Integer.MAX_VALUE ? -1 : min; + } + + public static void main(String[] args) { + int[] input = {1, 3, -1, -4, -2, 3, 4, -5, -1, 8}; + SmallestSubarrayWithAtleastKSum ss = new SmallestSubarrayWithAtleastKSum(); + ss.shortestSubarray(input, 8); + } +} diff --git a/showmecode_100/java/com/interview/array/SortedArrayTransformation.java b/showmecode_100/java/com/interview/array/SortedArrayTransformation.java new file mode 100644 index 00000000..57e99d0b --- /dev/null +++ b/showmecode_100/java/com/interview/array/SortedArrayTransformation.java @@ -0,0 +1,39 @@ +package com.interview.array; + +/** + * Date 10/08/2016 + * @author Tushar Roy + * + * Given a sorted array of integers nums and integer values a, b and c. + * Apply a function of the form f(x) = ax2 + bx + c to each element x in the array. + * + * Time complexity O(n) + * + * https://leetcode.com/problems/sort-transformed-array/ + */ +public class SortedArrayTransformation { + public int[] sortTransformedArray(int[] nums, int a, int b, int c) { + int start = 0; + int end = nums.length - 1; + int[] result = new int[nums.length]; + int index = (a >= 0 ? nums.length - 1 : 0); + while (start <= end) { + int x = apply(nums[start], a, b, c); + int y = apply(nums[end], a, b, c); + boolean condition = (a >= 0 ? x >= y : x <= y); + if (condition) { + result[index] = x; + start++; + } else { + result[index] = y; + end--; + } + index = index + (a >= 0 ? -1 : 1); + } + return result; + } + + private int apply(int x, int a, int b, int c) { + return a*x*x + b * x + c; + } +} diff --git a/showmecode_100/java/com/interview/array/StableMarriageProblem.java b/showmecode_100/java/com/interview/array/StableMarriageProblem.java new file mode 100644 index 00000000..17dbc333 --- /dev/null +++ b/showmecode_100/java/com/interview/array/StableMarriageProblem.java @@ -0,0 +1,74 @@ +package com.interview.array; + +public class StableMarriageProblem { + + private boolean checkIfNewIsBetter(int priority[][], int bride, + int currentGroom, int suitor) { + for (int groom : priority[bride]) { + if (currentGroom == groom) { + return false; + } + if (suitor == groom) { + return true; + } + } + return false; + } + + public int[] findPair(int[][] priority) { + int pair = priority[0].length; + int groomToBride[] = new int[pair]; + int brideToGroom[] = new int[pair]; + for(int i=0; i < groomToBride.length; i++){ + groomToBride[i] = -1; + } + for(int i=0; i < brideToGroom.length; i++){ + brideToGroom[i] = -1; + } + int groom ; + int remaingGrooms = pair; + while (remaingGrooms > 0) { + groom = -1; + for (int hasBride : groomToBride) { + if (hasBride != -1) { + continue; + } + groom++; + for (int bride : priority[groom]) { + if (brideToGroom[bride-pair] == -1) { + groomToBride[groom] = bride; + brideToGroom[bride-pair] = groom; + remaingGrooms--; + break; + } else { + boolean flag = checkIfNewIsBetter(priority, bride, + brideToGroom[bride-pair], groom); + if (flag) { + int currentGroom = brideToGroom[bride-pair]; + brideToGroom[bride-pair] = groom; + groomToBride[groom] = bride; + groomToBride[currentGroom] = -1; + } + } + } + } + } + return groomToBride; + } + + public static void main(String args[]){ + int priority[][] = {{5,4,7,6}, + {4,5,6,7}, + {5,4,6,7}, + {5,4,7,6}, + {0,1,2,3}, + {0,1,3,2}, + {0,3,1,2}, + {0,1,2,3}}; + StableMarriageProblem smp = new StableMarriageProblem(); + int[] result = smp.findPair(priority); + for(int i=0; i < result.length; i++){ + System.out.println(i + " " + result[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/array/SubarrayWithGivenSum.java b/showmecode_100/java/com/interview/array/SubarrayWithGivenSum.java new file mode 100644 index 00000000..0e4065af --- /dev/null +++ b/showmecode_100/java/com/interview/array/SubarrayWithGivenSum.java @@ -0,0 +1,45 @@ +package com.interview.array; + +/** + * http://www.geeksforgeeks.org/find-subarray-with-given-sum/ + */ +public class SubarrayWithGivenSum { + + class Pair{ + int start; + int end; + + public String toString(){ + return start + " " + end; + } + } + public Pair findSubArray(int input[],int sum){ + int currentSum = 0; + Pair p = new Pair(); + p.start = 0; + for(int i=0; i < input.length; i++){ + currentSum += input[i]; + p.end = i; + if(currentSum == sum){ + return p; + }else if(currentSum > sum){ + int s = p.start; + while(currentSum > sum){ + currentSum -= input[s]; + s++; + } + p.start = s; + if(currentSum == sum){ + return p; + } + } + } + return null; + } + + public static void main(String args[]){ + SubarrayWithGivenSum sgs = new SubarrayWithGivenSum(); + int input[] = {6,3,9,11,1,3,5}; + System.out.println(sgs.findSubArray(input,15)); + } +} diff --git a/showmecode_100/java/com/interview/array/SummaryRanges.java b/showmecode_100/java/com/interview/array/SummaryRanges.java new file mode 100644 index 00000000..49380403 --- /dev/null +++ b/showmecode_100/java/com/interview/array/SummaryRanges.java @@ -0,0 +1,51 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Date 10/19/2016 + * @author Tushar Roy + * + * Given a sorted integer array without duplicates, return the summary of its ranges. + * For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"]. + * + * Solution - + * Just check if num[i] + 1 != num[i + 1]. If its not equal means you need to add previous range to result + * and start a new range. + * + * Time complexity O(n) + * + * https://leetcode.com/problems/summary-ranges/ + */ +public class SummaryRanges { + public List summaryRanges(int[] nums) { + if (nums.length == 0) { + return Collections.EMPTY_LIST; + } + if (nums.length == 1) { + return Collections.singletonList(String.valueOf(nums[0])); + } + int start = 0; + List result = new ArrayList<>(); + for (int i = 0; i < nums.length - 1; i++) { + if ((nums[i] + 1) != nums[i + 1]) { + result.add(makeRange(nums[start], nums[i])); + start = i + 1; + } + } + if ((nums[nums.length - 2] + 1) != nums[nums.length - 1]) { + start = nums.length - 1; + } + result.add(makeRange(nums[start], nums[nums.length - 1])); + return result; + } + + private String makeRange(int a, int b) { + if (a == b) { + return String.valueOf(a); + } + return a + "->" + b; + } +} diff --git a/showmecode_100/java/com/interview/array/ThreeSumSmallerThanTarget.java b/showmecode_100/java/com/interview/array/ThreeSumSmallerThanTarget.java new file mode 100644 index 00000000..a39fb4a3 --- /dev/null +++ b/showmecode_100/java/com/interview/array/ThreeSumSmallerThanTarget.java @@ -0,0 +1,32 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Given an array of n integers nums and a target, find the number of index triplets i, j, k + * with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target. + * + * https://leetcode.com/problems/3sum-smaller/ + */ +public class ThreeSumSmallerThanTarget { + public int threeSumSmaller(int[] nums, int target) { + if (nums.length < 3) { + return 0; + } + Arrays.sort(nums); + int count = 0; + for (int i = 0; i < nums.length; i++) { + int j = i + 1; + int k = nums.length - 1; + while (j < k) { + if (nums[i] + nums[j] + nums[k] >= target) { + k--; + } else { + count += k - j; + j++; + } + } + } + return count; + } +} diff --git a/showmecode_100/java/com/interview/array/TrappingWater.java b/showmecode_100/java/com/interview/array/TrappingWater.java new file mode 100644 index 00000000..57e21e9b --- /dev/null +++ b/showmecode_100/java/com/interview/array/TrappingWater.java @@ -0,0 +1,38 @@ +package com.interview.array; +/** + * References + * https://oj.leetcode.com/problems/trapping-rain-water/ + * https://leetcode.com/problems/trapping-rain-water/ + */ +public class TrappingWater { + + public int trap(int[] height) { + if(height == null || height.length == 0) { + return 0; + } + int len = height.length; + int left[] = new int[len]; + int right[] = new int[len]; + left[0] = height[0]; + right[len-1] = height[len -1]; + for (int i = 1; i < len; i++) { + left[i] = Math.max(height[i], left[i-1]); + right[len - i - 1] = Math.max(height[len- i - 1], right[len-i]); + } + + int maxWaterTrapped = 0; + for (int i = 1; i < len - 1; i++) { + int min = Math.min(left[i], right[i]); + if (height[i] < min) { + maxWaterTrapped += min - height[i]; + } + } + return maxWaterTrapped; + } + + public static void main(String args[]){ + int input[] = {0,1,0,2,1,0,1,3,2,1,2,1}; + TrappingWater tw = new TrappingWater(); + System.out.println(tw.trap(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/TripletInArray.java b/showmecode_100/java/com/interview/array/TripletInArray.java new file mode 100644 index 00000000..d3ddd12a --- /dev/null +++ b/showmecode_100/java/com/interview/array/TripletInArray.java @@ -0,0 +1,90 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * http://www.geeksforgeeks.org/find-a-triplet-that-sum-to-a-given-value/ + */ +public class TripletInArray { + + class Triplet { + int a; + int b; + int c; + + public String toString() { + return a + " " + b + " " + c; + } + } + + public Triplet findTriplet(int input[], int sum) { + Arrays.sort(input); + for (int i = 0; i < input.length - 2; i++) { + + int start = i + 1; + int end = input.length - 1; + int new_sum = sum - input[i]; + while (start < end) { + if (new_sum == input[start] + input[end]) { + Triplet t = new Triplet(); + t.a = input[i]; + t.b = input[start]; + t.c = input[end]; + return t; + } + if (new_sum > input[start] + input[end]) { + start++; + } else { + end--; + } + } + } + return null; + } + + /** + * https://leetcode.com/problems/3sum/ + */ + public List> threeSum(int[] nums) { + Arrays.sort(nums); + List> result = new ArrayList<>(); + for (int i = 0; i < nums.length - 2; i++) { + if (i != 0 && nums[i] == nums[i-1]) { + continue; + } + int start = i + 1; + int end = nums.length - 1; + while (start < end) { + if (nums[i] + nums[start] + nums[end] == 0) { + List r = new ArrayList<>(); + r.add(nums[i]); + r.add(nums[start]); + r.add(nums[end]); + result.add(r); + start++; + end--; + while(start < nums.length && nums[start] == nums[start - 1]) { + start++; + } + while(end >= 0 && nums[end] == nums[end+1]) { + end--; + } + } else if (nums[i] + nums[start] + nums[end] < 0) { + start++; + } else { + end--; + } + } + } + return result; + } + + public static void main(String args[]){ + TripletInArray tip = new TripletInArray(); + int input[] = {1,2,6,9,11,18,26,28}; + int sum = 22; + System.out.println(tip.findTriplet(input, sum)); + } +} diff --git a/showmecode_100/java/com/interview/array/TripletSumLessThanTotal.java b/showmecode_100/java/com/interview/array/TripletSumLessThanTotal.java new file mode 100644 index 00000000..cf6ff316 --- /dev/null +++ b/showmecode_100/java/com/interview/array/TripletSumLessThanTotal.java @@ -0,0 +1,39 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 12/29/2015 + * @author Tushar Roy + * + * Given array with unique numbers and a total, find all triplets whose sum is less than total + * + * http://www.geeksforgeeks.org/count-triplets-with-sum-smaller-that-a-given-value/ + */ +public class TripletSumLessThanTotal { + + public int findAllTriplets(int input[], int total) { + Arrays.sort(input); + int result = 0; + for (int i = 0; i < input.length - 2; i++) { + int j = i + 1; + int k = input.length - 1; + + while (j < k) { + if (input[i] + input[j] + input[k] >= total) { + k--; + } else { + result += k - j; + j++; + } + } + } + return result; + } + + public static void main(String args[]) { + int input[] = {5, 1, 3, 4, 7}; + TripletSumLessThanTotal tt = new TripletSumLessThanTotal(); + System.out.print(tt.findAllTriplets(input, 12)); + } +} diff --git a/showmecode_100/java/com/interview/array/TugOfWar.java b/showmecode_100/java/com/interview/array/TugOfWar.java new file mode 100644 index 00000000..9ab8d823 --- /dev/null +++ b/showmecode_100/java/com/interview/array/TugOfWar.java @@ -0,0 +1,45 @@ +package com.interview.array; + +import java.util.ArrayList; +import java.util.List; + +/* + * http://www.geeksforgeeks.org/tug-of-war/ + */ +public class TugOfWar { + + private int minFoundSoFar = 1000000; + public int findMind(int arr[]){ + int total = 0; + for(int i=0; i < arr.length; i++){ + total += arr[i]; + } + List result = new ArrayList<>(); + combinationUtil(arr,arr.length/2,0,0,total,0,result); + return minFoundSoFar; + } + + private void combinationUtil(int arr[],int k, int start,int sum, int total,int pos, List result){ + if(pos == k){ + if(Math.abs(sum - total/2) < minFoundSoFar) { + minFoundSoFar = Math.abs(sum - total/2); + System.out.println(result); + } + return; + } + for(int i=start; i < arr.length; i++){ + sum += arr[i]; + result.add(arr[i]); + combinationUtil(arr,k,i+1,sum,total,pos+1,result); + result.remove(result.size()-1); + sum -= arr[i]; + } + } + + public static void main(String args[]){ + TugOfWar tow = new TugOfWar(); + int arr[] = {23, 45, 34, 12,11, 98, 99, 4, 189, 1,7,19,105, 201}; + int min = tow.findMind(arr); + System.out.print(min); + } +} diff --git a/showmecode_100/java/com/interview/array/WaterContainer.java b/showmecode_100/java/com/interview/array/WaterContainer.java new file mode 100644 index 00000000..5fb87100 --- /dev/null +++ b/showmecode_100/java/com/interview/array/WaterContainer.java @@ -0,0 +1,26 @@ +package com.interview.array; + +/** + * Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). + * n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, + * which together with x-axis forms a container, such that the container contains the most water. + * + * https://leetcode.com/problems/container-with-most-water/ + */ +public class WaterContainer { + public int maxArea(int[] height) { + int i = 0; + int j = height.length - 1; + int maxArea = 0; + while (i < j) { + if (height[i] < height[j]) { + maxArea = Math.max(maxArea, (height[i]) * (j - i)); + i++; + } else { + maxArea = Math.max(maxArea, height[j] * (j - i)); + j--; + } + } + return maxArea; + } +} diff --git a/showmecode_100/java/com/interview/array/WiggleSort.java b/showmecode_100/java/com/interview/array/WiggleSort.java new file mode 100644 index 00000000..ed7e74b1 --- /dev/null +++ b/showmecode_100/java/com/interview/array/WiggleSort.java @@ -0,0 +1,78 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 03/23/2016 + * @author Tushar Roy + * + * Convert an unsorted array into an array of form num[0] < num[1] > nums[2] < num[3].... + * + * Time complexity O(n) - This depends on KthElementInArray time + * Space complexity O(1) + * + * https://leetcode.com/problems/wiggle-sort/ + * https://leetcode.com/problems/wiggle-sort-ii/ + */ +public class WiggleSort { + + //looking for nums[0] < nums[1] > nums[2] < nums[3] and so on. + public void wiggleSort2(int[] arr) { + if (arr.length == 0) { + return; + } + int k = arr.length/2; + KthElementInArray kthElementInArray = new KthElementInArray(); + kthElementInArray.kthElement(arr, k); + + int mid = arr[k]; + int n = arr.length; + int i = 0, j = 0; + k = n - 1; + while (j <= k) { + if (arr[next(j, n)] > mid) { + swap(arr, next(i++, n), next(j++, n)); + } + else if (arr[next(j, n)] < mid) { + swap(arr, next(j, n), next(k--, n)); + } + else { + j++; + } + } + } + + //in this version we are looking for nums[0] <= nums[1] >= nums[2] <= nums[3] and so on. + public void wiggleSort1(int[] nums) { + boolean flag = true; + for (int i = 0; i < nums.length - 1; i++) { + if (flag) { + if (nums[i] > nums[i + 1]) { + swap(nums, i, i + 1); + } + } else { + if (nums[i] < nums[i + 1]) { + swap(nums, i, i + 1); + } + } + flag = !flag; + } + } + + private int next(int index, int n) { + return (2*index + 1) % (n | 1); + } + + private void swap(int arr[],int low,int high){ + int temp = arr[low]; + arr[low] = arr[high]; + arr[high] = temp; + } + + public static void main(String args[]) { + WiggleSort ws = new WiggleSort(); + int input[] = {6, 2, 1, 6, 8, 9, 6}; + ws.wiggleSort2(input); + System.out.print(Arrays.toString(input)); + } +} diff --git a/showmecode_100/java/com/interview/array/ZigZagArrangement.java b/showmecode_100/java/com/interview/array/ZigZagArrangement.java new file mode 100644 index 00000000..c68ccbb4 --- /dev/null +++ b/showmecode_100/java/com/interview/array/ZigZagArrangement.java @@ -0,0 +1,46 @@ +package com.interview.array; + +import java.util.Arrays; + +/** + * Date 12/30/2015 + * @author Tushar Roy + * + * Given an array of unique elements rearrange the array to be a < b > c < d > e form + * + * Time complexity - O(n) + * Space complexity - O(1) + * + * http://www.geeksforgeeks.org/convert-array-into-zig-zag-fashion/ + */ +public class ZigZagArrangement { + + public void rearrange(int input[]) { + boolean isLess = true; + for (int i = 0; i < input.length - 1; i++) { + if(isLess) { + if (input[i] > input[i+1]) { + swap(input, i, i+1); + } + } else { + if (input[i] < input[i+1]) { + swap(input, i, i+1); + } + } + isLess = !isLess; + } + } + + private void swap(int input[], int i, int j) { + int t = input[i]; + input[i] = input[j]; + input[j] = t; + } + + public static void main(String args[]) { + int input[] = {4, 3, 2, 6, 7, 1, 9}; + ZigZagArrangement zza = new ZigZagArrangement(); + zza.rearrange(input); + Arrays.stream(input).forEach(i -> System.out.print(i + " ")); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/ArithmeticProgressionSearch.java b/showmecode_100/java/com/interview/binarysearch/ArithmeticProgressionSearch.java new file mode 100644 index 00000000..ea5cd647 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/ArithmeticProgressionSearch.java @@ -0,0 +1,31 @@ +package com.interview.binarysearch; + +/** + * http://www.careercup.com/question?id=4798365246160896 + */ +public class ArithmeticProgressionSearch { + + public int search(int input[]){ + int low =0; + int high = input.length-1; + int ap = (input[high] - input[low])/(input.length); + int middle = -1; + while(low <= high){ + middle = (low + high)/2; + if(input[middle] == input[0] + (middle)*ap){ + low = middle+1; + }else if((input[middle] > input[0] + (middle)*ap) && + input[middle-1] == input[0] + (middle-1)*ap){ + return input[0] + (middle)*ap; + }else{ + high = middle-1; + } + } + return -1; + } + public static void main(String args[]){ + int input[] = {1,7,10,13,16,19,22}; + ArithmeticProgressionSearch aps = new ArithmeticProgressionSearch(); + System.out.println(aps.search(input)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/BinarySearch.java b/showmecode_100/java/com/interview/binarysearch/BinarySearch.java new file mode 100644 index 00000000..5902d5b0 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/BinarySearch.java @@ -0,0 +1,33 @@ +package com.interview.binarysearch; + +/** + * Regular binary search + */ +public class BinarySearch { + + public int search(final int input[], int search) { + int low = 0; + int high = input.length - 1; + int mid; + while (low <= high) { + mid = low + ((high - low) / 2); + if (input[mid] == search) { + return mid; + } else if (input[mid] < search) { + low = mid + 1; + } else { + high = mid - 1; + } + } + return -1; + } + + public static void main(String args[]) { + BinarySearch bSearch = new BinarySearch(); + final int arr1[] = {1, 2, 4, 5, 7, 8}; + System.out.println(bSearch.search(arr1, -1)); + System.out.println(bSearch.search(arr1, 1)); + System.out.println(bSearch.search(arr1, 8)); + System.out.println(bSearch.search(arr1, 2)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/CircularBinarySearch.java b/showmecode_100/java/com/interview/binarysearch/CircularBinarySearch.java new file mode 100644 index 00000000..83659077 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/CircularBinarySearch.java @@ -0,0 +1,78 @@ +package com.interview.binarysearch; + +/** + * http://www.careercup.com/question?id=4877486110277632 + * Given a circle with N defined points and a point M outside the circle, + * find the point that is closest to M among the set of N. O(LogN) + * Test cases + * 1) smallest element at center + * 2) smallest element at left/right end + * 3) largest element at center + * 4) smallest element at left side + * 5) smallest element at right side + */ +public class CircularBinarySearch { + + //if mid is greater than both ends than result is low of two ends else move in direction + //where either mid-1 or mid+1 is less + public int search(int arr[]) { + int low = 0; + int high = arr.length - 1; + int mid = 0; + while (low < high) { + mid = (low + high) / 2; + //if middle is less than both mid-1 and mid+1 then mid is the answer + if((low == mid || arr[mid] < arr[mid-1])&& arr[mid] < arr[mid+1]){ + return arr[mid]; + } + if ((arr[mid] >= arr[low] && arr[mid] >= arr[high])){ + if(arr[low] < arr[high]){ + high = mid-1; + }else{ + low = mid+1; + } + }else{ + if(arr[mid-1] < arr[mid+1]){ + high = mid-1; + }else{ + low = mid+1; + } + } + } + return arr[low]; + } + + public static void main(String args[]) { + CircularBinarySearch cbs = new CircularBinarySearch(); + int arr[] = { 7, 10, 8, 5, 2, 3, 5 }; + System.out.print(cbs.search(arr)); + + int arr1[] = { 5, 8, 10, 7, 5, 3, 2 }; + System.out.print(cbs.search(arr1)); + + int arr2[] = { 3, 5, 7, 10, 8, 5, 2 }; + System.out.print(cbs.search(arr2)); + + int arr3[] = { 8, 5, 2, 3, 5, 7, 10 }; + System.out.print(cbs.search(arr3)); + + int arr4[] = { 5, 3, 2, 5, 8, 10, 7 }; + System.out.print(cbs.search(arr4)); + + int arr5[] = {100,20,10,5,2,8,11,16,19}; + System.out.print(cbs.search(arr5)); + + int arr6[] = {200,2,10,15,20,80,110,160,190}; + System.out.print(cbs.search(arr6)); + + int arr7[] = {5,10,20,50,200,800,1100,1600,1900,2}; + System.out.print(cbs.search(arr7)); + + int arr8[] = {2,5,10,20,50,200,800,1100,1600,1900}; + System.out.print(cbs.search(arr8)); + + int arr9[] = {3,1,8,5,4}; + System.out.print(cbs.search(arr9)); + + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/CountNDistinctPairsWithDifferenceK.java b/showmecode_100/java/com/interview/binarysearch/CountNDistinctPairsWithDifferenceK.java new file mode 100644 index 00000000..026731a5 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/CountNDistinctPairsWithDifferenceK.java @@ -0,0 +1,42 @@ +package com.interview.binarysearch; + +import java.util.Arrays; + +/** + * http://www.geeksforgeeks.org/count-pairs-difference-equal-k/ + */ +public class CountNDistinctPairsWithDifferenceK { + + public int count(int arr[],int k){ + Arrays.sort(arr); + int count = 0; + for(int i=0; i < arr.length; i++){ + boolean result = binarySearch(arr, i+1, arr.length-1, arr[i] + k); + if(result){ + count++; + } + } + return count; + } + + private boolean binarySearch(int arr[],int start,int end,int num){ + if(start > end){ + return false; + } + int mid = (start + end)/2; + if(arr[mid] == num){ + return true; + } + else if(arr[mid] > num){ + return binarySearch(arr,start,mid-1,num); + }else{ + return binarySearch(arr,mid+1,end,num); + } + } + + public static void main(String args[]){ + CountNDistinctPairsWithDifferenceK cn = new CountNDistinctPairsWithDifferenceK(); + int arr[] = {1,2,3,4,5,7,9}; + System.out.print(cn.count(arr, 3)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/FirstOccurrenceOfNumberInSortedArray.java b/showmecode_100/java/com/interview/binarysearch/FirstOccurrenceOfNumberInSortedArray.java new file mode 100644 index 00000000..c7073502 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/FirstOccurrenceOfNumberInSortedArray.java @@ -0,0 +1,31 @@ +package com.interview.binarysearch; + +/** + * http://www.geeksforgeeks.org/check-for-majority-element-in-a-sorted-array/ + */ +public class FirstOccurrenceOfNumberInSortedArray { + + public int firstOccurrence(int input[], int x){ + int low = 0; + int high = input.length-1; + + while(low <= high){ + int middle = (low + high)/2; + if(input[middle] == x && (middle == 0 || input[middle-1] < x)){ + return middle; + }else if(input[middle] < x){ + low = middle+1; + }else{ + high = middle-1; + } + } + return -1; + } + + public static void main(String args[]){ + FirstOccurrenceOfNumberInSortedArray fos = new FirstOccurrenceOfNumberInSortedArray(); + int input[] = {1,2,2,2,2,2,5,7,7}; + System.out.println(fos.firstOccurrence(input, 6)); + } + +} diff --git a/showmecode_100/java/com/interview/binarysearch/FloorAndCeilingSortedArray.java b/showmecode_100/java/com/interview/binarysearch/FloorAndCeilingSortedArray.java new file mode 100644 index 00000000..07647998 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/FloorAndCeilingSortedArray.java @@ -0,0 +1,46 @@ +package com.interview.binarysearch; + +/** + * http://www.geeksforgeeks.org/search-floor-and-ceil-in-a-sorted-array/ + */ +public class FloorAndCeilingSortedArray { + + public int floor(int input[], int x){ + int low = 0; + int high = input.length-1; + while(low <= high){ + int middle = (low + high)/2; + if(input[middle] == x || (input[middle] < x && (middle == input.length-1 || input[middle+1] > x))){ + return middle; + }else if(input[middle] < x){ + low = middle+1; + }else{ + high = middle-1; + } + } + return -1; + } + + public int ceiling(int input[], int x){ + int low = 0; + int high = input.length-1; + while(low <= high){ + int middle = (low + high)/2; + if(input[middle] == x || (input[middle] > x && (middle == 0 || input[middle-1] < x))){ + return middle; + }else if(input[middle] < x){ + low = middle+1; + }else{ + high = middle-1; + } + } + return -1; + } + + public static void main(String args[]){ + int input[] = {1,2,5,6,11,15}; + FloorAndCeilingSortedArray foc = new FloorAndCeilingSortedArray(); + System.out.println(foc.floor(input, 15)); + System.out.println(foc.ceiling(input, 2)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/MedianOfTwoSortedArray.java b/showmecode_100/java/com/interview/binarysearch/MedianOfTwoSortedArray.java new file mode 100644 index 00000000..00eed512 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/MedianOfTwoSortedArray.java @@ -0,0 +1,64 @@ +package com.interview.binarysearch; + +/** + * http://www.geeksforgeeks.org/median-of-two-sorted-arrays/ + */ +public class MedianOfTwoSortedArray { + + public double median(int arr1[],int arr2[]){ + int low1 = 0; + int high1 = arr1.length-1; + + int low2 = 0; + int high2 = arr2.length-1; + + while(true){ + + if(high1 == low1){ + return (arr1[low1] + arr2[low2])/2; + } + + if(high1 - low1 == 1){ + return (double)(Math.max(arr1[low1], arr2[low2]) + Math.min(arr1[high1], arr2[high2]))/2; + } + + double med1 = getMedian(arr1,low1,high1); + double med2 = getMedian(arr2,low1,high2); + if(med1 <= med2){ + if((high1-low1 + 1) % 2 == 0){ + low1 = (high1+low1)/2; + high2 = (high2+low2)/2 + 1; + }else{ + low1 = (low1+high1)/2; + high2 = (low2+high2)/2; + } + } + else{ + if((high1-low1 + 1) % 2 == 0){ + low2 = (high2+low2)/2; + high1 = (high1+low1)/2 + 1; + }else{ + low2 = (low2+high2)/2; + high1 = (low1+high1)/2; + } + } + } + } + + private double getMedian(int arr[],int low,int high){ + int len = high - low+1; + if(len % 2 == 0){ + return (arr[low + len/2] + arr[low+ len/2-1])/2; + }else{ + return arr[low+len/2]; + } + } + + public static void main(String args[]){ + int arr1[] = {1,2,3,4,6}; + int arr2[] = {-1,5,6,7,8}; + MedianOfTwoSortedArray mts = new MedianOfTwoSortedArray(); + System.out.println(mts.median(arr1, arr2)); + } + +} diff --git a/showmecode_100/java/com/interview/binarysearch/MedianOfTwoSortedArrayOfDifferentLength.java b/showmecode_100/java/com/interview/binarysearch/MedianOfTwoSortedArrayOfDifferentLength.java new file mode 100644 index 00000000..bd67d6ee --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/MedianOfTwoSortedArrayOfDifferentLength.java @@ -0,0 +1,69 @@ +package com.interview.binarysearch; + +/** + * There are two sorted arrays nums1 and nums2 of size m and n respectively. + * Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). + * + * Solution + * Take minimum size of two array. Possible number of partitions are from 0 to m in m size array. + * Try every cut in binary search way. When you cut first array at i then you cut second array at (m + n + 1)/2 - i + * Now try to find the i where a[i-1] <= b[j] and b[j-1] <= a[i]. So this i is partition around which lies the median. + * + * Time complexity is O(log(min(x,y)) + * Space complexity is O(1) + * + * https://leetcode.com/problems/median-of-two-sorted-arrays/ + * https://discuss.leetcode.com/topic/4996/share-my-o-log-min-m-n-solution-with-explanation/4 + */ +public class MedianOfTwoSortedArrayOfDifferentLength { + + public double findMedianSortedArrays(int input1[], int input2[]) { + //if input1 length is greater than switch them so that input1 is smaller than input2. + if (input1.length > input2.length) { + return findMedianSortedArrays(input2, input1); + } + int x = input1.length; + int y = input2.length; + + int low = 0; + int high = x; + while (low <= high) { + int partitionX = (low + high)/2; + int partitionY = (x + y + 1)/2 - partitionX; + + //if partitionX is 0 it means nothing is there on left side. Use -INF for maxLeftX + //if partitionX is length of input then there is nothing on right side. Use +INF for minRightX + int maxLeftX = (partitionX == 0) ? Integer.MIN_VALUE : input1[partitionX - 1]; + int minRightX = (partitionX == x) ? Integer.MAX_VALUE : input1[partitionX]; + + int maxLeftY = (partitionY == 0) ? Integer.MIN_VALUE : input2[partitionY - 1]; + int minRightY = (partitionY == y) ? Integer.MAX_VALUE : input2[partitionY]; + + if (maxLeftX <= minRightY && maxLeftY <= minRightX) { + //We have partitioned array at correct place + // Now get max of left elements and min of right elements to get the median in case of even length combined array size + // or get max of left for odd length combined array size. + if ((x + y) % 2 == 0) { + return ((double)Math.max(maxLeftX, maxLeftY) + Math.min(minRightX, minRightY))/2; + } else { + return (double)Math.max(maxLeftX, maxLeftY); + } + } else if (maxLeftX > minRightY) { //we are too far on right side for partitionX. Go on left side. + high = partitionX - 1; + } else { //we are too far on left side for partitionX. Go on right side. + low = partitionX + 1; + } + } + + //Only we we can come here is if input arrays were not sorted. Throw in that scenario. + throw new IllegalArgumentException(); + } + + public static void main(String[] args) { + int[] x = {1, 3, 8, 9, 15}; + int[] y = {7, 11, 19, 21, 18, 25}; + + MedianOfTwoSortedArrayOfDifferentLength mm = new MedianOfTwoSortedArrayOfDifferentLength(); + mm.findMedianSortedArrays(x, y); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/MinimumInSortedRotatedArray.java b/showmecode_100/java/com/interview/binarysearch/MinimumInSortedRotatedArray.java new file mode 100644 index 00000000..78152f3e --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/MinimumInSortedRotatedArray.java @@ -0,0 +1,23 @@ +package com.interview.binarysearch; + +/** + * https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ + */ +public class MinimumInSortedRotatedArray { + public int findMin(int[] nums) { + int low = 0; + int high = nums.length - 1; + while (low < high) { + int middle = (low + high)/2; + if ((middle == 0 && nums[middle] < nums[middle + 1]) || (middle > 0 && nums[middle] < nums[middle - 1])) { + return nums[middle]; + } + else if (nums[middle] > nums[high]) { + low = middle + 1; + } else { + high = middle - 1; + } + } + return nums[low]; + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/MissingNumberInConsecutiveNumbers.java b/showmecode_100/java/com/interview/binarysearch/MissingNumberInConsecutiveNumbers.java new file mode 100644 index 00000000..94e34df3 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/MissingNumberInConsecutiveNumbers.java @@ -0,0 +1,34 @@ +package com.interview.binarysearch; + +/** + * Find missing number in consecutive numbers. + */ +public class MissingNumberInConsecutiveNumbers { + + public Integer findMissing(int arr[]){ + + int lowNum = arr[0]; + int low = 0; + int high = arr.length -1; + int middle = (low + high)/2; + while(low <= high){ + middle = (low + high)/2; + if(arr[middle] == (middle+1 + lowNum) && middle-1 >=0 && arr[middle-1] == (middle + lowNum-1)){ + return middle + lowNum; + } + else if((middle + lowNum) == arr[middle]){ + low = middle+1; + }else { + high = middle-1; + } + } + return null; + } + + public static void main(String args[]){ + int arr[] = {3,4,5,6,7,8,9,10,11,12}; + int arr1[] = {-5,-4,-3,-1,0,1,2,3}; + MissingNumberInConsecutiveNumbers mn = new MissingNumberInConsecutiveNumbers(); + System.out.println(mn.findMissing(arr1)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/MonotonicallyIncreasingFunctionBecomesPositive.java b/showmecode_100/java/com/interview/binarysearch/MonotonicallyIncreasingFunctionBecomesPositive.java new file mode 100644 index 00000000..52e91ab7 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/MonotonicallyIncreasingFunctionBecomesPositive.java @@ -0,0 +1,43 @@ +package com.interview.binarysearch; + +/** + * http://www.geeksforgeeks.org/find-the-point-where-a-function-becomes-negative/ + */ +public class MonotonicallyIncreasingFunctionBecomesPositive { + + private int f(int x){ + return x*x - 10*x - 20; + } + + public int findPoint(){ + int i=1; + while(f(i) <=0 ){ + i = i*2; + } + return binarySearch(i/2,i); + } + + private int binarySearch(int start,int end){ + int mid = (start+end)/2; + while(start < end){ + mid = (start+end)/2; + if(f(mid) >0 && f(mid-1) <=0){ + return mid; + } + if(f(mid) <=0 && f(mid+1)>0){ + return mid+1; + } + if(f(mid) <= 0){ + start = mid+1; + }else{ + end = mid-1; + } + } + return mid; + } + + public static void main(String args[]){ + MonotonicallyIncreasingFunctionBecomesPositive mif = new MonotonicallyIncreasingFunctionBecomesPositive(); + System.out.print(mif.findPoint()); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/NumberOfPairWithXPowerYGreaterThanYPowerX.java b/showmecode_100/java/com/interview/binarysearch/NumberOfPairWithXPowerYGreaterThanYPowerX.java new file mode 100644 index 00000000..083357de --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/NumberOfPairWithXPowerYGreaterThanYPowerX.java @@ -0,0 +1,75 @@ +package com.interview.binarysearch; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.geeksforgeeks.org/find-number-pairs-xy-yx/ + */ +public class NumberOfPairWithXPowerYGreaterThanYPowerX { + + public int countPairs(int X[],int Y[]){ + Map hardCoded = new HashMap(); + for(int i=0; i < Y.length; i++){ + if(Y[i] < 4){ + Integer count = hardCoded.get(Y[i]); + if(count != null){ + hardCoded.put(Y[i], count++); + }else{ + hardCoded.put(Y[i], 1); + } + } + } + Arrays.sort(Y); + int countPairs = 0; + for(int i=0 ; i < X.length; i++){ + countPairs += count(X[i],Y,hardCoded); + } + return countPairs; + } + + private int count(int x, int Y[],Map hardCount){ + + if(x == 0){ + return 0; + } + if(x == 1){ + return upperBound(0,Y); + } + int result = Y.length - upperBound(x,Y); + result += (hardCount.containsKey(1) ? hardCount.get(1) : 0 ) + (hardCount.containsKey(0) ? hardCount.get(0) : 0); + + if(x == 2){ + result -= (hardCount.containsKey(3) ? hardCount.get(3) : 0); + } + if(x == 3){ + result += (hardCount.containsKey(2) ? hardCount.get(2) : 0); + } + return result; + } + + private int upperBound(int x, int arr[]){ + int low = 0; + int high = arr.length-1; + while(low <= high){ + int mid = (low+high)/2; + if(arr[mid] > x && (mid-1 < 0 || arr[mid-1] <= x)){ + return mid; + }else if(arr[mid] > x){ + high = mid-1; + }else{ + low = mid+1; + } + } + return -1; + + } + + public static void main(String args[]){ + NumberOfPairWithXPowerYGreaterThanYPowerX nop = new NumberOfPairWithXPowerYGreaterThanYPowerX(); + int X[] = {7,9,5,8,9,11,0,1,1,3}; + int Y[] = {6,8,9,11,14,5,1,0,2,3,9}; + System.out.println(nop.countPairs(X, Y)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/PeakElement.java b/showmecode_100/java/com/interview/binarysearch/PeakElement.java new file mode 100644 index 00000000..fb68510d --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/PeakElement.java @@ -0,0 +1,50 @@ +package com.interview.binarysearch; + +/** + * @author Tushar Roy + * Date 01/17/2107 + * A peak element is an element that is greater than its neighbors. Find index of peak element in the array. + * + * Space complexity is O(1) + * Time complexity is O(n) + * + * https://leetcode.com/problems/find-peak-element/ + */ +public class PeakElement { + + public int findPeakElement(int[] nums) { + int low = 0; + int high = nums.length - 1; + int middle = 0; + while (low <= high) { + middle = (low + high)/2; + int before = Integer.MIN_VALUE; + if (middle > 0) { + before = nums[middle - 1]; + } + int after = Integer.MIN_VALUE; + if (middle < nums.length - 1) { + after = nums[middle + 1]; + } + if (nums[middle] > before && nums[middle] > after) { + return middle; + } else if (before > after) { + high = middle - 1; + } else { + low = middle + 1; + } + } + return middle; + } + + public static void main(String args[]){ + int arr[] = {10,5,15,2,23,90,67}; + PeakElement pe = new PeakElement(); + System.out.println(pe.findPeakElement(arr)); + int arr1[] = {10,20,30,40,50}; + System.out.println(pe.findPeakElement(arr1)); + int arr2[] = {100,90,80,70,60}; + System.out.println(pe.findPeakElement(arr2)); + + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/SearchForRange.java b/showmecode_100/java/com/interview/binarysearch/SearchForRange.java new file mode 100644 index 00000000..bb62d98d --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/SearchForRange.java @@ -0,0 +1,64 @@ +package com.interview.binarysearch; + +/** + * Date 07/31/2016 + * @author Tushar Roy + * + * Given a sorted array of integers, find the starting and ending position of a given target value. + * + * Time complexity O(logn) + * Space complexity O(1) + * + * https://leetcode.com/problems/search-for-a-range/ + */ +public class SearchForRange { + public int[] searchRange(int[] nums, int target) { + int first = firstOccurence(nums, target); + if (first == -1) { + return new int[]{-1, -1}; + } + int last = lastOccurence(nums, target); + return new int[]{first, last}; + } + + private int firstOccurence(int[] nums, int target) { + int low = 0; + int high = nums.length - 1; + while (low <= high) { + int mid = low + (high - low)/2; + if (nums[mid] == target && (mid == 0 || nums[mid - 1] < target)) { + return mid; + } else if (nums[mid] >= target) { + high = mid - 1; + } else { + low = mid + 1; + } + } + return -1; + } + + private int lastOccurence(int[] nums, int target) { + int low = 0; + int high = nums.length - 1; + while (low <= high) { + int mid = low + (high - low)/2; + if (nums[mid] == target && (mid == nums.length - 1 || nums[mid + 1] > target)) { + return mid; + } else if (nums[mid] <= target) { + low = mid + 1; + } else { + high = mid - 1; + } + } + return -1; + } + + public static void main(String args[]) { + SearchForRange searchForRange = new SearchForRange(); + int[] nums = {0, 1, 1, 3, 6, 9, 11}; + int[] r = searchForRange.searchRange(nums, 11); + System.out.println(r[0] + " " + r[1]); + r = searchForRange.searchRange(nums, 0); + System.out.println(r[0] + " " + r[1]); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/SearchInsertPosition.java b/showmecode_100/java/com/interview/binarysearch/SearchInsertPosition.java new file mode 100644 index 00000000..5f0805dc --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/SearchInsertPosition.java @@ -0,0 +1,26 @@ +package com.interview.binarysearch; + +/** + * https://leetcode.com/problems/search-insert-position/ + */ +public class SearchInsertPosition { + public int searchInsert(int[] nums, int target) { + int low = 0; + int high = nums.length - 1; + while (low <= high) { + int middle = (low + high)/2; + if (nums[middle] == target) { + return middle; + } + if (nums[middle] < target && (middle == nums.length - 1 || nums[middle + 1] > target)) { + return middle + 1; + } + if (nums[middle] < target) { + low = middle + 1; + } else { + high = middle - 1; + } + } + return 0; + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/SortedAndRotatedArraySearch.java b/showmecode_100/java/com/interview/binarysearch/SortedAndRotatedArraySearch.java new file mode 100644 index 00000000..b6a23243 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/SortedAndRotatedArraySearch.java @@ -0,0 +1,103 @@ +package com.interview.binarysearch; + +/** + * @author Tushar Roy + * Date 01/22/17 + * + * Search in sorted and rotated array. In one version duplicate is not allowed and + * in another version duplicate is allowed. + * + * Time complexity with no duplicate - O(logn) + * Time complexity with duplicates - O(n) + * + * https://leetcode.com/problems/search-in-rotated-sorted-array/ + * https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ + */ +public class SortedAndRotatedArraySearch { + + /** + * Duplicates are not allowed in arr. + */ + public int search(int arr[],int search){ + int low =0; + int high = arr.length-1; + while(low <= high){ + int mid = (low + high)/2; + if(arr[mid] == search){ + return mid; + } + + if(arr[mid] < arr[high]){ + if(arr[mid] < search && search <= arr[high]){ + low = mid+1; + }else{ + high = mid-1; + } + }else{ + if(search >= arr[low] && search < arr[mid]){ + high = mid-1; + }else{ + low = mid+1; + } + } + } + return -1; + } + + /** + * Duplicates are allowed in arr. + */ + public boolean searchWithDuplicates(int[] arr, int search) { + int low =0; + int high = arr.length-1; + while(low <= high){ + int mid = (low + high)/2; + if(arr[mid] == search) { + return true; + } + //if low is same as mid then increment low. + if (arr[mid] == arr[low]) { + low++; + } else if (arr[mid] == arr[high]) { //if high is same as mid then decrement high. + high--; + } else if (arr[mid] < arr[high]) { + if(arr[mid] < search && search <= arr[high]) { + low = mid + 1; + } else { + high = mid - 1; + } + } else { + if(search >= arr[low] && search < arr[mid]) { + high = mid - 1; + } else { + low = mid + 1; + } + } + } + return false; + } + + public static void main(String args[]){ + SortedAndRotatedArraySearch ras = new SortedAndRotatedArraySearch(); + int arr1[] = {1,2,5,6,7,8,11,21}; + System.out.print(ras.search(arr1, 1)); + System.out.print(ras.search(arr1, 5)); + System.out.print(ras.search(arr1, 22)); + System.out.println(); + + int arr2[] = {18,21,1,2,5,6,7,8,10,15}; + System.out.print(ras.search(arr2, 1)); + System.out.print(ras.search(arr2, 5)); + System.out.print(ras.search(arr2, 10)); + System.out.print(ras.search(arr2, 14)); + System.out.println(); + + int arr3[] = {7,8,15,17,18,21,1,2,5,6}; + System.out.print(ras.search(arr3, 1)); + System.out.print(ras.search(arr3, 5)); + System.out.print(ras.search(arr3, 10)); + System.out.print(ras.search(arr3, 7)); + System.out.print(ras.search(arr3, 6)); + System.out.print(ras.search(arr3, 16)); + } +} diff --git a/showmecode_100/java/com/interview/binarysearch/SquareRootOfNumber.java b/showmecode_100/java/com/interview/binarysearch/SquareRootOfNumber.java new file mode 100644 index 00000000..99c685f4 --- /dev/null +++ b/showmecode_100/java/com/interview/binarysearch/SquareRootOfNumber.java @@ -0,0 +1,23 @@ +package com.interview.binarysearch; + +/** + * + * https://leetcode.com/problems/sqrtx/ + */ +public class SquareRootOfNumber { + public int mySqrt(int x) { + if (x == 0) + return 0; + int left = 1, right = x; + while (true) { + int mid = left + (right - left)/2; + if (mid > x/mid) { + right = mid - 1; + } else { + if (mid + 1 > x/(mid + 1)) + return mid; + left = mid + 1; + } + } + } +} diff --git a/showmecode_100/java/com/interview/bits/AddTwoNumberInBinaryRepresentation.java b/showmecode_100/java/com/interview/bits/AddTwoNumberInBinaryRepresentation.java new file mode 100644 index 00000000..08a12f96 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/AddTwoNumberInBinaryRepresentation.java @@ -0,0 +1,88 @@ +package com.interview.bits; + +/** + * http://www.geeksforgeeks.org/add-two-bit-strings/ + * http://www.geeksforgeeks.org/binary-representation-of-a-given-number/ + * http://www.geeksforgeeks.org/add-two-numbers-without-using-arithmetic-operators/ + */ +public class AddTwoNumberInBinaryRepresentation { + + public int add(char[] num1,char[] num2){ + int index1 = num1.length -1; + int index2 = num2.length -1; + int carry = 0; + int result = 0; + int index = 0; + while(index1 >= 0 && index2 >= 0){ + int r1 = num1[index1] - '0'; + int r2 = num2[index2] - '0'; + result = result | (r1^r2^carry)<= 0){ + int r1 = num1[index1] - '0'; + result = result | (r1^carry)<= 0){ + int r2 = num1[index2] - '0'; + result = result | (r2^carry)<>>1){ + if((num & i) > 0){ + System.out.print("1"); + }else{ + System.out.print("0"); + } + } + } + + public static void main(String args[]){ + AddTwoNumberInBinaryRepresentation anp = new AddTwoNumberInBinaryRepresentation(); + char num1[] = "1010001110".toCharArray(); + char num2[] = "10011".toCharArray(); + int result = anp.add(num1, num2); + System.out.println(anp.addTwoNumbersWithoutArithmeticOperator(296, 5662)); + System.out.println(anp.addTwoNumbersWithoutArithmeticOperatorFaster(296, 5662)); + anp.printResult(result); + } + +} diff --git a/showmecode_100/java/com/interview/bits/BitRotation.java b/showmecode_100/java/com/interview/bits/BitRotation.java new file mode 100644 index 00000000..8248b750 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/BitRotation.java @@ -0,0 +1,16 @@ +package com.interview.bits; + +/* + * http://www.geeksforgeeks.org/rotate-bits-of-an-integer/ + */ +public class BitRotation { + + public byte rotateLeft(byte num, int d){ + return (byte)((num << d) | (num >>> (8-d))); + } + + public static void main(String args[]){ + BitRotation br = new BitRotation(); + System.out.println(br.rotateLeft((byte)28, 2)); + } +} diff --git a/showmecode_100/java/com/interview/bits/ByteAsStorage.java b/showmecode_100/java/com/interview/bits/ByteAsStorage.java new file mode 100644 index 00000000..ad7ae574 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/ByteAsStorage.java @@ -0,0 +1,32 @@ +package com.interview.bits; + +public class ByteAsStorage { + + void useByteAsBoolean(boolean[] visited){ + byte[] bytes = new byte[(int)(Math.ceil(visited.length*1.0/8))]; + for(int i=0; i < visited.length; i++){ + int row = i/8; + int col = i%8; + if(visited[i]){ + bytes[row] = (byte)(bytes[row] | (byte)(1<= 1){ + System.out.print("True"); + }else{ + System.out.print("False"); + } + } + } + public static void main(String args[]){ + boolean visited[] = {true,false,true,true,false}; + ByteAsStorage bas = new ByteAsStorage(); + bas.useByteAsBoolean(visited); + } +} diff --git a/showmecode_100/java/com/interview/bits/CountBits.java b/showmecode_100/java/com/interview/bits/CountBits.java new file mode 100644 index 00000000..e23234a2 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/CountBits.java @@ -0,0 +1,59 @@ +package com.interview.bits; + +/** + * http://www.geeksforgeeks.org/count-set-bits-in-an-integer/ + */ +public class CountBits { + + public CountBits(){ + preCalculate(); + } + public int countBits(int num){ + int count=0; + while(num > 0){ + num &= num-1; + count++; + } + return count; + } + + private int count[] = new int[256]; + + void preCalculate(){ + for(int i=0; i < 256; i++){ + count[i] = countBits(i); + } + } + + public int countBitsFaster(int num){ + //get 8 bits at a time and check count from count array + int total = 0; + int mask = (1<<8) - 1; + for(int i=0 ; i < 4; i++){ + total += count[num & mask]; + num = num>>>8; + } + return total; + } + + //http://bits.stephan-brumme.com/countBits.html + public int countBitsEvenFaster(int x){ + // count bits of each 2-bit chunk + x = x - ((x >> 1) & 0x55555555); + // count bits of each 4-bit chunk + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + // count bits of each 8-bit chunk + x = x + (x >> 4); + // mask out junk + x &= 0xF0F0F0F; + // add all four 8-bit chunks + return (x * 0x01010101) >> 24; + } + + public static void main(String args[]){ + CountBits cb = new CountBits(); + System.out.println(cb.countBits(3636363)); + System.out.println(cb.countBitsFaster(3636363)); + System.out.println(cb.countBitsEvenFaster(3636363)); + } +} diff --git a/showmecode_100/java/com/interview/bits/CountingBitsTillNum.java b/showmecode_100/java/com/interview/bits/CountingBitsTillNum.java new file mode 100644 index 00000000..5a17dcd7 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/CountingBitsTillNum.java @@ -0,0 +1,36 @@ +package com.interview.bits; + +/** + * Date 04/03/2016 + * @author Tushar Roy + * + * Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate + * the number of 1's in their binary representation and return them as an array. + * + * Time complexity O(n) + * Space complexity O(n) + * + * https://leetcode.com/problems/counting-bits/ + */ +public class CountingBitsTillNum { + public int[] countBits(int num) { + if (num == 0) { + return new int[1]; + } + int[] count = new int[num + 1]; + count[0] = 0; + int n = 1; + int start = n; + while (start <= num) { + start = n; + count[start++] = 1; + int end = n<<1; + while (start < end && start <= num) { + count[start] = 1 + count[start - n]; + start++; + } + n = n<<1; + } + return count; + } +} diff --git a/showmecode_100/java/com/interview/bits/DrawHorizontalLine.java b/showmecode_100/java/com/interview/bits/DrawHorizontalLine.java new file mode 100644 index 00000000..061fb22e --- /dev/null +++ b/showmecode_100/java/com/interview/bits/DrawHorizontalLine.java @@ -0,0 +1,69 @@ +package com.interview.bits; + +/** + * Exercise 5.8 150qs + */ +public class DrawHorizontalLine { + + public void draw(byte[] screen, int width, int x1, int x2,int y){ + int pos1 = y*width + x1; + int pos2 = y*width + x2; + + int start = pos1; + while(start <= pos2){ + int row = start/8; + int col = start%8; + + screen[row] = (byte)(screen[row] | 1<>i; + } + result = result | (sum%3)< grayCode(int n) { + List result = new LinkedList<>(); + for (int i = 0; i < 1<>1); + } + return result; + } + + public static void main(String args[]) { + GrayCode gc = new GrayCode(); + System.out.println(gc.grayCode(4)); + } +} diff --git a/showmecode_100/java/com/interview/bits/InsertMintoNiTojBits.java b/showmecode_100/java/com/interview/bits/InsertMintoNiTojBits.java new file mode 100644 index 00000000..83960708 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/InsertMintoNiTojBits.java @@ -0,0 +1,26 @@ +package com.interview.bits; + +/** + * Exercise 5.1 150 qs + */ +public class InsertMintoNiTojBits { + + public int insert(int M,int N, int i, int j){ + int mask = 1<<(j+1) -1; + mask = mask< b.length() - a.length()); + + int[] masks = new int[words.length]; // alphabet masks + + for(int i = 0; i < masks.length; i++){ + for(char c: words[i].toCharArray()){ + masks[i] |= 1 << (c - 'a'); + } + } + + for(int i = 0; i < masks.length; i++){ + if(words[i].length() * words[i].length() <= max) { + break; //prunning + } + for(int j = i + 1; j < masks.length; j++){ + if((masks[i] & masks[j]) == 0){ + max = Math.max(max, words[i].length() * words[j].length()); + break; //prunning + } + } + } + + return max; + } +} diff --git a/showmecode_100/java/com/interview/bits/MissingNumbers.java b/showmecode_100/java/com/interview/bits/MissingNumbers.java new file mode 100644 index 00000000..2c8d53c3 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/MissingNumbers.java @@ -0,0 +1,89 @@ +package com.interview.bits; + +class Pair{ + int x; + int y; +} + +/** + * http://www.geeksforgeeks.org/find-the-two-repeating-elements-in-a-given-array/ + * http://www.geeksforgeeks.org/find-a-repeating-and-a-missing-number/ + */ +public class MissingNumbers { + + public Pair findMissingAndRepeated(int arr[], int n){ + int xor = 0; + for(int i=0; i < arr.length; i++){ + xor = xor ^ arr[i]; + } + + for(int i=1; i <= n; i++){ + xor = xor ^ i; + } + + xor = xor & ~(xor-1); + int set1 = 0; + int set2 = 0; + for(int i=0; i < arr.length; i++){ + if((arr[i] & xor) > 0){ + set1 ^= arr[i]; + }else{ + set2 ^= arr[i]; + } + } + Pair p = new Pair(); + for(int i=1; i <= n; i++){ + if((i & xor) > 0){ + set1 ^= i; + }else{ + set2 ^= i; + } + } + p.x = set1; + p.y = set2; + return p; + } + + public Pair findTwoMissingNumber(int arr[], int n){ + int xor = 0; + for(int i=0; i < arr.length; i++){ + xor = xor ^ arr[i]; + } + + for(int i=1; i <= n; i++){ + xor = xor ^ i; + } + + xor = xor & ~(xor-1); + int set1 = 0; + int set2 = 0; + for(int i=0; i < arr.length; i++){ + if((arr[i] & xor) > 0){ + set1 ^= arr[i]; + }else{ + set2 ^= arr[i]; + } + } + Pair p = new Pair(); + for(int i=1; i <= n; i++){ + if((i & xor) > 0){ + set1 ^= i; + }else{ + set2 ^= i; + } + } + p.x = set1; + p.y = set2; + return p; + } + + public static void main(String args[]){ + MissingNumbers mn = new MissingNumbers(); + int arr[] = {1,2,3,5,5}; + Pair p = mn.findMissingAndRepeated(arr, 5); + System.out.println(p.x + " " + p.y); + int arr1[] = {1,5,3,6}; + p = mn.findMissingAndRepeated(arr1, 6); + System.out.println(p.x + " " + p.y); + } +} diff --git a/showmecode_100/java/com/interview/bits/NextHigherAndNextLowerWithSameNumberBits.java b/showmecode_100/java/com/interview/bits/NextHigherAndNextLowerWithSameNumberBits.java new file mode 100644 index 00000000..3202200c --- /dev/null +++ b/showmecode_100/java/com/interview/bits/NextHigherAndNextLowerWithSameNumberBits.java @@ -0,0 +1,62 @@ +package com.interview.bits; + +/** + * Exercise 5.3 150 qs + */ +public class NextHigherAndNextLowerWithSameNumberBits { + + public int nextHigher(int n){ + int i = 1; + int first1 = 0; + //go till you find first 1 + while((n & i) == 0){ + i = i << 1; + first1++; + } + //count number of 1s before first 0 + int count1s = 0; + while((n & i) > 0){ + i = i <<1; + count1s++; + } + count1s--; + //change this first 0 after 1 to 1 + n = n^i; + n = n ^ (i>>1); + int mask = ~(1<<(first1 + count1s) -1); + n = mask & n; + n = n | ((1< 0){ + i = i << 1; + first0++; + } + int count0s = 0; + while((n & i) == 0){ + i = i <<1; + count0s++; + } + count0s--; + //change this first 0 after 1 to 1 + n = n^i; + n = n ^ (i>>1); + int mask = (1< 0 && (num & (num-1)) == 0){ + return num; + } + while((num & (num-1)) > 0){ + num = num & (num-1); + } + return num<<1; + } + public static void main(String args[]){ + NextPowerOf2 np = new NextPowerOf2(); + System.out.println(np.nextPowerOf2(4)); + } +} diff --git a/showmecode_100/java/com/interview/bits/NumberOccuringOddTimes.java b/showmecode_100/java/com/interview/bits/NumberOccuringOddTimes.java new file mode 100644 index 00000000..f3d40f7c --- /dev/null +++ b/showmecode_100/java/com/interview/bits/NumberOccuringOddTimes.java @@ -0,0 +1,52 @@ +package com.interview.bits; + +/** + * http://www.geeksforgeeks.org/find-the-number-occurring-odd-number-of-times/ + * http://www.geeksforgeeks.org/find-two-non-repeating-elements-in-an-array-of-repeating-elements/ + */ +public class NumberOccuringOddTimes { + + public int oneNumberOccuringOddTimes(int arr[]){ + int r = 0; + for(int i=0; i < arr.length; i++){ + r = r^arr[i]; + } + return r; + } + + class Pair{ + int a; + int b; + + } + + public Pair twoNumbersOccuringOddTimes(int arr[]){ + int r = 0; + for(int i=0; i < arr.length; i++){ + r = r^arr[i]; + } + + r = r & ~(r-1); + int r1 = 0; + int r2 = 0; + for(int i=0; i < arr.length; i++){ + if((r&arr[i]) == 0){ + r1 = r1^arr[i]; + }else{ + r2 = r2^arr[i]; + } + } + Pair p = new Pair(); + p.a = r1; + p.b = r2; + return p; + } + + public static void main(String args[]){ + NumberOccuringOddTimes noot = new NumberOccuringOddTimes(); + int arr[] = {1,2,9,9,2,1,9,7,2,1,9,1}; + Pair p = noot.twoNumbersOccuringOddTimes(arr); + System.out.print(p.a + " " + p.b); + } +} + diff --git a/showmecode_100/java/com/interview/bits/NumberOfBitsFlipToConvertNToM.java b/showmecode_100/java/com/interview/bits/NumberOfBitsFlipToConvertNToM.java new file mode 100644 index 00000000..39e83b48 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/NumberOfBitsFlipToConvertNToM.java @@ -0,0 +1,21 @@ +package com.interview.bits; + +/** + * Exercise 5.5 150 qs + */ +public class NumberOfBitsFlipToConvertNToM { + + public int number(int m, int n){ + int r = n^m; + int count = 0; + while(r != 0){ + r = r & (r-1); + count++; + } + return count; + } + public static void main(String args[]){ + NumberOfBitsFlipToConvertNToM nb = new NumberOfBitsFlipToConvertNToM(); + System.out.println(nb.number(31, 14)); + } +} diff --git a/showmecode_100/java/com/interview/bits/RealNumberToBinary.java b/showmecode_100/java/com/interview/bits/RealNumberToBinary.java new file mode 100644 index 00000000..5f4cbb99 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/RealNumberToBinary.java @@ -0,0 +1,33 @@ +package com.interview.bits; + +/** + * Exercise 5.2 150 qs + */ +public class RealNumberToBinary { + + public void print(double num){ + if(num > 1 || num < 0){ + System.out.println("ERROR"); + return; + } + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("0."); + while(num > 0){ + num = num*2; + int r = (int)num ; + stringBuilder.append(r); + num = num -r; + if(stringBuilder.length() > 32){ + System.out.println("ERROR"); + return; + } + } + System.out.println(stringBuilder); + } + public static void main(String args[]){ + RealNumberToBinary rnb = new RealNumberToBinary(); + rnb.print(0.8125); + rnb.print(0.72); + } +} diff --git a/showmecode_100/java/com/interview/bits/RepeatedDnaSequence.java b/showmecode_100/java/com/interview/bits/RepeatedDnaSequence.java new file mode 100644 index 00000000..c06bedfe --- /dev/null +++ b/showmecode_100/java/com/interview/bits/RepeatedDnaSequence.java @@ -0,0 +1,101 @@ +package com.interview.bits; + +import java.util.*; + +/** + * Date 03/08/2016 + * @author Tushar Roy + * + * Find repeated sequence of length 10 in string consisting of A,C,G,T + * + * Time complexity is O(n) + * Space complexity is O(n) + * + * https://leetcode.com/problems/repeated-dna-sequences/ + */ +public class RepeatedDnaSequence { + private static final int mask = 0xFFFFF; + private static final int mask1 = 3; + + + public List findRepeatedDnaSequences(String s) { + + if (s.length() < 10) { + return Collections.emptyList(); + } + + Set set = new HashSet<>(); + int val = 0; + for (int i = 0; i < 10; i++) { + val = add(val, s.charAt(i)); + } + set.add(val); + List result = new ArrayList<>(); + createString(val); + + Set repeatSet = new HashSet<>(); + + for (int i = 10; i < s.length(); i++) { + val = add(val, s.charAt(i)); + if (set.contains(val) && !repeatSet.contains(val)) { + result.add(createString(val)); + repeatSet.add(val); + } else { + set.add(val); + } + } + + return result; + } + + private String createString(int input) { + StringBuffer sb = new StringBuffer(); + for (int i = 9; i >= 0; i--) { + sb.append(getChar(input>>(i*2) & mask1)); + } + return sb.toString(); + } + + private int add(int input, char ch) { + int val = getVal(ch); + input = input<<2; + input = input & mask; + return input | val; + } + + private int getVal(char ch) { + switch(ch) { + case 'A': + return 0; + case 'C': + return 1; + case 'G': + return 2; + case 'T': + return 3; + default: + throw new IllegalArgumentException(); + } + } + + private char getChar(int val) { + switch (val) { + case 0: + return 'A'; + case 1: + return 'C'; + case 2: + return 'G'; + case 3: + return 'T'; + default: + throw new IllegalArgumentException(); + } + } + + public static void main(String args[]) { + RepeatedDnaSequence rds = new RepeatedDnaSequence(); + List result = rds.findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"); + System.out.print(result); + } +} diff --git a/showmecode_100/java/com/interview/bits/ReverseBits.java b/showmecode_100/java/com/interview/bits/ReverseBits.java new file mode 100644 index 00000000..df1c853f --- /dev/null +++ b/showmecode_100/java/com/interview/bits/ReverseBits.java @@ -0,0 +1,25 @@ +package com.interview.bits; + +/** + * http://www.geeksforgeeks.org/write-an-efficient-c-program-to-reverse-bits-of-a-number/ + */ +public class ReverseBits { + + public int reverse(int num){ + //assuming int is 32 bits. + int result = 0; + int r1 = 1; + for(int i=31; i >= 0; i--,r1<<=1){ + if((num & 1<> and << + while((k & (k-1))!= 0){ + result += n; + k--; + } + + while(k > 1){ + n = n<<1; + k = k>>1; + } + return result + n; + } + + public int fastSquare(int n){ + return fastSquareRec(n, n); + } + /** + * Start with 9,9. Then take 1 and keep left shifting 1 till you find number + * less than 9 but power of 2. Then shift 9 by that many powers and repeat + * the process with whatever is left between that number and 9. + */ + private int fastSquareRec(int n, int leftToMultiply){ + if(leftToMultiply <= 0){ + return 0; + } + int k = 1; + int count=0; + while(k <= leftToMultiply){ + k = k<<1; + count++; + } + k = k>>1; + count--; + return (n<> 1 & mask2); + } + + public static void main(String args[]){ + SwapOddEvenBits soe = new SwapOddEvenBits(); + System.out.println(soe.swap(697)); + } +} diff --git a/showmecode_100/java/com/interview/bits/SwapTwoBits.java b/showmecode_100/java/com/interview/bits/SwapTwoBits.java new file mode 100644 index 00000000..02bd9d75 --- /dev/null +++ b/showmecode_100/java/com/interview/bits/SwapTwoBits.java @@ -0,0 +1,30 @@ +package com.interview.bits; + +/** + * http://www.careercup.com/question?id=17542662 + */ +public class SwapTwoBits { + + public int swap(int num,int i, int j){ + int t1 = (num & 1<>i ^ (num & 1<>j) != 0){ + num ^= 1< 1001 -> 101 -> 11 + * 1010 -> 110 -> 101 -> 11 + * + * No matter which route you take it leads to same result so just looking at swaps you can say + * which player will win + * + */ +public class WinnerWithBeautifulNumber { + + public int winner(int n){ + int sum = 0; + int i =1; + int result = 0; + while( i <= n){ + i = i*2; + } + i = i/2; + while(i > 0){ + if((n & i) != 0){ + sum++; + }else{ + result += sum; + } + i = i/2; + } + if(result % 2 == 0){ + return 2; + }else{ + return 1; + } + } + + public static void main(String args[]){ + WinnerWithBeautifulNumber wwb = new WinnerWithBeautifulNumber(); + System.out.println(wwb.winner(37)); + System.out.println(wwb.winner(10)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/BitonicSequence.java b/showmecode_100/java/com/interview/dynamic/BitonicSequence.java new file mode 100644 index 00000000..9b56c9ad --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/BitonicSequence.java @@ -0,0 +1,46 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-15-longest-bitonic-subsequence/ + */ +public class BitonicSequence { + + public int longestSequence(int arr[]){ + int lis[] = new int[arr.length]; + int lds[] = new int[arr.length]; + for(int i=0; i < arr.length; i++){ + lis[i] = 1; + lds[i] = 1; + } + for(int i=1 ; i < arr.length; i++){ + for(int j=0; j < i ; j++){ + if(arr[i] > arr[j]){ + lis[i] = Math.max(lis[i], lis[j] + 1); + } + } + } + + for(int i = arr.length-2; i >=0 ; i--){ + for(int j = arr.length-1; j > i; j--){ + if(arr[i] > arr[j]){ + lds[i] = Math.max(lds[i], lds[j] + 1); + } + } + } + int max = 0; + for(int i=0; i < arr.length; i++){ + if(max < lis[i] + lds[i]-1){ + max = lis[i] + lds[i] -1; + } + } + return max; + } + + public static void main(String args[]){ + BitonicSequence bs = new BitonicSequence(); + int[] arr = {1,4,3,7,2,1,8,11,13,0}; + int r = bs.longestSequence(arr); + System.out.print(r); + + } +} diff --git a/showmecode_100/java/com/interview/dynamic/BoxStacking.java b/showmecode_100/java/com/interview/dynamic/BoxStacking.java new file mode 100644 index 00000000..51e1c32a --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/BoxStacking.java @@ -0,0 +1,146 @@ +package com.interview.dynamic; + +import java.util.Arrays; + +/** + * Date 05/09/2015 + * @author tusroy + * + * Given different dimensions and unlimited supply of boxes for each dimension, stack boxes + * on top of each other such that it has maximum height but with caveat that length and width + * of box on top should be strictly less than length and width of box under it. You can + * rotate boxes as you like. + * + * 1) Create all rotations of boxes such that length is always greater or equal to width + * 2) Sort boxes by base area in non increasing order (length * width). This is because box + * with more area will never ever go on top of box with less area. + * 3) Take T[] and result[] array of same size as total boxes after all rotations are done + * 4) Apply longest increasing subsequence type of algorithm to get max height. + * + * If n number of dimensions are given total boxes after rotation will be 3n. + * So space complexity is O(n) + * Time complexity - O(nlogn) to sort boxes. O(n^2) to apply DP on it So really O(n^2) + * + * References + * http://www.geeksforgeeks.org/dynamic-programming-set-21-box-stacking-problem/ + * http://people.cs.clemson.edu/~bcdean/dp_practice/ + */ +public class BoxStacking { + + public int maxHeight(Dimension[] input) { + //get all rotations of box dimension. + //e.g if dimension is 1,2,3 rotations will be 2,1,3 3,2,1 3,1,2 . Here length is always greater + //or equal to width and we can do that without loss of generality. + Dimension[] allRotationInput = new Dimension[input.length * 3]; + createAllRotation(input, allRotationInput); + + //sort these boxes in non increasing order by their base area.(length X width) + Arrays.sort(allRotationInput); + + //apply longest increasing subsequence kind of algorithm on these sorted boxes. + int T[] = new int[allRotationInput.length]; + int result[] = new int[allRotationInput.length]; + + for (int i = 0; i < T.length; i++) { + T[i] = allRotationInput[i].height; + result[i] = i; + } + + for (int i = 1; i < T.length; i++) { + for (int j = 0; j < i; j++) { + if (allRotationInput[i].length < allRotationInput[j].length + && allRotationInput[i].width < allRotationInput[j].width) { + if( T[j] + allRotationInput[i].height > T[i]){ + T[i] = T[j] + allRotationInput[i].height; + result[i] = j; + } + } + } + } + + //find max in T[] and that will be our max height. + //Result can also be found using result[] array. + int max = Integer.MIN_VALUE; + for(int i=0; i < T.length; i++){ + if(T[i] > max){ + max = T[i]; + } + } + + return max; + } + + //create all rotations of boxes, always keeping length greater or equal to width + private void createAllRotation(Dimension[] input, + Dimension[] allRotationInput) { + int index = 0; + for (int i = 0; i < input.length; i++) { + allRotationInput[index++] = Dimension.createDimension( + input[i].height, input[i].length, input[i].width); + allRotationInput[index++] = Dimension.createDimension( + input[i].length, input[i].height, input[i].width); + allRotationInput[index++] = Dimension.createDimension( + input[i].width, input[i].length, input[i].height); + + } + } + + public static void main(String args[]) { + BoxStacking bs = new BoxStacking(); + Dimension input[] = { new Dimension(3, 2, 5), new Dimension(1, 2, 4) }; + int maxHeight = bs.maxHeight(input); + System.out.println("Max height is " + maxHeight); + assert 11 == maxHeight; + } +} + +/** + * Utility class to hold dimensions + * @author tusroy + * + */ +class Dimension implements Comparable { + int height; + int length; + int width; + + Dimension(int height, int length, int width) { + this.height = height; + this.length = length; + this.width = width; + } + + Dimension() { + } + + static Dimension createDimension(int height, int side1, int side2) { + Dimension d = new Dimension(); + d.height = height; + if (side1 >= side2) { + d.length = side1; + d.width = side2; + } else { + d.length = side2; + d.width = side1; + } + return d; + } + + /** + * Sorts by base area(length X width) + */ + @Override + public int compareTo(Dimension d) { + if (this.length * this.width >= d.length * d.width) { + return -1; + } else { + return 1; + } + } + + @Override + public String toString() { + return "Dimension [height=" + height + ", length=" + length + + ", width=" + width + "]"; + } +} diff --git a/showmecode_100/java/com/interview/dynamic/BreakMultipleWordsWithNoSpaceIntoSpace.java b/showmecode_100/java/com/interview/dynamic/BreakMultipleWordsWithNoSpaceIntoSpace.java new file mode 100644 index 00000000..f9efb48e --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/BreakMultipleWordsWithNoSpaceIntoSpace.java @@ -0,0 +1,215 @@ +package com.interview.dynamic; + +import java.util.*; + +/** + * Date 08/01/2014 + * @author tusroy + * + * Given a string and a dictionary, split this string into multiple words such that + * each word belongs in dictionary. + * + * e.g peanutbutter -> pea nut butter + * e.g Iliketoplay -> I like to play + * + * Solution + * DP solution to this problem + * if( input[i...j] belongs in dictionary) T[i][j] = i + * else{ + * T[i][j] = k if T[i][k-1] != -1 && T[k][j] != -1 + * + * Test cases + * 1) Empty string + * 2) String where entire string is in dictionary + * 3) String which cannot be split into words which are in dictionary + * 3) String which can be split into words which are in dictionary + * + */ +public class BreakMultipleWordsWithNoSpaceIntoSpace { + + + /** + * Recursive and slow version of breaking word problem. + * If no words can be formed it returns null + */ + public String breakWord(char[] str,int low,Set dictionary){ + StringBuffer buff = new StringBuffer(); + for(int i= low; i < str.length; i++){ + buff.append(str[i]); + if(dictionary.contains(buff.toString())){ + String result = breakWord(str, i+1, dictionary); + if(result != null){ + return buff.toString() + " " + result; + } + } + } + if(dictionary.contains(buff.toString())){ + return buff.toString(); + } + return null; + } + + /** + * Dynamic programming version for breaking word problem. + * It returns null string if string cannot be broken into multipe words + * such that each word is in dictionary. + * Gives preference to longer words over splits + * e.g peanutbutter with dict{pea nut butter peanut} it would result in + * peanut butter instead of pea nut butter. + */ + public String breakWordDP(String word, Set dict){ + int T[][] = new int[word.length()][word.length()]; + + for(int i=0; i < T.length; i++){ + for(int j=0; j < T[i].length ; j++){ + T[i][j] = -1; //-1 indicates string between i to j cannot be split + } + } + + //fill up the matrix in bottom up manner + for(int l = 1; l <= word.length(); l++){ + for(int i=0; i < word.length() -l + 1 ; i++){ + int j = i + l-1; + String str = word.substring(i,j+1); + //if string between i to j is in dictionary T[i][j] is true + if(dict.contains(str)){ + T[i][j] = i; + continue; + } + //find a k between i+1 to j such that T[i][k-1] && T[k][j] are both true + for(int k=i+1; k <= j; k++){ + if(T[i][k-1] != -1 && T[k][j] != -1){ + T[i][j] = k; + break; + } + } + } + } + if(T[0][word.length()-1] == -1){ + return null; + } + + //create space separate word from string is possible + StringBuffer buffer = new StringBuffer(); + int i = 0; int j = word.length() -1; + while(i < j){ + int k = T[i][j]; + if(i == k){ + buffer.append(word.substring(i, j+1)); + break; + } + buffer.append(word.substring(i,k) + " "); + i = k; + } + + return buffer.toString(); + } + + /** + * Prints all the words possible instead of just one combination. + * Reference + * https://leetcode.com/problems/word-break-ii/ + */ + public List wordBreakTopDown(String s, Set wordDict) { + Map> dp = new HashMap<>(); + int max = 0; + for (String s1 : wordDict) { + max = Math.max(max, s1.length()); + } + return wordBreakUtil(s, wordDict, dp, 0, max); + } + + private List wordBreakUtil(String s, Set dict, Map> dp, int start, int max) { + if (start == s.length()) { + return Collections.singletonList(""); + } + + if (dp.containsKey(start)) { + return dp.get(start); + } + + List words = new ArrayList<>(); + for (int i = start; i < start + max && i < s.length(); i++) { + String newWord = s.substring(start, i + 1); + if (!dict.contains(newWord)) { + continue; + } + List result = wordBreakUtil(s, dict, dp, i + 1, max); + for (String word : result) { + String extraSpace = word.length() == 0 ? "" : " "; + words.add(newWord + extraSpace + word); + } + } + dp.put(start, words); + return words; + } + + /** + * Check if any one solution exists. + * https://leetcode.com/problems/word-break/ + */ + public boolean wordBreakTopDownOneSolution(String s, Set wordDict) { + Map dp = new HashMap<>(); + int max = 0; + for (String s1 : wordDict) { + max = Math.max(max, s1.length()); + } + return wordBreakTopDownOneSolutionUtil(s, wordDict, 0, max, dp); + + } + + private boolean wordBreakTopDownOneSolutionUtil(String s, Set dict, int start, int max, Map dp) { + if (start == s.length()) { + return true; + } + + if (dp.containsKey(start)) { + return dp.get(start); + } + + for (int i = start; i < start + max && i < s.length(); i++) { + String newWord = s.substring(start, i + 1); + if (!dict.contains(newWord)) { + continue; + } + if (wordBreakTopDownOneSolutionUtil(s, dict, i + 1, max, dp)) { + dp.put(start, true); + return true; + } + } + dp.put(start, false); + return false; + } + + public boolean wordBreakBottomUp(String s, List wordList) { + boolean[] T = new boolean[s.length() + 1]; + Set set = new HashSet<>(); + for (String word : wordList) { + set.add(word); + } + T[0] = true; + for (int i = 1; i <= s.length(); i++) { + for (int j = 0; j < i; j++) { + if(T[j] && set.contains(s.substring(j, i))) { + T[i] = true; + break; + } + } + } + return T[s.length()]; + } + + public static void main(String args[]){ + Set dictionary = new HashSet(); + dictionary.add("I"); + dictionary.add("like"); + dictionary.add("had"); + dictionary.add("play"); + dictionary.add("to"); + String str = "Ihadliketoplay"; + BreakMultipleWordsWithNoSpaceIntoSpace bmw = new BreakMultipleWordsWithNoSpaceIntoSpace(); + String result1 = bmw.breakWordDP(str, dictionary); + + System.out.print(result1); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/BurstBalloons.java b/showmecode_100/java/com/interview/dynamic/BurstBalloons.java new file mode 100644 index 00000000..85ff5b7b --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/BurstBalloons.java @@ -0,0 +1,110 @@ +package com.interview.dynamic; + +/** + * Date 03/02/2016 + * @author Tushar Roy + * + * Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented + * by array nums. You are asked to burst all the balloons. If the you burst balloon i you will + * get nums[left] * nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, + * the left and right then becomes adjacent. + * Find the maximum coins you can collect by bursting the balloons wisely. + * + * Time complexity O(n^3) + * Space complexity O(n^2) + * + * Reference + * https://leetcode.com/problems/burst-balloons/ + */ +public class BurstBalloons { + + /** + * Dynamic programming solution. + */ + public int maxCoinsBottomUpDp(int[] nums) { + + int T[][] = new int[nums.length][nums.length]; + + for (int len = 1; len <= nums.length; len++) { + for (int i = 0; i <= nums.length - len; i++) { + int j = i + len - 1; + for (int k = i; k <= j; k++) { + //leftValue/rightValue is initially 1. If there is element on + // left/right of k then left/right value will take that value. + int leftValue = 1; + int rightValue = 1; + if (i != 0) { + leftValue = nums[i-1]; + } + if (j != nums.length -1) { + rightValue = nums[j+1]; + } + + //before is initially 0. If k is i then before will + //stay 0 otherwise it gets value T[i][k-1] + //after is similarly 0 initially. if k is j then after will + //stay 0 other will get value T[k+1][j] + int before = 0; + int after = 0; + if (i != k) { + before = T[i][k-1]; + } + if (j != k) { + after = T[k+1][j]; + } + T[i][j] = Math.max(leftValue * nums[k] * rightValue + before + after, + T[i][j]); + } + } + } + return T[0][nums.length - 1]; + } + + /** + * Recursive solution. + */ + public int maxCoinsRec(int nums[]) { + int[] nums1 = new int[nums.length + 2]; + nums1[0] = 1; + nums1[nums1.length - 1] = 1; + for (int i = 0; i < nums.length; i++) { + nums1[i+1] = nums[i]; + } + return maxCoinsRecUtil(nums1); + } + + private int maxCoinsRecUtil(int[] nums) { + if (nums.length == 2) { + return 0; + } + + int max = 0; + for (int i = 1; i < nums.length - 1; i++) { + int val = nums[i - 1]*nums[i]*nums[i+1] + maxCoinsRecUtil(formNewArray(nums, i)); + if (val > max) { + max = val; + } + } + return max; + + } + + private int[] formNewArray(int[] input, int doNotIncludeIndex) { + int[] newArray = new int[input.length - 1]; + int index = 0; + for (int i = 0; i < input.length; i++) { + if (i == doNotIncludeIndex) { + continue; + } + newArray[index++] = input[i]; + } + return newArray; + } + + + public static void main(String args[]) { + BurstBalloons bb = new BurstBalloons(); + int input[] = {2, 4, 3, 5}; + System.out.print(bb.maxCoinsBottomUpDp(input)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CoinChanging.java b/showmecode_100/java/com/interview/dynamic/CoinChanging.java new file mode 100644 index 00000000..637e35d2 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CoinChanging.java @@ -0,0 +1,86 @@ +package com.interview.dynamic; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Date 08/01/2014 + * @author Tushar Roy + * + * Given a total and coins of certain denominations find number of ways total + * can be formed from coins assuming infinity supply of coins + * + * References: + * http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ + */ +public class CoinChanging { + + public int numberOfSolutions(int total, int coins[]){ + int temp[][] = new int[coins.length+1][total+1]; + for(int i=0; i <= coins.length; i++){ + temp[i][0] = 1; + } + for(int i=1; i <= coins.length; i++){ + for(int j=1; j <= total ; j++){ + if(coins[i-1] > j){ + temp[i][j] = temp[i-1][j]; + } + else{ + temp[i][j] = temp[i][j-coins[i-1]] + temp[i-1][j]; + } + } + } + return temp[coins.length][total]; + } + + /** + * Space efficient DP solution + */ + public int numberOfSolutionsOnSpace(int total, int arr[]){ + + int temp[] = new int[total+1]; + + temp[0] = 1; + for(int i=0; i < arr.length; i++){ + for(int j=1; j <= total ; j++){ + if(j >= arr[i]){ + temp[j] += temp[j-arr[i]]; + } + } + } + return temp[total]; + } + + /** + * This method actually prints all the combination. It takes exponential time. + */ + public void printCoinChangingSolution(int total,int coins[]){ + List result = new ArrayList<>(); + printActualSolution(result, total, coins, 0); + } + + private void printActualSolution(List result,int total,int coins[],int pos){ + if(total == 0){ + for(int r : result){ + System.out.print(r + " "); + } + System.out.print("\n"); + } + for(int i=pos; i < coins.length; i++){ + if(total >= coins[i]){ + result.add(coins[i]); + printActualSolution(result,total-coins[i],coins,i); + result.remove(result.size()-1); + } + } + } + + public static void main(String args[]){ + CoinChanging cc = new CoinChanging(); + int total = 15; + int coins[] = {3,4,6,7,9}; + System.out.println(cc.numberOfSolutions(total, coins)); + System.out.println(cc.numberOfSolutionsOnSpace(total, coins)); + cc.printCoinChangingSolution(total, coins); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CoinChangingMinimumCoin.java b/showmecode_100/java/com/interview/dynamic/CoinChangingMinimumCoin.java new file mode 100644 index 00000000..111afc2d --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CoinChangingMinimumCoin.java @@ -0,0 +1,118 @@ +package com.interview.dynamic; + +import java.text.Format; +import java.util.HashMap; +import java.util.Map; + +/** + * Date 08/12/2013 + * @author Tushar Roy + * + * Given a total and coins of certain denomination with infinite supply, what is the minimum number + * of coins it takes to form this total. + * + * Time complexity - O(coins.size * total) + * Space complexity - O(coins.size * total) + * + * Youtube video - + * Topdown DP - https://youtu.be/Kf_M7RdHr1M + * Bottom up DP - https://youtu.be/Y0ZqKpToTic + */ +public class CoinChangingMinimumCoin { + + /** + * Top down dynamic programing. Using map to store intermediate results. + * Returns Integer.MAX_VALUE if total cannot be formed with given coins + */ + public int minimumCoinTopDown(int total, int coins[], Map map) { + + //if total is 0 then there is nothing to do. return 0. + if ( total == 0 ) { + return 0; + } + + //if map contains the result means we calculated it before. Lets return that value. + if ( map.containsKey(total) ) { + return map.get(total); + } + + //iterate through all coins and see which one gives best result. + int min = Integer.MAX_VALUE; + for ( int i=0; i < coins.length; i++ ) { + //if value of coin is greater than total we are looking for just continue. + if( coins[i] > total ) { + continue; + } + //recurse with total - coins[i] as new total + int val = minimumCoinTopDown(total - coins[i], coins, map); + + //if val we get from picking coins[i] as first coin for current total is less + // than value found so far make it minimum. + if( val < min ) { + min = val; + } + } + + //if min is MAX_VAL dont change it. Just result it as is. Otherwise add 1 to it. + min = (min == Integer.MAX_VALUE ? min : min + 1); + + //memoize the minimum for current total. + map.put(total, min); + return min; + } + + /** + * Bottom up way of solving this problem. + * Keep input sorted. Otherwise temp[j-arr[i]) + 1 can become Integer.Max_value + 1 which + * can be very low negative number + * Returns Integer.MAX_VALUE - 1 if solution is not possible. + */ + public int minimumCoinBottomUp(int total, int coins[]){ + int T[] = new int[total + 1]; + int R[] = new int[total + 1]; + T[0] = 0; + for(int i=1; i <= total; i++){ + T[i] = Integer.MAX_VALUE-1; + R[i] = -1; + } + for(int j=0; j < coins.length; j++){ + for(int i=1; i <= total; i++){ + if(i >= coins[j]){ + if (T[i - coins[j]] + 1 < T[i]) { + T[i] = 1 + T[i - coins[j]]; + R[i] = j; + } + } + } + } + printCoinCombination(R, coins); + return T[total]; + } + + private void printCoinCombination(int R[], int coins[]) { + if (R[R.length - 1] == -1) { + System.out.print("No solution is possible"); + return; + } + int start = R.length - 1; + System.out.print("Coins used to form total "); + while ( start != 0 ) { + int j = R[start]; + System.out.print(coins[j] + " "); + start = start - coins[j]; + } + System.out.print("\n"); + } + + public static void main ( String args[] ) { + int total = 13; + int coins[] = {7, 3, 2, 6}; + CoinChangingMinimumCoin cc = new CoinChangingMinimumCoin(); + Map map = new HashMap<>(); + int topDownValue = cc.minimumCoinTopDown(total, coins, map); + int bottomUpValue = cc.minimumCoinBottomUp(total, coins); + + System.out.print(String.format("Bottom up and top down result %s %s", bottomUpValue, topDownValue)); + + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CountAs.java b/showmecode_100/java/com/interview/dynamic/CountAs.java new file mode 100644 index 00000000..b107c557 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CountAs.java @@ -0,0 +1,51 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/how-to-print-maximum-number-of-a-using-given-four-keys/ + * Test cases + * Negative number + * Number less than 7 + * Number greater than equal to 7 + */ +public class CountAs { + + public int countAsRec(int n){ + + if(n < 7){ + return n; + } + int max = Integer.MIN_VALUE; + int result = 0; + for(int b=n-3; b > 0; b--){ + result = (n-b-1)*countAs(b); + if(max < result){ + max = result; + } + } + return max; + } + + public int countAs(int n){ + if(n < 7){ + return n; + } + + int T[] = new int[n+1]; + for(int i=1; i < 7 ; i++){ + T[i] = i; + } + for(int i=7; i <= n; i++){ + for(int b = i-3; b > 0; b--){ + T[i] = Math.max(T[i], T[b]*(i-b-1)); + } + } + return T[n]; + } + + public static void main(String args[]){ + CountAs ca =new CountAs(); + System.out.println(ca.countAsRec(25)); + System.out.println(ca.countAs(25)); + + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CountNumberOfBinaryWithoutConsecutive1s.java b/showmecode_100/java/com/interview/dynamic/CountNumberOfBinaryWithoutConsecutive1s.java new file mode 100644 index 00000000..23b033c1 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CountNumberOfBinaryWithoutConsecutive1s.java @@ -0,0 +1,43 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/count-number-binary-strings-without-consecutive-1s/ + * It is really a straight up fibonacci series with values + * 1,2,3,5,8,13.... + * Look how we assign a[i] value of a[i-1] + b[i-1] and then b[i] becomes a[i] + */ +public class CountNumberOfBinaryWithoutConsecutive1s { + + public int count(int n){ + int a[] = new int[n]; + int b[] = new int[n]; + + a[0] = 1; + b[0] = 1; + + for(int i=1; i < n; i++){ + a[i] = a[i-1] + b[i-1]; + b[i] = a[i-1]; + } + + return a[n-1] + b[n-1]; + } + + public int countSimple(int n){ + int a = 1; + int b = 1; + + for(int i=1; i < n; i++){ + int tmp = a; + a = a + b; + b = tmp; + } + + return a + b; + } + + public static void main(String args[]){ + CountNumberOfBinaryWithoutConsecutive1s cnb = new CountNumberOfBinaryWithoutConsecutive1s(); + System.out.println(cnb.count(5)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CountNumberOfTreePreorder.java b/showmecode_100/java/com/interview/dynamic/CountNumberOfTreePreorder.java new file mode 100644 index 00000000..e055cd20 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CountNumberOfTreePreorder.java @@ -0,0 +1,60 @@ +package com.interview.dynamic; + +/** + * Given a preorder sequence how many unique trees can be created + * Solution is catalan number. Number of tree is exactly same + * as number of unique BST create with array of size n + * + * The way it works for preorder sequence is as follows + * + * Suppose our preorder sequence is 1 2 3 4 + * So we need to compute following things + * count(3)* 2 (combination of 2,3 and 4 on both side of 1) + * count(1)*count(2) (combination of 2 on one side and 3, 4 on other side) + * count(2)*count(1) (combinatino of 2,3 on one side and 4 on other side) + * count(3)*2 can be broken into count(3)*count(0) + count(0)*count(3) + * + * So our final result is + * count(0)*count(3) + count(1)*count(2) + count(2)*count(1) + count(3)*count(0) + * which is a catalan number + */ +public class CountNumberOfTreePreorder { + + public int count(int num){ + if(num == 0){ + return 0; + } + int T[] = new int[num+1]; + T[0] = 1; + T[1] = 1; + for(int i=2; i <= num; i++){ + int sum = 0; + for(int k=0; k < i; k++){ + sum += T[k]*T[i-k-1]; + } + T[i] = sum; + } + return T[num]; + } + + public int countRec(int num){ + if(num == 0 || num ==1){ + return 1; + } + int sum = 0; + for(int i=1; i <= num; i++){ + sum += countRec(i-1)*countRec(num-i); + } + return sum; + } + + public static void main(String args[]){ + CountNumberOfTreePreorder cn = new CountNumberOfTreePreorder(); + System.out.println(cn.count(3)); + System.out.println(cn.count(4)); + System.out.println(cn.count(5)); + System.out.println(cn.countRec(3)); + System.out.println(cn.countRec(4)); + System.out.println(cn.countRec(5)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CountNumberOfTreesInBST.java b/showmecode_100/java/com/interview/dynamic/CountNumberOfTreesInBST.java new file mode 100644 index 00000000..a397b244 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CountNumberOfTreesInBST.java @@ -0,0 +1,41 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/program-nth-catalan-number/ + * Count number of binary search tree created for array of size n + */ +public class CountNumberOfTreesInBST { + + int countTreesRec(int numKeys) { + if (numKeys <=1) { + return(1); + } + else { + int sum = 0; + int left, right, root; + for (root=1; root<=numKeys; root++) { + left = countTreesRec(root - 1); + right = countTreesRec(numKeys - root); + sum += left*right; + } + return(sum); + } + } + + public int countTrees(int n){ + int T[] = new int[n+1]; + T[0] = 1; + T[1] = 1; + for(int i=2; i <= n; i++){ + for(int j=0; j = 0; j--){ + if(end > markings[j]) { + break; + } + } + if(j == -1) { + T[start][end] = 0; + return 0; + } + if(i == j){ + T[start][end] = end - start; + return end - start; + } + int cost = end - start; + int minCost = Integer.MAX_VALUE; + for(int k=i; k <= j; k++) { + int c1 = cutRodToMinimizeCost(markings, start, markings[k], T); + int c2 = cutRodToMinimizeCost(markings, markings[k], end, T); + if(c1 == Integer.MAX_VALUE || c2 == Integer.MAX_VALUE) { + continue; + } + if(minCost > c1 + c2){ + minCost = c1 + c2; + } + } + if(minCost == Integer.MAX_VALUE) { + T[start][end] = Integer.MAX_VALUE; + return Integer.MAX_VALUE; + } + T[start][end] = cost + minCost; + return cost + minCost; + } + + public static void main(String args[]) { + int markings[] = {2,3,6,7}; + CutRodToMinimizeCost cr = new CutRodToMinimizeCost(); + int cost = cr.cutRodToMinimizeCost(markings, 8); + System.out.println(cost); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/CuttingRod.java b/showmecode_100/java/com/interview/dynamic/CuttingRod.java new file mode 100644 index 00000000..d25b563b --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/CuttingRod.java @@ -0,0 +1,53 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/ + */ +public class CuttingRod { + + public int maxValue(int price[]){ + int max[] = new int[price.length+1]; + for(int i=1; i <= price.length; i++){ + for(int j=i; j <= price.length; j++){ + max[j] = Math.max(max[j], max[j-i] + price[i-1]); + } + } + return max[price.length]; + } + + public int maxValue1(int price[]){ + int max[] = new int[price.length+1]; + for(int i=1; i <= price.length; i++){ + max[i] = price[i-1]; + } + for(int i=1 ; i <= price.length; i++){ + for(int j=1; j < i ; j++){ + max[i] = Math.max(max[i], max[i-j] + max[j]); + } + } + return max[price.length]; + } + + public int recursiveMaxValue(int price[],int len){ + if(len <= 0){ + return 0; + } + int maxValue = 0; + for(int i=0; i < len;i++){ + int val = price[i] + recursiveMaxValue(price, len-i-1); + if(maxValue < val){ + maxValue = val; + } + } + return maxValue; + } + public static void main(String args[]){ + CuttingRod cr =new CuttingRod(); + int[] price = {3,5,8,9,10,20,22,25}; + long t1 = System.currentTimeMillis(); + int r = cr.recursiveMaxValue(price,8); + long t2 = System.currentTimeMillis(); + System.out.println(r); + System.out.println(t2 - t1); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/DecodeWays.java b/showmecode_100/java/com/interview/dynamic/DecodeWays.java new file mode 100644 index 00000000..bd1553e3 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/DecodeWays.java @@ -0,0 +1,51 @@ +package com.interview.dynamic; + +import java.util.HashMap; +import java.util.Map; + +/** + * A message containing letters from A-Z is being encoded to numbers using the following mapping: + * 1 -> A + * 2 -> B + * 3 -> C + * 26-> Z + * Given an encoded message containing digits, determine the total number of ways to decode it. + * + * https://leetcode.com/problems/decode-ways/ + */ +public class DecodeWays { + + public int numDecodings(String s) { + if (s.length() == 0) { + return 0; + } + Map count = new HashMap<>(); + return numDecodingsUtil(s, 0, count); + } + + public int numDecodingsUtil(String s, int start, Map count) { + if (s.length() == start) { + return 1; + } + if (count.containsKey(start)) { + return count.get(start); + } + String s1 = s.substring(start, start + 1); + if (s1.equals("0")) { + count.put(start, 0); + return 0; + } + int c1 = numDecodingsUtil(s, start + 1, count); + + int c2 = 0; + if (start < s.length() - 1) { + s1 = s.substring(start, start + 2); + if (Integer.valueOf(s1) <= 26) { + c2 = numDecodingsUtil(s, start + 2, count); + } + } + count.put(start, c1 + c2); + return c1 + c2; + } +} + diff --git a/showmecode_100/java/com/interview/dynamic/DiceThrowWays.java b/showmecode_100/java/com/interview/dynamic/DiceThrowWays.java new file mode 100644 index 00000000..6b9f85a7 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/DiceThrowWays.java @@ -0,0 +1,42 @@ +package com.interview.dynamic; + +/** + * @author Tushar Roy + * http://www.geeksforgeeks.org/dice-throw-problem/ + * This solution assumes that 1,2,1 is different from 2,1,1 which is different from 1,1 2 + * so total 3 ways are possible + */ +public class DiceThrowWays { + + public int numberOfWays(int n, int f, int k){ + + int T[][] = new int[n+1][k+1]; + T[0][0] = 1; + /* for(int i=0; i < T.length; i++){ + T[0][i] = 1; + }*/ + + for(int i=1; i <= n; i++){ + for(int j =1; j <= i*f && j <= k ; j++){ + if(j == i){ + T[i][j] = 1; + continue; + } + if(j < i){ + continue; + } + for(int l =1; l <=f ;l++){ + if(j >= l){ + T[i][j] += T[i-1][j-l]; + } + } + } + } + return T[n][k]; + } + + public static void main(String args[]){ + DiceThrowWays dtw = new DiceThrowWays(); + System.out.println(dtw.numberOfWays(3, 3, 6)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/DistinctSubsequence.java b/showmecode_100/java/com/interview/dynamic/DistinctSubsequence.java new file mode 100644 index 00000000..afee32cc --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/DistinctSubsequence.java @@ -0,0 +1,39 @@ +package com.interview.dynamic; + +/** + * Date 03/20/2016 + * @author Tushar Roy + * + * Given a string S and a string T, count the number of distinct subsequences of T in S. + * + * Time complexity O(n^2) + * Space complexity O(n^2) + * + * https://leetcode.com/problems/distinct-subsequences/ + */ +public class DistinctSubsequence { + public int numDistinct(String s, String t) { + if (s.length() == 0 || t.length() == 0) { + return 0; + } + int[][] T = new int[t.length() + 1][s.length() + 1]; + for (int i = 0; i < T[0].length; i++) { + T[0][i] = 1; + } + for (int i = 1; i < T.length; i++) { + for (int j = 1; j < T[0].length; j++) { + if (s.charAt(j - 1) == t.charAt(i - 1)) { + T[i][j] = T[i-1][j-1] + T[i][j-1]; + } else { + T[i][j] = T[i][j-1]; + } + } + } + return T[t.length()][s.length()]; + } + + public static void main(String args[]) { + DistinctSubsequence ds = new DistinctSubsequence(); + System.out.println(ds.numDistinct("abdacgblc", "abc")); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/DungeonGame.java b/showmecode_100/java/com/interview/dynamic/DungeonGame.java new file mode 100644 index 00000000..865b9c60 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/DungeonGame.java @@ -0,0 +1,48 @@ +package com.interview.dynamic; + +/** + * Date 03/21/2016 + * @author Tushar Roy + * + * Minimum life needed for knight to reach princess in 2D matrix. + * + * Time complexity O(n^2) + * Space complexity O(n^2) + * + * https://leetcode.com/problems/dungeon-game/ + */ +public class DungeonGame { + public int calculateMinimumHP(int[][] dungeon) { + if (dungeon.length == 0 || dungeon[0].length == 0) { + return 0; + } + int[][] health = new int[dungeon.length][dungeon[0].length]; + + int m = dungeon.length - 1; + int n = dungeon[0].length - 1; + + health[m][n] = Math.max(1 - dungeon[m][n] , 1); + + for (int i = m - 1; i >= 0; i--) { + health[i][n] = Math.max(health[i + 1][n] - dungeon[i][n], 1); + } + + for (int i = n - 1; i >= 0; i--) { + health[m][i] = Math.max(health[m][i+1] - dungeon[m][i], 1); + } + + for (int i = m - 1; i >= 0; i--) { + for (int j = n - 1; j >= 0; j--) { + health[i][j] = Math.min(Math.max(health[i + 1][j] - dungeon[i][j], 1), Math.max(health[i][j + 1] - dungeon[i][j], 1)); + } + } + + return health[0][0]; + } + + public static void main(String args[]) { + DungeonGame dg = new DungeonGame(); + int[][] dungeon = {{-2, -3, 3}, {-5, -10, 1}, {10, 30, -30}}; + System.out.print(dg.calculateMinimumHP(dungeon)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/EditDistance.java b/showmecode_100/java/com/interview/dynamic/EditDistance.java new file mode 100644 index 00000000..5da96f1c --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/EditDistance.java @@ -0,0 +1,105 @@ +package com.interview.dynamic; + +import java.util.List; + +/** + * Date 07/07/2014 + * @author Tushar Roy + * + * Given two strings how many minimum edits(update, delete or add) is needed to convert one string to another + * + * Time complexity is O(m*n) + * Space complexity is O(m*n) + * + * References: + * http://www.geeksforgeeks.org/dynamic-programming-set-5-edit-distance/ + * https://en.wikipedia.org/wiki/Edit_distance + */ +public class EditDistance { + + /** + * Uses recursion to find minimum edits + */ + public int recEditDistance(char[] str1, char str2[], int len1,int len2){ + + if(len1 == str1.length){ + return str2.length - len2; + } + if(len2 == str2.length){ + return str1.length - len1; + } + return min(recEditDistance(str1, str2, len1 + 1, len2 + 1) + str1[len1] == str2[len2] ? 0 : 1, recEditDistance(str1, str2, len1, len2 + 1) + 1, recEditDistance(str1, str2, len1 + 1, len2) + 1); + } + + /** + * Uses bottom up DP to find the edit distance + */ + public int dynamicEditDistance(char[] str1, char[] str2){ + int temp[][] = new int[str1.length+1][str2.length+1]; + + for(int i=0; i < temp[0].length; i++){ + temp[0][i] = i; + } + + for(int i=0; i < temp.length; i++){ + temp[i][0] = i; + } + + for(int i=1;i <=str1.length; i++){ + for(int j=1; j <= str2.length; j++){ + if(str1[i-1] == str2[j-1]){ + temp[i][j] = temp[i-1][j-1]; + }else{ + temp[i][j] = 1 + min(temp[i-1][j-1], temp[i-1][j], temp[i][j-1]); + } + } + } + printActualEdits(temp, str1, str2); + return temp[str1.length][str2.length]; + + } + + /** + * Prints the actual edits which needs to be done. + */ + public void printActualEdits(int T[][], char[] str1, char[] str2) { + int i = T.length - 1; + int j = T[0].length - 1; + while(true) { + if (i == 0 || j == 0) { + break; + } + if (str1[i-1] == str2[j-1]) { + i = i-1; + j = j-1; + } else if (T[i][j] == T[i-1][j-1] + 1){ + System.out.println("Edit " + str2[j-1] + " in string2 to " + str1[i-1] + " in string1"); + i = i-1; + j = j-1; + } else if (T[i][j] == T[i-1][j] + 1) { + System.out.println("Delete in string1 " + str1[i-1]); + i = i-1; + } else if (T[i][j] == T[i][j-1] + 1){ + System.out.println("Delete in string2 " + str2[j-1]); + j = j -1; + } else { + throw new IllegalArgumentException("Some wrong with given data"); + } + + } + } + + private int min(int a,int b, int c){ + int l = Math.min(a, b); + return Math.min(l, c); + } + + public static void main(String args[]){ + String str1 = "azced"; + String str2 = "abcdef"; + EditDistance editDistance = new EditDistance(); + int result = editDistance.dynamicEditDistance(str1.toCharArray(), str2.toCharArray()); + System.out.print(result); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/EggDropping.java b/showmecode_100/java/com/interview/dynamic/EggDropping.java new file mode 100644 index 00000000..7ee24780 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/EggDropping.java @@ -0,0 +1,52 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-11-egg-dropping-puzzle/ + */ +public class EggDropping { + + public int calculate(int eggs, int floors){ + + int T[][] = new int[eggs+1][floors+1]; + int c =0; + for(int i=0; i <= floors; i++){ + T[1][i] = i; + } + + for(int e = 2; e <= eggs; e++){ + for(int f = 1; f <=floors; f++){ + T[e][f] = Integer.MAX_VALUE; + for(int k = 1; k <=f ; k++){ + c = 1 + Math.max(T[e-1][k-1], T[e][f-k]); + if(c < T[e][f]){ + T[e][f] = c; + } + } + } + } + return T[eggs][floors]; + } + + public int calculateRecursive(int eggs, int floors){ + if(eggs == 1){ + return floors; + } + if(floors == 0){ + return 0; + } + int min = 1000; + for(int i=1; i <= floors; i++){ + int val = 1 + Math.max(calculateRecursive(eggs-1, i-1),calculateRecursive(eggs, floors-i)); + if(val < min){ + min = val; + } + } + return min; + } + + public static void main(String args[]){ + EggDropping ed = new EggDropping(); + int r = ed.calculate(3,100); + System.out.println(r); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/ExpressionEvaluation.java b/showmecode_100/java/com/interview/dynamic/ExpressionEvaluation.java new file mode 100644 index 00000000..631982c8 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/ExpressionEvaluation.java @@ -0,0 +1,100 @@ +package com.interview.dynamic; + +import java.util.HashSet; +import java.util.Set; + +/** + * Date 01/07/2016 + * @author Tushar Roy + * + * Given an expression with +, -, * and / operators. Tell if expression can evaluate to given result with different + * parenthesis combination. + * e.g expresson is 2*3-1 and result is 4, function should return true since 2*(3-1) evaluate to 4. + * + * Time complexity is O(n^5) + * Space complexity is O(n^3) + */ +public class ExpressionEvaluation { + + public boolean evaluate(char[] expression, int result) { + int operands[] = new int[expression.length/2 + 1]; + char operators[] = new char[expression.length/2]; + + int index1 = 0; + int index2 = 0; + operands[index1++] = expression[0] - '0'; + for (int i = 1; i < expression.length; i += 2 ) { + operators[index2++] = expression[i]; + operands[index1++] = expression[i+1] - '0'; + } + + Holder T[][] = new Holder[operands.length][operands.length]; + + for (int i = 0; i < T.length; i++) { + for (int j = 0; j < T.length; j++) { + T[i][j] = new Holder(); + } + } + + for (int i = 0; i < operands.length; i++) { + T[i][i].add(operands[i]); + } + + for (int l = 2; l <= T.length; l++) { + for (int i = 0; i <= T.length - l; i++) { + int j = i + l - 1; + for (int k = i; k < j; k++) { + for (int x : T[i][k].values()) { + for (int y : T[k + 1][j].values()) { + if (operators[k] == '/' && y == 0) { + continue; + } + T[i][j].add(operate(operators[k], x, y)); + } + } + } + } + } + + T[0][T.length-1].values().forEach((i -> System.out.print(i + " "))); + + for (int i : T[0][T.length - 1].values()) { + if ( i == result) { + return true; + } + } + + return false; + } + + private int operate(char operator, int x, int y) { + switch (operator) { + case '+': + return x + y; + case '-': + return x - y; + case '*': + return x*y; + case '/': + return x/y; + default: + throw new IllegalArgumentException(); + } + } + static class Holder { + private Set valueHolder = new HashSet<>(); + void add(Integer ch) { + valueHolder.add(ch); + } + Set values() { + return valueHolder; + } + } + + public static void main(String args[]) { + ExpressionEvaluation ee = new ExpressionEvaluation(); + System.out.println(ee.evaluate("9*3+1/7".toCharArray(), 0)); + } +} + + diff --git a/showmecode_100/java/com/interview/dynamic/FibonacciSeries.java b/showmecode_100/java/com/interview/dynamic/FibonacciSeries.java new file mode 100644 index 00000000..f0fbcf1d --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/FibonacciSeries.java @@ -0,0 +1,64 @@ +package com.interview.dynamic; + +/** + * Date 03/28/2015 + * @author tusroy + * + * Fibonacci series + * Given a number find the fibonacci series value for that number + * e.g n = 3 -> 3 + * n = 4 -> 5 + * n = 5 -> 8 + * + * Solution + * Recursively it can calculated very easily by f(n) = f(n-1) + f(n-2) + * For Dp version we do not recalculate f(n-1) and f(n-2) but keep it in a and b + * + * Test cases + * 1) Negative number + * 2) 0 + * 3) 1 + * 4) Very high number + * + */ +public class FibonacciSeries { + + /** + * DP version where we do not recalculate values but just keep last 2 + * calculate values + */ + public int fibonacciSeries(int n){ + int n1 = 0, n2 = 1; + int sum; + + if (n == n1 || n == n2) { + return n; + } + + for(int i=2; i <= n; i++){ + sum = n1 + n2; + n1 = n2; + n2 = sum; + } + return n2; + } + + + /** + * Recursive and slow version. Recalculates same value over and over again. + * Chokes for n greater than 60 + */ + public int fibonacciSeriesRecursive(int n){ + if(n == 1 || n == 0){ + return n; + } + return fibonacciSeriesRecursive(n-1) + fibonacciSeriesRecursive(n-2); + } + + public static void main(String args[]){ + FibonacciSeries fs = new FibonacciSeries(); + System.out.println(fs.fibonacciSeries(15)); + System.out.println(fs.fibonacciSeriesRecursive(15)); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/Immutable2DSumRangeQuery.java b/showmecode_100/java/com/interview/dynamic/Immutable2DSumRangeQuery.java new file mode 100644 index 00000000..18d350c5 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/Immutable2DSumRangeQuery.java @@ -0,0 +1,53 @@ +package com.interview.dynamic; + +/** + * Date 03/11/2016 + * @author Tushar Roy + * + * Given a 2D array find the sum in given range defining a rectangle. + * + * Time complexity construction O(n*m) + * Time complexity of query O(1) + * Space complexity is O(n*m) + * + * Reference + * https://leetcode.com/problems/range-sum-query-2d-immutable/ + */ +public class Immutable2DSumRangeQuery { + private int[][] T; + + public Immutable2DSumRangeQuery(int[][] matrix) { + int row = 0; + int col = 0; + if (matrix.length != 0) { + row = matrix.length; + col = matrix[0].length; + } + T = new int[row + 1][col + 1]; + for (int i = 1; i < T.length; i++) { + for (int j = 1; j < T[0].length; j++) { + T[i][j] = T[i - 1][j] + T[i][j - 1] + matrix[i - 1][j - 1] - T[i - 1][j - 1]; + } + } + } + + public int sumQuery(int row1, int col1, int row2, int col2) { + row1++; + col1++; + row2++; + col2++; + return T[row2][col2] - T[row1 - 1][col2] - T[row2][col1 - 1] + T[row1 - 1][col1 - 1]; + } + + public static void main(String args[]) { + int[][] input = {{3, 0, 1, 4, 2}, + {5, 6, 3, 2, 1}, + {1, 2, 0, 1, 5}, + {4, 1, 0, 1, 7}, + {1, 0, 3, 0, 5}}; + + int[][] input1 = {{2,0,-3,4}, {6, 3, 2, -1}, {5, 4, 7, 3}, {2, -6, 8, 1}}; + Immutable2DSumRangeQuery isr = new Immutable2DSumRangeQuery(input1); + System.out.println(isr.sumQuery(1, 1, 2, 2)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/Knapsack01.java b/showmecode_100/java/com/interview/dynamic/Knapsack01.java new file mode 100644 index 00000000..bb226d7d --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/Knapsack01.java @@ -0,0 +1,123 @@ +package com.interview.dynamic; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 04/04/2014 + * @author Tushar Roy + * + * 0/1 Knapsack Problem - Given items of certain weights/values and maximum allowed weight + * how to pick items to pick items from this set to maximize sum of value of items such that + * sum of weights is less than or equal to maximum allowed weight. + * + * Time complexity - O(W*total items) + * + * Youtube link + * Topdown DP - https://youtu.be/149WSzQ4E1g + * Bottomup DP - https://youtu.be/8LusJS5-AGo + * + * References - + * http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/ + * https://en.wikipedia.org/wiki/Knapsack_problem + */ +public class Knapsack01 { + + /** + * Solves 0/1 knapsack in bottom up dynamic programming + */ + public int bottomUpDP(int val[], int wt[], int W){ + int K[][] = new int[val.length+1][W+1]; + for(int i=0; i <= val.length; i++){ + for(int j=0; j <= W; j++){ + if(i == 0 || j == 0){ + K[i][j] = 0; + continue; + } + if(j - wt[i-1] >= 0){ + K[i][j] = Math.max(K[i-1][j], K[i-1][j-wt[i-1]] + val[i-1]); + }else{ + K[i][j] = K[i-1][j]; + } + } + } + return K[val.length][W]; + } + + /** + * Key for memoization + */ + class Index { + int remainingWeight; + int remainingItems; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Index index = (Index) o; + + if (remainingWeight != index.remainingWeight) return false; + return remainingItems == index.remainingItems; + + } + + @Override + public int hashCode() { + int result = remainingWeight; + result = 31 * result + remainingItems; + return result; + } + } + + /** + * Solves 0/1 knapsack in top down DP + */ + public int topDownRecursive(int values[], int weights[], int W) { + //map of key(remainingWeight, remainingCount) to maximumValue they can get. + Map map = new HashMap<>(); + return topDownRecursiveUtil(values, weights, W, values.length, 0, map); + } + + public int topDownRecursiveUtil(int values[], int weights[], int remainingWeight, int totalItems, int currentItem, Map map) { + //if currentItem exceeds total item count or remainingWeight is less than 0 then + //just return with 0; + if(currentItem >= totalItems || remainingWeight <= 0) { + return 0; + } + + //fom a key based on remainingWeight and remainingCount + Index key = new Index(); + key.remainingItems = totalItems - currentItem -1; + key.remainingWeight = remainingWeight; + + //see if key exists in map. If so then return the maximumValue for key stored in map. + if(map.containsKey(key)) { + return map.get(key); + } + int maxValue; + //if weight of item is more than remainingWeight then try next item by skipping current item + if(remainingWeight < weights[currentItem]) { + maxValue = topDownRecursiveUtil(values, weights, remainingWeight, totalItems, currentItem + 1, map); + } else { + //try to get maximumValue of either by picking the currentItem or not picking currentItem + maxValue = Math.max(values[currentItem] + topDownRecursiveUtil(values, weights, remainingWeight - weights[currentItem], totalItems, currentItem + 1, map), + topDownRecursiveUtil(values, weights, remainingWeight, totalItems, currentItem + 1, map)); + } + //memoize the key with maxValue found to avoid recalculation + map.put(key, maxValue); + return maxValue; + + } + + public static void main(String args[]){ + Knapsack01 k = new Knapsack01(); + int val[] = {22, 20, 15, 30, 24, 54, 21, 32, 18, 25}; + int wt[] = {4, 2, 3, 5, 5, 6, 9, 7, 8, 10}; + int r = k.bottomUpDP(val, wt, 30); + int r1 = k.topDownRecursive(val, wt, 30); + System.out.println(r); + System.out.println(r1); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/LongestCommonSubsequence.java b/showmecode_100/java/com/interview/dynamic/LongestCommonSubsequence.java new file mode 100644 index 00000000..fab58ed7 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/LongestCommonSubsequence.java @@ -0,0 +1,54 @@ +package com.interview.dynamic; + +/** + http://www.geeksforgeeks.org/dynamic-programming-set-4-longest-common-subsequence/ + */ +public class LongestCommonSubsequence { + + public int lcs(char str1[],char str2[],int len1, int len2){ + + if(len1 == str1.length || len2 == str2.length){ + return 0; + } + if(str1[len1] == str2[len2]){ + return 1 + lcs(str1,str2,len1+1,len2+1); + } + else{ + return Math.max(lcs(str1,str2,len1+1,len2),lcs(str1,str2,len1,len2+1)); + } + } + + public int lcsDynamic(char str1[],char str2[]){ + + int temp[][] = new int[str1.length + 1][str2.length + 1]; + int max = 0; + for(int i=1; i < temp.length; i++){ + for(int j=1; j < temp[i].length; j++){ + if(str1[i-1] == str2[j-1]) { + temp[i][j] = temp[i - 1][j - 1] + 1; + } + else + { + temp[i][j] = Math.max(temp[i][j-1],temp[i-1][j]); + } + if(temp[i][j] > max){ + max = temp[i][j]; + } + } + } + return max; + + } + + public static void main(String args[]){ + LongestCommonSubsequence lcs = new LongestCommonSubsequence(); + String str1 = "ABCDGHLQR"; + String str2 = "AEDPHR"; + + int result = lcs.lcsDynamic(str1.toCharArray(), str2.toCharArray()); + System.out.print(result); + } + + + +} diff --git a/showmecode_100/java/com/interview/dynamic/LongestCommonSubstring.java b/showmecode_100/java/com/interview/dynamic/LongestCommonSubstring.java new file mode 100644 index 00000000..a5b2b1d7 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/LongestCommonSubstring.java @@ -0,0 +1,57 @@ +package com.interview.dynamic; + +/** + * http://en.wikipedia.org/wiki/Longest_common_substring_problem + */ +public class LongestCommonSubstring { + + /** + * Dynamic way of calculating lcs + */ + public int longestCommonSubstring(char str1[], char str2[]){ + int T[][] = new int[str1.length+1][str2.length+1]; + + int max = 0; + for(int i=1; i <= str1.length; i++){ + for(int j=1; j <= str2.length; j++){ + if(str1[i-1] == str2[j-1]){ + T[i][j] = T[i-1][j-1] +1; + if(max < T[i][j]){ + max = T[i][j]; + } + } + } + } + return max; + } + + /** + * Recursive way of calculating lcs + */ + public int longestCommonSubstringRec(char str1[], char str2[], int pos1, int pos2, boolean checkEqual){ + if(pos1 == -1 || pos2 == -1){ + return 0; + } + if(checkEqual){ + if(str1[pos1] == str2[pos2]){ + return 1 + longestCommonSubstringRec(str1, str2, pos1-1, pos2-1, true); + }else{ + return 0; + } + } + int r1 = 0; + if(str1[pos1] == str2[pos2]){ + r1 = 1 + longestCommonSubstringRec(str1, str2, pos1-1, pos2-1, true); + } + return Math.max(r1,Math.max(longestCommonSubstringRec(str1, str2, pos1-1, pos2, false), longestCommonSubstringRec(str1, str2, pos1, pos2-1,false))); + } + + public static void main(String args[]){ + LongestCommonSubstring lcs = new LongestCommonSubstring(); + char str1[] = "abcdef".toCharArray(); + char str2[] = "zcdemf".toCharArray(); + System.out.println(lcs.longestCommonSubstring(str1, str2)); + System.out.println(lcs.longestCommonSubstringRec(str1, str2,str1.length-1, str2.length-1,false)); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/LongestEvenLengthSubstringOfEqualHalf.java b/showmecode_100/java/com/interview/dynamic/LongestEvenLengthSubstringOfEqualHalf.java new file mode 100644 index 00000000..0c93a583 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/LongestEvenLengthSubstringOfEqualHalf.java @@ -0,0 +1,45 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/longest-even-length-substring-sum-first-second-half/ + * Test cases + * Even length string + * odd length string + * 0 length string + */ +public class LongestEvenLengthSubstringOfEqualHalf { + + public int findMaxLength(int input[]){ + assert input != null; + int T[][] = new int[input.length][input.length]; + + for(int i=0; i < T.length; i++){ + T[i][i] = input[i]; + } + int max = 0; + for(int len = 2; len <= input.length; len++){ + for(int i=0; i < input.length - len+1; i++){ + int j = i + len-1; + //updating sum for each lenght + T[i][j] = T[i][j-1] + input[j]; + + if(len % 2 == 0){ + int k = (i + j)/2; + if(T[i][k] == T[k+1][j]){ + if(max < len){ + max = len; + } + } + } + } + } + return max; + } + + public static void main(String args[]){ + int input[] = {1,5,3,8,0,2,14,9}; + LongestEvenLengthSubstringOfEqualHalf lel = new LongestEvenLengthSubstringOfEqualHalf(); + System.out.println(lel.findMaxLength(input)); + + } +} diff --git a/showmecode_100/java/com/interview/dynamic/LongestIncreasingPath.java b/showmecode_100/java/com/interview/dynamic/LongestIncreasingPath.java new file mode 100644 index 00000000..81b1d1fd --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/LongestIncreasingPath.java @@ -0,0 +1,61 @@ +package com.interview.dynamic; + +/** + * Date 03/10/2016 + * @author Tushar Roy + * + * Given a 2D matrix find longest increasing path length in this matrix. + * + * Time complexity is O(n*m) + * Space complexity is O(n*m) + * + * Reference + * https://leetcode.com/problems/longest-increasing-path-in-a-matrix/ + */ +public class LongestIncreasingPath { + + public int longestIncreasingPath(int[][] matrix) { + if (matrix.length == 0 || matrix[0].length == 0) { + return 0; + } + int[][] distance = new int[matrix.length][matrix[0].length]; + int max = 1; + for (int i = 0; i < matrix.length; i++) { + for (int j = 0; j < matrix[0].length; j++) { + int r = dfs(matrix, i, j, distance, Integer.MIN_VALUE); + if (r > max) { + max = r; + } + } + } + return max; + } + + int dfs(int[][] matrix, int i, int j, int[][] distance, int prev) { + if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[i].length) { + return 0; + } + + if (matrix[i][j] <= prev) { + return 0; + } + + if (distance[i][j] != 0) { + return distance[i][j]; + } + + int v1 = dfs(matrix, i - 1, j, distance, matrix[i][j]); + int v2 = dfs(matrix, i, j - 1, distance, matrix[i][j]); + int v3 = dfs(matrix, i + 1, j, distance, matrix[i][j]); + int v4 = dfs(matrix, i, j + 1, distance, matrix[i][j]); + distance[i][j] = 1 + Math.max(Math.max(v1, v2), Math.max(v3, v4)); + return distance[i][j]; + } + + public static void main(String args[]) { + LongestIncreasingPath lip = new LongestIncreasingPath(); + int[][] input = {{9, 9, 4},{6, 6, 8},{2, 1, 1}}; + int[][] input1 = {{3, 4, 5}, {3, 2, 6}, {2, 2, 1}}; + System.out.println(lip.longestIncreasingPath(input)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/LongestIncreasingSubsequence.java b/showmecode_100/java/com/interview/dynamic/LongestIncreasingSubsequence.java new file mode 100644 index 00000000..76080deb --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/LongestIncreasingSubsequence.java @@ -0,0 +1,103 @@ +package com.interview.dynamic; + +/** + * Date 05/02/2014 + * @author tusroy + * + * Youtube link - https://youtu.be/CE2b_-XfVDk + * + * Find a subsequence in given array in which the subsequence's elements are + * in sorted order, lowest to highest, and in which the subsequence is as long as possible + * + * Solution : + * Dynamic Programming is used to solve this question. DP equation is + * if(arr[i] > arr[j]) { T[i] = max(T[i], T[j] + 1 } + * + * Time complexity is O(n^2). + * Space complexity is O(n) + * + * Reference + * http://en.wikipedia.org/wiki/Longest_increasing_subsequence + * http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/ + */ +public class LongestIncreasingSubsequence { + + /** + * DP way of solving LIS + */ + public int longestSubsequenceWithActualSolution(int arr[]){ + int T[] = new int[arr.length]; + int actualSolution[] = new int[arr.length]; + for(int i=0; i < arr.length; i++){ + T[i] = 1; + actualSolution[i] = i; + } + + for(int i=1; i < arr.length; i++){ + for(int j=0; j < i; j++){ + if(arr[i] > arr[j]){ + if(T[j] + 1 > T[i]){ + T[i] = T[j] + 1; + //set the actualSolution to point to guy before me + actualSolution[i] = j; + } + } + } + } + + //find the index of max number in T + int maxIndex = 0; + for(int i=0; i < T.length; i++){ + if(T[i] > T[maxIndex]){ + maxIndex = i; + } + } + + //lets print the actual solution + int t = maxIndex; + int newT = maxIndex; + do{ + t = newT; + System.out.print(arr[t] + " "); + newT = actualSolution[t]; + }while(t != newT); + System.out.println(); + + return T[maxIndex]; + } + + /** + * Recursive way of solving LIS + */ + public int longestSubsequenceRecursive(int arr[]){ + int maxLen = 0; + for(int i=0; i < arr.length-1; i++){ + int len = longestSubsequenceRecursive(arr,i+1,arr[i]); + if(len > maxLen){ + maxLen = len; + } + } + return maxLen + 1; + } + + private int longestSubsequenceRecursive(int arr[], int pos, int lastNum){ + if(pos == arr.length){ + return 0; + } + int t1 = 0; + if(arr[pos] > lastNum){ + t1 = 1 + longestSubsequenceRecursive(arr, pos+1, arr[pos]); + } + int t2 = longestSubsequenceRecursive(arr, pos+1, lastNum); + return Math.max(t1, t2); + } + + public static void main(String args[]){ + LongestIncreasingSubsequence lis = new LongestIncreasingSubsequence(); + int arr[] = {23,10,22,5,33,8,9,21,50,41,60,80,99, 22,23,24,25,26,27}; + int result = lis.longestSubsequenceWithActualSolution(arr); + int result1 = lis.longestSubsequenceRecursive(arr); + System.out.println(result); + System.out.println(result1); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/LongestPalindromicSubsequence.java b/showmecode_100/java/com/interview/dynamic/LongestPalindromicSubsequence.java new file mode 100644 index 00000000..31bf9fce --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/LongestPalindromicSubsequence.java @@ -0,0 +1,62 @@ +package com.interview.dynamic; + +/** + * Date 08/01/2014 + * @author Tushar Roy + * + * Given a string find longest palindromic subsequence in this string. + * + * Time complexity - O(n2) + * Space complexity - O(n2 + * + * Youtube link - https://youtu.be/_nCsPn7_OgI + * + * References + * http://www.geeksforgeeks.org/dynamic-programming-set-12-longest-palindromic-subsequence/ + */ +public class LongestPalindromicSubsequence { + + public int calculate1(char []str){ + int T[][] = new int[str.length][str.length]; + for(int i=0; i < str.length; i++){ + T[i][i] = 1; + } + for(int l = 2; l <= str.length; l++){ + for(int i = 0; i < str.length-l + 1; i++){ + int j = i + l - 1; + if(l == 2 && str[i] == str[j]){ + T[i][j] = 2; + }else if(str[i] == str[j]){ + T[i][j] = T[i + 1][j-1] + 2; + }else{ + T[i][j] = Math.max(T[i + 1][j], T[i][j - 1]); + } + } + } + return T[0][str.length-1]; + } + + + public int calculateRecursive(char str[],int start,int len){ + if(len == 1){ + return 1; + } + if(len ==0){ + return 0; + } + if(str[start] == str[start+len-1]){ + return 2 + calculateRecursive(str,start+1,len-2); + }else{ + return Math.max(calculateRecursive(str, start+1, len-1), calculateRecursive(str, start, len-1)); + } + } + + public static void main(String args[]){ + LongestPalindromicSubsequence lps = new LongestPalindromicSubsequence(); + String str = "agbdba"; + int r1 = lps.calculateRecursive(str.toCharArray(), 0, str.length()); + int r2 = lps.calculate1(str.toCharArray()); + System.out.print(r1 + " " + r2); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/MatrixMultiplicationCost.java b/showmecode_100/java/com/interview/dynamic/MatrixMultiplicationCost.java new file mode 100644 index 00000000..c640f394 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MatrixMultiplicationCost.java @@ -0,0 +1,32 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/ + */ +public class MatrixMultiplicationCost { + + public int findCost(int arr[]){ + int temp[][] = new int[arr.length][arr.length]; + int q = 0; + for(int l=2; l < arr.length; l++){ + for(int i=0; i < arr.length - l; i++){ + int j = i + l; + temp[i][j] = 1000000; + for(int k=i+1; k < j; k++){ + q = temp[i][k] + temp[k][j] + arr[i]*arr[k]*arr[j]; + if(q < temp[i][j]){ + temp[i][j] = q; + } + } + } + } + return temp[0][arr.length-1]; + } + + public static void main(String args[]){ + MatrixMultiplicationCost mmc = new MatrixMultiplicationCost(); + int arr[] = {4,2,3,5,3}; + int cost = mmc.findCost(arr); + System.out.print(cost); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MaxSumForNonAdjacentElements.java b/showmecode_100/java/com/interview/dynamic/MaxSumForNonAdjacentElements.java new file mode 100644 index 00000000..41973c3e --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MaxSumForNonAdjacentElements.java @@ -0,0 +1,83 @@ +package com.interview.dynamic; + +/** + * Date 11/03/2016 + * @author Tushar Roy + * + * Find maximum sum for non adjacent elements. + * Variation is finding maximum sum non adjacent elements assuming its a circular array. + * So first element cannot be with last element. + * + * Time complexity O(n) + * Space complexity O(1) + * + * https://leetcode.com/problems/house-robber/ + * https://leetcode.com/problems/house-robber-ii/ + */ +public class MaxSumForNonAdjacentElements { + + /** + * Fast DP solution. + */ + public int maxSum(int arr[]) { + int excl = 0; + int incl = arr[0]; + for (int i = 1; i < arr.length; i++) { + int temp = incl; + incl = Math.max(excl + arr[i], incl); + excl = temp; + } + return incl; + } + + /** + * Recursive slow solution. + */ + public int maxSum(int arr[], int index) { + if (index == 0) { + return arr[0]; + } else if (index == 1) { + return Math.max(arr[0], arr[1]); + } + return Math.max(this.maxSum(arr, index - 2) + arr[index], this.maxSum(arr, index - 1)); + } + + /** + * Find maximum sum from left to right ignoring first element. + * Find maximum sum from right to left ignoring last element. + * Maximum of two will be the answer. It gurantees that both first and last element + * will be not selected together. + */ + public int maxSumCircularArray(int[] nums) { + if (nums.length == 0) { + return 0; + } + if (nums.length == 1) { + return nums[0]; + } + int with = nums[1]; + int without = 0; + for (int i = 2; i < nums.length; i++) { + int newWith = without + nums[i]; + without = with; + with = Math.max(with, newWith); + } + + int with1 = nums[nums.length - 2]; + int without1 = 0; + for (int i = nums.length - 3; i >= 0; i--) { + int newWith1 = without1 + nums[i]; + without1 = with1; + with1 = Math.max(with1, newWith1); + } + return Math.max(with, with1); + } + + public static void main(String args[]) { + MaxSumForNonAdjacentElements msn = new MaxSumForNonAdjacentElements(); + int arr[] = { 2, 10, 13, 4, 2, 15, 10 }; + System.out.println(msn.maxSum(arr)); + System.out.println(msn.maxSum(arr, arr.length-1)); + + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MaximizeSkiGates.java b/showmecode_100/java/com/interview/dynamic/MaximizeSkiGates.java new file mode 100644 index 00000000..96b2fbed --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MaximizeSkiGates.java @@ -0,0 +1,97 @@ +package com.interview.dynamic; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 11/23/2015 + * @author Tushar Roy + * + * Given starting line and right barrier which is perpendicular to starting line. There are + * n gates at certain distinct distance from right barrier. Starting from start line how do you ski + * such that you can cover maximum number of gates. Changing direction is expensive so you can + * only do limited number of direction changes. + * + * Idea at every gate is to either select this gate or not select this gate. Another decision to make + * is to either change or not change direction at every gate(provided you have remainingDirectionChanges > 0). + * Do recursion and apply memoization to make it top down recursive solution. + */ +public class MaximizeSkiGates { + class Index { + int remainingChanges; + int current; + boolean isRight; + int prevItem; + + Index(int remainingChanges, int current, boolean isRight, int prevItem) { + this.remainingChanges = remainingChanges; + this.current = current; + this.isRight = isRight; + this.prevItem = prevItem; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Index index = (Index) o; + + if (remainingChanges != index.remainingChanges) return false; + if (current != index.current) return false; + if (isRight != index.isRight) return false; + return prevItem == index.prevItem; + + } + + @Override + public int hashCode() { + int result = remainingChanges; + result = 31 * result + current; + result = 31 * result + (isRight ? 1 : 0); + result = 31 * result + prevItem; + return result; + } + } + + public int solution(int gates[], int totalDirectionChanges) { + Map dpMap = new HashMap<>(); + return solution(gates, totalDirectionChanges, 0, false, -1, dpMap); + } + + public int solution(int gates[], int remainingDirectionChanges, int current, boolean isRight, int prevItem, Map dpMap) { + if(current >= gates.length) { + return 0; + } + + Index index = new Index(remainingDirectionChanges, current, isRight, prevItem); + if(dpMap.containsKey(index)) { + return dpMap.get(index); + } + + int val1 = 0, val2 = 0; + //if current gate is picked. + if((isRight && gates[current] < prevItem) || (!isRight && gates[current] > prevItem)) { + //if we decide to continue in same direction. + val1 = 1 + solution(gates, remainingDirectionChanges, current + 1, isRight, gates[current], dpMap); + if(remainingDirectionChanges > 0) { + //if we flip direction. We can only do that if remainingDirectionChanges > 0 + val2 = 1 + solution(gates, remainingDirectionChanges - 1, current + 1, !isRight, gates[current], dpMap); + } + } + + //if current gate is not picked + int val3 = solution(gates, remainingDirectionChanges, current + 1, isRight, prevItem, dpMap); + + //max of all 3 possibilities + int max = Math.max(Math.max(val1, val2), val3); + dpMap.put(index, max); + return max; + } + + public static void main(String args[]) { + int input[] = {15, 13, 5, 7, 4, 10, 12, 8, 2, 11, 6, 9 , 3}; + MaximizeSkiGates sg = new MaximizeSkiGates(); + System.out.println(sg.solution(input, 2)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MaximumLengthChainPair.java b/showmecode_100/java/com/interview/dynamic/MaximumLengthChainPair.java new file mode 100644 index 00000000..322cabe0 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MaximumLengthChainPair.java @@ -0,0 +1,64 @@ +package com.interview.dynamic; + +import java.util.Arrays; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-20-maximum-length-chain-of-pairs/ + */ +public class MaximumLengthChainPair { + + static class Pair implements Comparable{ + public Pair(int a,int b){ + this.a = a; + this.b = b; + } + int a; + int b; + @Override + public int compareTo(Pair o) { + if(this.a <= o.a){ + return -1; + }else{ + return 1; + } + } + } + + public int maxLength(Pair[] arr){ + Arrays.sort(arr); + + int T[] = new int[arr.length+1]; + for(int i=0; i < T.length; i++){ + T[i] = 1; + } + for(int i=2; i < T.length; i++){ + for(int j=1; j < i; j++){ + if(arr[j-1].b < arr[i-1].a){ + T[i] = Math.max(T[j] + 1, T[i]); + } + } + } + + int max =0 ; + for(int i=1; i maxArea){ + maxArea = area; + } + } + return maxArea; + } + + public static void main(String args[]){ + int input[][] = {{1,1,1,0}, + {1,1,1,1}, + {0,1,1,0}, + {0,1,1,1}, + {1,0,0,1}, + {1,1,1,1}}; + MaximumRectangularSubmatrixOf1s mrs = new MaximumRectangularSubmatrixOf1s(); + int maxRectangle = mrs.maximum(input); + //System.out.println("Max rectangle is of size " + maxRectangle); + assert maxRectangle == 8; + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MaximumSizeSubMatrix.java b/showmecode_100/java/com/interview/dynamic/MaximumSizeSubMatrix.java new file mode 100644 index 00000000..70301a43 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MaximumSizeSubMatrix.java @@ -0,0 +1,59 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/maximum-size-sub-matrix-with-all-1s-in-a-binary-matrix/ + */ +public class MaximumSizeSubMatrix { + + private int min(int a,int b, int c){ + int l = Math.min(a, b); + return Math.min(l, c); + } + + public int maxSize(int arr[][]){ + + int result[][] = new int[arr.length][arr[0].length]; + int max = 0; + for(int i=0; i < arr.length; i++){ + result[i][0] = arr[i][0]; + if (result[i][0] == 1) + { + max = 1; + } + } + + for(int i=0; i < arr[0].length; i++){ + result[0][i] = arr[0][i]; + if (result[0][i] == 1) + { + max = 1; + } + + } + + + for(int i=1; i < arr.length; i++){ + for(int j=1; j < arr[i].length; j++){ + if(arr[i][j] == 0){ + continue; + } + int t = min(result[i-1][j],result[i-1][j-1],result[i][j-1]); + result[i][j] = t +1; + if(result[i][j] > max){ + max = result[i][j]; + } + } + } + return max; + } + + + public static void main(String args[]){ + + int arr[][] = {{0,1,1,0,1},{1,1,1,0,0},{1,1,1,1,0},{1,1,1,0,1}}; + MaximumSizeSubMatrix mssm = new MaximumSizeSubMatrix(); + int result = mssm.maxSize(arr); + System.out.print(result); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/MaximumSumSubsequence.java b/showmecode_100/java/com/interview/dynamic/MaximumSumSubsequence.java new file mode 100644 index 00000000..309e890d --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MaximumSumSubsequence.java @@ -0,0 +1,47 @@ +package com.interview.dynamic; + +/** + * Problem Statement: + * + * Given an array of n positive integers. Write a program to find the sum of maximum sum subsequence of the given array + * such that the integers in the subsequence are in increasing order. + * + * + * Video: https://youtu.be/99ssGWhLPUE + * + * Reference: + * http://www.geeksforgeeks.org/dynamic-programming-set-14-maximum-sum-increasing-subsequence/ + */ +public class MaximumSumSubsequence { + + public int maxSum(int arr[]){ + int T[] = new int[arr.length]; + + for (int i = 0; i < T.length; i++) { + T[i] = arr[i]; + } + + for(int i=1; i < T.length; i++){ + for(int j = 0; j < i; j++){ + if(arr[j] < arr[i]){ + T[i] = Math.max(T[i], T[j] + arr[i]); + } + } + } + + int max = T[0]; + for (int i=1; i < T.length; i++){ + if(T[i] > max){ + max = T[i]; + } + } + return max; + } + + public static void main(String args[]){ + MaximumSumSubsequence mss = new MaximumSumSubsequence(); + int arr[] = {1, 101, 10, 2, 3, 100,4}; + int r = mss.maxSum(arr); + System.out.print(r); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MinCostPath.java b/showmecode_100/java/com/interview/dynamic/MinCostPath.java new file mode 100644 index 00000000..909fb9b8 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MinCostPath.java @@ -0,0 +1,63 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-6-min-cost-path/ + */ +public class MinCostPath { + + public int minCost(int [][]cost,int m,int n){ + + int temp[][] = new int[m+1][n+1]; + int sum = 0; + for(int i=0; i <= n; i++){ + temp[0][i] = sum + cost[0][i]; + sum = temp[0][i]; + } + sum = 0; + for(int i=0; i <= m; i++){ + temp[i][0] = sum + cost[i][0]; + sum = temp[i][0]; + } + + for(int i=1; i <= m; i++){ + for(int j=1; j <= n; j++){ + temp[i][j] = cost[i][j] + min(temp[i-1][j-1], temp[i-1][j],temp[i][j-1]); + } + } + return temp[m][n]; + } + + public int minCostRec(int cost[][], int m, int n){ + return minCostRec(cost, m, n, 0 , 0); + } + + public int minCostRec(int cost[][], int m, int n, int x, int y){ + if(x > m || y > n){ + return Integer.MAX_VALUE; + } + if(x == m && y == n){ + return cost[m][n]; + } + + int t1 = minCostRec(cost, m , n, x+1, y); + int t2 = minCostRec(cost, m , n, x+1, y+1); + int t3 = minCostRec(cost, m , n, x, y+1); + + return cost[x][y] + min(t1,t2,t3); + } + + private int min(int a,int b, int c){ + int l = Math.min(a, b); + return Math.min(l, c); + } + + public static void main(String args[]){ + MinCostPath mcp = new MinCostPath(); + int cost[][] = {{1,2,3},{4,8,2},{1,5,3},{6,2,9}}; + int result = mcp.minCost(cost, 3, 2); + int result1 = mcp.minCostRec(cost, 3, 2); + System.out.println(result); + System.out.println(result1); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/MinJumpToReachEnd.java b/showmecode_100/java/com/interview/dynamic/MinJumpToReachEnd.java new file mode 100644 index 00000000..1f792078 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MinJumpToReachEnd.java @@ -0,0 +1,82 @@ +package com.interview.dynamic; + +import java.util.Arrays; + +/** + * Date 06/12/2014 + * @author tusroy + * + * Given an array of non negative integers where each element represents the max + * number of steps that can be made forward from that element. Write a function to + * return the minimum number of jumps to reach the end of the array from first element + * + * Solution + * Have 2 for loop. j trails i. If arr[j] + j >= i then you calculate new jump + * and result. + * + * Space complexity O(n) to maintain result and min jumps + * Time complexity O(n^2) + * + * Reference + * http://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/ + */ +public class MinJumpToReachEnd { + + public int minJump(int arr[],int result[]){ + + int []jump = new int[arr.length]; + jump[0] = 0; + for(int i=1; i < arr.length ; i++){ + jump[i] = Integer.MAX_VALUE-1; + } + + for(int i=1; i < arr.length; i++){ + for(int j=0; j < i; j++){ + if(arr[j] + j >= i){ + if(jump[i] > jump[j] + 1){ + result[i] = j; + jump[i] = jump[j] + 1; + } + } + } + } + + return jump[jump.length-1]; + } + + /** + * https://leetcode.com/problems/jump-game-ii/ + */ + public int jump(int[] nums) { + if (nums.length == 1) { + return 0; + } + int count = 0; + int i = 0; + while (i + nums[i] < nums.length - 1) { + int maxVal = 0; + int maxValIndex = 0; + for (int j = 1; j <= nums[i]; j++) { + if (nums[j + i] + j > maxVal) { + maxVal = nums[j + i] + j; + maxValIndex = i + j; + } + } + i = maxValIndex; + count++; + } + return count + 1; + } + + public static void main(String args[]){ + MinJumpToReachEnd mj = new MinJumpToReachEnd(); + int arr[] = {1,3,5,3,2,2,6,1,6,8,9}; + int r[] = new int[arr.length]; + int result = mj.minJump(arr,r); + System.out.println(result); + int i = arr.length-1; + Arrays.toString(r); + int arr1[] = {2,3,1,1,4}; + System.out.print(mj.jump(arr)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MinimumCostTrainTicket.java b/showmecode_100/java/com/interview/dynamic/MinimumCostTrainTicket.java new file mode 100644 index 00000000..8d9cd18f --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MinimumCostTrainTicket.java @@ -0,0 +1,45 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/find-the-minimum-cost-to-reach-a-destination-where-every-station-is-connected-in-one-direction/ + */ +public class MinimumCostTrainTicket { + + public int minCost(int ticket[][]){ + assert ticket != null && ticket.length > 0 && ticket.length == ticket[0].length; + int T[] = new int[ticket.length]; + int T1[] = new int[ticket.length]; + T1[0] = -1; + for(int i=1; i < T.length; i++){ + T[i] = ticket[0][i]; + T1[i] = i-1; + } + + for(int i=1; i < T.length; i++){ + for(int j=i+1; j < T.length; j++){ + if(T[j] > T[i] + ticket[i][j]){ + T[j] = T[i] + ticket[i][j]; + T1[j] = i; + } + } + } + + //printing actual stations + int i = ticket.length-1; + while(i != -1){ + System.out.print(i + " "); + i = T1[i]; + } + System.out.println(); + return T[ticket.length-1]; + } + + public static void main(String args[]){ + int input[][] = {{0, 15, 80, 90}, + {-1, 0, 40, 50}, + {-1, -1, 0, 70}, + {-1, -1, -1, 0}}; + MinimumCostTrainTicket mctt = new MinimumCostTrainTicket(); + System.out.println(mctt.minCost(input)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MinimumNumberOfPerfectSquares.java b/showmecode_100/java/com/interview/dynamic/MinimumNumberOfPerfectSquares.java new file mode 100644 index 00000000..7953659a --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MinimumNumberOfPerfectSquares.java @@ -0,0 +1,77 @@ +package com.interview.dynamic; + +import java.util.*; + +/** + * Date 10/19/2016 + * @author Tushar Roy + * + * Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n. + * For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9. + * + * Solution 1 - Using DP similar to coin change problem with infinite supply + * Solution 2 - Using a BFS. Put all perfect squares in queue. Then considering each as a node try adding + * another perfect square and see if we can get n. Keep doing this in BFS fashion till you hit the number. + * + * https://leetcode.com/problems/perfect-squares/ + */ +public class MinimumNumberOfPerfectSquares { + public int numSquaresUsingDP(int n) { + int count = (int)Math.ceil(Math.sqrt(n)); + + int[] T = new int[n + 1]; + + T[0] = 0; + + for (int i = 1; i < T.length; i++) { + T[i] = Integer.MAX_VALUE; + for (int j = 1; j <= count; j++) { + if (i < j*j) { + break; + } + T[i] = Math.min(T[i], T[i - j*j] + 1); + } + } + return T[n]; + } + + public int numSquaresUsingBFS(int n) { + List perfectSquares = new ArrayList<>(); + int i = 1; + Queue queue = new LinkedList<>(); + Set visited = new HashSet<>(); + while (true) { + int square = i * i; + if (square == n) { + return 1; + } + if (square > n) { + break; + } + perfectSquares.add(square); + queue.offer(square); + visited.add(square); + i++; + } + int distance = 1; + while (!queue.isEmpty()) { + int size = queue.size(); + distance++; + for (int j = 0; j < size; j++) { + int node = queue.poll(); + for (int square : perfectSquares) { + int sum = node + square; + if (sum == n) { + return distance; + } else if (!visited.contains(sum)) { + visited.add(sum); + queue.add(sum); + } else if (sum > n) { + break; + } + } + } + } + return distance; + } +} diff --git a/showmecode_100/java/com/interview/dynamic/MinimumTriangleSum.java b/showmecode_100/java/com/interview/dynamic/MinimumTriangleSum.java new file mode 100644 index 00000000..2c7c84e0 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/MinimumTriangleSum.java @@ -0,0 +1,26 @@ +package com.interview.dynamic; + +import java.util.List; + +/** + * Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on + * the row below. + * https://leetcode.com/problems/triangle/ + */ +public class MinimumTriangleSum { + public int minimumTotal(List> triangle) { + int n = triangle.size(); + int[] dp = new int[n]; + + for (int i = 0; i < triangle.get(n - 1).size(); i++) { + dp[i] = triangle.get(n - 1).get(i); + } + + for (int i = triangle.size() - 2; i >= 0; i--) { + for (int j = 0; j < triangle.get(i).size(); j++) { + dp[j] = triangle.get(i).get(j) + Math.min(dp[j], dp[j + 1]); + } + } + return dp[0]; + } +} diff --git a/showmecode_100/java/com/interview/dynamic/NPotGold.java b/showmecode_100/java/com/interview/dynamic/NPotGold.java new file mode 100644 index 00000000..93b6a44c --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/NPotGold.java @@ -0,0 +1,79 @@ +package com.interview.dynamic; + +/** + * http://www.glassdoor.com/Interview/N-pots-each-with-some-number-of-gold-coins-are-arranged-in-a-line-You-are-playing-a-game-against-another-player-You-tak-QTN_350584.htm + * @author tusroy + * @author Z. Berkay Celik + */ +public class NPotGold { + + static class Pair{ + int first, second; + int pick=0; + public String toString(){ + return first + " " + second + " " + pick; + } + } + public Pair[][] findMoves(int pots[]){ + + Pair[][] moves = new Pair[pots.length][pots.length]; + + for(int i=0; i < moves.length; i++){ + for(int j=0; j < moves[i].length; j++){ + moves[i][j] = new Pair(); + } + } + + for(int i=0; i < pots.length; i++){ + moves[i][i].first = pots[i]; + //to track the sequence of moves + moves[i][i].pick = i; + } + + for(int l = 2; l <= pots.length; l++){ + for(int i=0; i <= pots.length - l; i++){ + int j = i + l -1; + if(pots[i] + moves[i+1][j].second > moves[i][j-1].second + pots[j]){ + moves[i][j].first = pots[i] + moves[i+1][j].second; + moves[i][j].second = moves[i+1][j].first; + moves[i][j].pick = i; + }else{ + moves[i][j].first = pots[j] + moves[i][j-1].second; + moves[i][j].second = moves[i][j-1].first; + moves[i][j].pick =j; + } + } + } + + return moves; + } + //prints the sequence of values and indexes + public void printSequence(int pots[], Pair moves[][]){ + int i = 0; + int j = pots.length - 1; + int step; + for (int k = 0; k < pots.length; k++) { + step = moves[i][j].pick; + //this is the value of pick and its index + System.out.print("value: " + pots[step] + " " + "index: " + step + " "); + if (step <= i) { + i = i + 1; + } else { + j = j - 1; + } + } + } + public static void main(String args[]){ + NPotGold npg = new NPotGold(); + int pots[] = {3,1,5,6,2,9,3}; + Pair[][] moves = npg.findMoves(pots); + for(int i=0; i < moves.length; i++){ + for(int j=0; j < moves[i].length; j++){ + System.out.print(moves[i][j] + " "); + } + System.out.print("\n"); + } + System.out.println("The moves by first player and second player:"); + npg.printSequence(pots, moves); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/NumberOfPathsInMxNMatrix.java b/showmecode_100/java/com/interview/dynamic/NumberOfPathsInMxNMatrix.java new file mode 100644 index 00000000..cd1abbd7 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/NumberOfPathsInMxNMatrix.java @@ -0,0 +1,37 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/count-possible-paths-top-left-bottom-right-nxm-matrix/ + */ +public class NumberOfPathsInMxNMatrix { + + public int countPathsRecursive(int n, int m){ + if(n == 1 || m == 1){ + return 1; + } + return countPathsRecursive(n-1, m) + countPathsRecursive(n, m-1); + } + + public int countPaths(int n,int m){ + int T[][] = new int[n][m]; + for(int i=0; i < n; i++){ + T[i][0] = 1; + } + + for(int i=0; i < m; i++){ + T[0][i] = 1; + } + for(int i=1; i < n; i++){ + for(int j=1; j < m; j++){ + T[i][j] = T[i-1][j] + T[i][j-1]; + } + } + return T[n-1][m-1]; + } + + public static void main(String args[]){ + NumberOfPathsInMxNMatrix nop = new NumberOfPathsInMxNMatrix(); + System.out.print(nop.countPathsRecursive(3,3)); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/NumberOfWaysToScorePoints.java b/showmecode_100/java/com/interview/dynamic/NumberOfWaysToScorePoints.java new file mode 100644 index 00000000..e986d6a7 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/NumberOfWaysToScorePoints.java @@ -0,0 +1,47 @@ +package com.interview.dynamic; + +/** + * Finding the number of ways a given score could be reached for a game with 3 different ways of scoring (e.g. 3, 5 and 10 points). + *test case + *what happens if total can't be formed with given values + *what if numbers are 0 or negative + */ +public class NumberOfWaysToScorePoints { + + //in this version to make 3 - 1,2 is same as 2,1. + //This is similar to coin changing problem + public int version1(int score[],int total){ + int T[] = new int[total+1]; + T[0] = 1; + for(int i=0; i < score.length; i++){ + for(int j=1; j <= total; j++){ + if(score[i] <= j){ + T[j] += T[j-score[i]]; + } + } + } + return T[total]; + } + + //in this version to make 3 - 1,2 and 2,1 are counted different. + //This is same as fibo series only that fibo series looks at last 2 numbers and here we look back k values + public int version2(int score[],int total){ + int T[] = new int[total+1]; + T[0] = 1; + for(int i=1; i <= total ; i++){ + for(int j=0; j < score.length; j++){ + if(score[j] <= i){ + T[i] += T[i-score[j]]; + } + } + } + return T[total]; + } + + public static void main(String args[]){ + int score[] = {1,2,3}; + NumberOfWaysToScorePoints now = new NumberOfWaysToScorePoints(); + System.out.println(now.version1(score, 4)); + System.out.println(now.version2(score, 4)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/OptimalTreeSearch.java b/showmecode_100/java/com/interview/dynamic/OptimalTreeSearch.java new file mode 100644 index 00000000..6f947297 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/OptimalTreeSearch.java @@ -0,0 +1,71 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/dynamic-programming-set-24-optimal-binary-search-tree/ + */ +public class OptimalTreeSearch { + + public int minCostRec(int input[],int freq[]){ + + return minCostRec(input,freq,0,input.length-1,1); + } + + private int minCostRec(int input[],int freq[],int low,int high,int level){ + if(low > high){ + return 0; + } + + int min = Integer.MAX_VALUE; + for(int i=low; i <= high; i++){ + int val = minCostRec(input,freq,low,i-1,level+1) + + minCostRec(input,freq,i+1,high,level+1) + + level*freq[i]; + if(val < min){ + min = val; + } + } + return min; + } + + public int minCost(int input[], int freq[]){ + int T[][] = new int[input.length][input.length]; + + for(int i=0; i < T.length; i++){ + T[i][i] = freq[i]; + } + + for(int l = 2; l <= input.length; l++){ + for(int i=0; i <= input.length-l; i++){ + int j = i + l -1; + T[i][j] = Integer.MAX_VALUE; + int sum = getSum(freq, i, j); + + for(int k=i; k <= j; k++){ + int val = sum + (k-1 < i ? 0 : T[i][k-1]) + + (k+1 > j ? 0 : T[k+1][j]) ; + if(val < T[i][j]){ + T[i][j] = val; + } + } + } + } + return T[0][input.length-1]; + } + + private int getSum(int freq[], int i, int j){ + int sum = 0; + for(int x = i; x <= j; x++){ + sum += freq[x]; + } + return sum; + } + + + public static void main(String args[]){ + int input[] = {10,12,20,35,46}; + int freq[] = {34,8,50,21,16}; + OptimalTreeSearch ots = new OptimalTreeSearch(); + System.out.println(ots.minCost(input, freq)); + System.out.println(ots.minCostRec(input, freq)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/PaintHouse.java b/showmecode_100/java/com/interview/dynamic/PaintHouse.java new file mode 100644 index 00000000..a7d774c6 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/PaintHouse.java @@ -0,0 +1,100 @@ +package com.interview.dynamic; + +/** + * Paint House + * https://leetcode.com/problems/paint-house/ + * https://leetcode.com/problems/paint-house-ii/ + */ +public class PaintHouse { + + public int minCostTopDownPainHouse1or2(int[][] costs) { + if (costs.length == 0) { + return 0; + } + int[][] dp = new int[costs.length][3]; + return minCostUtil(costs, 0, -1, 3, dp); + } + + private int minCostUtil(int[][] costs, int house, int prevColor, int k, int[][] dp) { + if (house == costs.length) { + return 0; + } + int min = Integer.MAX_VALUE; + for (int i = 0; i < k; i++) { + if (i == prevColor) { + continue; + } + int val; + if (dp[house][i] != 0) { + val = dp[house][i]; + } else { + val = costs[house][i] + minCostUtil(costs, house + 1, i, k, dp); + dp[house][i] = val; + } + min = Math.min(min, val); + } + return min; + } + + public int minCostBottomUpPaintHouse2(int[][] costs) { + if (costs.length == 0 || costs[0].length == 0) { + return 0; + } + int[][] dp = new int[costs.length][costs[0].length]; + for (int i = 0; i < costs[0].length; i++) { + dp[0][i] = costs[0][i]; + } + + for (int i = 1; i < costs.length; i++) { + Pair p = findMinSecondMin(dp[i - 1]); + for (int j = 0; j < costs[0].length; j++) { + dp[i][j] = costs[i][j]; + if (j == p.minIndex) { + dp[i][j] += dp[i-1][p.secondMinIndex]; + } else { + dp[i][j] += dp[i-1][p.minIndex]; + } + } + } + int min = Integer.MAX_VALUE; + for (int i = 0; i < dp[0].length; i++) { + min = Math.min(min, dp[dp.length - 1][i]); + } + return min; + } + + class Pair { + int minIndex; + int secondMinIndex; + } + + private Pair findMinSecondMin(int[] input) { + int minIndex; + int secondMinIndex; + if (input[0] < input[1]) { + minIndex = 0; + secondMinIndex = 1; + } else { + minIndex = 1; + secondMinIndex = 0; + } + for (int i = 2; i < input.length; i++) { + if (input[i] < input[minIndex]) { + secondMinIndex = minIndex; + minIndex = i; + } else if (input[i] < input[secondMinIndex]) { + secondMinIndex = i; + } + } + Pair p = new Pair(); + p.minIndex = minIndex; + p.secondMinIndex = secondMinIndex; + return p; + } + + public static void main(String args[]) { + PaintHouse ph = new PaintHouse(); + int[][] input = {{1, 2, 1}, {1, 4, 5}, {2, 6, 1}, {3, 3, 2}}; + System.out.println(ph.minCostBottomUpPaintHouse2(input)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/PalindromePartition.java b/showmecode_100/java/com/interview/dynamic/PalindromePartition.java new file mode 100644 index 00000000..a66461e7 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/PalindromePartition.java @@ -0,0 +1,93 @@ +package com.interview.dynamic; + +import java.util.*; + +/** + * Date 04/03/2016 + * @author Tushar Roy + * + * Partitioning the string into palindromes. + * + * https://leetcode.com/problems/palindrome-partitioning/ + * https://leetcode.com/problems/palindrome-partitioning-ii/ + */ +public class PalindromePartition { + + /* + * Given a string s, partition s such that every substring of the partition is a palindrome. + * Return the minimum cuts needed for a palindrome partitioning of s. + * https://leetcode.com/problems/palindrome-partitioning-ii/ + */ + public int minCut(String str){ + if (str.length() == 0) { + return 0; + } + + int[] cut = new int[str.length()]; + boolean isPal[][] = new boolean[str.length()][str.length()]; + for (int i = 1; i < str.length(); i++) { + int min = i; + for (int j = 0; j <= i; j++) { + if (str.charAt(i) == str.charAt(j) && (i <= j + 1 || isPal[i - 1][j + 1])) { + isPal[i][j] = true; + min = Math.min(min, j == 0 ? 0 : 1 + cut[j - 1]); + } + } + cut[i] = min; + } + return cut[str.length() - 1]; + } + + /** + * Given a string s, partition s such that every substring of the partition is a palindrome. + * https://leetcode.com/problems/palindrome-partitioning/ + */ + public List> partition(String s) { + Map>> dp = new HashMap<>(); + List> result = partitionUtil(s, dp, 0); + List> r = new ArrayList<>(); + for (List l : result) { + r.add(l); + } + return r; + } + + private List> partitionUtil(String s, Map>> dp, int start) { + if (start == s.length()) { + List r = new ArrayList<>(); + return Collections.singletonList(r); + } + + if (dp.containsKey(start)) { + return dp.get(start); + } + + List> words = new ArrayList<>(); + for (int i = start; i < s.length(); i++) { + if (!isPalindrome(s, start, i) ) { + continue; + } + String newWord = s.substring(start, i + 1); + List> result = partitionUtil(s, dp, i + 1); + for (List l : result) { + List l1 = new ArrayList<>(); + l1.add(newWord); + l1.addAll(l); + words.add(l1); + } + } + dp.put(start, words); + return words; + } + + private boolean isPalindrome(String str, int r, int t) { + while(r < t) { + if (str.charAt(r) != str.charAt(t)) { + return false; + } + r++; + t--; + } + return true; + } +} diff --git a/showmecode_100/java/com/interview/dynamic/PhoneDialNumberOfCombinationOfSizeK.java b/showmecode_100/java/com/interview/dynamic/PhoneDialNumberOfCombinationOfSizeK.java new file mode 100644 index 00000000..e51dfc17 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/PhoneDialNumberOfCombinationOfSizeK.java @@ -0,0 +1,95 @@ +package com.interview.dynamic; + +import java.util.HashMap; +import java.util.Map; + +/** + * Given the mobile numeric keypad. You can only press buttons that are + * up,left,right or down to the current button.You are not allowed to press + * bottom row corner buttons (i.e. * and # ).Given a N find out the number of + * numbers possible of given length. + * + * The idea is that to calculate for i all you have to do is add up i-1 values of all the neighbors. + * e.g for i =2 and at 0 you need find i=1s of all neighbors including 0 and add them up. + */ +public class PhoneDialNumberOfCombinationOfSizeK { + + /** + * -1 in the input means don't use that position + * + * @param k + * @param input + * @return + */ + public int numberOfCombination(int k, int input[][]) { + if (input == null || input.length == 0) { + throw new IllegalArgumentException(); + } + Map t = new HashMap(); + Map t1 = new HashMap(); + + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[i].length; j++) { + if (input[i][j] < 0) { + continue; + } + t1.put(input[i][j], 1); + } + } + + for (int x = 1; x < k; x++) { + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[i].length; j++) { + if (input[i][j] < 0) { + continue; + } + findNeighborsAndPopulateMap(i, j, input, t, t1); + } + } + copyMap(t, t1); + t.clear(); + } + int count = 0; + for (int i : t1.keySet()) { + count += t1.get(i); + } + return count; + } + + private void copyMap(Map t, Map t1) { + for (Integer i : t.keySet()) { + int c = t.get(i); + t1.put(i, c); + } + } + + private void findNeighborsAndPopulateMap(int x, int y, int input[][], + Map t, Map t1) { + updateMap(input, x, y, x - 1, y, t, t1); + updateMap(input, x, y, x, y - 1, t, t1); + updateMap(input, x, y, x, y, t, t1); + updateMap(input, x, y, x, y + 1, t, t1); + updateMap(input, x, y, x + 1, y, t, t1); + } + + private void updateMap(int input[][], int x, int y, int i, int j, + Map t, Map t1) { + if (i < 0 || i >= input.length || j < 0 || j >= input[x].length + || input[i][j] < 0) { + return; + } + Integer c = t.get(input[x][y]); + if (c == null) { + c = 0; + } + c += t1.get(input[i][j]); + t.put(input[x][y], c); + } + + public static void main(String args[]) { + int input[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { -1, 0, -1 } }; + PhoneDialNumberOfCombinationOfSizeK pdn = new PhoneDialNumberOfCombinationOfSizeK(); + System.out.println(pdn.numberOfCombination(3, input)); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/RegexMatching.java b/showmecode_100/java/com/interview/dynamic/RegexMatching.java new file mode 100644 index 00000000..af722486 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/RegexMatching.java @@ -0,0 +1,92 @@ +package com.interview.dynamic; +/** + * Date 06/24/2015 + * @author Tushar Roy + * + * Write a program to perform regex matching with * an . + * + * References : http://leetcode.com/2011/09/regular-expression-matching.html + */ +public class RegexMatching { + + public boolean matchRegexRecursive(char[] str, char[] pattern){ + return matchRegexRecursive(str,pattern,0,0); + } + + private boolean matchRegexRecursive(char text[], char pattern[], int pos1, int pos2){ + //if pos2 has reached end of pattern means pos2 should also reach end of text for match + //to happen + if(pos2 == pattern.length) { + return pos1 == text.length; + } + + //if next character is not * means either current value at pattern and text should be same + //or current value at pattern should be . in which case you can skip one character of text + if(pos2 == pattern.length - 1 || pattern[pos2+1] != '*') { + return (pos1 < text.length && (text[pos1] == pattern[pos2] || pattern[pos2] == '.')) && matchRegexRecursive(text, pattern, pos1+1, pos2+1); + } + + //if we have case like abc and ad*bc so here we totally skip d* + if(matchRegexRecursive(text, pattern, pos1, pos2+2)){ + return true; + } + + //For case like abbc and ab*c match first b with b* and then next b to c. If that does not work out + //then try next b with b* and then c with c and so on. + //if pattern current val is . then skip one character at time from text till we either reach end of text + //or a match is found + while(pos1 < text.length && (text[pos1] == pattern[pos2] || pattern[pos2] == '.')){ + if( matchRegexRecursive(text, pattern, pos1+1, pos2+2)){ + return true; + } + pos1++; + } + return false; + } + + /** + * Dynamic programming technique for regex matching. + */ + public boolean matchRegex(char[] text, char[] pattern) { + boolean T[][] = new boolean[text.length + 1][pattern.length + 1]; + + T[0][0] = true; + //Deals with patterns like a* or a*b* or a*b*c* + for (int i = 1; i < T[0].length; i++) { + if (pattern[i-1] == '*') { + T[0][i] = T[0][i - 2]; + } + } + + for (int i = 1; i < T.length; i++) { + for (int j = 1; j < T[0].length; j++) { + if (pattern[j - 1] == '.' || pattern[j - 1] == text[i - 1]) { + T[i][j] = T[i-1][j-1]; + } else if (pattern[j - 1] == '*') { + T[i][j] = T[i][j - 2]; + if (pattern[j-2] == '.' || pattern[j - 2] == text[i - 1]) { + T[i][j] = T[i][j] | T[i - 1][j]; + } + } else { + T[i][j] = false; + } + } + } + return T[text.length][pattern.length]; + } + + public static void main(String args[]){ + RegexMatching rm = new RegexMatching(); + System.out.println(rm.matchRegexRecursive("Tushar".toCharArray(),"Tushar".toCharArray())); + System.out.println(rm.matchRegexRecursive("Tusha".toCharArray(),"Tushar*a*b*".toCharArray())); + System.out.println(rm.matchRegexRecursive("".toCharArray(),"a*b*".toCharArray())); + System.out.println(rm.matchRegexRecursive("abbbbccc".toCharArray(),"a*ab*bbbbc*".toCharArray())); + System.out.println(rm.matchRegexRecursive("abbbbccc".toCharArray(),"aa*bbb*bbbc*".toCharArray())); + System.out.println(rm.matchRegexRecursive("abbbbccc".toCharArray(),".*bcc".toCharArray())); + System.out.println(rm.matchRegexRecursive("abbbbccc".toCharArray(),".*bcc*".toCharArray())); + System.out.println(rm.matchRegexRecursive("abbbbccc".toCharArray(),".*bcc*".toCharArray())); + System.out.println(rm.matchRegexRecursive("aaa".toCharArray(),"ab*a*c*a".toCharArray())); + + System.out.println(rm.matchRegex("aa".toCharArray(), "a*".toCharArray())); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/RemoveFromEndToMake2IntoMinGreaterThanMax.java b/showmecode_100/java/com/interview/dynamic/RemoveFromEndToMake2IntoMinGreaterThanMax.java new file mode 100644 index 00000000..60c8c4a2 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/RemoveFromEndToMake2IntoMinGreaterThanMax.java @@ -0,0 +1,65 @@ +package com.interview.dynamic; + +/** + * http://www.geeksforgeeks.org/remove-minimum-elements-either-side-2min-max/ + */ +public class RemoveFromEndToMake2IntoMinGreaterThanMax { + + public int removeFromEnd(int input[]){ + return removeFromEnd(input,0,input.length-1); + } + + private int removeFromEnd(int input[],int low,int high){ + if(low > high){ + return input.length; + } + int min = min(input,low,high); + int max = max(input,low,high); + if(2*min > max){ + return 0; + } + + return Math.min(removeFromEnd(input,low,high-1), removeFromEnd(input,low+1,high)) +1; + } + + private int min(int input[],int low,int high){ + int min = Integer.MAX_VALUE; + for(int i=low; i <=high; i++){ + if(min > input[i]){ + min = input[i]; + } + } + return min; + } + private int max(int input[],int low,int high){ + int max = Integer.MIN_VALUE; + for(int i=low; i <=high; i++){ + if(max < input[i]){ + max = input[i]; + } + } + return max; + } + + public int removeFromEndDynamic(int input[]){ + int T[][] = new int[input.length][input.length]; + for(int l=1; l <= input.length; l++){ + for(int i=0, j = i + l-1; i < input.length-l+1; i++,j++){ + int min = min(input,i,j); + int max = max(input,i,j); + if(2*min > max){ + T[i][j] = 0; + }else{ + T[i][j] = Math.min(T[i+1][j] , T[i][j-1]) +1; + } + } + } + return T[0][input.length-1]; + } + public static void main(String args[]){ + int input[] = {5,1,3,1,3,8,3}; + RemoveFromEndToMake2IntoMinGreaterThanMax rme = new RemoveFromEndToMake2IntoMinGreaterThanMax(); + System.out.println(rme.removeFromEnd(input)); + System.out.println(rme.removeFromEndDynamic(input)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/ScrambledString.java b/showmecode_100/java/com/interview/dynamic/ScrambledString.java new file mode 100644 index 00000000..61e335d1 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/ScrambledString.java @@ -0,0 +1,138 @@ +package com.interview.dynamic; + +import java.util.HashMap; +import java.util.Map; + +/** + * Read question at https://leetcode.com/problems/scramble-string/ + */ +public class ScrambledString { + + /** + * Index for memoization. + */ + private static class Index { + int start1; + int end1; + int start2; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Index index = (Index) o; + + if (start1 != index.start1) return false; + if (end1 != index.end1) return false; + if (start2 != index.start2) return false; + return end2 == index.end2; + + } + + @Override + public int hashCode() { + int result = start1; + result = 31 * result + end1; + result = 31 * result + start2; + result = 31 * result + end2; + return result; + } + + int end2; + } + + boolean isScrambled(char input1[], char input2[], int start1, int end1, int start2, int end2, Map memMap) { + + //return false conditions + if(start1 > end1 || start2 > end2) { + return false; + } + if(end1 - start1 != end2 - start2) { + return false; + } + + Index index = new Index(); + index.start1 = start1; + index.end1 = end1; + index.start2 = start2; + index.end2 = end2; + + //if we have already calculated value for index then lets use it instead of recalculating again. + if(memMap.containsKey(index)) { + return memMap.get(index); + } + + //if both input from their respective start to end are same then return true. + boolean isSame = true; + for(int i= start1, j = start2; i <= end1 && j <= end2; i++, j++) { + if(input1[i] != input2[j]) { + isSame = false; + break; + } + } + + if(isSame) { + memMap.put(index, true); + return true; + } + + + //check if both input from their respective start to end have same characters. If not then return false. + Map countMap = new HashMap<>(); + for(int i= start1; i <= end1; i++) { + countMap.compute(input1[i], (ch, val) -> { + if(val == null) { + return 1; + } else { + return val + 1; + } + }); + } + + for(int i= start2; i <= end2; i++) { + countMap.compute(input2[i], (ch, val) -> { + if(val == null) { + return -1; + } else { + return val - 1; + } + }); + } + + //all values in map should have value 0 otherwise there is character mismatch. Return false in that case. + long nonZeroCount = countMap.values().stream().filter(val -> val !=0 ).count(); + if(nonZeroCount > 0) { + memMap.put(index, false); + return false; + } + + //for values from input range try splitting into 2 and check recursively if they match or not. + for(int len = 0; len < end1 - start1; len++) { + //e.g great gtear so match g ,g and reat, tear + if(isScrambled(input1, input2, start1, start1 + len, start2, start2 + len, memMap) && + isScrambled(input1, input2, start1 + len +1, end1, start2 + len + 1, end2, memMap)) { + memMap.put(index, true); + return true; + } + //e.g great reatg so match g,g and reat,reat + if(isScrambled(input1, input2, start1, start1 + len, end2 - len, end2, memMap) && + isScrambled(input1, input2, start1 + len +1, end1, start2, end2 - len -1, memMap)) { + memMap.put(index, true); + return true; + } + } + memMap.put(index, false); + return false; + } + + public static void main(String args[]) { + ScrambledString ss = new ScrambledString(); + String str1 = "great"; + String str2 = "rgtae"; + Map memMap = new HashMap<>(); + boolean result = ss.isScrambled(str1.toCharArray(), str2.toCharArray(), 0, str1.length() - 1, 0, str2.length() -1, memMap); + System.out.println(result); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/StockBuySellKTransactions.java b/showmecode_100/java/com/interview/dynamic/StockBuySellKTransactions.java new file mode 100644 index 00000000..6068014a --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/StockBuySellKTransactions.java @@ -0,0 +1,149 @@ +package com.interview.dynamic; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * Date 12/22/2015 + * @author Tushar Roy + * + * Given stockc prices for certain days and at most k transactions how to buy and sell + * to maximize profit. + * + * Time complexity - O(number of transactions * number of days) + * Space complexity - O(number of transcations * number of days) + * + * https://leetcode.com/discuss/15153/a-clean-dp-solution-which-generalizes-to-k-transactions + */ +public class StockBuySellKTransactions { + + /** + * Below solution is accepted by leetcode and runs in space proportional to prices length. + */ + public int maxProfitLinearSpace(int k, int[] prices) { + if (k == 0 || prices.length == 0) { + return 0; + } + + if (k >= prices.length) { + return allTimeProfit(prices); + } + int[] T = new int[prices.length]; + int[] prev = new int[prices.length]; + for (int i = 1; i <= k; i++) { + int maxDiff = -prices[0]; + for (int j = 1; j < prices.length; j++) { + T[j] = Math.max(T[j - 1], maxDiff + prices[j]); + maxDiff = Math.max(maxDiff, prev[j] - prices[j]); + } + for (int j = 1; j < prices.length; j++) { + prev[j] = T[j]; + } + } + return T[T.length - 1]; + } + + public int allTimeProfit(int arr[]){ + int profit = 0; + int localMin = arr[0]; + for(int i=1; i < arr.length;i++){ + if(arr[i-1] >= arr[i]){ + localMin = arr[i]; + }else{ + profit += arr[i] - localMin; + localMin = arr[i]; + } + + } + return profit; + } + + /** + * This is faster method which does optimization on slower method + * Time complexity here is O(K * number of days) + * + * Formula is + * T[i][j] = max(T[i][j-1], prices[j] + maxDiff) + * maxDiff = max(maxDiff, T[i-1][j] - prices[j]) + */ + public int maxProfit(int prices[], int K) { + if (K == 0 || prices.length == 0) { + return 0; + } + int T[][] = new int[K+1][prices.length]; + + for (int i = 1; i < T.length; i++) { + int maxDiff = -prices[0]; + for (int j = 1; j < T[0].length; j++) { + T[i][j] = Math.max(T[i][j-1], prices[j] + maxDiff); + maxDiff = Math.max(maxDiff, T[i-1][j] - prices[j]); + } + } + printActualSolution(T, prices); + return T[K][prices.length-1]; + } + + /** + * This is slow method but easier to understand. + * Time complexity is O(k * number of days ^ 2) + * T[i][j] = max(T[i][j-1], max(prices[j] - prices[m] + T[i-1][m])) where m is 0...j-1 + */ + public int maxProfitSlowSolution(int prices[], int K) { + if (K == 0 || prices.length == 0) { + return 0; + } + int T[][] = new int[K+1][prices.length]; + + for (int i = 1; i < T.length; i++) { + for (int j = 1; j < T[0].length; j++) { + int maxVal = 0; + for (int m = 0; m < j; m++) { + maxVal = Math.max(maxVal, prices[j] - prices[m] + T[i-1][m]); + } + T[i][j] = Math.max(T[i][j-1], maxVal); + } + } + printActualSolution(T, prices); + return T[K][prices.length - 1]; + } + + public void printActualSolution(int T[][], int prices[]) { + int i = T.length - 1; + int j = T[0].length - 1; + + Deque stack = new LinkedList<>(); + while(true) { + if(i == 0 || j == 0) { + break; + } + if (T[i][j] == T[i][j-1]) { + j = j - 1; + } else { + stack.addFirst(j); + int maxDiff = T[i][j] - prices[j]; + for (int k = j-1; k >= 0; k--) { + if (T[i-1][k] - prices[k] == maxDiff) { + i = i - 1; + j = k; + stack.addFirst(j); + break; + } + } + } + } + + while(!stack.isEmpty()) { + System.out.println("Buy at price " + prices[stack.pollFirst()]); + System.out.println("Sell at price " + prices[stack.pollFirst()]); + } + + } + + public static void main(String args[]) { + StockBuySellKTransactions sbt = new StockBuySellKTransactions(); + int prices[] = {2, 5, 7, 1, 4, 3, 1, 3}; + + System.out.println("Max profit fast solution " + sbt.maxProfit(prices, 3)); + System.out.println("Max profit slow solution " + sbt.maxProfitSlowSolution(prices, 3)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/SubRectangularMatrixWithMaximumSum.java b/showmecode_100/java/com/interview/dynamic/SubRectangularMatrixWithMaximumSum.java new file mode 100644 index 00000000..58f5ceca --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/SubRectangularMatrixWithMaximumSum.java @@ -0,0 +1,106 @@ +package com.interview.dynamic; + +/** + * Date 07/31/2014 + * @author tusroy + * + * Write a program to find maximum sum rectangle in give 2D matrix. + * Assume there is at least one positive number in the 2D matrix. + * + * Solution: + * Keep temp array with size as number of rows. Start left and right from 0 + * and keep adding values for each row and maintain them in this temp array. + * Run Kadane's algorithm to find max sum subarray in temp. Now increment right by + * 1. When right reaches last column reset right to 1 and left to 1. + * + * Space complexity of this algorithm is O(row) + * Time complexity of this algorithm is O(row*col*col) + * + * References + * http://www.geeksforgeeks.org/dynamic-programming-set-27-max-sum-rectangle-in-a-2d-matrix/ + */ +public class SubRectangularMatrixWithMaximumSum { + + class Result{ + int maxSum; + int leftBound; + int rightBound; + int upBound; + int lowBound; + @Override + public String toString() { + return "Result [maxSum=" + maxSum + ", leftBound=" + leftBound + + ", rightBound=" + rightBound + ", upBound=" + upBound + + ", lowBound=" + lowBound + "]"; + } + + } + + public Result maxSum(int input[][]){ + int rows = input.length; + int cols = input[0].length; + int temp[] = new int[rows]; + Result result = new Result(); + for(int left = 0; left < cols ; left++){ + for(int i=0; i < rows; i++){ + temp[i] = 0; + } + for(int right = left; right < cols; right++){ + for(int i=0; i < rows; i++){ + temp[i] += input[i][right]; + } + KadaneResult kadaneResult = kadane(temp); + if(kadaneResult.maxSum > result.maxSum){ + result.maxSum = kadaneResult.maxSum; + result.leftBound = left; + result.rightBound = right; + result.upBound = kadaneResult.start; + result.lowBound = kadaneResult.end; + } + } + } + return result; + } + + class KadaneResult{ + int maxSum; + int start; + int end; + public KadaneResult(int maxSum, int start, int end) { + this.maxSum = maxSum; + this.start = start; + this.end = end; + } + } + + private KadaneResult kadane(int arr[]){ + int max = 0; + int maxStart = -1; + int maxEnd = -1; + int currentStart = 0; + int maxSoFar = 0; + for(int i=0; i < arr.length; i++){ + maxSoFar += arr[i]; + if(maxSoFar < 0){ + maxSoFar = 0; + currentStart = i+1; + } + if(max < maxSoFar){ + maxStart = currentStart; + maxEnd = i; + max = maxSoFar; + } + } + return new KadaneResult(max, maxStart, maxEnd); + } + + + public static void main(String args[]){ + int input[][] = {{ 2, 1, -3, -4, 5}, + { 0, 6, 3, 4, 1}, + { 2, -2, -1, 4, -5}, + {-3, 3, 1, 0, 3}}; + SubRectangularMatrixWithMaximumSum saw = new SubRectangularMatrixWithMaximumSum(); + System.out.println(saw.maxSum(input)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/SubsetSum.java b/showmecode_100/java/com/interview/dynamic/SubsetSum.java new file mode 100644 index 00000000..e9f9b6a9 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/SubsetSum.java @@ -0,0 +1,74 @@ +package com.interview.dynamic; +/* + * Date 09/23/2014 + * @author Tushar Roy + * + * Given an array of non negative numbers and a total, is there subset of numbers in this array which adds up + * to given total. Another variation is given an array is it possible to split it up into 2 equal + * sum partitions. Partition need not be equal sized. Just equal sum. + * + * Time complexity - O(input.size * total_sum) + * Space complexity - O(input.size*total_sum) + * + * Youtube video - https://youtu.be/s6FhG--P7z0 + */ +public class SubsetSum { + + public boolean subsetSum(int input[], int total) { + + boolean T[][] = new boolean[input.length + 1][total + 1]; + for (int i = 0; i <= input.length; i++) { + T[i][0] = true; + } + + for (int i = 1; i <= input.length; i++) { + for (int j = 1; j <= total; j++) { + if (j - input[i - 1] >= 0) { + T[i][j] = T[i - 1][j] || T[i - 1][j - input[i - 1]]; + } else { + T[i][j] = T[i-1][j]; + } + } + } + return T[input.length][total]; + + } + + public boolean partition(int arr[]) { + int sum = 0; + for (int i = 0; i < arr.length; i++) { + sum += arr[i]; + } + + if (sum % 2 != 0) { + return false; + } + sum = sum / 2; + boolean[][] T = new boolean[arr.length + 1][sum + 1]; + + for (int i = 0; i <= arr.length; i++) { + T[i][0] = true; + } + + for (int i = 1; i <= arr.length; i++) { + for (int j = 1; j <= sum; j++) { + if (j - arr[i - 1] >= 0) { + T[i][j] = T[i - 1][j - arr[i - 1]] || T[i - 1][j]; + } else { + T[i][j] = T[i-1][j]; + } + } + } + return T[arr.length][sum]; + } + + public static void main(String args[]) { + SubsetSum ss = new SubsetSum(); + int arr[] = {1, 3, 5, 5, 2, 1, 1, 6}; + System.out.println(ss.partition(arr)); + + int arr1[] = {2, 3, 7, 8}; + System.out.print(ss.subsetSum(arr1, 11)); + + } +} diff --git a/showmecode_100/java/com/interview/dynamic/SubsquareSurrounedByXs.java b/showmecode_100/java/com/interview/dynamic/SubsquareSurrounedByXs.java new file mode 100644 index 00000000..30e7149b --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/SubsquareSurrounedByXs.java @@ -0,0 +1,124 @@ +package com.interview.dynamic; + +/** + * Date 09/15/2014 + * @author tusroy + * + * Find maximum subsquare in a matrix made up of Xs and Os such that all four sides of subsquare are Xs. It does not matter what is inside + * the subsquare. All 4 sides should be made up entirely of Xs + * + * e.g + * 0 0 0 0 0 X 0,0 0,0 0,0 0,0 0,0 1,1 + * 0 X 0 X X X 0,0 1,1 0,0 1,1 1,2 2,3 + * 0 X 0 X 0 X 0,0 2,1 0,0 2,1 0,0 3,1 + * 0 X X X X X 0,0 3,1 1,2 3,3 1,4 4,5 + * 0 0 0 0 0 0 0,0 0,0 0,0 0,0 0,0 0,0 + * + * Output of above program should be 3 + * + * Solution + * Have another matrix which is capable of holding 2 values hori and ver. + * Ver stores how far vertically you can see Xs. Hori stores how far horizontally you can see Xs. + * Once this matrix is build look for biggest subsquare by getting min of hori and ver at each point and checking + * if subsquare can be formed from value min to 1. + * + * Test cases: + * Matrix entirely made up of Xs + * Matrix entirely made up of Os + * Matrix with Xs and Os but maximum subsquare is length 1 + */ +public class SubsquareSurrounedByXs { + + class Cell{ + int ver; + int hori; + } + public int findSubSquare(char input[][]){ + Cell T[][] = new Cell[input.length][input[0].length]; + for(int i=0; i < T.length; i++){ + for(int j=0; j < T[0].length; j++){ + T[i][j] = new Cell(); + } + } + + for(int i=0; i < input.length; i++){ + for(int j=0; j < input[0].length; j++){ + if(input[i][j] == 'X'){ + if(i == 0 && j == 0){ + T[i][j].hori = 1; + T[i][j].ver = 1; + } + else if(i == 0){ + T[i][j].hori = T[i][j-1].hori + 1; + T[i][j].ver = 1; + }else if(j == 0){ + T[i][j].ver = T[i-1][j].ver +1; + T[i][j].hori = 1; + }else{ + T[i][j].hori = T[i][j-1].hori +1; + T[i][j].ver = T[i-1][j].ver + 1; + } + } + } + } + for(int i=0; i < T.length; i++){ + for(int j=0; j < T[0].length; j++){ + System.out.print(T[i][j].ver + "," + T[i][j].hori+ " "); + } + System.out.println(); + } + + //start iterating from bottom right corner and find min of hori or ver at every cell. + //If this is greater than 1 then see if you can find a number between this min and 1 + //such that on left's ver and top's hori is greater greater than or equal to k. + int max = 1; + for(int i=T.length -1; i >=0 ; i--){ + for(int j= T[0].length-1 ; j >=0; j--){ + if(T[i][j].ver == 0 || T[i][j].ver == 1 || T[i][j].hori ==1 ){ + continue; + } + int min = Math.min(T[i][j].ver, T[i][j].hori); + int k = 0; + for(k=min; k > 1; k--){ + if(T[i][j-k+1].ver >= k && T[i-k+1][j].hori >= k){ + break; + } + } + if(max < k){ + max = k; + } + } + } + + return max; + } + + public static void main(String args[]){ + char[][] input = {{'X','O','O','O','O','O'}, + {'O','O','O','O','O','O'}, + {'X','X','X','X','O','O'}, + {'X','X','X','X','X','O'}, + {'X','O','O','X','X','O'}, + {'X','O','X','X','X','O'}}; + + char [][] input1 = {{'O', 'O', 'O', 'O', 'O', 'X'}, + {'O', 'X', 'O', 'X', 'X', 'X'}, + {'O', 'X', 'O', 'X', 'O', 'X'}, + {'O', 'X', 'X', 'X', 'X', 'X'}, + {'O', 'O', 'O', 'O', 'O', 'O'}, + }; + + char [][] input2 = {{'O', 'O', 'X', 'O', 'X'}, + {'O', 'X', 'X', 'O', 'X'}, + {'O', 'X', 'O', 'X', 'X'}, + {'X', 'X', 'X', 'X', 'X'}, + {'O', 'X', 'X', 'X', 'O'}, + }; + + SubsquareSurrounedByXs ss = new SubsquareSurrounedByXs(); + System.out.println(ss.findSubSquare(input)); + System.out.println(ss.findSubSquare(input1)); + System.out.println(ss.findSubSquare(input2)); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/SymbolExpressionEvaluation.java b/showmecode_100/java/com/interview/dynamic/SymbolExpressionEvaluation.java new file mode 100644 index 00000000..73f5dfa2 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/SymbolExpressionEvaluation.java @@ -0,0 +1,75 @@ +package com.interview.dynamic; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Date 01/06/2016 + * @author Tushar Roy + * Let there be a binary operation for 3 symbols a, b, c and result of these binary operation given in a table. + * Given an expression of these 3 symbols and a final result, tell if this expression can be parenthesize in certain + * way to produce the final result. + * + * Time complexity is O(n^4) + * Space complexity is O(n^3) + */ +public class SymbolExpressionEvaluation { + + public boolean evaluateExpression(char input[][], Map index, char[] expression, char result) { + Holder[][] T = new Holder[expression.length][expression.length]; + for (int i = 0; i < T.length; i++) { + for (int j = 0; j < T.length; j++) { + T[i][j] = new Holder(); + } + } + + for (int i = 0; i < expression.length; i++) { + T[i][i].add(expression[i]); + } + + for (int l = 2; l <= T.length; l++) { + for (int i = 0; i <= T.length - l; i++) { + int j = i + l - 1; + for (int k = i; k < j; k++) { + for (char ch : T[i][k].values()) { + for (char ch1: T[k+1][j].values()) { + T[i][j].add(input[index.get(ch)][index.get(ch1)]); + } + } + } + } + } + + for (char ch : T[0][T.length-1].values()) { + if ( result == ch) { + return true; + } + } + return false; + } + + public static void main(String args[]) { + Map index = new HashMap<>(); + index.put('a', 0); + index.put('b', 1); + index.put('c', 2); + + char input[][] = {{'b', 'b', 'a'}, {'c', 'b', 'a'}, {'a', 'c', 'c'}}; + SymbolExpressionEvaluation sbe = new SymbolExpressionEvaluation(); + System.out.println(sbe.evaluateExpression(input, index, "bbbbac".toCharArray(), 'a')); + } + +} + +class Holder { + private Set valueHolder = new HashSet<>(); + void add(Character ch) { + valueHolder.add(ch); + } + Set values() { + return valueHolder; + } +} + diff --git a/showmecode_100/java/com/interview/dynamic/TextJustification.java b/showmecode_100/java/com/interview/dynamic/TextJustification.java new file mode 100644 index 00000000..663b03c1 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/TextJustification.java @@ -0,0 +1,103 @@ +package com.interview.dynamic; + +/** + * Date 05/07/2015 + * @author tusroy + * + * Video link - https://youtu.be/RORuwHiblPc + * + * Given a sequence of words, and a limit on the number of characters that can be put + * in one line (line width). Put line breaks in the given sequence such that the + * lines are printed neatly + * + * Solution: + * Badness - We define badness has square of empty spaces in every line. So 2 empty space + * on one line gets penalized as 4 (2^2) while 1 each empty space on 2 lines gets + * penalized as 2(1 + 1). So we prefer 1 empty space on different lines over 2 empty space on + * one line. + * + * For every range i,j(words from i to j) find the cost of putting them on one line. If words + * from i to j cannot fit in one line cost will be infinite. Cost is calculated as square of + * empty space left in line after fitting words from i to j. + * + * Then apply this formula to get places where words need to be going on new line. + * minCost[i] = minCost[j] + cost[i][j-1] + * Above formula will try every value of j from i to len and see which one gives minimum + * cost to split words from i to len. + * + * Space complexity is O(n^2) + * Time complexity is O(n^2) + * + * References: + * http://www.geeksforgeeks.org/dynamic-programming-set-18-word-wrap/ + */ +public class TextJustification { + + public String justify(String words[], int width) { + + int cost[][] = new int[words.length][words.length]; + + //next 2 for loop is used to calculate cost of putting words from + //i to j in one line. If words don't fit in one line then we put + //Integer.MAX_VALUE there. + for(int i=0 ; i < words.length; i++){ + cost[i][i] = width - words[i].length(); + for(int j=i+1; j < words.length; j++){ + cost[i][j] = cost[i][j-1] - words[j].length() - 1; + } + } + + for(int i=0; i < words.length; i++){ + for(int j=i; j < words.length; j++){ + if(cost[i][j] < 0){ + cost[i][j] = Integer.MAX_VALUE; + }else{ + cost[i][j] = (int)Math.pow(cost[i][j], 2); + } + } + } + + //minCost from i to len is found by trying + //j between i to len and checking which + //one has min value + int minCost[] = new int[words.length]; + int result[] = new int[words.length]; + for(int i = words.length-1; i >= 0 ; i--){ + minCost[i] = cost[i][words.length-1]; + result[i] = words.length; + for(int j=words.length-1; j > i; j--){ + if(cost[i][j-1] == Integer.MAX_VALUE){ + continue; + } + if(minCost[i] > minCost[j] + cost[i][j-1]){ + minCost[i] = minCost[j] + cost[i][j-1]; + result[i] = j; + } + } + } + int i = 0; + int j; + + System.out.println("Minimum cost is " + minCost[0]); + System.out.println("\n"); + //finally put all words with new line added in + //string buffer and print it. + StringBuilder builder = new StringBuilder(); + do{ + j = result[i]; + for(int k=i; k < j; k++){ + builder.append(words[k] + " "); + } + builder.append("\n"); + i = j; + }while(j < words.length); + + return builder.toString(); + } + + public static void main(String args[]){ + String words1[] = {"Tushar","likes","to","write","code","at", "free", "time"}; + TextJustification awl = new TextJustification(); + System.out.println(awl.justify(words1, 12)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/TwoStringInterleavingToFormThird.java b/showmecode_100/java/com/interview/dynamic/TwoStringInterleavingToFormThird.java new file mode 100644 index 00000000..271d279e --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/TwoStringInterleavingToFormThird.java @@ -0,0 +1,62 @@ +package com.interview.dynamic; + +/** + * + * http://www.geeksforgeeks.org/check-whether-a-given-string-is-an-interleaving-of-two-other-given-strings-set-2/ + */ +public class TwoStringInterleavingToFormThird { + + public boolean isInterleavedRecursive(char str1[], char str2[], char str3[],int pos1, int pos2, int pos3){ + if(pos1 == str1.length && pos2 == str2.length && pos3 == str3.length){ + return true; + } + + if(pos3 == str3.length){ + return false; + } + + return (pos1 < str1.length && str1[pos1] == str3[pos3] && isInterleavedRecursive(str1, str2, str3, pos1+1, pos2, pos3+1)) + || (pos2 < str2.length && str2[pos2] == str3[pos3] && isInterleavedRecursive(str1, str2, str3, pos1, pos2+1, pos3+1)); + + } + + public boolean isInterleaved(char str1[], char str2[], char str3[]){ + boolean T[][] = new boolean[str1.length +1][str2.length +1]; + + if(str1.length + str2.length != str3.length){ + return false; + } + + for(int i=0; i < T.length; i++){ + for(int j=0; j < T[i].length; j++){ + int l = i + j -1; + if(i == 0 && j == 0){ + T[i][j] = true; + } + else if(i == 0){ + if(str3[l] == str2[j-1]){ + T[i][j] = T[i][j-1]; + } + } + else if(j == 0){ + if(str1[i-1] == str3[l]){ + T[i][j] = T[i-1][j]; + } + } + else{ + T[i][j] = (str1[i-1] == str3[l] ? T[i-1][j] : false) || (str2[j-1] == str3[l] ? T[i][j-1] : false); + } + } + } + return T[str1.length][str2.length]; + } + + public static void main(String args[]){ + String str1 = "XXYM"; + String str2 = "XXZT"; + String str3 = "XXXZXYTM"; + TwoStringInterleavingToFormThird sti = new TwoStringInterleavingToFormThird(); + System.out.println(sti.isInterleaved(str1.toCharArray(), str2.toCharArray(), str3.toCharArray())); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/UglyNumbers.java b/showmecode_100/java/com/interview/dynamic/UglyNumbers.java new file mode 100644 index 00000000..f0757511 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/UglyNumbers.java @@ -0,0 +1,91 @@ +package com.interview.dynamic; + +import java.util.PriorityQueue; + +/** + * Date 03/08/2016 + * @author Tushar Roy + * + * Find nth ugly number. + * + * https://leetcode.com/problems/ugly-number-ii/ + * https://leetcode.com/problems/super-ugly-number/ + * http://www.geeksforgeeks.org/ugly-numbers/ + */ +public class UglyNumbers { + + static class Node implements Comparable { + int inputIndex; + int index; + int val; + Node (int inputIndex, int index, int val) { + this.index = index; + this.val = val; + this.inputIndex = inputIndex; + } + + @Override + public int compareTo(Node other) { + return this.val - other.val; + } + } + + public int nthSuperUglyNumber1(int n, int[] primes) { + + PriorityQueue pq = new PriorityQueue<>(); + for (int i = 0; i < primes.length; i++) { + pq.offer(new Node(i, 0, primes[i])); + } + int[] val = new int[n]; + val[0] = 1; + for (int i = 1; i < n; ) { + Node node = pq.poll(); + if (val[i-1] != node.val) { + val[i] = node.val; + i++; + } + node.index = node.index + 1; + node.val = primes[node.inputIndex]*val[node.index]; + pq.offer(node); + } + return val[n - 1]; + } + + int ugly(int n){ + int arr[] = new int[n]; + int count = 1; + arr[0] = 1; + int i2 = 0; + int i3 = 0; + int i5 = 0; + while(count < n){ + int minNumber = min(arr[i2] * 2, arr[i3] * 3, arr[i5] * 5); + if(minNumber == arr[i2]*2){ + i2++; + } + if(minNumber == arr[i3]*3){ + i3++; + } + if(minNumber == arr[i5]*5){ + i5++; + } + arr[count++] = minNumber; + } + + return arr[n-1]; + } + + private int min(int a,int b, int c){ + int l = Math.min(a, b); + return Math.min(l, c); + } + + public static void main(String args[]) { + UglyNumbers ugly = new UglyNumbers(); + int result = ugly.ugly(150); + System.out.println(result); + int[] primes = {2, 3, 7, 11}; + System.out.print(ugly.nthSuperUglyNumber1(17, primes)); + } + +} diff --git a/showmecode_100/java/com/interview/dynamic/WeightedJobSchedulingMaximumProfit.java b/showmecode_100/java/com/interview/dynamic/WeightedJobSchedulingMaximumProfit.java new file mode 100644 index 00000000..6ccfd474 --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/WeightedJobSchedulingMaximumProfit.java @@ -0,0 +1,80 @@ +package com.interview.dynamic; + +import java.util.Arrays; +import java.util.Comparator; + +class Job{ + int start; + int end; + int profit; + Job(int start,int end,int profit){ + this.start= start; + this.end = end; + this.profit= profit; + } +} + +class FinishTimeComparator implements Comparator{ + + @Override + public int compare(Job arg0, Job arg1) { + if(arg0.end <= arg1.end){ + return -1; + }else{ + return 1; + } + } + +} + +/** + * http://www.cs.princeton.edu/courses/archive/spr05/cos423/lectures/06dynamic-programming.pdf + * Given set of jobs with start and end interval and profit, how to maximize profit such that + * jobs in subset do not overlap. + */ +public class WeightedJobSchedulingMaximumProfit { + + /** + * Sort the jobs by finish time. + * For every job find the first job which does not overlap with this job + * and see if this job profit plus profit till last non overlapping job is greater + * than profit till last job. + * @param jobs + * @return + */ + public int maximum(Job[] jobs){ + int T[] = new int[jobs.length]; + FinishTimeComparator comparator = new FinishTimeComparator(); + Arrays.sort(jobs, comparator); + + T[0] = jobs[0].profit; + for(int i=1; i < jobs.length; i++){ + T[i] = Math.max(jobs[i].profit, T[i-1]); + for(int j=i-1; j >=0; j--){ + if(jobs[j].end <= jobs[i].start){ + T[i] = Math.max(T[i], jobs[i].profit + T[j]); + break; + } + } + } + int maxVal = Integer.MIN_VALUE; + for (int val : T) { + if (maxVal < val) { + maxVal = val; + } + } + return maxVal; + } + + public static void main(String args[]){ + Job jobs[] = new Job[6]; + jobs[0] = new Job(1,3,5); + jobs[1] = new Job(2,5,6); + jobs[2] = new Job(4,6,5); + jobs[3] = new Job(6,7,4); + jobs[4] = new Job(5,8,11); + jobs[5] = new Job(7,9,2); + WeightedJobSchedulingMaximumProfit mp = new WeightedJobSchedulingMaximumProfit(); + System.out.println(mp.maximum(jobs)); + } +} diff --git a/showmecode_100/java/com/interview/dynamic/WildCardMatching.java b/showmecode_100/java/com/interview/dynamic/WildCardMatching.java new file mode 100644 index 00000000..2ba1026a --- /dev/null +++ b/showmecode_100/java/com/interview/dynamic/WildCardMatching.java @@ -0,0 +1,93 @@ +package com.interview.dynamic; + +/** + * Date 02/11/2016 + * @author Tushar Roy + * + * Wild car matching with ? and * + * + * Reference + * https://leetcode.com/problems/wildcard-matching/ + */ +public class WildCardMatching { + public boolean isMatch(String s, String p) { + char[] str = s.toCharArray(); + char[] pattern = p.toCharArray(); + + //replace multiple * with one * + //e.g a**b***c --> a*b*c + int writeIndex = 0; + boolean isFirst = true; + for ( int i = 0 ; i < pattern.length; i++) { + if (pattern[i] == '*') { + if (isFirst) { + pattern[writeIndex++] = pattern[i]; + isFirst = false; + } + } else { + pattern[writeIndex++] = pattern[i]; + isFirst = true; + } + } + + boolean T[][] = new boolean[str.length + 1][writeIndex + 1]; + + if (writeIndex > 0 && pattern[0] == '*') { + T[0][1] = true; + } + + T[0][0] = true; + + for (int i = 1; i < T.length; i++) { + for (int j = 1; j < T[0].length; j++) { + if (pattern[j-1] == '?' || str[i-1] == pattern[j-1]) { + T[i][j] = T[i-1][j-1]; + } else if (pattern[j-1] == '*'){ + T[i][j] = T[i-1][j] || T[i][j-1]; + } + } + } + + return T[str.length][writeIndex]; + } + + + /** + * Recursive and slow version of wild card matching. + */ + public boolean isMatchRecursive(String s, String p) { + return isMatchRecursiveUtil(s.toCharArray(), p.toCharArray(), 0, 0); + } + + private boolean isMatchRecursiveUtil(char[] text, char[] pattern, int pos1, int pos2) { + if (pos2 == pattern.length) { + return text.length == pos1; + } + + if (pattern[pos2] != '*') { + if (pos1 < text.length && (text[pos1] == pattern[pos2]) || pattern[pos2] == '?') { + return isMatchRecursiveUtil(text, pattern, pos1 + 1, pos2 + 1); + } else { + return false; + } + } else { + //if we have a***b then skip to the last * + while (pos2 < pattern.length - 1 && pattern[pos2 + 1] == '*') { + pos2++; + } + pos1--; + while (pos1 < text.length) { + if (isMatchRecursiveUtil(text, pattern, pos1 + 1, pos2 + 1)) { + return true; + } + pos1++; + } + return false; + } + } + + public static void main(String args[]) { + WildCardMatching wcm = new WildCardMatching(); + System.out.println(wcm.isMatch("xbylmz", "x?y*z")); + } +} diff --git a/showmecode_100/java/com/interview/geometry/ClosestPairOfPoints.java b/showmecode_100/java/com/interview/geometry/ClosestPairOfPoints.java new file mode 100644 index 00000000..d465b7b3 --- /dev/null +++ b/showmecode_100/java/com/interview/geometry/ClosestPairOfPoints.java @@ -0,0 +1,155 @@ +package com.interview.geometry; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +/** + * http://www.geeksforgeeks.org/closest-pair-of-points-onlogn-implementation/ + * https://www.youtube.com/watch?v=_pSl90jq-m0 another good explanation + * Given coordinates of points find closest pair points distance. + * + * Test cases: + * Number of points should be more than 1 + * Test along positive and negative axis + * + * The way it works is + * 1) Sort by x coordinate + * 2) Recursively divide into two halves. + * 3) Find min distance between points in each half. Say this distance is d. + * 4) Find points which are in either half and closer than d. To find this point sort by y + * axis and find distance to next 6 points. Magic about 6 points is we can create a rectangular + * area and only 6 points can fit in that rectangular area. So we need to check only 7 points + * for each point in rectangular area. + * @author tusroy + */ + + +class Point{ + int x; + int y; + Point(int x, int y){ + this.x = x; + this.y = y; + } +} + +class XCoordinatorSorter implements Comparator{ + @Override + public int compare(Point o1, Point o2) { + if(o1.x < o2.x){ + return -1; + }else{ + return 1; + } + } +} + +class YCoordinatorSorter implements Comparator{ + @Override + public int compare(Point o1, Point o2) { + if(o1.y < o2.y){ + return -1; + }else{ + return 1; + } + } +} + +public class ClosestPairOfPoints { + + private static final int SIZE = 7; + public double closestPairOfPoints(Point[] points){ + if(points.length < 2){ + throw new IllegalArgumentException(); + } + Point[] px = new Point[points.length]; + Point[] py = new Point[points.length]; + int i=0; + for(Point point : points){ + px[i++] = point; + } + i=0; + for(Point point : points){ + py[i++] = point; + } + XCoordinatorSorter xSorter = new XCoordinatorSorter(); + YCoordinatorSorter ySorter = new YCoordinatorSorter(); + Arrays.sort(px, xSorter); + Arrays.sort(py, ySorter); + int minDistance = closestPairOfPoints(px, py, 0, points.length-1); + return Math.sqrt(minDistance); + } + + private int closestPairOfPoints(Point[] px, Point[] py,int start, int end){ + if(end - start < 3){ + return computeMinDistance(px, start, end); + } + + int mid = (start + end)/2; + Point[] pyLeft = new Point[mid-start+1]; + Point[] pyRight = new Point[end-mid]; + int i=0, j=0; + for(Point p : px){ + if(p.x <= px[mid].x){ + pyLeft[i++] = p; + }else{ + pyRight[j++] = p; + } + } + int d1 = closestPairOfPoints(px,pyLeft,start,mid); + int d2 = closestPairOfPoints(px, pyRight, mid+1, end); + int d = Math.min(d1, d2); + + List deltaPoints = new ArrayList(); + for(Point p : px){ + if(Math.sqrt(distance(p,px[mid])) < Math.sqrt(d)){ + deltaPoints.add(p); + } + } + int d3 = closest(deltaPoints); + return Math.min(d3, d); + } + + private int closest(List deltaPoints){ + int minDistance = Integer.MAX_VALUE; + for(int i=0; i < deltaPoints.size(); i++){ + for(int j=i+1; j <= i + SIZE && j < deltaPoints.size() ; j++){ + int distance = distance(deltaPoints.get(i), deltaPoints.get(j)); + if(minDistance < distance){ + minDistance = distance; + } + } + } + return minDistance; + } + + private int distance(Point p1, Point p2){ + return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y); + } + + private int computeMinDistance(Point[] points, int start, int end){ + if(end - start == 1){ + Point p1 = points[start]; + Point p2 = points[end]; + return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y); + }else if(end - start == 2){ + Point p1 = points[start]; + Point p2 = points[end-1]; + Point p3 = points[end]; + return Math.min(Math.min((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y), + (p1.x - p3.x)*(p1.x - p3.x) + (p1.y - p3.y)*(p1.y - p3.y)), + (p2.x - p3.x)*(p2.x - p3.x) + (p2.y - p3.y)*(p2.y - p3.y)); + }else{ + throw new IllegalArgumentException(); + } + } + + public static void main(String args[]){ + ClosestPairOfPoints cpp = new ClosestPairOfPoints(); + Point[] points = {new Point(6,2),new Point(4,6),new Point(5,4),new Point(-8,2),new Point(0,2)}; + double minDistance = cpp.closestPairOfPoints(points); + System.out.println(minDistance); + } +} diff --git a/showmecode_100/java/com/interview/geometry/GrahamScanConvexHull.java b/showmecode_100/java/com/interview/geometry/GrahamScanConvexHull.java new file mode 100644 index 00000000..a7659316 --- /dev/null +++ b/showmecode_100/java/com/interview/geometry/GrahamScanConvexHull.java @@ -0,0 +1,139 @@ +package com.interview.geometry; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Stack; + +/** + * @author Tushar Roy + * Date 10/11/2107 + * + * Convex hull or convex envelope of a set X of points in the Euclidean plane or in a Euclidean space + * (or, more generally, in an affine space over the reals) is the smallest convex set that contains X. + * + * Graham scan finds all vertices of the convex hull ordered along its boundary. + * + * Time complexity O(nlogn) + * Space complexity O(n) + * + * References + * https://leetcode.com/problems/erect-the-fence/description/ + * https://en.wikipedia.org/wiki/Convex_hull + * https://en.wikipedia.org/wiki/Graham_scan + * https://discuss.leetcode.com/topic/89336/java-graham-scan-with-adapted-sorting-to-deal-with-collinear-points + */ +public class GrahamScanConvexHull { + + static class Point{ + int x; + int y; + Point(int x, int y){ + this.x = x; + this.y = y; + } + } + + public List findConvexHull(Point[] points) { + if (points.length < 2) { + return Arrays.asList(points); + } + + //find the lowest point in the plane. If there are multiple lowest points + //then pick the leftmost one. + Point start = points[0]; + for (int i = 1; i < points.length; i++) { + if (start.y > points[i].y) { + start = points[i]; + } else if (start.y == points[i].y && start.x > points[i].x) { + start = points[i]; + } + } + + sortToHandleCollinear(points, start); + + Stack stack = new Stack<>(); + stack.push(points[0]); + stack.push(points[1]); + for (int i = 2; i < points.length; i++) { + Point top = stack.pop(); + //second point will always be in answer so this will never cause empty stack exception. + //as long as points[i] is on right of vector stack.peek() -> top keep getting rid of top of stack. + while (crossProduct(stack.peek(), top, points[i]) < 0) { + top = stack.pop(); + } + stack.push(top); + stack.push(points[i]); + } + return new ArrayList<>(stack); + } + + private void sortToHandleCollinear(Point[] points, Point start) { + Arrays.sort(points, (p1, p2) -> { + if (p1 == start) { + return -1; + } + if (p2 == start) { + return 1; + } + int cp = crossProduct(start, p1, p2); + if (cp == 0) { + return distance(start, p1, p2); + } else { + return -cp; + } + }); + + //make sure last collinear points are in reverse order of distance. + Point p = points[0], q = points[points.length - 1]; + int i = points.length - 2; + while (i >= 0 && crossProduct(p, q, points[i]) == 0) { + i--; + } + + // reverse sort order of collinear points in the end positions + for (int l = i + 1, h = points.length - 1; l < h; l++, h--) { + Point tmp = points[l]; + points[l] = points[h]; + points[h] = tmp; + } + } + + /** + * Returns < 0 if 'b' is closer to 'a' compared to 'c', == 0 if 'b' and 'c' are same distance from 'a' + * or > 0 if 'c' is closer to 'a' compared to 'b'. + */ + private int distance(Point a, Point b, Point c) { + int y1 = a.y - b.y; + int y2 = a.y - c.y; + int x1 = a.x - b.x; + int x2 = a.x - c.x; + return Integer.compare(y1 * y1 + x1 * x1, y2 * y2 + x2 * x2); + } + + /** + * Cross product to find where c belongs in reference to vector ab. + * If result > 0 it means 'c' is on left of ab + * result == 0 it means 'a','b' and 'c' are collinear + * result < 0 it means 'c' is on right of ab + */ + private int crossProduct(Point a, Point b, Point c) { + int y1 = a.y - b.y; + int y2 = a.y - c.y; + int x1 = a.x - b.x; + int x2 = a.x - c.x; + return y2 * x1 - y1 * x2; + } + + public static void main(String[] args) { + GrahamScanConvexHull grahamScanConvexHull = new GrahamScanConvexHull(); + //int[][] input = new int[][]{{0,0},{0,1},{0,2},{1,2},{2,2},{3,2},{3,1},{3,0},{2,0},{1,0},{1,1},{4,3}}; + int[][] input = new int[][] {{1,1},{2,2},{2,0},{2,4},{3,3},{4,2}}; + Point[] points = new Point[input.length]; + int index = 0; + for (int[] i : input) { + points[index++] = new Point(i[0], i[1]); + } + System.out.println(grahamScanConvexHull.findConvexHull(points)); + } +} diff --git a/showmecode_100/java/com/interview/geometry/JarvisMarchConvexHull.java b/showmecode_100/java/com/interview/geometry/JarvisMarchConvexHull.java new file mode 100644 index 00000000..3cd281fc --- /dev/null +++ b/showmecode_100/java/com/interview/geometry/JarvisMarchConvexHull.java @@ -0,0 +1,118 @@ +package com.interview.geometry; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Tushar Roy + * Date 10/11/2107 + * + * Convex hull or convex envelope of a set X of points in the Euclidean plane or in a Euclidean space + * (or, more generally, in an affine space over the reals) is the smallest convex set that contains X. + * + * Jarvis March is finding convex or gift wrapping algorithm. + * + * Time complexity O(nh) + * n - number of points + * h - number of points on the boundary. + * Worst case O(n^2) + * + * Space complexity O(n^2) + * + * Reference + * https://leetcode.com/problems/erect-the-fence/description/ + * https://en.wikipedia.org/wiki/Convex_hull + * https://en.wikipedia.org/wiki/Gift_wrapping_algorithm + */ +public class JarvisMarchConvexHull { + + class Point{ + int x; + int y; + Point(int x, int y){ + this.x = x; + this.y = y; + } + } + + public List findConvexHull(Point[] points) { + //first find leftmost point to start the march. + Point start = points[0]; + for (int i = 1; i < points.length; i++) { + if (points[i].x < start.x) { + start = points[i]; + } + } + Point current = start; + //use set because this algorithm might try to insert duplicate point. + Set result = new HashSet<>(); + result.add(start); + List collinearPoints = new ArrayList<>(); + while (true) { + Point nextTarget = points[0]; + for (int i = 1; i < points.length; i++) { + if (points[i] == current) { + continue; + } + int val = crossProduct(current, nextTarget, points[i]); + //if val > 0 it means points[i] is on left of current -> nextTarget. Make him the nextTarget. + if (val > 0) { + nextTarget = points[i]; + //reset collinear points because we now have a new nextTarget. + collinearPoints = new ArrayList<>(); + } else if (val == 0) { //if val is 0 then collinear current, nextTarget and points[i] are collinear. + //if its collinear point then pick the further one but add closer one to list of collinear points. + if (distance(current, nextTarget, points[i]) < 0) { + collinearPoints.add(nextTarget); + nextTarget = points[i]; + } else { //just add points[i] to collinearPoints list. If nextTarget indeed is the next point on + //convex then all points in collinear points will be also on boundary. + collinearPoints.add(points[i]); + } + } + //else if val < 0 then nothing to do since points[i] is on right side of current -> nextTarget. + } + + //add all points in collinearPoints to result. + for (Point p : collinearPoints) { + result.add(p); + } + //if nextTarget is same as start it means we have formed an envelope and its done. + if (nextTarget == start) { + break; + } + //add nextTarget to result and set current to nextTarget. + result.add(nextTarget); + current = nextTarget; + } + return new ArrayList<>(result); + } + + /** + * Returns < 0 if 'b' is closer to 'a' compared to 'c', == 0 if 'b' and 'c' are same distance from 'a' + * or > 0 if 'c' is closer to 'a' compared to 'b'. + */ + private int distance(Point a, Point b, Point c) { + int y1 = a.y - b.y; + int y2 = a.y - c.y; + int x1 = a.x - b.x; + int x2 = a.x - c.x; + return Integer.compare(y1 * y1 + x1 * x1, y2 * y2 + x2 * x2); + } + + /** + * Cross product to find where c belongs in reference to vector ab. + * If result > 0 it means 'c' is on left of ab + * result == 0 it means 'a','b' and 'c' are collinear + * result < 0 it means 'c' is on right of ab + */ + private int crossProduct(Point a, Point b, Point c) { + int y1 = a.y - b.y; + int y2 = a.y - c.y; + int x1 = a.x - b.x; + int x2 = a.x - c.x; + return y2 * x1 - y1 * x2; + } +} diff --git a/showmecode_100/java/com/interview/geometry/MaximumPointsOnSameLine.java b/showmecode_100/java/com/interview/geometry/MaximumPointsOnSameLine.java new file mode 100644 index 00000000..290d263f --- /dev/null +++ b/showmecode_100/java/com/interview/geometry/MaximumPointsOnSameLine.java @@ -0,0 +1,89 @@ +package com.interview.geometry; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 03/21/2016 + * @author Tushar Roy + * + * Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. + * + * Time complexity O(n^2) + * Space complexity O(n) + * + * https://leetcode.com/problems/max-points-on-a-line/ + */ +public class MaximumPointsOnSameLine { + + static class Point { + int x; + int y; + Point() { x = 0; y = 0; } + Point(int a, int b) { x = a; y = b; } + } + + class Pair { + int a; + int b; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Pair pair = (Pair) o; + + if (a != pair.a) return false; + return b == pair.b; + + } + + @Override + public int hashCode() { + int result = a; + result = 31 * result + b; + return result; + } + } + + public int maxPoints(Point[] points) { + int result = 0; + for (int i = 0; i < points.length; i++) { + Map map = new HashMap<>(); + int verticalLine = 1; + int onePointMax = 1; + int samePoint = 0; + for (int j = i + 1; j < points.length; j++) { + //same point repeated again. Just increment samePoint count + if (points[i].x == points[j].x && points[i].y == points[j].y) { + samePoint++; + } else if (points[i].x == points[j].x) { //vertical line + verticalLine++; + onePointMax = Math.max(onePointMax, verticalLine); + } else { + int gcd = gcd(points[i].y - points[j].y, points[i].x - points[j].x); + Pair p = new Pair(); + p.a = (points[i].y - points[j].y)/gcd; + p.b = (points[i].x - points[j].x)/gcd; + int count = 2; + if (map.containsKey(p)) { + count = map.get(p); + count++; + map.put(p, count); + } else { + map.put(p, count); + } + onePointMax = Math.max(onePointMax, count); + } + } + result = Math.max(result, onePointMax + samePoint); + } + return result; + } + + int gcd(int a, int b) { + if(b==0) return a; + else return gcd(b, a % b); + } +} diff --git a/showmecode_100/java/com/interview/geometry/SkylineDrawing.java b/showmecode_100/java/com/interview/geometry/SkylineDrawing.java new file mode 100644 index 00000000..b9e9b416 --- /dev/null +++ b/showmecode_100/java/com/interview/geometry/SkylineDrawing.java @@ -0,0 +1,110 @@ +package com.interview.geometry; + +import java.util.*; + +/** + * Date 01/07/2016 + * @author Tushar Roy + * + * Given skyline of a city merge the buildings + * + * Time complexity is O(nlogn) + * Space complexity is O(n) + * + * References + * https://leetcode.com/problems/the-skyline-problem/ + * https://leetcode.com/discuss/67091/once-for-all-explanation-with-clean-java-code-nlog-time-space + */ +public class SkylineDrawing { + + /** + * Represents either start or end of building + */ + static class BuildingPoint implements Comparable { + int x; + boolean isStart; + int height; + + @Override + public int compareTo(BuildingPoint o) { + //first compare by x. + //If they are same then use this logic + //if two starts are compared then higher height building should be picked first + //if two ends are compared then lower height building should be picked first + //if one start and end is compared then start should appear before end + if (this.x != o.x) { + return this.x - o.x; + } else { + return (this.isStart ? -this.height : this.height) - (o.isStart ? -o.height : o.height); + } + } + } + + public List getSkyline(int[][] buildings) { + + //for all start and end of building put them into List of BuildingPoint + BuildingPoint[] buildingPoints = new BuildingPoint[buildings.length*2]; + int index = 0; + for(int building[] : buildings) { + buildingPoints[index] = new BuildingPoint(); + buildingPoints[index].x = building[0]; + buildingPoints[index].isStart = true; + buildingPoints[index].height = building[2]; + + buildingPoints[index + 1] = new BuildingPoint(); + buildingPoints[index + 1].x = building[1]; + buildingPoints[index + 1].isStart = false; + buildingPoints[index + 1].height = building[2]; + index += 2; + } + Arrays.sort(buildingPoints); + + //using TreeMap because it gives log time performance. + //PriorityQueue in java does not support remove(object) operation in log time. + TreeMap queue = new TreeMap<>(); + //PriorityQueue queue1 = new PriorityQueue<>(Collections.reverseOrder()); + queue.put(0, 1); + //queue1.add(0); + int prevMaxHeight = 0; + List result = new ArrayList<>(); + for(BuildingPoint buildingPoint : buildingPoints) { + //if it is start of building then add the height to map. If height already exists then increment + //the value + if (buildingPoint.isStart) { + queue.compute(buildingPoint.height, (key, value) -> { + if (value != null) { + return value + 1; + } + return 1; + }); + // queue1.add(cp.height); + } else { //if it is end of building then decrement or remove the height from map. + queue.compute(buildingPoint.height, (key, value) -> { + if (value == 1) { + return null; + } + return value - 1; + }); + // queue1.remove(cp.height); + } + //peek the current height after addition or removal of building x. + int currentMaxHeight = queue.lastKey(); + //int currentMaxHeight = queue1.peek(); + //if height changes from previous height then this building x becomes critcal x. + // So add it to the result. + if (prevMaxHeight != currentMaxHeight) { + result.add(new int[]{buildingPoint.x, currentMaxHeight}); + prevMaxHeight = currentMaxHeight; + } + } + return result; + } + + public static void main(String args[]) { + int [][] buildings = {{1,3,4},{3,4,4},{2,6,2},{8,11,4}, {7,9,3},{10,11,2}}; + SkylineDrawing sd = new SkylineDrawing(); + List criticalPoints = sd.getSkyline(buildings); + criticalPoints.forEach(cp -> System.out.println(cp[0] + " " + cp[1])); + + } +} diff --git a/showmecode_100/java/com/interview/graph/AlientDictionary.java b/showmecode_100/java/com/interview/graph/AlientDictionary.java new file mode 100644 index 00000000..824965c6 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/AlientDictionary.java @@ -0,0 +1,142 @@ +package com.interview.graph; + +import java.util.*; + +/** + * There is a new alien language which uses the latin alphabet. However, the order among letters + * are unknown to you. You receive a list of words from the dictionary, where words are sorted + * lexicographically by the rules of this new language. Derive the order of letters in this language. + * + * https://leetcode.com/problems/alien-dictionary/ + */ +public class AlientDictionary { + public String alienOrder(String[] words) { + Set allCharacters = new HashSet<>(); + Map> graph = buildGraph(words, new HashMap<>(), allCharacters); + Deque stack = new LinkedList<>(); + Set visited = new HashSet<>(); + Set dfs = new HashSet<>(); + + for (char ch : allCharacters) { + if (topSortUtil(ch, stack, visited, dfs, graph)) { + return ""; + } + } + + StringBuffer buff = new StringBuffer(); + while (!stack.isEmpty()) { + buff.append(stack.pollFirst()); + } + return buff.toString(); + } + + private boolean topSortUtil(char vertex, Deque stack, Set visited, Set dfs, Map> graph) { + if (visited.contains(vertex)) { + return false; + } + visited.add(vertex); + dfs.add(vertex); + Set set = graph.get(vertex); + if (set != null) { + for (char neighbor : set) { + if (dfs.contains(neighbor)) { + return true; + } + if (topSortUtil(neighbor, stack, visited, dfs, graph)) { + return true; + } + } + } + dfs.remove(vertex); + stack.offerFirst(vertex); + return false; + } + + /** + * degree is only used for BFS. Not for DFS. + */ + private Map> buildGraph(String words[], Map degree, Set allCharacters) { + getAllChars(words, degree, allCharacters); + Set all = new HashSet<>(allCharacters); + Map> graph = new HashMap<>(); + for (int i = 0; i < words.length - 1; i++) { + String nextWord = words[i + 1]; + for (int k = 0; k < Math.min(words[i].length(), nextWord.length()); k++) { + if (words[i].charAt(k) != nextWord.charAt((k))) { + all.remove(words[i].charAt(k)); + Set set = graph.get(words[i].charAt(k)); + if (set == null) { + set = new HashSet<>(); + graph.put(words[i].charAt(k), set); + } + set.add(nextWord.charAt(k)); + degree.compute(nextWord.charAt(k), (key, count) -> count + 1); + break; + } + } + } + for (char ch : all) { + graph.put(ch, null); + } + return graph; + } + + private void getAllChars(String words[], Map degree, Set allCharacters) { + for (String word : words) { + for (char ch : word.toCharArray()) { + allCharacters.add(ch); + degree.computeIfAbsent(ch, key -> 0); + } + } + } + + public String alienOrder1(String words[]) { + Map degree = new HashMap<>(); + Map> graph = buildGraph(words, degree, new HashSet<>()); + + Queue zeroDegreeNodes = new LinkedList<>(); + for (Map.Entry entry : degree.entrySet()) { + if (entry.getValue() == 0) { + zeroDegreeNodes.offer(entry.getKey()); + } + } + + StringBuilder result = new StringBuilder(); + + while (!zeroDegreeNodes.isEmpty()) { + char vertex = zeroDegreeNodes.poll(); + result.append(vertex); + Set neighbors = graph.get(vertex); + if (neighbors != null) { + for (char neighbor : graph.get(vertex)) { + int count = degree.get(neighbor); + count--; + if (count == 0) { + zeroDegreeNodes.offer(neighbor); + } else { + degree.put(neighbor, count); + } + } + } + graph.remove(vertex); + } + + return graph.size() > 0 ? "" : result.toString(); + } + + public static void main(String args[]) { + AlientDictionary ad = new AlientDictionary(); + String[] words1 = {"zy","zx"}; + String[] words = {"wrt", "wrf", "er", "ett", "rftt"}; + String[] words2 = {"wrtkj","wrt"}; + String result = ad.alienOrder1(words2); + System.out.print(result); + + + //w -> e + // e -> r + //t -> f + //r -> t + // + } +} diff --git a/showmecode_100/java/com/interview/graph/AllCyclesInDirectedGraphJohnson.java b/showmecode_100/java/com/interview/graph/AllCyclesInDirectedGraphJohnson.java new file mode 100644 index 00000000..9bdb1928 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/AllCyclesInDirectedGraphJohnson.java @@ -0,0 +1,183 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Date 11/16/2015 + * @author Tushar Roy + * + * Find all cycles in directed graph using Johnson's algorithm + * + * Time complexity - O(E + V).(c+1) where c is number of cycles found + * Space complexity - O(E + V + s) where s is sum of length of all cycles. + * + * Link to youtube video - https://youtu.be/johyrWospv0 + * + * References + * https://github.com/jgrapht/jgrapht/blob/master/jgrapht-core/src/main/java/org/jgrapht/alg/cycle/JohnsonSimpleCycles.java + */ +public class AllCyclesInDirectedGraphJohnson { + Set> blockedSet; + Map, Set>> blockedMap; + Deque> stack; + List>> allCycles; + + /** + * Main function to find all cycles + */ + public List>> simpleCyles(Graph graph) { + + blockedSet = new HashSet<>(); + blockedMap = new HashMap<>(); + stack = new LinkedList<>(); + allCycles = new ArrayList<>(); + long startIndex = 1; + TarjanStronglyConnectedComponent tarjan = new TarjanStronglyConnectedComponent(); + while(startIndex <= graph.getAllVertex().size()) { + Graph subGraph = createSubGraph(startIndex, graph); + List>> sccs = tarjan.scc(subGraph); + //this creates graph consisting of strongly connected components only and then returns the + //least indexed vertex among all the strongly connected component graph. + //it also ignore one vertex graph since it wont have any cycle. + Optional> maybeLeastVertex = leastIndexSCC(sccs, subGraph); + if(maybeLeastVertex.isPresent()) { + Vertex leastVertex = maybeLeastVertex.get(); + blockedSet.clear(); + blockedMap.clear(); + findCyclesInSCG(leastVertex, leastVertex); + startIndex = leastVertex.getId() + 1; + } else { + break; + } + } + return allCycles; + } + + private Optional> leastIndexSCC(List>> sccs, Graph subGraph) { + long min = Integer.MAX_VALUE; + Vertex minVertex = null; + Set> minScc = null; + for(Set> scc : sccs) { + if(scc.size() == 1) { + continue; + } + for(Vertex vertex : scc) { + if(vertex.getId() < min) { + min = vertex.getId(); + minVertex = vertex; + minScc = scc; + } + } + } + + if(minVertex == null) { + return Optional.empty(); + } + Graph graphScc = new Graph<>(true); + for(Edge edge : subGraph.getAllEdges()) { + if(minScc.contains(edge.getVertex1()) && minScc.contains(edge.getVertex2())) { + graphScc.addEdge(edge.getVertex1().getId(), edge.getVertex2().getId()); + } + } + return Optional.of(graphScc.getVertex(minVertex.getId())); + } + + private void unblock(Vertex u) { + blockedSet.remove(u); + if(blockedMap.get(u) != null) { + blockedMap.get(u).forEach( v -> { + if(blockedSet.contains(v)) { + unblock(v); + } + }); + blockedMap.remove(u); + } + } + + private boolean findCyclesInSCG( + Vertex startVertex, + Vertex currentVertex) { + boolean foundCycle = false; + stack.push(currentVertex); + blockedSet.add(currentVertex); + + for (Edge e : currentVertex.getEdges()) { + Vertex neighbor = e.getVertex2(); + //if neighbor is same as start vertex means cycle is found. + //Store contents of stack in final result. + if (neighbor == startVertex) { + List> cycle = new ArrayList<>(); + stack.push(startVertex); + cycle.addAll(stack); + Collections.reverse(cycle); + stack.pop(); + allCycles.add(cycle); + foundCycle = true; + } //explore this neighbor only if it is not in blockedSet. + else if (!blockedSet.contains(neighbor)) { + boolean gotCycle = + findCyclesInSCG(startVertex, neighbor); + foundCycle = foundCycle || gotCycle; + } + } + //if cycle is found with current vertex then recursively unblock vertex and all vertices which are dependent on this vertex. + if (foundCycle) { + //remove from blockedSet and then remove all the other vertices dependent on this vertex from blockedSet + unblock(currentVertex); + } else { + //if no cycle is found with current vertex then don't unblock it. But find all its neighbors and add this + //vertex to their blockedMap. If any of those neighbors ever get unblocked then unblock current vertex as well. + for (Edge e : currentVertex.getEdges()) { + Vertex w = e.getVertex2(); + Set> bSet = getBSet(w); + bSet.add(currentVertex); + } + } + //remove vertex from the stack. + stack.pop(); + return foundCycle; + } + + private Set> getBSet(Vertex v) { + return blockedMap.computeIfAbsent(v, (key) -> + new HashSet<>() ); + } + + private Graph createSubGraph(long startVertex, Graph graph) { + Graph subGraph = new Graph<>(true); + for(Edge edge : graph.getAllEdges()) { + if(edge.getVertex1().getId() >= startVertex && edge.getVertex2().getId() >= startVertex) { + subGraph.addEdge(edge.getVertex1().getId(), edge.getVertex2().getId()); + } + } + return subGraph; + } + + public static void main(String args[]) { + AllCyclesInDirectedGraphJohnson johnson = new AllCyclesInDirectedGraphJohnson(); + Graph graph = new Graph<>(true); + graph.addEdge(1, 2); + graph.addEdge(1, 8); + graph.addEdge(1, 5); + graph.addEdge(2, 9); + graph.addEdge(2, 7); + graph.addEdge(2, 3); + graph.addEdge(3, 1); + graph.addEdge(3, 2); + graph.addEdge(3, 6); + graph.addEdge(3, 4); + graph.addEdge(6, 4); + graph.addEdge(4, 5); + graph.addEdge(5, 2); + graph.addEdge(8, 9); + graph.addEdge(9, 8); + + List>> allCycles = johnson.simpleCyles(graph); + allCycles.forEach(cycle -> { + StringJoiner joiner = new StringJoiner("->"); + cycle.forEach(vertex -> joiner.add(String.valueOf(vertex.getId()))); + System.out.println(joiner); + }); + } + +} diff --git a/showmecode_100/java/com/interview/graph/AllCyclesInDirectedGraphTarjan.java b/showmecode_100/java/com/interview/graph/AllCyclesInDirectedGraphTarjan.java new file mode 100644 index 00000000..98fe8885 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/AllCyclesInDirectedGraphTarjan.java @@ -0,0 +1,108 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Find all simple cycles in a directed graph using Tarjan's algorithm. + * + * Space complexity - O(E + V + S) where S is length of all cycles + * Time complexity - O(E*V(C+1) where C is total number of cycles + * + * Reference - https://ecommons.cornell.edu/handle/1813/5941 + * https://github.com/jgrapht/jgrapht/tree/master/jgrapht-core/src/main/java/org/jgrapht/alg/cycle + */ +public class AllCyclesInDirectedGraphTarjan { + + private Set> visited; + private Deque> pointStack; + private Deque> markedStack; + private Set> markedSet; + + public AllCyclesInDirectedGraphTarjan() { + reset(); + } + + private void reset() { + visited = new HashSet<>(); + pointStack = new LinkedList<>(); + markedStack = new LinkedList<>(); + markedSet = new HashSet<>(); + } + + public List>> findAllSimpleCycles(Graph graph) { + reset(); + List>> result = new ArrayList<>(); + for(Vertex vertex : graph.getAllVertex()) { + findAllSimpleCycles(vertex, vertex, result); + visited.add(vertex); + while(!markedStack.isEmpty()) { + markedSet.remove(markedStack.pollFirst()); + } + } + return result; + } + + private boolean findAllSimpleCycles(Vertex start, Vertex current,List>> result) { + boolean hasCycle = false; + pointStack.offerFirst(current); + markedSet.add(current); + markedStack.offerFirst(current); + + for (Vertex w : current.getAdjacentVertexes()) { + if (visited.contains(w)) { + continue; + } else if (w.equals(start)) { + hasCycle = true; + pointStack.offerFirst(w); + List> cycle = new ArrayList<>(); + Iterator> itr = pointStack.descendingIterator(); + while(itr.hasNext()) { + cycle.add(itr.next()); + } + pointStack.pollFirst(); + result.add(cycle); + } else if (!markedSet.contains(w)) { + hasCycle = findAllSimpleCycles(start, w, result) || hasCycle; + } + } + + if (hasCycle) { + while(!markedStack.peekFirst().equals(current)) { + markedSet.remove(markedStack.pollFirst()); + } + markedSet.remove(markedStack.pollFirst()); + } + + pointStack.pollFirst(); + return hasCycle; + } + + public static void main(String args[]) { + Graph graph = new Graph<>(true); + graph.addEdge(0, 1); + graph.addEdge(1, 4); + graph.addEdge(1, 7); + graph.addEdge(1, 6); + graph.addEdge(4, 2); + graph.addEdge(4, 3); + graph.addEdge(2, 4); + graph.addEdge(2, 7); + graph.addEdge(2, 6); + graph.addEdge(7, 8); + graph.addEdge(7, 5); + graph.addEdge(5, 2); + graph.addEdge(5, 3); + graph.addEdge(3, 7); + graph.addEdge(3, 6); + graph.addEdge(3, 4); + graph.addEdge(6, 5); + graph.addEdge(6, 8); + + AllCyclesInDirectedGraphTarjan tarjan = new AllCyclesInDirectedGraphTarjan(); + List>> result = tarjan.findAllSimpleCycles(graph); + result.forEach(cycle -> { + cycle.forEach(v -> System.out.print(v.getId() + " ")); + System.out.println(); + }); + } +} diff --git a/showmecode_100/java/com/interview/graph/ArticulationPoint.java b/showmecode_100/java/com/interview/graph/ArticulationPoint.java new file mode 100644 index 00000000..6aa3187d --- /dev/null +++ b/showmecode_100/java/com/interview/graph/ArticulationPoint.java @@ -0,0 +1,130 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Date 08/22/2015 + * @author Tushar Roy + * + * Find articulation points in connected undirected graph. + * Articulation points are vertices such that removing any one of them disconnects the graph. + * + * We need to do DFS of this graph and keep visitedTime and lowTime for each vertex. + * lowTime is keeps track of back edges. + * + * If any one of following condition meets then vertex is articulation point. + * + * 1) If vertex is root of DFS and has atlesat 2 independent children.(By independent it means they are + * not connected to each other except via this vertex). This condition is needed because if we + * started from corner vertex it will meet condition 2 but still is not an articulation point. To filter + * out those vertices we need this condition. + * + * 2) It is not root of DFS and if visitedTime of vertex <= lowTime of any adjacent vertex then its articulation point. + * + * Time complexity is O(E + V) + * Space complexity is O(V) + * + * References: + * https://en.wikipedia.org/wiki/Biconnected_component + * http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ + */ +public class ArticulationPoint { + + private int time; + + public Set> findarticulationPoints(Graph graph) { + time = 0; + Set> visited = new HashSet<>(); + Set> articulationPoints = new HashSet<>(); + Vertex startVertex = graph.getAllVertex().iterator().next(); + + Map, Integer> visitedTime = new HashMap<>(); + Map, Integer> lowTime = new HashMap<>(); + Map, Vertex> parent = new HashMap<>(); + + DFS(visited,articulationPoints,startVertex, visitedTime, lowTime, parent); + return articulationPoints; + } + + private void DFS(Set> visited, + Set> articulationPoints, Vertex vertex, + Map, Integer> visitedTime, + Map, Integer> lowTime, Map, Vertex> parent) { + visited.add(vertex); + visitedTime.put(vertex, time); + lowTime.put(vertex, time); + time++; + int childCount =0; + boolean isArticulationPoint = false; + for(Vertex adj : vertex.getAdjacentVertexes()){ + //if adj is same as parent then just ignore this vertex. + if(adj.equals(parent.get(vertex))) { + continue; + } + //if adj has not been visited then visit it. + if(!visited.contains(adj)) { + parent.put(adj, vertex); + childCount++; + DFS(visited, articulationPoints, adj, visitedTime, lowTime, parent); + + if(visitedTime.get(vertex) <= lowTime.get(adj)) { + isArticulationPoint = true; + } else { + //below operation basically does lowTime[vertex] = min(lowTime[vertex], lowTime[adj]); + lowTime.compute(vertex, (currentVertex, time) -> + Math.min(time, lowTime.get(adj)) + ); + } + + } else { //if adj is already visited see if you can get better low time. + //below operation basically does lowTime[vertex] = min(lowTime[vertex], visitedTime[adj]); + lowTime.compute(vertex, (currentVertex, time) -> + Math.min(time, visitedTime.get(adj)) + ); + } + } + + //checks if either condition 1 or condition 2 meets). If yes then it is articulation point. + if((parent.get(vertex) == null && childCount >= 2) || parent.get(vertex) != null && isArticulationPoint ) { + articulationPoints.add(vertex); + } + + } + + public static void main(String args[]){ + Graph graph = new Graph<>(false); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(1, 3); + graph.addEdge(1, 4); + graph.addEdge(4, 5); + graph.addEdge(5, 6); + graph.addEdge(6, 7); + graph.addEdge(7, 5); + graph.addEdge(6, 8); + + //bigger example + /* + graph.addEdge(0, 1); + graph.addEdge(0, 2); + graph.addEdge(0, 3); + graph.addEdge(0, 4); + graph.addEdge(4, 2); + graph.addEdge(3, 5); + graph.addEdge(4, 6); + graph.addEdge(6, 3); + graph.addEdge(6, 7); + graph.addEdge(6, 8); + graph.addEdge(7, 9); + graph.addEdge(9, 10); + graph.addEdge(8, 10);*/ + + ArticulationPoint ap = new ArticulationPoint(); + Set> aPoints = ap.findarticulationPoints(graph); + aPoints.forEach(point -> System.out.println(point)); + } + +} diff --git a/showmecode_100/java/com/interview/graph/BellmanFordShortestPath.java b/showmecode_100/java/com/interview/graph/BellmanFordShortestPath.java new file mode 100644 index 00000000..6f79a525 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/BellmanFordShortestPath.java @@ -0,0 +1,93 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 11/05/2015 + * @author Tushar Roy + * + * Write program for Bellman Ford algorithm to find single source shortest path in directed graph. + * Bellman ford works with negative edges as well unlike Dijksra's algorithm. If there is negative + * weight cycle it detects it. + * + * Time complexity - O(EV) + * Space complexity - O(V) + * + * References + * https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm + * http://www.geeksforgeeks.org/dynamic-programming-set-23-bellman-ford-algorithm/ + */ + +public class BellmanFordShortestPath { + + //some random big number is treated as infinity. I m not taking INTEGER_MAX as infinity because + //doing any addition on that causes integer overflow + private static int INFINITY = 10000000; + + class NegativeWeightCycleException extends RuntimeException { + } + + public Map, Integer> getShortestPath(Graph graph, + Vertex sourceVertex) { + + Map, Integer> distance = new HashMap<>(); + Map, Vertex> parent = new HashMap<>(); + + //set distance of every vertex to be infinity initially + for(Vertex v : graph.getAllVertex()) { + distance.put(v, INFINITY); + parent.put(v, null); + } + + //set distance of source vertex to be 0 + distance.put(sourceVertex, 0); + + int V = graph.getAllVertex().size(); + + //relax edges repeatedly V - 1 times + for (int i = 0; i < V - 1 ; i++) { + for (Edge edge : graph.getAllEdges()) { + Vertex u = edge.getVertex1(); + Vertex v = edge.getVertex2(); + //relax the edge + //if we get better distance to v via u then use this distance + //and set u as parent of v. + if (distance.get(u) + edge.getWeight() < distance.get(v)) { + distance.put(v, distance.get(u) + edge.getWeight()); + parent.put(v, u); + } + } + } + + //relax all edges again. If we still get lesser distance it means + //there is negative weight cycle in the graph. Throw exception in that + //case + for (Edge edge : graph.getAllEdges()) { + Vertex u = edge.getVertex1(); + Vertex v = edge.getVertex2(); + if (distance.get(u) + edge.getWeight() < distance.get(v)) { + throw new NegativeWeightCycleException(); + } + } + return distance; + } + + public static void main(String args[]){ + + Graph graph = new Graph<>(false); + graph.addEdge(0, 3, 8); + graph.addEdge(0, 1, 4); + graph.addEdge(0, 2, 5); + graph.addEdge(1, 2, -3); + graph.addEdge(2, 4, 4); + graph.addEdge(3, 4, 2); + graph.addEdge(4, 3, 1); + + BellmanFordShortestPath shortestPath = new BellmanFordShortestPath(); + Vertex startVertex = graph.getAllVertex().iterator().next(); + Map,Integer> distance = shortestPath.getShortestPath(graph, startVertex); + System.out.println(distance); + } + +} diff --git a/showmecode_100/java/com/interview/graph/BinaryMaxHeap.java b/showmecode_100/java/com/interview/graph/BinaryMaxHeap.java new file mode 100644 index 00000000..5ad7144f --- /dev/null +++ b/showmecode_100/java/com/interview/graph/BinaryMaxHeap.java @@ -0,0 +1,105 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.List; + +public class BinaryMaxHeap { + + private List allNodes = new ArrayList(); + + class Node { + int weight; + T data; + } + + public void add(int weight,T data) { + + Node node = new Node(); + node.weight = weight; + node.data = data; + allNodes.add(node); + int size = allNodes.size(); + int current = size - 1; + int parentIndex = (current - 1) / 2; + + while (parentIndex >= 0) { + Node parentNode = allNodes.get(parentIndex); + Node currentNode = allNodes.get(current); + if (parentNode.weight < currentNode.weight) { + swap(parentNode,currentNode); + current = parentIndex; + parentIndex = (parentIndex - 1) / 2; + } else { + break; + } + } + + } + + private void swap(Node node1,Node node2){ + int weight = node1.weight; + T data = node1.data; + + node1.data = node2.data; + node1.weight = node2.weight; + + node2.data = data; + node2.weight = weight; + } + + public T max(){ + return allNodes.get(0).data; + } + + public boolean empty(){ + return allNodes.size() == 0; + } + + + public T extractMap(){ + int size = allNodes.size() -1; + T max = allNodes.get(0).data; + int lastNodeWeight = allNodes.get(size).weight; + allNodes.get(0).weight = lastNodeWeight; + allNodes.get(0).data = allNodes.get(size).data; + allNodes.remove(size); + + int currentIndex = 0; + size--; + while(true){ + int left = 2*currentIndex + 1; + int right = 2*currentIndex + 2; + if(left > size){ + break; + } + if(right > size){ + right = left; + } + int largerIndex = allNodes.get(left).weight >= allNodes.get(right).weight ? left : right; + if(allNodes.get(currentIndex).weight < allNodes.get(largerIndex).weight){ + swap(allNodes.get(currentIndex),allNodes.get(largerIndex)); + currentIndex = largerIndex; + }else{ + break; + } + } + return max; + } + + public void printHeap(){ + for(Node n : allNodes){ + System.out.println(n.weight + " " + n.data); + } + } + + public static void main(String args[]){ + BinaryMaxHeap heap = new BinaryMaxHeap(); + heap.add(3, "Tushar"); + heap.add(4, "Ani"); + heap.add(8, "Vijay"); + heap.add(10, "Pramila"); + heap.add(5, "Roy"); + heap.add(6, "NTF"); + heap.printHeap(); + } +} diff --git a/showmecode_100/java/com/interview/graph/BinaryMinHeap.java b/showmecode_100/java/com/interview/graph/BinaryMinHeap.java new file mode 100644 index 00000000..2b669661 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/BinaryMinHeap.java @@ -0,0 +1,199 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Date 04/06/2013 + * @author Tushar Roy + * + * Data structure to support following operations + * extracMin - O(logn) + * addToHeap - O(logn) + * containsKey - O(1) + * decreaseKey - O(logn) + * getKeyWeight - O(1) + * + * It is a combination of binary heap and hash map + * + */ +public class BinaryMinHeap { + + private List allNodes = new ArrayList<>(); + private Map nodePosition = new HashMap<>(); + + public class Node { + int weight; + T key; + } + + /** + * Checks where the key exists in heap or not + */ + public boolean containsData(T key){ + return nodePosition.containsKey(key); + } + + /** + * Add key and its weight to they heap + */ + public void add(int weight,T key) { + Node node = new Node(); + node.weight = weight; + node.key = key; + allNodes.add(node); + int size = allNodes.size(); + int current = size - 1; + int parentIndex = (current - 1) / 2; + nodePosition.put(node.key, current); + + while (parentIndex >= 0) { + Node parentNode = allNodes.get(parentIndex); + Node currentNode = allNodes.get(current); + if (parentNode.weight > currentNode.weight) { + swap(parentNode,currentNode); + updatePositionMap(parentNode.key,currentNode.key,parentIndex,current); + current = parentIndex; + parentIndex = (parentIndex - 1) / 2; + } else { + break; + } + } + } + + /** + * Get the heap min without extracting the key + */ + public T min(){ + return allNodes.get(0).key; + } + + /** + * Checks with heap is empty or not + */ + public boolean empty(){ + return allNodes.size() == 0; + } + + /** + * Decreases the weight of given key to newWeight + */ + public void decrease(T data, int newWeight){ + Integer position = nodePosition.get(data); + allNodes.get(position).weight = newWeight; + int parent = (position -1 )/2; + while(parent >= 0){ + if(allNodes.get(parent).weight > allNodes.get(position).weight){ + swap(allNodes.get(parent), allNodes.get(position)); + updatePositionMap(allNodes.get(parent).key,allNodes.get(position).key,parent,position); + position = parent; + parent = (parent-1)/2; + }else{ + break; + } + } + } + + /** + * Get the weight of given key + */ + public Integer getWeight(T key) { + Integer position = nodePosition.get(key); + if( position == null ) { + return null; + } else { + return allNodes.get(position).weight; + } + } + + /** + * Returns the min node of the heap + */ + public Node extractMinNode() { + int size = allNodes.size() -1; + Node minNode = new Node(); + minNode.key = allNodes.get(0).key; + minNode.weight = allNodes.get(0).weight; + + int lastNodeWeight = allNodes.get(size).weight; + allNodes.get(0).weight = lastNodeWeight; + allNodes.get(0).key = allNodes.get(size).key; + nodePosition.remove(minNode.key); + nodePosition.remove(allNodes.get(0)); + nodePosition.put(allNodes.get(0).key, 0); + allNodes.remove(size); + + int currentIndex = 0; + size--; + while(true){ + int left = 2*currentIndex + 1; + int right = 2*currentIndex + 2; + if(left > size){ + break; + } + if(right > size){ + right = left; + } + int smallerIndex = allNodes.get(left).weight <= allNodes.get(right).weight ? left : right; + if(allNodes.get(currentIndex).weight > allNodes.get(smallerIndex).weight){ + swap(allNodes.get(currentIndex), allNodes.get(smallerIndex)); + updatePositionMap(allNodes.get(currentIndex).key,allNodes.get(smallerIndex).key,currentIndex,smallerIndex); + currentIndex = smallerIndex; + }else{ + break; + } + } + return minNode; + } + /** + * Extract min value key from the heap + */ + public T extractMin(){ + Node node = extractMinNode(); + return node.key; + } + + private void printPositionMap(){ + System.out.println(nodePosition); + } + + private void swap(Node node1,Node node2){ + int weight = node1.weight; + T data = node1.key; + + node1.key = node2.key; + node1.weight = node2.weight; + + node2.key = data; + node2.weight = weight; + } + + private void updatePositionMap(T data1, T data2, int pos1, int pos2){ + nodePosition.remove(data1); + nodePosition.remove(data2); + nodePosition.put(data1, pos1); + nodePosition.put(data2, pos2); + } + + public void printHeap(){ + for(Node n : allNodes){ + System.out.println(n.weight + " " + n.key); + } + } + + public static void main(String args[]){ + BinaryMinHeap heap = new BinaryMinHeap(); + heap.add(3, "Tushar"); + heap.add(4, "Ani"); + heap.add(8, "Vijay"); + heap.add(10, "Pramila"); + heap.add(5, "Roy"); + heap.add(6, "NTF"); + heap.add(2,"AFR"); + heap.decrease("Pramila", 1); + heap.printHeap(); + heap.printPositionMap(); + } +} diff --git a/showmecode_100/java/com/interview/graph/BiparteGraph.java b/showmecode_100/java/com/interview/graph/BiparteGraph.java new file mode 100644 index 00000000..4e4a519c --- /dev/null +++ b/showmecode_100/java/com/interview/graph/BiparteGraph.java @@ -0,0 +1,115 @@ +package com.interview.graph; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; + +/** + http://www.geeksforgeeks.org/bipartite-graph/ + Includes both DFS and BFS method + */ +public class BiparteGraph { + + public boolean isBiparte(Graph graph){ + + Set> redSet = new HashSet>(); + Set> blueSet = new HashSet>(); + + Queue> queue = new LinkedList>(); + + for(Vertex vertex : graph.getAllVertex()){ + if(!redSet.contains(vertex) && !blueSet.contains(vertex)){ + queue.add(vertex); + redSet.add(vertex); + while(!queue.isEmpty()){ + vertex = queue.poll(); + for(Vertex v : vertex.getAdjacentVertexes()){ + if(redSet.contains(vertex)){ + if(redSet.contains(v)){ + return false; + }if(blueSet.contains(v)){ + continue; + } + blueSet.add(v); + } + else if(blueSet.contains(vertex)){ + if(blueSet.contains(v)){ + return false; + }if(redSet.contains(v)){ + continue; + } + redSet.add(v); + } + queue.add(v); + } + } + } + } + System.out.println(redSet); + System.out.println(blueSet); + return true; + } + + public boolean isBiparteDFS(Graph graph){ + Set> redSet = new HashSet>(); + Set> blueSet = new HashSet>(); + for(Vertex vertex : graph.getAllVertex()){ + if(redSet.contains(vertex) || blueSet.contains(vertex)){ + continue; + } + boolean flag = isBiparteDFS(vertex, redSet, blueSet, true); + if(!flag){ + return false; + } + } + return true; + } + + private boolean isBiparteDFS(Vertex vertex, Set> redSet, Set> blueSet,boolean wasRed){ + + if(wasRed){ + if(redSet.contains(vertex)){ + return false; + } + else if(blueSet.contains(vertex)){ + return true; + } + blueSet.add(vertex); + } + + else if(!wasRed){ + if(blueSet.contains(vertex)){ + return false; + } + if(redSet.contains(vertex)){ + return true; + } + redSet.add(vertex); + } + + for(Vertex adj : vertex.getAdjacentVertexes()){ + boolean flag = isBiparteDFS(adj, redSet, blueSet, !wasRed); + if(!flag){ + return false; + } + } + return true; + + } + + public static void main(String argsp[]){ + Graph graph = new Graph(false); + graph.addEdge(1, 2); + graph.addEdge(2, 5); + graph.addEdge(1, 3); + graph.addEdge(3, 4); + graph.addEdge(4, 6); + graph.addEdge(5, 6); + graph.addEdge(7, 9); + graph.addEdge(7, 8); + BiparteGraph bi = new BiparteGraph(); + boolean result = bi.isBiparteDFS(graph); + System.out.print(result); + } +} diff --git a/showmecode_100/java/com/interview/graph/Boggle.java b/showmecode_100/java/com/interview/graph/Boggle.java new file mode 100644 index 00000000..043bbaa5 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/Boggle.java @@ -0,0 +1,147 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Date 03/04/2016 + * @author Tushar Roy + * + * Search for dictionary words in the board. + * Idea is to use trie for the dictionary which keeps search + * very efficient. + * + * https://leetcode.com/problems/word-search-ii/ + */ +public class Boggle { + + public List findWords(char[][] board, String[] words) { + Trie t = new Trie(); + for (String word : words) { + t.insert(word); + } + StringBuffer buff = new StringBuffer(); + Set result = new HashSet<>(); + Set visited = new HashSet<>(); + for (int i = 0; i < board.length; i++) { + for (int j = 0; j < board[i].length; j++) { + findWordsUtil(board, t, i, j, buff, visited, result, board[0].length); + } + } + return new ArrayList<>(result); + } + + private void findWordsUtil(char[][] board, Trie t , int i, int j, StringBuffer buff, Set visited, Set result, int col ) { + if (i < 0 || j < 0 || i >= board.length || j >= board[i].length) { + return; + } + + int val = i*col + j; + + if (visited.contains(val)) { + return; + } + + buff.append(board[i][j]); + String str = buff.toString(); + if(!t.startsWith(str)) { + buff.deleteCharAt(buff.length() - 1); + return; + } + visited.add(val); + + if(t.search(str)) { + result.add(buff.toString()); + } + + findWordsUtil(board, t, i + 1, j, buff, visited, result, col); + findWordsUtil(board, t, i, j + 1, buff, visited, result, col); + findWordsUtil(board, t, i, j - 1, buff, visited, result, col); + findWordsUtil(board, t, i - 1, j, buff, visited, result, col); + + buff.deleteCharAt(buff.length() - 1); + visited.remove(val); + } + + class TrieNode { + TrieNode[] child = new TrieNode[26]; + boolean isWord; + public TrieNode() { + } + } + + class Trie { + private TrieNode root; + + public Trie() { + root = new TrieNode(); + } + + // Inserts a word into the trie. + public void insert(String word) { + TrieNode current = root; + for (int i = 0; i < word.length(); i++) { + char ch = (char)(word.charAt(i) - 'a'); + + if (current.child[ch] == null) { + current.child[ch] = new TrieNode(); + } + current = current.child[ch]; + } + current.isWord = true; + } + + // Returns if the word is in the trie. + public boolean search(String word) { + TrieNode current = root; + for (int i = 0; i < word.length(); i++) { + char ch = (char)(word.charAt(i) - 'a'); + if (current.child[ch] == null) { + return false; + } + current = current.child[ch]; + } + return current.isWord; + } + + // Returns if there is any word in the trie + // that starts with the given prefix. + public boolean startsWith(String prefix) { + TrieNode current = root; + for (int i = 0; i < prefix.length(); i++) { + char ch = (char)(prefix.charAt(i) - 'a'); + if (current.child[ch] == null) { + return false; + } + current = current.child[ch]; + } + return true; + } + + public void printTrie() { + printTrieUtil(root); + } + + private void printTrieUtil(TrieNode root) { + if (root == null) { + return; + } + for (int i = 0; i < root.child.length; i++) { + if (root.child[i] != null) { + System.out.println((char)(i + 'a')); + printTrieUtil(root.child[i]); + } + } + } + } + + public static void main(String args[]) { + char[][] board = {{'o','a','a','n'},{'e','t','a','e'},{'i','h','k','r'},{'i','f','l','v'}}; + String[] words = {"oath","pea","eat","rain"}; + Boggle boggle = new Boggle(); + List result = boggle.findWords(board, words); + result.stream().forEach(s -> System.out.println(s)); + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/graph/Bridge.java b/showmecode_100/java/com/interview/graph/Bridge.java new file mode 100644 index 00000000..77f860d6 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/Bridge.java @@ -0,0 +1,67 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + http://www.geeksforgeeks.org/bridge-in-a-graph/ + */ +public class Bridge { + + private int time; + + public Set> getBridge(Graph graph){ + + Set> result = new HashSet>(); + Map,Integer> discovery = new HashMap,Integer>(); + Map,Integer> low = new HashMap,Integer>(); + Map,Vertex> parent = new HashMap,Vertex>(); + Map,Boolean> visited = new HashMap,Boolean>(); + + for(Vertex vertex : graph.getAllVertex()){ + if(!visited.containsKey(vertex)){ + BridgeUtil(vertex,result,discovery,low,parent,visited); + } + } + return result; + } + + private void BridgeUtil(Vertex vertex, Set> result,Map,Integer> discovery, + Map,Integer> low,Map,Vertex> parent,Map,Boolean> visited){ + visited.put(vertex, true); + discovery.put(vertex, time); + low.put(vertex, time); + time++; + for(Vertex child : vertex.getAdjacentVertexes()){ + if(!visited.containsKey(child)){ + parent.put(child, vertex); + BridgeUtil(child,result,discovery,low,parent,visited); + + if(discovery.get(vertex) < low.get(child) ){ + result.add(new Edge(vertex,child)); + } + low.put(vertex, Math.min(discovery.get(vertex), low.get(child))); + }else{ + if(!child.equals(parent.get(vertex))){ + low.put(vertex,Math.min(discovery.get(vertex), low.get(child))); + } + } + } + } + + public static void main(String args[]){ + + Graph graph = new Graph(false); + graph.addEdge(2, 1); + graph.addEdge(3, 1); + graph.addEdge(1, 4); + graph.addEdge(4, 5); + graph.addEdge(5, 1); + Bridge ap = new Bridge(); + Set> result = ap.getBridge(graph); + System.out.print(result); + } + +} diff --git a/showmecode_100/java/com/interview/graph/CloneDirectedGraph.java b/showmecode_100/java/com/interview/graph/CloneDirectedGraph.java new file mode 100644 index 00000000..c7a1f4eb --- /dev/null +++ b/showmecode_100/java/com/interview/graph/CloneDirectedGraph.java @@ -0,0 +1,86 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +/** + * Given a directed graph clone it in O(n) time where n is total number of edges + * Test cases + * Graph is directed/non directed + * Graph has 0 edges + * Graph has cycle + * Graph is linear + * Graph is dense + * Graph is sparse + */ +public class CloneDirectedGraph { + + public Graph clone(Graph graph){ + if(graph == null){ + return null; + } + if(!graph.isDirected){ + throw new IllegalArgumentException("Cloning non directed graph"); + } + if(graph.getAllVertex().size() == 0){ + throw new IllegalArgumentException("No vertex in the graph"); + } + Map,Vertex> cloneMap = new HashMap,Vertex>(); + for(Vertex vertex : graph.getAllVertex()){ + clone(vertex,cloneMap); + } + Graph clonedGraph = new Graph<>(true); + for(Vertex vertex : cloneMap.values()){ + clonedGraph.addVertex(vertex); + } + return clonedGraph; + } + + private void clone(Vertex origVertex,Map,Vertex> cloneMap){ + Vertex cloneVertex = null; + if(cloneMap.containsKey(origVertex)){ + cloneVertex = cloneMap.get(origVertex); + }else{ + cloneVertex = new Vertex(origVertex.getId()*10); + cloneMap.put(origVertex, cloneVertex); + } + for(Edge edge : origVertex.getEdges()){ + if(edge.getVertex1().equals(origVertex)){ + Vertex adjVertex = edge.getVertex2(); + updateMap(cloneMap,cloneVertex,adjVertex,edge); + }else{ + Vertex adjVertex = edge.getVertex1(); + updateMap(cloneMap,cloneVertex,adjVertex,edge); + } + } + } + + private void updateMap(Map,Vertex> cloneMap, Vertex cloneVertex, Vertex adjVertex, Edge edge){ + if(cloneMap.containsKey(adjVertex)){ + Vertex adjVertexClone = cloneMap.get(adjVertex); + Edge newEdge = new Edge(cloneVertex, adjVertexClone, edge.isDirected(), edge.getWeight()); + cloneVertex.addAdjacentVertex(newEdge, adjVertexClone); + }else{ + Vertex adjVertexClone = new Vertex(adjVertex.getId()); + cloneMap.put(adjVertex, adjVertexClone); + Edge newEdge = new Edge(cloneVertex, adjVertexClone, edge.isDirected(), edge.getWeight()); + cloneVertex.addAdjacentVertex(newEdge, adjVertexClone); + } + } + + public static void main(String args[]){ + Graph graph = new Graph(true); + graph.addEdge(0, 3); + graph.addEdge(0, 2); + graph.addEdge(0, 4); + graph.addEdge(3, 2); + graph.addEdge(2, 0); + graph.addEdge(4, 3); + graph.addEdge(4, 1); + graph.addEdge(1, 2); + + CloneDirectedGraph cg = new CloneDirectedGraph<>(); + Graph clonedGraph = cg.clone(graph); + System.out.println(clonedGraph); + } +} diff --git a/showmecode_100/java/com/interview/graph/CloneGraph.java b/showmecode_100/java/com/interview/graph/CloneGraph.java new file mode 100644 index 00000000..32f77975 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/CloneGraph.java @@ -0,0 +1,48 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. + * https://leetcode.com/problems/clone-graph/ + */ +public class CloneGraph { + + class UndirectedGraphNode { + int label; + List neighbors; + UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList(); } + }; + + public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { + if (node == null) { + return null; + } + UndirectedGraphNode clone = new UndirectedGraphNode(node.label); + Set visited = new HashSet<>(); + Map map = new HashMap<>(); + map.put(clone.label, clone); + dfs(node, clone, map, visited); + return clone; + } + + private void dfs(UndirectedGraphNode current, UndirectedGraphNode clone, Map map, Set visited) { + if (visited.contains(current.label)) { + return; + } + visited.add(current.label); + for (UndirectedGraphNode adj : current.neighbors) { + if (adj.label != current.label) { + UndirectedGraphNode adjClone = map.get(adj.label); + if (adjClone == null) { + adjClone = new UndirectedGraphNode(adj.label); + map.put(adjClone.label, adjClone); + } + clone.neighbors.add(adjClone); + dfs(adj, adjClone, map, visited); + } else { + clone.neighbors.add(clone); + } + } + } +} diff --git a/showmecode_100/java/com/interview/graph/ConvertOneWordToAnother.java b/showmecode_100/java/com/interview/graph/ConvertOneWordToAnother.java new file mode 100644 index 00000000..74ddd0f0 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/ConvertOneWordToAnother.java @@ -0,0 +1,69 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; +import java.util.Set; + +/** + * 150s qs 18.10 + * Given two words of equal length in dictionary convert one word to another one letter at a time + * in such a way that all intermediate words are int the dictionary + */ +public class ConvertOneWordToAnother { + + public void convert(String word1, String word2, Set dict) { + + Set visited = new HashSet(); + Queue queue = new LinkedList(); + Map parentMap = new HashMap(); + queue.add(word1); + visited.add(word1); + while (queue.size() != 0) { + String word = queue.poll(); + if (word.equals(word2)) { + break; + } + for (int i = 0; i < word.length(); i++) { + for (int ch = 'a'; ch <= 'z'; ch++) { + String newWord = replace(word, i, (char) ch); + if (dict.contains(newWord)){ + if (!visited.contains(newWord)) { + parentMap.put(newWord, word); + queue.add(newWord); + visited.add(newWord); + } + } + } + } + } + String word = word2; + while(word != null){ + System.out.println(word); + word = parentMap.get(word); + } + + } + + public String replace(String newWord, int pos, char ch) { + StringBuffer buffer = new StringBuffer(); + buffer.append(newWord.substring(0, pos)); + buffer.append(ch); + buffer.append(newWord.substring(pos+1,newWord.length())); + return buffer.toString(); + } + + + public static void main(String args[]){ + Set dictionary = new HashSet(); + dictionary.add("cat"); + dictionary.add("pat"); + dictionary.add("pit"); + dictionary.add("pid"); + dictionary.add("did"); + ConvertOneWordToAnother cow = new ConvertOneWordToAnother(); + cow.convert("cat", "did", dictionary); + } +} diff --git a/showmecode_100/java/com/interview/graph/CourseSchedule.java b/showmecode_100/java/com/interview/graph/CourseSchedule.java new file mode 100644 index 00000000..a847b58c --- /dev/null +++ b/showmecode_100/java/com/interview/graph/CourseSchedule.java @@ -0,0 +1,74 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +/** + * Date 03/01/2016 + * @author Tushar Roy + * + * There are a total of n courses you have to take, labeled from 0 to n - 1. + * Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] + * Given the total number of courses and a list of prerequisite pairs, return the ordering of courses you should take to finish all courses. + * There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array. + * + * Time complexity O(n) + * Space complexity O(n) + * + * https://leetcode.com/problems/course-schedule-ii/ + */ +public class CourseSchedule { + public int[] findOrder(int numCourses, int[][] prerequisites) { + boolean[] used = new boolean[numCourses]; + Neighbors[] graph = new Neighbors[numCourses]; + + for (int i = 0; i < graph.length; i++) { + graph[i] = new Neighbors(); + } + + for (int[] tuple : prerequisites) { + graph[tuple[1]].neighbor.add(tuple[0]); + } + Deque stack = new LinkedList<>(); + boolean[] dfs = new boolean[numCourses]; + + for (int i = 0; i < numCourses; i++) { + if (topSort(i, graph, used, stack, dfs)) { + return new int[0]; + } + } + + int[] output = new int[numCourses]; + int index = 0; + while (!stack.isEmpty()) { + output[index++] = stack.pollFirst(); + } + + return output; + } + + class Neighbors { + List neighbor = new ArrayList<>(); + } + + private boolean topSort(int course, Neighbors[] graph, boolean[] used, Deque stack, boolean[] dfs) { + if (used[course]) { + return false; + } + if (dfs[course]) { + return true; + } + dfs[course] = true; + for (int adj : graph[course].neighbor) { + if (topSort(adj, graph, used, stack, dfs)) { + return true; + } + } + dfs[course] = false; + used[course] = true; + stack.offerFirst(course); + return false; + } +} diff --git a/showmecode_100/java/com/interview/graph/CycleInDirectedGraph.java b/showmecode_100/java/com/interview/graph/CycleInDirectedGraph.java new file mode 100644 index 00000000..f96c2627 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/CycleInDirectedGraph.java @@ -0,0 +1,69 @@ +package com.interview.graph; + +import java.util.HashSet; +import java.util.Set; + +/** + * http://www.geeksforgeeks.org/detect-cycle-in-a-graph/ + */ +public class CycleInDirectedGraph { + + public boolean hasCycle(Graph graph) { + Set> whiteSet = new HashSet<>(); + Set> graySet = new HashSet<>(); + Set> blackSet = new HashSet<>(); + + for (Vertex vertex : graph.getAllVertex()) { + whiteSet.add(vertex); + } + + while (whiteSet.size() > 0) { + Vertex current = whiteSet.iterator().next(); + if(dfs(current, whiteSet, graySet, blackSet)) { + return true; + } + } + return false; + } + + private boolean dfs(Vertex current, Set> whiteSet, + Set> graySet, Set> blackSet ) { + //move current to gray set from white set and then explore it. + moveVertex(current, whiteSet, graySet); + for(Vertex neighbor : current.getAdjacentVertexes()) { + //if in black set means already explored so continue. + if (blackSet.contains(neighbor)) { + continue; + } + //if in gray set then cycle found. + if (graySet.contains(neighbor)) { + return true; + } + if(dfs(neighbor, whiteSet, graySet, blackSet)) { + return true; + } + } + //move vertex from gray set to black set when done exploring. + moveVertex(current, graySet, blackSet); + return false; + } + + private void moveVertex(Vertex vertex, Set> sourceSet, + Set> destinationSet) { + sourceSet.remove(vertex); + destinationSet.add(vertex); + } + + public static void main(String args[]){ + Graph graph = new Graph<>(true); + graph.addEdge(1, 2); + graph.addEdge(1, 3); + graph.addEdge(2, 3); + graph.addEdge(4, 1); + graph.addEdge(4, 5); + graph.addEdge(5, 6); + graph.addEdge(6, 4); + CycleInDirectedGraph cdg = new CycleInDirectedGraph(); + System.out.println(cdg.hasCycle(graph)); + } +} diff --git a/showmecode_100/java/com/interview/graph/CycleUndirectedGraph.java b/showmecode_100/java/com/interview/graph/CycleUndirectedGraph.java new file mode 100644 index 00000000..93e3b9df --- /dev/null +++ b/showmecode_100/java/com/interview/graph/CycleUndirectedGraph.java @@ -0,0 +1,88 @@ +package com.interview.graph; + +import java.util.HashSet; +import java.util.Set; + +/** + * Date 10/11/2014 + * @author Tushar Roy + * + * Given an undirected graph find cycle in this graph. + * + * Solution + * This can be solved in many ways. + * Below is the code to solve it using disjoint sets and DFS. + * + * Runtime and space complexity for both the techniques is O(v) + * where v is total number of vertices in the graph. + */ +public class CycleUndirectedGraph { + + public boolean hasCycleUsingDisjointSets(Graph graph){ + DisjointSet disjointSet = new DisjointSet(); + + for(Vertex vertex : graph.getAllVertex()){ + disjointSet.makeSet(vertex.getId()); + } + + for(Edge edge : graph.getAllEdges()){ + long parent1 = disjointSet.findSet(edge.getVertex1().getId()); + long parent2 = disjointSet.findSet(edge.getVertex2().getId()); + if(parent1 == parent2){ + return true; + } + disjointSet.union(edge.getVertex1().getId(), edge.getVertex2().getId()); + } + return false; + } + + public boolean hasCycleDFS(Graph graph){ + Set> visited = new HashSet>(); + for(Vertex vertex : graph.getAllVertex()){ + if(visited.contains(vertex)){ + continue; + } + boolean flag = hasCycleDFSUtil(vertex, visited, null); + if(flag){ + return true; + } + } + return false; + } + + public boolean hasCycleDFSUtil(Vertex vertex, Set> visited,Vertex parent){ + visited.add(vertex); + for(Vertex adj : vertex.getAdjacentVertexes()){ + if(adj.equals(parent)){ + continue; + } + if(visited.contains(adj)){ + return true; + } + boolean hasCycle = hasCycleDFSUtil(adj,visited,vertex); + if(hasCycle){ + return true; + } + } + return false; + } + + public static void main(String args[]){ + + CycleUndirectedGraph cycle = new CycleUndirectedGraph(); + Graph graph = new Graph(false); + + graph.addEdge(0, 1); + graph.addEdge(1, 2); + graph.addEdge(0, 3); + graph.addEdge(3, 4); + graph.addEdge(4, 5); + graph.addEdge(5, 1); + boolean isCycle = cycle.hasCycleDFS(graph); + System.out.println(isCycle); + isCycle = cycle.hasCycleUsingDisjointSets(graph); + System.out.print(isCycle); + + } + +} diff --git a/showmecode_100/java/com/interview/graph/DAGShortestPathTopological.java b/showmecode_100/java/com/interview/graph/DAGShortestPathTopological.java new file mode 100644 index 00000000..e7efd1f1 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/DAGShortestPathTopological.java @@ -0,0 +1,50 @@ +package com.interview.graph; + +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; + +/** +http://www.geeksforgeeks.org/shortest-path-for-directed-acyclic-graphs/ + */ +public class DAGShortestPathTopological { + + public Map,Integer> shortestPath(Graph graph,Vertex startVertex){ + + Map,Integer> distance = new HashMap,Integer>(); + TopologicalSort sort = new TopologicalSort(); + Deque> deque = sort.topSort(graph); + distance.put(startVertex, 0); + while(!deque.isEmpty()){ + Vertex vertex = deque.poll(); + for(Edge edge : vertex.getEdges()){ + if(getDistance(edge.getVertex2(),distance) > getDistance(edge.getVertex1(),distance) + edge.getWeight()){ + distance.put(edge.getVertex2(), getDistance(edge.getVertex1(),distance) + edge.getWeight()); + } + } + } + + return distance; + } + + private int getDistance( Vertex vertex,Map,Integer> distance){ + return distance.containsKey(vertex) ? distance.get(vertex) : 1000; + } + + public static void main(String args[]){ + Graph graph = new Graph(true); + graph.addEdge(1, 2,4); + graph.addEdge(2, 3,3); + graph.addEdge(2, 4,2); + graph.addEdge(1, 3,2); + graph.addEdge(3, 5,1); + graph.addEdge(4, 5,5); + graph.addEdge(5, 6,2); + graph.addEdge(4, 7,3); + + DAGShortestPathTopological shortestPath = new DAGShortestPathTopological(); + Map,Integer> distance = shortestPath.shortestPath(graph, graph.getAllVertex().iterator().next()); + System.out.print(distance); + + } +} diff --git a/showmecode_100/java/com/interview/graph/DijkstraShortestPath.java b/showmecode_100/java/com/interview/graph/DijkstraShortestPath.java new file mode 100644 index 00000000..2cb3f8d6 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/DijkstraShortestPath.java @@ -0,0 +1,113 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 10/11/2014 + * @author Tushar Roy + * + * Find single source shortest path using Dijkstra's algorithm + * + * Space complexity - O(E + V) + * Time complexity - O(ElogV) + * + * References + * https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm + * CLRS book*/ +public class DijkstraShortestPath { + + public Map,Integer> shortestPath(Graph graph, Vertex sourceVertex){ + + //heap + map data structure + BinaryMinHeap> minHeap = new BinaryMinHeap<>(); + + //stores shortest distance from root to every vertex + Map,Integer> distance = new HashMap<>(); + + //stores parent of every vertex in shortest distance + Map, Vertex> parent = new HashMap<>(); + + //initialize all vertex with infinite distance from source vertex + for(Vertex vertex : graph.getAllVertex()){ + minHeap.add(Integer.MAX_VALUE, vertex); + } + + //set distance of source vertex to 0 + minHeap.decrease(sourceVertex, 0); + + //put it in map + distance.put(sourceVertex, 0); + + //source vertex parent is null + parent.put(sourceVertex, null); + + //iterate till heap is not empty + while(!minHeap.empty()){ + //get the min value from heap node which has vertex and distance of that vertex from source vertex. + BinaryMinHeap>.Node heapNode = minHeap.extractMinNode(); + Vertex current = heapNode.key; + + //update shortest distance of current vertex from source vertex + distance.put(current, heapNode.weight); + + //iterate through all edges of current vertex + for(Edge edge : current.getEdges()){ + + //get the adjacent vertex + Vertex adjacent = getVertexForEdge(current, edge); + + //if heap does not contain adjacent vertex means adjacent vertex already has shortest distance from source vertex + if(!minHeap.containsData(adjacent)){ + continue; + } + + //add distance of current vertex to edge weight to get distance of adjacent vertex from source vertex + //when it goes through current vertex + int newDistance = distance.get(current) + edge.getWeight(); + + //see if this above calculated distance is less than current distance stored for adjacent vertex from source vertex + if(minHeap.getWeight(adjacent) > newDistance) { + minHeap.decrease(adjacent, newDistance); + parent.put(adjacent, current); + } + } + } + return distance; + } + + private Vertex getVertexForEdge(Vertex v, Edge e){ + return e.getVertex1().equals(v) ? e.getVertex2() : e.getVertex1(); + } + + public static void main(String args[]){ + Graph graph = new Graph<>(false); + /*graph.addEdge(0, 1, 4); + graph.addEdge(1, 2, 8); + graph.addEdge(2, 3, 7); + graph.addEdge(3, 4, 9); + graph.addEdge(4, 5, 10); + graph.addEdge(2, 5, 4); + graph.addEdge(1, 7, 11); + graph.addEdge(0, 7, 8); + graph.addEdge(2, 8, 2); + graph.addEdge(3, 5, 14); + graph.addEdge(5, 6, 2); + graph.addEdge(6, 8, 6); + graph.addEdge(6, 7, 1); + graph.addEdge(7, 8, 7);*/ + + graph.addEdge(1, 2, 5); + graph.addEdge(2, 3, 2); + graph.addEdge(1, 4, 9); + graph.addEdge(1, 5, 3); + graph.addEdge(5, 6, 2); + graph.addEdge(6, 4, 2); + graph.addEdge(3, 4, 3); + + DijkstraShortestPath dsp = new DijkstraShortestPath(); + Vertex sourceVertex = graph.getVertex(1); + Map,Integer> distance = dsp.shortestPath(graph, sourceVertex); + System.out.print(distance); + } +} diff --git a/showmecode_100/java/com/interview/graph/DirectedGraphConnectivity.java b/showmecode_100/java/com/interview/graph/DirectedGraphConnectivity.java new file mode 100644 index 00000000..3cd9c948 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/DirectedGraphConnectivity.java @@ -0,0 +1,81 @@ +package com.interview.graph; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; + +public class DirectedGraphConnectivity { + + public boolean scc(Graph graph) { + Deque> stack = new ArrayDeque>(); + Map, Boolean> visited = new HashMap, Boolean>(); + for (Vertex vertex : graph.getAllVertex()) { + if (visited.containsKey(vertex)) { + continue; + } + DFSUtil(vertex, visited, stack); + } + + System.out.println(stack); + + Graph reverseGraph = new Graph(true); + Map> vertexMap = new HashMap>(); + for (Edge edge : graph.getAllEdges()) { + reverseGraph.addEdge(edge.getVertex2().getId(), edge.getVertex1() + .getId(), edge.getWeight()); + } + + for (Vertex vertex : reverseGraph.getAllVertex()) { + vertexMap.put(vertex.getId(), vertex); + } + + visited.clear(); + Vertex vertex = vertexMap.get(stack.poll().getId()); + DFSUtil1(vertex, visited); + + for(Vertex testVertex : reverseGraph.getAllVertex()){ + if(!visited.containsKey(testVertex)){ + return false; + } + } + return true; + } + + private void DFSUtil(Vertex vertex, + Map, Boolean> visited, Deque> stack) { + visited.put(vertex, true); + for (Vertex v : vertex.getAdjacentVertexes()) { + if (visited.containsKey(v)) { + continue; + } + DFSUtil(v, visited, stack); + } + stack.offerFirst(vertex); + } + + private void DFSUtil1(Vertex vertex, + Map, Boolean> visited) { + visited.put(vertex, true); + for (Vertex v : vertex.getAdjacentVertexes()) { + if (visited.containsKey(v)) { + continue; + } + DFSUtil1(v, visited); + } + } + + public static void main(String args[]){ + Graph graph = new Graph(true); + graph.addEdge(1, 0); + graph.addEdge(2,1); + graph.addEdge(0,2); + graph.addEdge(0, 3); + graph.addEdge(3, 4); + graph.addEdge(4, 2); + + DirectedGraphConnectivity scc = new DirectedGraphConnectivity(); + boolean result = scc.scc(graph); + System.out.println(result); + } +} diff --git a/showmecode_100/java/com/interview/graph/DisjointSet.java b/showmecode_100/java/com/interview/graph/DisjointSet.java new file mode 100644 index 00000000..0a3e9ab7 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/DisjointSet.java @@ -0,0 +1,117 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author tusroy + * Date 06/20/2015 + * + * Video link - https://youtu.be/ID00PMy0-vE + * + * Disjoint sets using path compression and union by rank + * Supports 3 operations + * 1) makeSet + * 2) union + * 3) findSet + * + * For m operations and total n elements time complexity is O(m*f(n)) where f(n) is + * very slowly growing function. For most cases f(n) <= 4 so effectively + * total time will be O(m). Proof in Coreman book. + */ +public class DisjointSet { + + private Map map = new HashMap<>(); + + class Node { + long data; + Node parent; + int rank; + } + + /** + * Create a set with only one element. + */ + public void makeSet(long data) { + Node node = new Node(); + node.data = data; + node.parent = node; + node.rank = 0; + map.put(data, node); + } + + /** + * Combines two sets together to one. + * Does union by rank + * + * @return true if data1 and data2 are in different set before union else false. + */ + public boolean union(long data1, long data2) { + Node node1 = map.get(data1); + Node node2 = map.get(data2); + + Node parent1 = findSet(node1); + Node parent2 = findSet(node2); + + //if they are part of same set do nothing + if (parent1.data == parent2.data) { + return false; + } + + //else whoever's rank is higher becomes parent of other + if (parent1.rank >= parent2.rank) { + //increment rank only if both sets have same rank + parent1.rank = (parent1.rank == parent2.rank) ? parent1.rank + 1 : parent1.rank; + parent2.parent = parent1; + } else { + parent1.parent = parent2; + } + return true; + } + + /** + * Finds the representative of this set + */ + public long findSet(long data) { + return findSet(map.get(data)).data; + } + + /** + * Find the representative recursively and does path + * compression as well. + */ + private Node findSet(Node node) { + Node parent = node.parent; + if (parent == node) { + return parent; + } + node.parent = findSet(node.parent); + return node.parent; + } + + public static void main(String args[]) { + DisjointSet ds = new DisjointSet(); + ds.makeSet(1); + ds.makeSet(2); + ds.makeSet(3); + ds.makeSet(4); + ds.makeSet(5); + ds.makeSet(6); + ds.makeSet(7); + + ds.union(1, 2); + ds.union(2, 3); + ds.union(4, 5); + ds.union(6, 7); + ds.union(5, 6); + ds.union(3, 7); + + System.out.println(ds.findSet(1)); + System.out.println(ds.findSet(2)); + System.out.println(ds.findSet(3)); + System.out.println(ds.findSet(4)); + System.out.println(ds.findSet(5)); + System.out.println(ds.findSet(6)); + System.out.println(ds.findSet(7)); + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/graph/EulerianPathAndCircuit.java b/showmecode_100/java/com/interview/graph/EulerianPathAndCircuit.java new file mode 100644 index 00000000..e206e7fb --- /dev/null +++ b/showmecode_100/java/com/interview/graph/EulerianPathAndCircuit.java @@ -0,0 +1,85 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +public class EulerianPathAndCircuit { + + public enum Eulerian{ + NOT_EULERIAN, + EULERIAN, + SEMIEULERIAN + } + + private boolean isConnected(Graph graph){ + + Vertex startVertex = null; + + for(Vertex vertex : graph.getAllVertex()){ + if(vertex.getDegree() != 0){ + startVertex = vertex; + break; + } + } + + if(startVertex == null){ + return true; + } + + Map,Boolean> visited = new HashMap, Boolean>(); + DFS(startVertex,visited); + + for(Vertex testVertex : graph.getAllVertex()){ + if(testVertex.getDegree()!= 0 && !visited.containsKey(testVertex)){ + return false; + } + } + return true; + + } + + private void DFS(Vertex startVertex, Map, Boolean> visited){ + visited.put(startVertex, true); + for(Vertex child : startVertex.getAdjacentVertexes()){ + if(!visited.containsKey(child)){ + DFS(child,visited); + } + } + } + + public Eulerian isEulerian(Graph graph){ + + if(!isConnected(graph)){ + return Eulerian.NOT_EULERIAN; + } + + int odd = 0; + for(Vertex vertex : graph.getAllVertex()){ + if(vertex.getDegree()!=0 && vertex.getDegree() % 2 != 0){ + odd++; + } + } + + if(odd > 2){ + return Eulerian.NOT_EULERIAN; + } + + return odd == 0 ? Eulerian.EULERIAN : Eulerian.SEMIEULERIAN; + } + + + public static void main(String args[]){ + + Graph graph = new Graph(false); + graph.addSingleVertex(1); + graph.addSingleVertex(2); + graph.addSingleVertex(3); + graph.addEdge(4, 5); + graph.addEdge(6, 4); + graph.addEdge(5,6); + + EulerianPathAndCircuit eulerian = new EulerianPathAndCircuit(); + Eulerian result = eulerian.isEulerian(graph); + System.out.print(result); + } +} diff --git a/showmecode_100/java/com/interview/graph/EvaluateDivison.java b/showmecode_100/java/com/interview/graph/EvaluateDivison.java new file mode 100644 index 00000000..97880343 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/EvaluateDivison.java @@ -0,0 +1,87 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 10/31/2016 + * @author Tushar Roy + * + * Equations are given in the format A / B = k, where A and B are variables represented as strings, and k is a real number (floating point number). + * Given some queries, return the answers. If the answer does not exist, return -1.0. + * + * Solution + * Do Flyod warshall algorithm initialized as values between equations. Do Flyod Warshall to create + * all possible paths b/w two strings. + * + * Time complexity O(n * n * n) + O(m) + * where n is total number of strings in equations and m is total number of queries + * + * Reference + * https://leetcode.com/problems/evaluate-division/ + */ +public class EvaluateDivison { + public double[] calcEquation(String[][] equations, double[] values, String[][] queries) { + if (equations.length == 0) { + return new double[0]; + } + Map index = new HashMap<>(); + int count = 0; + for (int i = 0; i < equations.length; i++) { + String first = equations[i][0]; + String second = equations[i][1]; + if (!index.containsKey(first)) { + index.put(first, count++); + } + if (!index.containsKey(second)) { + index.put(second, count++); + } + } + + double graph[][] = new double[count][count]; + for (int i = 0; i < graph.length; i++) { + for (int j = 0; j < graph[i].length; j++) { + graph[i][j] = -1; + } + } + + for (int i = 0; i < equations.length; i++) { + String first = equations[i][0]; + String second = equations[i][1]; + int i1 = index.get(first); + int i2 = index.get(second); + graph[i1][i1] = graph[i2][i2] = 1.0; + graph[i1][i2] = values[i]; + graph[i2][i1] = 1/values[i]; + } + + for (int i = 0 ; i < graph.length; i++) { + for (int j = 0; j < graph.length; j++) { + if (graph[i][j] != -1) { + continue; + } + for (int k = 0; k < graph.length; k++) { + if (graph[i][k] == -1 || graph[k][j] == -1) { + continue; + } + graph[i][j] = graph[i][k] * graph[k][j]; + } + } + } + + double[] result = new double[queries.length]; + for (int i = 0; i < queries.length; i++) { + String first = queries[i][0]; + String second = queries[i][1]; + if (!index.containsKey(first) || !index.containsKey(second)) { + result[i] = -1; + } else { + int i1 = index.get(first); + int i2 = index.get(second); + result[i] = graph[i1][i2]; + } + } + + return result; + } +} diff --git a/showmecode_100/java/com/interview/graph/FillOsWIthXsIfSurroundedByXs.java b/showmecode_100/java/com/interview/graph/FillOsWIthXsIfSurroundedByXs.java new file mode 100644 index 00000000..97097057 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/FillOsWIthXsIfSurroundedByXs.java @@ -0,0 +1,74 @@ +package com.interview.graph; + +/** + * Date 04/17/2016 + * @author Tushar Roy + * + * Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. + * A region is captured by flipping all 'O's into 'X's in that surrounded region. + * + * Reference + * https://leetcode.com/problems/surrounded-regions/ + */ +public class FillOsWIthXsIfSurroundedByXs { + + public void solve(char[][] board) { + if (board.length == 0 || board[0].length == 0) { + return; + } + for (int i = 0; i < board.length; i++) { + dfs(board, i, 0); + dfs(board, i, board[0].length - 1); + } + + for (int i = 0; i < board[0].length; i++) { + dfs(board, 0, i); + dfs(board, board.length - 1, i); + } + + for (int i = 0; i < board.length; i++) { + for (int j = 0; j < board[0].length; j++) { + if (board[i][j] == 'O') { + board[i][j] = 'X'; + } + else if (board[i][j] == '1') { + board[i][j] = 'O'; + } + } + } + } + + private void dfs(char[][] board, int i, int j) { + if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) { + return; + } + + if (board[i][j] != 'O') { + return; + } + + board[i][j] = '1'; + if (i < board.length - 2) { + dfs(board, i + 1, j); + } + if (i > 1) { + dfs(board, i - 1, j); + } + if (j < board[0].length - 2) { + dfs(board, i, j + 1); + } + if (j > 1) { + dfs(board, i, j - 1); + } + } + + public static void main(String args[]){ + FillOsWIthXsIfSurroundedByXs fo = new FillOsWIthXsIfSurroundedByXs(); + char board[][] = {{'X','X','X','X'}, + {'X','X','O','X'}, + {'X','O','X','X'}, + {'X','X','O','X'}}; + + fo.solve(board); + } +} diff --git a/showmecode_100/java/com/interview/graph/FloodFillAlgorithm.java b/showmecode_100/java/com/interview/graph/FloodFillAlgorithm.java new file mode 100644 index 00000000..30500680 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/FloodFillAlgorithm.java @@ -0,0 +1,45 @@ +package com.interview.graph; + +/** + * http://en.wikipedia.org/wiki/Flood_fill + * + */ +public class FloodFillAlgorithm { + + public void fillDFS(int screen[][], int oldColor, int newColor,int startx,int starty){ + fillUtil(screen,startx,starty,oldColor,newColor); + } + + public void fillUtil(int screen[][], int currentx,int currenty, int oldColor, int newColor){ + if(currentx < 0 || currentx >= screen.length || currenty < 0 || currenty >= screen[currentx].length){ + return; + } + + if(screen[currentx][currenty] != oldColor){ + return; + } + screen[currentx][currenty] = newColor; + fillUtil(screen,currentx+1,currenty,oldColor,newColor); + fillUtil(screen,currentx-1,currenty,oldColor,newColor); + fillUtil(screen,currentx,currenty+1,oldColor,newColor); + fillUtil(screen,currentx,currenty-1,oldColor,newColor); + } + + public static void main(String args[]){ + int screen[][] = {{1,1,1,1,1,1}, + {1,1,1,1,1,1}, + {1,0,0,1,1,0}, + {1,1,1,0,0,0}, + {1,1,1,0,1,0}, + {1,1,1,1,1,1}}; + FloodFillAlgorithm ff = new FloodFillAlgorithm(); + ff.fillDFS(screen, 0, 2, 3, 3); + + for(int i=0; i < screen.length; i++){ + for(int j=0; j < screen[i].length; j++){ + System.out.print(screen[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/graph/FloydWarshallAllPairShortestPath.java b/showmecode_100/java/com/interview/graph/FloydWarshallAllPairShortestPath.java new file mode 100644 index 00000000..b166c214 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/FloydWarshallAllPairShortestPath.java @@ -0,0 +1,115 @@ +package com.interview.graph; + +import java.util.Deque; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; + +/** + * Date 11/02/2015 + * @author Tushar Roy + * + * Floyd-Warshall Algorithm for finding all pair shortest path. + * + * Time complexity - O(V^3) + * Space complexity - O(V^2) + * + * References + * https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm + */ +public class FloydWarshallAllPairShortestPath { + + class NegativeWeightCycleException extends RuntimeException { + + } + + private static final int INF = 1000000; + + public int[][] allPairShortestPath(int[][] distanceMatrix) { + + int distance[][] = new int[distanceMatrix.length][distanceMatrix.length]; + int path[][] = new int[distanceMatrix.length][distanceMatrix.length]; + + for (int i=0; i < distanceMatrix.length; i++) { + for (int j=0; j< distanceMatrix[i].length; j++){ + distance[i][j] = distanceMatrix[i][j]; + if (distanceMatrix[i][j] != INF && i != j) { + path[i][j] = i; + } else { + path[i][j] = -1; + } + } + } + + for(int k=0; k < distanceMatrix.length; k++){ + for(int i=0; i < distanceMatrix.length; i++){ + for(int j=0; j < distanceMatrix.length; j++){ + if(distance[i][k] == INF || distance[k][j] == INF) { + continue; + } + if(distance[i][j] > distance[i][k] + distance[k][j]){ + distance[i][j] = distance[i][k] + distance[k][j]; + path[i][j] = path[k][j]; + } + } + } + } + + //look for negative weight cycle in the graph + //if values on diagonal of distance matrix is negative + //then there is negative weight cycle in the graph. + for(int i = 0; i < distance.length; i++) { + if(distance[i][i] < 0) { + throw new NegativeWeightCycleException(); + } + } + + printPath(path, 3, 2); + return distance; + } + + public void printPath(int[][] path, int start, int end) { + if(start < 0 || end < 0 || start >= path.length || end >= path.length) { + throw new IllegalArgumentException(); + } + + System.out.println("Actual path - between " + start + " " + end); + Deque stack = new LinkedList<>(); + stack.addFirst(end); + while (true) { + end = path[start][end]; + if(end == -1) { + return; + } + stack.addFirst(end); + if(end == start) { + break; + } + } + + while (!stack.isEmpty()) { + System.out.print(stack.pollFirst() + " "); + } + + System.out.println(); + } + + public static void main(String args[]){ + int[][] graph = { + {0, 3, 6, 15}, + {INF, 0, -2, INF}, + {INF, INF, 0, 2}, + {1, INF, INF, 0} + }; + + FloydWarshallAllPairShortestPath shortestPath = new FloydWarshallAllPairShortestPath(); + int[][] distance = shortestPath.allPairShortestPath(graph); + System.out.println("Minimum Distance matrix"); + for(int i=0; i < distance.length; i++){ + for(int j=0; j < distance.length; j++){ + System.out.print(distance[i][j] + " "); + } + System.out.println(""); + } + } +} diff --git a/showmecode_100/java/com/interview/graph/FordFulkerson.java b/showmecode_100/java/com/interview/graph/FordFulkerson.java new file mode 100644 index 00000000..6506ddf3 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/FordFulkerson.java @@ -0,0 +1,137 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Date 04/14/2014 + * @author Tushar Roy + * + * Ford fulkerson method Edmonds Karp algorithm for finding max flow + * + * Capacity - Capacity of an edge to carry units from source to destination vertex + * Flow - Actual flow of units from source to destination vertex of an edge + * Residual capacity - Remaining capacity on this edge i.e capacity - flow + * AugmentedPath - Path from source to sink which has residual capacity greater than 0 + * + * Time complexity is O(VE^2) + * + * References: + * http://www.geeksforgeeks.org/ford-fulkerson-algorithm-for-maximum-flow-problem/ + * https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm + */ +public class FordFulkerson { + + public int maxFlow(int capacity[][], int source, int sink){ + + //declare and initialize residual capacity as total avaiable capacity initially. + int residualCapacity[][] = new int[capacity.length][capacity[0].length]; + for (int i = 0; i < capacity.length; i++) { + for (int j = 0; j < capacity[0].length; j++) { + residualCapacity[i][j] = capacity[i][j]; + } + } + + //this is parent map for storing BFS parent + Map parent = new HashMap<>(); + + //stores all the augmented paths + List> augmentedPaths = new ArrayList<>(); + + //max flow we can get in this network + int maxFlow = 0; + + //see if augmented path can be found from source to sink. + while(BFS(residualCapacity, parent, source, sink)){ + List augmentedPath = new ArrayList<>(); + int flow = Integer.MAX_VALUE; + //find minimum residual capacity in augmented path + //also add vertices to augmented path list + int v = sink; + while(v != source){ + augmentedPath.add(v); + int u = parent.get(v); + if (flow > residualCapacity[u][v]) { + flow = residualCapacity[u][v]; + } + v = u; + } + augmentedPath.add(source); + Collections.reverse(augmentedPath); + augmentedPaths.add(augmentedPath); + + //add min capacity to max flow + maxFlow += flow; + + //decrease residual capacity by min capacity from u to v in augmented path + // and increase residual capacity by min capacity from v to u + v = sink; + while(v != source){ + int u = parent.get(v); + residualCapacity[u][v] -= flow; + residualCapacity[v][u] += flow; + v = u; + } + } + printAugmentedPaths(augmentedPaths); + return maxFlow; + } + + /** + * Prints all the augmented path which contribute to max flow + */ + private void printAugmentedPaths(List> augmentedPaths) { + System.out.println("Augmented paths"); + augmentedPaths.forEach(path -> { + path.forEach(i -> System.out.print(i + " ")); + System.out.println(); + }); + } + + /** + * Breadth first search to find augmented path + */ + private boolean BFS(int[][] residualCapacity, Map parent, + int source, int sink){ + Set visited = new HashSet<>(); + Queue queue = new LinkedList<>(); + queue.add(source); + visited.add(source); + boolean foundAugmentedPath = false; + //see if we can find augmented path from source to sink + while(!queue.isEmpty()){ + int u = queue.poll(); + for(int v = 0; v < residualCapacity.length; v++){ + //explore the vertex only if it is not visited and its residual capacity is + //greater than 0 + if(!visited.contains(v) && residualCapacity[u][v] > 0){ + //add in parent map saying v got explored by u + parent.put(v, u); + //add v to visited + visited.add(v); + //add v to queue for BFS + queue.add(v); + //if sink is found then augmented path is found + if ( v == sink) { + foundAugmentedPath = true; + break; + } + } + } + } + //returns if augmented path is found from source to sink or not + return foundAugmentedPath; + } + + public static void main(String args[]){ + FordFulkerson ff = new FordFulkerson(); + int[][] capacity = {{0, 3, 0, 3, 0, 0, 0}, + {0, 0, 4, 0, 0, 0, 0}, + {3, 0, 0, 1, 2, 0, 0}, + {0, 0, 0, 0, 2, 6, 0}, + {0, 1, 0, 0, 0, 0, 1}, + {0, 0, 0, 0, 0, 0, 9}, + {0, 0, 0, 0, 0, 0, 0}}; + + System.out.println("\nMaximum capacity " + ff.maxFlow(capacity, 0, 6)); + } +} diff --git a/showmecode_100/java/com/interview/graph/Graph.java b/showmecode_100/java/com/interview/graph/Graph.java new file mode 100644 index 00000000..fea78b74 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/Graph.java @@ -0,0 +1,245 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Graph{ + + private List> allEdges; + private Map> allVertex; + boolean isDirected = false; + + public Graph(boolean isDirected){ + allEdges = new ArrayList>(); + allVertex = new HashMap>(); + this.isDirected = isDirected; + } + + public void addEdge(long id1, long id2){ + addEdge(id1,id2,0); + } + + //This works only for directed graph because for undirected graph we can end up + //adding edges two times to allEdges + public void addVertex(Vertex vertex){ + if(allVertex.containsKey(vertex.getId())){ + return; + } + allVertex.put(vertex.getId(), vertex); + for(Edge edge : vertex.getEdges()){ + allEdges.add(edge); + } + } + + public Vertex addSingleVertex(long id){ + if(allVertex.containsKey(id)){ + return allVertex.get(id); + } + Vertex v = new Vertex(id); + allVertex.put(id, v); + return v; + } + + public Vertex getVertex(long id){ + return allVertex.get(id); + } + + public void addEdge(long id1,long id2, int weight){ + Vertex vertex1 = null; + if(allVertex.containsKey(id1)){ + vertex1 = allVertex.get(id1); + }else{ + vertex1 = new Vertex(id1); + allVertex.put(id1, vertex1); + } + Vertex vertex2 = null; + if(allVertex.containsKey(id2)){ + vertex2 = allVertex.get(id2); + }else{ + vertex2 = new Vertex(id2); + allVertex.put(id2, vertex2); + } + + Edge edge = new Edge(vertex1,vertex2,isDirected,weight); + allEdges.add(edge); + vertex1.addAdjacentVertex(edge, vertex2); + if(!isDirected){ + vertex2.addAdjacentVertex(edge, vertex1); + } + + } + + public List> getAllEdges(){ + return allEdges; + } + + public Collection> getAllVertex(){ + return allVertex.values(); + } + public void setDataForVertex(long id, T data){ + if(allVertex.containsKey(id)){ + Vertex vertex = allVertex.get(id); + vertex.setData(data); + } + } + + @Override + public String toString(){ + StringBuffer buffer = new StringBuffer(); + for(Edge edge : getAllEdges()){ + buffer.append(edge.getVertex1() + " " + edge.getVertex2() + " " + edge.getWeight()); + buffer.append("\n"); + } + return buffer.toString(); + } +} + + +class Vertex { + long id; + private T data; + private List> edges = new ArrayList<>(); + private List> adjacentVertex = new ArrayList<>(); + + Vertex(long id){ + this.id = id; + } + + public long getId(){ + return id; + } + + public void setData(T data){ + this.data = data; + } + + public T getData(){ + return data; + } + + public void addAdjacentVertex(Edge e, Vertex v){ + edges.add(e); + adjacentVertex.add(v); + } + + public String toString(){ + return String.valueOf(id); + } + + public List> getAdjacentVertexes(){ + return adjacentVertex; + } + + public List> getEdges(){ + return edges; + } + + public int getDegree(){ + return edges.size(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (id ^ (id >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Vertex other = (Vertex) obj; + if (id != other.id) + return false; + return true; + } +} + +class Edge{ + private boolean isDirected = false; + private Vertex vertex1; + private Vertex vertex2; + private int weight; + + Edge(Vertex vertex1, Vertex vertex2){ + this.vertex1 = vertex1; + this.vertex2 = vertex2; + } + + Edge(Vertex vertex1, Vertex vertex2,boolean isDirected,int weight){ + this.vertex1 = vertex1; + this.vertex2 = vertex2; + this.weight = weight; + this.isDirected = isDirected; + } + + Edge(Vertex vertex1, Vertex vertex2,boolean isDirected){ + this.vertex1 = vertex1; + this.vertex2 = vertex2; + this.isDirected = isDirected; + } + + Vertex getVertex1(){ + return vertex1; + } + + Vertex getVertex2(){ + return vertex2; + } + + int getWeight(){ + return weight; + } + + public boolean isDirected(){ + return isDirected; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((vertex1 == null) ? 0 : vertex1.hashCode()); + result = prime * result + ((vertex2 == null) ? 0 : vertex2.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Edge other = (Edge) obj; + if (vertex1 == null) { + if (other.vertex1 != null) + return false; + } else if (!vertex1.equals(other.vertex1)) + return false; + if (vertex2 == null) { + if (other.vertex2 != null) + return false; + } else if (!vertex2.equals(other.vertex2)) + return false; + return true; + } + + @Override + public String toString() { + return "Edge [isDirected=" + isDirected + ", vertex1=" + vertex1 + + ", vertex2=" + vertex2 + ", weight=" + weight + "]"; + } +} + + \ No newline at end of file diff --git a/showmecode_100/java/com/interview/graph/GraphColoring.java b/showmecode_100/java/com/interview/graph/GraphColoring.java new file mode 100644 index 00000000..a7aef20d --- /dev/null +++ b/showmecode_100/java/com/interview/graph/GraphColoring.java @@ -0,0 +1,165 @@ +package com.interview.graph; + +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + http://www.geeksforgeeks.org/graph-coloring-set-2-greedy-algorithm/ + */ +public class GraphColoring { + + public void WelshPowell(){ + + Graph graph = new Graph(false); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(1, 4); + graph.addEdge(4, 6); + graph.addEdge(1, 7); + graph.addEdge(1, 8); + graph.addEdge(2, 9); + graph.addEdge(1, 3); + graph.addEdge(3, 4); + graph.addEdge(2,4); + graph.addEdge(3, 7); + graph.addEdge(2, 7); + + ComparatorVertex c = new ComparatorVertex(); + Set> sortedSet = new TreeSet>(c); + for(Vertex v : graph.getAllVertex()){ + sortedSet.add(v); + } + + Map assignedColor = new HashMap(); + Map finalAssignedColor = new HashMap(); + + Map colorsUsed = new TreeMap(); + colorsUsed.put("Green", false); + colorsUsed.put("Blue", false); + colorsUsed.put("Red", false); + colorsUsed.put("Yellow", false); + colorsUsed.put("Orange",false); + + Set> removeSet = new HashSet>(); + while(sortedSet.size() != removeSet.size()){ + String color = null ; + + for(Vertex v : sortedSet){ + if(removeSet.contains(v)){ + continue; + } + boolean allUncolored = allAdjacentUnColored(v.getAdjacentVertexes(),assignedColor); + if(allUncolored){ + color = getUnusedColor(colorsUsed); + assignedColor.put(v.getId(), color); + removeSet.add(v); + finalAssignedColor.put(v.getId(), color); + } + } + colorsUsed.remove(color); + assignedColor.clear(); + } + + System.out.println(finalAssignedColor); + } + + public void colorGraph(){ + + Graph graph = new Graph(false); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(1, 4); + graph.addEdge(4, 6); + graph.addEdge(1, 7); + graph.addEdge(1, 8); + graph.addEdge(2, 9); + graph.addEdge(1, 3); + graph.addEdge(3, 4); + graph.addEdge(2,4); + graph.addEdge(3,7); + + Map colorsUsed = new HashMap(); + colorsUsed.put("Green", false); + colorsUsed.put("Blue", false); + colorsUsed.put("Red", false); + colorsUsed.put("Yellow", false); + + Map colorsAssigned = new HashMap(); + + Collection> allVertex = graph.getAllVertex(); + + for(Vertex v : allVertex){ + List> adjacentVertexes = v.getAdjacentVertexes(); + for(Vertex adjacentVertex : adjacentVertexes){ + String color = colorsAssigned.get(adjacentVertex.getId()); + if(color != null){ + assignColor(color,colorsUsed); + } + } + String color = getUnusedColor(colorsUsed); + colorsAssigned.put(v.getId(), color); + resetColor(colorsUsed); + } + + System.out.println(colorsAssigned); + } + + private String getUnusedColor(Map colorsUsed){ + for(String color : colorsUsed.keySet()){ + if(colorsUsed.get(color).equals(false)){ + return color; + } + } + throw new RuntimeException(); + } + + private void resetColor(Map colorsUsed){ + Set colors = new HashSet(); + for(String color : colorsUsed.keySet()){ + colors.add(color); + } + for(String color : colors){ + colorsUsed.remove(color); + colorsUsed.put(color, false); + } + } + + private void assignColor(String color, Map colorsUsed){ + colorsUsed.remove(color); + colorsUsed.put(color, true); + } + + private boolean allAdjacentUnColored(Collection> vertexes, Map colorsAssigned){ + for(Vertex vertex : vertexes){ + if(colorsAssigned.containsKey(vertex.getId())){ + return false; + } + } + return true; + } + public static void main(String args[]){ + GraphColoring graphColoring = new GraphColoring(); + graphColoring.WelshPowell(); + } +} + + +class ComparatorVertex implements Comparator>{ + + @Override + public int compare(Vertex o1, Vertex o2) { + if(o1.getDegree() <= o2.getDegree()){ + return 1; + }else{ + return -1; + } + } + +} diff --git a/showmecode_100/java/com/interview/graph/GraphTraversal.java b/showmecode_100/java/com/interview/graph/GraphTraversal.java new file mode 100644 index 00000000..45cfc01e --- /dev/null +++ b/showmecode_100/java/com/interview/graph/GraphTraversal.java @@ -0,0 +1,72 @@ +package com.interview.graph; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; + +/** + * http://www.geeksforgeeks.org/breadth-first-traversal-for-a-graph/ + * http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/ + */ +public class GraphTraversal { + + public void DFS(Graph graph){ + Set visited = new HashSet(); + for(Vertex vertex : graph.getAllVertex()){ + if(!visited.contains(vertex.getId())){ + DFSUtil(vertex,visited); + } + } + + } + + private void DFSUtil(Vertex v,Set visited){ + visited.add(v.getId()); + System.out.print(v.getId() + " "); + for(Vertex vertex : v.getAdjacentVertexes()){ + if(!visited.contains(vertex.getId())) + DFSUtil(vertex,visited); + } + } + + public void BFS(Graph graph){ + Set visited = new HashSet(); + Queue> q = new LinkedList>(); + + for(Vertex vertex: graph.getAllVertex()){ + if(!visited.contains(vertex.getId())){ + q.add(vertex); + visited.add(vertex.getId()); + while(q.size() != 0){ + Vertex vq = q.poll(); + System.out.print(vq.getId()+ " "); + for(Vertex v : vq.getAdjacentVertexes()){ + if(!visited.contains(v.getId())){ + q.add(v); + visited.add(v.getId()); + } + } + } + } + } + + } + + + public static void main(String args[]){ + + Graph graph = new Graph(true); + graph.addEdge(1, 2); + graph.addEdge(1, 3); + graph.addEdge(2, 4); + graph.addEdge(3, 4); + graph.addEdge(4, 6); + graph.addEdge(6, 5); + // graph.addEdge(5, 1); + graph.addEdge(5,3); + + GraphTraversal g = new GraphTraversal(); + g.BFS(graph); + } +} diff --git a/showmecode_100/java/com/interview/graph/HamiltonianCycle.java b/showmecode_100/java/com/interview/graph/HamiltonianCycle.java new file mode 100644 index 00000000..8b9d1229 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/HamiltonianCycle.java @@ -0,0 +1,60 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class HamiltonianCycle { + + public boolean getHamiltonianCycle(Graph graph,List> result){ + + Vertex startVertex = graph.getAllVertex().iterator().next(); + Set> visited = new HashSet>(); + return hamiltonianUtil(startVertex,startVertex,result,visited,graph.getAllVertex().size()); + + } + + private boolean hamiltonianUtil(Vertex startVertex, Vertex currentVertex + , List> result, Set> visited, int totalVertex){ + visited.add(currentVertex); + result.add(currentVertex); + + for(Vertex child : currentVertex.getAdjacentVertexes()){ + if(startVertex.equals(child) && totalVertex == result.size()){ + result.add(startVertex); + return true; + } + if(!visited.contains(child)){ + boolean isHamil = hamiltonianUtil(startVertex,child,result,visited,totalVertex); + if(isHamil){ + return true; + } + } + } + result.remove(result.size()-1); + visited.remove(currentVertex); + return false; + } + + public static void main(String args[]){ + + Graph graph = new Graph(false); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(3, 5); + graph.addEdge(5, 2); + graph.addEdge(2, 4); + graph.addEdge(4, 1); + graph.addEdge(4, 5); + + HamiltonianCycle hamil = new HamiltonianCycle(); + List> result = new ArrayList>(); + boolean isHamiltonian = hamil.getHamiltonianCycle(graph, result); + System.out.println(isHamiltonian); + if(isHamiltonian){ + System.out.print(result); + } + + } +} diff --git a/showmecode_100/java/com/interview/graph/KruskalMST.java b/showmecode_100/java/com/interview/graph/KruskalMST.java new file mode 100644 index 00000000..4a8f17cb --- /dev/null +++ b/showmecode_100/java/com/interview/graph/KruskalMST.java @@ -0,0 +1,89 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * Date 09/25/2014 + * + * @author Tushar Roy + *

+ * Find minimum spanning tree usinig Kruskals algorithm + *

+ * Time complexity - O(ElogE) + * Space complexity - O(E + V) + *

+ * References + * https://en.wikipedia.org/wiki/Kruskal%27s_algorithm + */ + +public class KruskalMST { + /** + * Comparator to sort edges by weight in non decreasing order + */ + public class EdgeComparator implements Comparator> { + @Override + public int compare(Edge edge1, Edge edge2) { + if (edge1.getWeight() <= edge2.getWeight()) { + return -1; + } else { + return 1; + } + } + } + + public List> getMST(Graph graph) { + List> allEdges = graph.getAllEdges(); + EdgeComparator edgeComparator = new EdgeComparator(); + + //sort all edges in non decreasing order + Collections.sort(allEdges, edgeComparator); + DisjointSet disjointSet = new DisjointSet(); + + //create as many disjoint sets as the total vertices + for (Vertex vertex : graph.getAllVertex()) { + disjointSet.makeSet(vertex.getId()); + } + + List> resultEdge = new ArrayList>(); + + for (Edge edge : allEdges) { + //get the sets of two vertices of the edge + long root1 = disjointSet.findSet(edge.getVertex1().getId()); + long root2 = disjointSet.findSet(edge.getVertex2().getId()); + + //check if the vertices are in same set or different set + //if verties are in same set then ignore the edge + if (root1 == root2) { + continue; + } else { + //if vertices are in different set then add the edge to result and union these two sets into one + resultEdge.add(edge); + disjointSet.union(edge.getVertex1().getId(), edge.getVertex2().getId()); + } + + } + return resultEdge; + } + + public static void main(String args[]) { + Graph graph = new Graph(false); + graph.addEdge(1, 2, 4); + graph.addEdge(1, 3, 1); + graph.addEdge(2, 5, 1); + graph.addEdge(2, 6, 3); + graph.addEdge(2, 4, 2); + graph.addEdge(6, 5, 2); + graph.addEdge(6, 4, 3); + graph.addEdge(4, 7, 2); + graph.addEdge(3, 4, 5); + graph.addEdge(3, 7, 8); + KruskalMST mst = new KruskalMST(); + List> result = mst.getMST(graph); + for (Edge edge : result) { + System.out.println(edge.getVertex1() + " " + edge.getVertex2()); + } + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/graph/MaximumBiparteMatching.java b/showmecode_100/java/com/interview/graph/MaximumBiparteMatching.java new file mode 100644 index 00000000..07256a5c --- /dev/null +++ b/showmecode_100/java/com/interview/graph/MaximumBiparteMatching.java @@ -0,0 +1,79 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * http://www.geeksforgeeks.org/maximum-bipartite-matching/ + */ +public class MaximumBiparteMatching { + + public int findMaxMatching(Map> jobApplications, List allJobs){ + + Map match = new HashMap(); + int maxMatch = 0; + for(Integer candidate : jobApplications.keySet()){ + Set jobsSeen = new HashSet(); + maxMatch += matchJobs(candidate, jobApplications, match, jobsSeen) ==true ? 1 : 0; + } + return maxMatch; + } + + private boolean matchJobs(Integer candidate, Map> jobApplications,Map match,Set jobsSeen){ + + for(int job : jobApplications.get(candidate)){ + if(jobsSeen.contains(job)){ + continue; + } + jobsSeen.add(job); + + if(match.get(job) == null){ + match.put(job, candidate); + return true; + } + boolean flag = matchJobs(match.get(job),jobApplications,match,jobsSeen); + if(flag){ + match.put(job, candidate); + return true; + } + } + return false; + } + + public static void main(String args[]){ + List app0 = new ArrayList(); + app0.add(10); + app0.add(11); + app0.add(13); + + List app1 = new ArrayList(); + app1.add(10); + + List app2 = new ArrayList(); + app2.add(12); + + List app3 = new ArrayList(); + app3.add(12); + app3.add(10); + app3.add(11); + + Map> jobApplications = new HashMap>(); + jobApplications.put(0, app0); + jobApplications.put(1, app1); + jobApplications.put(2, app2); + jobApplications.put(3, app3); + MaximumBiparteMatching mbm = new MaximumBiparteMatching(); + List allJobs = new ArrayList(); + allJobs.add(10); + allJobs.add(11); + allJobs.add(12); + allJobs.add(13); + System.out.print(mbm.findMaxMatching(jobApplications, allJobs)); + + } + +} diff --git a/showmecode_100/java/com/interview/graph/MinimumHeightTree.java b/showmecode_100/java/com/interview/graph/MinimumHeightTree.java new file mode 100644 index 00000000..d8dcdecf --- /dev/null +++ b/showmecode_100/java/com/interview/graph/MinimumHeightTree.java @@ -0,0 +1,59 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Date 03/08/2016 + * @author Tushar Roy + * + * Given a graph representing a tree. Find all minimum height trees. + * + * Time complexity O(n) + * Space complexity O(n) + * + * https://leetcode.com/problems/minimum-height-trees/ + */ +public class MinimumHeightTree { + public List findMinHeightTrees(int n, int[][] edges) { + if (n == 1) { + return Collections.singletonList(0); + } + List> adj = new ArrayList<>(); + for (int i = 0; i < n; i++) { + adj.add(new HashSet<>()); + } + for (int[] edge: edges) { + adj.get(edge[0]).add(edge[1]); + adj.get(edge[1]).add(edge[0]); + } + + List leaves = new ArrayList<>(); + for (int i = 0; i < n; i++) { + if (adj.get(i).size() == 1) { + leaves.add(i); + } + } + + while (n > 2) { + n -= leaves.size(); + List newLeaves = new ArrayList<>(); + for (int leaf : leaves) { + int node = adj.get(leaf).iterator().next(); + adj.get(node).remove(leaf); + if (adj.get(node).size() == 1) { + newLeaves.add(node); + } + } + leaves = newLeaves; + } + + return leaves; + } + + public static void main(String args[]) { + MinimumHeightTree mht = new MinimumHeightTree(); + int input[][] = {{1,0},{1,2},{1,3}}; + List result = mht.findMinHeightTrees(4, input); + result.forEach(r -> System.out.print(r + " ")); + } +} diff --git a/showmecode_100/java/com/interview/graph/NumberOfIsland.java b/showmecode_100/java/com/interview/graph/NumberOfIsland.java new file mode 100644 index 00000000..0cff9b38 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/NumberOfIsland.java @@ -0,0 +1,52 @@ +package com.interview.graph; + +/** + http://www.geeksforgeeks.org/find-number-of-islands/ + */ +public class NumberOfIsland { + + public int numberOfIsland(int[][] graph){ + + boolean[][] visited = new boolean[graph.length][graph.length]; + int count = 0; + for(int i=0; i < graph.length ; i ++){ + for(int j =0 ; j < graph[i].length ; j++){ + if(visited[i][j] == false && graph[i][j] == 1) { + count++; + DFS(graph,visited,i,j); + } + } + } + return count; + } + + private void DFS(int[][] graph, boolean[][] visited,int i,int j){ + if(i <0 || j < 0 || i == graph.length || j == graph[i].length) + { + return; + + } + visited[i][j] = true; + if(graph[i][j] == 0){ + return; + } + DFS(graph,visited,i,j+1); + DFS(graph,visited,i+1,j); + DFS(graph,visited,i+1,j+1); + DFS(graph,visited,i-1, j+1); + } + + public static void main(String args[]){ + + int matrix[][] = {{1,1,0,1,0}, + {1,0,0,1,1}, + {0,0,0,0,0}, + {1,0,1,0,1}, + {1,0,0,0,0} + }; + NumberOfIsland island = new NumberOfIsland(); + int count = island.numberOfIsland(matrix); + System.out.println(count); + } +} + \ No newline at end of file diff --git a/showmecode_100/java/com/interview/graph/NumberOfIslandDynamic.java b/showmecode_100/java/com/interview/graph/NumberOfIslandDynamic.java new file mode 100644 index 00000000..18692c0a --- /dev/null +++ b/showmecode_100/java/com/interview/graph/NumberOfIslandDynamic.java @@ -0,0 +1,63 @@ +package com.interview.graph; + +import java.util.*; + +/** + * A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand operation + * which turns the water at position (row, col) into a land. Given a list of positions to operate, + * count the number of islands after each addLand operation. An island is surrounded by water and is formed by + * connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all + * surrounded by water. + * https://leetcode.com/problems/number-of-islands-ii/ + */ +public class NumberOfIslandDynamic { + public List numIslands2(int n, int m, int[][] positions) { + if (positions.length == 0 || positions[0].length == 0) { + return Collections.emptyList(); + } + int count = 0; + DisjointSet ds = new DisjointSet(); + Set land = new HashSet<>(); + List result = new ArrayList<>(); + for (int[] position : positions) { + int index = position[0]*m + position[1]; + land.add(index); + ds.makeSet(index); + count++; + //find the four neighbors; + int n1 = (position[0] - 1)*m + position[1]; + int n2 = (position[0] + 1)*m + position[1]; + int n3 = (position[0])*m + position[1] + 1; + int n4 = (position[0])*m + position[1] - 1; + + if (position[0] - 1 >= 0 && land.contains(n1)) { + if (ds.union(index, n1)) { + count--; + } + } + if (position[0] + 1 < n && land.contains(n2)) { + if (ds.union(index, n2)) { + count--; + } + } + if (position[1] + 1 < m && land.contains(n3)) { + if (ds.union(index, n3)) { + count--; + } + } + if (position[1] - 1 >= 0 && land.contains(n4)) { + if (ds.union(index, n4)) { + count--; + } + } + result.add(count); + } + return result; + } + + public static void main(String args[]) { + NumberOfIslandDynamic nd = new NumberOfIslandDynamic(); + int[][] input = {{0, 1}, {1, 2}, {2, 1}, {1, 0}, {0, 2}, {0, 0}, {1, 1}}; + System.out.print(nd.numIslands2(3, 3, input)); + } +} diff --git a/showmecode_100/java/com/interview/graph/NumberofTriangles.java b/showmecode_100/java/com/interview/graph/NumberofTriangles.java new file mode 100644 index 00000000..bf0d48ac --- /dev/null +++ b/showmecode_100/java/com/interview/graph/NumberofTriangles.java @@ -0,0 +1,66 @@ +package com.interview.graph; + +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.careercup.com/question?id=5988741646647296 + * Given an undirected graph find number of triangles in this graph + * Find cycle of length 3. Pass parent in DFS search. + * If there is a cycle check if my parent is neighbor of the the node + * which caused it to be a cycle. + */ +public class NumberofTriangles { + + public int countTriangles(Graph graph){ + Map,Boolean> visited = new HashMap,Boolean>(); + int count =0; + for(Vertex vertex : graph.getAllVertex()){ + count += DFS(vertex,visited,null); + } + return count; + } + + public int DFS(Vertex vertex, Map,Boolean> visited,Vertex parent){ + + if(visited.containsKey(vertex)){ + return 0; + } + visited.put(vertex, true); + int count = 0; + for(Vertex child : vertex.getAdjacentVertexes()){ + if(child.equals(parent)){ + continue; + } + if(visited.containsKey(child)){ + count += isNeighbor(child, parent) ? 1: 0; + }else{ + count += DFS(child, visited, vertex); + } + } + return count; + } + + private boolean isNeighbor(Vertex vertex, Vertex destVertex){ + for(Vertex child : vertex.getAdjacentVertexes()){ + if(child.equals(destVertex)){ + return true; + } + } + return false; + } + + public static void main(String args[]){ + Graph graph = new Graph(false); + graph.addEdge(0, 1); + graph.addEdge(0, 2); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(1, 3); + graph.addEdge(3, 4); + graph.addEdge(0, 4); + graph.addEdge(0,3); + NumberofTriangles not = new NumberofTriangles(); + System.out.println(not.countTriangles(graph)); + } +} diff --git a/showmecode_100/java/com/interview/graph/PrimMST.java b/showmecode_100/java/com/interview/graph/PrimMST.java new file mode 100644 index 00000000..bbd67b87 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/PrimMST.java @@ -0,0 +1,111 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Date 10/11/2014 + * @author Tushar Roy + * + * Find minimum spanning tree using Prim's algorithm + * + * Space complexity - O(E + V) + * Time complexity - O(ElogV) + * + * References + * https://en.wikipedia.org/wiki/Prim%27s_algorithm + * CLRS book + */ +public class PrimMST { + + /** + * Main method of Prim's algorithm. + */ + public List> primMST(Graph graph){ + + //binary heap + map data structure + BinaryMinHeap> minHeap = new BinaryMinHeap<>(); + + //map of vertex to edge which gave minimum weight to this vertex. + Map,Edge> vertexToEdge = new HashMap<>(); + + //stores final result + List> result = new ArrayList<>(); + + //insert all vertices with infinite value initially. + for(Vertex v : graph.getAllVertex()){ + minHeap.add(Integer.MAX_VALUE, v); + } + + //start from any random vertex + Vertex startVertex = graph.getAllVertex().iterator().next(); + + //for the start vertex decrease the value in heap + map to 0 + minHeap.decrease(startVertex, 0); + + //iterate till heap + map has elements in it + while(!minHeap.empty()){ + //extract min value vertex from heap + map + Vertex current = minHeap.extractMin(); + + //get the corresponding edge for this vertex if present and add it to final result. + //This edge wont be present for first vertex. + Edge spanningTreeEdge = vertexToEdge.get(current); + if(spanningTreeEdge != null) { + result.add(spanningTreeEdge); + } + + //iterate through all the adjacent vertices + for(Edge edge : current.getEdges()){ + Vertex adjacent = getVertexForEdge(current, edge); + //check if adjacent vertex exist in heap + map and weight attached with this vertex is greater than this edge weight + if(minHeap.containsData(adjacent) && minHeap.getWeight(adjacent) > edge.getWeight()){ + //decrease the value of adjacent vertex to this edge weight. + minHeap.decrease(adjacent, edge.getWeight()); + //add vertex->edge mapping in the graph. + vertexToEdge.put(adjacent, edge); + } + } + } + return result; + } + + private Vertex getVertexForEdge(Vertex v, Edge e){ + return e.getVertex1().equals(v) ? e.getVertex2() : e.getVertex1(); + } + + public static void main(String args[]){ + Graph graph = new Graph<>(false); + /* graph.addEdge(0, 1, 4); + graph.addEdge(1, 2, 8); + graph.addEdge(2, 3, 7); + graph.addEdge(3, 4, 9); + graph.addEdge(4, 5, 10); + graph.addEdge(2, 5, 4); + graph.addEdge(1, 7, 11); + graph.addEdge(0, 7, 8); + graph.addEdge(2, 8, 2); + graph.addEdge(3, 5, 14); + graph.addEdge(5, 6, 2); + graph.addEdge(6, 8, 6); + graph.addEdge(6, 7, 1); + graph.addEdge(7, 8, 7);*/ + + graph.addEdge(1, 2, 3); + graph.addEdge(2, 3, 1); + graph.addEdge(3, 1, 1); + graph.addEdge(1, 4, 1); + graph.addEdge(2, 4, 3); + graph.addEdge(4, 5, 6); + graph.addEdge(5, 6, 2); + graph.addEdge(3, 5, 5); + graph.addEdge(3, 6, 4); + + PrimMST prims = new PrimMST(); + Collection> edges = prims.primMST(graph); + for(Edge edge : edges){ + System.out.println(edge); + } + } + + +} diff --git a/showmecode_100/java/com/interview/graph/PrintAllPathFromSourceToDestination.java b/showmecode_100/java/com/interview/graph/PrintAllPathFromSourceToDestination.java new file mode 100644 index 00000000..c3d4293a --- /dev/null +++ b/showmecode_100/java/com/interview/graph/PrintAllPathFromSourceToDestination.java @@ -0,0 +1,57 @@ +package com.interview.graph; + +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * http://www.careercup.com/question?id=5922416572235776 + * Test case + * Source or destination vertex does not exist in the graph + * There is no path between src to dest vertex + */ +public class PrintAllPathFromSourceToDestination { + + public void printPath(Graph graph,Vertex start, Vertex destination){ + Set> visited = new LinkedHashSet>(); + printPath(visited,destination,start); + } + + private void printPath(Set> visited,Vertex destination,Vertex current){ + if(visited.contains(current)){ + return; + } + if(destination.equals(current)){ + for(Vertex v : visited){ + System.out.print(v.id + " "); + } + System.out.println(destination.id); + return; + } + + visited.add(current); + for(Vertex child : current.getAdjacentVertexes()){ + printPath(visited,destination,child); + } + visited.remove(current); + } + + public static void main(String args[]){ + Graph graph = new Graph(false); + graph.addEdge(1, 2); + graph.addEdge(1, 3); + graph.addEdge(2, 4); + graph.addEdge(2, 5); + graph.addEdge(3, 6); + graph.addEdge(5, 6); + graph.addEdge(5, 7); + graph.addEdge(6, 7); + graph.addEdge(4, 7); + graph.addEdge(1, 8); + graph.addEdge(8, 9); + graph.addEdge(9, 1); + Vertex start = graph.getVertex(1); + Vertex dest = graph.getVertex(7); + PrintAllPathFromSourceToDestination pap = new PrintAllPathFromSourceToDestination(); + pap.printPath(graph, start, dest); + } +} diff --git a/showmecode_100/java/com/interview/graph/ShortestDistanceFromExit.java b/showmecode_100/java/com/interview/graph/ShortestDistanceFromExit.java new file mode 100644 index 00000000..636035cb --- /dev/null +++ b/showmecode_100/java/com/interview/graph/ShortestDistanceFromExit.java @@ -0,0 +1,107 @@ +package com.interview.graph; + +import java.util.LinkedList; +import java.util.Queue; + +enum Cell{ + SPACE, + BLOCK, + GUARD +} + +class Point{ + int x; + int y; + Point(int x, int y){ + this.x = x; + this.y = y; + } +} + +/** + * @Date 07/05/2015 + * @author Tushar Roy + * + * Given a 2 D floor plan with empty space, block and multiple exits. Find distance of every empty space + * from nearest exits in case of fire emergency. + * + * Idea is to start from every exit position and do BFS search in all 4 directions and maintain the distance of every + * space from exit. If another exit in future iterator is closer than already calculated exit then update + * the distance. + * + * Space complexity is O(n*m) + * Time complexity is O(number of exit * m * n); + * + */ +public class ShortestDistanceFromExit { + + public int[][] findShortest(Cell input[][]){ + int distance[][] = new int[input.length][input[0].length]; + for(int i=0; i < input.length; i++){ + for(int j=0; j < input[0].length; j++){ + distance[i][j] = Integer.MAX_VALUE; + } + } + + for(int i=0; i < input.length; i++){ + for(int j =0; j < input[i].length; j++){ + //for every exit location do a BFS starting with this exit as the origin + if(input[i][j] == Cell.GUARD){ + distance[i][j] = 0; + setDistance(input, i, j, distance); + } + } + } + return distance; + + } + + private void setDistance(Cell input[][], int x, int y, int distance[][]){ + + boolean visited[][] = new boolean[input.length][input[0].length]; + Queue q = new LinkedList<>(); + q.offer(new Point(x,y)); + //Do a BFS at keep updating distance. + while(!q.isEmpty()){ + Point p = q.poll(); + setDistanceUtil(q, input, p, getNeighbor(input, p.x+1, p.y), distance, visited); + setDistanceUtil(q, input, p, getNeighbor(input, p.x, p.y+1), distance, visited); + setDistanceUtil(q, input, p, getNeighbor(input, p.x-1, p.y), distance, visited); + setDistanceUtil(q, input, p, getNeighbor(input, p.x, p.y-1), distance, visited); + } + } + + private void setDistanceUtil(Queue q, Cell input[][], Point p, Point newPoint, int distance[][], boolean visited[][]){ + if(newPoint != null && !visited[newPoint.x][newPoint.y]){ + if(input[newPoint.x][newPoint.y] != Cell.GUARD && input[newPoint.x][newPoint.y] != Cell.BLOCK){ + distance[newPoint.x][newPoint.y] = Math.min(distance[newPoint.x][newPoint.y], 1 + distance[p.x][p.y]); + visited[newPoint.x][newPoint.y] = true; + q.offer(newPoint); + } + } + } + + private Point getNeighbor(Cell input[][], int x, int y){ + if(x < 0 || x >= input.length || y < 0 || y >= input[0].length ) { + return null; + } + return new Point(x,y); + } + public static void main(String args[]){ + ShortestDistanceFromExit sdg = new ShortestDistanceFromExit(); + Cell input[][] = {{Cell.SPACE, Cell.SPACE, Cell.BLOCK, Cell.BLOCK}, + {Cell.SPACE, Cell.SPACE, Cell.GUARD, Cell.SPACE}, + {Cell.SPACE, Cell.SPACE, Cell.BLOCK, Cell.SPACE}, + {Cell.SPACE, Cell.GUARD, Cell.BLOCK, Cell.SPACE} + }; + int result[][] = sdg.findShortest(input); + for(int i=0; i < result.length; i++) { + for(int j=0; j < result[0].length; j++){ + System.out.print(result[i][j] + " "); + } + System.out.println(); + } + + } + +} diff --git a/showmecode_100/java/com/interview/graph/StronglyConnectedComponent.java b/showmecode_100/java/com/interview/graph/StronglyConnectedComponent.java new file mode 100644 index 00000000..eac4514f --- /dev/null +++ b/showmecode_100/java/com/interview/graph/StronglyConnectedComponent.java @@ -0,0 +1,118 @@ +package com.interview.graph; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Date 10/01/2014 + * @author Tushar Roy + * + * Given a directed graph, find all strongly connected components in this graph. + * We are going to use Kosaraju's algorithm to find strongly connected component. + * + * Algorithm + * Create a order of vertices by finish time in decreasing order. + * Reverse the graph + * Do a DFS on reverse graph by finish time of vertex and created strongly connected + * components. + * + * Runtime complexity - O(V + E) + * Space complexity - O(V) + * + * References + * https://en.wikipedia.org/wiki/Strongly_connected_component + * http://www.geeksforgeeks.org/strongly-connected-components/ + */ +public class StronglyConnectedComponent { + + public List>> scc(Graph graph) { + + //it holds vertices by finish time in reverse order. + Deque> stack = new ArrayDeque<>(); + //holds visited vertices for DFS. + Set> visited = new HashSet<>(); + + //populate stack with vertices with vertex finishing last at the top. + for (Vertex vertex : graph.getAllVertex()) { + if (visited.contains(vertex)) { + continue; + } + DFSUtil(vertex, visited, stack); + } + + //reverse the graph. + Graph reverseGraph = reverseGraph(graph); + + //Do a DFS based off vertex finish time in decreasing order on reverse graph.. + visited.clear(); + List>> result = new ArrayList<>(); + while (!stack.isEmpty()) { + Vertex vertex = reverseGraph.getVertex(stack.poll().getId()); + if(visited.contains(vertex)){ + continue; + } + Set> set = new HashSet<>(); + DFSUtilForReverseGraph(vertex, visited, set); + result.add(set); + } + return result; + } + + private Graph reverseGraph(Graph graph) { + Graph reverseGraph = new Graph<>(true); + for (Edge edge : graph.getAllEdges()) { + reverseGraph.addEdge(edge.getVertex2().getId(), edge.getVertex1() + .getId(), edge.getWeight()); + } + return reverseGraph; + } + + private void DFSUtil(Vertex vertex, + Set> visited, Deque> stack) { + visited.add(vertex); + for (Vertex v : vertex.getAdjacentVertexes()) { + if (visited.contains(v)) { + continue; + } + DFSUtil(v, visited, stack); + } + stack.offerFirst(vertex); + } + + private void DFSUtilForReverseGraph(Vertex vertex, + Set> visited, Set> set) { + visited.add(vertex); + set.add(vertex); + for (Vertex v : vertex.getAdjacentVertexes()) { + if (visited.contains(v)) { + continue; + } + DFSUtilForReverseGraph(v, visited, set); + } + } + + public static void main(String args[]){ + Graph graph = new Graph<>(true); + graph.addEdge(0, 1); + graph.addEdge(1, 2); + graph.addEdge(2, 0); + graph.addEdge(1, 3); + graph.addEdge(3, 4); + graph.addEdge(4, 5); + graph.addEdge(5, 3); + graph.addEdge(5, 6); + + StronglyConnectedComponent scc = new StronglyConnectedComponent(); + List>> result = scc.scc(graph); + + //print the result + result.forEach(set -> { + set.forEach(v -> System.out.print(v.getId() + " ")); + System.out.println(); + }); + } +} diff --git a/showmecode_100/java/com/interview/graph/TarjanStronglyConnectedComponent.java b/showmecode_100/java/com/interview/graph/TarjanStronglyConnectedComponent.java new file mode 100644 index 00000000..cf7577ed --- /dev/null +++ b/showmecode_100/java/com/interview/graph/TarjanStronglyConnectedComponent.java @@ -0,0 +1,122 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Date 08/16/2015 + * @author Tushar Roy + * + * Find strongly connected components of directed graph. + * + * Time complexity is O(E + V) + * Space complexity is O(V) + * + * Reference - https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + */ +public class TarjanStronglyConnectedComponent { + + private Map, Integer> visitedTime; + private Map, Integer> lowTime; + private Set> onStack; + private Deque> stack; + private Set> visited; + private List>> result; + private int time; + + public List>> scc(Graph graph) { + + //keeps the time when every vertex is visited + time = 0; + //keeps map of vertex to time it was visited + visitedTime = new HashMap<>(); + + //keeps map of vertex and time of first vertex visited in current DFS + lowTime = new HashMap<>(); + + //tells if a vertex is in stack or not + onStack = new HashSet<>(); + + //stack of visited vertices + stack = new LinkedList<>(); + + //tells if vertex has ever been visited or not. This is for DFS purpose. + visited = new HashSet<>(); + + //stores the strongly connected components result; + result = new ArrayList<>(); + + //start from any vertex in the graph. + for (Vertex vertex : graph.getAllVertex()) { + if(visited.contains(vertex)) { + continue; + } + sccUtil(vertex); + } + + return result; + } + + private void sccUtil(Vertex vertex) { + + visited.add(vertex); + visitedTime.put(vertex, time); + lowTime.put(vertex, time); + time++; + stack.addFirst(vertex); + onStack.add(vertex); + + for (Vertex child : vertex.getAdjacentVertexes()) { + //if child is not visited then visit it and see if it has link back to vertex's ancestor. In that case update + //low time to ancestor's visit time + if (!visited.contains(child)) { + sccUtil(child); + //sets lowTime[vertex] = min(lowTime[vertex], lowTime[child]); + lowTime.compute(vertex, (v, low) -> + Math.min(low, lowTime.get(child)) + ); + } //if child is on stack then see if it was visited before vertex's low time. If yes then update vertex's low time to that. + else if (onStack.contains(child)) { + //sets lowTime[vertex] = min(lowTime[vertex], visitedTime[child]); + lowTime.compute(vertex, (v, low) -> Math.min(low, visitedTime.get(child)) + ); + } + } + + //if vertex low time is same as visited time then this is start vertex for strongly connected component. + //keep popping vertices out of stack still you find current vertex. They are all part of one strongly + //connected component. + if (visitedTime.get(vertex) == lowTime.get(vertex)) { + Set> stronglyConnectedComponenet = new HashSet<>(); + Vertex v; + do { + v = stack.pollFirst(); + onStack.remove(v); + stronglyConnectedComponenet.add(v); + } while (!vertex.equals(v)); + result.add(stronglyConnectedComponenet); + } + } + + public static void main(String args[]) { + Graph graph = new Graph<>(true); + graph.addEdge(1,2); + graph.addEdge(2,3); + graph.addEdge(3,1); + graph.addEdge(3,4); + graph.addEdge(4,5); + graph.addEdge(5,6); + graph.addEdge(6,4); + graph.addEdge(7,6); + graph.addEdge(7,8); + graph.addEdge(8,7); + + TarjanStronglyConnectedComponent tarjanStronglyConnectedComponent = new TarjanStronglyConnectedComponent(); + List>> result = tarjanStronglyConnectedComponent.scc(graph); + + result.forEach(scc -> { + scc.forEach(vertex -> System.out.print(vertex + " ")); + System.out.println(); + }); + + } +} diff --git a/showmecode_100/java/com/interview/graph/TopologicalSort.java b/showmecode_100/java/com/interview/graph/TopologicalSort.java new file mode 100644 index 00000000..16cf3af5 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/TopologicalSort.java @@ -0,0 +1,64 @@ +package com.interview.graph; + +import java.util.Set; +import java.util.HashSet; +import java.util.Deque; +import java.util.ArrayDeque; + +/** + * Date 08/20/2014 + * @author Tushar Roy + * + * Given a directed acyclic graph, do a topological sort on this graph. + * + * Do DFS by keeping visited. Put the vertex which are completely explored into a stack. + * Pop from stack to get sorted order. + * + * Space and time complexity is O(n). + */ +public class TopologicalSort { + + /** + * Main method to be invoked to do topological sorting. + */ + public Deque> topSort(Graph graph) { + Deque> stack = new ArrayDeque<>(); + Set> visited = new HashSet<>(); + for (Vertex vertex : graph.getAllVertex()) { + if (visited.contains(vertex)) { + continue; + } + topSortUtil(vertex,stack,visited); + } + return stack; + } + + private void topSortUtil(Vertex vertex, Deque> stack, + Set> visited) { + visited.add(vertex); + for(Vertex childVertex : vertex.getAdjacentVertexes()){ + if(visited.contains(childVertex)){ + continue; + } + topSortUtil(childVertex,stack,visited); + } + stack.offerFirst(vertex); + } + + public static void main(String args[]){ + Graph graph = new Graph<>(true); + graph.addEdge(1, 3); + graph.addEdge(1, 2); + graph.addEdge(3, 4); + graph.addEdge(5, 6); + graph.addEdge(6, 3); + graph.addEdge(3, 8); + graph.addEdge(8, 11); + + TopologicalSort sort = new TopologicalSort(); + Deque> result = sort.topSort(graph); + while(!result.isEmpty()){ + System.out.println(result.poll()); + } + } +} diff --git a/showmecode_100/java/com/interview/graph/TransitiveClosure.java b/showmecode_100/java/com/interview/graph/TransitiveClosure.java new file mode 100644 index 00000000..8a9e02e6 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/TransitiveClosure.java @@ -0,0 +1,41 @@ +package com.interview.graph; + +/** + * http://www.geeksforgeeks.org/transitive-closure-of-a-graph/ + */ +public class TransitiveClosure { + + public boolean[][] getTransitiveClosure(int [][]graph){ + int rows = graph.length; + int cols = graph[0].length; + boolean[][] result = new boolean[rows][cols]; + + for(int i = 0; i < graph.length; i++){ + for(int j=0; j < graph.length; j++){ + if(graph[i][j] != 100){ + result[i][j] = true; + } + } + } + for(int i=0; i < rows; i++){ + for(int j=0 ; j < rows; j++){ + for(int k=0; k < rows; k++){ + result[i][j] = result[i][j] || (result[i][k] && result[k][j]); + } + } + } + return result; + } + + public static void main(String args[]){ + TransitiveClosure closure = new TransitiveClosure(); + int[][] graph = {{0,2,2,4,100},{100,0,100,1,100},{100,100,0,3,100},{100,100,3,0,2},{100,3,100,100,0}}; + boolean result[][] = closure.getTransitiveClosure(graph); + for(int i=0; i < result.length; i++){ + for(int j=0; j < result.length; j++){ + System.out.print(result[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/graph/TravelingSalesmanHeldKarp.java b/showmecode_100/java/com/interview/graph/TravelingSalesmanHeldKarp.java new file mode 100644 index 00000000..ca0114db --- /dev/null +++ b/showmecode_100/java/com/interview/graph/TravelingSalesmanHeldKarp.java @@ -0,0 +1,179 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Date 11/17/2015 + * @author Tushar Roy + * + * Help Karp method of finding tour of traveling salesman. + * + * Time complexity - O(2^n * n^2) + * Space complexity - O(2^n) + * + * https://en.wikipedia.org/wiki/Held%E2%80%93Karp_algorithm + */ +public class TravelingSalesmanHeldKarp { + + private static int INFINITY = 100000000; + + private static class Index { + int currentVertex; + Set vertexSet; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Index index = (Index) o; + + if (currentVertex != index.currentVertex) return false; + return !(vertexSet != null ? !vertexSet.equals(index.vertexSet) : index.vertexSet != null); + } + + @Override + public int hashCode() { + int result = currentVertex; + result = 31 * result + (vertexSet != null ? vertexSet.hashCode() : 0); + return result; + } + + private static Index createIndex(int vertex, Set vertexSet) { + Index i = new Index(); + i.currentVertex = vertex; + i.vertexSet = vertexSet; + return i; + } + } + + private static class SetSizeComparator implements Comparator>{ + @Override + public int compare(Set o1, Set o2) { + return o1.size() - o2.size(); + } + } + + public int minCost(int[][] distance) { + + //stores intermediate values in map + Map minCostDP = new HashMap<>(); + Map parent = new HashMap<>(); + + List> allSets = generateCombination(distance.length - 1); + + for(Set set : allSets) { + for(int currentVertex = 1; currentVertex < distance.length; currentVertex++) { + if(set.contains(currentVertex)) { + continue; + } + Index index = Index.createIndex(currentVertex, set); + int minCost = INFINITY; + int minPrevVertex = 0; + //to avoid ConcurrentModificationException copy set into another set while iterating + Set copySet = new HashSet<>(set); + for(int prevVertex : set) { + int cost = distance[prevVertex][currentVertex] + getCost(copySet, prevVertex, minCostDP); + if(cost < minCost) { + minCost = cost; + minPrevVertex = prevVertex; + } + } + //this happens for empty subset + if(set.size() == 0) { + minCost = distance[0][currentVertex]; + } + minCostDP.put(index, minCost); + parent.put(index, minPrevVertex); + } + } + + Set set = new HashSet<>(); + for(int i=1; i < distance.length; i++) { + set.add(i); + } + int min = Integer.MAX_VALUE; + int prevVertex = -1; + //to avoid ConcurrentModificationException copy set into another set while iterating + Set copySet = new HashSet<>(set); + for(int k : set) { + int cost = distance[k][0] + getCost(copySet, k, minCostDP); + if(cost < min) { + min = cost; + prevVertex = k; + } + } + + parent.put(Index.createIndex(0, set), prevVertex); + printTour(parent, distance.length); + return min; + } + + private void printTour(Map parent, int totalVertices) { + Set set = new HashSet<>(); + for(int i=0; i < totalVertices; i++) { + set.add(i); + } + Integer start = 0; + Deque stack = new LinkedList<>(); + while(true) { + stack.push(start); + set.remove(start); + start = parent.get(Index.createIndex(start, set)); + if(start == null) { + break; + } + } + StringJoiner joiner = new StringJoiner("->"); + stack.forEach(v -> joiner.add(String.valueOf(v))); + System.out.println("\nTSP tour"); + System.out.println(joiner.toString()); + } + + private int getCost(Set set, int prevVertex, Map minCostDP) { + set.remove(prevVertex); + Index index = Index.createIndex(prevVertex, set); + int cost = minCostDP.get(index); + set.add(prevVertex); + return cost; + } + + private List> generateCombination(int n) { + int input[] = new int[n]; + for(int i = 0; i < input.length; i++) { + input[i] = i+1; + } + List> allSets = new ArrayList<>(); + int result[] = new int[input.length]; + generateCombination(input, 0, 0, allSets, result); + Collections.sort(allSets, new SetSizeComparator()); + return allSets; + } + + private void generateCombination(int input[], int start, int pos, List> allSets, int result[]) { + if(pos == input.length) { + return; + } + Set set = createSet(result, pos); + allSets.add(set); + for(int i=start; i < input.length; i++) { + result[pos] = input[i]; + generateCombination(input, i+1, pos+1, allSets, result); + } + } + + private static Set createSet(int input[], int pos) { + if(pos == 0) { + return new HashSet<>(); + } + Set set = new HashSet<>(); + for(int i = 0; i < pos; i++) { + set.add(input[i]); + } + return set; + } +} + + + + diff --git a/showmecode_100/java/com/interview/graph/ValidTree.java b/showmecode_100/java/com/interview/graph/ValidTree.java new file mode 100644 index 00000000..b018a10e --- /dev/null +++ b/showmecode_100/java/com/interview/graph/ValidTree.java @@ -0,0 +1,68 @@ +package com.interview.graph; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), + * write a function to check whether these edges make up a valid tree. + * https://leetcode.com/problems/graph-valid-tree/ + */ +public class ValidTree { + public boolean validTree(int n, int[][] edges) { + if (n <= 1) { + return true; + } + + Map> graph = new HashMap<>(); + + for (int[] edge : edges) { + List neighbors = graph.get(edge[0]); + if (neighbors == null) { + neighbors = new ArrayList<>(); + graph.put(edge[0], neighbors); + } + neighbors.add(edge[1]); + neighbors = graph.get(edge[1]); + if (neighbors == null) { + neighbors = new ArrayList<>(); + graph.put(edge[1], neighbors); + } + neighbors.add(edge[0]); + } + + boolean[] visited = new boolean[n]; + boolean hasCycle = isCycle(0, graph, -1, visited); + if (hasCycle) { + return false; + } + for (int i = 0; i < visited.length; i++) { + if (!visited[i]) { + return false; + } + } + return true; + } + + boolean isCycle(int vertex, Map> graph, int parent, boolean[] visited) { + if (visited[vertex]) { + return true; + } + visited[vertex] = true; + if (graph.get(vertex) == null) { + return false; + } + for (int i : graph.get(vertex)) { + if (i == parent) { + continue; + } + if (isCycle(i, graph, vertex, visited)) { + return true; + } + } + return false; + } +} + diff --git a/showmecode_100/java/com/interview/graph/WallsAndGates.java b/showmecode_100/java/com/interview/graph/WallsAndGates.java new file mode 100644 index 00000000..8d25eda2 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/WallsAndGates.java @@ -0,0 +1,66 @@ +package com.interview.graph; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * You are given a m x n 2D grid initialized with these three possible values. + * -1 - A wall or an obstacle. + * 0 - A gate. + * INF - Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF as + * you may assume that the distance to a gate is less than 2147483647. + * + * Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF + * + * Time complexity O(n*m) + * Space complexity O(n*m) + * + * https://leetcode.com/problems/walls-and-gates/ + */ +public class WallsAndGates { + private static final int d[][] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; + private static final int INF = Integer.MAX_VALUE; + + public void wallsAndGates(int[][] rooms) { + Deque queue = new LinkedList<>(); + gates(rooms, queue); + + while (!queue.isEmpty()) { + Cell cell = queue.pollLast(); + addNeighbors(rooms, cell.row, cell.col, queue); + } + + } + + private void addNeighbors(int[][] rooms, int row, int col, Deque queue) { + for (int[] d1 : d) { + int r1 = row + d1[0]; + int c1 = col + d1[1]; + if (r1 < 0 || c1 < 0 || r1 >= rooms.length || c1 >= rooms[0].length || rooms[r1][c1] != INF) { + continue; + } + rooms[r1][c1] = 1 + rooms[row][col]; + queue.offerFirst(new Cell(r1, c1)); + } + } + + private void gates(int[][] rooms, Deque queue) { + for (int i = 0; i < rooms.length; i++) { + for (int j = 0; j < rooms[0].length; j++) { + if (rooms[i][j] == 0) { + queue.offerFirst(new Cell(i, j)); + } + } + } + } + + class Cell { + int row; + int col; + + Cell(int row, int col) { + this.row = row; + this.col = col; + } + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/graph/WordLadder.java b/showmecode_100/java/com/interview/graph/WordLadder.java new file mode 100644 index 00000000..bb590528 --- /dev/null +++ b/showmecode_100/java/com/interview/graph/WordLadder.java @@ -0,0 +1,100 @@ +package com.interview.graph; + +import java.util.*; + +/** + * Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that: + * Only one letter can be changed at a time + * Each intermediate word must exist in the word list + * + * Solution - + * Since we have to find all paths we need care about below extra stuff on top of regular BFS + * 1) Maintain parent of every word to recreate the path + * 2) Maintain 2 visited. First is for level and once the entire level is done then move it to visited. + * 3) Also since we are looking result from beginWord to endWord switch them initially and go from endWord towards beginWord. + * + * https://leetcode.com/problems/word-ladder-ii/ + */ +public class WordLadder { + public List> findLadders(String beginWord, String endWord, Set wordList) { + if (wordList == null || wordList.size() == 0) { + return Collections.EMPTY_LIST; + } + String temp = endWord; + endWord = beginWord; + beginWord = temp; + Map> parent = new HashMap<>(); + Queue queue1 = new LinkedList<>(); + Set visited = new HashSet<>(); + Set levelVisited = new HashSet<>(); + List> result = new ArrayList<>(); + parent.put(beginWord, null); + queue1.offer(beginWord); + visited.add(beginWord); + boolean foundDestination = false; + while (!queue1.isEmpty()) { + while (!queue1.isEmpty()) { + String word = queue1.poll(); + for (int i = 0; i < word.length(); i++) { + char wordArray[] = word.toCharArray(); + for (char ch = 'a'; ch <= 'z'; ch++) { + wordArray[i] = ch; + String newWord = new String(wordArray); + if (!endWord.equals(newWord) && (!wordList.contains(newWord) || visited.contains(newWord))) { + continue; + } + List parents = parent.get(newWord); + if (parents == null) { + parents = new ArrayList<>(); + parent.put(newWord, parents); + } + parents.add(word); + + levelVisited.add(newWord); + if (endWord.equals(newWord)) { + foundDestination = true; + break; + } + } + } + } + if (foundDestination) { + break; + } + for (String word : levelVisited) { + queue1.offer(word); + visited.add(word); + } + levelVisited.clear(); + } + if (!foundDestination) { + return Collections.EMPTY_LIST; + } else { + setParent(parent, beginWord, new ArrayList<>(), endWord, result); + } + return result; + } + + private void setParent(Map> parent, String startWord, List path, String currentWord, + List> result) { + path.add(currentWord); + if (startWord.equals(currentWord)) { + result.add(new ArrayList<>(path)); + path.remove(path.size() - 1); + return; + } + for (String p : parent.get(currentWord)) { + setParent(parent, startWord, path, p, result); + } + path.remove(path.size() - 1); + } + + public static void main(String args[]) { + String[] wordList = {"hot","dot","dog","lot","log"}; + Set wordSet = new HashSet<>(); + wordSet.addAll(Arrays.asList(wordList)); + WordLadder wl = new WordLadder(); + List> result = wl.findLadders("hit", "cog", wordSet); + System.out.print(result); + } +} diff --git a/showmecode_100/java/com/interview/linklist/AddNumberRepresentedByLinkList.java b/showmecode_100/java/com/interview/linklist/AddNumberRepresentedByLinkList.java new file mode 100644 index 00000000..e09e08d5 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/AddNumberRepresentedByLinkList.java @@ -0,0 +1,93 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/sum-of-two-linked-lists/ + * Test case + * Either of list is null + * Size of list1 is greater, equal or smaller than list2 + * Add with carry in main + * Add with carry in remaining + */ +public class AddNumberRepresentedByLinkList { + + private int carry = 0; + + private Node addWithCarry(Node head1, Node head2){ + if(head1 == null){ + return null; + } + Node result = Node.newNode(0); + result.next = addWithCarry(head1.next, head2.next); + int r = head1.data + head2.data + carry; + result.data = r % 10; + carry = r / 10; + return result; + } + + private Node addRemaining(Node start, Node stop){ + if(start != stop){ + Node result = Node.newNode(0); + result.next = addRemaining(start.next , stop); + result.data = (start.data + carry)%10; + carry = (start.data + carry)/10; + return result; + }else{ + return null; + } + } + + public Node add(Node head1, Node head2){ + if(head1 == null || head2 == null){ + throw new IllegalArgumentException(); + } + LinkList ll = new LinkList(); + int size1 = ll.size(head1); + int size2 = ll.size(head2); + Node larger = null; + Node smaller = null; + if(size1 >= size2){ + larger = head1; + smaller = head2; + }else{ + larger = head2; + smaller = head1; + } + int diff = Math.abs(size1 - size2); + Node largerStart = larger; + while(diff > 0){ + largerStart = largerStart.next; + diff--; + } + Node result = addWithCarry(largerStart,smaller); + Node result1 = addRemaining(larger,largerStart); + if(carry != 0){ + Node top = Node.newNode(carry); + result1 = ll.addAtFront(top, result1); + } + if(result1 != null){ + Node tail = result1; + while(tail.next != null){ + tail = tail.next; + } + tail.next = result; + return result1; + } + return result; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(9, head); + head = ll.addNode(4, head); + + Node head1 = null; + head1 = ll.addNode(3, head1); + head1 = ll.addNode(1, head1); + head1 = ll.addNode(2, head1); + + AddNumberRepresentedByLinkList anr = new AddNumberRepresentedByLinkList(); + Node result = anr.add(head,head1); + ll.printList(result); + } +} diff --git a/showmecode_100/java/com/interview/linklist/CopyLinkListWIthArbitPointer.java b/showmecode_100/java/com/interview/linklist/CopyLinkListWIthArbitPointer.java new file mode 100644 index 00000000..f70b9c6d --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/CopyLinkListWIthArbitPointer.java @@ -0,0 +1,78 @@ +package com.interview.linklist; + +/** + * Date 03/24/2016 + * @author Tushar Roy + * + * A linked list is given such that each node contains an additional random pointer which could point + * to any node in the list or null. Return a deep copy of the list. + * + * Time complexity is O(n) + * Space complexity is O(1) + * + * https://leetcode.com/problems/copy-list-with-random-pointer/ + */ +public class CopyLinkListWIthArbitPointer { + + static class RandomListNode { + int label; + RandomListNode next, random; + RandomListNode(int x) { this.label = x; } + } + + public RandomListNode copyRandomList(RandomListNode head) { + if (head == null) { + return null; + } + + RandomListNode current = head; + while (current != null) { + RandomListNode newNode = new RandomListNode(current.label); + newNode.next = current.next; + newNode.random = current.random; + current.next = newNode; + current = newNode.next; + } + + current = head; + while (current != null) { + RandomListNode next = current.next; + if (next.random != null) { + next.random = next.random.next; + } + current = current.next.next; + } + + current = head; + RandomListNode dummy = new RandomListNode(0); + RandomListNode newCurrent = dummy; + while (current != null) { + newCurrent.next = current.next; + newCurrent = newCurrent.next; + current.next = current.next.next; + current = current.next; + } + + return dummy.next; + } + + public static void main(String args[]){ + + CopyLinkListWIthArbitPointer cll = new CopyLinkListWIthArbitPointer(); + + RandomListNode randomListNode = new RandomListNode(-1); + RandomListNode randomListNode1 = new RandomListNode(4); + RandomListNode randomListNode2 = new RandomListNode(8); + RandomListNode randomListNode3 = new RandomListNode(-3); + RandomListNode randomListNode4 = new RandomListNode(7); + randomListNode.next = randomListNode1; + randomListNode1.next = randomListNode2; + randomListNode2.next = randomListNode3; + randomListNode3.next = randomListNode4; + + randomListNode.random = randomListNode1; + randomListNode2.random = randomListNode3; + randomListNode1.random = randomListNode; + cll.copyRandomList(randomListNode); + } +} diff --git a/showmecode_100/java/com/interview/linklist/DeleteDuplicateNodes.java b/showmecode_100/java/com/interview/linklist/DeleteDuplicateNodes.java new file mode 100644 index 00000000..17e4335c --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/DeleteDuplicateNodes.java @@ -0,0 +1,35 @@ +package com.interview.linklist; + +/** + * Date 04/17/2016 + * @author Tushar Roy + * + * Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct + * numbers from the original list. + * + * For example, + * Given 1->2->3->3->4->4->5, return 1->2->5. + * Given 1->1->1->2->3, return 2->3. + * + * https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ + */ +public class DeleteDuplicateNodes { + public Node deleteDuplicates(Node head) { + Node dummyNode = new Node(); + dummyNode.next = head; + Node current = head; + Node prev = dummyNode; + while (current != null) { + while(current.next != null && current.data == current.next.data) { + current = current.next; + } + if (prev.next == current) { + prev = current; + } else { + prev.next = current.next; + } + current = current.next; + } + return dummyNode.next; + } +} diff --git a/showmecode_100/java/com/interview/linklist/DeleteNAfterMNodes.java b/showmecode_100/java/com/interview/linklist/DeleteNAfterMNodes.java new file mode 100644 index 00000000..c0680cda --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/DeleteNAfterMNodes.java @@ -0,0 +1,51 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/delete-n-nodes-after-m-nodes-of-a-linked-list/ + * Test cases: + * neg value of m and/or n - not allowed + * 0 value of n and/or m - not allowed + * even n and m + * odd n and m + * odd size of the list + * even size of the list + */ +public class DeleteNAfterMNodes { + + public void deleteNAfterMNodes(Node head,int m, int n){ + if(head == null){ + return; + } + while(head != null){ + int i = 0; + while(head != null && i < m-1){ + head = head.next; + i++; + } + if(head == null){ + break; + } + Node temp = head.next; + i=0; + while(temp != null && i < n){ + temp = temp.next; + i++; + } + head.next = temp; + head = temp; + } + } + public static void main(String args[]){ + DeleteNAfterMNodes daf = new DeleteNAfterMNodes(); + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + daf.deleteNAfterMNodes(head, 3, 2); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/DeleteNodeWithGreaterValueOnRight.java b/showmecode_100/java/com/interview/linklist/DeleteNodeWithGreaterValueOnRight.java new file mode 100644 index 00000000..015998a8 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/DeleteNodeWithGreaterValueOnRight.java @@ -0,0 +1,44 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/delete-nodes-which-have-a-greater-value-on-right-side/ + * Test cases + * Sorted list + * reverse sorted list + * 0 1 or more nodes in the list + */ +public class DeleteNodeWithGreaterValueOnRight { + + private int maxFound = Integer.MIN_VALUE; + + public Node deleteNodes(Node head){ + if(head == null){ + return null; + } + Node nextNode = deleteNodes(head.next); + if(head.data > maxFound){ + maxFound = head.data; + } + if(maxFound > head.data){ + return nextNode; + } + head.next = nextNode; + return head; + } + + public static void main(String args[]){ + DeleteNodeWithGreaterValueOnRight dng = new DeleteNodeWithGreaterValueOnRight(); + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(12, head); + head = ll.addNode(15, head); + head = ll.addNode(10, head); + head = ll.addNode(11, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = dng.deleteNodes(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/DoubleLinkList.java b/showmecode_100/java/com/interview/linklist/DoubleLinkList.java new file mode 100644 index 00000000..39a86d8f --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/DoubleLinkList.java @@ -0,0 +1,72 @@ +package com.interview.linklist; + +public class DoubleLinkList { + + public Node addNode(Node head,int data){ + if(head == null){ + head = Node.newNode(data); + return head; + } + Node newNode = Node.newNode(data); + Node current = head; + while(current.next != null){ + current = current.next; + } + current.next = newNode; + newNode.before = current; + return head; + } + + public Node addAtFront(Node head, int data){ + Node newNode = Node.newNode(data); + if(head == null){ + return newNode; + } + newNode.next = head; + head.before = newNode; + return newNode; + } + + public void print(Node head){ + while(head != null){ + System.out.print(head.data + " "); + head = head.next; + } + } + + + public void printFrontBack(Node head){ + Node prev = null; + while(head != null){ + System.out.print(head.data + " "); + prev = head; + head = head.next; + } + System.out.println(); + while(prev != null){ + System.out.print(prev.data + " "); + prev = prev.before; + } + } + + public Node find(Node head, int data){ + while(head != null){ + if(head.data == data){ + return head; + } + head = head.next; + } + return null; + } + + public static void main(String args[]){ + DoubleLinkList dll = new DoubleLinkList(); + Node head = null; + head = dll.addNode(head,1); + head = dll.addNode(head,2); + head = dll.addNode(head,3); + head = dll.addNode(head,4); + head = dll.addNode(head,5); + dll.print(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/Flatten2DList.java b/showmecode_100/java/com/interview/linklist/Flatten2DList.java new file mode 100644 index 00000000..97db5b0e --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/Flatten2DList.java @@ -0,0 +1,44 @@ +package com.interview.linklist; + +import java.util.Iterator; +import java.util.List; + +/** + * Date 10/10/2016 + * @author Tushar Roy + * + * Implement an iterator to flatten a 2d vector. + * + * https://leetcode.com/problems/flatten-2d-vector/ + * + */ +public class Flatten2DList implements Iterator { + private List> vector; + private int currentList = 0; + private int currentPos = 0; + public Flatten2DList(List> vec2d) { + vector = vec2d; + } + + @Override + public Integer next() { + if (!hasNext()) { + throw new IllegalArgumentException(); + } + int data = vector.get(currentList).get(currentPos); + currentPos++; + if (currentPos == vector.get(currentList).size()) { + currentPos = 0; + currentList++; + } + return data; + } + + @Override + public boolean hasNext() { + while (currentList < vector.size() && vector.get(currentList).size() == 0) { + currentList++; + } + return currentList < vector.size(); + } +} diff --git a/showmecode_100/java/com/interview/linklist/FlattenLinkList.java b/showmecode_100/java/com/interview/linklist/FlattenLinkList.java new file mode 100644 index 00000000..9dc0fb2d --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/FlattenLinkList.java @@ -0,0 +1,78 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/flatten-a-linked-list-with-next-and-child-pointers/ + * Test case + * 0 node in the list + * 1 node in the list + * All nodes with child + * No nodes with child + */ +public class FlattenLinkList { + + public void flatten(Node head) { + Node tail = getTail(head); + while (head != null) { + if (head.child != null) { + tail.next = head.child; + tail = getTail(tail.next); + head.child = null; + } + head = head.next; + } + } + + private Node getTail(Node head) { + if (head == null) { + return null; + } + while (head.next != null) { + head = head.next; + } + return head; + } + + public static void main(String args[]) { + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(10, head); + head = ll.addNode(5, head); + head = ll.addNode(12, head); + head = ll.addNode(7, head); + head = ll.addNode(11, head); + + Node head1 = null; + head1 = ll.addNode(4, head1); + head1 = ll.addNode(20, head1); + head1 = ll.addNode(13, head1); + + Node head2 = null; + head2 = ll.addNode(2, head2); + head2 = ll.addNode(8, head2); + + Node head4 = null; + head4 = ll.addNode(17, head4); + head4 = ll.addNode(6, head4); + + Node head5 = null; + head5 = ll.addNode(9, head5); + head5 = ll.addNode(8, head5); + head5 = ll.addNode(15, head5); + + Node f1 = ll.find(head, 10); + f1.child = head1; + + f1 = ll.find(head, 7); + f1.child = head4; + + f1 = ll.find(head4, 17); + f1.child = head5; + + f1 = ll.find(head1, 20); + f1.child = head2; + + FlattenLinkList fll = new FlattenLinkList(); + fll.flatten(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/InsertionSortLinkList.java b/showmecode_100/java/com/interview/linklist/InsertionSortLinkList.java new file mode 100644 index 00000000..904d6e33 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/InsertionSortLinkList.java @@ -0,0 +1,62 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/given-a-linked-list-which-is-sorted-how-will-you-insert-in-sorted-way/ + * Test cases: + * 0 nodes + * 1 nodes + * 2 or more nodes + * already sorted + * reverse sorted + * negative positive numbers + */ +public class InsertionSortLinkList { + + private Node insert(Node head,Node curr){ + if(head == null){ + return curr; + } + Node prev = null; + Node start = head; + while(start != null && curr.data >= start.data){ + prev = start; + start = start.next; + } + if(prev == null){ + curr.next = head; + head = curr; + }else{ + prev.next = curr; + curr.next = start; + } + return head; + } + + public Node sort(Node head){ + Node result = null; + Node curr = head; + Node prevCurr = null; + while(curr != null){ + prevCurr = curr; + curr = curr.next; + prevCurr.next = null; + result = insert(result,prevCurr); + } + return result; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(11, head); + head = ll.addNode(12, head); + head = ll.addNode(-3, head); + head = ll.addNode(45, head); + head = ll.addNode(5, head); + head = ll.addNode(101, head); + + InsertionSortLinkList isll = new InsertionSortLinkList(); + head = isll.sort(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/LRUCache.java b/showmecode_100/java/com/interview/linklist/LRUCache.java new file mode 100644 index 00000000..0d8c6f94 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/LRUCache.java @@ -0,0 +1,131 @@ +package com.interview.linklist; + +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.geeksforgeeks.org/implement-lru-cache/ + * Test cases: + * MAX_SIZE greater than 1 + * Delete when empty + * Delete when full + * Enter data more than max + * Delete till cache is empty + */ +public class LRUCache { + + private Node head; + private Node tail; + private Map map = new HashMap(); + private int MAX_SIZE = 5; + private int size = 0; + public LRUCache(int size){ + MAX_SIZE = size; + } + + public void used(int data){ + if(containsInCache(data)){ + Node node = map.get(data); + if(node != head){ + deleteFromCache(data); + node.next = head; + head.before = node; + head = node; + map.put(data, node); + } + }else{ + addIntoCache(data); + } + } + + public void addIntoCache(int data){ + size++; + if(head == null){ + head = Node.newNode(data); + tail = head; + return; + } + if(size > MAX_SIZE){ + tail = tail.before; + Node next = tail.next; + tail.next = null; + next.before = null; + map.remove(next.data); + } + Node newNode = Node.newNode(data); + newNode.next = head; + if(head != null){ + head.before = newNode; + } + head = newNode; + map.put(data, newNode); + return; + } + + public void printCache(){ + Node temp = head; + while(temp != null){ + System.out.print(temp.data + " "); + temp = temp.next; + } + System.out.println(); + } + + public boolean containsInCache(int data) + { + return map.containsKey(data); + } + + public void deleteFromCache(int data){ + Node node = map.get(data); + if(node == null){ + return; + } + map.remove(data); + if(size == 1){ + head = null; + tail = null; + } + else if(node == head){ + head = head.next; + if(head != null){ + head.before = null; + } + node.next = null; + }else if(node == tail){ + tail = tail.before; + tail.next = null; + }else{ + Node before = node.before; + Node next = node.next; + before.next = next; + next.before = before; + } + } + + public static void main(String args[]){ + LRUCache lruCache = new LRUCache(5); + lruCache.used(4); + + lruCache.used(5); + lruCache.printCache(); + lruCache.used(6); + lruCache.printCache(); + lruCache.used(5); + lruCache.printCache(); + lruCache.used(9); + lruCache.printCache(); + lruCache.used(10); + lruCache.printCache(); + lruCache.used(11); + lruCache.printCache(); + lruCache.used(16); + lruCache.printCache(); + lruCache.used(10); + lruCache.printCache(); + lruCache.deleteFromCache(10); + lruCache.printCache(); + lruCache.deleteFromCache(9); + lruCache.printCache(); + } +} diff --git a/showmecode_100/java/com/interview/linklist/LRUCacheLeetCode.java b/showmecode_100/java/com/interview/linklist/LRUCacheLeetCode.java new file mode 100644 index 00000000..edb5051e --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/LRUCacheLeetCode.java @@ -0,0 +1,42 @@ +package com.interview.linklist; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Date 02/11/2016 + * @author Tushar Roy + * + * Reference + * https://leetcode.com/problems/lru-cache/ + */ +public class LRUCacheLeetCode { + + private LinkedHashMap map; + private int capacity; + public LRUCacheLeetCode(int capacity) { + this.capacity = capacity; + this.map = new MyMap(capacity); + } + + public int get(int key) { + Integer val = map.get(key); + return val == null ? -1 : val; + } + + public void set(int key, int value) { + map.put(key, value); + } + + class MyMap extends LinkedHashMap { + int capacity; + MyMap(int capacity) { + super(capacity, 0.75f, true); + this.capacity = capacity; + } + @Override + protected boolean removeEldestEntry(Map.Entry entry) { + return size() > capacity; + } + } +} diff --git a/showmecode_100/java/com/interview/linklist/LinkList.java b/showmecode_100/java/com/interview/linklist/LinkList.java new file mode 100644 index 00000000..18b47ef6 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/LinkList.java @@ -0,0 +1,152 @@ +package com.interview.linklist; + +class NodeRef{ + Node node; + public void next(){ + node = node.next; + } +} + +class Node{ + int data; + Node next; + Node before; + Node child; + Object obj; + + public static Node newNode(int data, Object... obj){ + Node n = new Node(); + n.data = data; + n.next = null; + n.before = null; + if(obj.length > 0) + { + n.obj = obj[0]; + } + return n; + } +} + +public class LinkList { + + public Node addNode(int data, Node head, Object... obj){ + Node temp = head; + Node n = null; + if(obj.length > 0){ + n = Node.newNode(data, obj[0]); + }else{ + n = Node.newNode(data); + } + if(head == null){ + return n; + } + + while(head.next != null){ + head = head.next; + } + + head.next = n; + return temp; + } + + public Node addAtFront(Node node, Node head){ + if(head == null){ + return node; + } + node.next = head; + return node; + } + + public Node reverse(Node head){ + Node front = null; + Node middle = head; + Node end = null; + while(middle != null){ + end = middle.next; + middle.next = front; + front = middle; + middle = end; + } + return front; + } + + public Node reverseRecursiveEasy(Node head){ + if(head == null || head.next == null){ + return head; + } + + Node reversedList = reverseRecursiveEasy(head.next); + head.next.next = head; + head.next = null; + return reversedList; + } + + public void reverseRecursive(NodeRef headRef){ + if(headRef.node == null){ + return; + } + Node first = headRef.node; + Node last = headRef.node.next; + if(last == null){ + return; + } + NodeRef lastHeadRef = new NodeRef(); + lastHeadRef.node = last; + reverseRecursive(lastHeadRef); + first.next.next = first; + first.next = null; + headRef.node = lastHeadRef.node; + } + + public Node addAtFront(int data, Node head){ + Node node = Node.newNode(data); + return addAtFront(node,head); + } + + public void printList(Node head){ + while(head != null){ + System.out.println(head.data); + head = head.next; + } + } + + public Node find(Node head, int data){ + while(head != null){ + if(head.data == data){ + return head; + } + head = head.next; + } + return null; + } + + + public int size(Node head){ + int size =0; + while(head != null){ + size++; + head = head.next; + } + return size; + } + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + ll.printList(head); + + // NodeRef headRef = new NodeRef(); + // headRef.node = head; + // ll.reverseRecursive(headRef); + // head = headRef.node; + // ll.printList(head); + System.out.println(); + head = ll.reverseRecursiveEasy(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/LinkListIsPalindrome.java b/showmecode_100/java/com/interview/linklist/LinkListIsPalindrome.java new file mode 100644 index 00000000..9119a0ad --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/LinkListIsPalindrome.java @@ -0,0 +1,39 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/function-to-check-if-a-singly-linked-list-is-palindrome/ + * Test cases: + * odd number of nodes + * even number of nodes + * 0 1 or more nodes + * palindrome list + * non palindrom list + */ +public class LinkListIsPalindrome { + + public boolean isPalindrome(NodeRef head,Node end){ + if(end == null){ + return true; + } + boolean r = isPalindrome(head,end.next); + r = r && head.node.data == end.data; + head.next(); + return r; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(3, head); + head = ll.addNode(2, head); + head = ll.addNode(1, head); + NodeRef nodeRef = new NodeRef(); + nodeRef.node = head; + LinkListIsPalindrome llp = new LinkListIsPalindrome(); + System.out.println(llp.isPalindrome(nodeRef, head)); + } +} diff --git a/showmecode_100/java/com/interview/linklist/LinkListToCompleteBinaryTree.java b/showmecode_100/java/com/interview/linklist/LinkListToCompleteBinaryTree.java new file mode 100644 index 00000000..55dcdedc --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/LinkListToCompleteBinaryTree.java @@ -0,0 +1,64 @@ +package com.interview.linklist; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * http://www.geeksforgeeks.org/given-linked-list-representation-of-complete-tree-convert-it-to-linked-representation/ + * Test cases + * Zero, One or more nodes in link list + */ +public class LinkListToCompleteBinaryTree { + + public void convert(Node head){ + if(head == null){ + return; + } + + Queue queue = new LinkedList<>(); + queue.add(head); + head = head.next; + while(head != null){ + Node top = queue.poll(); + top.before = head; + head = head.next; + if(head != null){ + top.next = head; + head = head.next; + //null the next of child before putting them into queue + top.before.next = null; + top.next.next = null; + queue.add(top.before); + queue.add(top.next); + }else{ + break; + } + } + } + + public void inorder(Node head){ + if(head == null){ + return; + } + inorder(head.before); + System.out.print(head.data + " "); + inorder(head.next); + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(10, head); + head = ll.addNode(12, head); + head = ll.addNode(15, head); + head = ll.addNode(25, head); + head = ll.addNode(30, head); + head = ll.addNode(36, head); + head = ll.addNode(40, head); + head = ll.addNode(45, head); + + LinkListToCompleteBinaryTree llct = new LinkListToCompleteBinaryTree(); + llct.convert(head); + llct.inorder(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/LoopInLinkList.java b/showmecode_100/java/com/interview/linklist/LoopInLinkList.java new file mode 100644 index 00000000..abe7edef --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/LoopInLinkList.java @@ -0,0 +1,60 @@ +package com.interview.linklist; + +/** + * Date 04/17/2016 + * @author tusroy + * + * Given a linked list, determine if it has a cycle in it. + * + * Time complexity O(n) + * Space complexity O(1) + * + * https://leetcode.com/problems/linked-list-cycle/ + */ +public class LoopInLinkList { + + public boolean hasCycle(Node head){ + if (head == null) { + return false; + } + Node slow = head; + Node fast = head.next; + while (fast != null) { + if (slow == fast || fast.next == slow) { + return true; + } + slow = slow.next; + if (fast.next != null) { + fast = fast.next.next; + } else { + break; + } + } + return false; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(7, head); + head = ll.addNode(8, head); + Node node1 = ll.find(head, 8); + Node node2 = ll.find(head, 4); + node1.next = node2; + LoopInLinkList lll = new LoopInLinkList(); + System.out.println(lll.hasCycle(head)); + + node2.next = null; + System.out.println(lll.hasCycle(head)); + + node1 = ll.find(head, 3); + node2.next = node1; + System.out.println(lll.hasCycle(head)); + } +} diff --git a/showmecode_100/java/com/interview/linklist/MergeForLargestSum.java b/showmecode_100/java/com/interview/linklist/MergeForLargestSum.java new file mode 100644 index 00000000..cdc01712 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/MergeForLargestSum.java @@ -0,0 +1,115 @@ +package com.interview.linklist; + +/* + * http://www.geeksforgeeks.org/maximum-sum-linked-list-two-sorted-linked-lists-common-nodes/ + * Test cases + * Test that chains never meet + * Test that chain meets only once + * Test that chain meets multipe times + * Test that one chain ends where it meets chain 2 + */ +public class MergeForLargestSum { + + Node maxChain(Node head1, Node head2){ + if(head1 == null){ + return head2; + } + if(head2 == null){ + return head1; + } + Node curr1 = head1; + Node curr2 = head2; + int sum1 = 0; + int sum2 = 0; + Node result = null; + Node prev = null; + while(curr1!= null && curr2 != null){ + if(curr1.data == curr2.data){ + sum1 += curr1.data; + sum2 += curr2.data; + if(sum1 <= sum2){ + if(result == null){ + result = head2; + prev = curr2; + }else{ + prev.next = head2.next; + prev = curr2; + } + }else{ + if(result == null){ + result = head1; + prev = curr1; + }else{ + prev.next = head1.next; + prev = curr1; + } + } + head1 = curr1; + head2 = curr2; + sum1 = 0; + sum2 = 0; + curr1 = curr1.next; + curr2 = curr2.next; + } + else if(curr1.data < curr2.data){ + sum1 += curr1.data; + curr1 = curr1.next; + } + else{ + sum2 += curr2.data; + curr2 = curr2.next; + } + } + while(curr1 != null){ + sum1+= curr1.data; + curr1 = curr1.next; + } + while(curr2 != null){ + sum2 += curr2.data; + curr2 = curr2.next; + } + if(result != null){ + if(sum1 <= sum2){ + prev.next = head2.next; + }else{ + prev.next = head1.next; + } + }else{ + if(sum1 <= sum2){ + result = head2; + }else{ + result = head1; + } + } + return result; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head1 = null; + head1 = ll.addNode(1, head1); + head1 = ll.addNode(3, head1); + head1 = ll.addNode(30, head1); + head1 = ll.addNode(90, head1); + head1 = ll.addNode(120, head1); + head1 = ll.addNode(240, head1); + head1 = ll.addNode(243, head1); + head1 = ll.addNode(251, head1); + head1 = ll.addNode(511, head1); + Node head2 = null; + head2 = ll.addNode(0, head2); + head2 = ll.addNode(3, head2); + head2 = ll.addNode(12, head2); + head2 = ll.addNode(32, head2); + head2 = ll.addNode(90, head2); + head2 = ll.addNode(125, head2); + head2 = ll.addNode(240, head2); + head2 = ll.addNode(249, head2); + head2 = ll.addNode(251, head2); + head2 = ll.addNode(260, head2); + + MergeForLargestSum mls = new MergeForLargestSum(); + Node result = mls.maxChain(head1, head2); + ll.printList(result); + } +} diff --git a/showmecode_100/java/com/interview/linklist/MergeSortLinkList.java b/showmecode_100/java/com/interview/linklist/MergeSortLinkList.java new file mode 100644 index 00000000..dc9e3400 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/MergeSortLinkList.java @@ -0,0 +1,79 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/merge-sort-for-linked-list/ + * Test cases + * 0 nodes + * 1 nodes + * 2 nodes + * 3 nodes + * fully sorted + * reverse sorted + */ +public class MergeSortLinkList { + + public Node sort(Node head, boolean isAscending){ + + if(head == null || head.next == null){ + return head; + } + Node head1 = frontBackSplit(head); + head = sort(head,isAscending); + head1 = sort(head1,isAscending); + return sortedMerge(head, head1, isAscending); + } + + private Node sortedMerge(Node head1, Node head2, boolean isAscending){ + if(head1 == null){ + return head2; + } + if(head2 == null){ + return head1; + } + if(isAscending){ + if(head1.data <= head2.data){ + head1.next = sortedMerge(head1.next, head2, isAscending); + return head1; + }else{ + head2.next = sortedMerge(head1,head2.next, isAscending); + return head2; + } + }else{ + if(head1.data >= head2.data){ + head1.next = sortedMerge(head1.next, head2, isAscending); + return head1; + }else{ + head2.next = sortedMerge(head1,head2.next, isAscending); + return head2; + } + } + } + + private Node frontBackSplit(Node head){ + if(head == null){ + return null; + } + Node slow = head; + Node fast = head.next; + while(fast != null && fast.next != null){ + slow = slow.next; + fast = fast.next.next; + } + Node newHead = slow.next; + slow.next = null; + return newHead; + } + + public static void main(String args[]){ + MergeSortLinkList msll = new MergeSortLinkList(); + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(11, head); + head = ll.addNode(12, head); + head = ll.addNode(-3, head); + head = ll.addNode(45, head); + head = ll.addNode(5, head); + head = msll.sort(head, false); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/MiddleElementOfLinkList.java b/showmecode_100/java/com/interview/linklist/MiddleElementOfLinkList.java new file mode 100644 index 00000000..d21191fb --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/MiddleElementOfLinkList.java @@ -0,0 +1,42 @@ +package com.interview.linklist; + +/** + * Find middle element in linklist. + * Use two pointer approach. + * Test cases + * 0,1,2,3,4 and so on nodes + * @author tusroy + * + */ +public class MiddleElementOfLinkList { + + public int middle(Node head){ + if(head == null || head.next == null){ + return head.data; + } + + Node slow = head; + Node fast = head.next; + while(fast != null && fast.next != null){ + slow = slow.next; + fast = fast.next.next; + } + return slow.data; + } + + public static void main(String args[]){ + MiddleElementOfLinkList mle = new MiddleElementOfLinkList(); + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + System.out.println(mle.middle(head)); + head = ll.addNode(2, head); + System.out.println(mle.middle(head)); + head = ll.addNode(3, head); + System.out.println(mle.middle(head)); + head = ll.addNode(4, head); + System.out.println(mle.middle(head)); + head = ll.addNode(5, head); + System.out.println(mle.middle(head)); + } +} diff --git a/showmecode_100/java/com/interview/linklist/MultiplyTwoNumbersLinkList.java b/showmecode_100/java/com/interview/linklist/MultiplyTwoNumbersLinkList.java new file mode 100644 index 00000000..76e0c7d4 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/MultiplyTwoNumbersLinkList.java @@ -0,0 +1,142 @@ +package com.interview.linklist; + +/** + * Multiply two numbers in form of link list + * Idea is to multiply one number from head2 with all numbers from head1. + * This result is stored in currentResult. Pass this currentResult and any previous result from multiplication + * and add them + */ +public class MultiplyTwoNumbersLinkList { + + public Node multiply(Node head1, Node head2){ + LinkList ll = new LinkList(); + head1 = ll.reverse(head1); + head2 = ll.reverse(head2); + DoubleLinkList dll = new DoubleLinkList(); + Node result = null; + Node resultStart = null; + Node currentResult = null; + Node currentTail = null; + + while(head2 != null){ + Node current = head1; + int carry = 0; + while(current != null){ + int r = current.data * head2.data; + r += carry; + carry = r/10; + r = r%10; + if(currentResult == null){ + currentResult = dll.addAtFront(currentResult, r); + currentTail = currentResult; + }else{ + currentResult = dll.addAtFront(currentResult, r); + } + current = current.next; + } + if(carry != 0){ + currentResult = dll.addAtFront(currentResult, carry); + } + currentResult = null; + if(result == null){ + result = add(resultStart,currentTail); + resultStart = result; + }else{ + result = add(resultStart,currentTail); + resultStart = resultStart.before; + } + head2 = head2.next; + } + while(result.before != null){ + result = result.before; + } + head1 = ll.reverse(head1); + head2 = ll.reverse(head2); + return result; + } + + private Node add(Node result, Node currentResult){ + if(currentResult == null){ + return result; + } + if(result == null){ + return currentResult; + } + + Node r1 = result.before; + Node addResult = null; + int carry = 0; + while(r1 != null && currentResult != null){ + int r = r1.data + currentResult.data + carry; + Node newNode = Node.newNode(r%10); + if(addResult == null){ + addResult = newNode; + }else{ + addResult.before = newNode; + newNode.next = addResult; + addResult = addResult.before; + } + carry = r/10; + r1 = r1.before; + currentResult = currentResult.before; + } + while(r1 != null){ + int r = r1.data + carry; + Node newNode = Node.newNode(r%10); + if(addResult == null){ + addResult = newNode; + }else{ + addResult.before = newNode; + newNode.next = addResult; + addResult = addResult.before; + } + carry = r/10; + r1 = r1.before; + } + while(currentResult != null){ + int r = currentResult.data + carry; + Node newNode = Node.newNode(r%10); + if(addResult == null){ + addResult = newNode; + }else{ + addResult.before = newNode; + newNode.next = addResult; + addResult = addResult.before; + } + carry = r/10; + currentResult = currentResult.before; + } + if(carry != 0){ + Node newNode = Node.newNode(carry); + addResult.before = newNode; + newNode.next = addResult; + addResult = addResult.before; + } + + while(addResult.next != null){ + addResult = addResult.next; + } + addResult.next = result; + result.before = addResult; + return result; + } + + public static void main(String args[]){ + MultiplyTwoNumbersLinkList mtn = new MultiplyTwoNumbersLinkList(); + LinkList ll = new LinkList(); + Node head1 = null; + head1 = ll.addNode(2, head1); + head1 = ll.addNode(3, head1); + head1 = ll.addNode(5, head1); + head1 = ll.addNode(0, head1); + head1 = ll.addNode(1, head1); + + Node head2 = null; + head2 = ll.addNode(5, head2); + head2 = ll.addNode(7, head2); + head2 = ll.addNode(8, head2); + + Node result = mtn.multiply(head1, head2); + ll.printList(result); + } +} diff --git a/showmecode_100/java/com/interview/linklist/QuickSortSingleLinkList.java b/showmecode_100/java/com/interview/linklist/QuickSortSingleLinkList.java new file mode 100644 index 00000000..abac9c42 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/QuickSortSingleLinkList.java @@ -0,0 +1,129 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/quicksort-on-singly-linked-list/ + * Test cases + * 0 1 or more nodes + * sorted reverse sorted nodes + */ + +//keep head and tail of each result since caller function needs it to +//set complete linklist. If we do not keep tail in each recursion we will +//have to traverse to tail of left side which can be costly operation +class HeadTail{ + Node head; + Node tail; +} + +public class QuickSortSingleLinkList { + + public Node quickSort(Node head){ + if(head == null || head.next == null){ + return head; + } + Node smaller = null; + Node larger = null; + Node pivot = head; + Node temp = head.next; + pivot.next = null; + LinkList ll = new LinkList(); + while(temp != null){ + Node next = temp.next; + temp.next = null; + if(temp.data < pivot.data){ + smaller = ll.addAtFront(temp, smaller); + }else{ + larger = ll.addAtFront(temp, larger); + } + temp = next; + } + + smaller = quickSort(smaller); + larger = quickSort(larger); + + Node tail1 = smaller; + + //this is costly operation which can be prevented by keeping tail. + while(tail1 != null && tail1.next != null){ + tail1 = tail1.next; + } + + if(smaller != null){ + tail1.next = pivot; + pivot.next = larger; + return smaller; + }else{ + pivot.next = larger; + return pivot; + } + } + + public Node quickSortFaster(Node head){ + HeadTail result = quickSortUtil(head); + return result.head; + } + + /** + * This version keeps tail of each recursion which helps us avoid going to tail in each recursion. + * @param head + * @return + */ + private HeadTail quickSortUtil(Node head){ + if(head == null || head.next == null){ + HeadTail headTail = new HeadTail(); + headTail.head = head; + headTail.tail = head; + return headTail; + } + LinkList ll = new LinkList(); + Node leftHead = null; + Node rightHead = null; + + Node curr = head.next; + head.next = null; + Node next = null; + while(curr != null){ + next = curr.next; + curr.next = null; + if(curr.data < head.data){ + leftHead = ll.addAtFront(curr, leftHead); + }else{ + rightHead = ll.addAtFront(curr, rightHead); + } + curr = next; + } + HeadTail leftSide = quickSortUtil(leftHead); + HeadTail rightSide = quickSortUtil(rightHead); + head.next= rightSide.head; + HeadTail result = new HeadTail(); + result.head = head; + result.tail = head; + if(leftSide.tail != null){ + leftSide.tail.next = head; + result.head = leftSide.head; + } + if(rightSide.head != null){ + head.next = rightSide.head; + result.tail = rightSide.tail; + } + return result; + } + + + public static void main(String args[]){ + QuickSortSingleLinkList qss = new QuickSortSingleLinkList(); + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(11, head); + head = ll.addNode(2, head); + head = ll.addNode(-1, head); + head = ll.addNode(50, head); + head = ll.addNode(13, head); + head = ll.addNode(-5, head); + head = ll.addNode(10, head); + head = ll.addNode(8, head); + + head = qss.quickSortFaster(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/RemoveDuplicatesSortedList.java b/showmecode_100/java/com/interview/linklist/RemoveDuplicatesSortedList.java new file mode 100644 index 00000000..8c8b3562 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/RemoveDuplicatesSortedList.java @@ -0,0 +1,44 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/remove-duplicates-from-a-sorted-linked-list/ + * Test cases + * All duplicates + * No duplicates + * Duplicates only in starting + * Duplicates only at the end + * 0 1 or more nodes in the list + */ +public class RemoveDuplicatesSortedList { + + public void removeDuplicates(Node head){ + if(head == null){ + return; + } + Node current = head; + while(current != null && current.next != null){ + if(current.data == current.next.data){ + current.next = current.next.next; + }else{ + current = current.next; + } + } + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(1, head); + head = ll.addNode(1, head); + head = ll.addNode(4, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(6, head); + head = ll.addNode(6, head); + RemoveDuplicatesSortedList rds = new RemoveDuplicatesSortedList(); + rds.removeDuplicates(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/RemoveMiddleElementsOfLineSegment.java b/showmecode_100/java/com/interview/linklist/RemoveMiddleElementsOfLineSegment.java new file mode 100644 index 00000000..b817d250 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/RemoveMiddleElementsOfLineSegment.java @@ -0,0 +1,65 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/given-linked-list-line-segments-remove-middle-points/ + * @author tusroy + * Test cases: + * 0 or more nodes + * All points are edge of line segments so nothing gets removed + * One long line so all points in between get removed + * + */ + +class Point{ + int x; + int y; + Point(int x, int y){ + this.x = x; + this.y = y; + } +} + +public class RemoveMiddleElementsOfLineSegment { + + public void remove(Node head){ + if(head == null || head.next == null){ + return; + } + Node curr = head; + Node next = head.next; + Node nextNext = head.next.next; + while(nextNext != null){ + + Point pcurr = (Point)curr.obj; + Point pnext = (Point)nextNext.obj; + if(pcurr.x == pnext.x || pcurr.y == pnext.y){ + curr.next = nextNext; + next = nextNext; + nextNext = nextNext.next; + }else{ + curr = curr.next; + next = next.next; + nextNext = nextNext.next; + } + + } + } + + public static void main(String args[]){ + Node head1 = null; + + LinkList ll = new LinkList(); + head1 = ll.addNode(1, head1, new Point(0,10)); + head1 = ll.addNode(2, head1, new Point(1,10)); + head1 = ll.addNode(3, head1, new Point(5,10)); + head1 = ll.addNode(4, head1, new Point(7,10)); + head1 = ll.addNode(5, head1, new Point(7,5)); + head1 = ll.addNode(6, head1, new Point(20,5)); + head1 = ll.addNode(7, head1, new Point(40,5)); + head1 = ll.addNode(8, head1, new Point(40,8)); + + RemoveMiddleElementsOfLineSegment rme = new RemoveMiddleElementsOfLineSegment(); + rme.remove(head1); + ll.printList(head1); + } +} diff --git a/showmecode_100/java/com/interview/linklist/ReorderList.java b/showmecode_100/java/com/interview/linklist/ReorderList.java new file mode 100644 index 00000000..63070ace --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/ReorderList.java @@ -0,0 +1,63 @@ +package com.interview.linklist; + +/** + * Given a singly linked list L: L0→L1→…→Ln-1→Ln, + * reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… + * + * https://leetcode.com/problems/reorder-list/ + */ +public class ReorderList { + + public void reorderList(Node head) { + Node back = frontBackSplit(head); + back = reverse(back); + alternateMerge(head, back); + + } + + private Node alternateMerge(Node head1, Node head2) { + Node dummyHead = new Node(); + Node current = dummyHead; + while (head1 != null && head2 != null) { + current.next= head1; + head1 = head1.next; + current = current.next; + current.next = head2; + head2 = head2.next; + current = current.next; + } + current.next = head1; + return dummyHead.next; + } + + private Node reverse(Node head) { + if (head == null) { + return null; + } + Node front = null; + Node mid = head; + Node next = null; + while (mid != null) { + next = mid.next; + mid.next = front; + front = mid; + mid = next; + } + return front; + } + + private Node frontBackSplit(Node head) { + if (head == null) { + return null; + } + Node slow = head; + head = head.next; + while (head != null && head.next != null) { + slow = slow.next; + head = head.next.next; + } + Node next = slow.next; + slow.next = null; + return next; + } +} diff --git a/showmecode_100/java/com/interview/linklist/ReverseAlternateKNodes.java b/showmecode_100/java/com/interview/linklist/ReverseAlternateKNodes.java new file mode 100644 index 00000000..eff990c2 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/ReverseAlternateKNodes.java @@ -0,0 +1,64 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/reverse-alternate-k-nodes-in-a-singly-linked-list/ + * Test case + * k is even odd + * number of nodes are even odd + * k is less than or equal to 1. + */ +public class ReverseAlternateKNodes { + + public Node reverse(Node head,int k,boolean reverse){ + if(k <= 1){ + return head; + } + if(head == null){ + return null; + } + if(reverse){ + int i =0; + Node front = null; + Node middle = head; + Node end = null; + while(middle != null && i < k){ + end = middle.next; + middle.next = front; + front = middle; + middle = end; + i++; + } + head.next = reverse(middle,k, !reverse); + head = front; + }else{ + int i=0; + Node temp = head; + while(i < k-1 && head != null){ + head = head.next; + i++; + } + if(head != null){ + head.next = reverse(head.next,k, !reverse); + } + head = temp; + } + return head; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(7, head); + head = ll.addNode(8, head); + + ReverseAlternateKNodes ra = new ReverseAlternateKNodes(); + head = ra.reverse(head, 3, false); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/ReverseAlternateNodeAndAppendAtEnd.java b/showmecode_100/java/com/interview/linklist/ReverseAlternateNodeAndAppendAtEnd.java new file mode 100644 index 00000000..698b56d1 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/ReverseAlternateNodeAndAppendAtEnd.java @@ -0,0 +1,40 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/given-linked-list-reverse-alternate-nodes-append-end/ + * Test case + * Even and odd number of nodes + */ +public class ReverseAlternateNodeAndAppendAtEnd { + + public void act(Node head){ + + Node result = null; + LinkList ll = new LinkList(); + while(head != null && head.next != null){ + Node temp = head.next; + head.next = head.next.next; + temp.next = null; + result = ll.addAtFront(temp,result); + if(head.next == null){ + break; + } + head = head.next; + } + head.next = result; + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + ReverseAlternateNodeAndAppendAtEnd ran = new ReverseAlternateNodeAndAppendAtEnd(); + ran.act(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/ReverseKNodes.java b/showmecode_100/java/com/interview/linklist/ReverseKNodes.java new file mode 100644 index 00000000..794a1ffb --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/ReverseKNodes.java @@ -0,0 +1,46 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/pairwise-swap-elements-of-a-given-linked-list/ + * Test case + * odd or even number of k + * odd or even number of nodes in the list + */ +public class ReverseKNodes { + + public Node reverse(Node head,int k){ + if(head == null){ + return null; + } + Node front = null; + Node middle = head; + Node end = null; + int i=0; + while(middle != null && i < k){ + end = middle.next; + middle.next = front; + front = middle; + middle = end; + i++; + } + head.next = reverse(middle,k); + return front; + } + + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(7, head); + head = ll.addNode(8, head); + ReverseKNodes rn = new ReverseKNodes(); + head = rn.reverse(head, 3); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/RotateList.java b/showmecode_100/java/com/interview/linklist/RotateList.java new file mode 100644 index 00000000..20c724aa --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/RotateList.java @@ -0,0 +1,37 @@ +package com.interview.linklist; + +/** + * Date 10/10/2016 + * @author Tushar Roy + * Given a list, rotate the list to the right by k places, where k is non-negative. + * + * Time complexity O(min(n, k)) + * + * https://leetcode.com/problems/rotate-list/ + */ +public class RotateList { + public Node rotateRight(Node head, int k) { + if (head == null || k == 0) { + return head; + } + Node slow = head; + Node fast = head; + int i = 0; + while (i < k && fast != null) { + fast = fast.next; + i++; + } + + if (fast == null) { + return rotateRight(head, k % i); + } + while (fast.next != null) { + fast = fast.next; + slow = slow.next; + } + Node next = slow.next; + slow.next = null; + fast.next = head; + return next; + } +} diff --git a/showmecode_100/java/com/interview/linklist/ShuffleMerge.java b/showmecode_100/java/com/interview/linklist/ShuffleMerge.java new file mode 100644 index 00000000..6dfbfdf5 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/ShuffleMerge.java @@ -0,0 +1,82 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/merge-a-linked-list-into-another-linked-list-at-alternate-positions/ + * Given two linklist shuffle merge them. + * e.g head1 = {1->3->5} + * head2 = {2->4} + * result = {1->2->3->4->5} + * Test cases + * head1 is null and head2 is not + * head2 is null and head1 is not + * both are null + * more nodes in head1 than head2 + * more nodes in head2 than head1 + * @author tusroy + * + */ +public class ShuffleMerge { + + public Node shuffleMergeRecursive(Node head1, Node head2){ + if(head1 == null){ + return head2; + } + + if(head2 == null){ + return head1; + } + + Node recur = null; + recur = shuffleMergeRecursive(head1.next, head2.next); + + head1.next = head2; + head2.next = recur; + return head1; + } + /** + Size of list 1 is smaller, equal and larger than list 2 + */ + public Node shuffleMerge(Node head1, Node head2){ + if(head1 == null || head2 == null){ + return head2; + } + + Node tempHead = head1; + Node prev = null; + while(head1 != null && head2 != null){ + Node temp = head1.next; + Node temp1 = head2.next; + head1.next = head2; + head2.next = temp; + prev = head2; + head2 = temp1; + head1 = temp; + } + if(head2 != null){ + prev.next = head2; + } + return tempHead; + } + + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head1 = null; + Node head2 = null; + head1 = ll.addNode(1, head1); + head1 = ll.addNode(3, head1); + head1 = ll.addNode(5, head1); + head1 = ll.addNode(7, head1); + head1 = ll.addNode(9, head1); + head2 = ll.addNode(2, head2); + head2 = ll.addNode(4, head2); + head2 = ll.addNode(6, head2); + head2 = ll.addNode(8, head2); + head2 = ll.addNode(10, head2); + head2 = ll.addNode(12, head2); + head2 = ll.addNode(14, head2); + ShuffleMerge sm = new ShuffleMerge(); + Node result = sm.shuffleMerge(head1, head2); + ll.printList(result); + } +} diff --git a/showmecode_100/java/com/interview/linklist/SortNearlySortedList.java b/showmecode_100/java/com/interview/linklist/SortNearlySortedList.java new file mode 100644 index 00000000..58d6a3f4 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/SortNearlySortedList.java @@ -0,0 +1,68 @@ +package com.interview.linklist; + +/** + * Given a linklist which has individual sorted componenets sort the entire linst + * e.g 1-3-6-8-4-5-10-7-9 + * Here 1,2,6,8 are sorted, 4,5,10 are sorted and 7,9 are sorted + * Test case + * null node + * 1 node + * 2 sorted nodes + * 2 reverse sorted nodes + * 3 reverse sorted nodes + * 4 nodes 2 each sorted among themselves + */ +public class SortNearlySortedList { + + public Node sort(Node head){ + Node result = null; + Node start = head; + while(head != null && head.next != null){ + if(head.data < head.next.data){ + head = head.next; + }else{ + Node temp = head.next; + head.next = null; + result = mergeSort(result,start); + head = temp; + start = temp; + } + } + result = mergeSort(result,start); + return result; + } + + private Node mergeSort(Node head1,Node head2){ + if(head1 == null){ + return head2; + } + if(head2 == null){ + return head1; + } + if(head1.data <= head2.data){ + head1.next = mergeSort(head1.next,head2); + return head1; + }else{ + head2.next = mergeSort(head1,head2.next); + return head2; + } + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(7, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(13, head); + head = ll.addNode(11, head); + head = ll.addNode(12, head); + + SortNearlySortedList sns = new SortNearlySortedList(); + head = sns.sort(head); + ll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/SortedCircularLinkList.java b/showmecode_100/java/com/interview/linklist/SortedCircularLinkList.java new file mode 100644 index 00000000..2d334564 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/SortedCircularLinkList.java @@ -0,0 +1,76 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/sorted-insert-for-circular-linked-list/ + * Test cases + * Insert 2nd element smaller than head + * Insert 2nd element larger than head + * Insert element larger than tail + * Insert element just before tail + * Insert element somewhere between head and tail + */ +public class SortedCircularLinkList { + + public Node add(Node head,int data){ + if(head == null){ + head = Node.newNode(data); + head.next = head; + return head; + } + Node node = Node.newNode(data); + Node tail = getTail(head); + if(node.data < head.data){ + node.next = head; + tail.next = node; + return node; + } + Node current = head; + Node pre = null; + while(current != tail && node.data >= current.data){ + pre = current; + current = current.next; + } + if(node.data < current.data){ + node.next = current; + pre.next = node; + } + else{ + node.next = tail.next; + tail.next = node; + } + return head; + } + + private Node getTail(Node head){ + Node temp = head; + while(temp.next != head){ + temp = temp.next; + } + return temp; + } + + public void printList(Node head){ + if(head == null){ + return; + } + Node current = head.next; + System.out.println(head.data); + while(current != head){ + System.out.println(current.data); + current = current.next; + } + } + + public static void main(String args[]){ + SortedCircularLinkList scll = new SortedCircularLinkList(); + Node head = null; + head = scll.add(head, 10); + head = scll.add(head, 12); + head = scll.add(head, -1); + head = scll.add(head, -5); + head = scll.add(head, 11); + head = scll.add(head, 7); + + scll.printList(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/SortedLLToBalancedBST.java b/showmecode_100/java/com/interview/linklist/SortedLLToBalancedBST.java new file mode 100644 index 00000000..acc81818 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/SortedLLToBalancedBST.java @@ -0,0 +1,65 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/sorted-linked-list-to-balanced-bst/ + * Test cases + * empty list + * 0 1 or more node lists + */ +public class SortedLLToBalancedBST { + + public Node toBalancedBST(Node head){ + LinkList ll = new LinkList(); + int size = ll.size(head); + NodeRef headRef = new NodeRef(); + headRef.node = head; + return toBalancedBST(headRef, size); + } + + private Node toBalancedBST(NodeRef headRef, int size){ + if(size <= 0){ + return null; + } + Node left = toBalancedBST(headRef,size/2); + Node head = headRef.node; + headRef.next(); + Node right = toBalancedBST(headRef,size - size/2 -1); + head.before = left; + head.next = right; + return head; + } + + public void printTreeInOrder(Node head){ + if(head == null){ + return; + } + printTreeInOrder(head.before); + System.out.println(head.data); + printTreeInOrder(head.next); + } + + public void printTreePreOrder(Node head){ + if(head == null){ + return; + } + System.out.println(head.data); + printTreePreOrder(head.before); + printTreePreOrder(head.next); + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(2, head); + head = ll.addNode(3, head); + head = ll.addNode(4, head); + head = ll.addNode(5, head); + head = ll.addNode(6, head); + head = ll.addNode(7, head); + SortedLLToBalancedBST sll = new SortedLLToBalancedBST(); + head = sll.toBalancedBST(head); + sll.printTreeInOrder(head); + sll.printTreePreOrder(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/StackWithLinkListMiddleOperation.java b/showmecode_100/java/com/interview/linklist/StackWithLinkListMiddleOperation.java new file mode 100644 index 00000000..80817b4f --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/StackWithLinkListMiddleOperation.java @@ -0,0 +1,133 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/design-a-stack-with-find-middle-operation/ + * Test cases: + * Delete middle with 1,2,3 element + * Pop with 1,2,3 elements + * Delete or pop when empty stack + */ +public class StackWithLinkListMiddleOperation { + + private Node head = null; + private Node middle = null; + private int size = 0; + public void push(int data){ + if(head == null){ + head = Node.newNode(data); + middle = head; + size++; + return; + } + size++; + Node node = Node.newNode(data); + node.next = head; + head.before = node; + head = node; + if(size % 2 ==0){ + middle = middle.before; + } + } + + public boolean hasMore(){ + if(size > 0 ){ + return true; + }else{ + return false; + } + } + + public int size(){ + return size; + } + + public int pop(){ + if(size == 0){ + throw new IllegalArgumentException(); + } + size--; + if(size % 2 != 0 || size == 0){ + middle = middle.next; + } + int data = head.data; + head = head.next; + head.before = null; + return data; + } + public int top(){ + if(size == 0){ + throw new IllegalArgumentException(); + } + return head.data; + } + public int middle(){ + if(size == 0){ + throw new IllegalArgumentException(); + } + return middle.data; + } + public int deleteMiddle(){ + if(size == 0){ + throw new IllegalArgumentException(); + } + size--; + if(middle == head){ + int data = middle.data; + middle = middle.next; + head = head.next; + if(head != null){ + head.before = null; + } + return data; + } + + if(size % 2 == 0){ + int data = middle.data; + Node next = middle.next; + middle = middle.before; + middle.next = next; + if(next != null){ + next.before = middle; + } + return data; + } + else{ + int data = middle.data; + Node before = middle.before; + middle = middle.next; + middle.before = before; + if(before != null){ + before.next = middle; + } + return data; + } + } + + public static void main(String args[]){ + StackWithLinkListMiddleOperation swl = new StackWithLinkListMiddleOperation(); + swl.push(1); + System.out.println(swl.top() + " " + swl.middle()); + swl.push(2); + System.out.println(swl.top() + " " + swl.middle()); + swl.push(3); + System.out.println(swl.top() + " " + swl.middle()); + swl.push(4); + System.out.println(swl.top() + " " + swl.middle()); + swl.push(5); + System.out.println(swl.top() + " " + swl.middle()); + swl.push(6); + System.out.println(swl.top() + " " + swl.middle()); + System.out.println("\n\n"); + swl.pop(); + System.out.println(swl.top() + " " + swl.middle()); + swl.deleteMiddle(); + System.out.println(swl.top() + " " + swl.middle()); + swl.pop(); + System.out.println(swl.top() + " " + swl.middle()); + swl.deleteMiddle(); + System.out.println(swl.top() + " " + swl.middle()); + swl.pop(); + System.out.println(swl.top() + " " + swl.middle()); + swl.deleteMiddle(); + } +} diff --git a/showmecode_100/java/com/interview/linklist/SwapTwoNodesInDoubleLL.java b/showmecode_100/java/com/interview/linklist/SwapTwoNodesInDoubleLL.java new file mode 100644 index 00000000..153e47fc --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/SwapTwoNodesInDoubleLL.java @@ -0,0 +1,87 @@ +package com.interview.linklist; + +/** + * Swap two nodes in double link list. If it swaps first node its callers responsibility to fix the head + * Test cases + * A right neighbor of B + * B right neighbor of A + * A and B not neighbors of each other + * A or B are start or end nodes + */ +public class SwapTwoNodesInDoubleLL { + + public void swap(Node nodeA, Node nodeB){ + if(nodeA == null || nodeB == null){ + throw new IllegalArgumentException(); + } + //if B is right neighbor of A + if(nodeA.next == nodeB){ + if(nodeA.before != null){ + nodeA.before.next = nodeB; + nodeB.before = nodeA.before; + }else{ + nodeB.before = null; + } + if(nodeB.next != null){ + nodeB.next.before = nodeA; + nodeA.next = nodeB.next; + }else{ + nodeA.next = null; + } + nodeB.next = nodeA; + nodeA.before = nodeB; + }//else if A is right neighbor of B + else if(nodeB.next == nodeA){ + if(nodeB.before != null){ + nodeB.before.next = nodeA; + nodeA.before = nodeB.before; + }else{ + nodeA.before = null; + } + if(nodeA.next != null){ + nodeA.next.before = nodeB; + nodeB.next = nodeA.next; + }else{ + nodeB.next = null; + } + nodeA.next = nodeB; + nodeB.before = nodeA; + }//if A and B are not neighbors of each other + else{ + if(nodeA.before != null){ + nodeA.before.next = nodeB; + } + if(nodeA.next != null){ + nodeA.next.before = nodeB; + } + Node next = nodeB.next; + Node before = nodeB.before; + nodeB.before = nodeA.before; + nodeB.next = nodeA.next; + + if(next != null){ + next.before = nodeA; + } + if(before != null){ + before.next = nodeA; + } + nodeA.before = before; + nodeA.next = next; + } + } + + public static void main(String args[]){ + DoubleLinkList dll = new DoubleLinkList(); + Node head = null; + head = dll.addNode(head,1); + head = dll.addNode(head,2); + head = dll.addNode(head,3); + head = dll.addNode(head,4); + head = dll.addNode(head,5); + SwapTwoNodesInDoubleLL snt = new SwapTwoNodesInDoubleLL(); + Node nodeA = dll.find(head, 3); + Node nodeB = dll.find(head, 5); + snt.swap(nodeA, nodeB); + dll.printFrontBack(head); + } +} diff --git a/showmecode_100/java/com/interview/linklist/TripletToSumInLinkList.java b/showmecode_100/java/com/interview/linklist/TripletToSumInLinkList.java new file mode 100644 index 00000000..00619451 --- /dev/null +++ b/showmecode_100/java/com/interview/linklist/TripletToSumInLinkList.java @@ -0,0 +1,65 @@ +package com.interview.linklist; + +/** + * http://www.geeksforgeeks.org/find-a-triplet-from-three-linked-lists-with-sum-equal-to-a-given-number/ + * Test case + * empty list + * list with 0 1 or more nodes + * negative sum + * 0 sum + * positive sum + */ +public class TripletToSumInLinkList { + + public void printTriplet(Node head1, Node head2, Node head3,int sum){ + if(head1 == null || head2 == null || head3 == null){ + return; + } + + MergeSortLinkList msll = new MergeSortLinkList(); + head2 = msll.sort(head2, true); + head3 = msll.sort(head3, false); + + while(head1 != null){ + int newSum = sum - head1.data; + Node tempHead2 = head2; + Node tempHead3 = head3; + while(tempHead2 != null && tempHead3 != null){ + if(tempHead2.data + tempHead3.data == newSum){ + System.out.println(head1.data + " " + tempHead2.data + " " + tempHead3.data); + break; + } + else if(tempHead2.data + tempHead3.data < newSum){ + tempHead2 = tempHead2.next; + }else{ + tempHead3 = tempHead3.next; + } + } + head1 = head1.next; + } + } + + public static void main(String args[]){ + LinkList ll = new LinkList(); + Node head = null; + head = ll.addNode(1, head); + head = ll.addNode(8, head); + head = ll.addNode(-3, head); + head = ll.addNode(14, head); + + Node head1 = null; + head1 = ll.addNode(-1, head1); + head1 = ll.addNode(22, head1); + head1 = ll.addNode(31, head1); + head1 = ll.addNode(11, head1); + + Node head2 = null; + head2 = ll.addNode(5, head2); + head2 = ll.addNode(7, head2); + head2 = ll.addNode(3, head2); + head2 = ll.addNode(1, head2); + + TripletToSumInLinkList tts = new TripletToSumInLinkList(); + tts.printTriplet(head, head1, head2, 20); + } +} diff --git a/showmecode_100/java/com/interview/misc/AddingTwoSetOfIntervals.java b/showmecode_100/java/com/interview/misc/AddingTwoSetOfIntervals.java new file mode 100644 index 00000000..a5bbdd40 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/AddingTwoSetOfIntervals.java @@ -0,0 +1,99 @@ +package com.interview.misc; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class AddingTwoSetOfIntervals { + + public static class Pair implements Comparable{ + int low; + int high; + Pair(int low,int high){ + this.low = low; + this.high = high; + } + @Override + public int compareTo(Pair o) { + if(this.low <= o.low){ + return -1; + }else{ + return 1; + } + } + + public String toString(){ + return low + " " + high; + } + } + + public List combineInterval(Pair[] arr1, Pair[] arr2){ + Arrays.sort(arr1); + Arrays.sort(arr2); + + List result = new ArrayList(); + int i=0; + int j=0; + Pair current = new Pair(Integer.MIN_VALUE,Integer.MIN_VALUE+1); + while(i < arr1.length && j < arr2.length){ + if(arr1[i].low <= arr2[j].low){ + if(arr1[i].low <= current.high){ + current.high = Math.max(arr1[i].high,current.high); + }else{ + current = arr1[i]; + result.add(current); + } + i++; + } + else{ + if(arr2[j].low <= current.high){ + current.high = Math.max(arr2[j].high,current.high); + }else{ + current = arr2[j]; + result.add(current); + } + j++; + } + } + while(i < arr1.length){ + if(arr1[i].low <= current.high){ + current.high = Math.max(current.high,arr1[i].high); + }else{ + current = arr1[i]; + result.add(current); + } + i++; + } + while(j < arr2.length){ + if(arr2[j].low <= current.high){ + current.high = Math.max(current.high, arr2[j].high); + }else{ + current = arr2[j]; + result.add(current); + } + j++; + } + + return result; + } + + public static void main(String args[]){ + Pair p1 = new Pair(1,3); + Pair p2 = new Pair(4,6); + Pair p3 = new Pair(9,15); + Pair p4 = new Pair(14,18); + + Pair[] arr1 = {p1,p2,p3,p4}; + + Pair r1 = new Pair(2,4); + Pair r2 = new Pair(7,8); + Pair r3 = new Pair(11,13); + + Pair[] arr2 = {r1,r2,r3}; + + AddingTwoSetOfIntervals ats = new AddingTwoSetOfIntervals(); + List rs = ats.combineInterval(arr1, arr2); + System.out.print(rs); + } + +} diff --git a/showmecode_100/java/com/interview/misc/AngleBetweenHourAndMinuteHand.java b/showmecode_100/java/com/interview/misc/AngleBetweenHourAndMinuteHand.java new file mode 100644 index 00000000..54095d29 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/AngleBetweenHourAndMinuteHand.java @@ -0,0 +1,20 @@ +package com.interview.misc; + +/** + * Find small angle between hour and minute hand in analog clock + */ +public class AngleBetweenHourAndMinuteHand { + + public double angle(int hour, int min){ + double hourAngle = (hour%12)*360/12 + ((double)min/60)*(360/12); + double minAngle = min*360/60; + + double angleDiff = Math.abs(hourAngle - minAngle); + return angleDiff < 360 - angleDiff ? angleDiff : 360 - angleDiff; + } + + public static void main(String args[]){ + AngleBetweenHourAndMinuteHand abm = new AngleBetweenHourAndMinuteHand(); + System.out.println(abm.angle(10, 15)); + } +} diff --git a/showmecode_100/java/com/interview/misc/BulbSwitcher.java b/showmecode_100/java/com/interview/misc/BulbSwitcher.java new file mode 100644 index 00000000..21a3dd6f --- /dev/null +++ b/showmecode_100/java/com/interview/misc/BulbSwitcher.java @@ -0,0 +1,19 @@ +package com.interview.misc; + +/** + * There are n bulbs that are initially off. You first turn on all the bulbs. + * Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it's + * off or turning off if it's on). For the ith round, you toggle every i bulb. For the nth round, you only + * toggle the last bulb. Find how many bulbs are on after n rounds. + * + * https://leetcode.com/problems/bulb-switcher/ + */ +public class BulbSwitcher { + public int bulbSwitch(int n) { + int count = 0; + while (count*count <= n) { + count++; + } + return count - 1; + } +} diff --git a/showmecode_100/java/com/interview/misc/CandiesProblem.java b/showmecode_100/java/com/interview/misc/CandiesProblem.java new file mode 100644 index 00000000..dd4c30ff --- /dev/null +++ b/showmecode_100/java/com/interview/misc/CandiesProblem.java @@ -0,0 +1,84 @@ +package com.interview.misc; + +/** + * Date 2/7/16 + * @author Tushar Roy + * + * + * There are N children standing in a line. Each child is assigned a rating value. + * You are giving candies to these children subjected to the following requirements: + * Each child must have at least one candy. + * Children with a higher rating get more candies than their neighbors. + * What is the minimum candies you must give? + * + * + * Time complexity - O(n) + * Space complexity - O(1) + * + * Reference + * https://leetcode.com/problems/candy/ + * + * + */ +public class CandiesProblem { + + public int minCandies(int ratings[]) { + + int pointOfChange = 0; + int totalCandies = 1; + int currentCandy = 1; + boolean isIndependent = true; + int maxHeight = 0; + int diff = 0; + for (int i = 1; i < ratings.length; i++) { + diff = 0; + //if the rating of ith guy is greater than rating of i-1 guy + //then give ith guy one more candy than i-1 guy. + if (ratings[i] > ratings[i-1]) { + currentCandy += 1; + } + //if rating of ith guy is same as i-1 guy then give ith guy only 1 candy + //because in same rating ith guy can get less candy. + //But also mark that if need we can keep increasing candy given to ith + //guy without affecting i-1 guy's candy since it can also go more than + //i-1th guy candy as they have same rating. + else if (ratings[i] == ratings[i-1]) { + isIndependent = true; + pointOfChange = i; + currentCandy = 1; + } + //if rating of ith guy is less than i-1th guy then + //give ith guy one candy. If i-1th guy has only one candy + //then all the guys till point of change needs to be given one more candy + //which is what diff takes care off. + //if point of change guy is independent then we are cool otherwise + //point of change needs to point to one less number if we reach its height. + else { + if (currentCandy == 1) { + if (!isIndependent) { + if (i - pointOfChange == maxHeight - 1) { + pointOfChange--; + } + } + } + else { + maxHeight = currentCandy; + currentCandy = 1; + isIndependent = false; + pointOfChange = i; + } + diff = i - pointOfChange; + } + totalCandies += (diff + currentCandy); + } + return totalCandies; + } + + public static void main(String args[]) { + int input[] = {1,3,4,3,2,1}; + CandiesProblem cp = new CandiesProblem(); + System.out.println(cp.minCandies(input)); + } + +} + diff --git a/showmecode_100/java/com/interview/misc/ContainsNumberWithinKDistance.java b/showmecode_100/java/com/interview/misc/ContainsNumberWithinKDistance.java new file mode 100644 index 00000000..41197c89 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/ContainsNumberWithinKDistance.java @@ -0,0 +1,60 @@ +package com.interview.misc; + +import java.util.Map; +import java.util.TreeMap; + +/** + * Date 10/26/2016 + * @author Tushar Roy + * + * Given an array of integers, + * find out whether there are two distinct indices i and j in the array such that the difference + * between nums[i] and nums[j] is at most t and the difference between i and j is at most k. + * + * Solution + * Keep a tree map of num and its count. For every new number check if any number exists in map between + * num - t and num + t. If yes than return true. If no then add this number to the tree map. Also if tree map + * becomes of size k then drop the num[i - k] number from the tree map. + * + * Time complexity O(nlogk) + * + * https://leetcode.com/problems/contains-duplicate-iii/ + */ +public class ContainsNumberWithinKDistance { + + public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { + if (nums.length == 0 || k == 0) { + return false; + } + TreeMap map = new TreeMap<>(); + for (int i = 0; i < nums.length; i++) { + int lowerEntry = nums[i] - t - 1; + int higherEntry = nums[i] + t + 1; + Map.Entry higher = map.lowerEntry(higherEntry); + if (higher != null && higher.getKey() >= nums[i]) { + return true; + } + Map.Entry lower = map.higherEntry(lowerEntry); + if (lower != null && lower.getKey() <= nums[i]) { + return true; + } + if (map.size() == k) { + map.compute(nums[i - k], (key, val) -> { + if (val == 1) { + return null; + } else { + return val - 1; + } + }); + } + map.compute(nums[i], (key, val) -> { + if (val == null) { + return 1; + } else { + return val + 1; + } + }); + } + return false; + } +} diff --git a/showmecode_100/java/com/interview/misc/ConvertNumberIntoBase26.java b/showmecode_100/java/com/interview/misc/ConvertNumberIntoBase26.java new file mode 100644 index 00000000..3e60d390 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/ConvertNumberIntoBase26.java @@ -0,0 +1,45 @@ +package com.interview.misc; + +/** + * Given a positive integer, return its corresponding column title as appear in an Excel sheet. + * https://leetcode.com/problems/excel-sheet-column-title/ + */ +public class ConvertNumberIntoBase26 { + + public String numberToBase26(int n) { + StringBuffer buff = new StringBuffer(); + while (n > 0) { + n--; + buff.append((char)(n % 26 + 'A')); + n = n / 26; + } + return buff.reverse().toString(); + } + + public int base26ToNumber(String str) { + int result = 0; + int pow = 1; + for(int i = str.length() - 1; i>=0; i--) { + char s = str.charAt(i); + s = (char)(s - 'A'+1); + result += s*pow; + pow *= 26; + } + return result; + } + + public static void main(String args[]) { + ConvertNumberIntoBase26 cni = new ConvertNumberIntoBase26(); + System.out.println(cni.numberToBase26(704)); + System.out.println(cni.base26ToNumber("AAB")); + + System.out.println(cni.numberToBase26(52)); + System.out.println(cni.base26ToNumber("AZ")); + + System.out.println(cni.numberToBase26(13)); + System.out.println(cni.base26ToNumber("M")); + + System.out.println(cni.numberToBase26(126)); + System.out.println(cni.base26ToNumber("DV")); + } +} diff --git a/showmecode_100/java/com/interview/misc/CountRanges.java b/showmecode_100/java/com/interview/misc/CountRanges.java new file mode 100644 index 00000000..93629a4b --- /dev/null +++ b/showmecode_100/java/com/interview/misc/CountRanges.java @@ -0,0 +1,56 @@ +package com.interview.misc; + +import java.util.HashMap; +import java.util.Map; +import java.util.NavigableMap; +import java.util.TreeMap; + +/** + * Date 03/03/2016 + * @author Tushar Roy + * + * Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. + * + * Time complexity O(nlogn) + * Space complexity O(n) + * + * Performance can be improved by using self balancing BST which keeps the count of key and size of substree under it + * + * https://leetcode.com/problems/count-of-range-sum/ + */ +public class CountRanges { + + public int countRangeSum(int[] nums, int lower, int upper) { + TreeMap map = new TreeMap<>(); + Map countMap = new HashMap<>(); + long prefixSum[] = new long[nums.length + 1]; + map.put(0l, 1); + countMap.put(0l, 1); + int count = 0; + for (int i = 0; i < nums.length; i++) { + prefixSum[i+1] = prefixSum[i] + nums[i]; + NavigableMap rangeMap = map.subMap(prefixSum[i+1] - upper, true, prefixSum[i+1] - lower, true); + if (rangeMap.size() > 0) { + for (int c : rangeMap.values()) { + count += c; + } + } + if (countMap.containsKey(prefixSum[i+1])) { + countMap.put(prefixSum[i+1], countMap.get(prefixSum[i+1]) + 1); + } else { + countMap.put(prefixSum[i+1], 1); + } + + map.put(prefixSum[i+1], countMap.get(prefixSum[i+1])); + } + return count; + } + + public static void main(String args[]) { + CountRanges cr = new CountRanges(); + int[] input = {0, 0}; + System.out.print(cr.countRangeSum(input, 0, 0)); + } + +} + diff --git a/showmecode_100/java/com/interview/misc/DayDifferenceBetweenTwoDates.java b/showmecode_100/java/com/interview/misc/DayDifferenceBetweenTwoDates.java new file mode 100644 index 00000000..0b8147de --- /dev/null +++ b/showmecode_100/java/com/interview/misc/DayDifferenceBetweenTwoDates.java @@ -0,0 +1,52 @@ +package com.interview.misc; + +/** + * Number of days between two valid dates + * The idea is to get number of days from 00/00/0000 for both the dates and find the + * difference between them. + */ +public class DayDifferenceBetweenTwoDates { + + private static final int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; + + public int diff(int year1,int month1, int day1,int year2, int month2,int day2){ + int days1 = year1*365 + day1; + int days2 = year2*365 + day2; + + for(int i=0; i < month1-1; i++){ + days1 = days1 + days[i]; + } + + for(int i=0; i < month2-1; i++){ + days2 = days2 + days[i]; + } + + days1 = days1 + (year1-1)/4 - (year1 -1)/100 + (year1 -1 )/400; + days2 = days2 + (year2-1)/4 - (year2 -1)/100 + (year2 -1 )/400; + + if(isLeapYear(year1) && month1 > 2){ + days1++; + } + if(isLeapYear(year2) && month2 > 2){ + days2++; + } + + return days2 - days1; + } + + + public static void main(String args[]){ + DayDifferenceBetweenTwoDates dd = new DayDifferenceBetweenTwoDates(); + System.out.println(dd.diff(1945, 3, 7, 2009, 8, 31)); + } + + public boolean isLeapYear(int year){ + if(year % 400 == 0){ + return true; + } + if(year % 4 == 0 && year % 100 != 0){ + return true; + } + return false; + } +} diff --git a/showmecode_100/java/com/interview/misc/DifferenceBetweenTwoTime.java b/showmecode_100/java/com/interview/misc/DifferenceBetweenTwoTime.java new file mode 100644 index 00000000..864c3584 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/DifferenceBetweenTwoTime.java @@ -0,0 +1,39 @@ +package com.interview.misc; + +/** + * Given two times in four digits number e.g 10:10 is 1010 find difference between them + * Test cases + * Time 1 better be less than equal to time 2 + * First 2 digits better be between 0 and 23 + * Last 2 digits of number better be between 0 to 59 + */ +public class DifferenceBetweenTwoTime { + + public int diff(int time1, int time2){ + if(time2 < time1){ + throw new IllegalArgumentException(); + } + + int hourDiff = time2/100 - time1/100 -1; + int minDiff = time2%100 + (60 - time1%100); + if(minDiff >= 60){ + hourDiff++; + minDiff = minDiff - 60; + } + return hourDiff*100 + minDiff; + } + + public static void main(String args[]){ + DifferenceBetweenTwoTime dbtt = new DifferenceBetweenTwoTime(); + int time = dbtt.diff(1400, 1645); + System.out.println(time); + time = dbtt.diff(1223, 1246); + System.out.println(time); + time = dbtt.diff(1500, 1620); + System.out.println(time); + time = dbtt.diff(344, 936); + System.out.println(time); + time = dbtt.diff(1000, 1234); + System.out.println(time); + } +} diff --git a/showmecode_100/java/com/interview/misc/FindingCelebrity.java b/showmecode_100/java/com/interview/misc/FindingCelebrity.java new file mode 100644 index 00000000..bd1716ab --- /dev/null +++ b/showmecode_100/java/com/interview/misc/FindingCelebrity.java @@ -0,0 +1,32 @@ +package com.interview.misc; + +/** + * Find the Celebrity + * https://leetcode.com/problems/find-the-celebrity/ + */ +class Relation { + boolean knows(int a, int b) { + return false; + } +} + +public class FindingCelebrity extends Relation { + + public int findCelebrity(int n) { + int celebrity = 0; + for (int i = 1; i < n; i++) { + if (knows(celebrity, i)) { + celebrity = i; + } + } + for (int i = 0; i < n; i++) { + if (i == celebrity) { + continue; + } + if (knows(celebrity, i) || !knows(i, celebrity)) { + return -1; + } + } + return celebrity; + } +} diff --git a/showmecode_100/java/com/interview/misc/FloatPointConversion.java b/showmecode_100/java/com/interview/misc/FloatPointConversion.java new file mode 100644 index 00000000..9a98f5a7 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/FloatPointConversion.java @@ -0,0 +1,62 @@ +package com.interview.misc; + +import java.util.StringTokenizer; + +/** + * http://www.careercup.com/question?id=4901629824335872 + * e.g + * -99.01E-2 -> -.9901 + * 845.67E2 -> 84567.0 + */ +public class FloatPointConversion { + + public double convert(String input){ + boolean isNeg = false; + if(input.startsWith("-")){ + isNeg = true; + input = input.substring(1); + } + StringTokenizer strtk = new StringTokenizer(input,"E"); + String number = strtk.nextToken(); + String power = strtk.nextToken(); + double dNumber = toDouble(number); + double dPower = toDouble(power); + double pow = Math.pow(10, dPower); + double result = dNumber * pow; + return isNeg ? result * -1 : result; + } + + private double toDouble(String number){ + boolean isNeg = false; + if(number.startsWith("-")){ + isNeg = true; + number = number.substring(1); + } + int result = 0; + int pow = 1; + boolean foundDot = false; + for(char ch : number.toCharArray()){ + if(ch == '.'){ + foundDot = true; + continue; + } + if(foundDot){ + pow = pow*10; + } + result *= 10; + result += (ch - '0'); + } + + double doubleResult = (result*1.0)/pow; + + return isNeg ? doubleResult*-1 : doubleResult; + } + + public static void main(String args[]){ + FloatPointConversion fpc = new FloatPointConversion(); + System.out.println(fpc.convert("-99.01E-2")); + System.out.println(fpc.convert("845.67E2")); + System.out.println(fpc.convert("99.01E-1")); + } + +} diff --git a/showmecode_100/java/com/interview/misc/FourPointsFormSquare.java b/showmecode_100/java/com/interview/misc/FourPointsFormSquare.java new file mode 100644 index 00000000..714adc71 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/FourPointsFormSquare.java @@ -0,0 +1,72 @@ +package com.interview.misc; + +class Cordinate{ + int x; + int y; +} + +/** + * Given four points in any order determine if they form a square + * Test cases + * Less than or more than 4 points in input + * Points could be in any quadrants e.it neg and pos allowed + */ +public class FourPointsFormSquare { + + public boolean isSquare(Cordinate[] cordinates){ + Cordinate startPoint = cordinates[0]; + int a1 = distanceSquare(startPoint, cordinates[1]); + int a2 = distanceSquare(startPoint, cordinates[2]); + int a3 = distanceSquare(startPoint, cordinates[3]); + + + if(a1 == a2){ //then 0,3 is diagonal + return compare(cordinates[3],cordinates[1],cordinates[2],a1,a3); + }else if(a1 == a3){ + return compare(cordinates[2],cordinates[1],cordinates[3],a1,a2); + }else if(a2 == a3){ + return compare(cordinates[1],cordinates[2],cordinates[3],a2,a1); + }else{ + return false; + } + } + + private boolean compare(Cordinate startPoint, Cordinate point1, Cordinate point2,int len, int diag){ + if(2*len != diag){ + return false; + } + int a1 = distanceSquare(startPoint,point1); + int a2 = distanceSquare(startPoint,point2); + if(a1 != len || a2 != len){ + return false; + } + return true; + } + + private int distanceSquare(Cordinate c1, Cordinate c2){ + return (int)(Math.pow(Math.abs(c1.x - c2.x) ,2) + + Math.pow(Math.abs(c1.y-c2.y), 2)); + } + + public static void main(String args[]){ + FourPointsFormSquare fpf = new FourPointsFormSquare(); + Cordinate c1 = new Cordinate(); + c1.x = 2; + c1.y = 2; + Cordinate c2 = new Cordinate(); + c2.x = 6; + c2.y = 2; + Cordinate c3 = new Cordinate(); + c3.x = 2; + c3.y = -2; + Cordinate c4 = new Cordinate(); + c4.x = 6; + c4.y = -2; + Cordinate[] c = new Cordinate[4]; + c[0] = c1; + c[1] = c2; + c[2] = c3; + c[3] = c4; + System.out.println(fpf.isSquare(c)); + } +} diff --git a/showmecode_100/java/com/interview/misc/GetKthPermutation.java b/showmecode_100/java/com/interview/misc/GetKthPermutation.java new file mode 100644 index 00000000..44253bc7 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/GetKthPermutation.java @@ -0,0 +1,54 @@ +package com.interview.misc; + +import java.util.ArrayList; +import java.util.List; + +/** + * https://leetcode.com/problems/permutation-sequence/ + */ +public class GetKthPermutation { + + public String getPermutation(int n, int k) { + List unused = new ArrayList<>(); + for (int i = 1; i <= n; i++) { + unused.add(i); + } + StringBuffer result = new StringBuffer(); + int fac = factorial(n); + int d = n; + while (n > 1) { + fac = fac/d; + d--; + int index = (int)Math.ceil((double)k/fac); + result.append(unused.get(index - 1)); + unused.remove(index - 1); + n--; + k = k - fac*(index - 1); + } + if (n == 0) { + for (int i = unused.size() - 1; i >= 0; i--) { + result.append(unused.get(i)); + } + } + + if (n == 1) { + for (int i = 0; i < unused.size(); i++) { + result.append(unused.get(i)); + } + } + return result.toString(); + } + + private int factorial(int n) { + int result = 1; + for (int i = 1; i <= n; i++) { + result *= i; + } + return result; + } + + public static void main(String args[]) { + GetKthPermutation gp = new GetKthPermutation(); + System.out.println(gp.getPermutation(6, 343)); + } +} diff --git a/showmecode_100/java/com/interview/misc/HammingDistanceBetweenPair.java b/showmecode_100/java/com/interview/misc/HammingDistanceBetweenPair.java new file mode 100644 index 00000000..48a88ad7 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/HammingDistanceBetweenPair.java @@ -0,0 +1,34 @@ +package com.interview.misc; + +/** + * http://www.glassdoor.com/Interview/-a-first-write-a-function-to-calculate-the-hamming-distance-between-two-binary-numbers-b-write-a-function-that-takes-QTN_450885.htm + * Test cases + * Not equal length strings + * String containing anything other than 0 and 1 + */ +public class HammingDistanceBetweenPair { + + public int hammingDistance(String input[]){ + int size = input[0].length(); + int total = 0; + for(int i=0; i < size; i++){ + int count0s = 0; + int count1s = 0; + for(String str : input){ + if(str.charAt(i) == '0'){ + count0s++; + }else{ + count1s++; + } + } + total += count0s * count1s; + } + return total; + } + + public static void main(String args[]){ + String input[] = {"10011","00011","11101","01010"}; + HammingDistanceBetweenPair hdb = new HammingDistanceBetweenPair(); + System.out.println(hdb.hammingDistance(input)); + } +} diff --git a/showmecode_100/java/com/interview/misc/InsertInterval.java b/showmecode_100/java/com/interview/misc/InsertInterval.java new file mode 100644 index 00000000..1edda7d9 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/InsertInterval.java @@ -0,0 +1,75 @@ +package com.interview.misc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * Date 03/21/2016 + * @author Tushar Roy + * + * Insert internal into sorted intervals and merge them. + * + * Time complexity O(n) + * + * https://leetcode.com/problems/insert-interval/ + */ +public class InsertInterval { + + public static class Interval { + int start; + int end; + + @Override + public String toString() { + return "Interval{" + + "start=" + start + + ", end=" + end + + '}'; + } + + Interval(int s, int e) { start = s; end = e; } + } + + public List insert(List intervals, Interval newInterval) { + List result = new ArrayList<>(); + boolean alreadyAdded = false; + for (int i = 0; i < intervals.size(); i++) { + if ((intervals.get(i).end < newInterval.start)) { + result.add(intervals.get(i)); + } else if (intervals.get(i).start > newInterval.end) { + if (!alreadyAdded) { + result.add(newInterval); + alreadyAdded = true; + } + result.add(intervals.get(i)); + } else { + newInterval.start = Math.min(newInterval.start, intervals.get(i).start); + newInterval.end = Math.max(newInterval.end, intervals.get(i).end); + if (!alreadyAdded) { + result.add(newInterval); + alreadyAdded = true; + } + } + } + if (!alreadyAdded) { + result.add(newInterval); + } + return result; + } + + public static void main(String args[]) { + Interval i1 = new Interval(1,3); + Interval i2 = new Interval(6,7); + Interval i3 = new Interval(9,10); + Interval i4 = new Interval(11,12); + List input = new ArrayList<>(); + input.add(i1); + input.add(i2); + input.add(i3); + input.add(i4); + InsertInterval ii = new InsertInterval(); + System.out.println(ii.insert(input, new Interval(13, 15))); + } +} diff --git a/showmecode_100/java/com/interview/misc/IntegerListParser.java b/showmecode_100/java/com/interview/misc/IntegerListParser.java new file mode 100644 index 00000000..afb98cef --- /dev/null +++ b/showmecode_100/java/com/interview/misc/IntegerListParser.java @@ -0,0 +1,145 @@ +package com.interview.misc; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * Date 10/10/2016 + * @author Tushar Roy + * + * Given a nested list of integers represented as a string, implement a parser to deserialize it. + * Each element is either an integer, or a list -- whose elements may also be integers or other lists. + * + * https://leetcode.com/problems/mini-parser/ + */ +public class IntegerListParser { + + public NestedInteger deserialize(String s) { + Stack stack = new Stack(); + + NestedInteger current = null; + StringBuffer subInteger = new StringBuffer(); + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '[') { + if (current != null) { + stack.push(current); + } + current = new NestedInteger(); + subInteger = new StringBuffer(); + } else if (s.charAt(i) == ']') { + if (subInteger.length() > 0) { + current.add(new NestedInteger(Integer.parseInt(subInteger.toString()))); + subInteger = new StringBuffer(); + } + if (!stack.isEmpty()) { + NestedInteger top = stack.pop(); + top.add(current); + current = top; + } + } else if (s.charAt(i) == ',') { + if (subInteger.length() > 0) { + current.add(new NestedInteger(Integer.parseInt(subInteger.toString()))); + } + subInteger = new StringBuffer(); + } else { + subInteger.append(s.charAt(i)); + } + } + if (subInteger.length() > 0) { + return new NestedInteger(Integer.parseInt(subInteger.toString())); + } + return current; + } + + public String serialize(NestedInteger nestedInteger) { + StringBuffer result = new StringBuffer(); + serialize(nestedInteger, result); + return result.toString(); + } + + private void serialize(NestedInteger nestedInteger, StringBuffer result) { + if (nestedInteger.isInteger()) { + result.append(nestedInteger.getInteger()); + return; + } + boolean isFirst = true; + result.append("["); + for (NestedInteger ni : nestedInteger.getList()) { + if (!isFirst) { + result.append(","); + } + isFirst = false; + if (ni.isInteger()) { + result.append(ni.getInteger()); + } else { + serialize(ni, result); + } + } + result.append("]"); + } + + public static void main(String args[]) { + IntegerListParser integerListParser = new IntegerListParser(); + NestedInteger nestedInteger = integerListParser.deserialize("123"); + String result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123,41]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123,41,[1]]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123,41,[[[]]]]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123,41,[[[],[]]]],[],[]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123,41,[[[121,41,[1]],[2]]]],[2],[4]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + nestedInteger = integerListParser.deserialize("[123,41,[[1,2,[],[]]]],[],[],[[1],[3]]"); + result = integerListParser.serialize(nestedInteger); + System.out.println(result); + } + + class NestedInteger { + private List nestedInteger = new ArrayList<>(); + private Integer val; + public NestedInteger() { + + } + + public NestedInteger(int value) { + this.val = value; + } + + public boolean isInteger() { + return val != null; + } + + public Integer getInteger() { + return val; + } + + public void setInteger(int value) { + this.val = value; + } + + public void add(NestedInteger ni) { + this.nestedInteger.add(ni); + } + + public List getList() { + return val != null ? null : nestedInteger; + } + } + +} diff --git a/showmecode_100/java/com/interview/misc/KthLargestInRowiseColumnWiseSorted2DArray.java b/showmecode_100/java/com/interview/misc/KthLargestInRowiseColumnWiseSorted2DArray.java new file mode 100644 index 00000000..1f90c2ac --- /dev/null +++ b/showmecode_100/java/com/interview/misc/KthLargestInRowiseColumnWiseSorted2DArray.java @@ -0,0 +1,50 @@ +package com.interview.misc; + +import com.interview.graph.BinaryMinHeap; + +/** + * Kth largest in rowwise and column wise sorted array + * http://www.geeksforgeeks.org/kth-smallest-element-in-a-row-wise-and-column-wise-sorted-2d-array-set-1/ + */ +public class KthLargestInRowiseColumnWiseSorted2DArray { + + public int kthLargest(int input[][],int k){ + + BinaryMinHeap minHeap = new BinaryMinHeap(); + int c = input[0].length; + int total = input.length * c; + minHeap.add(input[0][0], 0); + for(int i=1; i < k; i++){ + int minIndex = minHeap.extractMin(); + int minRow = minIndex/c; + int minCol = minIndex%c; + + int downNeighbor = (minRow+1)*c + minCol; + int rightNeighbor; + if(minCol== (c-1)){ + rightNeighbor = total; + }else{ + rightNeighbor = minRow*c + (minCol + 1); + } + if(downNeighbor < total && !minHeap.containsData(downNeighbor)){ + minHeap.add(input[minRow+1][minCol], downNeighbor); + } + + if(rightNeighbor < total && !minHeap.containsData(rightNeighbor)){ + minHeap.add(input[minRow][minCol+1], rightNeighbor); + } + } + + int minIndex = minHeap.extractMin(); + return input[minIndex/c][minIndex%c]; + } + + public static void main(String args[]){ + int input[][] ={{1,5,11,21}, + {6,8,12,22}, + {7,9,15,26}, + {11,13,18,28}}; + KthLargestInRowiseColumnWiseSorted2DArray kl = new KthLargestInRowiseColumnWiseSorted2DArray(); + System.out.println(kl.kthLargest(input, 10)); + } +} diff --git a/showmecode_100/java/com/interview/misc/LoadBalancers.java b/showmecode_100/java/com/interview/misc/LoadBalancers.java new file mode 100644 index 00000000..f0652844 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/LoadBalancers.java @@ -0,0 +1,53 @@ +package com.interview.misc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LoadBalancers { + + private List servers = new ArrayList(); + Map index = new HashMap(); + + public void addServer(String name){ + servers.add(name); + index.put(name, servers.size()-1); + } + + public void removeServer(String name){ + Integer pos = index.get(name); + if(pos == null){ + throw new IllegalArgumentException(); + } + servers.set(pos, servers.get(servers.size()-1)); + servers.remove(servers.size()-1); + } + + public String getRandom(){ + int r = (int)(Math.random()*1000); + return servers.get(r%servers.size()); + } + + public static void main(String args[]){ + LoadBalancers lb = new LoadBalancers(); + lb.addServer("1"); + lb.addServer("2"); + lb.addServer("3"); + lb.addServer("4"); + lb.addServer("5"); + + System.out.print(lb.getRandom()); + System.out.print(lb.getRandom()); + System.out.print(lb.getRandom()); + System.out.print(lb.getRandom()); + + lb.removeServer("3"); + lb.removeServer("1"); + System.out.print(lb.getRandom()); + System.out.print(lb.getRandom()); + System.out.print(lb.getRandom()); + System.out.print(lb.getRandom()); + + } +} diff --git a/showmecode_100/java/com/interview/misc/NestedIterator.java b/showmecode_100/java/com/interview/misc/NestedIterator.java new file mode 100644 index 00000000..9a157290 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/NestedIterator.java @@ -0,0 +1,68 @@ +package com.interview.misc; + +import java.util.Deque; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Stack; + +/** + * Date 04/17/2017 + * @author Tushar Roy + * + * Given a nested list of integers, implement an iterator to flatten it. + * Each element is either an integer, or a list -- whose elements may also be integers or other lists. + * Example 1: + * Given the list [[1,1],2,[1,1]], + * By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,1,2,1,1]. + * + * https://leetcode.com/problems/flatten-nested-list-iterator/ + */ +public class NestedIterator implements Iterator { + Stack> stack = new Stack<>(); + Integer nextVal = null; + public NestedIterator(List nestedList) { + stack.push(nestedList.iterator()); + } + + @Override + public Integer next() { + if (!hasNext()) { + throw new IllegalArgumentException(); + } + Integer val = nextVal; + nextVal = null; + return val; + } + + @Override + public boolean hasNext() { + if (nextVal != null) { + return true; + } + while (!stack.isEmpty()) { + boolean pushedIntoStack = false; + Iterator itr = stack.peek(); + if (itr.hasNext()) { + NestedInteger ni = itr.next(); + if (ni.isInteger()) { + nextVal = ni.getInteger(); + return true; + } else { + pushedIntoStack = true; + stack.push(ni.getList().iterator()); + } + } + if (!pushedIntoStack) { + stack.pop(); + } + } + return false; + } +} + +interface NestedInteger { + boolean isInteger(); + Integer getInteger(); + List getList(); +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/misc/NumberToWord.java b/showmecode_100/java/com/interview/misc/NumberToWord.java new file mode 100644 index 00000000..5671264a --- /dev/null +++ b/showmecode_100/java/com/interview/misc/NumberToWord.java @@ -0,0 +1,168 @@ +package com.interview.misc; + +/** + * Convert a number into words + * + * Reference + * https://leetcode.com/problems/integer-to-english-words/ + */ +public class NumberToWord { + + private static int BILLION = 1000000000; + private static int MILLION = 1000000; + private static int THOUSAND = 1000; + + public String numberToWords(int number){ + StringBuffer buffer = new StringBuffer(); + if(number ==0){ + return toString(number).trim(); + } + if(number < 0){ + buffer.append("Minus"); + number = number *-1; + } + if (number >= BILLION) { + int first = number / BILLION; + number = number % BILLION; + buffer.append(hundredsPart(first)).append(toString(BILLION)); + } + if(number >= MILLION){ + int first = number /MILLION; + number = number % MILLION; + buffer.append(hundredsPart(first)).append(toString(MILLION)); + } + if(number >= THOUSAND){ + int first = number /THOUSAND; + number = number % THOUSAND; + buffer.append(hundredsPart(first)).append(toString(THOUSAND)); + } + buffer.append(hundredsPart(number)); + return buffer.toString().trim(); + } + + private String hundredsPart(int number){ + StringBuffer buffer = new StringBuffer(); + if(number != 0){ + if(number <= 99){ + buffer.append(tenthPart(number)); + }else{ + int first = (number /100); + int second = number % 100; + buffer.append(toString(first) + toString(100)); + if (second != 0){ + buffer.append(tenthPart(second)); + } + } + return buffer.toString(); + }else{ + return ""; + } + } + + private String tenthPart(int number){ + StringBuffer buffer = new StringBuffer(); + if(number != 0){ + if(number <= 19){ + buffer.append(toString(number)); + }else{ + int first = (number/10)*10; + int second = number%10; + buffer.append(toString(first)); + if (second != 0){ + buffer.append(toString(second)); + } + } + return buffer.toString(); + }else{ + return ""; + } + } + + private String toString(int number){ + + switch(number){ + case 0: + return " Zero"; + case 1: + return " One"; + case 2: + return " Two"; + case 3: + return " Three"; + case 4: + return " Four"; + case 5: + return " Five"; + case 6: + return " Six"; + case 7: + return " Seven"; + case 8: + return " Eight"; + case 9: + return " Nine"; + case 10: + return " Ten"; + case 11: + return " Eleven"; + case 12: + return " Twelve"; + case 13: + return " Thrirteen"; + case 14: + return " Fourteen"; + case 15: + return " Fifteen"; + case 16: + return " Sixteen"; + case 17: + return " Seventeen"; + case 18: + return " Eighteen"; + case 19: + return " Nineteen"; + case 20: + return " Twenty"; + case 30: + return " Thirty"; + case 40: + return " Forty"; + case 50: + return " Fifty"; + case 60: + return " Sixty"; + case 70: + return " Seventy"; + case 80: + return " Eighty"; + case 90: + return " Ninety"; + case 100: + return " Hundred"; + case 1000: + return " Thousand"; + case 1000000: + return " Million"; + case 1000000000: + return " Billion"; + default: + throw new IllegalArgumentException(); + } + } + + public static void main(String args[]){ + NumberToWord ntw = new NumberToWord(); + System.out.println(ntw.numberToWords(8000)); + System.out.println(ntw.numberToWords(8192)); + System.out.println(ntw.numberToWords(8112)); + System.out.println(ntw.numberToWords(504)); + System.out.println(ntw.numberToWords(565100)); + System.out.println(ntw.numberToWords(6721157)); + System.out.println(ntw.numberToWords(-106721157)); + System.out.println(ntw.numberToWords(106070571)); + System.out.println(ntw.numberToWords(-92)); + System.out.println(ntw.numberToWords(0)); + System.out.println(ntw.numberToWords(1212121451)); + + } +} diff --git a/showmecode_100/java/com/interview/misc/PrimeNumbersBeforeN.java b/showmecode_100/java/com/interview/misc/PrimeNumbersBeforeN.java new file mode 100644 index 00000000..4a570e2c --- /dev/null +++ b/showmecode_100/java/com/interview/misc/PrimeNumbersBeforeN.java @@ -0,0 +1,38 @@ +package com.interview.misc; + +import java.util.ArrayList; +import java.util.List; + +/** + * All prime numbers before n + */ +public class PrimeNumbersBeforeN { + + public List primeNumbers(int n){ + List result = new ArrayList(); + result.add(2); + boolean flag = false; + for(int i=3; i < n; i+=2){ + for(int r : result){ + if(2*r > i){ + break; + } + if(i % r == 0){ + flag = true; + break; + } + } + if(!flag){ + result.add(i); + } + flag = false; + } + return result; + } + + public static void main(String args[]){ + PrimeNumbersBeforeN pnb = new PrimeNumbersBeforeN(); + List result = pnb.primeNumbers(150); + result.forEach(i -> System.out.print(i + " ")); + } +} diff --git a/showmecode_100/java/com/interview/misc/Read4Function.java b/showmecode_100/java/com/interview/misc/Read4Function.java new file mode 100644 index 00000000..b5d60ef1 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/Read4Function.java @@ -0,0 +1,102 @@ +package com.interview.misc; + +import java.util.Arrays; + +/** + * Date 03/26/2016 + * @author Tushar Roy + * + * Given a reader which only reads 4 bytes implement a Reader which can read bytes of give size. + * + * Reference + * Read N Characters Given Read4 II + * https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/ + */ + +class Read4 { + int read4(char[] buff) { + buff[0] = 'a'; + buff[1] = 'b'; + buff[2] = 'c'; + buff[3] = 'd'; + return 4; + } +} + +public class Read4Function extends Read4{ + + class Queue { + int start; + int end; + int count; + char[] data; + int size; + Queue(int size) { + data = new char[size]; + this.size = size; + } + + boolean isEmpty() { + return count == 0; + } + + void offer(char b) { + data[start] = b; + start = (start + 1)%size; + count++; + } + + char poll() { + char d = data[end]; + end = (end + 1)%size; + count--; + return d; + } + } + + private final Queue queue; + public Read4Function() { + queue = new Queue(4); + } + + public int read(char[] buf, int n) { + int r = 0; + while (!queue.isEmpty() && r < n) { + buf[r++] = queue.poll(); + } + + if (r == n) { + return r; + } + int index = 0; + int readSize = 0; + char[] input = null; + do { + input = new char[4]; + readSize = read4(input); + index = 0; + while(r < n && index < readSize) { + buf[r++] = input[index++]; + } + } while (readSize == 4 && r < n); + + while (index < readSize) { + queue.offer(input[index++]); + } + return r; + } + + public static void main(String args[]) { + Read4Function rf = new Read4Function(); + char[] buff = new char[10]; + int size = rf.read(buff, 2); + System.out.print(size); + System.out.println(Arrays.toString(buff)); + size = rf.read(buff, 1); + System.out.print(size); + System.out.println(Arrays.toString(buff)); + size = rf.read(buff, 1); + System.out.print(size); + System.out.println(Arrays.toString(buff)); + } +} diff --git a/showmecode_100/java/com/interview/misc/RomanNumberToDecimal.java b/showmecode_100/java/com/interview/misc/RomanNumberToDecimal.java new file mode 100644 index 00000000..b116478f --- /dev/null +++ b/showmecode_100/java/com/interview/misc/RomanNumberToDecimal.java @@ -0,0 +1,133 @@ +package com.interview.misc; + +/** + * Convert a roman number to decimal number + * Test cases: smaller number appearing before bigger number unless it is representing one less. + * VL is incorrect since XL should be used to represent 90 + * chars not used in roman representation is used + * http://www.onlineconversion.com/roman_numerals_advanced.htm + * + */ +public class RomanNumberToDecimal { + + public String converToRoman(int decimal){ + StringBuffer buffer = new StringBuffer(); + while(decimal > 0){ + decimal = literal(decimal,buffer); + } + return buffer.toString(); + } + + public int convertToDecimal(char[] roman){ + int decimal = 0; + for(int i=0; i < roman.length; ){ + if(i < roman.length-1 && literal(roman[i]) < literal(roman[i+1])){ + decimal += literal(roman[i+1]) - literal(roman[i]); + i += 2; + }else{ + decimal += literal(roman[i]); + i++; + } + } + return decimal; + } + + private int literal(int decimal,StringBuffer buffer){ + if(decimal >= 1000){ + buffer.append("M"); + decimal -= 1000; + return decimal; + } + else if(decimal >= 900){ + buffer.append("CM"); + decimal -= 900; + return decimal; + } + else if(decimal >= 500){ + buffer.append("D"); + decimal -= 500; + return decimal; + } + else if(decimal >= 400){ + buffer.append("CD"); + decimal -= 400; + return decimal; + } + else if(decimal >= 100){ + buffer.append("C"); + decimal -= 100; + return decimal; + } + else if(decimal >= 90){ + buffer.append("XC"); + decimal -= 90; + return decimal; + } + else if(decimal >= 50){ + buffer.append("L"); + decimal -= 50; + return decimal; + } + else if(decimal >= 40){ + buffer.append("XL"); + decimal -= 40; + return decimal; + } + else if(decimal >= 10){ + buffer.append("X"); + decimal -= 10; + return decimal; + }else if(decimal >= 9){ + buffer.append("IX"); + decimal -= 9; + return decimal; + } + else if(decimal >=5){ + buffer.append("V"); + decimal -= 5; + return decimal; + }else if(decimal >= 4){ + buffer.append("IV"); + decimal -= 4; + return decimal; + }else { + buffer.append("I"); + decimal -= 1; + return decimal; + } + } + + private int literal(char ch){ + switch(ch){ + case 'I' : + return 1; + case 'V' : + return 5; + case 'X' : + return 10; + case 'L' : + return 50; + case 'C' : + return 100; + case 'D' : + return 500; + case 'M' : + return 1000; + default : + throw new IllegalArgumentException(); + } + } + + public static void main(String args[]){ + RomanNumberToDecimal rnd = new RomanNumberToDecimal(); + System.out.println(rnd.convertToDecimal("XX".toCharArray())); + System.out.println(rnd.convertToDecimal("XCIX".toCharArray())); + System.out.println(rnd.convertToDecimal("MLXIX".toCharArray())); + System.out.println(rnd.convertToDecimal("MMDXLIII".toCharArray())); + + System.out.println(rnd.converToRoman(20)); + System.out.println(rnd.converToRoman(99)); + System.out.println(rnd.converToRoman(1069)); + System.out.println(rnd.converToRoman(2543)); + } +} diff --git a/showmecode_100/java/com/interview/misc/SparseTableRangeMinimumQuery.java b/showmecode_100/java/com/interview/misc/SparseTableRangeMinimumQuery.java new file mode 100644 index 00000000..56ea3165 --- /dev/null +++ b/showmecode_100/java/com/interview/misc/SparseTableRangeMinimumQuery.java @@ -0,0 +1,71 @@ +package com.interview.misc; + +/** + * Date 04/28/2016 + * @author Tushar Roy + * + * Find range minimum query using sparse table. + * + * Preprocessing Time complexity O(nlogn) + * Query Time complexity O(1) + * Space complexity O(nlogn) + * + * Reference - + * https://www.topcoder.com/community/data-science/data-science-tutorials/range-minimum-query-and-lowest-common-ancestor/ + */ +public class SparseTableRangeMinimumQuery { + + private final int[][] sparse; + private final int n; + private final int[] input; + + public SparseTableRangeMinimumQuery(int[] input) { + this.input = input; + this.n = input.length; + this.sparse = preprocess(input, this.n); + } + + private int[][] preprocess(int[] input, int n) { + int[][] sparse = new int[n][log2(n) + 1]; + for (int i = 0; i < input.length; i++) { + sparse[i][0] = i; + } + + for (int j = 1; 1 << j <= n; j++) { + for (int i = 0; i + (1 << j) - 1 < n; i++) { + if (input[sparse[i][j - 1]] < input[sparse[i + (1 << (j - 1))][j - 1]]) { + sparse[i][j] = sparse[i][j - 1]; + } else { + sparse[i][j] = sparse[i + (1 << (j - 1))][j - 1]; + } + } + } + return sparse; + } + + public int rangeMinimumQuery(int low, int high) { + int l = high - low + 1; + int k = log2(l); + if (input[sparse[low][k]] <= input[sparse[low + l - (1<= board.length) { + break; + } + if (j < 0 || j >= board[0].length) { + continue; + } + count += board[i][j]; + } + } + if (board[x][y] == 1) { + return count == 2 || count == 3; + } else { + return count == 3; + } + } +} diff --git a/showmecode_100/java/com/interview/multiarray/LongestConsecutiveIntegerInUnsorted2DArray.java b/showmecode_100/java/com/interview/multiarray/LongestConsecutiveIntegerInUnsorted2DArray.java new file mode 100644 index 00000000..f204962c --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/LongestConsecutiveIntegerInUnsorted2DArray.java @@ -0,0 +1,51 @@ +package com.interview.multiarray; + +/** + * Find the length of the longest chain of consecutive integers in an unsorted 2D square array (non-diagonal) + */ +public class LongestConsecutiveIntegerInUnsorted2DArray { + + public int longestConsecutiveInteger(int input[][]){ + + boolean visited[][] = new boolean[input.length][input[0].length]; + int max = 1; + for(int i=0; i < input.length; i++){ + for(int j=0; j < input[i].length; j++){ + int r = DFS(input,i,j,visited,-10000); + if(r > max){ + max = r; + } + } + } + return max; + } + + private int DFS(int input[][],int i,int j,boolean visited[][],int lastNum){ + if(i >= input.length || i < 0 || j < 0 || j >= input[0].length){ + return 0; + } + if(visited[i][j]){ + return 0; + } + if(lastNum != -10000 && input[i][j] + 1 != lastNum){ + return 0; + } + visited[i][j] = true; + + int r1 = DFS(input,i+1,j,visited,input[i][j]); + int r2 = DFS(input,i-1,j,visited,input[i][j]); + int r3 = DFS(input,i,j+1,visited,input[i][j]); + int r4 = DFS(input,i,j-1,visited,input[i][j]); + visited[i][j] = false; + return Math.max(Math.max(r1, r2), Math.max(r3,r4)) + 1; + } + + public static void main(String args[]){ + LongestConsecutiveIntegerInUnsorted2DArray lci = new LongestConsecutiveIntegerInUnsorted2DArray(); + int input[][] = {{3,2,5}, + {4,1,4}, + {5,6,5}}; + System.out.println(lci.longestConsecutiveInteger(input)); + } + +} diff --git a/showmecode_100/java/com/interview/multiarray/MatrixCalculation.java b/showmecode_100/java/com/interview/multiarray/MatrixCalculation.java new file mode 100644 index 00000000..1589b920 --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/MatrixCalculation.java @@ -0,0 +1,52 @@ +package com.interview.multiarray; + +public class MatrixCalculation { + + private int r = 0; + + public String[][] crossMultiply(String[][] str){ + + int cols = 1; + for(int i=1; i < str.length; i++){ + cols = cols*str[i].length; + } + String[][] result = new String[str[0].length][cols]; + for(int i=0; i < str[0].length ; i++){ + StringBuffer buffer = new StringBuffer(); + r=0; + buffer.append(str[0][i]); + recur(buffer,result,str,1,i); + } + + return result; + + } + + private void recur(StringBuffer buffer,String[][] result,String[][] str,int currentRow,int mainCol){ + + if(currentRow == str.length){ + result[mainCol][r++] = buffer.toString(); + return; + } + + for(int i=0; i < str[currentRow].length; i++){ + StringBuffer tempBuffer = new StringBuffer(buffer); + buffer.append(str[currentRow][i]); + recur(buffer,result,str,currentRow+1,mainCol); + buffer = tempBuffer; + } + } + + public static void main(String args[]){ + MatrixCalculation mc = new MatrixCalculation(); + String[][] str = {{"abc","def","gh"},{"l","m"},{"p","q","r"},{"x","y"}}; + String[][] result = mc.crossMultiply(str); + for(int i=0; i < result.length; i++){ + for(int j=0; j < result[i].length; j++){ + System.out.print(result[i][j] + " "); + } + System.out.println(); + } + + } +} diff --git a/showmecode_100/java/com/interview/multiarray/MatrixFindAllSubSquareRectangleMatrix.java b/showmecode_100/java/com/interview/multiarray/MatrixFindAllSubSquareRectangleMatrix.java new file mode 100644 index 00000000..502f372e --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/MatrixFindAllSubSquareRectangleMatrix.java @@ -0,0 +1,50 @@ +package com.interview.multiarray; + +/** + * Iterate through matrix and get all subsquare and subrectangle matrix and print their sum + */ +public class MatrixFindAllSubSquareRectangleMatrix { + + public void printSumOfAllSquareMatrix(int input[][]){ + + for(int len = 1; len <= input.length; len++){ + for(int i=0; i < input.length - len + 1; i++){ + for(int j=0; j < input[i].length - len + 1; j++){ + int sum = 0; + for(int k=i;k < i+len; k++){ + for(int m = j; m < j+len; m++){ + sum += input[k][m]; + } + } + System.out.println("Start " + i + " " + j + " End " + len + " sum " + sum); + } + } + } + } + + public void printSumOfAllRectangleMatrix(int input[][]){ + for(int rlen = 1 ; rlen <= input.length; rlen++){ + for(int clen = 1; clen <= input[0].length; clen++){ + for(int i=0; i < input.length - rlen + 1; i++){ + for(int j=0; j < input[i].length - clen + 1; j++){ + int sum = 0; + for(int k=i;k < i+rlen; k++){ + for(int m = j; m < j+clen; m++){ + sum += input[k][m]; + } + } + System.out.println("Start " + i + " " + j + " End " + (i + rlen-1) + " " + (j + clen-1) + " sum " + sum); + } + } + } + } + } + public static void main(String args[]){ + int input[][] = {{1,2,3}, + {4,5,6}, + {7,8,9}}; + + MatrixFindAllSubSquareRectangleMatrix mal = new MatrixFindAllSubSquareRectangleMatrix(); + mal.printSumOfAllRectangleMatrix(input); + } +} diff --git a/showmecode_100/java/com/interview/multiarray/MatrixInDiagonalOrder.java b/showmecode_100/java/com/interview/multiarray/MatrixInDiagonalOrder.java new file mode 100644 index 00000000..aaa96549 --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/MatrixInDiagonalOrder.java @@ -0,0 +1,38 @@ +package com.interview.multiarray; + +/** + * http://www.geeksforgeeks.org/print-matrix-diagonally/ + */ +public class MatrixInDiagonalOrder { + + public void printMatrix(int [][]matrix){ + for(int i=0; i < matrix.length; i++){ + int start =i; + int end =0; + while(start >= 0 && end < matrix[0].length){ + System.out.print(matrix[start][end] + " "); + start--; + end++; + } + System.out.print("\n"); + } + + for(int i=1; i < matrix[0].length; i++){ + int start = matrix.length-1; + int end =i; + while(start >= 0 && end < matrix[0].length){ + System.out.print(matrix[start][end] + " "); + start--; + end++; + } + System.out.print("\n"); + } + } + + public static void main(String args[]){ + int arr[][] = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}}; + MatrixInDiagonalOrder mdo = new MatrixInDiagonalOrder(); + mdo.printMatrix(arr); + } + +} diff --git a/showmecode_100/java/com/interview/multiarray/MatrixOf0sAnd1s.java b/showmecode_100/java/com/interview/multiarray/MatrixOf0sAnd1s.java new file mode 100644 index 00000000..5a063174 --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/MatrixOf0sAnd1s.java @@ -0,0 +1,57 @@ +package com.interview.multiarray; + +/** + * http://www.geeksforgeeks.org/create-a-matrix-with-alternating-rectangles-of-0-and-x/ + * Test case : negative or 0 for n or m + */ +public class MatrixOf0sAnd1s { + + public char[][] create(int n,int m){ + char[][] matrix = new char[n][m]; + + int r = 0; + char ch = 'X'; + int high = Math.min(n, m); + //high is min of n and m. If high is odd then high is ceiling of high/2 + //else high is high/2. e.g high is 5 then high becomes 3 if high is 4 + //high becomes 2 + high = (int)Math.ceil(high*1.0/2); + while(r < high){ + + for(int i=r; i < m-r ; i++){ + matrix[r][i] = ch; + } + + for(int i = r; i < n-r; i++ ){ + matrix[i][m-r-1] = ch; + } + + for(int i = m-r-1; i >= r; i-- ){ + matrix[n-r-1][i] = ch; + } + + for(int i = n-r-1; i >= r; i-- ){ + matrix[i][r] = ch; + } + + if(ch =='X'){ + ch = 'O'; + }else{ + ch = 'X'; + } + r++; + } + return matrix; + } + + public static void main(String args[]){ + MatrixOf0sAnd1s mos = new MatrixOf0sAnd1s(); + char matrix[][] = mos.create(4, 7); + for(int i=0; i < matrix.length; i++){ + for(int j=0; j < matrix[i].length; j++){ + System.out.print(matrix[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/multiarray/MoveCellPerCellValue.java b/showmecode_100/java/com/interview/multiarray/MoveCellPerCellValue.java new file mode 100644 index 00000000..1eca5cba --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/MoveCellPerCellValue.java @@ -0,0 +1,56 @@ +package com.interview.multiarray; + +/** + * http://www.careercup.com/question?id=6685828805820416 + * Test Edge cases + * Values in cell should be in range of 2D array. + */ +class Cell{ + int x; + int y; + Cell(int x,int y){ + this.x = x; + this.y = y; + } +} + +public class MoveCellPerCellValue { + + public boolean isAllCellTraversed(Cell grid[][]){ + boolean[][] visited = new boolean[grid.length][grid[0].length]; + + int total = grid.length * grid[0].length; + int startx = grid[0][0].x; + int starty = grid[0][0].y; + for(int i=0; i < total-2; i++){ + if(grid[startx][starty] == null){ + return false; + } + if(visited[startx][starty] == true){ + return false; + } + visited[startx][starty] = true; + int x = grid[startx][starty].x; + int y = grid[startx][starty].y; + startx = x; + starty = y; + } + if(grid[startx][starty] == null){ + return true; + } + return false; + } + + public static void main(String args[]){ + Cell cell[][] = new Cell[3][2]; + cell[0][0] = new Cell(0,1); + cell[0][1] = new Cell(2,0); + cell[1][0] = null; + cell[1][1] = new Cell(1,0); + cell[2][0] = new Cell(2,1); + cell[2][1] = new Cell(1,1); + + MoveCellPerCellValue mcp = new MoveCellPerCellValue(); + System.out.println(mcp.isAllCellTraversed(cell)); + } +} diff --git a/showmecode_100/java/com/interview/multiarray/Mutable2DSumRangeQuery.java b/showmecode_100/java/com/interview/multiarray/Mutable2DSumRangeQuery.java new file mode 100644 index 00000000..4d055d4e --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/Mutable2DSumRangeQuery.java @@ -0,0 +1,47 @@ +package com.interview.multiarray; + +/** + * + * Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner + * (row1, col1) and lower right corner (row2, col2). + * + * https://leetcode.com/problems/range-sum-query-2d-mutable/ + */ +public class Mutable2DSumRangeQuery { + private int[][] prefixSum; + private int rows; + private int cols; + private int[][] matrix; + + public Mutable2DSumRangeQuery(int[][] matrix) { + if (matrix.length == 0) { + return; + } + prefixSum = new int[matrix.length][matrix[0].length + 1]; + this.matrix = matrix; + rows = matrix.length; + cols = matrix[0].length; + for (int i = 0; i < rows; i++) { + for (int j = 1; j <= cols; j++) { + prefixSum[i][j] = prefixSum[i][j - 1] + matrix[i][j - 1]; + } + } + + } + + public void update(int row, int col, int val) { + int delta = val - matrix[row][col]; + matrix[row][col] = val; + for (int i = col + 1; i <= cols; i++) { + prefixSum[row][i] += delta; + } + } + + public int sumRegion(int row1, int col1, int row2, int col2) { + int sum = 0; + for (int i = row1; i <= row2; i++) { + sum += prefixSum[i][col2 + 1] - prefixSum[i][col1]; + } + return sum; + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/multiarray/RotateImage.java b/showmecode_100/java/com/interview/multiarray/RotateImage.java new file mode 100644 index 00000000..25e6994e --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/RotateImage.java @@ -0,0 +1,45 @@ +package com.interview.multiarray; + +/** + * Date 07/31/2016 + * @author Tushar Roy + * + * You are given an n x n 2D matrix representing an image. + * Rotate the image by 90 degrees (clockwise). + * + * https://leetcode.com/problems/rotate-image/ + */ +public class RotateImage { + + public void rotate(int[][] matrix) { + int length = matrix.length-1; + int j=0; + while(j < matrix.length/2){ + for(int i=j; i < length-j; i++){ + int temp = matrix[j][i]; + matrix[j][i] = matrix[length-i][j]; + matrix[length-i][j] = matrix[length-j][length-i]; + matrix[length-j][length-i] = matrix[i][length-j]; + matrix[i][length-j] = temp; + } + j++; + } + } + + private void print(int arr[][]){ + for(int i=0; i < arr.length; i++){ + for(int j=0; j < arr.length; j++){ + System.out.print(arr[i][j] + " "); + } + System.out.print("\n"); + } + } + + public static void main(String args[]){ + + int matrix[][] = {{1,2,3,4,20},{5,6,7,8,30},{9,10,11,12,40},{13,14,15,16,50},{21,22,23,24,25}}; + RotateImage ti = new RotateImage(); + ti.rotate(matrix); + ti.print(matrix); + } +} diff --git a/showmecode_100/java/com/interview/multiarray/ShortestDistanceFromAllBuildings.java b/showmecode_100/java/com/interview/multiarray/ShortestDistanceFromAllBuildings.java new file mode 100644 index 00000000..e064e6fb --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/ShortestDistanceFromAllBuildings.java @@ -0,0 +1,85 @@ +package com.interview.multiarray; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Set; + +/** + * Date 03/25/2016 + * @author Tushar Roy + * + * Shortest Distance from All Buildings + * https://leetcode.com/problems/shortest-distance-from-all-buildings/ + */ +public class ShortestDistanceFromAllBuildings { + private class Point { + int x, y, dist = 0; + Point(int row, int col, int dist) { + x = row; + y = col; + this.dist = dist; + } + } + + public int shortestDistance(int[][] grid) { + int totalBuild = 0; + int[][] reach = new int[grid.length][grid[0].length]; + int[][] distance = new int[grid.length][grid[0].length]; + for(int i = 0; i < grid.length; i++) { + for(int j = 0; j < grid[0].length; j++) { + if(grid[i][j] == 1) { + Queue queue = new LinkedList<>(); + queue.offer(new Point(i, j, 0)); + totalBuild++; + boolean[][] visited = new boolean[grid.length][grid[0].length]; + while (!queue.isEmpty()) { + List neighbors = getNeighbors(queue.poll(), grid, visited, grid.length, grid[0].length); + for (Point neigh : neighbors) { + visited[neigh.x][neigh.y] = true; + reach[neigh.x][neigh.y]++; + distance[neigh.x][neigh.y] += neigh.dist; + queue.offer(neigh); + } + } + } + } + } + + int min = Integer.MAX_VALUE; + for (int i = 0; i < reach.length; i++) { + for (int j = 0; j < reach[0].length; j++) { + if (reach[i][j] == totalBuild) { + min = Math.min(min, distance[i][j]); + } + } + } + + return min == Integer.MAX_VALUE ? -1 : min; + } + + private List getNeighbors(Point p, int[][] grid, boolean[][] visited, int n, int m) { + List resultList = new ArrayList<>(); + if(p.x > 0 && grid[p.x -1][p.y] == 0 && !visited[p.x - 1][p.y]) + resultList.add(new Point(p.x -1, p.y, p.dist + 1)); + if(p.x < n - 1 && grid[p.x + 1][p.y] == 0 && !visited[p.x + 1][p.y]) + resultList.add(new Point(p.x + 1, p.y, p.dist + 1)); + if(p.y > 0 && grid[p.x][p.y - 1] == 0 && !visited[p.x][p.y - 1]) + resultList.add(new Point(p.x, p.y - 1, p.dist + 1)); + if(p.y < m - 1 && grid[p.x][p.y + 1] == 0 && !visited[p.x][p.y + 1]) + resultList.add(new Point(p.x, p.y + 1, p.dist + 1)); + + return resultList; + } + + public static void main(String args[]) { + int[][] grid = {{1,1,1,1,1,0},{0,0,0,0,0,1},{0,1,1,0,0,1},{1,0,0,1,0,1},{1,0,1,0,0,1},{1,0,0,0,0,1},{0,1,1,1,1,0}}; + int[][] grid1 = {{1,1},{0,1}}; + ShortestDistanceFromAllBuildings shortestDistanceFromAllBuildings = new ShortestDistanceFromAllBuildings(); + System.out.println(shortestDistanceFromAllBuildings.shortestDistance(grid)); + } + +} diff --git a/showmecode_100/java/com/interview/multiarray/SmallestRectangleBlackPixel.java b/showmecode_100/java/com/interview/multiarray/SmallestRectangleBlackPixel.java new file mode 100644 index 00000000..e96bafde --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/SmallestRectangleBlackPixel.java @@ -0,0 +1,71 @@ +package com.interview.multiarray; + +/** + * An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. + * The black pixels are connected, i.e., there is only one black region. Pixels are connected horizontally + * and vertically. Given the location (x, y) of one of the black pixels, return the area of the smallest + * (axis-aligned) rectangle that encloses all black pixels. + * https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/ + */ +public class SmallestRectangleBlackPixel { + public int minArea(char[][] image, int x, int y) { + + int m = image.length; + int n = image[0].length; + + int left = searchColumns(image, 0, y, 0, m - 1, true); + int right = searchColumns(image, y, n - 1, 0, m - 1, false); + + int top = searchRows(image, 0, x, left, right, true); + int bottom = searchRows(image, x, m - 1, left, right, false); + + return (right - left + 1)*(bottom - top + 1); + } + + private int searchColumns(char[][] image, int i, int j, int top, int bottom, boolean opt) { + int result = 0; + while (i <= j) { + int k = top; + int mid = (i + j)/2; + while (k <= bottom && image[k][mid] == '0') { + k++; + } + if (k != bottom + 1) { + result = mid; + } + if ((k == bottom + 1) == opt) { + i = mid + 1; + } else { + j = mid - 1; + } + } + return result; + } + + private int searchRows(char[][] image, int i, int j, int left, int right, boolean opt) { + int result = 0; + while (i <= j) { + int k = left; + int mid = (i + j)/2; + while (k <= right && image[mid][k] == '0') { + k++; + } + if (k != right + 1) { + result = mid; + } + if ((k == right + 1) == opt) { + i = mid + 1; + } else { + j = mid - 1; + } + } + return result; + } + + public static void main(String args[]) { + char[][] image1 = {{'1'},{'1'}}; + char[][] image = {{'0', '0', '1', '0'}, {'0', '1', '1', '0'}, {'0', '1', '0', '0'}}; + SmallestRectangleBlackPixel sbp = new SmallestRectangleBlackPixel(); + System.out.print(sbp.minArea(image, 0, 2)); + } +} diff --git a/showmecode_100/java/com/interview/multiarray/SpiralGeneration.java b/showmecode_100/java/com/interview/multiarray/SpiralGeneration.java new file mode 100644 index 00000000..25103883 --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/SpiralGeneration.java @@ -0,0 +1,53 @@ +package com.interview.multiarray; + +/** + * Date 07/31/2016 + * @author Tushar Roy + * + * Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. + * + * https://leetcode.com/problems/spiral-matrix-ii/ + */ +public class SpiralGeneration { + public int[][] generateMatrix(int n) { + int[][] result = new int[n][n]; + int up = 0; + int down = n - 1; + int left = 0; + int right = n - 1; + int index = 1; + while (up <= down && left <= right) { + for (int i = left; i <= right; i++) { + result[up][i] = index++; + } + up++; + + for (int i = up; i <= down; i++) { + result[i][right] = index++; + } + right--; + + for (int i = right; i >= left; i--) { + result[down][i] = index++; + } + down--; + + for (int i = down; i >= up; i--) { + result[i][left] = index++; + } + left++; + } + return result; + } + + public static void main(String args[]) { + SpiralGeneration sg = new SpiralGeneration(); + int[][] r = sg.generateMatrix(4); + for (int i = 0; i < r.length; i++) { + for (int j = 0; j < r[i].length; j++) { + System.out.print(r[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/multiarray/SpiralPrinting.java b/showmecode_100/java/com/interview/multiarray/SpiralPrinting.java new file mode 100644 index 00000000..c6bb9996 --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/SpiralPrinting.java @@ -0,0 +1,74 @@ +package com.interview.multiarray; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Date 03/15/2015 + * @author Tushar Roy + * + * Given a 2D matrix(square or rectangular) print it in spiral way. + * e.g 1 2 3 + * 4 5 6 + * 7 8 9 + * Printing should be 1 2 3 6 9 8 7 4 5 + * + * Solution: + * Keep 4 pointers which are bounds for this matrix, up, down, left, right. Print each + * row or column and keep incrementing and decrementing the bounds. As soon as up meets down + * or left meets right we are done. + * + * Reference + * https://leetcode.com/problems/spiral-matrix/ + * http://stackoverflow.com/questions/726756/print-two-dimensional-array-in-spiral-order + * http://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/ + */ +public class SpiralPrinting { + + public List spiralOrder(int[][] matrix) { + if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { + return Collections.EMPTY_LIST; + } + + List result = new ArrayList<>(); + int left = 0; + int right = matrix[0].length - 1; + int up = 0; + int down = matrix.length - 1; + + while (left <= right && up <= down) { + for (int i = left; i <= right; i++) { + result.add(matrix[up][i]); + } + up++; + + for (int i = up; i <= down; i++) { + result.add(matrix[i][right]); + } + right--; + + if (up <= down) { + for (int i = right; i >= left; i--) { + result.add(matrix[down][i]); + } + } + down--; + + if (left <= right) { + for (int i = down; i >= up; i--) { + result.add(matrix[i][left]); + } + } + left++; + } + return result; + } + + public static void main(String args[]){ + SpiralPrinting sp = new SpiralPrinting(); + int[][] matrix = {{1, 2, 3}, {4, 5, 6}}; + List result = sp.spiralOrder(matrix); + System.out.print(result); + } +} diff --git a/showmecode_100/java/com/interview/multiarray/TilingProblem.java b/showmecode_100/java/com/interview/multiarray/TilingProblem.java new file mode 100644 index 00000000..3dff2ea8 --- /dev/null +++ b/showmecode_100/java/com/interview/multiarray/TilingProblem.java @@ -0,0 +1,109 @@ +package com.interview.multiarray; + +/** + * http://www.geeksforgeeks.org/divide-and-conquer-set-6-tiling-problem/ + * Test cases + * Size of matrix is at least 2 and power of 2 always + * Missing point could be on edges + * Missing point could be in any of 4 quadrants + */ + +class Position{ + int x; + int y; + Position(int x, int y){ + this.x = x; + this.y = y; + } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + x; + result = prime * result + y; + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Position other = (Position) obj; + if (x != other.x) + return false; + if (y != other.y) + return false; + return true; + } + +} + +public class TilingProblem { + + char tileCount = 'a'; + public char[][] fit(int size, Position missingPosition){ + char matrix[][] = new char[size][size]; + matrix[missingPosition.x][missingPosition.y] = 'X'; + fit(matrix, new Position(0,0), matrix.length, missingPosition); + return matrix; + } + + private void fit(char matrix[][], Position topLeft, + int size, Position missingPosition){ + if(size == 2){ + updateMatrix(matrix, topLeft, missingPosition); + return; + } + Position alreadyFilledQuadrantPosition = determineQuadrant(topLeft, size, missingPosition); + updateMatrix(matrix, new Position(topLeft.x + size/2-1, topLeft.y + size/2-1), alreadyFilledQuadrantPosition); + for(int i=0 ; i < 2; i++){ + for(int j=0; j < 2; j++){ + Position newMissingPosition = new Position(topLeft.x + size/2 -1+i, topLeft.y + size/2 -1 + j); + if(newMissingPosition.equals(alreadyFilledQuadrantPosition)){ + fit(matrix, new Position(topLeft.x + i*size/2, topLeft.y + j*size/2) , size/2, missingPosition); + }else{ + fit(matrix, new Position(topLeft.x + i*size/2, topLeft.y + j*size/2) , size/2, newMissingPosition); + } + } + } + } + + private Position determineQuadrant(Position topLeft, int size, Position missingPosition){ + for(int i = 0; i < 2; i++){ + for(int j = 0; j < 2; j++){ + if(missingPosition.x >= topLeft.x + i*size/2 && missingPosition.x <= topLeft.x + i*size/2 + size/2-1 && + missingPosition.y >= topLeft.y + j*size/2 && missingPosition.y <= topLeft.y + j*size/2 + size/2 -1){ + return new Position(topLeft.x+size/2 -1 +i, topLeft.y + size/2 - 1 + j); + } + } + } + throw new IllegalArgumentException("Something went wrong in determining quadrant"); + } + + private void updateMatrix(char matrix[][], Position topLeft, Position missingPosition){ + for(int i=topLeft.x; i < topLeft.x + 2; i++){ + for(int j=topLeft.y; j < topLeft.y + 2; j++){ + if(i == missingPosition.x && j == missingPosition.y){ + continue; + } + matrix[i][j] = tileCount; + } + } + tileCount++; + } + + public static void main(String args[]){ + TilingProblem tp = new TilingProblem(); + Position p = new Position(5,6); + char matrix[][] = tp.fit(8, p); + for(int i=0; i < matrix.length; i++){ + for(int j=0; j < matrix[0].length ; j++){ + System.out.print(matrix[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/BoundedBlockingQueue.java b/showmecode_100/java/com/interview/multithreaded/BoundedBlockingQueue.java new file mode 100644 index 00000000..6c36c39b --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/BoundedBlockingQueue.java @@ -0,0 +1,186 @@ + package com.interview.multithreaded; + +import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + + +/** + * Date 06/25/2015 + * @author tusroy + * + * Write a program to implement bounded blocking queue. This is similar to consumer producer problem + * Properties of queue + * 1) If queue is empty poll will wait with timeout till item is available + * 2) If queue is full offer will wait with timeout till space is available + */ +public class BoundedBlockingQueue { + + private final Object[] items; + private int takeIndex; + private int putIndex; + private int count; + + private final ReentrantLock lock; + private final Condition notEmpty; + private final Condition notFull; + + /** + * @param size - Define the size of bounded blocking queue. + */ + public BoundedBlockingQueue(int size){ + items = new Object[size]; + lock = new ReentrantLock(); + notEmpty = lock.newCondition(); + notFull = lock.newCondition(); + } + + /** + * Poll an item from queue. If queue is empty wait with timeout till item is available + * @return Optional depending on if item was polled or queue was empty + */ + public Optional poll(long timeout, TimeUnit timeUnit) throws InterruptedException{ + long left = timeUnit.toNanos(timeout); + //acquire the lock on the lock object + lock.lockInterruptibly(); + T t; + try{ + //if count is 0 means there is no item to poll. Keep trying to poll + //till either item is available or left gets 0 or less which means its + //time to time out. + while(count == 0){ + if(left <= 0){ + return Optional.empty(); + } + //if queue is empty wait fir signal from notEmpty condition + left = notEmpty.awaitNanos(timeUnit.toNanos(left)); + } + //dequeu the item. + t = dequeue(); + //signal notFull since queue is not full anymore + notFull.signal(); + } finally { + //unlock the lock object + lock.unlock(); + } + return Optional.of(t); + } + + /** + * Offer item to queue. If queue is full wait with timeout till space is available. + * @param t - item to offer + * @param timeout - time out time + * @param timeUnit - time out unit + * @return - returns true if item was offered in queue successfully else false. + * @throws InterruptedException + */ + public boolean offer(T t, long timeout, TimeUnit timeUnit) throws InterruptedException{ + if(t == null) { + throw new IllegalArgumentException(); + } + + long left = timeUnit.toNanos(timeout); + + //acquire lock on lock object + lock.lockInterruptibly(); + try{ + //keep trying if you do not have space available in queue or time out is reached. + while(count == items.length){ + if(left <= 0){ + return false; + } + left = notFull.awaitNanos(timeUnit.toNanos(left)); + } + //enqueue the item into the queue + enqueue(t); + //signal notEmpty condition since queue is not empty anymore + notEmpty.signal(); + } finally { + //release the lock. + lock.unlock(); + } + return true; + } + + private void enqueue(T t){ + items[putIndex] = t; + if(++putIndex == items.length) { + putIndex = 0; + } + count++; + } + + @SuppressWarnings("unchecked") + private T dequeue() { + T t = (T)items[takeIndex]; + items[takeIndex] = null; + if(++takeIndex == items.length) { + takeIndex = 0; + } + count--; + return t; + } + + public static void main(String args[]) throws Exception{ + verifyQueueWorks(); + } + + public static void verifyQueueWorks() throws Exception{ + BoundedBlockingQueue queue = new BoundedBlockingQueue<>(30); + ExecutorService writeExecutors = Executors.newFixedThreadPool(10); + int TOTAL = 10000; + AtomicInteger result[] = new AtomicInteger[TOTAL]; + AtomicInteger test = new AtomicInteger(0); + for(int i = 0; i < TOTAL; i++) { + writeExecutors.execute(() -> { + try { + int val = test.getAndIncrement(); + result[val] = new AtomicInteger(1); + while(true){ + if(queue.offer(val, (long)(Math.random()*100 + 1), TimeUnit.MILLISECONDS)){ + break; + } + } + } catch (InterruptedException e) { + System.out.println("Shutting down read thread"); + } + }); + } + + ExecutorService readExecutors = Executors.newFixedThreadPool(10); + for(int i = 0; i < TOTAL; i++) { + readExecutors.execute(() -> { + try { + while(true){ + Optional r = queue.poll((long)(Math.random()*1000 + 1), TimeUnit.MILLISECONDS); + if(r.isPresent()) { + result[r.get()].incrementAndGet(); + } + } + } catch (InterruptedException e) { + System.out.println("Shutting down read thread"); + } + }); + } + + //you can replace this with countdown latch. But I do not feel like writing all that code. + Thread.sleep(10000); + System.out.println("Validating result after reasonable wait"); + + //if queue worked as expected all integers in result array should have value 2. + for(int i=0; i < result.length; i++){ + if(result[i].get() != 2){ + throw new RuntimeException(String.valueOf(i)); + } + } + + System.out.println("Shutting down executors"); + //force shutdown on read/write executor + readExecutors.shutdownNow(); + writeExecutors.shutdownNow(); + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/CountingWord.java b/showmecode_100/java/com/interview/multithreaded/CountingWord.java new file mode 100644 index 00000000..172122d3 --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/CountingWord.java @@ -0,0 +1,92 @@ +package com.interview.multithreaded; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Date 03/05/2015 + * @author tusroy + * + * Write a program to count words. This program should be threadsafe. + * Implement two apis + * 1) void addWord(String word) -> increment count of this word + * 2) long getCount(String word) -> get count of this word + * + * Solution + * Keep a concurrent map. Key to this map should be word while value should be AtomicLong to update it + * in threadsafe way + * + * Test cases + * One word updated by many threads + * Many words updated by many threads + * + *@Threadsafe + */ +public class CountingWord { + + private ConcurrentMap map = new ConcurrentHashMap<>(); + + public void addWord(String word){ + AtomicLong l = map.get(word); + if(l == null){ + l = new AtomicLong(1); + l = map.putIfAbsent(word, l); + if(l != null){ + l.incrementAndGet(); + } + }else{ + l.incrementAndGet(); + } + } + + public long getCount(String word){ + AtomicLong l = map.get(word); + if(l != null){ + return l.longValue(); + } + return 0; + } + + public static void main(String args[]) throws InterruptedException{ + ExecutorService executor1 = Executors.newFixedThreadPool(20); + ExecutorService executor2 = Executors.newFixedThreadPool(20); + ExecutorService executor3 = Executors.newFixedThreadPool(20); + + int total = 100000; + CountDownLatch countDownLatch = new CountDownLatch(3*total); + CountingWord cw = new CountingWord(); + for(int i= 0; i < total; i++){ + executor1.execute(() -> cw.addWord("word1")); + countDownLatch.countDown(); + } + for(int i= 0; i < total; i++){ + executor2.execute(() -> cw.addWord("word2")); + countDownLatch.countDown(); + } + for(int i= 0; i < total; i++){ + executor3.execute(() -> cw.addWord("word3")); + countDownLatch.countDown(); + } + + try { + countDownLatch.await(); + } catch (InterruptedException e) { + throw e; + } + executor1.shutdownNow(); + executor2.shutdownNow(); + executor3.shutdownNow(); + + long count1 = cw.getCount("word1"); + long count2 = cw.getCount("word2"); + long count3 = cw.getCount("word3"); + assert count1 == total; + assert count2 == total; + assert count3 == total; + + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/DependencyTaskExecutor.java b/showmecode_100/java/com/interview/multithreaded/DependencyTaskExecutor.java new file mode 100644 index 00000000..b75289ad --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/DependencyTaskExecutor.java @@ -0,0 +1,138 @@ +package com.interview.multithreaded; + +import com.google.common.collect.Lists; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.RunnableFuture; + +/** + * Given a Task with list of its dependencies and execute method. Run the task such that dependencies are executed first. + * You are given x number of threads. Increase parallelism as much as possible. + */ +public class DependencyTaskExecutor { + + Map> taskTracker = new HashMap<>(); + void scheduleTask(List tasks, int threads) { + ExecutorService executor = Executors.newFixedThreadPool(threads); + CompletableFuture future = CompletableFuture.completedFuture(null); + for (Task task : tasks) { + future = future.thenAcceptBothAsync(scheduleTaskUtil(task, executor), (a, b) -> {}, executor); + } + future.thenRunAsync(() -> {System.out.println("All tasks done. Closing executor"); executor.shutdown();}); + } + + CompletableFuture scheduleTaskUtil(Task task, Executor executor) { + CompletableFuture f = taskTracker.get(task.name()); + if (f != null) { + return f; + } + if (task.dependencies().isEmpty()) { + CompletableFuture future = CompletableFuture.runAsync(() -> task.execute(), executor); + taskTracker.put(task.name(), future); + return future; + } + CompletableFuture future = CompletableFuture.completedFuture(null);; + for (Task upstreamTask : task.dependencies()) { + future = future.thenAcceptBothAsync(scheduleTaskUtil(upstreamTask, executor), (a, b) -> {}, executor); + } + future = future.thenRunAsync(() -> task.execute(), executor); + taskTracker.put(task.name(), future); + return future; + } + + public static void main(String args[]) { + DependencyTaskExecutor taskExecutor = new DependencyTaskExecutor(); + SimpleSleepTask a = new SimpleSleepTask("a", 2000); + SimpleSleepTask b = new SimpleSleepTask("b", 4000); + SimpleSleepTask c = new SimpleSleepTask("c", 6000); + SimpleSleepTask d = new SimpleSleepTask("d", 3000); + SimpleSleepTask x = new SimpleSleepTask("x", 4000); + SimpleSleepTask y = new SimpleSleepTask("y", 6000); + SimpleSleepTask z = new SimpleSleepTask("z", 3000); + + d.addDependency(b); + d.addDependency(c); + c.addDependency(a); + b.addDependency(a); + x.addDependency(y); + x.addDependency(z); + y.addDependency(a); + taskExecutor.scheduleTask(Lists.newArrayList(a, b, c, d, x, y, z), 4); + } +} + +interface Task { + String name(); + List dependencies(); + void execute(); +} + +class SimpleSleepTask implements Task { + String name; + int sleepTimeInMillis; + List dependencies = new ArrayList<>(); + SimpleSleepTask(String name, int sleepTimeInMillis) { + this.name = name; + this.sleepTimeInMillis = sleepTimeInMillis; + } + + void addDependency(Task task) { + dependencies.add(task); + } + + @Override + public String name() { + return name; + } + + @Override + public List dependencies() { + return dependencies; + } + + @Override + public void execute() { + try { + System.out.println("Starting sleep for task " + name); + Thread.sleep(sleepTimeInMillis); + System.out.println("Ending sleep for task " + name); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} + +class FutureTask implements Runnable { + + Task task; + List chainedTasks = new ArrayList<>(); + Executor executor; + FutureTask(Task task, Executor executor) { + this.task = task; + this.executor = executor; + } + @Override + public void run() { + task.execute(); + for (FutureTask t : chainedTasks) { + supplyAsync(t, executor); + } + } + + void supplyAsync(FutureTask task, Executor executor) { + executor.execute(task); + } + + void addChain(FutureTask task) { + task.addChain(this); + } + + +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/multithreaded/FillupMatrix.java b/showmecode_100/java/com/interview/multithreaded/FillupMatrix.java new file mode 100644 index 00000000..e80e6c9c --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/FillupMatrix.java @@ -0,0 +1,75 @@ +package com.interview.multithreaded; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Date 03/05/2015 + * @author tusroy + * + * Write a program which fills up boolean matrix from top left to bottom right with true. + * This program should support two apis + * 1) void updateMatrix() which updates last position of matrix with true + * 2) boolean getVal(int x,int y) return boolean val at matrix[x][y] + * + * This program should be threadsafe. + * + * Solution + * Use AtomicLong to increment the value and return old value. + * + * Test cases + * 1) Try with single thread + * 2) Try with multiple threads and big matrix size. + * + */ +public class FillupMatrix { + + private boolean matrix[][]; + private int size; + private AtomicLong pos; + public FillupMatrix(int size){ + matrix = new boolean[size][size]; + this.size = size; + pos = new AtomicLong(-1); + } + + public void updateMatrix(){ + long pos = next(); + updateMatrix(pos); + } + + private void updateMatrix(long pos){ + if(pos >= size*size){ + throw new IllegalArgumentException("Out of memory"); + } + matrix[(int)(pos/size)][(int)(pos%size)] = true; + } + + private long next(){ + long val = pos.incrementAndGet(); + return val; + } + + public boolean getVal(int x, int y){ + return matrix[x][y]; + } + + public static void main(String args[]) throws InterruptedException{ + int size = 5000; + FillupMatrix fum = new FillupMatrix(size); + ExecutorService executor = Executors.newFixedThreadPool(10); + for(int i=0; i < size*size ; i++){ + executor.execute(() -> fum.updateMatrix()); + } + + executor.shutdown(); + executor.awaitTermination(10, TimeUnit.SECONDS); + for(int i=0; i < size ; i++){ + for(int j=0; j < size; j++){ + assert fum.getVal(i, j); + } + } + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/MinMaxKeeper.java b/showmecode_100/java/com/interview/multithreaded/MinMaxKeeper.java new file mode 100644 index 00000000..1c330f36 --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/MinMaxKeeper.java @@ -0,0 +1,106 @@ +package com.interview.multithreaded; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Date 03/05/2015 + * @author tusroy + * + * Write a program which keeps min and max value in threadsafe way + * Support 2 apis + * void updateMaxMin(int val) + * int getMin() + * int getMax() + * + * Solution + * Use compareAndSet method of AtomicInteger to update min and max + * + * @ThreadSafe + */ +public class MinMaxKeeper { + + private AtomicInteger min = new AtomicInteger(Integer.MAX_VALUE); + private AtomicInteger max = new AtomicInteger(Integer.MIN_VALUE); + + /** + * Threadsafe way of updating min and max + * @param value + */ + public void updateMinMax(int value){ + //update min + while(true){ + //if value is greater than whatever is in min just break right away + int minVal = min.get(); + if(value >= minVal){ + break; + } + //try to update value only if minVal is in min + boolean isSetSuccesful = min.compareAndSet(minVal, value); + //if set was successful break from while loop else keep looping + if(isSetSuccesful){ + break; + } + } + + //update max + while(true){ + int maxVal = max.get(); + if(value <= maxVal){ + break; + } + boolean isSetSuccesful = max.compareAndSet(maxVal, value); + if(isSetSuccesful){ + break; + } + } + } + + public int getMin(){ + return min.get(); + } + + public int getMax(){ + return max.get(); + } + + public static void main(String args[]) throws InterruptedException{ + ExecutorService executors = Executors.newFixedThreadPool(100); + MinMaxKeeper mmKeeper = new MinMaxKeeper(); + + for(int i=0 ; i < 100000; i++){ + GenerateRand rand = new GenerateRand(mmKeeper, i); + executors.execute(rand); + } + + executors.shutdown(); + executors.awaitTermination(10, TimeUnit.SECONDS); + + assert mmKeeper.getMin() == -1; + assert mmKeeper.getMax() == 1000001; + } + + static class GenerateRand implements Runnable{ + int index = 0; + MinMaxKeeper mmKeeper; + public GenerateRand(MinMaxKeeper mmKeeper, int index) { + this.index = index; + this.mmKeeper = mmKeeper; + } + @Override + public void run() { + int rand = ThreadLocalRandom.current().nextInt(1000000); + if(index == 999){ + rand = -1; + } + if(index == 1001){ + rand = 1000001; + } + mmKeeper.updateMinMax(rand); + } + + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/PrintInSequence.java b/showmecode_100/java/com/interview/multithreaded/PrintInSequence.java new file mode 100644 index 00000000..da05a072 --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/PrintInSequence.java @@ -0,0 +1,79 @@ +package com.interview.multithreaded; + +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * A class that has 5 threads - two to increment the myVar variable, two to decrement the myVar variable and one to print the value of myVar. + * Implement increment(), decrement() and printVar() methods such that the following series is printed: + * 0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 ... (repeating) + */ +public class PrintInSequence { + + private volatile int val = 0; + private volatile boolean shouldPrint = true; + private volatile boolean isIncreasing = true; + private ReentrantReadWriteLock.WriteLock lock = new ReentrantReadWriteLock().writeLock(); + public void increment() { + lock.lock(); + if (!shouldPrint && isIncreasing) { + val = val + 1; + if (val == 5) { + isIncreasing = false; + } + shouldPrint = true; + } + lock.unlock(); + } + + public void decrement() { + lock.lock(); + if (!shouldPrint && !isIncreasing) { + val = val - 1; + if (val == 0) { + isIncreasing = true; + } + shouldPrint = true; + } + lock.unlock(); + } + + //only one thread is calling print. So no contention in updating shouldPrint flag. + public void printVar() { + if (shouldPrint) { + System.out.println(val); + shouldPrint = false; + } + } + + public static void main(String args[]) { + PrintInSequence printInSequence = new PrintInSequence(); + Thread t1 = new Thread(printInSequence::runIncrement); + t1.start(); + Thread t2 = new Thread(printInSequence::runIncrement); + t2.start(); + Thread t3 = new Thread(printInSequence::runPrint); + t3.start(); + Thread t4 = new Thread(printInSequence::runDecrement); + t4.start(); + Thread t5 = new Thread(printInSequence::runDecrement); + t5.start(); + } + + private void runIncrement() { + while(true) { + this.increment(); + } + } + + private void runPrint() { + while (true) { + this.printVar(); + } + } + + private void runDecrement() { + while (true) { + this.decrement(); + } + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/RealTimeCounter.java b/showmecode_100/java/com/interview/multithreaded/RealTimeCounter.java new file mode 100644 index 00000000..84d06d30 --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/RealTimeCounter.java @@ -0,0 +1,114 @@ +package com.interview.multithreaded; + +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicLongArray; + +/** + * Date 03/03/2015 + * @author tusroy + * + * Develop a software to count number of events in last 5 mins. You have to support two apis + * 1) addEvent() -> It means increment event by 1 + * 2) getTotalEvents() -> Return total number of events in last 5 mins + * + * Program should support millions of events every minute and should also provide multi-threading support + * + * This class might not have 100% accuracy as far as events in last 5 mins are concerned. + * Since we are using circular queue last second information may not be very accurate. + * + * Solution: + * Keep atomiclong of 300 in array. PositionUpdater updates position every second. + * @Threadsafe + */ +public class RealTimeCounter { + + private final static int GRANULARITY = 300; + private AtomicLongArray counter = new AtomicLongArray(GRANULARITY); + private volatile int pos = 0; + + private RealTimeCounter(){ + PositionUpdater positionUpdater = new PositionUpdater(this); + positionUpdater.start(); + } + + private static volatile RealTimeCounter INSTANCE; + + public static RealTimeCounter getInstance(){ + if(INSTANCE == null){ + synchronized (RealTimeCounter.class) { + if(INSTANCE == null){ + INSTANCE = new RealTimeCounter(); + } + } + } + return INSTANCE; + } + + public long getTotalEvents(){ + int total = 0; + for(int i=0; i < GRANULARITY; i++){ + total += counter.get(i); + } + return total; + } + + public void addEvent(){ + counter.getAndIncrement(pos); + } + + void incrementPosition(){ + //first reset the value to 0 at next counter location. + counter.set((pos + 1)%GRANULARITY, 0); + pos = (pos + 1)%GRANULARITY; + } + + public static void main(String args[]){ + ExecutorService executor = Executors.newFixedThreadPool(10); + RealTimeCounter realTimeCounter = new RealTimeCounter(); + final Random random = new Random(); + final int TOTAL_EVENTS = 10000; + CountDownLatch countDownLatch = new CountDownLatch(TOTAL_EVENTS); + for(int i=0; i < TOTAL_EVENTS; i++){ + executor.execute(() -> { + realTimeCounter.addEvent(); + try { + Thread.sleep(random.nextInt(10)); + } catch (Exception e) { + e.printStackTrace(); + } + countDownLatch.countDown(); + } + ); + } + try{ + countDownLatch.await(); + }catch(Exception e){ + + } + System.out.println(realTimeCounter.getTotalEvents()); + executor.shutdownNow(); + } +} + +class PositionUpdater extends TimerTask{ + + private final RealTimeCounter realTimeCounter; + private final Timer timer = new Timer(true); + private static final int DELAY = 1000; + PositionUpdater(RealTimeCounter realTimeCounter) { + this.realTimeCounter = realTimeCounter; + } + + public void start(){ + timer.schedule(this, DELAY); + } + @Override + public void run() { + realTimeCounter.incrementPosition(); + } +} diff --git a/showmecode_100/java/com/interview/multithreaded/SingleQueueDomainTableUpdate.java b/showmecode_100/java/com/interview/multithreaded/SingleQueueDomainTableUpdate.java new file mode 100644 index 00000000..004e402d --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/SingleQueueDomainTableUpdate.java @@ -0,0 +1,118 @@ +package com.interview.multithreaded; + +import java.util.Queue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * Given a queue which gets millions of messages. Message is of form . + * You have 10000 domain tables. Also you have 50 worker threads. You can only get + * data from front of the queue. Threads get data from the front and then update the + * domain table. If work is being done on domain table you cannot apply another update. + * Update should also be applied sequentially. So an update coming later on should not + * be applied before an update coming sooner. + */ + +class Data{ + private String domain; + private String update; + public String getUpdate() { + return update; + } + public String getDomain() { + return domain; + } +} + +interface DomainLock{ + boolean acquireLock(String domain); + boolean releaseLock(String domain); + boolean isLocked(String domain); +} + +class ThreadPoolManager{ + private ConcurrentMap> domainQueueMap = new ConcurrentHashMap<>(); + public ThreadPoolManager(int numOfThreads){ + //initialize numOfThreads of type ThreadWorker; + } +} + +interface DatabaseLayer{ + public void applyUpdates(String domain,String update); +} + +class ThreadWorker implements Runnable{ + + private QueueManager mgr; + private ConcurrentMap> domainQueueMap; + private DomainLock domainLock; + private DatabaseLayer databaseLayer; + public ThreadWorker(QueueManager mgr){ + this.mgr = mgr; + } + @Override + public void run() { + while(true){ + Pair p = mgr.getDataFromFrontOfQueue(domainLock); + if(p.yourLock){ + Queue queue = domainQueueMap.get(p.data.getDomain()); + if(queue != null){ + while(queue.size() > 0){ + Data data = queue.poll(); + databaseLayer.applyUpdates(data.getDomain(), data.getUpdate()); + } + } + databaseLayer.applyUpdates(p.data.getDomain(), p.data.getUpdate()); + queue = domainQueueMap.get(p.data.getDomain()); + if(queue != null){ + while(queue.size() > 0){ + Data data = queue.poll(); + databaseLayer.applyUpdates(data.getDomain(), data.getUpdate()); + } + } + domainLock.releaseLock(p.data.getDomain()); + //check if queue is not empty + //if queue is not empty try to acquire lock again + }else{ + if(domainQueueMap.containsKey(p.data.getDomain())){ + Queue queue = domainQueueMap.get(p.data.getDomain()); + queue.offer(p.data); + } + } + } + } + +} + +interface QueueHandle{ + //this is a blocking call. If there is no data in the queue it just waits for data to be available + public Data getNextData(); +} + +class Pair{ + Data data; + boolean yourLock; +} + +class QueueManager{ + private QueueHandle queueHandle; + public QueueManager(QueueHandle queueHandle){ + this.queueHandle = queueHandle; + } + + public synchronized Pair getDataFromFrontOfQueue(DomainLock domainLock){ + Data data = queueHandle.getNextData(); + boolean yourLock = false; + //if lock for table does not exists or if it is false lock the table + if(!domainLock.isLocked(data.getDomain())){ + domainLock.acquireLock(data.getDomain()); + yourLock = true; + } + Pair p = new Pair(); + p.data = data; + p.yourLock = yourLock; + return p; + } +} +public class SingleQueueDomainTableUpdate { +} diff --git a/showmecode_100/java/com/interview/multithreaded/SpinLockMutex.java b/showmecode_100/java/com/interview/multithreaded/SpinLockMutex.java new file mode 100644 index 00000000..a7536cc6 --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/SpinLockMutex.java @@ -0,0 +1,80 @@ +package com.interview.multithreaded; + +/** + * Design a mutex using 2 variable method assuming operation ice happens atomically + */ +class Mutex { + + int val = 0; + + /** + * Val is stored somewhere. If oldVal is same as val + * then you change val to newVal and return oldVal + * Otherwise you do nothing but return val + * @param oldValue + * @param newValue + * @return + */ + private synchronized int ice(int oldValue, int newValue) { + if (oldValue == val) { + val = newValue; + return oldValue; + } else { + return val; + } + } + + void acquireLock() { + while (ice(0, 1) != 0); + } + + void releaseLock() { + ice(1, 0); + } + +} + +public class SpinLockMutex { + + StringBuffer buff = new StringBuffer(); + + // some method needs mutex protection + public void changeBuffer(String str) { + buff.append(str); + } + + public String getBuffer() { + return buff.toString(); + } + + public static void main(String args[]) throws Exception{ + SpinLockMutex slm = new SpinLockMutex(); + Mutex m = new Mutex(); + Thread t1 = new Thread(() -> { + for (int i = 0; i < 10; i++) { + m.acquireLock(); + slm.changeBuffer("a" + i); + m.releaseLock(); + } + }); + + Thread t2 = new Thread(() -> { + for (int i = 0; i < 10; i++) { + m.acquireLock(); + slm.changeBuffer("b" + i); + m.releaseLock(); + } + }); + + t1.start(); + t2.start(); + try { + t1.join(); + t2.join(); + } catch (InterruptedException e) { + throw e; + } + System.out.println(slm.getBuffer()); + } + +} diff --git a/showmecode_100/java/com/interview/multithreaded/ThreadPoolExample.java b/showmecode_100/java/com/interview/multithreaded/ThreadPoolExample.java new file mode 100644 index 00000000..acae78fa --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/ThreadPoolExample.java @@ -0,0 +1,61 @@ +package com.interview.multithreaded; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletionService; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class ThreadPoolExample { + + private static BlockingQueue queue = new ArrayBlockingQueue(10); + public static ExecutorService threadPool = Executors.newFixedThreadPool(5); + public void doWork() throws Exception{ + CompletionService completionService = new ExecutorCompletionService(threadPool); + List> futureList = new ArrayList>(); + for(int i=0; i < 20; i++){ + futureList.add(completionService.submit(new Count10(i))); + } + for(int i=0; i < 20; i++){ + Future future = completionService.take(); + System.out.println(future.get()); + } + } + + public static void main(String args[]) throws Exception{ + ThreadPoolExample tpe = new ThreadPoolExample(); + tpe.doWork(); + } + +} + +class Count10 implements Callable{ + + private int index = 0; + Count10(int i){ + index = i; + } + @Override + public String call() throws Exception { + // for(int i=0; i < 10; i++){ + int sleepTime = 5000 + 1; + try { + + System.out.println("Before sleep " + index); + Thread.sleep(sleepTime); + System.out.println("After sleep " + index); + + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // } + return "Done" + index; + } + +} diff --git a/showmecode_100/java/com/interview/multithreaded/ThreadPoolImpl.java b/showmecode_100/java/com/interview/multithreaded/ThreadPoolImpl.java new file mode 100644 index 00000000..df986915 --- /dev/null +++ b/showmecode_100/java/com/interview/multithreaded/ThreadPoolImpl.java @@ -0,0 +1,147 @@ +package com.interview.multithreaded; + +import java.util.LinkedList; +import java.util.Queue; + +class ThreadPool { + + public Thread run(Runnable runnable) { + Thread t = new Thread(runnable); + t.start(); + return t; + } +} + +/** + * Facebook interview question + * Implement a non block run which takes as many runnables as given but only + * runs a specified number of threads. + * You can also update maxSize in between which will change number of threads executing + * http://tutorials.jenkov.com/java-concurrency/thread-pools.html + */ +public class ThreadPoolImpl { + + private int maxSize = 0; + ThreadPool threadPool; + + public ThreadPoolImpl(int size, ThreadPool threadPool) { + maxSize = size; + this.threadPool = threadPool; + } + + public void setMax(int size){ + System.out.print("Setting max size " + size); + if(maxSize == 0){ + maxSize = size; + execute(); + }else{ + maxSize = size; + } + } + + private int currentSize = 0; + private Queue waitingThreads = new LinkedList(); + private boolean isExecuting = false; + private Object monitor = new Object(); + + public void run(Runnable thread) { + synchronized (monitor) { + waitingThreads.offer(thread); + execute(); + } + } + + private void execute() { + if (!isExecuting) { + isExecuting = true; + ExecutingRunnable runnable = new ExecutingRunnable(); + threadPool.run(runnable); + } + } + + class ExecutingRunnable implements Runnable { + @Override + public void run() { + while (true) { + synchronized(monitor){ + if(maxSize ==0){ + isExecuting = false; + break; + } + } + while (waitingThreads.size() > 0) { + synchronized(monitor){ + if(maxSize ==0){ + isExecuting = false; + break; + } + } + if (currentSize < maxSize) { + currentSize++; + Runnable run = waitingThreads.poll(); + RunnableThreads r = new RunnableThreads(run); + threadPool.run(r); + } + } + synchronized (monitor) { + if (waitingThreads.size() == 0) { + isExecuting = false; + break; + } + } +// System.out.println("Looping"); + } + } + + } + + class RunnableThreads implements Runnable { + private Runnable r; + + RunnableThreads(Runnable r) { + this.r = r; + } + + @Override + public void run() { + r.run(); + currentSize--; + } + } + + public static void main(String args[]) throws InterruptedException{ + ThreadPool threadPool = new ThreadPool(); + ThreadPoolImpl impl = new ThreadPoolImpl(4, threadPool); + int i; + for(i=0; i < 10; i++){ + MyRunnable runnable = new MyRunnable(i); + impl.run(runnable); + } + Thread.sleep(5000); + impl.setMax(0); + Thread.sleep(10000); + impl.setMax(6); + for(;i < 15;i++){ + MyRunnable runnable = new MyRunnable(i); + impl.run(runnable); + } + } +} + +class MyRunnable implements Runnable{ + int index = 0; + MyRunnable(int index){ + this.index =index; + } + @Override + public void run() { + System.out.println("Start of index " + index); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + System.out.println("Exception " + index + " " + e); + } + System.out.println("End of index " + index); + } + +} diff --git a/showmecode_100/java/com/interview/number/AggregateNumber.java b/showmecode_100/java/com/interview/number/AggregateNumber.java new file mode 100644 index 00000000..1a897b9b --- /dev/null +++ b/showmecode_100/java/com/interview/number/AggregateNumber.java @@ -0,0 +1,65 @@ +package com.interview.number; + +/** + * Number such that 11 + 11 = 22, 11 +22 = 33, 22 +33 = 55 + * so 1111223355 is aggregate number + */ +public class AggregateNumber { + + //assumption is that numbers in array are single digit non-negative number(0..9) + public boolean isAggregate(int[] number){ + if(number.length < 3){ + return false; + } + int prev = 0; + for(int i=1; i <= number.length/2; i++){ + for(int j=0; j right) { + String r = new String(result); + if ((r.length() == low.length() && low.compareTo(r) > 0) || (high.length() == result.length && high.compareTo(r) < 0)) { + return 0; + } + return 1; + } + + int count = 0; + + for (char[] pair : pairs) { + result[left] = pair[0]; + result[right] = pair[1]; + //number should not start with 0 if its length is greater than 0 + if (result.length != 1 && result[0] == '0') { + continue; + } + //if left == right then we got to make sure we dont pick pair 6, 9 or 9, 6 + if ((left < right) || (left == right && pair[0] == pair[1])) { + count += strobogrammaticInRangeUtil(low, high, left + 1, right - 1, result); + } + } + return count; + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/number/ArithemeticProgressionExists.java b/showmecode_100/java/com/interview/number/ArithemeticProgressionExists.java new file mode 100644 index 00000000..03a67a36 --- /dev/null +++ b/showmecode_100/java/com/interview/number/ArithemeticProgressionExists.java @@ -0,0 +1,30 @@ +package com.interview.number; + +/** + * http://www.geeksforgeeks.org/length-of-the-longest-arithmatic-progression-in-a-sorted-array/ + */ +public class ArithemeticProgressionExists { + + public boolean exists(int input[]){ + + for(int i=1; i < input.length-1; i++){ + int j = i-1; + int k = i+1; + while(j >=0 && k <= input.length-1){ + if(input[i]*2 == input[j] + input[k]){ + return true; + }else if(input[i]*2 > input[j] + input[k]){ + k++; + }else{ + j--; + } + } + } + return false; + } + public static void main(String args[]){ + int input[] = {1,3,6,7,10,11,15}; + ArithemeticProgressionExists ape = new ArithemeticProgressionExists(); + System.out.println(ape.exists(input)); + } +} diff --git a/showmecode_100/java/com/interview/number/ArrayMultiplication.java b/showmecode_100/java/com/interview/number/ArrayMultiplication.java new file mode 100644 index 00000000..b3f8f583 --- /dev/null +++ b/showmecode_100/java/com/interview/number/ArrayMultiplication.java @@ -0,0 +1,119 @@ +package com.interview.number; + +import com.interview.array.ArrayAddition; + +public class ArrayMultiplication { + + public int[] multiplyDivideAndConquer(int arr1[],int arr2[],int low1,int high1,int low2,int high2){ + + if(low1 == high1 || low2 == high2){ + return simpleMultiplication(arr1, arr2, low1, high1, low2, high2); + } + + int mid1 = (low1 + high1)/2; + int mid2 = (low2 + high2)/2; + + int r1[] = multiplyDivideAndConquer(arr1,arr2,low1,mid1,low2,mid2); + int shiftBy = high1-mid1 + high2-mid2; + r1 = shift(r1,shiftBy); + + int r2[] = multiplyDivideAndConquer(arr1,arr2,mid1+1,high1,mid2+1,high2); + + int r3[] = multiplyDivideAndConquer(arr1,arr2,low1,mid1,mid2+1,high2); + shiftBy = high1 - mid1; + r3 = shift(r3,shiftBy); + + int r4[] = multiplyDivideAndConquer(arr1,arr2,mid1+1,high1,low2,mid2); + shiftBy = high2 - mid2; + r4 = shift(r4,shiftBy); + + ArrayAddition aa = new ArrayAddition(); + r1 = aa.add(r1, r2); + r1 = aa.add(r1, r3); + r1 = aa.add(r1, r4); + return r1; + + } + + private int[] shift(int arr[],int n){ + int[] result = new int[arr.length + n]; + int i=0; + for(i=0; i < arr.length; i++){ + result[i] = arr[i]; + } + return result; + } + + public int[] simpleMultiplication(int arr1[],int arr2[],int low1,int high1,int low2,int high2){ + + int[] result = new int[high1-low1 + high2 -low2 + 2]; + + int m=0; + int c=0; + int n =0; + int index = result.length-1; + int temp[] = new int[Math.max(high1-low1+1, high2-low2+1)+1]; + for(int i= high1; i >=low1; i--){ + int l = temp.length-1; + for(int j=high2; j>=low2; j--){ + m = arr1[i]*arr2[j] + c; + n = m%10; + temp[l--] = n; + c = m/10; + } + temp[l] = c; + addToResult(result,temp,index); + index--; + c=0; + for(int t=0; t < temp.length; t++){ + temp[t] = 0; + } + } + return result; + } + + private void addToResult(int[] result,int temp[],int start){ + int c=0; + for(int i=temp.length-1; i>=0 ; i--){ + if(start == -1){ + break; + } + int m = result[start] + temp[i] + c; + result[start--] = m%10; + c = m/10; + } + } + + public int multiplicationImproved(int x, int y, int len){ + if(len == 1){ + return x*y; + } + len = len/2; + int div = power(len); + int result1 = multiplicationImproved(x/div,y/div,len); + int result2 = multiplicationImproved(x%div, y % div, len); + int result3 = multiplicationImproved(x/div + x%div,y/div + y % div,len); + + return result1*div*(div -1) + + result3*div - result2*(div -1 ); + + } + + private int power(int n){ + return (int)Math.pow(10, n); + } + + + public static void main(String args[]){ + int arr2[] = {9,9,7,4,7,9}; + int arr1[] = {9,9,5,7,4,2,1}; + ArrayMultiplication am = new ArrayMultiplication(); + int result[] = am.multiplyDivideAndConquer(arr1, arr2, 0, arr1.length-1, 0, arr2.length-1); + for(int i=0; i < result.length; i++){ + System.out.print(" " + result[i]); + } + + System.out.print("\n" + am.multiplicationImproved(999, 168, 2)); + + } +} diff --git a/showmecode_100/java/com/interview/number/BasicCalculator.java b/showmecode_100/java/com/interview/number/BasicCalculator.java new file mode 100644 index 00000000..731819ab --- /dev/null +++ b/showmecode_100/java/com/interview/number/BasicCalculator.java @@ -0,0 +1,50 @@ +package com.interview.number; + +import java.util.Stack; + +/** + * Date 10/11/2016 + * @author Tushar Roy + * + * Implement a basic calculator to evaluate a simple expression string. + * The expression string contains only non-negative integers, +, -, *, / operators and empty spaces. + * The integer division should truncate toward zero. + * + * Time complexity O(n) + * Space complexity (n) + * + * https://leetcode.com/problems/basic-calculator-ii/ + */ +public class BasicCalculator { + public int calculate(String s) { + Stack operand = new Stack<>(); + int current = 0; + char prevOperator = '+'; + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + if (Character.isDigit(ch)) { + current = current * 10 + ch - '0'; + } + //if its not a digit or space then go in this block. + //also if it is last character then go in this block and finish up last operation. + if (i == s.length() - 1 || (ch != ' ' && !Character.isDigit(ch))) { + if (prevOperator == '+') { + operand.push(current); + } else if (prevOperator == '-') { + operand.push(-current); + } else if (prevOperator == '/') { + operand.push(operand.pop() / current); + } else { + operand.push(operand.pop() * current); + } + prevOperator = ch; + current = 0; + } + } + int result = 0; + while (!operand.isEmpty()) { + result += operand.pop(); + } + return result; + } +} diff --git a/showmecode_100/java/com/interview/number/BinomialCoefficient.java b/showmecode_100/java/com/interview/number/BinomialCoefficient.java new file mode 100644 index 00000000..335ab10e --- /dev/null +++ b/showmecode_100/java/com/interview/number/BinomialCoefficient.java @@ -0,0 +1,28 @@ +package com.interview.number; + +/** + * http://www.geeksforgeeks.org/space-and-time-efficient-binomial-coefficient/ + * Test cases + * k is 0 + * k or n are negative + * k greater than n + */ +public class BinomialCoefficient { + + public int calculate(int n, int k){ + if(k > n-k){ + k = n-k; + } + int result = 1; + for(int i=0; i < k; i++){ + result *= (n-i); + result /= (i+1); + } + return result; + } + + public static void main(String args[]){ + BinomialCoefficient bc = new BinomialCoefficient(); + System.out.print(bc.calculate(8, 3)); + } +} diff --git a/showmecode_100/java/com/interview/number/ConvertToBaseN.java b/showmecode_100/java/com/interview/number/ConvertToBaseN.java new file mode 100644 index 00000000..f5ae6a45 --- /dev/null +++ b/showmecode_100/java/com/interview/number/ConvertToBaseN.java @@ -0,0 +1,23 @@ +package com.interview.number; + +public class ConvertToBaseN { + + int baseN(int num,int base){ + if(base > 10){ + throw new IllegalArgumentException(); + } + int result =0; + int pow = 1; + while(num > 0){ + result += pow*(num%base); + pow = pow*10; + num /= base; + } + return result; + } + + public static void main(String args[]){ + ConvertToBaseN ctb = new ConvertToBaseN(); + System.out.println(ctb.baseN(13, 9)); + } +} diff --git a/showmecode_100/java/com/interview/number/CountNoOf2s.java b/showmecode_100/java/com/interview/number/CountNoOf2s.java new file mode 100644 index 00000000..20e1c441 --- /dev/null +++ b/showmecode_100/java/com/interview/number/CountNoOf2s.java @@ -0,0 +1,34 @@ +package com.interview.number; + +/** + * 150 qs 18.4 + */ +public class CountNoOf2s { + + public int count2s(int n){ + if(n < 2){ + return 0; + }else if(n <= 9){ + return 1; + } + int pow = 1; + while(pow <= n){ + pow *= 10; + } + pow = pow/10; + + if(n/pow == 2){ + //e.g 2105 becomes 1 + 105 + count2s(105) + count2s(1999) + return 1 + n%pow + count2s(n%pow) + count2s((n/pow)*pow -1); + }else{ + //e.g 3856 becomes 1000*count2s(3) + count2s(856) + 3*counts(999) + return pow*count2s(n/pow) + count2s(n%pow) + (n/pow)*count2s(pow-1); + } + } + + public static void main(String args[]){ + CountNoOf2s cn2 = new CountNoOf2s(); + System.out.println(cn2.count2s(255)); + } + +} diff --git a/showmecode_100/java/com/interview/number/CountNumbersNotIncluding4.java b/showmecode_100/java/com/interview/number/CountNumbersNotIncluding4.java new file mode 100644 index 00000000..5f344814 --- /dev/null +++ b/showmecode_100/java/com/interview/number/CountNumbersNotIncluding4.java @@ -0,0 +1,38 @@ +package com.interview.number; + +/** + * http://www.geeksforgeeks.org/count-numbers-that-dont-contain-3/ + */ +public class CountNumbersNotIncluding4 { + + public int count(int n){ + if(n < 4){ + return n; + } + if( n >=4 && n <=10){ + return n-1; + } + + int pow = 1; + while(n/pow > 9){ + pow = pow*10; + } + + int msd = n/pow; + if(msd == 4){ + return count(msd*pow -1); + }else{ + //suppose number is 276. So this becomes count(2)*count(99) + + //count(2) + count(76) + //reason we split this way rather than count(2)*count(100) is because + //count(100) can go into infinite loop + return count(msd)*count(pow-1) + count(msd) + count(n%pow); + } + } + + public static void main(String args[]){ + CountNumbersNotIncluding4 cn = new CountNumbersNotIncluding4(); + int c = cn.count(44); + System.out.print(c); + } +} diff --git a/showmecode_100/java/com/interview/number/DivisionWithoutDivisionOperator.java b/showmecode_100/java/com/interview/number/DivisionWithoutDivisionOperator.java new file mode 100644 index 00000000..e772350b --- /dev/null +++ b/showmecode_100/java/com/interview/number/DivisionWithoutDivisionOperator.java @@ -0,0 +1,76 @@ +package com.interview.number; + +public class DivisionWithoutDivisionOperator { + + public static class Pair { + int remainder; + int quotient; + } + + public Pair divide(int number, int divisor) { + int divident = 0; + while (number >= divisor) { + number -= divisor; + divident++; + } + Pair p = new Pair(); + p.quotient = divident; + p.remainder = number; + return p; + } + + public int divideRec(int number, int divisor){ + if(number < divisor){ + return 0; + } + + return divideRec(number-divisor, divisor) + 1; + } + + public Pair efficientDivide(int divident, int divisor) { + int quotient = 1; + int currentDivisor = divisor; + int currentDivident = divident; + int q = 0; + while (divisor < divident) { + currentDivisor = divisor; + currentDivident = divident; + quotient = 1; + while (currentDivisor <= currentDivident) { + currentDivisor *= 2; + quotient *= 2; + } + currentDivisor = currentDivisor >> 1; + quotient = quotient >> 1; + divident = divident - currentDivisor; + q += quotient; + } + Pair p = new Pair(); + p.quotient = q; + p.remainder = divident; + return p; + } + + public int efficientDivideRec(int divident, int divisor){ + if(divisor > divident){ + return 0; + } + int tempDivisor = divisor; + int quotient = 1; + while(divisor <= divident){ + divisor = divisor*2; + quotient *= 2; + } + divisor = divisor >> 1; + quotient = quotient >> 1; + return quotient + efficientDivideRec(divident - divisor, tempDivisor); + } + + public static void main(String args[]) { + DivisionWithoutDivisionOperator dd = new DivisionWithoutDivisionOperator(); + Pair p = dd.efficientDivide(95,4); + System.out.println(p.quotient + " " + p.remainder); + + System.out.print(dd.efficientDivideRec(135,12)); + } +} diff --git a/showmecode_100/java/com/interview/number/EuclideanAlgoForGCD.java b/showmecode_100/java/com/interview/number/EuclideanAlgoForGCD.java new file mode 100644 index 00000000..62c1bbe9 --- /dev/null +++ b/showmecode_100/java/com/interview/number/EuclideanAlgoForGCD.java @@ -0,0 +1,42 @@ +package com.interview.number; + +/** + * GCD greatest common divisor + * Co prime numbers if GCD of both the numbers is 1 + */ +public class EuclideanAlgoForGCD { + + public int gcd(int num1, int num2){ + if(num1 > num2){ + int temp = num1; + num1 = num2; + num2 = temp; + } + while(num1 != 0){ + int temp = num1; + num1 = num2 % num1; + num2 = temp; + } + return num2; + } + + /** + * assumption that num1 is less than num2 as initial parameter + */ + public int gcdRec(int num1, int num2){ + if(num1 == 0){ + return num2; + } + return gcdRec(num2%num1, num1); + } + + public static void main(String args[]){ + EuclideanAlgoForGCD ea = new EuclideanAlgoForGCD(); + int gcd = ea.gcd(956,1044); + if(gcd == 1){ + System.out.println("Co prime numbers"); + }else{ + System.out.println("No coprime numbers " + gcd); + } + } +} diff --git a/showmecode_100/java/com/interview/number/FactorialOfLargeNumber.java b/showmecode_100/java/com/interview/number/FactorialOfLargeNumber.java new file mode 100644 index 00000000..5ecabd2f --- /dev/null +++ b/showmecode_100/java/com/interview/number/FactorialOfLargeNumber.java @@ -0,0 +1,63 @@ +package com.interview.number; + +/** + * Date 03/14/2015 + * @author tusroy + + * Find factorial of very large number like 100. + * + * Solution + * Since result will be very large it cannot fit in long. We need to store result in array + * and do regular multiplication of result in array with next number of factorial. + * Result is randomly initialized with size 500. Better would be to use list which grows + * dynamically. + * + * Test cases: + * Negative number - should throw exception for negative number + * 0 + * large number + * + * Reference + * http://www.geeksforgeeks.org/factorial-large-number/ + */ +public class FactorialOfLargeNumber { + + public int calculate(int result[], int n){ + assert n >= 0; + result[0] = 1; + int size = 1; + for(int i=2; i <= n; i++){ + size = multiply(result, i, size); + } + return size; + } + + private int multiply(int result[], int x, int size){ + + int carry = 0; + int prod = 0; + int i=0; + for(; i < size; i++){ + prod = result[i]*x + carry; + result[i] = prod%10; + carry = prod/10; + } + + while(carry != 0){ + result[i] = carry%10; + carry = carry/10; + i++; + } + + return i; + } + + public static void main(String args[]){ + FactorialOfLargeNumber fol = new FactorialOfLargeNumber(); + int result[] = new int[500]; + int size = fol.calculate(result, 126); + for(int i=size-1; i >=0; i--){ + System.out.print(result[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/number/GenerateSignature.java b/showmecode_100/java/com/interview/number/GenerateSignature.java new file mode 100644 index 00000000..a0953f6c --- /dev/null +++ b/showmecode_100/java/com/interview/number/GenerateSignature.java @@ -0,0 +1,60 @@ +package com.interview.number; + +/** + * You are given an array of n elements [1,2,....n]. For example {3,2,1,6,7,4,5}. Now we create a signature of this + * array by comparing every consecutive pir of elements. If they increase, write I else write D. + * For example for the above array, the signature would be "DDIIDI". The signature thus has a length of N-1. + * Now the question is given a signature, compute the lexicographically smallest permutation of [1,2,....n]. + * + * Time complexity O(n) + * Space complexity O(1) + * + * Reference https://learn.hackerearth.com/forum/182/lexicographically-smallest-permutation-given-a-signature/ + */ +public class GenerateSignature { + + public int[] generate(char[] input) { + int n = input.length+1; + int[] result = new int[n]; + int i; + for (i = 0; i < n; i++) { + result[i] = i+1; + } + i = 0; + while(i < n-1) { + int start = -1, end = -1; + while(i < n-1 && input[i] == 'D') { + if(start == -1) { + start = i; + } + end = i; + i++; + } + if(start != -1) { + reverse(result, start, end+1); + } + i++; + } + return result; + } + + private void reverse(int[] result, int start, int end) { + + while(start < end) { + int tmp = result[start]; + result[start] = result[end]; + result[end] = tmp; + start++; + end--; + } + } + + public static void main(String args[]){ + String input = "IIIDIIDDDDIIDDD"; + GenerateSignature gs = new GenerateSignature(); + int result[] = gs.generate(input.toCharArray()); + for(int i=0; i < result.length; i++){ + System.out.print(result[i] + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/number/LargestMultipleOf3inArray.java b/showmecode_100/java/com/interview/number/LargestMultipleOf3inArray.java new file mode 100644 index 00000000..00929479 --- /dev/null +++ b/showmecode_100/java/com/interview/number/LargestMultipleOf3inArray.java @@ -0,0 +1,120 @@ +package com.interview.number; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; + +/** + * http://www.geeksforgeeks.org/find-the-largest-number-multiple-of-3/ + */ +public class LargestMultipleOf3inArray { + + public void swap(int input[],int i, int j){ + int temp = input[i]; + input[i] = input[j]; + input[j] = temp; + } + private void reverse(int input[]){ + for(int i=0; i < input.length/2; i++){ + swap(input,i, input.length-1-i); + } + } + + public int[] largestMultiple(int input[]){ + Arrays.sort(input); + int output[]; + Queue q0 = new LinkedList(); + Queue q1 = new LinkedList(); + Queue q2 = new LinkedList(); + + int sum = 0; + for(int i=0; i < input.length; i++){ + if(input[i] % 3 == 0){ + q0.add(input[i]); + } + if(input[i] % 3 == 1){ + q1.add(input[i]); + } + if(input[i] % 3 == 2){ + q2.add(input[i]); + } + sum += input[i]; + } + + if(sum % 3 == 0){ + output = new int[input.length]; + for(int i=0; i < input.length; i++){ + output[input.length-1-i] = input[i]; + } + return output; + } + else if(sum % 3 == 1){ + int len = input.length; + if(q1.size() > 0){ + q1.poll(); + len--; + }else if (q2.size() > 1){ + q2.poll(); + q2.poll(); + len -= 2; + }else{ + return null; + } + output = new int[len]; + int i=0; + while(q0.size() > 0){ + output[i] = q0.poll(); + i++; + } + while(q1.size() > 0){ + output[i] = q1.poll(); + i++; + } + while(q2.size() > 0){ + output[i] = q2.poll(); + i++; + } + Arrays.sort(output); + reverse(output); + }else{ + int len = input.length; + if(q2.size() > 0){ + q2.poll(); + len--; + }else if(q1.size() > 1){ + q1.poll(); + q1.poll(); + len -= 2; + }else{ + return null; + } + output = new int[len]; + int i=0; + while(q0.size() > 0){ + output[i] = q0.poll(); + i++; + } + while(q1.size() > 0){ + output[i] = q1.poll(); + i++; + } + while(q2.size() > 0){ + output[i] = q2.poll(); + i++; + } + Arrays.sort(output); + reverse(output); + } + return output; + } + + public static void main(String args[]){ + int input[] = {8,9,0,2,2,2}; + LargestMultipleOf3inArray lma = new LargestMultipleOf3inArray(); + int output[] = lma.largestMultiple(input); + for(int a : output){ + System.out.print(a + " "); + } + } +} + diff --git a/showmecode_100/java/com/interview/number/LuckyNumbers.java b/showmecode_100/java/com/interview/number/LuckyNumbers.java new file mode 100644 index 00000000..1759194d --- /dev/null +++ b/showmecode_100/java/com/interview/number/LuckyNumbers.java @@ -0,0 +1,24 @@ +package com.interview.number; + +/** + * http://www.geeksforgeeks.org/lucky-numbers/ + */ +public class LuckyNumbers { + + public boolean isLuck(int n,int counter){ + if(n < counter){ + return true; + } + if(n % counter == 0){ + return false; + } + + return isLuck( n - n/counter,counter+1); + } + + public static void main(String args[]){ + LuckyNumbers ln = new LuckyNumbers(); + System.out.println(ln.isLuck(19, 2)); + } + +} diff --git a/showmecode_100/java/com/interview/number/MedianOf3Number.java b/showmecode_100/java/com/interview/number/MedianOf3Number.java new file mode 100644 index 00000000..70ee7bca --- /dev/null +++ b/showmecode_100/java/com/interview/number/MedianOf3Number.java @@ -0,0 +1,52 @@ +package com.interview.number; + +public class MedianOf3Number { + + public int median(int arr[]){ + int l = 0; + int h = 2; + int m =1; + + if(arr[m] >= arr[l]){ + if(arr[m] <= arr[h]){ + return arr[m]; + }else if(arr[l] >= arr[h]){ + return arr[l]; + } + }else{ + if(arr[l] <= arr[h]){ + return arr[l]; + }else if(arr[m] >= arr[h]){ + return arr[m]; + } + } + return arr[h]; + } + + public int median2Comparison(int arr[]){ + int l = 0; + int h = 2; + int m =1; + + if((arr[l] - arr[m])*(arr[h] - arr[l]) >= 0){ + return arr[l]; + }else if((arr[m] - arr[l])*(arr[h] - arr[m]) >= 0){ + return arr[m]; + }else{ + return arr[h]; + } + } + + public int medianXORMethod(int arr[]){ + int a = arr[0] <= arr[1] ? arr[0] : arr[1]; + int b = arr[1] <= arr[2] ? arr[1] : arr[2]; + int c = arr[0] <= arr[2] ? arr[0] : arr[2]; + return a^b^c; + } + + public static void main(String args[]){ + MedianOf3Number mn = new MedianOf3Number(); + int arr[] = {2,0,1}; + System.out.println(mn.medianXORMethod(arr)); + } +} diff --git a/showmecode_100/java/com/interview/number/MthNumberInNSizeArray.java b/showmecode_100/java/com/interview/number/MthNumberInNSizeArray.java new file mode 100644 index 00000000..8b39a5eb --- /dev/null +++ b/showmecode_100/java/com/interview/number/MthNumberInNSizeArray.java @@ -0,0 +1,95 @@ +package com.interview.number; + +import java.util.Arrays; + +/** + * @author Tushar Roy + * Date 01/21/2016 + * + * Given a number n, find mth value in permutation of array consisting of [1..n] values. + * mth is defined by lexicographical order. + */ +public class MthNumberInNSizeArray { + + public int[] find(int n, int m) { + boolean used[] = new boolean[n]; + int result[] = new int[n]; + find(result, used, 0, n, m); + return result; + } + + private void find(int result[], boolean used[], int start, int n, int m) { + if(1 == m) { + fillupRemaining(result, used, start); + return; + } + int index = binarySearch(m, start + 1, n, factorial(n - start - 1)); + int i = nthUnused(used, index); + used[i] = true; + result[start] = i + 1; + find(result, used, start + 1, n, m - (index-1)*factorial(n - start - 1)); + } + + private int binarySearch(int m, int start, int end, int factorial) { + int i = 1; + int j = end - start + 1; + while (i <= j) { + int middle = (i + j)/2; + if (factorial*(middle) >= m && factorial*(middle - 1) < m) { + return middle; + } else if (factorial*middle < m){ + i = middle + 1; + } else { + j = middle - 1; + } + } + throw new IllegalArgumentException(); + } + private void fillupRemaining(int result[], boolean used[], int index) { + int j = 0; + for(int i = index; i < result.length; i++) { + while (true) { + if (!used[j]) { + result[i] = j + 1; + used[j] = true; + break; + } + j++; + } + } + } + + private int nthUnused(boolean used[], int n) { + int unused = 0; + for ( int i = 0; i < used.length; i++) { + if (!used[i]) { + unused++; + if (unused == n) { + return i; + } + } + } + throw new IllegalArgumentException(); + } + + private int factorial(int n) { + int result = 1; + for ( int i = 1; i <= n; i++) { + result = result*i; + } + return result; + } + + public static void main(String args[]) { + MthNumberInNSizeArray mn = new MthNumberInNSizeArray(); + int n = 5; + int m = 120; + for ( int i = 1; i <= m; i++) { + int result[] = mn.find(n, i); + Arrays.stream(result).forEach(r -> System.out.print(r + " ")); + System.out.print("\n"); + } + } +} + + diff --git a/showmecode_100/java/com/interview/number/NBy2PairSumToK.java b/showmecode_100/java/com/interview/number/NBy2PairSumToK.java new file mode 100644 index 00000000..0eb771f4 --- /dev/null +++ b/showmecode_100/java/com/interview/number/NBy2PairSumToK.java @@ -0,0 +1,39 @@ +package com.interview.number; + +/** + * Write a program to determine whether n/2 distinctive pairs can be formed + * from given n integers where n is even and each pair's sum is divisible by given k. + * Numbers cannot be repeated in the pairs, that means only you can form total n/2 pairs. + */ +public class NBy2PairSumToK { + + //assuming input is from 1 to n. If input can contain 0 special logic will be needed + //to handle that. + public boolean pair(int input[],int k){ + int count[] = new int[k]; + for(int i=0; i < input.length; i++){ + count[input[i]%k]++; + } + + if(count[0]%2 != 0){ + return false; + } + if(k%2==0){ + if(count[k/2]%2 != 0){ + return false; + } + } + for(int i=1; i <= k/2; i++){ + if(count[i] != count[k-i]){ + return false; + } + } + return true; + } + + public static void main(String args[]){ + int input[] = {5,7,6,8,2,6,10,4}; + NBy2PairSumToK nb = new NBy2PairSumToK(); + System.out.println(nb.pair(input, 6)); + } +} diff --git a/showmecode_100/java/com/interview/number/NextLargestPalindrome.java b/showmecode_100/java/com/interview/number/NextLargestPalindrome.java new file mode 100644 index 00000000..2786ab1e --- /dev/null +++ b/showmecode_100/java/com/interview/number/NextLargestPalindrome.java @@ -0,0 +1,68 @@ +package com.interview.number; + +/** + http://www.geeksforgeeks.org/given-a-number-find-next-smallest-palindrome-larger-than-this-number/ + */ +public class NextLargestPalindrome { + + public void nextPalindrome(int num[]){ + + int mid = num.length/2; + + int i = mid-1; + int j = num.length % 2 == 0 ? mid : mid+1; + + while(i >= 0 && j <= num.length-1 && num[i] == num[j]){ + i--; + j++; + } + + boolean leftSmaller = false; + if(i < 0 || num[i] < num[j]){ + leftSmaller = true; + } + + if(!leftSmaller){ + while(i >= 0){ + num[j] = num[i]; + i--; + j++; + } + }else{ + int carry =0; + if(num.length % 2 != 0){ + num[mid] = num[mid] + 1; + carry = num[mid]/10; + num[mid] = num[mid]%10; + j = mid+1; + }else{ + j = mid; + carry = 1; + } + i = mid-1; + while(i >= 0){ + num[i] = carry + num[i]; + carry = num[i]/10; + num[i] = num[i]%10; + num[j] = num[i]; + i--; + j++; + } + } + } + + public void printArray(int num[]){ + for(int i=0; i < num.length; i++){ + System.out.print(num[i] + " "); + } + } + + public static void main(String args[]){ + + NextLargestPalindrome nextLargestPalindrom = new NextLargestPalindrome(); + int num[] = {6,5,4,4,5,6}; + //handle case of 999 separately + nextLargestPalindrom.nextPalindrome(num); + nextLargestPalindrom.printArray(num); + } +} diff --git a/showmecode_100/java/com/interview/number/NotIncluding4.java b/showmecode_100/java/com/interview/number/NotIncluding4.java new file mode 100644 index 00000000..fec73c5f --- /dev/null +++ b/showmecode_100/java/com/interview/number/NotIncluding4.java @@ -0,0 +1,35 @@ +package com.interview.number; + +/** + * http://saikatd.wordpress.com/author/saikatd/page/4/ + * In a number system where 4 is not there, how do you convert such a number system to decimal + * Here basically we have base 9 and convert it to base 10. Just be careful when you convert + * anything from 5 to 9 because they are basically 4 to 8 in base 9 system. So subtract them + * by 1 when doing multiplications. + */ +public class NotIncluding4 { + + public int number(int chinaNumber){ + + int result = 0; + int mul = 1; + while(chinaNumber > 0){ + int r = chinaNumber % 10; + chinaNumber /= 10; + if(r == 4){ + throw new IllegalArgumentException(); + } + if(r >=5){ + r--; + } + result += r*mul; + mul = mul*9; + } + return result; + } + + public static void main(String args[]){ + NotIncluding4 ni = new NotIncluding4(); + System.out.print(ni.number(16)); + } +} diff --git a/showmecode_100/java/com/interview/number/NumberOfCombinationsForStairs.java b/showmecode_100/java/com/interview/number/NumberOfCombinationsForStairs.java new file mode 100644 index 00000000..49c03a0a --- /dev/null +++ b/showmecode_100/java/com/interview/number/NumberOfCombinationsForStairs.java @@ -0,0 +1,51 @@ +package com.interview.number; + +import java.util.Iterator; +import java.util.LinkedList; + + +/** + * A man is walking up a set of stairs. He can either take 1 or 2 steps at a time. + * Given n number of steps, + * find out how many combinations of steps he can take to reach the top of the stairs. + * Its like building a fibonaaci series but instead of looking back 2 you have to + * look back k elements + */ +public class NumberOfCombinationsForStairs { + + /** + * Assumption is k is always greater than or equal to 2 + */ + public int numberOfWays(int n,int k){ + if(k < 2){ + throw new IllegalArgumentException(); + } + LinkedList queue = new LinkedList(); + queue.add(1); + queue.add(2); + int count=0; + for(int i=2; i < k ; i++){ + Iterator itr = queue.iterator(); + count = 0; + while(itr.hasNext()){ + count += itr.next(); + } + queue.offerLast(count); + } + for(int i = k; i < n ; i++){ + Iterator itr = queue.iterator(); + count = 0; + while(itr.hasNext()){ + count += itr.next(); + } + queue.pollFirst(); + queue.offerLast(count); + } + return queue.pollLast(); + } + + public static void main(String args[]){ + NumberOfCombinationsForStairs noc = new NumberOfCombinationsForStairs(); + System.out.println(noc.numberOfWays(7, 4)); + } +} diff --git a/showmecode_100/java/com/interview/number/PermutationBiggerThanNumber.java b/showmecode_100/java/com/interview/number/PermutationBiggerThanNumber.java new file mode 100644 index 00000000..b294ac3a --- /dev/null +++ b/showmecode_100/java/com/interview/number/PermutationBiggerThanNumber.java @@ -0,0 +1,69 @@ +package com.interview.number; + +import com.interview.sort.QuickSort; + +/** + * Date 02/17/2016 + * @author Tushar Roy + * Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. + * If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). + * + * Time complexity is O(n) + * Space complexity is O(1) + * + * https://leetcode.com/problems/next-permutation/ + * e.g 1 7 9 8 4 will transform to 1 8 4 7 9 + * or 4 2 6 4 3 will transform to 4 3 2 4 6 + */ +public class PermutationBiggerThanNumber { + + public void nextPermutation(int[] nums) { + int i; + for (i = nums.length - 2; i >= 0 ; i--) { + if (nums[i] < nums[i + 1]) { + break; + } + } + + if (i != -1) { + int pos = ceiling(nums[i], i + 1, nums.length - 1, nums); + int t = nums[pos]; + nums[pos] = nums[i]; + nums[i] = t; + } + reverse(nums, i + 1, nums.length - 1); + } + + private void reverse(int nums[], int start, int end) { + while (start <= end) { + int t = nums[start]; + nums[start] = nums[end]; + nums[end] = t; + start++; + end--; + } + } + + private int ceiling(int val, int start, int end, int[] nums) { + while (start <= end) { + int middle = (start + end)/2; + if (nums[middle] > val && (middle + 1 == nums.length || nums[middle+1] <= val)) { + return middle; + } else if (nums[middle] > val) { + start = middle + 1; + } else { + end = middle - 1; + } + } + throw new IllegalArgumentException(); + } + + public static void main(String args[]){ + PermutationBiggerThanNumber pb = new PermutationBiggerThanNumber(); + int arr[] = {1,7,9,8,4}; + pb.nextPermutation(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i] + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/number/PermutationLargerThanGivenArray.java b/showmecode_100/java/com/interview/number/PermutationLargerThanGivenArray.java new file mode 100644 index 00000000..23307a29 --- /dev/null +++ b/showmecode_100/java/com/interview/number/PermutationLargerThanGivenArray.java @@ -0,0 +1,93 @@ +package com.interview.number; + +import java.util.Arrays; + +/** + * e.g if src array is {1,2,5,7,8} and dest is {5,8,1,9,8} + * permute src in such a way that it is greater than dest but diff is minimal + * so here we will have {5,8,2,1,7} + * + */ +public class PermutationLargerThanGivenArray { + + public int[] findBiggerNumber(int src[],int dest[]){ + int result[] = new int[src.length]; + boolean[] used = new boolean[src.length]; + boolean r = findNumber(src, dest, result, 0, used); + if(!r){ + return null; + } + return result; + } + + private void sortRemaining(int src[],int result[],boolean used[],int pos){ + int pos1 = pos; + for(int i=0; i < src.length; i++){ + if(!used[i]){ + result[pos1] = src[i]; + pos1++; + } + } + Arrays.sort(result,pos,result.length); + } + + private boolean findNumber(int src[],int dest[],int result[],int pos,boolean used[]){ + + if(pos == result.length){ + return false; + } + + boolean hasEqual = false; + int nextGreaterIndex = -1; + int equalIndex = -1; + int nextGreaterDiff = Integer.MAX_VALUE; + for(int i=0; i < src.length; i++){ + if(used[i]){ + continue; + } + if(dest[pos] == src[i]){ + hasEqual = true; + equalIndex = i; + continue; + } + if(src[i] > dest[pos]){ + if(src[i] - dest[pos] < nextGreaterDiff){ + nextGreaterIndex = i; + nextGreaterDiff = src[i] - dest[pos]; + } + } + } + //first try with equal item and see next numbers in array might find larger one. + //if it fail try next larger number + if(hasEqual){ + used[equalIndex] = true; + result[pos] = src[equalIndex]; + if(findNumber(src,dest,result,pos+1,used)){ + return true; + } + used[equalIndex] = false; + } + if(nextGreaterIndex != -1){ + used[nextGreaterIndex] = true; + result[pos] = src[nextGreaterIndex]; + sortRemaining(src, result, used, pos+1); + return true; + } + return false; + } + + public static void main(String args[]){ + int src[] = {1,2,5,7,8}; + int dest[] = {5,8,1,9,8}; + PermutationLargerThanGivenArray nld = new PermutationLargerThanGivenArray(); + int result[] = nld.findBiggerNumber(src, dest); + if(result != null){ + for(int i=0; i < result.length; i++){ + System.out.print(result[i] + " "); + } + }else{ + System.out.println("Cant find bigger permutation"); + } + } + +} diff --git a/showmecode_100/java/com/interview/number/PowerFunction.java b/showmecode_100/java/com/interview/number/PowerFunction.java new file mode 100644 index 00000000..af3024f5 --- /dev/null +++ b/showmecode_100/java/com/interview/number/PowerFunction.java @@ -0,0 +1,58 @@ +package com.interview.number; + +/** + * Date 03/13/2016 + * @author Tushar Roy + * + * Find power of 2 numbers. + * + * Time complexity O(logn) + * Space complexity O(1) + * + * https://leetcode.com/problems/powx-n/ + * http://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/ + */ +public class PowerFunction { + + public int power(int n, int m){ + if(m == 0){ + return 1; + } + int pow = power(n,m/2); + if(m % 2 ==0){ + return pow*pow; + }else{ + return n*pow*pow; + } + } + + + public double powerUsingBit(double x, int n) { + if (n == 0) { + return 1; + } + long r = n; + if (r < 0) { + x = 1/x; + r = -r; + } + double power = x; + double result = x; + double result1 = 1; + while (r > 1) { + result *= result; + if ((r & 1) != 0) { + result1 = result1 * power; + } + r = r >> 1; + power = power * power; + } + return result * result1; + } + + public static void main(String args[]){ + PowerFunction pf = new PowerFunction(); + long pow = pf.power(3, 5); + System.out.print(pow); + } +} diff --git a/showmecode_100/java/com/interview/number/RearrangeNumberInArrayToFormLargestNumber.java b/showmecode_100/java/com/interview/number/RearrangeNumberInArrayToFormLargestNumber.java new file mode 100644 index 00000000..6841470c --- /dev/null +++ b/showmecode_100/java/com/interview/number/RearrangeNumberInArrayToFormLargestNumber.java @@ -0,0 +1,67 @@ +package com.interview.number; + +import java.util.Arrays; +import java.util.Comparator; + +/** + * Given a list of non negative integers, arrange them such that they form the largest number. + * For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. + * + * https://leetcode.com/problems/largest-number/ + */ +public class RearrangeNumberInArrayToFormLargestNumber { + + public String largestNumber(int[] nums) { + Integer[] nums1 = new Integer[nums.length]; + int i = 0; + for (int n : nums) { + nums1[i++] = n; + } + + IntegerComparator comparator = new IntegerComparator(); + Arrays.sort(nums1, comparator); + StringBuffer buff = new StringBuffer(); + + //handle 0s in the front by removing them. + for (i = 0; i < nums1.length; i++) { + if (nums1[i] != 0) { + break; + } + } + //if no element is left means return one 0 + if (i == nums1.length) { + return "0"; + } + for (;i < nums1.length; i++) { + buff.append(nums1[i]); + } + return buff.toString(); + } + + public static void main(String args[]){ + RearrangeNumberInArrayToFormLargestNumber rni = new RearrangeNumberInArrayToFormLargestNumber(); + int[] input = {999999998, 999999997, 999999999}; + int[] input1 = {0, 9, 8}; + int[] input2 = {0, 0}; + + String result = rni.largestNumber(input2); + System.out.print(result); + } + + class IntegerComparator implements Comparator { + @Override + public int compare(Integer o1, Integer o2) { + int pow1 = 10; + while(pow1 <= o1){ + pow1 *= 10; + } + int pow2 = 10; + while(pow2 <= o2){ + pow2 *= 10; + } + int r1 = o1*pow2 + o2; + int r2 = o2*pow1 + o1; + return r2 - r1; + } + } +} diff --git a/showmecode_100/java/com/interview/number/RussianPeasantMultiplication.java b/showmecode_100/java/com/interview/number/RussianPeasantMultiplication.java new file mode 100644 index 00000000..fb2cbe33 --- /dev/null +++ b/showmecode_100/java/com/interview/number/RussianPeasantMultiplication.java @@ -0,0 +1,27 @@ +package com.interview.number; + +/** + * http://www.geeksforgeeks.org/fast-multiplication-method-without-using-multiplication-operator-russian-peasants-algorithm/ + * Test cases + * Division by 0 + * Negative numbers + */ +public class RussianPeasantMultiplication { + + public int multiply(int a,int b){ + int res = 0; + while(b > 0){ + if(b % 2 != 0){ + res += a; + } + a = a<<1; + b = b>>1; + } + return res; + } + + public static void main(String args[]){ + RussianPeasantMultiplication rpm = new RussianPeasantMultiplication(); + System.out.println(rpm.multiply(7, 13)); + } +} diff --git a/showmecode_100/java/com/interview/number/SmallestNumberGreaterThanGiveNumberIncreasingSequence.java b/showmecode_100/java/com/interview/number/SmallestNumberGreaterThanGiveNumberIncreasingSequence.java new file mode 100644 index 00000000..aef9315f --- /dev/null +++ b/showmecode_100/java/com/interview/number/SmallestNumberGreaterThanGiveNumberIncreasingSequence.java @@ -0,0 +1,89 @@ +package com.interview.number; + +/** + * http://www.careercup.com/question?id=4857362737266688 + * Test cases : + * 6 2 3 -> 6 7 8 + * 1 2 3 -> 1 2 4 + * 1,7,9 -> 1,8,9 + * 1,8,9 -> 2,3,4 + * 9,8,7 -> 1,2,3,4 + * 2,6 -> 2,7 + */ +public class SmallestNumberGreaterThanGiveNumberIncreasingSequence { + + public int[] getNextInt(int []input){ + int result[] = new int[input.length]; + boolean flag = getNextInt(input,result,0); + if(flag){ + return result; + }else{ + result = new int[input.length+1]; + fillRestOfArray(result, 0, (input[0] +1)%9); + return result; + } + } + + private boolean getNextInt(int input[], int result[], int pos){ + if(pos == input.length-1){ + int higher = getHigherNumber(input[pos]+1,pos,input.length); + if(higher == -1){ + return false; + }else{ + result[pos] = input[pos]+1; + return true; + } + } + + if(pos != 0 && input[pos] <= input[pos-1]){ + int higher = getHigherNumber(input[pos-1] +1,pos,input.length); + if(higher == -1){ + return false; + }else{ + fillRestOfArray(result, pos, input[pos-1]+1); + return true; + } + } + if(input[pos] + (input.length - 1 -pos) <=9){ + result[pos] = input[pos]; + boolean flag = getNextInt(input,result,pos+1); + if(flag){ + return true; + } + int higher = getHigherNumber(input[pos]+1,pos,input.length); + if(higher == -1){ + return false; + }else{ + fillRestOfArray(result,pos,input[pos]+1); + return true; + } + + }else{ + return false; + } + + } + + private void fillRestOfArray(int result[],int pos,int val){ + for(int i=pos; i < result.length ; i++){ + result[i] = val; + val++; + } + } + + private int getHigherNumber(int input, int i, int len){ + if(input + len - i-1 <=9){ + return input; + } + return -1; + } + + public static void main(String args[]){ + int arr[] = {2,6}; + SmallestNumberGreaterThanGiveNumberIncreasingSequence sm = new SmallestNumberGreaterThanGiveNumberIncreasingSequence(); + int result[] = sm.getNextInt(arr); + for(int i : result){ + System.out.print(i); + } + } +} diff --git a/showmecode_100/java/com/interview/number/SquareRoot.java b/showmecode_100/java/com/interview/number/SquareRoot.java new file mode 100644 index 00000000..c527d6ef --- /dev/null +++ b/showmecode_100/java/com/interview/number/SquareRoot.java @@ -0,0 +1,23 @@ +package com.interview.number; + +/** + * Babylonian method for calculating square root + */ +public class SquareRoot { + + double findRoot(int num){ + double start =0; + double end = num; + while(Math.abs(start - end) > 0.01){ + end = (start + end)/2; + start = num/end; + } + + return end; + } + + public static void main(String args[]){ + SquareRoot sr = new SquareRoot(); + System.out.println(sr.findRoot(144)); + } +} diff --git a/showmecode_100/java/com/interview/number/StrobogrammaticNumber.java b/showmecode_100/java/com/interview/number/StrobogrammaticNumber.java new file mode 100644 index 00000000..e1dbe8c4 --- /dev/null +++ b/showmecode_100/java/com/interview/number/StrobogrammaticNumber.java @@ -0,0 +1,26 @@ +package com.interview.number; + +/** + * A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down). + * https://leetcode.com/problems/strobogrammatic-number/ + */ +public class StrobogrammaticNumber { + public boolean isStrobogrammatic(String num) { + + for (int i = 0; i <= num.length()/2; i++) { + char ch1 = num.charAt(i); + char ch2 = num.charAt(num.length() - i - 1); + + if (ch1 != ch2) { + if ((ch1 != '9' || ch2 != '6') && (ch1 != '6' || ch2 != '9')) { + return false; + } + } else { + if (ch1 != '0' && ch1 != '1' && ch1 != '8') { + return false; + } + } + } + return true; + } +} diff --git a/showmecode_100/java/com/interview/number/Trailing0sinFactorial.java b/showmecode_100/java/com/interview/number/Trailing0sinFactorial.java new file mode 100644 index 00000000..8682a12c --- /dev/null +++ b/showmecode_100/java/com/interview/number/Trailing0sinFactorial.java @@ -0,0 +1,28 @@ +package com.interview.number; + +/** + * 150qs hard section + * lets consider 625. First we divide 625 by 5 and that takes care of one 5 + * till 625. Then we divide 625 with 25 and that takes care of numbers with 2 + * 5s. We keep doing this till divisor becomes greater than number. + */ +public class Trailing0sinFactorial { + + public int trailing0s(int num){ + int pow = 5; + int count = 0; + while(pow <= num){ + count += num/pow; + pow *= 5; + } + return count; + } + + public static void main(String args[]){ + Trailing0sinFactorial t0 = new Trailing0sinFactorial(); + System.out.println(t0.trailing0s(625)); + System.out.println(t0.trailing0s(146)); + System.out.println(t0.trailing0s(1046)); + System.out.println(t0.trailing0s(4617)); + } +} diff --git a/showmecode_100/java/com/interview/number/UniquePartitionOfInteger.java b/showmecode_100/java/com/interview/number/UniquePartitionOfInteger.java new file mode 100644 index 00000000..a2e8fe17 --- /dev/null +++ b/showmecode_100/java/com/interview/number/UniquePartitionOfInteger.java @@ -0,0 +1,38 @@ +package com.interview.number; + +import java.util.ArrayList; +import java.util.List; + +/** + * http://www.geeksforgeeks.org/generate-unique-partitions-of-an-integer/ + * Test cases: + * 0 or negative number + */ +public class UniquePartitionOfInteger { + + public void partition(int n){ + List result = new ArrayList(); + partition(n,n,result); + } + + private void partition(int n, int max,List result){ + if(n < 0){ + return ; + } + if(n == 0){ + result.forEach(i -> System.out.print(i + " ")); + System.out.println(); + return; + } + for(int i=Math.min(n, max); i > 0 && i <= max; i--){ + result.add(i); + partition(n-i,i, result); + result.remove(result.size()-1); + } + } + + public static void main(String args[]){ + UniquePartitionOfInteger upi = new UniquePartitionOfInteger(); + upi.partition(12); + } +} diff --git a/showmecode_100/java/com/interview/playground/TestInnerClass.java b/showmecode_100/java/com/interview/playground/TestInnerClass.java new file mode 100644 index 00000000..7644b261 --- /dev/null +++ b/showmecode_100/java/com/interview/playground/TestInnerClass.java @@ -0,0 +1,36 @@ +package com.interview.playground; + +import java.util.Random; + +/** + * Created by tushar_v_roy on 5/18/16. + */ +public class TestInnerClass { + + int t = 20; + Random random; + public Okay test() { + final int r = 10; + return + random::nextInt; + + } + + public void test1() { + random = new Random(); + Okay o1 = test(); + System.out.print(o1.next()); + Okay o2 = test(); + random = null; + System.out.print(o2.next()); + } + + public static void main(String args[]) { + TestInnerClass testInnerClass = new TestInnerClass(); + testInnerClass.test1(); + } +} + +interface Okay { + int next(); +} diff --git a/showmecode_100/java/com/interview/random/Rand7UsingRand5.java b/showmecode_100/java/com/interview/random/Rand7UsingRand5.java new file mode 100644 index 00000000..e31618fd --- /dev/null +++ b/showmecode_100/java/com/interview/random/Rand7UsingRand5.java @@ -0,0 +1,23 @@ +package com.interview.random; + +public class Rand7UsingRand5 { + + public int rand7(){ + int r = (rand5()-1)*5 + rand5(); + while(r > 21){ // I just need to ignore [22, 25] + r = (rand5()-1)*5 + rand5(); + } + return (r%7) + 1; + } + + private int rand5(){ + return (int)(Math.ceil(Math.random()*5)); + } + + public static void main(String args[]){ + Rand7UsingRand5 rr = new Rand7UsingRand5(); + for(int i=0; i < 10; i++){ + System.out.print(rr.rand7()); + } + } +} diff --git a/showmecode_100/java/com/interview/random/RandomCountrySelectionByPopluation.java b/showmecode_100/java/com/interview/random/RandomCountrySelectionByPopluation.java new file mode 100644 index 00000000..a7e78a2e --- /dev/null +++ b/showmecode_100/java/com/interview/random/RandomCountrySelectionByPopluation.java @@ -0,0 +1,41 @@ +package com.interview.random; + +public class RandomCountrySelectionByPopluation { + + public int getRandom(int []arr){ + int sum[] = new int[arr.length]; + sum[0] = arr[0]; + int n = arr[0]; + for(int i=1; i < sum.length; i++){ + sum[i] = sum[i-1] + arr[i]; + n += arr[i]; + } + + int ran = (int)(Math.random()*n + 1); + + int low = 0; + int high = arr.length-1; + int mid = (high + low)/2; + while(true){ + if(sum[mid] >= ran && (mid-1 == -1 || sum[mid-1] < ran)){ + break; + } + if(sum[mid] > ran){ + high = mid-1; + }else{ + low = mid+1; + } + mid = (high + low)/2; + } + return mid; + } + + public static void main(String args[]){ + + RandomCountrySelectionByPopluation rcsp = new RandomCountrySelectionByPopluation(); + int arr[] = {5,5,2,3,7,1}; + for(int i=0; i < 10; i++){ + System.out.print(rcsp.getRandom(arr)); + } + } +} diff --git a/showmecode_100/java/com/interview/random/SelectMRandomNumbersInStream.java b/showmecode_100/java/com/interview/random/SelectMRandomNumbersInStream.java new file mode 100644 index 00000000..fe01f2e1 --- /dev/null +++ b/showmecode_100/java/com/interview/random/SelectMRandomNumbersInStream.java @@ -0,0 +1,32 @@ +package com.interview.random; + +/** + * Reservoir Sampling + * 150qs 18.3 + */ +public class SelectMRandomNumbersInStream { + + public int[] selectRandom(int arr[],int m){ + int result[] = new int[m]; + for(int i=0; i < m ;i++){ + result[i] = arr[i]; + } + + for(int i=m ; i < arr.length; i++){ + int random = (int)(Math.random()*i) + 1; + if(random <= m){ + result[random-1] = arr[i]; + } + } + return result; + } + + public static void main(String args[]){ + SelectMRandomNumbersInStream srn = new SelectMRandomNumbersInStream(); + int arr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13}; + int result[] = srn.selectRandom(arr, 5); + for(int i=0; i < result.length; i++){ + System.out.print(result[i] + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/random/ShuffleArray.java b/showmecode_100/java/com/interview/random/ShuffleArray.java new file mode 100644 index 00000000..bf07bacf --- /dev/null +++ b/showmecode_100/java/com/interview/random/ShuffleArray.java @@ -0,0 +1,36 @@ +package com.interview.random; + +/** + * Shuffle deck of cards + * 150 qs 18.2 + */ +public class ShuffleArray { + + public void shuffle(int arr[]){ + for(int i=arr.length-1; i>=0; i--){ + int random = (int)(Math.random()*(i+1)) ; + System.out.print(random + " "); + swap(arr,random,i); + } + } + + private void swap(int arr[],int a,int b){ + int temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; + } + + public static void main(String args[]){ + int arr[] = {1,2,3,4,5,6,7,8}; + ShuffleArray sa = new ShuffleArray(); + sa.shuffle(arr); + System.out.println(); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i] + " "); + } + + for(int i=0; i < arr.length; i++){ + System.out.println((int)(Math.random()*10) + 1); + } + } +} diff --git a/showmecode_100/java/com/interview/recursion/AllAdjacentCombination.java b/showmecode_100/java/com/interview/recursion/AllAdjacentCombination.java new file mode 100644 index 00000000..a3641d37 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/AllAdjacentCombination.java @@ -0,0 +1,45 @@ +package com.interview.recursion; + +/** + * Generate all combination of size k and less of adjacent numbers + * e.g 1,2,3,4 k = 2 + * 1 2 3 4 + * 12 3 4 + * 1 23 4 + * 1 2 3 34 + * 12 34 + * @author tusroy + * + */ +public class AllAdjacentCombination { + + public void combination(int input[],int result[],int k,int pos,int r){ + + if(pos == input.length){ + for(int i=0; i < r ; i++){ + System.out.print(result[i] + " "); + } + System.out.println(); + return; + } + for(int i=pos; i < pos + k && i < input.length; i++ ){ + result[r] = formNumber(input,pos,i); + combination(input,result,k,i+1,r+1); + } + } + + private int formNumber(int input[], int start, int end){ + int num = 0; + for(int i=start; i <=end; i++){ + num = num*10 + input[i]; + } + return num; + } + + public static void main(String args[]){ + AllAdjacentCombination adc = new AllAdjacentCombination(); + int input[] = {1,2,3,4,5}; + int result[] = new int[input.length]; + adc.combination(input,result,3,0,0); + } +} diff --git a/showmecode_100/java/com/interview/recursion/Bracketology.java b/showmecode_100/java/com/interview/recursion/Bracketology.java new file mode 100644 index 00000000..87756e0b --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/Bracketology.java @@ -0,0 +1,97 @@ +package com.interview.recursion; + +import java.util.Deque; +import java.util.LinkedList; + +public class Bracketology { + + public boolean matchBracket(char str[],int openCount,int pos){ + + if(str.length == pos){ + if(openCount == 0){ + return true; + } + return false; + } + + if(str[pos] == '('){ + openCount++; + }else{ + openCount--; + } + if(openCount < 0){ + return false; + } + + return matchBracket(str,openCount,pos+1); + + } + + private void printArray(char result[]){ + for(int i=0; i < result.length; i++){ + System.out.print(result[i]); + } + System.out.println(); + } + + public void bracketPermutation(char result[],int n, int pos,int openCount,int closeCount){ + if(pos == 2*n){ + printArray(result); + return; + } + if(openCount < n){ + result[pos] = '('; + bracketPermutation(result, n, pos+1,openCount+1,closeCount); + } + if(closeCount < openCount){ + result[pos] = ')'; + bracketPermutation(result, n, pos+1, openCount, closeCount+1); + } + } + + public boolean matchBracket(char []brackets){ + Deque stack = new LinkedList(); + + for(Character ch : brackets){ + char checkChar = getOpeningCharacter(ch); + if(checkChar == 0){ + stack.addFirst(ch); + }else{ + if(stack.size() == 0 || stack.peek() != checkChar){ + return false; + }else{ + stack.pop(); + } + } + } + if(stack.size() > 0){ + return false; + } + return true; + + } + + private Character getOpeningCharacter(char ch){ + switch(ch){ + case ')' : return '('; + case ']' : return '['; + case '}' : return '{'; + default : return 0; + } + + } + + + public static void main(String args[]){ + + Bracketology matcher = new Bracketology(); + //System.out.print(matcher.matchBracket("(())())".toCharArray(), 0, 0)); + int n=4; + char result[] = new char[n*2]; +// matcher.bracketPermutation(result, n, 0, 0, 0); + + System.out.println(matcher.matchBracket("[({()}{}[])]".toCharArray())); + } + + +} diff --git a/showmecode_100/java/com/interview/recursion/ChainWordsToFormCircle.java b/showmecode_100/java/com/interview/recursion/ChainWordsToFormCircle.java new file mode 100644 index 00000000..060cc523 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/ChainWordsToFormCircle.java @@ -0,0 +1,75 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * http://www.geeksforgeeks.org/given-array-strings-find-strings-can-chained-form-circle/ + * Test cases: + * Empty input + * 1 element in input + * no chain formed + * chain formed + */ +public class ChainWordsToFormCircle { + + public List formCircle(String input[]){ + List result = new ArrayList(); + //since chain is a circle any point can be the start point of the chain. + //We make input[0] as start point + result.add(input[0]); + boolean used[] = new boolean[input.length]; + boolean r = formCircle(input,result,used,input[0].charAt(0)); + if(!r){ + return Collections.emptyList(); + } + return result; + } + + //we keep track of first char of the chain and the end compare that with last char of last element of the chain + private boolean formCircle(String input[], List result,boolean used[],char firstChar){ + if(input.length == result.size()){ + String str = result.get(result.size()-1); + if(firstChar == str.charAt(str.length()-1)){ + return true; + } + return false; + } + String str = result.get(result.size()-1); + char lastChar = str.charAt(str.length()-1); + for(int i=1; i < input.length; i++){ + if(used[i]){ + continue; + + } + if(lastChar == input[i].charAt(0)){ + used[i] = true; + result.add(input[i]); + boolean r = formCircle(input,result,used,firstChar); + if(r){ + return true; + } + used[i] = false; + result.remove(result.size()-1); + } + + } + return false; + } + + public static void main(String args[]){ + String notChaininput[] = {"geeks","king", "seeks", "sing","gik","kin"}; + String chainInput[] = {"king","gik","geeks", "seeks", "sing"}; + ChainWordsToFormCircle cwt = new ChainWordsToFormCircle(); + List result = cwt.formCircle(chainInput); + if(result.size() == 0){ + System.out.println("Not able to form a chain"); + }else{ + for(String chainNode : result){ + System.out.print(chainNode + " "); + } + } + } + +} diff --git a/showmecode_100/java/com/interview/recursion/Combination.java b/showmecode_100/java/com/interview/recursion/Combination.java new file mode 100644 index 00000000..1da85fce --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/Combination.java @@ -0,0 +1,77 @@ +package com.interview.recursion; + +import java.util.*; + +public class Combination { + + public void combination(char input[]){ + Map countMap = new TreeMap<>(); + for (char ch : input) { + countMap.compute(ch, (key, val) -> { + if (val == null) { + return 1; + } else { + return val + 1; + } + }); + } + char str[] = new char[countMap.size()]; + int count[] = new int[countMap.size()]; + int index = 0; + for (Map.Entry entry : countMap.entrySet()) { + str[index] = entry.getKey(); + count[index] = entry.getValue(); + index++; + } + char[] output = new char[input.length]; + combination(str, count, 0, output, 0); + } + + private void combination(char input[],int count[],int pos, char output[],int len){ + print(output, len); + for(int i=pos; i < input.length; i++){ + if (count[i] == 0) { + continue; + } + output[len] = input[i]; + count[i]--; + combination(input, count, i, output, len + 1); + count[i]++; + } + } + + private void print(char result[],int pos){ + for(int i=0; i < pos; i++){ + System.out.print(result[i] + " "); + } + System.out.println(); + } + + public void combinationEasy(char[] input) { + List r = new ArrayList<>(); + Arrays.sort(input); + combinationEasy(input, 0, r); + } + + private void combinationEasy(char[] input, int pos, List r) { + + r.forEach(r1 -> System.out.print(r1 + " ")); + System.out.println(); + for (int i = pos; i < input.length; i++) { + if (i != pos && input[i] == input[i-1]) { + continue; + } + r.add(input[i]); + combinationEasy(input, i + 1, r); + r.remove(r.size() - 1); + } + } + + public static void main(String args[]){ + Combination c = new Combination(); + c.combination("aabbc".toCharArray()); + c.combinationEasy("aabbc".toCharArray()); + + } + +} diff --git a/showmecode_100/java/com/interview/recursion/CombinationOfSizeK.java b/showmecode_100/java/com/interview/recursion/CombinationOfSizeK.java new file mode 100644 index 00000000..8a8dc8e1 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/CombinationOfSizeK.java @@ -0,0 +1,32 @@ +package com.interview.recursion; + +/** + * http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/ + */ +public class CombinationOfSizeK { + + public void combination(int arr[],int k){ + int result[] = new int[k]; + combinationUtil(arr,k,0,result,0); + } + + private void combinationUtil(int arr[],int k, int pos,int result[],int start){ + if(pos == k){ + for(int i=0; i < k; i++){ + System.out.print(result[i] + " "); + } + System.out.print("\n"); + return; + } + for(int i=start; i < arr.length; i++){ + result[pos] = arr[i]; + combinationUtil(arr,k,pos+1,result,i+1); + } + } + + public static void main(String args[]){ + CombinationOfSizeK kk = new CombinationOfSizeK(); + int arr[] = {1,2,3,4}; + kk.combination(arr, 2); + } +} diff --git a/showmecode_100/java/com/interview/recursion/CombinationWithStar.java b/showmecode_100/java/com/interview/recursion/CombinationWithStar.java new file mode 100644 index 00000000..8037de91 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/CombinationWithStar.java @@ -0,0 +1,44 @@ +package com.interview.recursion; + +/** + * e.g a, b c + * * * * + * a * * + * a b * + * a b c + * * b * + * * b c + * * * c + * + * Idea is to store the index of values in used[] array. So just + * like regular combination if used is set print it else print * + */ +public class CombinationWithStar { + + public void combine(char input[], int pos, boolean used[]){ + printArray(input, used); + for(int i= pos; i < input.length; i++){ + used[i] = true; + combine(input, i+1, used); + used[i] = false; + } + } + + private void printArray(char result[], boolean used[]){ + for(int i=0; i < used.length; i++){ + if(used[i]){ + System.out.print(result[i] + " "); + }else{ + System.out.print("* "); + } + } + System.out.println(); + } + + public static void main(String args[]){ + char input[] = {'a','b','c','d'}; + CombinationWithStar cws = new CombinationWithStar(); + boolean used[] = new boolean[input.length]; + cws.combine(input, 0, used); + } +} diff --git a/showmecode_100/java/com/interview/recursion/DifferentWaysToAddParentheses.java b/showmecode_100/java/com/interview/recursion/DifferentWaysToAddParentheses.java new file mode 100644 index 00000000..ecaefa3d --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/DifferentWaysToAddParentheses.java @@ -0,0 +1,63 @@ +package com.interview.recursion; + +import java.util.*; + +/** + https://leetcode.com/problems/different-ways-to-add-parentheses/ + */ +public class DifferentWaysToAddParentheses { + public List diffWaysToCompute(String str) { + List operands = new ArrayList<>(); + List operators = new ArrayList<>(); + int prev = -1; + for (int i = 0; i < str.length(); i++) { + if (str.charAt(i) == '+' || str.charAt(i) == '-' || str.charAt(i) == '*') { + operands.add(Integer.parseInt(str.substring(prev + 1, i))); + operators.add(str.charAt(i)); + prev = i; + } + } + operands.add(Integer.parseInt(str.substring(prev + 1, str.length()))); + return diffWaysToComputeUtil(operands, operators, 0, operators.size() - 1); + } + + private List diffWaysToComputeUtil(List operands, List operators, int start, int end) { + if (start > end) { + if (start >= 0) { + return Collections.singletonList(operands.get(start)); + } else { + return Collections.singletonList(operands.get(end)); + } + } + List result = new ArrayList<>(); + for (int i = start; i <= end; i++) { + List leftResult = diffWaysToComputeUtil(operands, operators, start, i - 1); + List rightResult = diffWaysToComputeUtil(operands, operators, i + 1, end); + + for (int left : leftResult) { + for (int right : rightResult) { + result.add((int)operate(left, right, operators.get(i))); + } + } + } + return result; + } + + private long operate(int val1, int val2, char op) { + switch (op) { + case '+': + return val1 + val2; + case '-': + return val1 - val2; + case '*': + return val1 * val2; + } + throw new IllegalArgumentException(); + } + + public static void main(String args[]) { + DifferentWaysToAddParentheses df = new DifferentWaysToAddParentheses(); + List result = df.diffWaysToCompute("2*3-4*5"); + result.forEach(s -> System.out.println(s)); + } +} diff --git a/showmecode_100/java/com/interview/recursion/FancyShuffle.java b/showmecode_100/java/com/interview/recursion/FancyShuffle.java new file mode 100644 index 00000000..b9060982 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/FancyShuffle.java @@ -0,0 +1,78 @@ +package com.interview.recursion; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Date 07/05/2015 + * @author Tushar Roy + * + * Given an input with duplicate characters generate a shuffle which does not have + * two duplicate characters together + * + * Do regular permutation with repetition with additional constraint of keeping + * duplicates away from each other. + * + */ +public class FancyShuffle { + + public char[] shuffle(char input[]){ + char result[] = new char[input.length]; + + //create a map of character to its frequency. + Map map = new HashMap(); + for(int i=0; i < input.length; i++){ + Integer count = map.putIfAbsent(input[i], 1); + if(count != null) { + count++; + map.put(input[i], count); + } + } + char newInput[] = new char[map.size()]; + int freq[] = new int[map.size()]; + + //create a new char array and freq array from map. + int index = 0; + for(Entry entry : map.entrySet()){ + newInput[index] = entry.getKey(); + freq[index] = entry.getValue(); + index++; + } + //assuming char with ASCII value 0 does not exists in the input + shuffleUtil(newInput,freq, result, 0, (char)0); + return result; + } + + //regular permutation code. If we do find a permutation which satisfies the + //constraint then return true and stop the process. + private boolean shuffleUtil(char input[], int freq[], char result[], int pos, char lastVal) { + if(pos == result.length){ + return true; + } + + for(int i=0; i < input.length; i++){ + if(lastVal == input[i]) { + continue; + } + if(freq[i] == 0) { + continue; + } + freq[i]--; + result[pos] = input[i]; + if(shuffleUtil(input, freq, result, pos+1, input[i])){ + return true; + } + freq[i]++; + } + return false; + } + + public static void main(String args[]) { + FancyShuffle fs = new FancyShuffle(); + char result[] = fs.shuffle("bbcdaaaaa".toCharArray()); + for(char ch : result) { + System.out.print(ch); + } + } +} diff --git a/showmecode_100/java/com/interview/recursion/InterpretationOfArray.java b/showmecode_100/java/com/interview/recursion/InterpretationOfArray.java new file mode 100644 index 00000000..f515a4e7 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/InterpretationOfArray.java @@ -0,0 +1,67 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.List; + +/** + * http://www.geeksforgeeks.org/find-all-possible-interpretations/ + */ +public class InterpretationOfArray { + + public void interpret(int arr[]){ + char t[][] = new char[arr.length][2]; + for(int i=0; i < arr.length; i++){ + for(int j=0; j < 2; j++){ + t[i][j] = '0'; + } + } + for(int l=1; l <=2; l++){ + for(int i=0; i <= arr.length -l ; i++){ + int j = i + l-1; + t[i][l-1] = getRepresentation(i == j ? arr[i] : arr[i]*10 +arr[j]); + } + } + List result = new ArrayList(); + interpret(arr.length,0,result,t); + } + + private void interpret(int len,int pos,List result,char[][] t){ + if(pos== len){ + print(result); + return; + } + if(t[pos][0] != '0'){ + result.add(t[pos][0]); + interpret(len,pos+1,result,t); + result.remove(result.size()-1); + } + + if(pos+1 < len && t[pos][1] != '0'){ + result.add(t[pos][1]); + interpret(len, pos+2, result, t); + result.remove(result.size()-1); + } + + } + + private void print(List result){ + for(int i=0; i < result.size(); i++){ + System.out.print(result.get(i) + " "); + } + System.out.println(); + } + + private char getRepresentation(int number){ + if(number > 26 || number <= 0){ + return '0'; + } + return (char)('a' + number -1); + } + + public static void main(String args[]){ + int arr[] = {1,2,6,1,7}; + InterpretationOfArray ioa = new InterpretationOfArray(); + ioa.interpret(arr); + } + +} diff --git a/showmecode_100/java/com/interview/recursion/KeyPadPermutation.java b/showmecode_100/java/com/interview/recursion/KeyPadPermutation.java new file mode 100644 index 00000000..c988b0c4 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/KeyPadPermutation.java @@ -0,0 +1,48 @@ +package com.interview.recursion; + +/** + * http://stackoverflow.com/questions/2344496/how-can-i-print-out-all-possible-letter-combinations-a-given-phone-number-can-re + */ +public class KeyPadPermutation { + + public void permute(int input[]) { + char result[] = new char[input.length]; + permute(input,0,result); + } + + private void permute(int input[], int pos, char result[]) { + if (pos == input.length) { + for (int i = 0; i < result.length; i++) { + System.out.print(result[i]); + } + System.out.println(); + return; + } + + char[] str = getCharSetForNumber(input[pos]); + for (char ch : str) { + result[pos] = ch; + permute(input, pos+1, result); + } + } + + private char[] getCharSetForNumber(int num) { + switch(num){ + case 1 : return "abc".toCharArray(); + case 2 : return "def".toCharArray(); + case 3: return "ghi".toCharArray(); + case 4: return "jkl".toCharArray(); + case 5: return "mno".toCharArray(); + case 6: return "pqrs".toCharArray(); + case 8: return "tuv".toCharArray(); + case 9: return "wxyz".toCharArray(); + } + throw new IllegalArgumentException(); + } + + public static void main(String args[]){ + int input[] = {2,3,1,5}; + KeyPadPermutation kpp = new KeyPadPermutation(); + kpp.permute(input); + } +} diff --git a/showmecode_100/java/com/interview/recursion/LongestAbsolutePath.java b/showmecode_100/java/com/interview/recursion/LongestAbsolutePath.java new file mode 100644 index 00000000..fa7300db --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/LongestAbsolutePath.java @@ -0,0 +1,119 @@ +package com.interview.recursion; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; +import java.util.StringTokenizer; + +/** + * Find longest absolute path in file system indicated by \n and \t. + * + * Solution 1: + * Create queue of file and its level. Then recurse from root towards file. Use level + * to decide if next word in queue is in same level (so no more recursion) or next level so + * going deep in recursion. + * + * Solution 2(iterative): + * Keep pushing elements into stack till you either reach a file with . or a file whose number of tabs is less than + * top of stack. If you reach file with extension then update the max. Otherwise keep popping from stack till number of tabs + * at top of stack becomes less than current file. Maintain current length during push and pop. + * + * Time complexity O(n) + * Space complexity O(n) + * + * https://leetcode.com/problems/longest-absolute-file-path/ + */ +public class LongestAbsolutePath { + public int lengthLongestPath(String input) { + if (input.length() == 0) { + return 0; + } + StringTokenizer tokenizer = new StringTokenizer(input, "\n"); + Queue queue = new LinkedList<>(); + while (tokenizer.hasMoreTokens()) { + queue.offer(new Node(tokenizer.nextToken())); + } + Node root = new Node("", -1); + return lengthLongestPath(queue, root, 0); + } + + public int lengthLongestPath(Queue queue, Node root, int currentLength) { + if (root.isFile) { + return currentLength + root.level; + } + if (queue.isEmpty()) { + return 0; + } + int max = 0; + while (!queue.isEmpty()) { + Node n = queue.peek(); + if (root.level < n.level) { + queue.poll(); + max = Math.max(max, lengthLongestPath(queue, n, n.file.length() + currentLength)); + } else { + break; + } + } + return max; + } + + class Node { + String file; + int level; + boolean isFile; + Node(String file, int level) { + this.file = file; + this.level = level; + } + Node(String file) { + int numberOfTabs = 0; + int i; + for (i = 0; i < file.length(); i++) { + if (file.charAt(i) == '\t') { + numberOfTabs++; + } else { + break; + } + } + this.file = file.substring(i); + this.level = numberOfTabs; + this.isFile = file.contains("."); + } + } + + public int lengthLongestPathIterative(String input) { + if (input.length() == 0) { + return 0; + } + String[] tokens = input.split("\n"); + Stack stack = new Stack<>(); + Stack stack1 = new Stack<>(); + int len = 0; + int max = 0; + for (String token : tokens) { + int level = 0; + int i; + for (i = 0; i < token.length(); i++) { + if (token.charAt(i) == '\t') { + level++; + } else { + break; + } + } + token = token.substring(i); + while (!stack1.isEmpty() && level <= stack1.peek()) { + stack1.pop(); + String data = stack.pop(); + len -= data.length() + 1; //+1 to account for '\' between folders files + } + if (token.contains(".")) { + max = Math.max(max, len + token.length()); + } else { + stack1.push(level); + stack.push(token); + len += token.length() + 1; //+1 to accoutn for '\' between folders files + } + } + return max; + } +} diff --git a/showmecode_100/java/com/interview/recursion/MinimumEditForReversePolishNotation.java b/showmecode_100/java/com/interview/recursion/MinimumEditForReversePolishNotation.java new file mode 100644 index 00000000..1b8be785 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/MinimumEditForReversePolishNotation.java @@ -0,0 +1,52 @@ +package com.interview.recursion; + +/** + *http://www.careercup.com/question?id=5762415492857856 + */ +public class MinimumEditForReversePolishNotation { + + public int minimum(char input[]){ + return minimum(input,0,0); + } + + private int minimum(char input[],int pos,int countXs){ + if(pos == input.length){ + //we should be always be left with 1 x otherwise notation is incomplete + if(countXs > 1){ + return Integer.MAX_VALUE; + } + return 0; + } + //if input is x we can have x as it is or delete it or convert it to *. + //So basically we try all those options below + //If input is * we can take 2 xs and conver it to one x. If we dont have + //2xs then we can either delete this * or convert it to x. + //Remember adding anything does not make any sense since deleting things + //can achieve same things unless cost of adding is different from deleting + if(input[pos] == 'x'){ + int v1 = minimum(input,pos+1,countXs+1); + int v2 = Integer.MAX_VALUE; + if(countXs > 1){ + v2 = minimum(input,pos+1,countXs-1); + v2 =( v2 != Integer.MAX_VALUE ? v2 + 1 : Integer.MAX_VALUE); + } + int v3 = minimum(input,pos+1,countXs); + v3 =( v3 != Integer.MAX_VALUE ? v3 + 1 : Integer.MAX_VALUE); + return Math.min(Math.min(v1,v2),v3); + }else{ + if(countXs >= 2){ + return minimum(input,pos+1,countXs-1); + }else{ + int v1 = minimum(input,pos+1,countXs); + v1 = (v1 != Integer.MAX_VALUE ? v1 + 1 : Integer.MAX_VALUE); + int v2 = minimum(input,pos+1,countXs+1); + v2 =( v2 != Integer.MAX_VALUE ? v2 + 1 : Integer.MAX_VALUE); + return Math.min(v1, v2); + } + } + } + public static void main(String args[]){ + MinimumEditForReversePolishNotation mef = new MinimumEditForReversePolishNotation(); + System.out.println(mef.minimum("xxxx*x*x*".toCharArray())); + } +} diff --git a/showmecode_100/java/com/interview/recursion/NQueenProblem.java b/showmecode_100/java/com/interview/recursion/NQueenProblem.java new file mode 100644 index 00000000..adb7125c --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/NQueenProblem.java @@ -0,0 +1,116 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Date 02/20/2016 + * @author Tushar Roy + * + * Given nxn board place n queen on this board so that they dont attack each other. One solution is to find + * any placement of queens which do not attack each other. Other solution is to find all placements of queen + * on the board. + * + * Time complexity O(n*n) + * Space complexity O(n*n) + */ +public class NQueenProblem { + + class Position { + int row, col; + Position(int row, int col) { + this.row = row; + this.col = col; + } + } + + public Position[] solveNQueenOneSolution(int n) { + Position[] positions = new Position[n]; + boolean hasSolution = solveNQueenOneSolutionUtil(n, 0, positions); + if (hasSolution) { + return positions; + } else { + return new Position[0]; + } + } + + private boolean solveNQueenOneSolutionUtil(int n, int row, Position[] positions) { + if (n == row) { + return true; + } + int col; + for (col = 0; col < n; col++) { + boolean foundSafe = true; + + //check if this row and col is not under attack from any previous queen. + for (int queen = 0; queen < row; queen++) { + if (positions[queen].col == col || positions[queen].row - positions[queen].col == row - col || + positions[queen].row + positions[queen].col == row + col) { + foundSafe = false; + break; + } + } + if (foundSafe) { + positions[row] = new Position(row, col); + if (solveNQueenOneSolutionUtil(n, row + 1, positions)) { + return true; + } + } + } + return false; + } + + /* + *Solution for https://leetcode.com/problems/n-queens/ + */ + public List> solveNQueens(int n) { + List> result = new ArrayList<>(); + Position[] positions = new Position[n]; + solve(0, positions, result, n); + return result; + } + + public void solve(int current, Position[] positions, List> result, int n) { + if (n == current) { + StringBuffer buff = new StringBuffer(); + List oneResult = new ArrayList<>(); + for (Position p : positions) { + for (int i = 0; i < n; i++) { + if (p.col == i) { + buff.append("Q"); + } else { + buff.append("."); + } + } + oneResult.add(buff.toString()); + buff = new StringBuffer(); + + } + result.add(oneResult); + return; + } + + for (int i = 0; i < n; i++) { + boolean foundSafe = true; + for (int j = 0; j < current; j++) { + if (positions[j].col == i || positions[j].col - positions[j].row == i - current || positions[j].row + positions[j].col == i + current) { + foundSafe = false; + break; + } + } + if (foundSafe) { + positions[current] = new Position(current, i); + solve(current + 1, positions, result, n); + } + } + } + + public static void main(String args[]) { + NQueenProblem s = new NQueenProblem(); + Position[] positions = s.solveNQueenOneSolution(6); + Arrays.stream(positions).forEach(position -> System.out.println(position.row + " " + position.col)); + } +} + diff --git a/showmecode_100/java/com/interview/recursion/OneEditApart.java b/showmecode_100/java/com/interview/recursion/OneEditApart.java new file mode 100644 index 00000000..239a868f --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/OneEditApart.java @@ -0,0 +1,60 @@ +package com.interview.recursion; + +/** + * Date 03/26/2016 + * @author Tushar Roy + * Given two strings S and T, determine if they are both one edit distance apart. + * + * Time complexity O(n) + * Space complexity O(1) + * + * Reference + * https://leetcode.com/problems/one-edit-distance/ + */ +public class OneEditApart { + + public boolean isOneEditDistance(String s, String t) { + String larger, smaller; + if (s.length() < t.length()) { + larger = t; + smaller = s; + } else { + larger = s; + smaller = t; + } + + if (Math.abs(larger.length() - smaller.length()) > 1) { + return false; + } + + boolean diffFound = false; + int j = 0; + for (int i = 0; i < smaller.length();) { + if (smaller.charAt(i) == larger.charAt(j)) { + i++; + j++; + } else { + if (diffFound) { + return false; + } else { + diffFound = true; + if (smaller.length() == larger.length()) { + i++; j++; + } else { + j++; + } + } + } + } + return diffFound || j < larger.length(); + } + + public static void main(String args[]){ + OneEditApart oea = new OneEditApart(); + System.out.println(oea.isOneEditDistance("cat", "dog")); + System.out.println(oea.isOneEditDistance("cat", "cats")); + System.out.println(oea.isOneEditDistance("cat", "cut")); + System.out.println(oea.isOneEditDistance("cats", "casts")); + System.out.println(oea.isOneEditDistance("catsts", "casts")); + } +} diff --git a/showmecode_100/java/com/interview/recursion/OperatorAdditionForTarget.java b/showmecode_100/java/com/interview/recursion/OperatorAdditionForTarget.java new file mode 100644 index 00000000..6b001402 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/OperatorAdditionForTarget.java @@ -0,0 +1,60 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 02/23/2016 + * @author Tushar Roy + * + * Given a string eg. 123 and target e.g 6. Put operators *, +, - between 123 so that it evaluates to 6 + * + * https://leetcode.com/problems/expression-add-operators/ + */ +public class OperatorAdditionForTarget { + public List addOperators(String num, int target) { + if (num.length() == 0) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + StringBuffer buff = new StringBuffer(); + dfs(num, 0, target, 0, 0, result, buff); + return result; + } + + private void dfs(String nums, int pos, int target, long runningTotal, long multiplicationVal, List result, StringBuffer buff) { + if (pos == nums.length()) { + if (runningTotal == target) { + result.add(buff.toString()); + } + return; + } + + for (int i = pos; i < nums.length(); i++) { + + if (i != pos && nums.charAt(pos) == '0') { + break; + } + String subStr = nums.substring(pos, i + 1); + long num = Long.parseLong(subStr); + if (pos == 0) { + dfs(nums, i + 1, target, num, num, result, buff.append(num)); + buff.delete(buff.length() - subStr.length(), buff.length()); + continue; + } + dfs(nums, i + 1, target, runningTotal + num, num, result, buff.append("+").append(subStr)); + buff.delete(buff.length() - subStr.length() - 1, buff.length()); + dfs(nums, i + 1, target, runningTotal - num, -num, result, buff.append("-").append(subStr)); + buff.delete(buff.length() - subStr.length() - 1, buff.length()); + dfs(nums, i + 1, target, runningTotal + num * multiplicationVal - multiplicationVal, num * multiplicationVal, + result, buff.append("*").append(subStr)); + buff.delete(buff.length() - subStr.length() - 1, buff.length()); + } + } + + public static void main(String args[]) { + OperatorAdditionForTarget p = new OperatorAdditionForTarget(); + List result = p.addOperators("1234", -1); + result.stream().forEach(s -> System.out.println(s)); + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/recursion/OptimalDivision.java b/showmecode_100/java/com/interview/recursion/OptimalDivision.java new file mode 100644 index 00000000..e15f1076 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/OptimalDivision.java @@ -0,0 +1,70 @@ +package com.interview.recursion; + +/** + * Date 05/09/2017 + * @author Tushar Roy + * + * https://leetcode.com/problems/optimal-division/#/description + */ +public class OptimalDivision { + public String optimalDivision(int[] nums) { + Result r = optimalDivison(nums, 0, nums.length - 1, true); + System.out.println(r.val); + return r.str; + } + + private Result optimalDivison(int[] nums, int start, int end, boolean maximize) { + if (start == end) { + return new Result(nums[start], String.valueOf(nums[start])); + } + + double maxResult = 0; + double minResult = Double.MAX_VALUE; + String result = ""; + int cutI = start; + String part1 = ""; + String part2 = ""; + for (int i = start; i < end; i++) { + Result d1 = optimalDivison(nums, start, i, maximize); + Result d2 = optimalDivison(nums, i + 1, end, !maximize); + double val = d1.val / d2.val; + if (maximize) { + if (maxResult < val) { + maxResult = val; + part1 = d1.str; + part2 = d2.str; + cutI = i; + } + } else { + if (minResult > val) { + minResult = val; + part1 = d1.str; + part2 = d2.str; + cutI = i; + } + } + } + if (cutI < end - 1) { + result = part1 + "/(" + part2 + ")"; + } else { + result = part1 + "/" + part2; + } + return maximize ? new Result(maxResult, result) : new Result(minResult, result); + } + + class Result { + double val; + String str; + Result(double val, String str) { + this.val = val; + this.str = str; + } + } + + public static void main(String args[]) { + // int[] nums = {1000, 100, 10, 2}; + int[] nums = {6,2,3,4,5}; + OptimalDivision od = new OptimalDivision(); + System.out.println(od.optimalDivision(nums)); + } +} diff --git a/showmecode_100/java/com/interview/recursion/PrintAllPathFromTopLeftToBottomRight.java b/showmecode_100/java/com/interview/recursion/PrintAllPathFromTopLeftToBottomRight.java new file mode 100644 index 00000000..39603dd6 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/PrintAllPathFromTopLeftToBottomRight.java @@ -0,0 +1,32 @@ +package com.interview.recursion; + +import java.util.Arrays; + +/** + http://www.geeksforgeeks.org/print-all-possible-paths-from-top-left-to-bottom-right-of-a-mxn-matrix/ + */ +public class PrintAllPathFromTopLeftToBottomRight { + + + public void print(int arr[][],int row, int col,int result[],int pos){ + if(row == arr.length-1 && col == arr[0].length-1){ + result[pos] = arr[row][col]; + System.out.println(Arrays.toString(result)); + return; + } + if(row >= arr.length || col >= arr[0].length){ + return; + } + + result[pos] = arr[row][col]; + print(arr,row,col+1,result,pos+1); + print(arr,row+1,col,result,pos+1); + } + + public static void main(String args[]){ + PrintAllPathFromTopLeftToBottomRight pam = new PrintAllPathFromTopLeftToBottomRight(); + int arr[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; + int result[] = new int[arr.length + arr[0].length-1]; + pam.print(arr, 0, 0, result,0); + } +} diff --git a/showmecode_100/java/com/interview/recursion/PrintAllSubsequence.java b/showmecode_100/java/com/interview/recursion/PrintAllSubsequence.java new file mode 100644 index 00000000..aebf26f1 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/PrintAllSubsequence.java @@ -0,0 +1,44 @@ +package com.interview.recursion; + +/** + * Date 02/25/2016 + * @author Tushar Roy + * + * Print all subsequence of a given array. + * + * Time complexity is exponential + * Space complexity is O(n) + */ +public class PrintAllSubsequence { + public void print(int[] input) { + int[] output = new int[input.length]; + for (int i = 0; i < input.length; i++) { + output[0] = input[i]; + print(input, output, 1, i + 1, true); + } + } + + private void print(int[] input, int[] output, int len, int current, boolean print) { + + if (print) { + for (int i = 0; i < len; i++) { + System.out.print(output[i] + " "); + } + System.out.println(); + } + if (current == input.length) { + return; + } + + + output[len] = input[current]; + print(input, output, len + 1, current + 1, true); + print(input, output, len, current + 1, false); + } + + public static void main(String args[]) { + PrintAllSubsequence ps = new PrintAllSubsequence(); + int[] input = {1, 2, 3, 4}; + ps.print(input); + } +} diff --git a/showmecode_100/java/com/interview/recursion/PrintArrayInAdjacentWay.java b/showmecode_100/java/com/interview/recursion/PrintArrayInAdjacentWay.java new file mode 100644 index 00000000..afe9d672 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/PrintArrayInAdjacentWay.java @@ -0,0 +1,99 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.List; + +/** + * http://www.geeksforgeeks.org/find-all-possible-interpretations/ + * This is class fibonacci series example. + * e.g {1,1,1,1} -> when n = 4 total number of ways possible are + * f(3) + f(2). + * Suppose we solved for n =3 . When we add another 1 we know that total number + * of combinations without this 1 doing anything will be f(3). Not if we involve this new 1 + * and exclude f(3) we get total of f(2) because think of as if we combined last 2 ones and + * then see how many ways first 2 ones can combine + * example + * {1,1,1, new1} + * f(3) is all combinations without including new1 + * Now lets combine {1,1,newnew1} . This gives total of f(2) + * Test cases + * negative number + * 0 + * null array + */ +public class PrintArrayInAdjacentWay { + + public void printArray(int len,int k){ + List result = new ArrayList(); + printArray(len,0,result,k); + } + + private void printArray(int len, int pos,List result,int k){ + if(pos > len){ + return; + } + if(pos == len){ + for(int i:result){ + System.out.print(i + " "); + } + System.out.println(); + return ; + } + + for(int i=0; i < k ; i++){ + result.add(i+1); + printArray(len,pos+i+1,result,k); + result.remove(result.size()-1); + } + } + + public int numberOfWaysPossible(int input[],int pos){ + if(pos > input.length){ + return 0; + } + if(pos == input.length){ + return 1; + } + + + int count = numberOfWaysPossible(input,pos+1); + if(pos + 1 < input.length){ + int num = input[pos]*10 + input[pos+1]; + if(num < 27){ + count += numberOfWaysPossible(input, pos+2); + } + } + return count; + } + + /** + * Since we know this is same as fibonacci series all we have to do is either use sum of last two numbers if + * total is less than equal to 26 or use just last number if total is greater than 26 + * total is calculated by creating a number from current number and previous number + * @param input + * @return + */ + public int numberOfWaysPossibleFaster(int input[]){ + int a0 = 1; + int a1 = 1; + int c = 0; + for(int i=1; i < input.length; i++){ + if(input[i] + input[i-1]*10 <=26){ + c = a1 + a0; + }else{ + c = a1; + } + a0 = a1; + a1 = c; + } + return c; + } + + public static void main(String args[]){ + PrintArrayInAdjacentWay paw = new PrintArrayInAdjacentWay(); + // paw.printArray(5, 2); + int input[] = {1,3,7,7,1,7,2,3,2}; + System.out.println(paw.numberOfWaysPossible(input, 0)); + System.out.println(paw.numberOfWaysPossibleFaster(input)); + } +} diff --git a/showmecode_100/java/com/interview/recursion/PrintArrayInCustomizedFormat.java b/showmecode_100/java/com/interview/recursion/PrintArrayInCustomizedFormat.java new file mode 100644 index 00000000..75ac9c9f --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/PrintArrayInCustomizedFormat.java @@ -0,0 +1,49 @@ +package com.interview.recursion; + +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.geeksforgeeks.org/custom-tree-problem/ + */ +public class PrintArrayInCustomizedFormat { + + void print(char str[][]){ + Map visited = new HashMap(); + Map alreadyPrinted = new HashMap(); + for(int i=0 ; i < str.length; i++){ + if(!visited.containsKey(str[i][0]) || !visited.get(str[i][0])){ + + if(!alreadyPrinted.containsKey(str[i][0]) || !alreadyPrinted.get(str[i][0])){ + System.out.println(str[i][0]); + alreadyPrinted.put(str[i][0],true); + } + DFS(str,i,5,visited); + } + } + } + + private void DFS(char str[][],int pos,int distance,Map visited){ + for(int i=0; i < distance; i++){ + System.out.print(" "); + } + System.out.println(str[pos][1]); + char ch = str[pos][1]; + visited.put(ch, true); + int i = pos+1; + for(; i < str.length; i++){ + if(ch == str[i][0]){ + if(i != str.length){ + DFS(str,i,distance + 5,visited); + } + } + } + } + + public static void main(String args[]){ + char str[][] = {{'a','b'},{'a','c'},{'b','d'},{'c','f'},{'b','e'},{'x','y'},{'y','z'}}; + + PrintArrayInCustomizedFormat pac = new PrintArrayInCustomizedFormat(); + pac.print(str); + } +} diff --git a/showmecode_100/java/com/interview/recursion/PrintSumCombination.java b/showmecode_100/java/com/interview/recursion/PrintSumCombination.java new file mode 100644 index 00000000..0c9ee7e7 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/PrintSumCombination.java @@ -0,0 +1,70 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Date 07/10/2015 + * @author Tushar Roy + * + * Given an input and total print all combinations with repetitions in this input + * which sums to given total. + * e.g + * input - {2,3,5} + * total - 10 + * + * Output + * [2,2,2,2,2], + * [2,2,3,3], + * [2,3,5], + * [5,5]] + * Reference + * https://leetcode.com/problems/combination-sum/ + */ +public class PrintSumCombination { + + public List> combinationSum(int[] candidates, int target) { + if (candidates.length == 0) { + return new ArrayList<>(); + } + List> rr = new ArrayList<>(); + List r = new ArrayList<>(); + Arrays.sort(candidates); + combinationSumUtil(candidates, target, r, rr, 0); + return rr; + } + + private void combinationSumUtil(int[] candidates, int target, List r, List> rr, int pos) { + if (target == 0) { + List r1 = new ArrayList<>(); + r1.addAll(r); + rr.add(r1); + return; + } + + if (target < 0) { + return; + } + + if (pos == candidates.length) { + return; + } + + r.add(candidates[pos]); + combinationSumUtil(candidates, target - candidates[pos], r, rr, pos); + r.remove(r.size() - 1); + + combinationSumUtil(candidates, target, r, rr, pos + 1); + } + + public static void main(String args[]) { + int input[] = {2,3,5}; + PrintSumCombination psc = new PrintSumCombination(); + List> result = psc.combinationSum(input, 10); + result.forEach(r -> { + r.forEach(r1 -> System.out.print(r1 + " ")); + System.out.println(); + }); + } +} diff --git a/showmecode_100/java/com/interview/recursion/ReconstructItinerary.java b/showmecode_100/java/com/interview/recursion/ReconstructItinerary.java new file mode 100644 index 00000000..5fe50a18 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/ReconstructItinerary.java @@ -0,0 +1,75 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Date 03/08/2016 + * @author Tushar Roy + * + * Reconstruct itinerary based on ticket. + * + * https://leetcode.com/problems/reconstruct-itinerary/ + */ +public class ReconstructItinerary { + public List findItinerary(String[][] tickets) { + List input = new ArrayList<>(); + for (String[] ticket : tickets) { + input.add(new Itinerary(ticket[0], ticket[1])); + } + Collections.sort(input); + List output = new ArrayList<>(); + boolean[] used = new boolean[input.size()]; + findItineraryUtil(input, used, "JFK", output, 0); + return output; + } + + boolean findItineraryUtil(List input, boolean[] used, String end, List output, int count) { + if (count == used.length) { + output.add(end); + return true; + } + for (int i = 0; i < input.size(); i++) { + if (used[i]) { + continue; + } + Itinerary itr = input.get(i); + if (itr.start.equals(end)) { + output.add(itr.start); + used[i] = true; + if (findItineraryUtil(input, used, itr.dest, output, count + 1)) { + return true; + } + used[i] = false; + output.remove(output.size() - 1); + } + } + return false; + } + + class Itinerary implements Comparable { + String start; + String dest; + Itinerary(String start, String dest) { + this.start = start; + this.dest = dest; + } + + @Override + public int compareTo(Itinerary other) { + if (this.start.equals(other.start)) { + return this.dest.compareTo(other.dest); + } else { + return this.start.compareTo(other.start); + } + } + } + + public static void main(String args[]) { + String input[][] = {{"MUC","LHR"},{"JFK","MUC"},{"SFO","SJC"},{"LHR","SFO"}}; + ReconstructItinerary ri = new ReconstructItinerary(); + List output = ri.findItinerary(input); + output.forEach(r -> System.out.print(r + " ")); + } +} diff --git a/showmecode_100/java/com/interview/recursion/RemoveInvalidParenthesis.java b/showmecode_100/java/com/interview/recursion/RemoveInvalidParenthesis.java new file mode 100644 index 00000000..81339b19 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/RemoveInvalidParenthesis.java @@ -0,0 +1,63 @@ +package com.interview.recursion; + +import java.util.*; + +/** + * Date 03/03/2016 + * @author Tushar Roy + * + * Remove the minimum number of invalid parentheses in order to make the input string valid. + * Return all possible results + * + * Reference + * https://leetcode.com/problems/remove-invalid-parentheses/ + */ +public class RemoveInvalidParenthesis { + + public List removeInvalidParentheses(String s) { + Set res = new HashSet<>(); + int rmL = 0, rmR = 0; + for(int i = 0; i < s.length(); i++) { + if(s.charAt(i) == '(') rmL++; + if(s.charAt(i) == ')') { + if(rmL != 0) rmL--; + else rmR++; + } + } + DFS(res, s, 0, rmL, rmR, 0, new StringBuilder()); + return new ArrayList(res); + } + + public void DFS(Set res, String s, int i, int rmL, int rmR, int open, StringBuilder sb) { + if(i == s.length() && rmL == 0 && rmR == 0 && open == 0) { + res.add(sb.toString()); + return; + } + if(i == s.length() || rmL < 0 || rmR < 0 || open < 0) return; + + char c = s.charAt(i); + int len = sb.length(); + + if(c == '(') { + DFS(res, s, i + 1, rmL - 1, rmR, open, sb); + DFS(res, s, i + 1, rmL, rmR, open + 1, sb.append(c)); + + } else if(c == ')') { + DFS(res, s, i + 1, rmL, rmR - 1, open, sb); + DFS(res, s, i + 1, rmL, rmR, open - 1, sb.append(c)); + + } else { + DFS(res, s, i + 1, rmL, rmR, open, sb.append(c)); + } + + sb.setLength(len); + } + + public static void main(String args[]) { + + String s = "(r(()()("; + RemoveInvalidParenthesis rmp = new RemoveInvalidParenthesis(); + List result = rmp.removeInvalidParentheses(s); + result.forEach(s1 -> System.out.println(s1)); + } +} diff --git a/showmecode_100/java/com/interview/recursion/RestoreIPAddresses.java b/showmecode_100/java/com/interview/recursion/RestoreIPAddresses.java new file mode 100644 index 00000000..1a010d9d --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/RestoreIPAddresses.java @@ -0,0 +1,46 @@ +package com.interview.recursion; + +import java.util.*; + +/** + * Date 04/04/2016 + * @author Tushar Roy + * + * Given a string containing only digits, restore it by returning all possible valid IP address combinations. + * + * Reference + * https://leetcode.com/problems/restore-ip-addresses/ + */ +public class RestoreIPAddresses { + public List restoreIpAddresses(String s) { + List result = new ArrayList<>(); + List current = new ArrayList<>(); + restoreIpAddressesUtil(s, 0, 0, result, current); + return result; + } + + private void restoreIpAddressesUtil(String s, int start, int count, List result, List current) { + if (start == s.length() && count == 4) { + StringBuffer stringBuffer = new StringBuffer(current.get(0)); + for (int i = 1; i < current.size(); i++) { + stringBuffer.append(".").append(current.get(i)); + } + result.add(stringBuffer.toString()); + return; + } else if (start == s.length() || count == 4) { + return; + } + for (int i = start; i < s.length() && i < start + 3; i++) { + if (i != start && s.charAt(start) == '0') { + break; + } + String ip = s.substring(start, i + 1); + if (Integer.valueOf(ip) > 255) { + continue; + } + current.add(ip); + restoreIpAddressesUtil(s, i + 1, count + 1, result, current); + current.remove(current.size() - 1); + } + } +} diff --git a/showmecode_100/java/com/interview/recursion/SetPairTogether.java b/showmecode_100/java/com/interview/recursion/SetPairTogether.java new file mode 100644 index 00000000..cb1b5138 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/SetPairTogether.java @@ -0,0 +1,78 @@ +package com.interview.recursion; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 12/30/2015 + * @author Tushar Roy + * + * Given input array with every element in array having its pair element. How many minimum swaps needs to be + * done so that all pair elements are adjacent to each other. + * + * Time complexity is O(2^n) + * + * http://www.geeksforgeeks.org/minimum-number-of-swaps-required-for-arranging-pairs-adjacent-to-each-other/ + */ +public class SetPairTogether { + + public int findMinimumSwaps(int input[], Map pair) { + Map index = new HashMap<>(); + for (int i = 0; i < input.length; i++) { + index.put(input[i], i); + } + return findMinimumSwapsUtil(input, pair, index, 0); + } + + public int findMinimumSwapsUtil(int input[], Map pair, Map index, int current) { + if (current == input.length) { + return 0; + } + + int v1 = input[current]; + int v2 = input[current + 1]; + int pv2 = pair.get(v1); + + if(pv2 == v2) { + return findMinimumSwapsUtil(input, pair, index, current + 2); + } else { + int idx1 = index.get(v1); + int idx2 = index.get(v2); + + int idx3 = index.get(pair.get(v1)); + int idx4 = index.get(pair.get(v2)); + + swap(index, input, idx2, idx3); + int val1 = findMinimumSwapsUtil(input, pair, index, current + 2); + swap(index, input, idx2, idx3); + + swap(index, input, idx1, idx4); + int val2 = findMinimumSwapsUtil(input, pair, index, current + 2); + swap(index, input, idx1, idx4); + + return 1 + Math.min(val1, val2); + } + } + + private void swap(Map index, int input[], int i, int j) { + index.compute(input[i], (k, v) -> j); + index.compute(input[j], (k, v) -> i); + + int t = input[i]; + input[i] = input[j]; + input[j] = t; + } + + public static void main(String args[]) { + SetPairTogether spt = new SetPairTogether(); + int input[] = {3, 5, 6, 4, 1, 2}; + Map pair = new HashMap<>(); + pair.put(1, 3); + pair.put(3, 1); + pair.put(2, 6); + pair.put(6, 2); + pair.put(4, 5); + pair.put(5 ,4); + System.out.println(spt.findMinimumSwaps(input, pair)); + } +} diff --git a/showmecode_100/java/com/interview/recursion/StringInterleaving.java b/showmecode_100/java/com/interview/recursion/StringInterleaving.java new file mode 100644 index 00000000..927781ca --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/StringInterleaving.java @@ -0,0 +1,38 @@ +package com.interview.recursion; + +public class StringInterleaving { + + private void printArray(char[] str){ + for(int i=0; i < str.length; i++){ + System.out.print(str[i]); + } + System.out.println(); + } + + public void interleaving(char[] str1,char[] str2,int len1,int len2,int current, char []result){ + + if(current == result.length){ + printArray(result); + return; + } + + if(len1 < str1.length){ + result[current] = str1[len1]; + interleaving(str1, str2, len1+1, len2, current+1, result); + } + if(len2 < str2.length){ + result[current] = str2[len2]; + interleaving(str1,str2,len1,len2+1,current+1,result); + } + } + + public static void main(String args[]){ + + StringInterleaving si = new StringInterleaving(); + String str1 ="AB"; + String str2 = "CDE"; + char[] result = new char[str1.length() + str2.length()]; + si.interleaving(str1.toCharArray(), str2.toCharArray(), 0, 0, 0, result); + } + +} diff --git a/showmecode_100/java/com/interview/recursion/StringPermutation.java b/showmecode_100/java/com/interview/recursion/StringPermutation.java new file mode 100644 index 00000000..25dfab52 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/StringPermutation.java @@ -0,0 +1,70 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Date 01/29/2016 + * @author Tushar Roy + * + * Generate all permutations of string in lexicographically sorted order where repetitions of + * character is possible in string. + */ +public class StringPermutation { + + public List permute(char input[]) { + Map countMap = new TreeMap<>(); + for (char ch : input) { + countMap.compute(ch, (key, val) -> { + if (val == null) { + return 1; + } else { + return val + 1; + } + }); + } + char str[] = new char[countMap.size()]; + int count[] = new int[countMap.size()]; + int index = 0; + for (Map.Entry entry : countMap.entrySet()) { + str[index] = entry.getKey(); + count[index] = entry.getValue(); + index++; + } + List resultList = new ArrayList<>(); + char result[] = new char[input.length]; + permuteUtil(str, count, result, 0, resultList); + return resultList; + } + + public void permuteUtil(char str[], int count[], char result[], int level, List resultList) { + if (level == result.length) { + resultList.add(new String(result)); + return; + } + + for(int i = 0; i < str.length; i++) { + if(count[i] == 0) { + continue; + } + result[level] = str[i]; + count[i]--; + permuteUtil(str, count, result, level + 1, resultList); + count[i]++; + } + } + + private void printArray(char input[]) { + for(char ch : input) { + System.out.print(ch); + } + System.out.println(); + } + + public static void main(String args[]) { + StringPermutation sp = new StringPermutation(); + sp.permute("AABC".toCharArray()).forEach(s -> System.out.println(s)); + } +} diff --git a/showmecode_100/java/com/interview/recursion/StringPermutationRotation.java b/showmecode_100/java/com/interview/recursion/StringPermutationRotation.java new file mode 100644 index 00000000..443d8ff9 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/StringPermutationRotation.java @@ -0,0 +1,35 @@ +package com.interview.recursion; + +public class StringPermutationRotation { + + private void swap(char arr[],int i, int j){ + char temp = arr[i]; + arr[i] = arr[j]; + arr[j] =temp; + } + + private void printArray(char str[]){ + for(int i=0; i< str.length; i++){ + System.out.print(str[i]); + } + System.out.print("\n"); + } + + public void permute(char[] str,int pos){ + if(pos == str.length){ + printArray(str); + return; + } + for(int i=pos; i < str.length; i++){ + swap(str,pos,i); + permute(str,pos+1); + swap(str,pos,i); + } + } + + public static void main(String args[]){ + String str = "ABC"; + StringPermutationRotation sp = new StringPermutationRotation(); + sp.permute(str.toCharArray(),0); + } +} diff --git a/showmecode_100/java/com/interview/recursion/SudokuSolver.java b/showmecode_100/java/com/interview/recursion/SudokuSolver.java new file mode 100644 index 00000000..d9a1279a --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/SudokuSolver.java @@ -0,0 +1,92 @@ +package com.interview.recursion; + +import java.util.Arrays; + +/** + * Date 03/24/2016 + * @author Tushar Roy + * + * Write a program to solve a Sudoku puzzle by filling the empty cells. + * + * https://leetcode.com/problems/sudoku-solver/ + */ +public class SudokuSolver { + + public void solveSudoku(char[][] input) { + boolean[][] horizontal = new boolean[9][9]; + boolean[][] vertical = new boolean[9][9]; + boolean[][] box = new boolean[9][9]; + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[0].length; j++) { + if (input[i][j] == '.') { + continue; + } + horizontal[i][input[i][j] - '1'] = true; + vertical[j][input[i][j] - '1'] = true; + int index = 3*(i/3) + j/3; + box[index][input[i][j] - '1'] = true; + } + } + solveSudokuUtil(input, horizontal, vertical, box, 0, 0); + } + + private boolean solveSudokuUtil(char[][] input, boolean[][] horizontal, boolean[][] vertical, boolean[][] box, int row, int col) { + if (col == 9) { + row = row + 1; + col = 0; + } + if (row == 9) { + return true; + } + + if (input[row][col] != '.') { + return solveSudokuUtil(input, horizontal, vertical, box, row, col + 1); + } + + for (int val = 1; val <= 9; val++) { + int index = 3*(row/3) + col/3; + if (horizontal[row][val - 1] == false && vertical[col][val - 1] == false && box[index][val - 1] == false) { + horizontal[row][val - 1] = true; + vertical[col][val - 1] = true; + box[index][val - 1] = true; + input[row][col] = (char)(val + '0'); + if (solveSudokuUtil(input, horizontal, vertical, box, row, col + 1)) { + return true; + } + input[row][col] = '.'; + horizontal[row][val - 1] = false; + vertical[col][val - 1] = false; + box[index][val - 1] = false; + } + } + return false; + } + + public static void main(String args[]) { + SudokuSolver ss = new SudokuSolver(); + char[][] input = new char[9][9]; + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input.length; j++) { + input[i][j] = '.'; + } + } + + input[0] = "..9748...".toCharArray(); + input[1] = "7........".toCharArray(); + input[2] = ".2.1.9...".toCharArray(); + input[3] = "..7...24.".toCharArray(); + input[4] = ".64.1.59.".toCharArray(); + input[5] = ".98...3..".toCharArray(); + input[6] = "...8.3.2.".toCharArray(); + input[7] = "........6".toCharArray(); + input[8] = "...2759..".toCharArray(); + + ss.solveSudoku(input); + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input.length; j++) { + System.out.print(input[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/showmecode_100/java/com/interview/recursion/WordCombination.java b/showmecode_100/java/com/interview/recursion/WordCombination.java new file mode 100644 index 00000000..cca14065 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/WordCombination.java @@ -0,0 +1,64 @@ +package com.interview.recursion; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 07/20/2015 + * @author Tushar Roy + * + * Given a list of list of Strings. Print cartesian product of lists. + * input -> {"Hello", "World"} , {"Game"}, {"Go","Home"} + * output -> + * Hello Game Go + * Hellow Game Home + * World Game Go + * World Game Home + */ +public class WordCombination { + + public void printCombinations(List> input) { + int[] result = new int[input.size()]; + print(input,result, 0); + } + + private void print(List> input, int[] result, int pos) { + + if(pos == result.length){ + for (int i = 0; i < input.size(); i++) { + System.out.print(input.get(i).get(result[i]) + " "); + } + System.out.println(); + return; + } + + for(int i=0; i < input.get(pos).size(); i++){ + result[pos] = i; + print(input,result, pos+1); + + } + } + + public static void main(String args[]){ + List l1 = new ArrayList<>(); + l1.add("quick"); + l1.add("slow"); + + List l2 = new ArrayList<>(); + l2.add("brown"); + l2.add("red"); + + List l3 = new ArrayList<>(); + l3.add("fox"); + l3.add("dog"); + + List> input = new ArrayList<>(); + input.add(l1); + input.add(l2); + input.add(l3); + + WordCombination wc = new WordCombination(); + wc.printCombinations(input); + + } +} diff --git a/showmecode_100/java/com/interview/recursion/WordPattern.java b/showmecode_100/java/com/interview/recursion/WordPattern.java new file mode 100644 index 00000000..07a102f4 --- /dev/null +++ b/showmecode_100/java/com/interview/recursion/WordPattern.java @@ -0,0 +1,55 @@ +package com.interview.recursion; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Given a pattern and a string str, find if str follows the same pattern. + + Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty substring in str. + * https://leetcode.com/problems/word-pattern-ii/ + */ +public class WordPattern { + public boolean wordPatternMatch(String pattern, String str) { + Map map = new HashMap<>(); + Set set = new HashSet<>(); + return wordPatternMatch(pattern, str, 0, 0, map, set); + } + + public boolean wordPatternMatch(String pattern, String str, int pos1, int pos2, Map map, Set set) { + if (pos1 == pattern.length()) { + return pos2 == str.length(); + } + + char ch = pattern.charAt(pos1); + String val = map.get(ch); + if (val != null) { + return pos2 + val.length() <= str.length() && val.equals(str.substring(pos2, pos2 + val.length())) && wordPatternMatch(pattern, str, pos1 + 1, pos2 + val.length(), map, set); + } else { + for (int i = pos2; i < str.length() - (pattern.length() - pos1 - 1); i++) { + String newStr = str.substring(pos2, i + 1); + if (set.contains(newStr)) { + continue; + } + set.add(newStr); + map.put(ch, newStr); + if (wordPatternMatch(pattern, str, pos1 + 1, i + 1, map, set)) { + return true; + } + set.remove(newStr); + } + map.remove(ch); + } + return false; + } + + public static void main(String args[]) { + String pattern = "abcbc"; + String str = "bcdgflgfl"; + WordPattern wp = new WordPattern(); + System.out.println(wp.wordPatternMatch(pattern, str)); + } +} + diff --git a/showmecode_100/java/com/interview/regex/MultiSpaceReplacement.java b/showmecode_100/java/com/interview/regex/MultiSpaceReplacement.java new file mode 100644 index 00000000..58aa12df --- /dev/null +++ b/showmecode_100/java/com/interview/regex/MultiSpaceReplacement.java @@ -0,0 +1,20 @@ +package com.interview.regex; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MultiSpaceReplacement { + + public void replace(String str){ + Pattern pattern = Pattern.compile("^ +| +| +$"); + Matcher matcher = pattern.matcher(str); + System.out.println(matcher.replaceAll("")); + + } + + public static void main(String args[]){ + String str = " This is Tushar Roy "; + MultiSpaceReplacement mrs = new MultiSpaceReplacement(); + mrs.replace(str); + } +} diff --git a/showmecode_100/java/com/interview/sort/CountingSort.java b/showmecode_100/java/com/interview/sort/CountingSort.java new file mode 100644 index 00000000..416dedb6 --- /dev/null +++ b/showmecode_100/java/com/interview/sort/CountingSort.java @@ -0,0 +1,53 @@ +package com.interview.sort; + +public class CountingSort { + + private static int TOTAL = 10; + + public void sort(int arr[]) { + + int count[] = new int[TOTAL]; + + for (int i = 0; i < arr.length; i++) { + count[arr[i]]++; + } + int c = 0; + for (int i = 0; i < TOTAL; i++) { + while (count[i] > 0) { + arr[c++] = i; + count[i]--; + } + } + } + + public void sort1(int arr[]) { + + int count[] = new int[TOTAL]; + int output[] = new int[arr.length]; + for (int i = 0; i < arr.length; i++) { + count[arr[i]]++; + } + + for(int i=1; i < TOTAL; i++){ + count[i] += count[i-1]; + } + + for(int i=0; i 0 ; i--){ + swap(arr, 0, i); + heapify(arr, i-1); + } + } + + private void heapify(int arr[], int end){ + int i = 0; + int leftIndex; + int rightIndex; + while(i <= end){ + leftIndex = 2*i + 1; + if(leftIndex > end){ + break; + } + rightIndex = 2*i + 2; + if(rightIndex > end){ + rightIndex = leftIndex; + } + if(arr[i] >= Math.max(arr[leftIndex], arr[rightIndex])){ + break; + } + if(arr[leftIndex] >= arr[rightIndex]){ + swap(arr, i, leftIndex); + i = leftIndex; + }else{ + swap(arr, i, rightIndex); + i = rightIndex; + } + } + } + + private void swap(int arr[], int x, int y){ + int temp = arr[x]; + arr[x] = arr[y]; + arr[y] = temp; + } + + private void heapAdd(int arr[], int end){ + int i = end; + while(i > 0){ + if(arr[i] > arr[(i-1)/2]){ + swap(arr, i, (i-1)/2); + i = (i - 1)/2; + }else{ + break; + } + } + } + + public static void main(String args[]){ + HeapSort hs = new HeapSort(); + int arr[] = {-1,5,8,2,-6,-8,11,5}; + hs.sort(arr); + for(int a : arr){ + System.out.println(a); + } + } +} diff --git a/showmecode_100/java/com/interview/sort/IterativeQuickSort.java b/showmecode_100/java/com/interview/sort/IterativeQuickSort.java new file mode 100644 index 00000000..66f0218c --- /dev/null +++ b/showmecode_100/java/com/interview/sort/IterativeQuickSort.java @@ -0,0 +1,71 @@ +package com.interview.sort; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * http://www.geeksforgeeks.org/iterative-quick-sort/ + * Test case + * 0,1 or more elements in the array + */ +public class IterativeQuickSort { + + public void sort(int arr[]){ + Deque stack = new LinkedList(); + int l = 0; + int h = arr.length-1; + stack.offerFirst(l); + stack.offerFirst(h); + + while(!stack.isEmpty()){ + h = stack.pollFirst(); + l = stack.pollFirst(); + + int p = partition(arr,l,h); + if(l < p-1 && h > p+1){ + stack.offerFirst(l); + stack.offerFirst(p-1); + stack.offerFirst(p+1); + stack.offerFirst(h); + } + else if(l < p-1){ + stack.offerFirst(l); + stack.offerFirst(p-1); + }else if(h > p+1){ + stack.offerFirst(p+1); + stack.offerFirst(h); + } + } + } + + private int partition(int arr[], int low,int high){ + int pivot = arr[low]; + int i = low+1; + int j = low+1; + while(j <= high){ + if(arr[j] < pivot){ + swap(arr,i,j); + i++; + } + j++; + } + swap(arr,i-1,low); + return i-1; + + } + + private void swap(int arr[],int a,int b){ + int temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; + } + + public static void main(String args[]){ + int arr[] = {3,2,8,0,11,-1,-5,4,32,-60,44}; + IterativeQuickSort iqs = new IterativeQuickSort(); + iqs.sort(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i] + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/sort/MergeSort.java b/showmecode_100/java/com/interview/sort/MergeSort.java new file mode 100644 index 00000000..f7149525 --- /dev/null +++ b/showmecode_100/java/com/interview/sort/MergeSort.java @@ -0,0 +1,78 @@ +package com.interview.sort; + +/** + * http://en.wikipedia.org/wiki/Merge_sort + * Test cases + * 1 element + * 2 element + * negative numbers + * already sorted + * reverse sorted + */ +public class MergeSort { + + public void sort(int input[]){ + sort(input, 0, input.length-1); + } + + private void sort(int input[], int low, int high){ + if(low >= high){ + return; + } + + int middle = (low + high)/2; + sort(input, low, middle); + sort(input, middle+1, high); + sortedMerge(input,low,high); + } + + private void sortedMerge(int input[], int low, int high){ + int middle = (low+high)/2; + int temp[] = new int[high-low+1]; + int i = low; + int j = middle+1; + int r = 0; + while(i <= middle && j <= high){ + if(input[i] <= input[j]){ + temp[r++] = input[i++]; + }else{ + temp[r++] = input[j++]; + } + } + while(i <= middle){ + temp[r++] = input[i++]; + } + + while(j <= high){ + temp[r++] = input[j++]; + } + i = low; + for(int k=0; k < temp.length;){ + input[i++] = temp[k++]; + } + } + + public void printArray(int input[]){ + for(int i : input){ + System.out.print(i + " "); + } + System.out.println(); + } + + public static void main(String args[]){ + int input1[] = {1}; + int input2[] = {4,2}; + int input3[] = {6,2,9}; + int input4[] = {6,-1,10,4,11,14,19,12,18}; + MergeSort ms = new MergeSort(); + ms.sort(input1); + ms.sort(input2); + ms.sort(input3); + ms.sort(input4); + + ms.printArray(input1); + ms.printArray(input2); + ms.printArray(input3); + ms.printArray(input4); + } +} diff --git a/showmecode_100/java/com/interview/sort/PanCakeSorting.java b/showmecode_100/java/com/interview/sort/PanCakeSorting.java new file mode 100644 index 00000000..408b6b41 --- /dev/null +++ b/showmecode_100/java/com/interview/sort/PanCakeSorting.java @@ -0,0 +1,57 @@ +package com.interview.sort; + +/** + * http://www.geeksforgeeks.org/pancake-sorting/ + * Two ways to do it + * 1) Start i from arr.length-1 towards 0, find max from 0 to i, move this max to top + * by one flip and then move this max to ith position by another flip + * + * 2) Start i from 0 towards arr.length-1, find floor of input[i] from 0 to i-1 lets call + * f , flip 0 to f, then flip 0 to i-1 then flip 0 to i, then flip 0 to i-1. + * e.g 1 2 3 5 4. Here i is 4 and f is 2 + * 1 2 3 5 4 flip(0,f) -> 3 2 1 5 4 + * 3 2 1 5 4 flip(0,i-1) -> 5 1 2 3 4 + * 5 1 2 3 4 flip(0,i) -> 4 3 2 1 5 + * 4 3 2 1 5 flip(0,i-1) -> 1 2 3 4 5 + */ +public class PanCakeSorting { + + public void sort(int arr[]){ + for(int i=arr.length-1; i >= 0 ; i--){ + int pos = findMax(arr,i); + flip(arr,pos); + flip(arr,i); + } + } + + private int findMax(int arr[],int pos){ + int max = pos; + for(int i= pos-1 ;i >= 0 ;i--){ + if(arr[i] > arr[max]){ + max = i; + } + } + return max; + } + + private void flip(int arr[],int pos){ + for(int i=0; i <= pos/2; i++){ + swap(arr,i,pos-i); + } + } + + private void swap(int arr[],int i,int j){ + int temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + + public static void main(String args[]){ + int arr[] = {9,2,7,11,3,6,1,10,8}; + PanCakeSorting pcs = new PanCakeSorting(); + pcs.sort(arr); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i] + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/sort/QuickSort.java b/showmecode_100/java/com/interview/sort/QuickSort.java new file mode 100644 index 00000000..6a8e7baf --- /dev/null +++ b/showmecode_100/java/com/interview/sort/QuickSort.java @@ -0,0 +1,86 @@ +package com.interview.sort; + +public class QuickSort { + + private void swap(int A[],int i,int j) + { + int temp = A[i]; + A[i] = A[j]; + A[j] = temp; + } + private int split(int A[],int low,int high) + { + int pivot = low; + int i = low +1; + int j = high; + while(i=A[i]) + { + i++; + } + while(j>=i && A[pivot]A[j]) + { + swap(A,i++,j--); + } + } + if(A[pivot] > A[j]){ + swap(A,j,pivot); + } + return j; + } + + private int split1(int A[],int low,int high){ + + int pivot = low; + int i = low+1; + int j = high; + while(i <= j){ + + if(A[i] <= A[pivot]){ + i++; + continue; + } + if(A[j] > A[pivot]){ + j--; + continue; + } + swap(A,i++,j--); + } + if(A[pivot] > A[j]){ + swap(A,pivot,j); + return j; + } + return pivot; + + } + + public void sort(int A[],int low,int high) + { + if(low>=high) + { + return; + } + int pos = split1(A,low,high); + sort(A,low,pos-1); + sort(A,pos+1,high); + } + + private void printArray(int arr[]){ + for(int a : arr){ + System.out.println(a); + } + } + public static void main(String args[]){ + QuickSort qs = new QuickSort(); + int A[] = {11,19,0,-1,5,6,16,-3,6,0,14,18,7,21,18,-6,-8}; +// int A[] = {11,9,0,4,6,-1,13}; + qs.sort(A, 0, A.length-1); + qs.printArray(A); + + } +} diff --git a/showmecode_100/java/com/interview/sort/RadixSort.java b/showmecode_100/java/com/interview/sort/RadixSort.java new file mode 100644 index 00000000..3b0c97b1 --- /dev/null +++ b/showmecode_100/java/com/interview/sort/RadixSort.java @@ -0,0 +1,55 @@ +package com.interview.sort; + +public class RadixSort { + + private void countSort(int arr[],int exp){ + + int[] count = new int[10]; + int[] output = new int[arr.length]; + + for(int i=0; i < arr.length; i++){ + count[(arr[i]/exp)%10]++; + } + + for(int i=1; i < count.length; i++){ + count[i] += count[i-1]; + } + + for(int i=arr.length-1; i >= 0; i--){ + output[count[(arr[i]/exp)%10]-1] = arr[i]; + count[(arr[i]/exp)%10]--; + } + + for(int i=0; i < arr.length; i++){ + arr[i] = output[i]; + } + } + + private int max(int arr[]){ + int max = arr[0]; + for(int i=1; i < arr.length; i++){ + if(max < arr[i]){ + max = arr[i]; + } + } + return max; + } + + public void radixSort(int arr[]){ + + int max = max(arr); + for(int exp = 1; exp <= max; exp *= 10){ + countSort(arr,exp); + } + } + + public static void main(String args[]){ + int arr[] = {101,10,11,66,94,26,125}; + RadixSort rs = new RadixSort(); + rs.radixSort(arr); + for (int i = 0; i < arr.length; i++) { + System.out.println(arr[i]); + } + + } +} diff --git a/showmecode_100/java/com/interview/sort/Sort0toN3.java b/showmecode_100/java/com/interview/sort/Sort0toN3.java new file mode 100644 index 00000000..b9145f8f --- /dev/null +++ b/showmecode_100/java/com/interview/sort/Sort0toN3.java @@ -0,0 +1,45 @@ +package com.interview.sort; + +/** + * http://www.geeksforgeeks.org/sort-n-numbers-range-0-n2-1-linear-time/ + */ +public class Sort0toN3 { + + public void sort(int arr[],int n){ + + sort(arr,n,1); + sort(arr,n,n); + sort(arr,n,n*n); + } + + private void sort(int arr[],int n, int exp){ + int count[] = new int[n]; + for(int i=0; i < arr.length;i++){ + count[(arr[i]/exp)%n]++; + } + + for(int i=1; i < arr.length; i++){ + count[i] += count[i-1]; + } + + int output[] = new int[n]; + + for(int i=arr.length-1;i>=0; i--){ + output[count[(arr[i]/exp)%n]-1] = arr[i]; + count[(arr[i]/exp)%n]--; + } + for(int i=0; i < arr.length; i++){ + arr[i] = output[i]; + } + } + + public static void main(String args[]){ + int arr[] = {100,2,124,18,36}; + Sort0toN3 sn = new Sort0toN3(); + sn.sort(arr,arr.length); + for(int i=0; i < arr.length; i++){ + System.out.print(arr[i] + " "); + } + } + +} diff --git a/showmecode_100/java/com/interview/sort/SortArrayByFrequence.java b/showmecode_100/java/com/interview/sort/SortArrayByFrequence.java new file mode 100644 index 00000000..22be69cb --- /dev/null +++ b/showmecode_100/java/com/interview/sort/SortArrayByFrequence.java @@ -0,0 +1,67 @@ +package com.interview.sort; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.geeksforgeeks.org/sort-elements-by-frequency/ + */ +public class SortArrayByFrequence { + + class SortNode{ + int count; + int firstIndex; + } + + class FrequenceComparator implements Comparator{ + private Map countMap = null; + FrequenceComparator(Map countMap){ + this.countMap = countMap; + } + @Override + public int compare(Integer i1, Integer i2) { + SortNode n1 = countMap.get(i1); + SortNode n2 = countMap.get(i2); + if(n1.count > n2.count){ + return -1; + }else if(n1.count < n2.count){ + return 1; + }else{ + return n1.firstIndex < n2.firstIndex ? -1 : 1; + } + } + + } + + public void sortByFrequence(Integer arr[]){ + Map countMap = new HashMap(); + int index = 0; + for(int a : arr){ + if(countMap.containsKey(a)){ + SortNode s = countMap.get(a); + s.count++; + }else{ + SortNode s = new SortNode(); + s.count = 1; + s.firstIndex = index; + countMap.put(a, s); + } + index++; + } + + FrequenceComparator freqComparator = new FrequenceComparator(countMap); + Arrays.sort(arr,freqComparator); + } + + public static void main(String args[]){ + Integer input[] = {5,2,8,9,9,9,2}; + SortArrayByFrequence saf = new SortArrayByFrequence(); + saf.sortByFrequence(input); + for(int i : input){ + System.out.println(i + " "); + } + } + +} diff --git a/showmecode_100/java/com/interview/stackqueue/CircularQueue.java b/showmecode_100/java/com/interview/stackqueue/CircularQueue.java new file mode 100644 index 00000000..5e3441f3 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/CircularQueue.java @@ -0,0 +1,80 @@ +package com.interview.stackqueue; + +public class CircularQueue { + + private int QUEUE_LENGTH; + private T data[] = null; + public CircularQueue(int size){ + this.QUEUE_LENGTH = size; + data = (T [])new Object[QUEUE_LENGTH]; + } + private int top=-1; + private int end = -1; + public void offer(T t){ + if(top == -1){ + data[0] = t; + top =0; + end = 0; + }else if(top == (end + 1) % QUEUE_LENGTH){ + throw new IllegalArgumentException(); + }else{ + end = (end + 1) % QUEUE_LENGTH; + data[end] = t; + } + } + + public T top(){ + if(top == -1){ + throw new IllegalArgumentException(); + }else{ + return data[top]; + } + } + + public T poll(){ + if(top == -1){ + throw new IllegalArgumentException(); + }else if(top == end){ + T t = data[top]; + top = -1; + end = -1; + return t; + } + else{ + T t = data[top]; + top = (top +1)% QUEUE_LENGTH; + return t; + } + + } + public boolean isEmpty(){ + if(top == -1){ + return true; + } + return false; + } + + public boolean isFull(){ + if(top == (end + 1)% QUEUE_LENGTH){ + return true; + } + return false; + } + + public static void main(String args[]){ + CircularQueue circularQueue = new CircularQueue(5); + circularQueue.offer(1); + circularQueue.offer(2); + circularQueue.offer(3); + System.out.println(circularQueue.poll()); + circularQueue.offer(4); + circularQueue.offer(5); + System.out.print(circularQueue.isFull()); + circularQueue.offer(6); + System.out.print(circularQueue.isFull()); + + while(!circularQueue.isEmpty()){ + System.out.println(circularQueue.poll()); + } + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/MaximumHistogram.java b/showmecode_100/java/com/interview/stackqueue/MaximumHistogram.java new file mode 100644 index 00000000..fb2ffc96 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/MaximumHistogram.java @@ -0,0 +1,95 @@ +package com.interview.stackqueue; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * 12/23/2014 + * @author tusroy + * + * Video link https://youtu.be/ZmnqCZp9bBs + * + * Given an array representing height of bar in bar graph, find max histogram + * area in the bar graph. Max histogram will be max rectangular area in the + * graph. + * + * Maintain a stack + * + * If stack is empty or value at index of stack is less than or equal to value at current + * index, push this into stack. + * Otherwise keep removing values from stack till value at index at top of stack is + * less than value at current index. + * While removing value from stack calculate area + * if stack is empty + * it means that till this point value just removed has to be smallest element + * so area = input[top] * i + * if stack is not empty then this value at index top is less than or equal to + * everything from stack top + 1 till i. So area will + * area = input[top] * (i - stack.peek() - 1); + * Finally maxArea is area if area is greater than maxArea. + * + * + * Time complexity is O(n) + * Space complexity is O(n) + * + * References: + * http://www.geeksforgeeks.org/largest-rectangle-under-histogram/ + */ +public class MaximumHistogram { + + public int maxHistogram(int input[]){ + Deque stack = new LinkedList(); + int maxArea = 0; + int area = 0; + int i; + for(i=0; i < input.length;){ + if(stack.isEmpty() || input[stack.peekFirst()] <= input[i]){ + stack.offerFirst(i++); + }else{ + int top = stack.pollFirst(); + //if stack is empty means everything till i has to be + //greater or equal to input[top] so get area by + //input[top] * i; + if(stack.isEmpty()){ + area = input[top] * i; + } + //if stack is not empty then everythin from i-1 to input.peek() + 1 + //has to be greater or equal to input[top] + //so area = input[top]*(i - stack.peek() - 1); + else{ + area = input[top] * (i - stack.peekFirst() - 1); + } + if(area > maxArea){ + maxArea = area; + } + } + } + while(!stack.isEmpty()){ + int top = stack.pollFirst(); + //if stack is empty means everything till i has to be + //greater or equal to input[top] so get area by + //input[top] * i; + if(stack.isEmpty()){ + area = input[top] * i; + } + //if stack is not empty then everything from i-1 to input.peek() + 1 + //has to be greater or equal to input[top] + //so area = input[top]*(i - stack.peek() - 1); + else{ + area = input[top] * (i - stack.peekFirst() - 1); + } + if(area > maxArea){ + maxArea = area; + } + } + return maxArea; + } + + public static void main(String args[]){ + MaximumHistogram mh = new MaximumHistogram(); + int input[] = {2,2,2,6,1,5,4,2,2,2,2}; + int maxArea = mh.maxHistogram(input); + //System.out.println(maxArea); + assert maxArea == 12; + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/MedianFinder.java b/showmecode_100/java/com/interview/stackqueue/MedianFinder.java new file mode 100644 index 00000000..0b37cd56 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/MedianFinder.java @@ -0,0 +1,75 @@ +package com.interview.stackqueue; + +import java.util.Collections; +import java.util.PriorityQueue; + +/** + * Date 03/03/2016 + * @author Tushar Roy + * + * Find median in stream of numbers + * + * https://leetcode.com/problems/find-median-from-data-stream/ + */ +public class MedianFinder { + + PriorityQueue minPq = new PriorityQueue<>(); + PriorityQueue maxPq = new PriorityQueue<>(); + + public MedianFinder() { + minPq = new PriorityQueue<>(); + maxPq = new PriorityQueue<>(20, Collections.reverseOrder()); + } + + // Adds a number into the data structure. + public void addNum(int num) { + if (maxPq.size() == 0) { + maxPq.add(num); + return; + } + if (maxPq.size() == minPq.size()) { + if (minPq.peek() < num) { + maxPq.offer(minPq.poll()); + minPq.offer(num); + } else { + maxPq.offer(num); + } + } else { + int toBeOffered = 0; + if (num >= maxPq.peek()) { + toBeOffered = num; + } else { + toBeOffered = maxPq.poll(); + maxPq.offer(num); + } + minPq.offer(toBeOffered); + } + } + // Returns the median of current data stream + public double findMedian() { + if (minPq.size() == maxPq.size()) { + return ((double)minPq.peek() + (double)maxPq.peek())/2; + } else { + return maxPq.peek(); + } + } + + public static void main(String args[]) { + MedianFinder mf = new MedianFinder(); + mf.addNum(4); + System.out.println(mf.findMedian()); + mf.addNum(8); + System.out.println(mf.findMedian()); + mf.addNum(2); + System.out.println(mf.findMedian()); + mf.addNum(11); + System.out.println(mf.findMedian()); + mf.addNum(13); + System.out.println(mf.findMedian()); + mf.addNum(14); + System.out.println(mf.findMedian()); + mf.addNum(-1); + System.out.println(mf.findMedian()); + + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/RealTimeCounter.java b/showmecode_100/java/com/interview/stackqueue/RealTimeCounter.java new file mode 100644 index 00000000..c1329b8a --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/RealTimeCounter.java @@ -0,0 +1,41 @@ +package com.interview.stackqueue; + +import java.util.LinkedList; +import java.util.Queue; + +public class RealTimeCounter { + + private Queue secQueue = new LinkedList(); + private long secCount; + + public void add(long currentTimeInMills){ + while(secQueue.size() > 0 && currentTimeInMills - 1000 > secQueue.peek()){ + secCount--; + secQueue.poll(); + } + + secCount++; + secQueue.offer(currentTimeInMills); + } + + public long getCallsInLastSec(long currentTimeInMills){ + while(secQueue.size() > 0 && currentTimeInMills - 1000 > secQueue.peek()){ + secCount--; + secQueue.poll(); + } + return secCount; + } + + public static void main(String args[]){ + RealTimeCounter rtc = new RealTimeCounter(); + rtc.add(100); + rtc.add(300); + rtc.add(550); + System.out.println(rtc.getCallsInLastSec(780)); + System.out.println(rtc.getCallsInLastSec(1280)); + rtc.add(1540); + System.out.println(rtc.getCallsInLastSec(1551)); + rtc.add(1570); + System.out.println(rtc.getCallsInLastSec(2651)); + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/RealTimeCounterUsingCircularQueue.java b/showmecode_100/java/com/interview/stackqueue/RealTimeCounterUsingCircularQueue.java new file mode 100644 index 00000000..a3f77d49 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/RealTimeCounterUsingCircularQueue.java @@ -0,0 +1,83 @@ +package com.interview.stackqueue; + +import java.util.Deque; +import java.util.LinkedList; + +public class RealTimeCounterUsingCircularQueue { + + class Node { + long time; + int count; + } + + private static int MAX_SIZE = 0; + private static int BOUND = 100; + private static int MAX_BOUND = 1000; + int count = 0; + private int currentSize = 0; + + Deque queue = new LinkedList(); + + public void add(long time) { + Node last = queue.peekLast(); + if(last != null){ + if (time - last.time < BOUND) { + last.count++; + count++; + return; + } else if (time - last.time > MAX_BOUND) { + queue.clear(); + Node n = new Node(); + n.time = time/BOUND * BOUND; + n.count = 1; + queue.add(n); + count++; + return; + } + } + while(queue.size() > 0){ + Node t1 = queue.peekFirst(); + if(time - t1.time > MAX_BOUND){ + count = count - t1.count; + queue.pollFirst(); + }else{ + break; + } + } + + Node n = new Node(); + n.time = time/BOUND * BOUND; + n.count = 1; + queue.add(n); + count++; + } + + public int getCount(int time){ + while(queue.size() > 0){ + Node t1 = queue.peekFirst(); + if(time - t1.time > MAX_BOUND){ + count = count - t1.count; + queue.pollFirst(); + }else{ + break; + } + } + return count; + } + + public static void main(String args[]){ + RealTimeCounterUsingCircularQueue src = new RealTimeCounterUsingCircularQueue(); + src.add(10); + src.add(70); + src.add(80); + src.add(120); + src.add(150); + src.add(450); + src.add(750); + src.add(799); + src.add(1001); + src.add(1010); + src.add(1210); + System.out.print(src.getCount(1515)); + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/RemoveDuplicateMaintainingOrder.java b/showmecode_100/java/com/interview/stackqueue/RemoveDuplicateMaintainingOrder.java new file mode 100644 index 00000000..38e432b9 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/RemoveDuplicateMaintainingOrder.java @@ -0,0 +1,56 @@ +package com.interview.stackqueue; + +import java.util.*; + +/** + * Date 02/29/2016 + * @author Tushar Roy + * + * Given a string remove duplicates from the string maintaining order + * and getting lexicographically smallest string. + * + * Reference: + * https://leetcode.com/problems/remove-duplicate-letters/ + */ +public class RemoveDuplicateMaintainingOrder { + public String removeDuplicateLetters(String s) { + Deque stack = new LinkedList<>(); + Map count = new HashMap<>(); + for (int i = 0; i < s.length(); i++) { + count.compute(s.charAt(i), (key, val) -> { + if (val == null) { + return 1; + } else { + return val + 1; + } + }); + } + + Set visited = new HashSet<>(); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + count.put(ch, count.get(ch) - 1); + if (visited.contains(ch)) { + continue; + } + while (!stack.isEmpty() && stack.peekFirst() > ch && count.get(stack.peekFirst()) > 0) { + visited.remove(stack.peekFirst()); + stack.pollFirst(); + } + + stack.offerFirst(ch); + visited.add(ch); + } + + StringBuffer buff = new StringBuffer(); + while (!stack.isEmpty()) { + buff.append(stack.pollLast()); + } + return buff.toString(); + } + + public static void main(String args[]) { + RemoveDuplicateMaintainingOrder rm = new RemoveDuplicateMaintainingOrder(); + System.out.println(rm.removeDuplicateLetters("cbacdcbc")); + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/RemoveExtraBrackets.java b/showmecode_100/java/com/interview/stackqueue/RemoveExtraBrackets.java new file mode 100644 index 00000000..0380c840 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/RemoveExtraBrackets.java @@ -0,0 +1,180 @@ +package com.interview.stackqueue; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * Date 03/17/2015 + * @author tusroy + * + * Given a string with unbalanced brackets how do you remove minimum number + * of extra brackets so that you are left with balanced brackets in the string + * + * e.g )( -> empty string + * (a) -> (a) + * ((mnq)abc))) -> ((mna)abc) + * (abc)(( -> (abc) + * + * Solution 1 + * Keep a stack. When non bracket character shows up just skip it. + * When an opening bracket shows up just add it. + * When closing bracket shows up, see if top of stack is opening bracket. If yes + * then just remove that from stack else add closing bracket into the stack. + * + * Solution 2 + * This can be done without stack as well. Keep count of open and close brackets. + * Any time closeBracket gets more than openBracket do not put it in result. + * After we are done iterating input again if openBracket is more than closeBracket + * get rid of last (openBracket-closeBracket) open brackets. + * + * Test cases: + * empty string + * String with )( + * String with all opening brackets + * String with all closing brackets + * String with mix of open close brackets and characters between them + * String with already balanced parenthesis + * + */ +public class RemoveExtraBrackets { + + public int remove(char input[]){ + if(input == null){ + return 0; + } + Deque dq = new LinkedList(); + for(int i=0; i < input.length; i++){ + //skip non bracket characters + if(input[i] != '(' && input[i] != ')'){ + continue; + } + + //add opening brackets + if(input[i] == '('){ + dq.addFirst(i); + } + else if(input[i] == ')'){ + //if top is opening bracket just remove from stack else add closing bracket + if(!dq.isEmpty() && input[dq.peekFirst()] == '('){ + dq.pollFirst(); + }else{ + dq.addFirst(i); + } + } + } + int index = 0; + //iterate through list again and don't add leftover + //characters from stack in final result + for(int i=0; i < input.length; i++){ + if(!dq.isEmpty() && i == dq.peekLast()) { + dq.pollLast(); + }else { + input[index++] = input[i]; + } + } + return index; + } + + /** + * This method does not uses stack and does inplace conversion + */ + public int removeWithoutExtraSpace(char input[]){ + int openBrackets = 0; + int closeBrackets = 0; + + int index = 0; + for(int i=0; i < input.length; i++){ + if(input[i] != '(' && input[i] != ')'){ + input[index++] = input[i]; + continue; + } + if(input[i] == '('){ + openBrackets++; + input[index++] = input[i]; + }else { + //add close bracket to input only if it is + //less than open bracket count. + if(closeBrackets < openBrackets){ + input[index++] = input[i]; + closeBrackets++; + } + } + } + + //iterate through result get rid of extra open brackets if any towards + //the end + if(openBrackets > closeBrackets){ + int newIndex = 0; + int seenOpenBracket = 0; + for(int i=0; i < index; i++){ + if(input[i] == '('){ + seenOpenBracket++; + } + if(input[i] != '(' || seenOpenBracket <= closeBrackets){ + input[newIndex++] = input[i]; + } + } + index = newIndex; + } + return index; + } + + public static void printArray(char input[], int size) { + for(int i=0; i < size; i++){ + System.out.print(input[i] + " "); + } + System.out.println(); + } + + public static void main(String args[]){ + RemoveExtraBrackets reb = new RemoveExtraBrackets(); + char input1[] = ")(".toCharArray(); + int pos = reb.remove(input1); + printArray(input1, pos); + + char input1_1[] = ")(".toCharArray(); + pos = reb.removeWithoutExtraSpace(input1_1); + printArray(input1_1, pos); + + char input2[] = "(((abc)(lm)(()".toCharArray(); + pos = reb.remove(input2); + printArray(input2, pos); + + char input2_1[] = "(((abc)(lm)(()".toCharArray(); + pos = reb.removeWithoutExtraSpace(input2_1); + printArray(input2_1, pos); + + char input3[] = "(((c)(l))))(()))".toCharArray(); + pos = reb.remove(input3); + printArray(input3, pos); + + char input3_1[] = "(((c)(l))))(()))".toCharArray(); + pos = reb.removeWithoutExtraSpace(input3_1); + printArray(input3_1, pos); + + char input4[] = "((((".toCharArray(); + pos = reb.remove(input4); + printArray(input4, pos); + + char input4_1[] = "((((".toCharArray(); + pos = reb.removeWithoutExtraSpace(input4_1); + printArray(input4_1, pos); + + char input5[] = "))))".toCharArray(); + pos = reb.remove(input5); + printArray(input5, pos); + + char input5_1[] = "))))".toCharArray(); + pos = reb.removeWithoutExtraSpace(input5_1); + printArray(input5_1, pos); + + char input6[] = "((Test))(Great)".toCharArray(); + pos = reb.remove(input6); + printArray(input6, pos); + + char input6_1[] = "((Test))(Great)".toCharArray(); + pos = reb.removeWithoutExtraSpace(input6_1); + printArray(input6_1, pos); + + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/ReverseStackUsingRecursion.java b/showmecode_100/java/com/interview/stackqueue/ReverseStackUsingRecursion.java new file mode 100644 index 00000000..a488bbb0 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/ReverseStackUsingRecursion.java @@ -0,0 +1,56 @@ +package com.interview.stackqueue; + +import java.util.Deque; +import java.util.Iterator; +import java.util.LinkedList; + +/** + * http://www.geeksforgeeks.org/reverse-a-stack-using-recursion/ + */ +public class ReverseStackUsingRecursion { + + public void reverse(Deque stack){ + if(stack.size() == 0){ + return; + } + int temp = stack.pollFirst(); + reverse(stack); + + pushAtBottom(stack,temp); + } + + private void pushAtBottom(Deque stack,int data){ + if(stack.size() == 0){ + stack.offerFirst(data); + return; + } + int temp = stack.pollFirst(); + pushAtBottom(stack, data); + stack.offerFirst(temp); + } + + public static void main(String args[]){ + Deque stack = new LinkedList(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + stack.push(6); + + Iterator itr = stack.iterator(); + while(itr.hasNext()){ + System.out.println(itr.next()); + } + + ReverseStackUsingRecursion rsu = new ReverseStackUsingRecursion(); + rsu.reverse(stack); + + itr = stack.iterator(); + while(itr.hasNext()){ + System.out.println(itr.next()); + } + + } + +} diff --git a/showmecode_100/java/com/interview/stackqueue/SimplyPath.java b/showmecode_100/java/com/interview/stackqueue/SimplyPath.java new file mode 100644 index 00000000..2d13d6cb --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/SimplyPath.java @@ -0,0 +1,51 @@ +package com.interview.stackqueue; + +import java.util.Deque; +import java.util.LinkedList; +import java.util.StringTokenizer; + +/** + * Date 04/18/2016 + * @author Tushar Roy + * + * Given an absolute path for a file (Unix-style), simplify it. + * For example, + * path = "/home/", => "/home" + * path = "/a/./b/../../c/", => "/c" + * + * Space complexity O(n) + * Time complexity O(n) + * + * https://leetcode.com/problems/simplify-path/ + */ +public class SimplyPath { + + public String simplifyPath(String path) { + Deque stack = new LinkedList<>(); + StringTokenizer token = new StringTokenizer(path, "/"); + while (token.hasMoreTokens()) { + String tok = token.nextToken(); + if (tok.equals(".")) { + continue; + } else if (tok.equals("..")) { + stack.pollFirst(); + } else { + stack.offerFirst(tok); + } + } + StringBuffer buff = new StringBuffer(); + if (stack.isEmpty()) { + buff.append("/"); + } + while(!stack.isEmpty()) { + buff.append("/").append(stack.pollLast()); + } + return buff.toString(); + } + + public static void main(String args[]){ + String absCurrentFolder = "/home/tusroy"; + SimplyPath mfc = new SimplyPath(); + System.out.println(mfc.simplifyPath(absCurrentFolder)); + } +} diff --git a/showmecode_100/java/com/interview/stackqueue/StockSpanProblem.java b/showmecode_100/java/com/interview/stackqueue/StockSpanProblem.java new file mode 100644 index 00000000..794599c5 --- /dev/null +++ b/showmecode_100/java/com/interview/stackqueue/StockSpanProblem.java @@ -0,0 +1,44 @@ +package com.interview.stackqueue; + +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Deque; + +/** + * Created by saitejatokala on 21/11/15. + * http://www.geeksforgeeks.org/the-stock-span-problem/ + * Question: + * The stock span problem is a financial problem where we have a series of n daily price quotes for a stock and we need to calculate span of stock’s price for all n days. + * The span Si of the stock’s price on a given day i is defined as the maximum number of consecutive days just before the given day, for which the price of the stock on the current day is less than or equal to its price on the given day. + * For example, if an array of 7 days prices is given as {100, 80, 60, 70, 60, 75, 85}, then the span values for corresponding 7 days are {1, 1, 1, 2, 1, 4, 6} + * + * Solution 1: + * We see that S[i] on day i can be easily computed if we know the closest day preceding i, such that the price is greater than on that day than the price on day i. If such a day exists, let’s call it h(i), otherwise, we define h(i) = -1. + * The span is now computed as S[i] = i – h(i). See the following diagram. + */ +public class StockSpanProblem { + public static int[] stockSpan(int[] prices){ + Deque stack = new ArrayDeque<>(); + int[] stockSpan = new int[prices.length]; + stockSpan[0] = 1; + stack.offerFirst(0); + for (int i = 1; i < prices.length ; i++) { + while (!stack.isEmpty() && prices[stack.peekFirst()] < prices[i]) { + stack.pollFirst(); + } + if (stack.isEmpty()) { + stockSpan[i] = i + 1; + } else { + stockSpan[i] = i - stack.peekFirst(); + } + stack.offerFirst(i); + } + return stockSpan; + } + + public static void main(String[] args) { + int[] prices = {100, 80, 60, 70, 60, 75, 85}; + int[] result = stockSpan(prices); + System.out.print(Arrays.toString(result)); + } +} diff --git a/showmecode_100/java/com/interview/string/AnagramOfFirstAsSubstring.java b/showmecode_100/java/com/interview/string/AnagramOfFirstAsSubstring.java new file mode 100644 index 00000000..4d2896d5 --- /dev/null +++ b/showmecode_100/java/com/interview/string/AnagramOfFirstAsSubstring.java @@ -0,0 +1,85 @@ +package com.interview.string; + +import java.util.HashMap; +import java.util.Map; + +/** + * http://www.careercup.com/question?id=5389078581215232 + * Given two strings tells if anagram of first is substring of another + * Keep map of characters in array1 and keep checking if array2 has these characters. + * main string : a b a c a b b and looking for a a b b c when 3rd a is encountered + * we move index to second a and start from there. + * + * Another idea is to keep a sorted linklist of string in comparison. Whenever a new character + * is to be added remove last character from linklist and add this new one. + */ +public class AnagramOfFirstAsSubstring { + + public boolean isSubString(char str1[], char str2[]) { + int index = 0; + int curLen = 0; + Map count = new HashMap(); + for (int i = 0; i < str1.length; i++) { + incrementCount(str1[i], count); + } + Map currentCount = new HashMap(); + Map pos = new HashMap(); + while (index < str2.length) { + if (containsAndUpdate(currentCount, count, str2[index], pos, index)) { + index++; + curLen++; + } else { + Integer p = pos.get(str2[index]); + if (p != null) { + curLen = index - p; + index = p; + } else { + index++; + } + currentCount.clear(); + pos.clear(); + } + if (curLen == str1.length) { + return true; + } + } + return false; + } + + private boolean containsAndUpdate(Map currentCount, + Map count, Character ch, + Map pos, int index) { + if (count.containsKey(ch)) { + if(currentCount.containsKey(ch)) { + if (currentCount.get(ch) < count.get(ch)) { + if (currentCount.get(ch) == 1) { + pos.put(ch, index); + } + currentCount.put(ch, currentCount.get(ch) + 1); + return true; + } + }else{ + currentCount.put(ch, 1); + pos.put(ch,index); + return true; + } + } + return false; + } + + private void incrementCount(Character ch, Map count) { + if (count.containsKey(ch)) { + int c = count.get(ch); + count.put(ch, c + 1); + } else { + count.put(ch, 1); + } + } + + public static void main(String args[]){ + char str1[] = "aaabccde".toCharArray(); + char str2[] = "tbcdaacaaecbd".toCharArray(); + AnagramOfFirstAsSubstring ana = new AnagramOfFirstAsSubstring(); + System.out.println(ana.isSubString(str1, str2)); + } +} diff --git a/showmecode_100/java/com/interview/string/CycleLeaderIteration.java b/showmecode_100/java/com/interview/string/CycleLeaderIteration.java new file mode 100644 index 00000000..35e828c6 --- /dev/null +++ b/showmecode_100/java/com/interview/string/CycleLeaderIteration.java @@ -0,0 +1,39 @@ +package com.interview.string; + +public class CycleLeaderIteration { + + //assumption that size is going to be 3^k +1 from start to end + public void iterate(char str[],int start,int end){ + int len = end - start +1; + int power = 1; + while(power < len){ + int index = power; + int newIndex = -1; + char temp = str[start+index]; + char temp1; + while(newIndex != power){ + if(index % 2 ==0){ + newIndex = index/2; + }else{ + newIndex = len/2 + index/2; + } + temp1 = str[start + newIndex]; + str[start+newIndex] = temp; + temp = temp1; + index = newIndex; + } + power = power*3; + } + } + + public static void main(String args[]){ + String str = "1a2b3c4d5e6f7g8h9iAjBkClDmEn"; + char[] str1 = str.toCharArray(); + CycleLeaderIteration cli = new CycleLeaderIteration(); + cli.iterate(str1, 0, str1.length); + for(char ch: str1){ + System.out.print(ch + " "); + } + } + +} diff --git a/showmecode_100/java/com/interview/string/GroupAnagramsTogether.java b/showmecode_100/java/com/interview/string/GroupAnagramsTogether.java new file mode 100644 index 00000000..ec0d2d27 --- /dev/null +++ b/showmecode_100/java/com/interview/string/GroupAnagramsTogether.java @@ -0,0 +1,35 @@ +package com.interview.string; + +import java.util.*; + +/** + * https://leetcode.com/problems/anagrams/ + */ +public class GroupAnagramsTogether { + public List> groupAnagrams(String[] strs) { + if (strs == null || strs.length == 0) + return new ArrayList>(); + + int listIndex = 0; + List> result = new ArrayList<>(); + Map anagramGroup = new HashMap<>(); + + for (String str : strs) { + char[] chars = str.toCharArray(); + Arrays.sort(chars); + String sorted = new String(chars); + if (anagramGroup.containsKey(sorted)) { + int index = anagramGroup.get(sorted); + List listResult = result.get(index); + listResult.add(str); + } else { + List resultList = new ArrayList<>(); + resultList.add(str); + result.add(listIndex, resultList); + anagramGroup.put(sorted, listIndex); + listIndex++; + } + } + return result; + } +} diff --git a/showmecode_100/java/com/interview/string/InPlaceTransformationOfString.java b/showmecode_100/java/com/interview/string/InPlaceTransformationOfString.java new file mode 100644 index 00000000..ff34ad14 --- /dev/null +++ b/showmecode_100/java/com/interview/string/InPlaceTransformationOfString.java @@ -0,0 +1,87 @@ +package com.interview.string; + +/** + * http://www.geeksforgeeks.org/an-in-place-algorithm-for-string-transformation/ + */ +public class InPlaceTransformationOfString { + + private void reverse(char []str, int low, int high){ + while(low 0){ + int end = get3PowerK1(size); + size = size-end; + CycleLeaderIteration cli = new CycleLeaderIteration(); + cli.iterate(str, low, end + low-1); + low = low+end; + } + size = str.length; + low =0; + int end = get3PowerK1(size); + while(end < str.length){ + int nextEnd = get3PowerK1(str.length-end); + reverse(str,end/2,end-1); + reverse(str,end/2,end+nextEnd/2-1); + reverse(str,end/2,end/2+nextEnd/2-1); + // size = str.length - (end + nextEnd); + end = end + nextEnd; + } + } + + private int get3PowerK1(int size){ + int power = 1; + while((power*3 +1)<= size){ + power = power*3; + } + return power+1; + } + + public static void main(String args[]){ + char str[] = {'a','1','b','2','c','3','d','4','e','5','f','6','g','7','h','8','i','9','j','A','k','B','l','C','m','D'}; + InPlaceTransformationOfString ip = new InPlaceTransformationOfString(); + ip.inPlaceTransformationImproved(str); + for(int i=0; i < str.length; i++){ + System.out.print(str[i]); + } + } + +} diff --git a/showmecode_100/java/com/interview/string/LexicographicRankInPermutation.java b/showmecode_100/java/com/interview/string/LexicographicRankInPermutation.java new file mode 100644 index 00000000..282e57a5 --- /dev/null +++ b/showmecode_100/java/com/interview/string/LexicographicRankInPermutation.java @@ -0,0 +1,43 @@ +package com.interview.string; + +public class LexicographicRankInPermutation { + + //you can create a AVL tree to efficiently find total + //number of smaller characters. + //You can keep size of subtree at root and keep moving left or right + //depending on the character you looking for + private int findNumberOfSmallerCharactersOnRight(int index,char []str){ + int count=0; + for(int i=index+1; i < str.length; i++){ + if(str[i] < str[index]){ + count++; + } + } + return count; + } + + private int factorial(int n){ + int fact = 1; + for(int i =1; i <=n; i++){ + fact = i*fact; + } + return fact; + } + + public int rank(char []str){ + + int rank =0; + for(int i=0; i < str.length;i++){ + int num = findNumberOfSmallerCharactersOnRight(i, str); + rank += factorial(str.length -i-1)*num; + } + return rank+1; + + } + + public static void main(String args[]){ + LexicographicRankInPermutation lrp = new LexicographicRankInPermutation(); + int rank = lrp.rank("STRING".toCharArray()); + System.out.println(rank); + } +} diff --git a/showmecode_100/java/com/interview/string/LongestPalindromeSubstring.java b/showmecode_100/java/com/interview/string/LongestPalindromeSubstring.java new file mode 100644 index 00000000..096cd60b --- /dev/null +++ b/showmecode_100/java/com/interview/string/LongestPalindromeSubstring.java @@ -0,0 +1,169 @@ +package com.interview.string; + +/** + * Date 07/29/2015 + * @author Tushar Roy + * + * Given a string find longest palindromic substring in this string. + * + * References + * http://www.geeksforgeeks.org/longest-palindrome-substring-set-1/ + * http://www.geeksforgeeks.org/longest-palindromic-substring-set-2/ + * http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html + * http://www.akalin.cx/longest-palindrome-linear-time + * http://tarokuriyama.com/projects/palindrome2.php + */ +public class LongestPalindromeSubstring { + + public int longestPalindromeSubstringEasy(char arr[]) { + + int longest_substring = 1; + for (int i = 0; i < arr.length; i++) { + + int x, y; + int palindrome; + x = i; + y = i + 1; + palindrome = 0; + while (x >= 0 && y < arr.length && arr[x] == arr[y]) { + x--; + y++; + palindrome += 2; + } + longest_substring = Math.max(longest_substring, palindrome); + + x = i - 1; + y = i + 1; + palindrome = 1; + while (x >= 0 && y < arr.length && arr[x] == arr[y]) { + x--; + y++; + palindrome += 2; + } + longest_substring = Math.max(longest_substring, palindrome); + } + return longest_substring; + } + + /** + * Linear time Manacher's algorithm to find longest palindromic substring. + * There are 4 cases to handle + * Case 1 : Right side palindrome is totally contained under current palindrome. In this case do not consider this as center. + * Case 2 : Current palindrome is proper suffix of input. Terminate the loop in this case. No better palindrom will be found on right. + * Case 3 : Right side palindrome is proper suffix and its corresponding left side palindrome is proper prefix of current palindrome. Make largest such point as + * next center. + * Case 4 : Right side palindrome is proper suffix but its left corresponding palindrome is be beyond current palindrome. Do not consider this + * as center because it will not extend at all. + * + * To handle even size palindromes replace input string with one containing $ between every input character and in start and end. + */ + public int longestPalindromicSubstringLinear(char input[]) { + int index = 0; + //preprocess the input to convert it into type abc -> $a$b$c$ to handle even length case. + //Total size will be 2*n + 1 of this new array. + char newInput[] = new char[2*input.length + 1]; + for(int i=0; i < newInput.length; i++) { + if(i % 2 != 0) { + newInput[i] = input[index++]; + } else { + newInput[i] = '$'; + } + } + + //create temporary array for holding largest palindrome at every point. There are 2*n + 1 such points. + int T[] = new int[newInput.length]; + int start = 0; + int end = 0; + //here i is the center. + for(int i=0; i < newInput.length; ) { + //expand around i. See how far we can go. + while(start >0 && end < newInput.length-1 && newInput[start-1] == newInput[end+1]) { + start--; + end++; + } + //set the longest value of palindrome around center i at T[i] + T[i] = end - start + 1; + + //this is case 2. Current palindrome is proper suffix of input. No need to proceed. Just break out of loop. + if(end == T.length -1) { + break; + } + //Mark newCenter to be either end or end + 1 depending on if we dealing with even or old number input. + int newCenter = end + (i%2 ==0 ? 1 : 0); + + for(int j = i + 1; j <= end; j++) { + + //i - (j - i) is left mirror. Its possible left mirror might go beyond current center palindrome. So take minimum + //of either left side palindrome or distance of j to end. + T[j] = Math.min(T[i - (j - i)], 2 * (end - j) + 1); + //Only proceed if we get case 3. This check is to make sure we do not pick j as new center for case 1 or case 4 + //As soon as we find a center lets break out of this inner while loop. + if(j + T[i - (j - i)]/2 == end) { + newCenter = j; + break; + } + } + //make i as newCenter. Set right and left to atleast the value we already know should be matching based of left side palindrome. + i = newCenter; + end = i + T[i]/2; + start = i - T[i]/2; + } + + //find the max palindrome in T and return it. + int max = Integer.MIN_VALUE; + for(int i = 0; i < T.length; i++) { + int val; + /* if(i%2 == 0) { + val = (T[i] -1)/2; + } else { + val = T[i]/2; + }*/ + val = T[i]/2; + if(max < val) { + max = val; + } + } + return max; + } + + public int longestPalindromeDynamic(char []str){ + boolean T[][] = new boolean[str.length][str.length]; + + for(int i=0; i < T.length; i++){ + T[i][i] = true; + } + + int max = 1; + for(int l = 2; l <= str.length; l++){ + int len = 0; + for(int i=0; i < str.length-l+1; i++){ + int j = i + l-1; + len = 0; + if(l == 2){ + if(str[i] == str[j]){ + T[i][j] = true; + len = 2; + } + }else{ + if(str[i] == str[j] && T[i+1][j-1]){ + T[i][j] = true; + len = j -i + 1; + } + } + if(len > max){ + max = len; + } + } + } + return max; + } + + public static void main(String args[]) { + LongestPalindromeSubstring lps = new LongestPalindromeSubstring(); + System.out.println(lps.longestPalindromicSubstringLinear("abba".toCharArray())); + System.out.println(lps.longestPalindromicSubstringLinear("abbababba".toCharArray())); + System.out.println(lps.longestPalindromicSubstringLinear("babcbaabcbaccba".toCharArray())); + System.out.println(lps.longestPalindromicSubstringLinear("cdbabcbabdab".toCharArray())); + } + +} diff --git a/showmecode_100/java/com/interview/string/LongestSubstringWithKDistinctCharacters.java b/showmecode_100/java/com/interview/string/LongestSubstringWithKDistinctCharacters.java new file mode 100644 index 00000000..8f51ced8 --- /dev/null +++ b/showmecode_100/java/com/interview/string/LongestSubstringWithKDistinctCharacters.java @@ -0,0 +1,84 @@ +package com.interview.string; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 04/03/2016 + * @author Tushar Roy + * + * Given a string, find the length of the longest substring T that contains at most k distinct characters. + * For example, Given s = “eceba” and k = 2, + * T is "ece" which its length is 3. + * + * Time complexity O(n) + * Space complexity O(n) + * + * https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/ + */ +public class LongestSubstringWithKDistinctCharacters { + public int lengthOfLongestSubstringKDistinct(String s, int k) { + if (k == 0 || s.length() == 0) { + return 0; + } + int[] ascii = new int[256]; + int count = 0; + int start = 0; + int max = 0; + for (int i = 0; i < s.length(); i++) { + int ch = s.charAt(i); + if (count < k) { + if (ascii[ch] == 0) { + count++; + } + } else if (ascii[ch] == 0){ + while (start < i) { + char ch1 = s.charAt(start++); + ascii[ch1]--; + if (ascii[ch1] == 0) { + break; + } + } + } + ascii[ch]++; + max = Math.max(max, i - start + 1); + } + return max; + } + + public int lengthOfLongestSubstringKDistinctUsingMap(String s, int k) { + if (k == 0 || s.length() == 0) { + return 0; + } + Map countMap = new HashMap<>(); + int max = 0; + int start = 0; + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + if (!countMap.containsKey(ch) && countMap.size() >= k) { + while (start < i) { + countMap.compute(s.charAt(start), (key, val) -> { + if (val == 1) { + return null; + } else { + return val - 1; + } + }); + start++; + if (countMap.size() < k) { + break; + } + } + } + countMap.compute(ch, (key, val) -> { + if (val == null) { + return 1; + } else { + return val + 1; + } + }); + max = Math.max(max, i - start + 1); + } + return max; + } +} diff --git a/showmecode_100/java/com/interview/string/LongestSubstringWithoutRepetingCharacter.java b/showmecode_100/java/com/interview/string/LongestSubstringWithoutRepetingCharacter.java new file mode 100644 index 00000000..792b1d5e --- /dev/null +++ b/showmecode_100/java/com/interview/string/LongestSubstringWithoutRepetingCharacter.java @@ -0,0 +1,38 @@ +package com.interview.string; + +import java.util.HashSet; +import java.util.Set; + +/** + * References + * http://www.geeksforgeeks.org/length-of-the-longest-substring-without-repeating-characters/ + * https://leetcode.com/problems/longest-substring-without-repeating-characters/ + */ +public class LongestSubstringWithoutRepetingCharacter { + + public int lengthOfLongestSubstring(String s) { + Set uniqueSet = new HashSet<>(); + int maxSize = 0; + int start = 0; + for(int i = 0; i < s.length(); i++) { + if(!uniqueSet.contains(s.charAt(i))) { + uniqueSet.add(s.charAt(i)); + if(uniqueSet.size() > maxSize) { + maxSize = uniqueSet.size(); + } + } else { + while (s.charAt(start) != s.charAt(i)) { + uniqueSet.remove(s.charAt(start)); + start++; + } + start++; + } + } + return maxSize; + } + + public static void main(String args[]){ + LongestSubstringWithoutRepetingCharacter lsw = new LongestSubstringWithoutRepetingCharacter(); + System.out.println(lsw.lengthOfLongestSubstring("ABCDECAMNCZB")); + } +} diff --git a/showmecode_100/java/com/interview/string/MultiplyStrings.java b/showmecode_100/java/com/interview/string/MultiplyStrings.java new file mode 100644 index 00000000..6eb3527e --- /dev/null +++ b/showmecode_100/java/com/interview/string/MultiplyStrings.java @@ -0,0 +1,112 @@ +package com.interview.string; + +/** + * https://leetcode.com/discuss/questions/oj/multiply-strings + */ +public class MultiplyStrings { + + public String multiply(String num1, String num2) { + String output = multiply(num1, num2, 0, num1.length() - 1, 0, num2.length() - 1); + return output; + } + + private String multiply(String num1, String num2, int start1, int end1, int start2, int end2) { + if (end1 - start1 == 0 || end2 - start2 == 0) { + return simpleMultiply(num1.substring(start1, end1 + 1), num2.substring(start2, end2 + 1)); + } + + int mid1 = (start1 + end1)/2; + int mid2 = (start2 + end2)/2; + + int count1 = end1 - mid1; + int count2 = end2 - mid2; + + String v1 = multiply(num1, num2, start1, mid1, start2, mid2); + String v2 = multiply(num1, num2, start1, mid1, mid2 + 1, end2); + String v3 = multiply(num1, num2, mid1 + 1, end1, start2, mid2); + String v4 = multiply(num1, num2, mid1 + 1, end1, mid2 + 1, end2); + + v1 = append0s(v1, count1 + count2); + v2 = append0s(v2, count1); + v3 = append0s(v3, count2); + + v1 = add(v1.toCharArray(), v2.toCharArray()); + v3 = add(v3.toCharArray(), v4.toCharArray()); + return add(v1.toCharArray(), v3.toCharArray()); + } + + private String simpleMultiply(String num1, String num2) { + String smaller; + String larger; + if (num1.length() == 1) { + smaller = num1; + larger = num2; + } else { + smaller = num2; + larger = num1; + } + int r2 = smaller.charAt(0) - '0'; + if (r2 == 0) { + return "0"; + } + int carry = 0; + StringBuffer stringBuffer = new StringBuffer(); + for (int i = larger.length() - 1; i >= 0; i--) { + int r1 = larger.charAt(i) - '0'; + int r = r1 * r2 + carry; + stringBuffer.append(r%10); + carry = r / 10; + } + if (carry != 0) { + stringBuffer.append(carry); + } + return stringBuffer.reverse().toString(); + } + + private String append0s(String v1, int count ) { + StringBuffer buff = new StringBuffer(v1); + for (int i = 0; i < count; i++) { + buff.append("0"); + } + return buff.toString(); + } + + public String add(char[] num1,char[] num2){ + int index1 = num1.length -1; + int index2 = num2.length -1; + int carry = 0; + StringBuffer buffer = new StringBuffer(); + while(index1 >= 0 && index2 >= 0){ + int r1 = num1[index1] - '0'; + int r2 = num2[index2] - '0'; + int r = r1 + r2 + carry; + buffer.append(r%10); + carry = r/10; + index1--; + index2--; + } + while(index1 >= 0){ + int r1 = num1[index1] - '0'; + int r = r1 + carry; + buffer.append(r%10); + carry = r/10; + index1--; + } + while(index2 >= 0){ + int r2 = num2[index2] - '0'; + int r = r2 + carry; + buffer.append(r%10); + carry = r/10; + index2--; + } + if (carry != 0) { + buffer.append(carry); + } + return buffer.reverse().toString(); + } + + public static void main(String args[]) { + MultiplyStrings ms = new MultiplyStrings(); + System.out.print(ms.multiply("6752716719037375654442652725945722915786612669126862029212","2840271321219335147")); + } +} diff --git a/showmecode_100/java/com/interview/string/NTMatch.java b/showmecode_100/java/com/interview/string/NTMatch.java new file mode 100644 index 00000000..1623c158 --- /dev/null +++ b/showmecode_100/java/com/interview/string/NTMatch.java @@ -0,0 +1,75 @@ +package com.interview.string; + +/** +.Given an input string S write a function which returns true if it satisfies S = nT. Basically you have to find if a given string can be represented from a substring by iterating it �n� times. n >= 2 +An example would suffice +Function should return true if +1) S = abab +2) S = abcdabcd +3) S = abcabcabc +4) S = zzxzzxzzx + +Function should return false if +1) S = abac +2) S = abcdabbd +3) S = abcabcefg +4) S = zzxzzyzzx + */ +public class NTMatch { + + public boolean match(char str[]){ + int kmp[] = buildKMP(str); + int index = kmp[str.length-1]; + //reason end is this rather than index+1 because + //if our string was ababab for KMP we would have index as 4 at str.length-1 and we + //want end to be 1 rather than 5 + int end = str.length - index-1; + if(end >= str.length/2){ + return false; + } + int j = end+1; + int i = 0; + while(j < str.length){ + if(str[i] != str[j]){ + return false; + } + i = (i+1)%(end+1); + j++; + } + + if(i == 0){ + return true; + } + return false; + } + + private int[] buildKMP(char str[]){ + + int result[] = new int[str.length]; + + int i =1; + result[0] = 0; + int len =0; + while(i < str.length){ + if(str[i] == str[len]){ + len++; + result[i] = len; + i++; + }else{ + if(len != 0){ + len = result[len-1]; + }else{ + len =0; + result[i] = 0; + i++; + } + } + } + return result; + } + + public static void main(String args[]){ + NTMatch ntMatch = new NTMatch(); + System.out.println(ntMatch.match("bababababa".toCharArray())); + } +} diff --git a/showmecode_100/java/com/interview/string/PalindromePair.java b/showmecode_100/java/com/interview/string/PalindromePair.java new file mode 100644 index 00000000..46397141 --- /dev/null +++ b/showmecode_100/java/com/interview/string/PalindromePair.java @@ -0,0 +1,100 @@ +package com.interview.string; + +import java.util.*; + +/** + * Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, + * so that the concatenation of the two words, i.e. words[i] + words[j] is a palindrome. + * + * Solution - + * First keep mapping of word and its index. + * Then iterate through every word and split it into every possible 2 substring. Then if first substring is palindrome + * and reverse of second substring is in map means you can form a palindrome by combing this word with the word + * in the map. + * + * Time complexity is O(n*k*k) + * + * Reference + * https://leetcode.com/problems/palindrome-pairs/ + */ +public class PalindromePair { + + public List> palindromePairs(String[] words) { + if (words == null || words.length < 2) { + return Collections.EMPTY_LIST; + } + Map wordMap = new HashMap<>(); + List> result = new ArrayList<>(); + + for (int i = 0; i < words.length; i++) { + wordMap.put(words[i], i); + } + + for (int i = 0; i < words.length; i++) { + for (int j = 0; j < words[i].length(); j++) { + String str1 = words[i].substring(0, j + 1); + String str2 = words[i].substring(j + 1, words[i].length()); + if (isPalindrome(str2)) { + String revStr1 = new StringBuilder(str1).reverse().toString(); + Integer index = wordMap.get(revStr1); + if (index != null) { + createList(i, wordMap.get(revStr1), result); + } + } + if (isPalindrome(str1)) { + String revStr2 = new StringBuilder(str2).reverse().toString(); + Integer index = wordMap.get(revStr2); + if (index != null) { + createList(wordMap.get(revStr2), i, result); + if (revStr2.equals("")) { + createList(i, wordMap.get(revStr2), result); + } + } + } + } + } + return result; + } + + private boolean isPalindrome(String word) { + int start = 0; + int end = word.length() - 1; + while (start < end) { + if (word.charAt(start) != word.charAt(end)) { + return false; + } + start++; + end--; + } + return true; + } + + private void createList(int i1, int i2, List> result) { + if (i1 == i2) { + return; + } + List r = new ArrayList<>(); + r.add(i1); + r.add(i2); + result.add(r); + } + + public static void main(String args[]) { + PalindromePair palindromePair = new PalindromePair(); + String[] words = {"bat", "tab"}; + List> result = palindromePair.palindromePairs(words); + System.out.println(result); + String[] words1 = {"abcd", "dcba", "lls", "s", "sssll"}; + result = palindromePair.palindromePairs(words1); + System.out.println(result); + String[] words2 = {"", "abcd", "abba"}; + result = palindromePair.palindromePairs(words2); + System.out.println(result); + String[] words3 = {"a","abc","aba",""}; + result = palindromePair.palindromePairs(words3); + System.out.println(result); + String[] words4 = {"abcd","dcba","lls","s","sssll"}; + result = palindromePair.palindromePairs(words4); + System.out.println(result); + } +} diff --git a/showmecode_100/java/com/interview/string/PrintAnagramTogether.java b/showmecode_100/java/com/interview/string/PrintAnagramTogether.java new file mode 100644 index 00000000..df1c4593 --- /dev/null +++ b/showmecode_100/java/com/interview/string/PrintAnagramTogether.java @@ -0,0 +1,40 @@ +package com.interview.string; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +public class PrintAnagramTogether { + + public void print(String[] string){ + Map> invertedIndex = new HashMap>(); + int index = 0; + for(String str : string){ + char [] charArray = str.toCharArray(); + Arrays.sort(charArray); + String newString = new String(charArray); + if(invertedIndex.containsKey(newString)){ + List pos = invertedIndex.get(newString); + pos.add(index); + }else{ + List pos = new ArrayList(); + pos.add(index); + invertedIndex.put(newString, pos); + } + index++; + } + for(List result : invertedIndex.values()){ + for(Integer i : result){ + System.out.println(string[i]); + } + } + } + + public static void main(String args[]){ + String str[] = {"cat","dog","tac","god","act"}; + PrintAnagramTogether pat = new PrintAnagramTogether(); + pat.print(str); + } + +} diff --git a/showmecode_100/java/com/interview/string/RabinKarpSearch.java b/showmecode_100/java/com/interview/string/RabinKarpSearch.java new file mode 100644 index 00000000..6bdb033b --- /dev/null +++ b/showmecode_100/java/com/interview/string/RabinKarpSearch.java @@ -0,0 +1,72 @@ +package com.interview.string; + +/** + * Date 09/25/2014 + * @author Tushar Roy + * + * Rabin Karp algorith for substring matching. + * + * Time complexity in worst case O(n^2)(depends on hash function) + * Space complexity O(1) + * + * References + * https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm + */ +public class RabinKarpSearch { + + private int prime = 101; + + public int patternSearch(char[] text, char[] pattern){ + int m = pattern.length; + int n = text.length; + long patternHash = createHash(pattern, m - 1); + long textHash = createHash(text, m - 1); + for (int i = 1; i <= n - m + 1; i++) { + if(patternHash == textHash && checkEqual(text, i - 1, i + m - 2, pattern, 0, m - 1)) { + return i - 1; + } + if(i < n - m + 1) { + textHash = recalculateHash(text, i - 1, i + m - 1, textHash, m); + } + } + return -1; + } + + private long recalculateHash(char[] str,int oldIndex, int newIndex,long oldHash, int patternLen) { + long newHash = oldHash - str[oldIndex]; + newHash = newHash/prime; + newHash += str[newIndex]*Math.pow(prime, patternLen - 1); + return newHash; + } + + private long createHash(char[] str, int end){ + long hash = 0; + for (int i = 0 ; i <= end; i++) { + hash += str[i]*Math.pow(prime,i); + } + return hash; + } + + private boolean checkEqual(char str1[],int start1,int end1, char str2[],int start2,int end2){ + if(end1 - start1 != end2 - start2) { + return false; + } + while(start1 <= end1 && start2 <= end2){ + if(str1[start1] != str2[start2]){ + return false; + } + start1++; + start2++; + } + return true; + } + + public static void main(String args[]){ + RabinKarpSearch rks = new RabinKarpSearch(); + System.out.println(rks.patternSearch("TusharRoy".toCharArray(), "sharRoy".toCharArray())); + System.out.println(rks.patternSearch("TusharRoy".toCharArray(), "Roy".toCharArray())); + System.out.println(rks.patternSearch("TusharRoy".toCharArray(), "shas".toCharArray())); + System.out.println(rks.patternSearch("TusharRoy".toCharArray(), "usha".toCharArray())); + System.out.println(rks.patternSearch("TusharRoy".toCharArray(), "Tus".toCharArray())); + } +} diff --git a/showmecode_100/java/com/interview/string/RearrangeDuplicateCharsdDistanceAway.java b/showmecode_100/java/com/interview/string/RearrangeDuplicateCharsdDistanceAway.java new file mode 100644 index 00000000..17edb298 --- /dev/null +++ b/showmecode_100/java/com/interview/string/RearrangeDuplicateCharsdDistanceAway.java @@ -0,0 +1,159 @@ +package com.interview.string; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; + +/** + * http://www.geeksforgeeks.org/rearrange-a-string-so-that-all-same-characters-become-at-least-d-distance-away/ + * + */ +public class RearrangeDuplicateCharsdDistanceAway { + + class CharCount implements Comparable{ + char ch; + int count; + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ch; + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CharCount other = (CharCount) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (ch != other.ch) + return false; + return true; + } + private RearrangeDuplicateCharsdDistanceAway getOuterType() { + return RearrangeDuplicateCharsdDistanceAway.this; + } + + + @Override + public String toString() { + return "CharCount [ch=" + ch + ", count=" + count + "]"; + } + @Override + public int compareTo(CharCount cc) { + if(this.count >= cc.count){ + return -1; + }else{ + return 1; + } + } + + } + + public boolean rearrangeExactKDistanceAway(char input[],int d){ + PriorityQueue heap = new PriorityQueue(); + Map map = new HashMap(); + for(int i=0; i < input.length; i++){ + int count = 1; + if(map.containsKey(input[i])){ + count = map.get(input[i]); + count++; + } + map.put(input[i], count); + input[i] = 0; + } + for(Character ch : map.keySet()){ + CharCount cc = new CharCount(); + cc.ch = ch; + cc.count = map.get(ch); + heap.add(cc); + } + + while(heap.size() > 0){ + CharCount cc = heap.poll(); + int i; + for(i=0; i < input.length && input[i] != 0; i++); + if(i == input.length){ + return false; + } + while(cc.count > 0 && i < input.length){ + input[i] = cc.ch; + i = i + d; + cc.count--; + } + if(cc.count > 0){ + return false; + } + } + return true; + } + + private void getAllFeasibleCharacters(char output[], int k,int pos,Set allChars){ + for(int i = pos-1; i > pos -k && i >=0; i--){ + allChars.remove(output[i]); + } + } + + public boolean rearrangeAtleastkDistanceAway(char input[],int k){ + Map map = new HashMap(); + for(int i=0; i < input.length; i++){ + int count = 1; + if(map.containsKey(input[i])){ + count = map.get(input[i]); + count++; + } + map.put(input[i], count); + input[i] = 0; + } + return rearrangeAtleastkDistanceAway(map, input, 0, k); + } + + public boolean rearrangeAtleastkDistanceAway(Map charCount,char output[],int pos,int k){ + if(pos == output.length && charCount.size() == 0){ + return true; + } + Set allChars = new HashSet(); + for(char ch : charCount.keySet()){ + allChars.add(ch); + } + getAllFeasibleCharacters(output,k,pos,allChars); + for(char ch : allChars){ + output[pos] = ch; + int c = charCount.get(ch); + if(c -1 == 0){ + charCount.remove(ch); + }else{ + charCount.put(ch, c-1); + } + boolean r = rearrangeAtleastkDistanceAway(charCount, output, pos+1, k); + if(r){ + return true; + } + charCount.put(ch, c); + } + return false; + } + + public static void main(String args[]){ + String str = "ABBACCCCDD"; + char input[] = str.toCharArray(); + RearrangeDuplicateCharsdDistanceAway rdc =new RearrangeDuplicateCharsdDistanceAway(); + boolean r =rdc.rearrangeAtleastkDistanceAway(input, 3); + if(r){ + for(char ch : input){ + System.out.print(ch + " "); + } + }else{ + System.out.println("Not possible"); + } + } + +} diff --git a/showmecode_100/java/com/interview/string/RemoveConsecutiveDuplicate.java b/showmecode_100/java/com/interview/string/RemoveConsecutiveDuplicate.java new file mode 100644 index 00000000..0345da4c --- /dev/null +++ b/showmecode_100/java/com/interview/string/RemoveConsecutiveDuplicate.java @@ -0,0 +1,39 @@ +package com.interview.string; + +/** + * Remove consecutive duplicate characters + * e.g + * AABBCDDAAB -> ABCDAB + * ABBBCCD -> ABCD + * Test cases + * Empty string + * all unique + * all duplicates + * duplicates at certain different places + */ +public class RemoveConsecutiveDuplicate { + + public int removeDuplicates(char input[]){ + int slow = 0; + int fast = 0; + int index = 0; + while(fast < input.length){ + while(fast < input.length && input[slow] == input[fast]){ + fast++; + } + input[index++] = input[slow]; + slow = fast; + } + return index; + } + + public static void main(String args[]){ + String str = "AAABBCCDDDEFGH"; + char input[] = str.toCharArray(); + RemoveConsecutiveDuplicate rcd = new RemoveConsecutiveDuplicate(); + int len = rcd.removeDuplicates(input); + for(int i=0; i < len; i++){ + System.out.print(input[i] + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/string/RunLengthEncoding.java b/showmecode_100/java/com/interview/string/RunLengthEncoding.java new file mode 100644 index 00000000..5def89b5 --- /dev/null +++ b/showmecode_100/java/com/interview/string/RunLengthEncoding.java @@ -0,0 +1,54 @@ +package com.interview.string; + +public class RunLengthEncoding { + + private int updateCounter(char[] result, int current, int counter){ + + int tempCounter = counter; + int len = 1; + while(tempCounter > 0){ + len = len*10; + tempCounter /= 10; + } + len = len/10; + + while(counter > 0){ + result[current++] = (char)((counter/len) + '0'); + counter = counter%len; + len /= 10; + } + return current; + } + + public int encoding(char[] str,char[] result){ + + char pickedChar = str[0]; + int current =0; + int counter =1; + for(int i=1; i < str.length; i++){ + if(str[i] == pickedChar){ + counter++; + } + else{ + result[current++] = pickedChar; + current = updateCounter(result, current, counter); + pickedChar = str[i]; + counter =1; + } + } + result[current++] = pickedChar; + current = updateCounter(result, current, counter); + return current; + } + + public static void main(String args[]){ + + String str = "AAAAAAAAAAAAABBCDDEEEEE"; + char result[] = new char[str.length()*2]; + RunLengthEncoding rle = new RunLengthEncoding(); + int current = rle.encoding(str.toCharArray(),result); + for(int i=0; i < current; i++){ + System.out.print(result[i]); + } + } +} diff --git a/showmecode_100/java/com/interview/string/SmallestWindowContaingAllCharacters.java b/showmecode_100/java/com/interview/string/SmallestWindowContaingAllCharacters.java new file mode 100644 index 00000000..85f4e008 --- /dev/null +++ b/showmecode_100/java/com/interview/string/SmallestWindowContaingAllCharacters.java @@ -0,0 +1,69 @@ +package com.interview.string; + +/** + * References + * https://leetcode.com/problems/minimum-window-substring/ + * http://www.geeksforgeeks.org/find-the-smallest-window-in-a-string-containing-all-characters-of-another-string/ + */ +import java.util.HashMap; +import java.util.Map; + +public class SmallestWindowContaingAllCharacters { + + public String minWindow(String s, String t) { + Map countMap = new HashMap<>(); + for (char ch : t.toCharArray()) { + Integer val = countMap.get(ch); + if (val == null) { + val = 0; + } + countMap.put(ch, val + 1); + } + int start = 0; + int currLen = t.length(); + int minWindow = Integer.MAX_VALUE; + int minStart = 0; + int i = 0; + while (i < s.length()) { + Integer val = countMap.get(s.charAt(i)); + if (val == null) { + i++; + continue; + } + if (val > 0) { + currLen--; + } + val--; + countMap.put(s.charAt(i), val); + while (currLen == 0) { + if (minWindow > i - start + 1) { + minWindow = i - start + 1; + minStart = start; + } + Integer val1 = countMap.get(s.charAt(start)); + if (val1 != null) { + if (val1 == 0) { + break; + } else { + val1++; + countMap.put(s.charAt(start), val1); + } + } + start++; + } + i++; + } + + return minWindow != Integer.MAX_VALUE ? s.substring(minStart, minStart + minWindow) : ""; + } + + public static void main(String args[]) { + + String str = "Tsuaosyogrlmnsluuorjkoruost"; + String subString = "soor"; + SmallestWindowContaingAllCharacters swcac = new SmallestWindowContaingAllCharacters(); + String result = swcac.minWindow(str, subString); + System.out.println(result); + } + +} diff --git a/showmecode_100/java/com/interview/string/StringEncoderDecoder.java b/showmecode_100/java/com/interview/string/StringEncoderDecoder.java new file mode 100644 index 00000000..099a9bff --- /dev/null +++ b/showmecode_100/java/com/interview/string/StringEncoderDecoder.java @@ -0,0 +1,59 @@ +package com.interview.string; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 04/06/2016 + * @author Tushar Roy + * + * Design an algorithm to encode a list of strings to a string. The encoded string is then sent over the network + * and is decoded back to the original list of strings. + * + * Reference + * https://leetcode.com/problems/encode-and-decode-strings/ + */ +public class StringEncoderDecoder { + + // Encodes a list of strings to a single string. + public String encode(List strs) { + StringBuffer buff = new StringBuffer(); + for (String str : strs) { + String size = toFixedLength(str.length()); + buff.append(size); + buff.append(str); + } + return buff.toString(); + } + + private String toFixedLength(int len) { + StringBuffer buff = new StringBuffer(); + for (int i = 0; i < 4; i++) { + char b1 = (char) len; + buff.append(b1); + len = len >> 8; + } + return buff.toString(); + } + + private int toSize(String str) { + int val = 0; + for (int i = str.length() - 1; i > 0; i--) { + val += str.charAt(i); + val = val << 8; + } + val += str.charAt(0); + return val; + } + + // Decodes a single string to a list of strings. + public List decode(String s) { + List result = new ArrayList<>(); + while (s.length() != 0) { + int size = toSize(s.substring(0, 4)); + result.add(s.substring(4, size + 4)); + s = s.substring(size + 4); + } + return result; + } +} diff --git a/showmecode_100/java/com/interview/string/SubstringSearch.java b/showmecode_100/java/com/interview/string/SubstringSearch.java new file mode 100644 index 00000000..29008271 --- /dev/null +++ b/showmecode_100/java/com/interview/string/SubstringSearch.java @@ -0,0 +1,96 @@ +package com.interview.string; + +/** + * Date 09/22/2014 + * @author tusroy + * + * Do pattern matching using KMP algorithm + * + * Runtime complexity - O(m + n) where m is length of text and n is length of pattern + * Space complexity - O(n) + */ +public class SubstringSearch { + + /** + * Slow method of pattern matching + */ + public boolean hasSubstring(char[] text, char[] pattern){ + int i=0; + int j=0; + int k = 0; + while(i < text.length && j < pattern.length){ + if(text[i] == pattern[j]){ + i++; + j++; + }else{ + j=0; + k++; + i = k; + } + } + if(j == pattern.length){ + return true; + } + return false; + } + + /** + * Compute temporary array to maintain size of suffix which is same as prefix + * Time/space complexity is O(size of pattern) + */ + private int[] computeTemporaryArray(char pattern[]){ + int [] lps = new int[pattern.length]; + int index =0; + for(int i=1; i < pattern.length;){ + if(pattern[i] == pattern[index]){ + lps[i] = index + 1; + index++; + i++; + }else{ + if(index != 0){ + index = lps[index-1]; + }else{ + lps[i] =0; + i++; + } + } + } + return lps; + } + + /** + * KMP algorithm of pattern matching. + */ + public boolean KMP(char []text, char []pattern){ + + int lps[] = computeTemporaryArray(pattern); + int i=0; + int j=0; + while(i < text.length && j < pattern.length){ + if(text[i] == pattern[j]){ + i++; + j++; + }else{ + if(j!=0){ + j = lps[j-1]; + }else{ + i++; + } + } + } + if(j == pattern.length){ + return true; + } + return false; + } + + public static void main(String args[]){ + + String str = "abcxabcdabcdabcy"; + String subString = "abcdabcy"; + SubstringSearch ss = new SubstringSearch(); + boolean result = ss.KMP(str.toCharArray(), subString.toCharArray()); + System.out.print(result); + + } +} diff --git a/showmecode_100/java/com/interview/string/SubtringWithConcatentationOfWords.java b/showmecode_100/java/com/interview/string/SubtringWithConcatentationOfWords.java new file mode 100644 index 00000000..700edc33 --- /dev/null +++ b/showmecode_100/java/com/interview/string/SubtringWithConcatentationOfWords.java @@ -0,0 +1,67 @@ +package com.interview.string; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * References + * https://leetcode.com/problems/substring-with-concatenation-of-all-words/ + */ +public class SubtringWithConcatentationOfWords { + public List findSubstring(String s, String[] words) { + Map actual = new HashMap<>(); + Map used = new HashMap<>(); + set(actual, words); + List output = new ArrayList<>(); + int len = words[0].length(); + int count = words.length; + int k = words.length * len; + + for (int i = 0; i <= s.length() - k; i++) { + int j = i; + int currentCount = 0; + while (true) { + if(j + len > s.length()) { + break; + } + String sub = s.substring(j, j + len); + Integer actualCount = actual.get(sub); + if (actualCount != null) { + Integer usedCount = used.get(sub); + if ( usedCount == null) { + usedCount = 0; + } + if ( actualCount > usedCount) { + j = j + len; + currentCount++; + used.put(sub, usedCount + 1); + } else { + break; + } + } else { + break; + } + if ( currentCount == count) { + break; + } + } + used.clear(); + if (currentCount == count) { + output.add(i); + } + } + return output; + } + + private void set(Map actual, String[] words) { + for (String word : words) { + if (actual.containsKey(word)) { + actual.put(word, actual.get(word) + 1); + } else { + actual.put(word, 1); + } + } + } +} diff --git a/showmecode_100/java/com/interview/string/ValidPalindrome.java b/showmecode_100/java/com/interview/string/ValidPalindrome.java new file mode 100644 index 00000000..9ad80c2e --- /dev/null +++ b/showmecode_100/java/com/interview/string/ValidPalindrome.java @@ -0,0 +1,38 @@ +package com.interview.string; + +/** + * Date 04/09/2016 + * @author Tushar Roy + * + * Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. + * For example, + * "A man, a plan, a canal: Panama" is a palindrome. + * "race a car" is not a palindrome. + * + * https://leetcode.com/problems/valid-palindrome/ + */ +public class ValidPalindrome { + public boolean isPalindrome(String s) { + int start = 0; + int end = s.length() - 1; + while (start < end) { + if (!isAlphaNum(s.charAt(start))) { + start++; + } else if (!isAlphaNum(s.charAt(end))) { + end--; + } else { + if (Character.toLowerCase(s.charAt(start++)) != Character.toLowerCase(s.charAt(end--))) { + return false; + } + } + } + return true; + } + + private boolean isAlphaNum(char ch) { + if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/string/ValidWordAbbreviation.java b/showmecode_100/java/com/interview/string/ValidWordAbbreviation.java new file mode 100644 index 00000000..7d19a374 --- /dev/null +++ b/showmecode_100/java/com/interview/string/ValidWordAbbreviation.java @@ -0,0 +1,54 @@ +package com.interview.string; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Date 04/15/2016 + * @author Tushar Roy + * + * Given a dictionary of words and a word tell if there is unique abbrreviation of this word in the dictionary. + */ +public class ValidWordAbbreviation { + private final Map> map = new HashMap<>(); + public ValidWordAbbreviation(String[] dictionary) { + for (String str : dictionary) { + String key = ""; + int len = 0; + if (str.length() > 0) { + key = str.charAt(0) + "" + str.charAt(str.length() - 1); + len = str.length() - 2; + } + Map innerMap = map.get(key); + if (innerMap == null) { + innerMap = new HashMap<>(); + map.put(key, innerMap); + } + Integer count = innerMap.get(len); + if (count == null) { + count = 0; + } + innerMap.put(len, count + 1); + } + } + + public boolean isUnique(String word) { + if (word.length() == 0 || word.length() == 1) { + return true; + } + String key = ""; + int len = 0; + if (word.length() > 0) { + key = word.charAt(0) + "" + word.charAt(word.length() - 1); + len = word.length() - 2; + } + Map set = map.get(key); + if (set == null) { + return true; + } + Integer count = set.get(len); + return count == null || count == 1; + } +} diff --git a/showmecode_100/java/com/interview/string/WordAbbreviationCombination.java b/showmecode_100/java/com/interview/string/WordAbbreviationCombination.java new file mode 100644 index 00000000..da38061d --- /dev/null +++ b/showmecode_100/java/com/interview/string/WordAbbreviationCombination.java @@ -0,0 +1,43 @@ +package com.interview.string; + +import java.util.*; + +/** + * Date 04/17/2106 + * @author Tushar Roy + * + * Write a function to generate the generalized abbreviations of a word. + * Example: + * Given word = "word", return the following list (order does not matter): + * ["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"] + * + * https://leetcode.com/problems/generalized-abbreviation/ + */ +public class WordAbbreviationCombination { + + public List generateAbbreviations(String word) { + List result = new ArrayList<>(); + generateAbbreviationsUtil(word, result, "", 0, 0); + return result; + } + + public void generateAbbreviationsUtil(String input, List result, String current, int pos, int count) { + if (input.length() == pos) { + if (count > 0) { + result.add(current + count); + } else { + result.add(current); + } + return; + } + + generateAbbreviationsUtil(input, result, current, pos + 1, count + 1); + generateAbbreviationsUtil(input, result, current + (count > 0 ? count : "") + input.charAt(pos), pos + 1, 0); + } + + public static void main(String args[]) { + WordAbbreviationCombination ssc = new WordAbbreviationCombination(); + List result = ssc.generateAbbreviations("word"); + result.forEach(r -> System.out.println(r)); + } +} diff --git a/showmecode_100/java/com/interview/string/ZAlgorithm.java b/showmecode_100/java/com/interview/string/ZAlgorithm.java new file mode 100644 index 00000000..9694d4cb --- /dev/null +++ b/showmecode_100/java/com/interview/string/ZAlgorithm.java @@ -0,0 +1,87 @@ +package com.interview.string; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 10/31/2015 + * @author Tushar Roy + * + * Z algorithm to pattern matching + * + * Time complexity - O(n + m) + * Space complexity - O(n + m) + * + * http://www.geeksforgeeks.org/z-algorithm-linear-time-pattern-searching-algorithm/ + * http://www.utdallas.edu/~besp/demo/John2010/z-algorithm.htm + */ +public class ZAlgorithm { + + private int[] calculateZ(char input[]) { + int Z[] = new int[input.length]; + int left = 0; + int right = 0; + for(int k = 1; k < input.length; k++) { + if(k > right) { + left = right = k; + while(right < input.length && input[right] == input[right - left]) { + right++; + } + Z[k] = right - left; + right--; + } else { + //we are operating inside box + int k1 = k - left; + //if value does not stretches till right bound then just copy it. + if(Z[k1] < right - k + 1) { + Z[k] = Z[k1]; + } else { //otherwise try to see if there are more matches. + left = k; + while(right < input.length && input[right] == input[right - left]) { + right++; + } + Z[k] = right - left; + right--; + } + } + } + return Z; + } + + /** + * Returns list of all indices where pattern is found in text. + */ + public List matchPattern(char text[], char pattern[]) { + char newString[] = new char[text.length + pattern.length + 1]; + int i = 0; + for(char ch : pattern) { + newString[i] = ch; + i++; + } + newString[i] = '$'; + i++; + for(char ch : text) { + newString[i] = ch; + i++; + } + List result = new ArrayList<>(); + int Z[] = calculateZ(newString); + + for(i = 0; i < Z.length ; i++) { + if(Z[i] == pattern.length) { + result.add(i - pattern.length - 1); + } + } + return result; + } + + public static void main(String args[]) { + String text = "aaabcxyzaaaabczaaczabbaaaaaabc"; + String pattern = "aaabc"; + ZAlgorithm zAlgorithm = new ZAlgorithm(); + List result = zAlgorithm.matchPattern(text.toCharArray(), pattern.toCharArray()); + result.forEach(System.out::println); + } + + +} diff --git a/showmecode_100/java/com/interview/suffixprefix/SuffixArray.java b/showmecode_100/java/com/interview/suffixprefix/SuffixArray.java new file mode 100644 index 00000000..adb0ed1a --- /dev/null +++ b/showmecode_100/java/com/interview/suffixprefix/SuffixArray.java @@ -0,0 +1,87 @@ +package com.interview.suffixprefix; + +import java.util.Arrays; +import java.util.Comparator; + +/** + http://www.geeksforgeeks.org/suffix-array-set-1-introduction/ + */ +public class SuffixArray { + + public static class SuffixSort implements Comparator{ + + private char str[] = null; + + public SuffixSort(char str[]){ + this.str = str; + } + + @Override + public int compare(Integer i1, Integer i2) { + while(i1 < str.length && i2 < str.length && str[i1] == str[i2]){ + i1++; + i2++; + } + if(i2 == str.length && i1 == str.length){ + return 0; + } + else if(i1 == str.length){ + return -1; + }else if(i2 == str.length){ + return 1; + }else return str[i1] < str[i2] ? -1 : 1; + + } + } + + public Integer[] createSuffixArray(char str[]){ + + SuffixSort sort = new SuffixSort(str); + Integer suffix[] = new Integer[str.length]; + for(int i=0; i < suffix.length; i++){ + suffix[i] = i; + } + Arrays.sort(suffix,sort); + return suffix; + } + + private int stringCompare(char str[],char subString[],int pos){ + int i=0; + while(pos < str.length && i < subString.length && str[pos] == subString[i]){ + pos++; + i++; + } + if(i == subString.length){ + return 0; + } + if(pos == str.length){ + return -1; + } + return str[pos] < subString[i] ? -1 : 1; + } + + public int subStringSearch(char str[],char subString[], Integer suffix[]){ + int low =0; + int high = suffix.length-1; + while(low <= high){ + int mid = (low + high)/2; + int result = stringCompare(str, subString, suffix[mid]); + if(result == 0){ + return suffix[mid]; + } + if(result > 0){ + high = mid-1; + }else{ + low = mid+1; + } + } + return -1; + } + + public static void main(String args[]){ + SuffixArray suffix = new SuffixArray(); + String str = "missisippi"; + Integer result[] = suffix.createSuffixArray(str.toCharArray()); + System.out.print(suffix.subStringSearch(str.toCharArray(), "sippi".toCharArray(), result)); + } +} diff --git a/showmecode_100/java/com/interview/suffixprefix/SuffixTree.java b/showmecode_100/java/com/interview/suffixprefix/SuffixTree.java new file mode 100644 index 00000000..eb27d157 --- /dev/null +++ b/showmecode_100/java/com/interview/suffixprefix/SuffixTree.java @@ -0,0 +1,436 @@ +package com.interview.suffixprefix; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 06/01/2015 + * @author tusroy + * + * Construct suffix tree using Ukkonen's algorithm + * + * Solution + * Rule 1: For phase i+1 if S[j..i] ends at last character of leaf edge then add S[i+1] at + * the end. + * Rule 2: For phase i+1 if S[j..i] ends somewhere in middle of edge and next character is + * not S[i+1] then a new leaf edge with label S[i+1] should be created + * Rule 3: For phase i+1 if S[j..i] ends somewhere in middle of edge and next character is + * S[i+1] then do nothing(resulting in implicit tree) + * + * Suffix Link: + * For every node with label x@ where x is a single character and @ is possibly empty substring + * there is another node with label x. This node is suffix link of first node. If @ is + * empty then suffix link is root. + * + * Trick1 + * Skip/Count trick + * While traveling down if number of characters on edge is less than number of characters + * to traverse then skip directly to the end of the edge. If number of characters on label + * is more than number of characters to traverse then go directly to that character + * we care about. + * + * Edge-label compression + * Instead of storing actual characters on the path store start and end indices on the + * path. + * + * Trick2 - Stop process as soon as you hit rule 3. Rule 3 is show stopper + * + * Trick3 - Keep a global end on leaf to do rule 1 extension. + * + * Active point - It is the point from which traversal starts for next extension or next phase. + * Active point always starts from root. Other extension will get active point set up + * correctly by last extension. + * + * Active node - Node from which active point will start + * Active Edge - It is used to choose the edge from active node. It has index of character. + * Active Length - How far to go on active edge. + * + * Active point rules + * 1) If rule 3 extension is applied then active length will increment by 1 if active length is not greater then length of path on edge. + * 2) If rule 3 extension is applied and if active length gets greater than length path of edge then change active node, active edge and active length + * 3) If active length is 0 then always start looking for the character from root. + * 4) If rule 2 extension is applied and if active node is root then active edge is active edge + 1 and active length is active lenght -1 + * 5) If rule 2 extension is applied and if active node is not root then follow suffix link and make active node as suffix link and do no change + * anything. + * + * Test cases + * adeacdade + * abcabxabcd + * abcdefabxybcdmnabcdex + * abcadak + * dedododeodo + * abcabxabcd + * mississippi + * banana + * ooooooooo + * + * References + * http://web.stanford.edu/~mjkay/gusfield.pdf + * http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-6/ + * https://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf + * https://gist.github.com/axefrog/2373868 + */ +public class SuffixTree { + + public static void main(String args[]){ + SuffixTree st = new SuffixTree("mississippi".toCharArray()); + st.build(); + st.dfsTraversal(); + System.out.println(st.validate()); + } + + private SuffixNode root; + private Active active; + private int remainingSuffixCount; + private End end; + private char input[]; + private static char UNIQUE_CHAR = '$'; + + public SuffixTree(char input[]){ + this.input = new char[input.length+1]; + for(int i=0; i < input.length; i++){ + this.input[i] = input[i]; + } + this.input[input.length] = UNIQUE_CHAR; + } + + public void build(){ + root = SuffixNode.createNode(1, new End(0)); + root.index = -1; + active = new Active(root); + this.end = new End(-1); + //loop through string to start new phase + for(int i=0; i < input.length; i++){ + startPhase(i); + } + + if (remainingSuffixCount != 0) { + System.out.print("Something wrong happened"); + } + //finally walk the tree again and set up the index. + setIndexUsingDfs(root, 0, input.length); + } + + private void startPhase(int i){ + //set lastCreatedInternalNode to null before start of every phase. + SuffixNode lastCreatedInternalNode = null; + //global end for leaf. Does rule 1 extension as per trick 3 by incrementing end. + end.end++; + + //these many suffixes need to be created. + remainingSuffixCount++; + while(remainingSuffixCount > 0){ + //if active length is 0 then look for current character from root. + if(active.activeLength == 0){ + //if current character from root is not null then increase active length by 1 + //and break out of while loop. This is rule 3 extension and trick 2 (show stopper) + if(selectNode(i) != null){ + active.activeEdge = selectNode(i).start; + active.activeLength++; + break; + } //create a new leaf node with current character from leaf. This is rule 2 extension. + else { + root.child[input[i]] = SuffixNode.createNode(i, end); + remainingSuffixCount--; + } + } else{ + //if active length is not 0 means we are traversing somewhere in middle. So check if next character is same as + //current character. + try { + char ch = nextChar(i); + //if next character is same as current character then do a walk down. This is again a rule 3 extension and + //trick 2 (show stopper). + if(ch == input[i]){ + //if lastCreatedInternalNode is not null means rule 2 extension happened before this. Point suffix link of that node + //to selected node using active point. + //TODO - Could be wrong here. Do we only do this if when walk down goes past a node or we do it every time. + if(lastCreatedInternalNode != null){ + lastCreatedInternalNode.suffixLink = selectNode(); + } + //walk down and update active node if required as per rules of active node update for rule 3 extension. + walkDown(i); + break; + } + else { + //next character is not same as current character so create a new internal node as per + //rule 2 extension. + SuffixNode node = selectNode(); + int oldStart = node.start; + node.start = node.start + active.activeLength; + //create new internal node + SuffixNode newInternalNode = SuffixNode.createNode(oldStart, new End(oldStart + active.activeLength - 1)); + + //create new leaf node + SuffixNode newLeafNode = SuffixNode.createNode(i, this.end); + + //set internal nodes child as old node and new leaf node. + newInternalNode.child[input[newInternalNode.start + active.activeLength]] = node; + newInternalNode.child[input[i]] = newLeafNode; + newInternalNode.index = -1; + active.activeNode.child[input[newInternalNode.start]] = newInternalNode; + + //if another internal node was created in last extension of this phase then suffix link of that + //node will be this node. + if (lastCreatedInternalNode != null) { + lastCreatedInternalNode.suffixLink = newInternalNode; + } + //set this guy as lastCreatedInternalNode and if new internalNode is created in next extension of this phase + //then point suffix of this node to that node. Meanwhile set suffix of this node to root. + lastCreatedInternalNode = newInternalNode; + newInternalNode.suffixLink = root; + + //if active node is not root then follow suffix link + if(active.activeNode != root){ + active.activeNode = active.activeNode.suffixLink; + } + //if active node is root then increase active index by one and decrease active length by 1 + else{ + active.activeEdge = active.activeEdge + 1; + active.activeLength--; + } + remainingSuffixCount--; + } + + } catch (EndOfPathException e) { + + //this happens when we are looking for new character from end of current path edge. Here we already have internal node so + //we don't have to create new internal node. Just create a leaf node from here and move to suffix new link. + SuffixNode node = selectNode(); + node.child[input[i]] = SuffixNode.createNode(i, end); + if (lastCreatedInternalNode != null) { + lastCreatedInternalNode.suffixLink = node; + } + lastCreatedInternalNode = node; + //if active node is not root then follow suffix link + if(active.activeNode != root){ + active.activeNode = active.activeNode.suffixLink; + } + //if active node is root then increase active index by one and decrease active length by 1 + else{ + active.activeEdge = active.activeEdge + 1; + active.activeLength--; + } + remainingSuffixCount--; + } + } + } + } + + private void walkDown(int index){ + SuffixNode node = selectNode(); + //active length is greater than path edge length. + //walk past current node so change active point. + //This is as per rules of walk down for rule 3 extension. + if(diff(node) < active.activeLength){ + active.activeNode = node; + active.activeLength = active.activeLength - diff(node); + active.activeEdge = node.child[input[index]].start; + }else{ + active.activeLength++; + } + } + + //find next character to be compared to current phase character. + private char nextChar(int i) throws EndOfPathException{ + SuffixNode node = selectNode(); + if(diff(node) >= active.activeLength){ + return input[active.activeNode.child[input[active.activeEdge]].start + active.activeLength]; + } + if(diff(node) + 1 == active.activeLength ){ + if(node.child[input[i]] != null){ + return input[i]; + } + } + else{ + active.activeNode = node; + active.activeLength = active.activeLength - diff(node) -1; + active.activeEdge = active.activeEdge + diff(node) +1; + return nextChar(i); + } + + throw new EndOfPathException(); + } + + private static class EndOfPathException extends Exception{ + + } + + private SuffixNode selectNode(){ + return active.activeNode.child[input[active.activeEdge]]; + } + + private SuffixNode selectNode(int index){ + return active.activeNode.child[input[index]]; + } + + + private int diff(SuffixNode node){ + return node.end.end - node.start; + } + + private void setIndexUsingDfs(SuffixNode root,int val, int size){ + if(root == null){ + return; + } + + val += root.end.end - root.start + 1; + if(root.index != -1){ + root.index = size - val; + return; + } + + for(SuffixNode node : root.child){ + setIndexUsingDfs(node, val, size); + } + } + + /** + * Do a DFS traversal of the tree. + */ + public void dfsTraversal(){ + List result = new ArrayList<>(); + for(SuffixNode node : root.child){ + dfsTraversal(node, result); + } + } + + private void dfsTraversal(SuffixNode root, List result){ + if(root == null){ + return; + } + if(root.index != -1){ + for(int i=root.start; i <= root.end.end; i++){ + result.add(input[i]); + } + result.stream().forEach(System.out::print); + System.out.println(" " + root.index); + for(int i=root.start; i <= root.end.end; i++){ + result.remove(result.size()-1); + } + return; + } + + for(int i=root.start; i <= root.end.end; i++){ + result.add(input[i]); + } + + for(SuffixNode node : root.child){ + dfsTraversal(node, result); + } + + for(int i=root.start; i <= root.end.end; i++){ + result.remove(result.size()-1); + } + + } + + /** + * Do validation of the tree by comparing all suffixes and their index at leaf node. + */ + private boolean validate(SuffixNode root, char[] input, int index, int curr){ + if(root == null){ + System.out.println("Failed at " + curr + " for index " + index); + return false; + } + + if(root.index != -1){ + if(root.index != index){ + System.out.println("Index not same. Failed at " + curr + " for index " + index); + return false; + }else{ + return true; + } + } + if(curr >= input.length){ + System.out.println("Index not same. Failed at " + curr + " for index " + index); + return false; + } + + SuffixNode node = root.child[input[curr]]; + if(node == null){ + System.out.println("Failed at " + curr + " for index " + index); + return false; + } + int j = 0; + for(int i=node.start ; i <= node.end.end; i++){ + if(input[curr+j] != input[i] ){ + System.out.println("Mismatch found " + input[curr+j] + " " + input[i]); + return false; + } + j++; + } + curr += node.end.end - node.start + 1; + return validate(node, input, index, curr); + } + + public boolean validate(){ + for(int i=0; i < this.input.length; i++){ + if(!validate(this.root, this.input, i, i)){ + System.out.println("Failed validation"); + return false; + } + } + return true; + } +} + +class SuffixNode{ + + private SuffixNode(){ + } + + private static final int TOTAL = 256; + SuffixNode[] child = new SuffixNode[TOTAL]; + + int start; + End end; + int index; + + SuffixNode suffixLink; + + public static SuffixNode createNode(int start, End end){ + SuffixNode node = new SuffixNode(); + node.start = start; + node.end = end; + return node; + } + + @Override + public String toString() { + StringBuffer buffer = new StringBuffer(); + int i=0; + for(SuffixNode node : child){ + if(node != null){ + buffer.append((char)i + " "); + } + i++; + } + return "SuffixNode [start=" + start + "]" + " " + buffer.toString(); + } + } + +class End{ + public End(int end){ + this.end = end; + } + int end; +} + +class Active{ + Active(SuffixNode node){ + activeLength = 0; + activeNode = node; + activeEdge = -1; + } + + @Override + public String toString() { + + return "Active [activeNode=" + activeNode + ", activeIndex=" + + activeEdge + ", activeLength=" + activeLength + "]"; + } + + SuffixNode activeNode; + int activeEdge; + int activeLength; +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/suffixprefix/TernaryTree.java b/showmecode_100/java/com/interview/suffixprefix/TernaryTree.java new file mode 100644 index 00000000..b9d5c9ce --- /dev/null +++ b/showmecode_100/java/com/interview/suffixprefix/TernaryTree.java @@ -0,0 +1,88 @@ +package com.interview.suffixprefix; + +/** + * http://www.geeksforgeeks.org/ternary-search-tree/ + */ +public class TernaryTree { + + private Node root = null; + + class Node{ + char data; + boolean isLeaf; + Node left, right, eq; + } + + public void insert(String data){ + Node root = insert(this.root,data,0); + this.root = root; + } + + public boolean search(String data){ + return search(root,data,0); + } + + private boolean search(Node root,String data,int pos){ + if(pos == data.length()){ + return true; + } + if(root == null){ + return false; + } + if(root.data == data.charAt(pos)){ + boolean result = search(root.eq,data,pos+1); + if(pos == data.length() -1){ + return result && root.isLeaf; + } + return result; + }else if(root.data < data.charAt(pos)){ + return search(root.right,data,pos); + }else{ + return search(root.left,data,pos); + } + } + private Node insert(Node root,String data,int pos){ + if(pos == data.length()){ + return root; + } + if(root == null){ + root = new Node(); + root.data = data.charAt(pos); + root.eq = insert(root.eq,data,pos+1); + if(pos == (data.length()-1)){ + root.isLeaf = true; + } + }else{ + if(root.data == data.charAt(pos)){ + root.eq = insert(root.eq,data,pos+1); + if(pos == (data.length()-1)){ + root.isLeaf = true; + } + } + else if(root.data < data.charAt(pos)){ + root.right = insert(root.right,data,pos); + }else{ + root.left = insert(root.left,data,pos); + } + } + return root; + } + + public static void main(String args[]){ + TernaryTree tt = new TernaryTree(); + tt.insert("cute"); + tt.insert("as"); + tt.insert("at"); + tt.insert("cut"); + tt.insert("cup"); + tt.insert("time"); + tt.insert("tax"); + tt.insert("bat"); + System.out.println(tt.search("cute")); + System.out.println(tt.search("cut")); + System.out.println(tt.search("tax")); + System.out.println(tt.search("as")); + System.out.println(tt.search("abat")); + + } +} diff --git a/showmecode_100/java/com/interview/suffixprefix/Trie.java b/showmecode_100/java/com/interview/suffixprefix/Trie.java new file mode 100644 index 00000000..d91dc8f1 --- /dev/null +++ b/showmecode_100/java/com/interview/suffixprefix/Trie.java @@ -0,0 +1,147 @@ +package com.interview.suffixprefix; + +import java.util.HashMap; +import java.util.Map; + +/** + * Date 04/25/2016 + * @author Tushar Roy + * + * Insert/delete/search into trie data structure + * + * Reference + * https://en.wikipedia.org/wiki/Trie + */ +public class Trie { + + private class TrieNode { + Map children; + boolean endOfWord; + public TrieNode() { + children = new HashMap<>(); + endOfWord = false; + } + } + + private final TrieNode root; + public Trie() { + root = new TrieNode(); + } + + /** + * Iterative implementation of insert into trie + */ + public void insert(String word) { + TrieNode current = root; + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + TrieNode node = current.children.get(ch); + if (node == null) { + node = new TrieNode(); + current.children.put(ch, node); + } + current = node; + } + //mark the current nodes endOfWord as true + current.endOfWord = true; + } + + /** + * Recursive implementation of insert into trie + */ + public void insertRecursive(String word) { + insertRecursive(root, word, 0); + } + + + private void insertRecursive(TrieNode current, String word, int index) { + if (index == word.length()) { + //if end of word is reached then mark endOfWord as true on current node + current.endOfWord = true; + return; + } + char ch = word.charAt(index); + TrieNode node = current.children.get(ch); + + //if node does not exists in map then create one and put it into map + if (node == null) { + node = new TrieNode(); + current.children.put(ch, node); + } + insertRecursive(node, word, index + 1); + } + + /** + * Iterative implementation of search into trie. + */ + public boolean search(String word) { + TrieNode current = root; + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + TrieNode node = current.children.get(ch); + //if node does not exist for given char then return false + if (node == null) { + return false; + } + current = node; + } + //return true of current's endOfWord is true else return false. + return current.endOfWord; + } + + /** + * Recursive implementation of search into trie. + */ + public boolean searchRecursive(String word) { + return searchRecursive(root, word, 0); + } + private boolean searchRecursive(TrieNode current, String word, int index) { + if (index == word.length()) { + //return true of current's endOfWord is true else return false. + return current.endOfWord; + } + char ch = word.charAt(index); + TrieNode node = current.children.get(ch); + //if node does not exist for given char then return false + if (node == null) { + return false; + } + return searchRecursive(node, word, index + 1); + } + + /** + * Delete word from trie. + */ + public void delete(String word) { + delete(root, word, 0); + } + + /** + * Returns true if parent should delete the mapping + */ + private boolean delete(TrieNode current, String word, int index) { + if (index == word.length()) { + //when end of word is reached only delete if currrent.endOfWord is true. + if (!current.endOfWord) { + return false; + } + current.endOfWord = false; + //if current has no other mapping then return true + return current.children.size() == 0; + } + char ch = word.charAt(index); + TrieNode node = current.children.get(ch); + if (node == null) { + return false; + } + boolean shouldDeleteCurrentNode = delete(node, word, index + 1); + + //if true is returned then delete the mapping of character and trienode reference from map. + if (shouldDeleteCurrentNode) { + current.children.remove(ch); + //return true if no mappings are left in the map. + return current.children.size() == 0; + } + return false; + } +} diff --git a/showmecode_100/java/com/interview/tree/AVLTree.java b/showmecode_100/java/com/interview/tree/AVLTree.java new file mode 100644 index 00000000..5fc8c707 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/AVLTree.java @@ -0,0 +1,132 @@ +package com.interview.tree; + +/** + * Date 07/04/2014 + * @author tusroy + * + * Video link - https://youtu.be/rbg7Qf8GkQ4 + * + * Write a program to insert into an AVL tree. + * + * AVL tree is self balancing binary tree. Difference of height of left or right subtree + * cannot be greater than one. + * + * There are four different use cases to insert into AVL tree + * left left - needs ones right rotation + * left right - needs one left and one right rotation + * right left - needs one right and one left rotation + * right right - needs one left rotation + * + * Follow rotation rules to keep tree balanced. + * + * At every node we will also keep height of the tree so that we don't + * have to recalculate values again. + * + * Runtime complexity to insert into AVL tree is O(logn). + * + * References + * http://en.wikipedia.org/wiki/AVL_tree + * http://www.geeksforgeeks.org/avl-tree-set-1-insertion/ + * + */ +public class AVLTree { + + private Node leftRotate(Node root){ + Node newRoot = root.right; + root.right = root.right.left; + newRoot.left = root; + root.height = setHeight(root); + root.size = setSize(root); + newRoot.height = setHeight(newRoot); + newRoot.size = setSize(newRoot); + return newRoot; + } + + private Node rightRotate(Node root){ + Node newRoot = root.left; + root.left = root.left.right; + newRoot.right = root; + root.height = setHeight(root); + root.size = setSize(root); + newRoot.height = setHeight(newRoot); + newRoot.size = setSize(newRoot); + return newRoot; + } + + private int setHeight(Node root){ + if(root == null){ + return 0; + } + return 1 + Math.max((root.left != null ? root.left.height : 0), (root.right != null ? root.right.height : 0)); + } + + private int height(Node root){ + if(root == null){ + return 0; + }else { + return root.height; + } + } + + private int setSize(Node root){ + if(root == null){ + return 0; + } + return 1 + Math.max((root.left != null ? root.left.size : 0), (root.right != null ? root.right.size : 0)); + } + + public Node insert(Node root, int data){ + if(root == null){ + return Node.newNode(data); + } + if(root.data <= data){ + root.right = insert(root.right,data); + } + else{ + root.left = insert(root.left,data); + } + int balance = balance(root.left, root.right); + if(balance > 1){ + if(height(root.left.left) >= height(root.left.right)){ + root = rightRotate(root); + }else{ + root.left = leftRotate(root.left); + root = rightRotate(root); + } + }else if(balance < -1){ + if(height(root.right.right) >= height(root.right.left)){ + root = leftRotate(root); + }else{ + root.right = rightRotate(root.right); + root = leftRotate(root); + } + } + else{ + root.height = setHeight(root); + root.size = setSize(root); + } + return root; + } + + private int balance(Node rootLeft, Node rootRight){ + return height(rootLeft) - height(rootRight); + } + + public static void main(String args[]){ + AVLTree avlTree = new AVLTree(); + Node root = null; + root = avlTree.insert(root, -10); + root = avlTree.insert(root, 2); + root = avlTree.insert(root, 13); + root = avlTree.insert(root, -13); + root = avlTree.insert(root, -15); + root = avlTree.insert(root, 15); + root = avlTree.insert(root, 17); + root = avlTree.insert(root, 20); + + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + System.out.println(); + tt.preOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/AddGreaterValueNodeToEveryNode.java b/showmecode_100/java/com/interview/tree/AddGreaterValueNodeToEveryNode.java new file mode 100644 index 00000000..b9ade43a --- /dev/null +++ b/showmecode_100/java/com/interview/tree/AddGreaterValueNodeToEveryNode.java @@ -0,0 +1,42 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/add-greater-values-every-node-given-bst/ + * Test cases: + * Empty tree + * One node tree + * Two node tree + */ + +class IntegerRef{ + int val; +} + +public class AddGreaterValueNodeToEveryNode { + + public void add(Node root,IntegerRef ref){ + if(root == null){ + return ; + } + add(root.right,ref); + root.data += ref.val; + ref.val = root.data; + add(root.left,ref); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(5, root); + root = bt.addNode(20, root); + root = bt.addNode(15, root); + root = bt.addNode(25, root); + AddGreaterValueNodeToEveryNode agv = new AddGreaterValueNodeToEveryNode(); + IntegerRef ir = new IntegerRef(); + ir.val = 0; + agv.add(root, ir); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/ArbitaryTreeToChildSumTree.java b/showmecode_100/java/com/interview/tree/ArbitaryTreeToChildSumTree.java new file mode 100644 index 00000000..b4b18b92 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ArbitaryTreeToChildSumTree.java @@ -0,0 +1,65 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/convert-an-arbitrary-binary-tree-to-a-tree-that-holds-children-sum-property/ + * Only operation you can do is increase data on the node. No decrement of data + * Test case + * Root greater than children + * Root less than children + * Root equal to children + */ +public class ArbitaryTreeToChildSumTree { + + public void childSumTree(Node root){ + toChildSumTree(root); + } + + private void incrementChild(Node root,int increment){ + if(root == null || (root.left ==null && root.right == null)){ + return; + } + if(root.left != null){ + root.left.data = root.left.data + increment; + incrementChild(root.left,increment); + }else{ + root.right.data = root.right.data + increment; + incrementChild(root.right,increment); + } + } + + private int toChildSumTree(Node root){ + if(root == null){ + return 0; + } + + if(root.left == null && root.right == null){ + return root.data; + } + + int sum1 = toChildSumTree(root.left); + int sum2 = toChildSumTree(root.right); + if(root.data < sum1 + sum2){ + root.data = sum1 + sum2; + }else if(root.data > sum1 + sum2){ + incrementChild(root,root.data - sum1 - sum2); + } + return root.data; + } + + public static void main(String args[]){ + ArbitaryTreeToChildSumTree att = new ArbitaryTreeToChildSumTree(); + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + att.childSumTree(head); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(head); + } + +} diff --git a/showmecode_100/java/com/interview/tree/BSTOneChildPreOrderTraversal.java b/showmecode_100/java/com/interview/tree/BSTOneChildPreOrderTraversal.java new file mode 100644 index 00000000..252d8267 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BSTOneChildPreOrderTraversal.java @@ -0,0 +1,34 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/check-if-each-internal-node-of-a-bst-has-exactly-one-child/ + */ +public class BSTOneChildPreOrderTraversal { + + public boolean isBST(int input[]){ + int max = Integer.MAX_VALUE; + int min = Integer.MIN_VALUE; + for(int i = 0; i < input.length-1; i++){ + if(input[i] > min && input[i] < max){ + if(input[i+1] < input[i]){ + max = input[i]; + }else{ + min = input[i]; + } + }else{ + return false; + } + } + if(input[input.length-1] < max && input[input.length-1] > min){ + return true; + }else{ + return false; + } + } + + public static void main(String args[]){ + int input[] = {20,10,14,15,17}; + BSTOneChildPreOrderTraversal boc = new BSTOneChildPreOrderTraversal(); + System.out.println(boc.isBST(input)); + } +} diff --git a/showmecode_100/java/com/interview/tree/BSTSearch.java b/showmecode_100/java/com/interview/tree/BSTSearch.java new file mode 100644 index 00000000..30b7315e --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BSTSearch.java @@ -0,0 +1,60 @@ +package com.interview.tree; + +/** + * Date 04/11/2015 + * @author tusroy + * + * Youtube link - https://youtu.be/zm83jPHZ-jA + * + * Given a binary search tree and a key, return node which has data as this key or return + * null if no node has data as key. + * + * Solution + * Since its BST for every node check if root.data is key and if not go either left or + * right depending on if root.data is greater or less than key + * + * Time complexity is O(n) for non balanced BST + * Time complexity is O(logn) for balanced BST + * + * Test cases: + * 1) null tree + * 2) Tree with one node and key is that node + * 3) Tree with many nodes and key does not exist + * 4) Tree with many nodes and key exists + */ +public class BSTSearch { + + public Node search(Node root, int key){ + if(root == null){ + return null; + } + if(root.data == key){ + return root; + }else if(root.data < key){ + return search(root.right, key); + }else{ + return search(root.left, key); + } + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(20, root); + root = bt.addNode(-10, root); + root = bt.addNode(15, root); + root = bt.addNode(0, root); + root = bt.addNode(21, root); + root = bt.addNode(-1, root); + BSTSearch bstSearch = new BSTSearch(); + Node result = bstSearch.search(root, 21); + assert result.data == 21; + + result = bstSearch.search(root, -1); + assert result.data == 21; + + result = bstSearch.search(root, 11); + assert result == null; + } +} diff --git a/showmecode_100/java/com/interview/tree/BTree.java b/showmecode_100/java/com/interview/tree/BTree.java new file mode 100644 index 00000000..c6945508 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BTree.java @@ -0,0 +1,219 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/b-tree-set-1-insert-2/ + * http://www.geeksforgeeks.org/b-tree-set-1-introduction-2/ + */ +public class BTree { + private BTreeNode root = null; + private static int T = 2; + public void insert(int data){ + if(root == null){ + root = BTreeNode.newNode(data); + return; + } + SplitResult sr = insert(root,data); + if(sr != null){ + BTreeNode newRoot = BTreeNode.newNode(); + newRoot.n = 1; + newRoot.isLeaf = false; + newRoot.keys[0] = sr.c; + newRoot.child[0] = sr.r1; + newRoot.child[1] = sr.r2; + root = newRoot; + } + } + + public boolean search(int data){ + return search(root,data); + } + + public boolean search(BTreeNode root, int data){ + int i =0; + while(i < root.n && root.keys[i] < data){ + i++; + } + if(i < root.n && root.keys[i] == data){ + return true; + } + if(root.isLeaf){ + return false; + } + return search(root.child[i],data); + } + + private SplitResult insert(BTreeNode root,int data){ + if(root.isLeaf){ + if(!root.isFull()){ + root.insertKey(data, null, null); + return null; + }else{ + SplitResult sr = splitNode(root,data,null,null); + return sr; + } + }else{ + int i=0; + for(; i < root.n; i++){ + if(data <= root.keys[i]){ + SplitResult sr = insert(root.child[i],data); + if(sr == null){ + return null; + }else{ + if(!root.isFull()){ + root.insertKey(sr.c, sr.r1, sr.r2); + return null; + }else{ + SplitResult sr1 = splitNode(root,sr.c,sr.r1,sr.r2); + return sr1; + } + } + } + } + if(i == root.n){ + SplitResult sr = insert(root.child[i],data); + if(sr == null){ + return null; + }else{ + if(!root.isFull()){ + root.insertKey(sr.c, sr.r1, sr.r2); + return null; + }else{ + SplitResult sr1 = splitNode(root,sr.c,sr.r1,sr.r2); + return sr1; + } + } + } + } + return null; + } + + private SplitResult splitNode(BTreeNode node,int data, BTreeNode nr1, BTreeNode nr2){ + int c = node.keys[node.n/2]; + BTreeNode r1 = BTreeNode.newNode(); + BTreeNode r2 = BTreeNode.newNode(); + r1.n = node.n/2; + r2.n = node.n - node.n/2-1; + if(!node.isLeaf){ + r1.isLeaf = false; + r2.isLeaf = false; + } + int i=0; + for(; i < node.n/2; i++){ + r1.keys[i] = node.keys[i]; + r1.child[i] = node.child[i]; + } + r1.child[i] = node.child[i]; + i = node.n/2 + 1; + int j=0; + for(;i < node.n; i++,j++){ + r2.keys[j] = node.keys[i]; + r2.child[j] = node.child[i]; + } + r2.child[j] = node.child[i]; + if(data < c){ + r1.insertKey(data, nr1, nr2); + }else{ + r2.insertKey(data, nr1, nr2); + } + SplitResult sr = new SplitResult(); + sr.c = c; + sr.r1 = r1; + sr.r2 = r2; + return sr; + } + + class SplitResult{ + BTreeNode r1; + BTreeNode r2; + int c; + } + + public void traverse(){ + traverse(root); + } + + private void traverse(BTreeNode root){ + for(int i=0; i < root.n; i++){ + if(!root.isLeaf){ + traverse(root.child[i]); + } + System.out.print(root.keys[i] + " "); + } + if(!root.isLeaf){ + traverse(root.child[root.n]); + } + } + + static class BTreeNode{ + int n ; + BTreeNode[] child = new BTreeNode[2*T]; + int keys[] = new int[2*T-1]; + boolean isLeaf; + + public void insertKey(int data,BTreeNode r1,BTreeNode r2){ + int i = n-1; + while(i >=0 && data < keys[i]){ + keys[i+1] = keys[i]; + i--; + } + keys[i+1] = data; + int j = n; + while(j > i+1){ + child[j+1] = child[j]; + j--; + } + child[j] = r1; + child[j+1] = r2; + n++; + } + + public static BTreeNode newNode(int data){ + BTreeNode node = new BTreeNode(); + node.keys[0] = data; + node.isLeaf = true; + node.n = 1; + return node; + } + + public static BTreeNode newNode(){ + BTreeNode node = new BTreeNode(); + node.isLeaf = true; + node.n = 0; + return node; + } + + public boolean isFull(){ + return 2*T - 1 == n; + } + } + + public static void main(String args[]){ + BTree bTree = new BTree(); + bTree.insert(5); + bTree.insert(4); + bTree.insert(3); + bTree.insert(2); + bTree.insert(1); + bTree.insert(6); + bTree.insert(11); + bTree.insert(13); + bTree.insert(8); + bTree.insert(7); + bTree.insert(10); + bTree.insert(9); + bTree.insert(28); + bTree.insert(22); + bTree.insert(12); + bTree.insert(18); + bTree.insert(16); + bTree.traverse(); + System.out.print(bTree.search(28)); + System.out.print(bTree.search(11)); + System.out.print(bTree.search(5)); + System.out.print(bTree.search(21)); + System.out.print(bTree.search(3)); + System.out.print(bTree.search(4)); + System.out.print(bTree.search(14)); + } +} + diff --git a/showmecode_100/java/com/interview/tree/BinaryTree.java b/showmecode_100/java/com/interview/tree/BinaryTree.java new file mode 100644 index 00000000..81be917b --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BinaryTree.java @@ -0,0 +1,96 @@ +package com.interview.tree; + +/** + * Date 07/07/2014 + * @author tusroy + * + * Youtube link - https://youtu.be/bmaeYtlO2OE + * Youtube link - https://youtu.be/_SiwrPXG9-g + * Youtube link - https://youtu.be/NA8B84DZYSA + * + */ +class NodeRef{ + Node node; +} + +enum Color{ + RED, + BLACK +} + +class Node{ + Node left; + Node right; + Node next; + int data; + int lis; + int height; + int size; + Color color; + + public static Node newNode(int data){ + Node n = new Node(); + n.left = null; + n.right = null; + n.data = data; + n.lis = -1; + n.height = 1; + n.size = 1; + n.color = Color.RED; + return n; + } +} + +public class BinaryTree { + public Node addNode(int data, Node head){ + Node tempHead = head; + Node n = Node.newNode(data); + if(head == null){ + head = n; + return head; + } + Node prev = null; + while(head != null){ + prev = head; + if(head.data < data){ + head = head.right; + }else{ + head = head.left; + } + } + if(prev.data < data){ + prev.right = n; + }else{ + prev.left = n; + } + return tempHead; + } + + class IntegerRef{ + int height; + } + + public int height(Node root){ + if(root == null){ + return 0; + } + int leftHeight = height(root.left); + int rightHeight = height(root.right); + return Math.max(leftHeight, rightHeight) + 1; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + head = bt.addNode(21, head); + System.out.println(bt.height(head)); + + } +} diff --git a/showmecode_100/java/com/interview/tree/BinaryTreeFromParentRepresentation.java b/showmecode_100/java/com/interview/tree/BinaryTreeFromParentRepresentation.java new file mode 100644 index 00000000..714e1b88 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BinaryTreeFromParentRepresentation.java @@ -0,0 +1,50 @@ +package com.interview.tree; + +/** + * Date 11/01/2015 + * @author Tushar Roy + * + * Given an array reprsentation of binary tree where index is data while value at index is + * parent create the binary tree. Value of -1 indicates root node. + * + * References: + * http://www.geeksforgeeks.org/construct-a-binary-tree-from-parent-array-representation/ + */ +public class BinaryTreeFromParentRepresentation { + + public Node create(int input[]) { + Node t[] = new Node[input.length]; + + for(int i = 0; i < input.length; i++) { + t[i] = new Node(); + t[i].data = i; + } + + Node root = null; + for(int i = 0; i < input.length; i++) { + int parentIndex = input[i]; + if(parentIndex == -1) { + root = t[i]; + continue; + } + Node parent = t[parentIndex]; + if(parent.left == null) { + parent.left = t[i]; + } else { + parent.right = t[i]; + } + } + return root; + } + + public static void main(String args[]) { + BinaryTreeFromParentRepresentation btpp = new BinaryTreeFromParentRepresentation(); + int input[] = {1, 5, 5, 2, 2, -1, 3}; + Node root = btpp.create(input); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + System.out.println(); + tt.preOrder(root); + } +} + diff --git a/showmecode_100/java/com/interview/tree/BinaryTreeMaximumPathSum.java b/showmecode_100/java/com/interview/tree/BinaryTreeMaximumPathSum.java new file mode 100644 index 00000000..9154fc4c --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BinaryTreeMaximumPathSum.java @@ -0,0 +1,39 @@ +package com.interview.tree; + +/** + * Date 03/22/2016 + * @author Tushar Roy + * + * Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence of nodes + * from some starting node to any node in the tree along the parent-child connections. + * + * Time complexity O(n) + * Space complexity depends on depth of tree. + * + * https://leetcode.com/problems/binary-tree-maximum-path-sum/ + */ +public class BinaryTreeMaximumPathSum { + int max = 0; + + public int maxPathSum(Node root) { + max = Integer.MIN_VALUE; + maxPathSumUtil(root); + return max; + } + + private int maxPathSumUtil(Node root) { + if (root == null) { + return 0; + } + int left = maxPathSumUtil(root.left); + int right = maxPathSumUtil(root.right); + if (left < 0) { + left = 0; + } + if (right < 0) { + right = 0; + } + max = Math.max(max, root.data + left + right); + return root.data + Math.max(left, right); + } +} diff --git a/showmecode_100/java/com/interview/tree/BinaryTreeToCircularLinkList.java b/showmecode_100/java/com/interview/tree/BinaryTreeToCircularLinkList.java new file mode 100644 index 00000000..e8006b2b --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BinaryTreeToCircularLinkList.java @@ -0,0 +1,77 @@ +package com.interview.tree; + +/** + * http://cslibrary.stanford.edu/109/TreeListRecursion.html + * Test cases + * Null tree + * + */ +public class BinaryTreeToCircularLinkList { + + public Node convert(Node root){ + if(root == null){ + return null; + } + + if(root.left == null && root.right == null){ + root.left = root; + root.right = root; + return root; + } + + Node left = convert(root.left); + Node right = convert(root.right); + + root.left = root; + root.right = root; + + left = join(left,root); + left = join(left,right); + return left; + } + + private Node join(Node r1, Node r2){ + + if(r1 == null){ + return r2; + } + if(r2 == null){ + return r1; + } + Node t1 = r2.left; + + r1.left.right = r2; + r2.left = r1.left; + r1.left = t1; + t1.right = r1; + return r1; + } + + private void print(Node root){ + Node temp = root; + do{ + System.out.println(temp.data); + temp = temp.right; + }while(temp != root); + + System.out.println(); + do{ + System.out.println(temp.data); + temp = temp.left; + }while(temp != root); + } + + public static void main(String args[]){ + BinaryTreeToCircularLinkList btc = new BinaryTreeToCircularLinkList(); + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(3, root); + root = bt.addNode(-1, root); + root = bt.addNode(8, root); + root = bt.addNode(-6, root); + root = bt.addNode(13, root); + root = btc.convert(root); + btc.print(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/BinaryTreeToDoubleLinkList.java b/showmecode_100/java/com/interview/tree/BinaryTreeToDoubleLinkList.java new file mode 100644 index 00000000..79bc63e7 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BinaryTreeToDoubleLinkList.java @@ -0,0 +1,58 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/convert-given-binary-tree-doubly-linked-list-set-3/ + */ +public class BinaryTreeToDoubleLinkList { + + public void toDoubleLL(Node root){ + NodeRef prev = new NodeRef(); + toDoubleLL(root,prev); + } + + private void toDoubleLL(Node root, NodeRef prev){ + if(root == null){ + return; + } + toDoubleLL(root.left,prev); + if(prev.node != null){ + prev.node.right = root; + root.left = prev.node; + prev.node = root; + }else{ + prev.node = root; + } + toDoubleLL(root.right,prev); + } + + public void print(Node root){ + Node curr = null; + while(root != null){ + curr = root; + System.out.print(root.data + " "); + root = root.right; + } + System.out.println(); + root = curr; + while(root != null){ + System.out.print(root.data + " "); + root = root.left; + } + } + + public static void main(String args[]){ + BinaryTreeToDoubleLinkList btd = new BinaryTreeToDoubleLinkList(); + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(100, head); + head = bt.addNode(90, head); + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(25, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(-7, head); + btd.toDoubleLL(head); + btd.print(head); + } +} diff --git a/showmecode_100/java/com/interview/tree/BinaryTreeToSortedLinkList.java b/showmecode_100/java/com/interview/tree/BinaryTreeToSortedLinkList.java new file mode 100644 index 00000000..869f3a28 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BinaryTreeToSortedLinkList.java @@ -0,0 +1,56 @@ +package com.interview.tree; + +/** + * http://www.careercup.com/question?id=6241652616200192 + * Test cases: + * 0,1 or more nodes in the tree + */ +public class BinaryTreeToSortedLinkList { + + public Node toSortedLinkList(Node root){ + if(root == null){ + return null; + } + + Node left = toSortedLinkList(root.left); + Node right = toSortedLinkList(root.right); + + root.left = null; + root.right = null; + root = merge(left,root); + return merge(root,right); + } + + private Node merge(Node head1,Node head2){ + if(head1 == null){ + return head2; + } + if(head2 == null){ + return head1; + } + if(head1.data <= head2.data){ + head1.next = merge(head1.next, head2); + return head1; + }else{ + head2.next = merge(head1,head2.next); + return head2; + } + } + + private void print(Node root){ + while(root != null){ + System.out.print(root.data + " "); + root = root.next; + } + } + + public static void main(String args[]){ + int in[] = {-6,0,15,10,3,25,2}; + int pre[] = {10,15,-6,0,25,3,2}; + ConstructTreeFromInOrderPreOrder ct = new ConstructTreeFromInOrderPreOrder(); + Node root = ct.createTree(in, pre); + BinaryTreeToSortedLinkList bt = new BinaryTreeToSortedLinkList(); + root = bt.toSortedLinkList(root); + bt.print(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/BoundaryTraversal.java b/showmecode_100/java/com/interview/tree/BoundaryTraversal.java new file mode 100644 index 00000000..ff695cc3 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/BoundaryTraversal.java @@ -0,0 +1,77 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/boundary-traversal-of-binary-tree/ + * Test cases + * All left children + * All right children + * Full tree + * Complete tree + */ +public class BoundaryTraversal { + + public void traversal(Node root){ + //find starting point for right side + Node current = root; + while(current != null){ + if(current.right != null && current.left != null){ + current = current.right; + break; + } + current = current.left != null ? current.left : current.right; + } + printRightSide(current); + printLeaves(root); + printLeftSide(root); + } + + private void printRightSide(Node root){ + if(root == null || (root.left == null && root.right == null)){ + return; + } + System.out.println(root.data); + if(root.right != null){ + printRightSide(root.right); + }else{ + printRightSide(root.left); + } + } + + private void printLeftSide(Node root){ + if(root == null || (root.left == null && root.right == null)){ + return; + } + if(root.left != null){ + printLeftSide(root.left); + }else{ + printRightSide(root.right); + } + System.out.println(root.data); + } + + private void printLeaves(Node root){ + if(root == null){ + return; + } + if(root.left == null && root.right == null){ + System.out.println(root.data); + } + printLeaves(root.right); + printLeaves(root.left); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(100, head); + head = bt.addNode(90, head); + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(25, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(-7, head); + BoundaryTraversal bd = new BoundaryTraversal(); + bd.traversal(head); + } +} diff --git a/showmecode_100/java/com/interview/tree/ClosestValueBinaryTree.java b/showmecode_100/java/com/interview/tree/ClosestValueBinaryTree.java new file mode 100644 index 00000000..56524acb --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ClosestValueBinaryTree.java @@ -0,0 +1,29 @@ +package com.interview.tree; + +/** + * Given a non-empty binary search tree and a target value, find the value in the BST that is closest to the target. + * https://leetcode.com/problems/closest-binary-search-tree-value/ + */ +public class ClosestValueBinaryTree { + public int closestValue(Node root, double target) { + int r = target > 0 ? Integer.MIN_VALUE : Integer.MAX_VALUE; + return closestValueUtil(root, target, r); + } + + private int closestValueUtil(Node root, double target, int result) { + if (root == null) { + return (int)result; + } + if (target == root.data) { + return root.data; + } + if (Math.abs(root.data - target) < Math.abs(result - target)) { + result = root.data; + } + if (target < root.data) { + return closestValueUtil(root.left, target, result); + } else { + return closestValueUtil(root.right, target, result); + } + } +} diff --git a/showmecode_100/java/com/interview/tree/ConnectNodesAtSameLevel.java b/showmecode_100/java/com/interview/tree/ConnectNodesAtSameLevel.java new file mode 100644 index 00000000..0ef34eb0 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConnectNodesAtSameLevel.java @@ -0,0 +1,66 @@ +package com.interview.tree; + +/** + * Date 03/24/2016 + * @author Tushar Roy + * + * Populate next pointer for each node of binary tree. + * + * Time complexity O(n) + * Space complexity O(1) + * + * https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ + */ +public class ConnectNodesAtSameLevel { + + public void connect(Node root) { + if (root == null) { + return; + } + + Node firstNode = root; + Node prevNode = null; + while (firstNode != null) { + root = firstNode; + firstNode = null; + prevNode = null; + while (root != null) { + if (root.left != null) { + if (firstNode == null) { + firstNode = root.left; + } + if (prevNode != null) { + prevNode.next = root.left; + } + prevNode = root.left; + } + if (root.right != null) { + if (firstNode == null) { + firstNode = root.right; + } + if (prevNode != null) { + prevNode.next = root.right; + } + prevNode = root.right; + } + root = root.next; + } + } + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(15, root); + root = bt.addNode(5, root); + root = bt.addNode(7, root); + root = bt.addNode(19, root); + root = bt.addNode(20, root); + root = bt.addNode(-1, root); + root = bt.addNode(21, root); + ConnectNodesAtSameLevel cns = new ConnectNodesAtSameLevel(); + + cns.connect(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/ConstructAllBinaryTreeFromInorderTraversal.java b/showmecode_100/java/com/interview/tree/ConstructAllBinaryTreeFromInorderTraversal.java new file mode 100644 index 00000000..bc8fcd53 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConstructAllBinaryTreeFromInorderTraversal.java @@ -0,0 +1,64 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Date 11/07/2015 + * @author Tushar Roy + * + * Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. + * Total number of binary search tree possible is Catalan number. + * + * https://leetcode.com/problems/unique-binary-search-trees-ii/ + */ +public class ConstructAllBinaryTreeFromInorderTraversal { + + public List generateTrees(int n) { + if (n == 0) { + return Collections.emptyList(); + } + return construct(1, n); + } + + private List construct(int start, int end) { + if (start > end) { + return Collections.singletonList(null); + } + List allTrees = new ArrayList<>(); + for (int root = start; root <= end; root++) { + //get all subtrees from left and right side. + List allLeftSubstrees = construct(start, root - 1); + List allRightSubstrees = construct(root + 1, end); + //iterate through them in all combination and them connect them to root + //and add to allTrees. + for (Node left : allLeftSubstrees) { + for (Node right : allRightSubstrees) { + Node node = Node.newNode(root); + node.left = left; + node.right = right; + allTrees.add(node); + } + } + } + return allTrees; + } + + public void printAllTrees(List allTrees) { + TreeTraversals tt = new TreeTraversals(); + System.out.println("Total number of trees " + allTrees.size()); + for(Node node : allTrees) { + tt.inOrder(node); + System.out.println(); + tt.preOrder(node); + System.out.print("\n\n"); + } + } + + public static void main(String args[]) { + ConstructAllBinaryTreeFromInorderTraversal ct = new ConstructAllBinaryTreeFromInorderTraversal(); + List allTrees = ct.generateTrees(3); + ct.printAllTrees(allTrees); + } +} diff --git a/showmecode_100/java/com/interview/tree/ConstructBSTFromPreOrderArray.java b/showmecode_100/java/com/interview/tree/ConstructBSTFromPreOrderArray.java new file mode 100644 index 00000000..7ed43ffb --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConstructBSTFromPreOrderArray.java @@ -0,0 +1,49 @@ +package com.interview.tree; + +class Index{ + int index; +} +/** + * http://www.geeksforgeeks.org/construct-bst-from-given-preorder-traversa/ + * Test case + * empty array + * 1,2 or more elements in the array + */ +public class ConstructBSTFromPreOrderArray { + + public Node toBST(int preorder[]){ + Index index = new Index(); + return toBST(preorder,Integer.MIN_VALUE,Integer.MAX_VALUE,index); + } + + //stack based version + public Node toBSTIterative(int preorder[]){ + return null; + } + + private Node toBST(int preorder[],int min, int max,Index index){ + if(index.index >= preorder.length){ + return null; + } + if(preorder[index.index] < min || preorder[index.index] >= max){ + return null; + } + + Node node = new Node(); + node.data = preorder[index.index]; + index.index++; + node.left = toBST(preorder,min,node.data, index); + node.right = toBST(preorder,node.data,max,index); + return node; + } + + public static void main(String args[]){ + int preorder[] = {10,5,1,7,40,50}; + ConstructBSTFromPreOrderArray poa = new ConstructBSTFromPreOrderArray(); + Node root = poa.toBST(preorder); + TreeTraversals tt = new TreeTraversals(); + tt.preOrder(root); + System.out.println(); + tt.inOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/ConstructFullTreeFromPreOrderPostOrder.java b/showmecode_100/java/com/interview/tree/ConstructFullTreeFromPreOrderPostOrder.java new file mode 100644 index 00000000..5c655600 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConstructFullTreeFromPreOrderPostOrder.java @@ -0,0 +1,50 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/full-and-complete-binary-tree-from-given-preorder-and-postorder-traversals/ + * Full tree is a tree with all nodes with either 0 or 2 child. Never has 1 child. + * Test cases + * Empty tree + * Tree with big on left side + * Tree with big on right side + */ +public class ConstructFullTreeFromPreOrderPostOrder { + + public Node constructTree(int preorder[],int postorder[]){ + + return constructTree(preorder, postorder, 0, postorder.length-2, 0); + + } + + private Node constructTree(int preorder[],int postorder[],int low,int high,int index){ + + if(low > high || index >= preorder.length-1){ + Node node = new Node(); + node.data = preorder[index]; + return node; + } + + Node node = new Node(); + node.data = preorder[index]; + int i=0; + for(i=low; i <= high; i++){ + if(preorder[index+1] == postorder[i]){ + break; + } + } + node.left = constructTree(preorder, postorder, low, i-1, index+1); + node.right = constructTree(preorder, postorder, i+1, high-1, index + i-low+2); + return node; + } + + public static void main(String args[]){ + ConstructFullTreeFromPreOrderPostOrder cft = new ConstructFullTreeFromPreOrderPostOrder(); + int preorder[] = {1,2,3,6,7,8,9}; + int postorder[] = {2,6,8,9,7,3,1}; + Node root = cft.constructTree(preorder, postorder); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + tt.preOrder(root); + tt.postOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/ConstructTreeFromInOrderPreOrder.java b/showmecode_100/java/com/interview/tree/ConstructTreeFromInOrderPreOrder.java new file mode 100644 index 00000000..c14ee9ea --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConstructTreeFromInOrderPreOrder.java @@ -0,0 +1,39 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/ + * Test cases: + * Empty tree + * One node tree + * All left side tree + * All right side tree + * Mixed tree + * Full tree + * complete tree + */ +public class ConstructTreeFromInOrderPreOrder { + + private int index = 0; + public Node createTree(int inorder[],int preorder[]){ + Node result = createTree(inorder,preorder,0,inorder.length-1); + index = 0; + return result; + } + + private Node createTree(int inorder[],int preorder[], int start, int end){ + if(start > end){ + return null; + } + int i; + for(i=start; i <= end; i++){ + if(preorder[index] == inorder[i]){ + break; + } + } + Node node = Node.newNode(preorder[index]); + index++; + node.left = createTree(inorder,preorder,start,i-1); + node.right = createTree(inorder,preorder,i+1,end); + return node; + } +} diff --git a/showmecode_100/java/com/interview/tree/ConstructTreeFromLevelOrderInOrder.java b/showmecode_100/java/com/interview/tree/ConstructTreeFromLevelOrderInOrder.java new file mode 100644 index 00000000..e07b117e --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConstructTreeFromLevelOrderInOrder.java @@ -0,0 +1,70 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/construct-tree-inorder-level-order-traversals/ + * Test cases + * same length of inorder and level order array + * all elements should be same in them + * what to do if repetition happens. This logic only works for non repeated values + * if inorder and levelorder were represented by string how would you handle multi digits + * e.g 1234 we don't know if it is 12 34 or 1 2 3 4 or what. Maybe use brackets + * (12)(3)(4) to differentiate between them. + */ +public class ConstructTreeFromLevelOrderInOrder { + + public Node constructTree(int inOrder[], int levelOrder[]){ + return constructTree(inOrder, levelOrder,0,inOrder.length-1); + } + + private int[] extractArray(int inOrder[], int levelOrder[],int low, int high){ + int result[] = new int[high - low + 1]; + int p=0; + for(int i=1; i < levelOrder.length; i++){ + int index = search(inOrder,levelOrder[i],low,high); + if(index != -1){ + result[p++] = inOrder[index]; + } + } + return result; + } + + private Node constructTree(int inOrder[], int levelOrder[], int low, int high){ + if(low > high){ + return null; + } + int lowElement = levelOrder[0]; + Node n = Node.newNode(lowElement); + int index = search(inOrder,lowElement,low,high); + int left[] = extractArray(inOrder,levelOrder,low,index-1); + int right[] = extractArray(inOrder,levelOrder,index+1,high); + n.left = constructTree(inOrder, left, low, index-1); + n.right = constructTree(inOrder, right, index+1, high); + return n; + } + + private int search(int input[],int key, int low, int high){ + if(low > high){ + return -1; + } + int middle = (low + high)/2; + if(input[middle] == key){ + return middle; + }else if(input[middle] > key){ + return search(input,key,low,middle-1); + }else{ + return search(input,key,middle+1,high); + } + } + + public static void main(String args[]){ + int inOrder[] = {4,8,10,12,14,20,22}; + int levelOrder[] = {20,8,22,4,12,10,14}; + ConstructTreeFromLevelOrderInOrder ctf = new ConstructTreeFromLevelOrderInOrder(); + Node root = ctf.constructTree(inOrder, levelOrder); + LevelOrderTraversal lot = new LevelOrderTraversal(); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + lot.levelOrder(root); + } + +} diff --git a/showmecode_100/java/com/interview/tree/ConstructTreeFromPreOrderTraversalWith0or2Child.java b/showmecode_100/java/com/interview/tree/ConstructTreeFromPreOrderTraversalWith0or2Child.java new file mode 100644 index 00000000..5c705e9d --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ConstructTreeFromPreOrderTraversalWith0or2Child.java @@ -0,0 +1,46 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/construct-a-special-tree-from-given-preorder-traversal/ + * Test cases: + * Length of pre and val is not same + * val contains values other than N or L + */ +class PreIndex{ + int index; +} +public class ConstructTreeFromPreOrderTraversalWith0or2Child { + + public Node createTree(int pre[],char val[]){ + PreIndex pi = new PreIndex(); + pi.index = 0; + return createTree(pre, val,pi); + } + + private Node createTree(int pre[],char val[], PreIndex ind){ + if(ind.index >= pre.length){ + return null; + } + Node root = Node.newNode(pre[ind.index]); + + if(val[ind.index] == 'L'){ + ind.index++; + }else{ + ind.index++; + root.left = createTree(pre,val,ind); + root.right = createTree(pre,val,ind); + } + return root; + } + + public static void main(String args[]){ + int pre[] = {10,20,30,40,50,60,70,80,90}; + char val[] = {'N','N','N','L','L','L','N','L','L'}; + ConstructTreeFromPreOrderTraversalWith0or2Child tfp = new ConstructTreeFromPreOrderTraversalWith0or2Child(); + Node root = tfp.createTree(pre, val); + TreeTraversals tt = new TreeTraversals(); + tt.preOrder(root); + System.out.println(); + tt.inOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/ContructTreeFromInOrderTraversalRootGreaterThanChild.java b/showmecode_100/java/com/interview/tree/ContructTreeFromInOrderTraversalRootGreaterThanChild.java new file mode 100644 index 00000000..15e99750 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ContructTreeFromInOrderTraversalRootGreaterThanChild.java @@ -0,0 +1,40 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/construct-binary-tree-from-inorder-traversal/ + * Given inorder traversal of binary tree where every node is greater than + * its left and right child. + * Test cases: + * One two or more nodes in the tree + */ +public class ContructTreeFromInOrderTraversalRootGreaterThanChild { + + public Node createTree(int inorder[]){ + return createTree(inorder,0,inorder.length-1); + } + private Node createTree(int inorder[],int low,int high) + { + if(low > high){ + return null; + } + int i; + int maxIndex = low; + for(i=low ; i <= high; i++){ + if(inorder[maxIndex] > inorder[i]){ + maxIndex = i; + } + } + Node root = Node.newNode(inorder[maxIndex]); + root.left = createTree(inorder,low,maxIndex-1); + root.right = createTree(inorder,maxIndex+1,high); + return root; + } + + public static void main(String args[]){ + int inorder[] = {9,15,25,6,18,-1,3,-3}; + ContructTreeFromInOrderTraversalRootGreaterThanChild tf = new ContructTreeFromInOrderTraversalRootGreaterThanChild(); + Node root = tf.createTree(inorder); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/ContructTreeFromInorderPostOrder.java b/showmecode_100/java/com/interview/tree/ContructTreeFromInorderPostOrder.java new file mode 100644 index 00000000..158e3563 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/ContructTreeFromInorderPostOrder.java @@ -0,0 +1,30 @@ +package com.interview.tree; + +/** + * Given inorder and postorder traversal of a tree, construct the binary tree. + * + * https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/ + */ +public class ContructTreeFromInorderPostOrder { + public Node buildTree(int[] inorder, int[] postorder) { + return buildTree(inorder, postorder, 0, inorder.length - 1, postorder.length - 1); + } + + public Node buildTree(int[] inorder, int[] postorder, int start, int end, int index) { + if (start > end) { + return null; + } + + int i; + for (i = start; i <= end; i++) { + if (postorder[index] == inorder[i]) { + break; + } + } + + Node tn = Node.newNode(postorder[index]); + tn.left = buildTree(inorder, postorder, start, i - 1, index - (end - i + 1)); + tn.right = buildTree(inorder, postorder, i + 1, end, index - 1); + return tn; + } +} diff --git a/showmecode_100/java/com/interview/tree/CountNodesCompleteTree.java b/showmecode_100/java/com/interview/tree/CountNodesCompleteTree.java new file mode 100644 index 00000000..e82ed167 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/CountNodesCompleteTree.java @@ -0,0 +1,51 @@ +package com.interview.tree; + +/** + * Date 10/06/2016 + * @author Tushar Roy + * + * Given a complete binary tree, count the number of nodes. + * + * Time complexity O(log(n) ^ 2) + * + * Reference + * https://leetcode.com/problems/count-complete-tree-nodes/ + */ +public class CountNodesCompleteTree { + + public int countNodes(Node root) { + if (root == null) { + return 0; + } + int lh = leftHeight(root.left); + int rh1 = rightHeight(root.left); + int rh = rightHeight(root.right); + + if (lh == rh) { + return (1< 1){ + if(height(root.left.left) >= height(root.left.right)){ + root = rightRotate(root); + }else{ + root.left = leftRotate(root.left); + root = rightRotate(root); + } + }else if(height(root.right) - height(root.left) > 1){ + if(height(root.right.right) >= height(root.right.left)){ + root = leftRotate(root); + }else{ + root.right = rightRotate(root.right); + root = leftRotate(root); + } + } + else{ + root.height = setHeight(root); + root.size = setSize(root); + } + return root; + } + + public int[] count(int input[]){ + int count[] = new int[input.length]; + Node root = null; + for(int i=input.length-1; i >= 0; i--){ + root = insert(root,input[i],count,i,0); + } + return count; + } + + public static void main(String args[]){ + int input[] = {12, 1, 2, 3, 0, 11, 4}; + CountNumberOfSmallerElementOnRight cns = new CountNumberOfSmallerElementOnRight(); + int count[] = cns.count(input); + for(int c : count){ + System.out.print(c + " "); + } + System.out.println(); + int input1[] = {5, 4, 3, 2, 1}; + int count1[] = cns.count(input1); + for(int c : count1){ + System.out.print(c + " "); + } + + System.out.println(); + int input2[] = {1,2,3,4,5}; + int count2[] = cns.count(input2); + for(int c : count2){ + System.out.print(c + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/tree/CountPathSum.java b/showmecode_100/java/com/interview/tree/CountPathSum.java new file mode 100644 index 00000000..de7030b5 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/CountPathSum.java @@ -0,0 +1,29 @@ +package com.interview.tree; + +import java.util.HashMap; +import java.util.Map; + +/** + * https://leetcode.com/problems/path-sum-iii/description/ + */ +public class CountPathSum { + public int pathSum(Node root, int sum) { + Map map = new HashMap<>(); + map.put(0, 1); + return countPathSum(root, sum, map, 0); + } + + private int countPathSum(Node root, int sum, Map map, int prefixSum) { + if (root == null) { + return 0; + } + + prefixSum += root.data; + int count = map.getOrDefault(prefixSum - sum,0); + map.put(prefixSum, map.getOrDefault(prefixSum, 0) + 1); + count += countPathSum(root.left, sum, map, prefixSum) + countPathSum(root.right, sum, map, prefixSum); + map.put(prefixSum, map.getOrDefault(prefixSum, 1) - 1); + return count; + } +} + diff --git a/showmecode_100/java/com/interview/tree/CountUnivalueTree.java b/showmecode_100/java/com/interview/tree/CountUnivalueTree.java new file mode 100644 index 00000000..050b39a3 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/CountUnivalueTree.java @@ -0,0 +1,32 @@ +package com.interview.tree; + +/** + * Date 10/07/2016 + * @author Tushar Roy + * + * Given a binary tree, count the number of uni-value subtrees. + * A Uni-value subtree means all nodes of the subtree have the same value. + * + * https://leetcode.com/problems/count-univalue-subtrees/ + */ +public class CountUnivalueTree { + private int count = 0; + public int countUnivalSubtrees(Node root) { + countUnivalSubtreesUtil(root, 0); + return count; + } + + private int countUnivalSubtreesUtil(Node root, int val) { + if (root == null) { + return val; + } + int left = countUnivalSubtreesUtil(root.left, root.data); + int right = countUnivalSubtreesUtil(root.right, root.data); + if (left == right && left == root.data) { + count++; + return root.data; + } else { + return Integer.MAX_VALUE; + } + } +} diff --git a/showmecode_100/java/com/interview/tree/CousinNodes.java b/showmecode_100/java/com/interview/tree/CousinNodes.java new file mode 100644 index 00000000..ef780629 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/CousinNodes.java @@ -0,0 +1,137 @@ +package com.interview.tree; + +import java.util.Deque; +import java.util.LinkedList; +import java.util.Queue; + +/** + * http://www.geeksforgeeks.org/check-two-nodes-cousins-binary-tree/ Assumption + * that both a and b are unique in tree. Test cases: Empty tree Tree with only + * root Tree and input with a and b as cousin node Tree and input with a and b + * not cousin node Tree with input a and b being siblings(not cousin) + */ +public class CousinNodes { + + /** + * Little more efficient than other method since this guy does not need + * another look up to see if parent is same for found nodes. + */ + public boolean areCousins1(Node root, int data1, int data2) { + Queue queue = new LinkedList<>(); + queue.add(root); + int tempLevel = 1; + int level = 0; + boolean found1 = false; + boolean found2 = false; + Node parent1 = null; + Node parent2 = null; + while (!queue.isEmpty()) { + while (tempLevel > 0) { + root = queue.poll(); + if (root.left != null) { + if (root.left.data == data1) { + found1 = true; + parent1 = root; + } else if (root.left.data == data2) { + found2 = true; + parent2 = root; + } else { + queue.add(root.left); + level++; + } + } + if (root.right != null) { + if (root.right.data == data1) { + found1 = true; + parent1 = root; + } else if (root.right.data == data2) { + found2 = true; + parent2 = root; + } else { + queue.add(root.right); + level++; + } + } + tempLevel--; + } + if (found1 && found2 && parent1 != parent2) { + return true; + } else if (found1 || found2) { + return false; + } + tempLevel = level; + level = 0; + } + return false; + } + + public boolean areCousins(Node root, int a, int b) { + Deque queue = new LinkedList(); + queue.offerFirst(root); + int levelSize = 1; + int tempLevelSize = 1; + boolean foundFirst = false; + while (!queue.isEmpty()) { + levelSize = 0; + while (tempLevelSize > 0) { + Node node = queue.pollLast(); + // this is to make sure a and b are not siblings of each other + // if they are return false since they cant be cousins + if (checkSameParent(node, a, b)) { + return false; + } + if (node.data == a || node.data == b) { + if (foundFirst) { + return true; + } + foundFirst = true; + } + if (node.left != null) { + queue.offerFirst(node.left); + levelSize++; + } + if (node.right != null) { + queue.offerFirst(node.right); + levelSize++; + } + tempLevelSize--; + } + if (foundFirst) { + return false; + } + tempLevelSize = levelSize; + } + return false; + } + + private boolean checkSameParent(Node root, int a, int b) { + if (root.left != null && root.right != null) { + if ((root.left.data == a || root.left.data == b) + && (root.right.data == a || root.right.data == b)) { + return true; + } + } + return false; + } + + public static void main(String args[]) { + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + head = bt.addNode(21, head); + head = bt.addNode(-6, head); + CousinNodes cn = new CousinNodes(); + System.out.println(cn.areCousins(head, 10, 19)); + System.out.println(cn.areCousins(head, 19, 7)); + System.out.println(cn.areCousins(head, 19, -1)); + System.out.println(cn.areCousins(head, 19, -6)); + System.out.println(cn.areCousins(head, -1, 7)); + System.out.println(cn.areCousins(head, 7, -1)); + } +} diff --git a/showmecode_100/java/com/interview/tree/DegenerateBinaryTreeToSortedLL.java b/showmecode_100/java/com/interview/tree/DegenerateBinaryTreeToSortedLL.java new file mode 100644 index 00000000..c62569e0 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/DegenerateBinaryTreeToSortedLL.java @@ -0,0 +1,81 @@ +package com.interview.tree; + +/** + * Date 03/16/2015 + * @author tusroy + * + * Given a binary tree(not BST) convert it into sorted linklist. + * e.g 10 + * 11 15 + * 8 9 16 13 + * 7 + * + * should become 7->8->9->10->11->13->15->16 + * + * Solution + * Idea is that at every root, get the sorted linklist from left and right and merge them + * along with root and return left most element in this merged linklist to upper level call. + * + * Test cases + * 1) Null root + * 2) One node root + * 3) BST + * 4) Reverse BST + * 5) All on left side of root + * + * Reference + * http://www.careercup.com/question?id=6241652616200192 + * + */ +public class DegenerateBinaryTreeToSortedLL { + + public Node degenerate(Node root){ + if(root == null){ + return null; + } + + Node left = root.left; + Node right = root.right; + root.left = null; + root.right = null; + left = degenerate(left); + right = degenerate(right); + left = merge(left, root); + return merge(left, right); + } + + private Node merge(Node root1, Node root2){ + if(root1 == null){ + return root2; + } + if(root2 == null){ + return root1; + } + + if(root1.data <= root2.data){ + root1.right = merge(root1.right, root2); + return root1; + }else{ + root2.right = merge(root1, root2.right); + return root2; + } + } + + private void printList(Node root){ + while(root != null){ + System.out.print(root.data + " "); + root = root.right; + } + } + + public static void main(String args[]){ + ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); + int inorder[] = {8, 11, 9, 10, 16, 15, 13, 7}; + int preorder[] = {10, 11, 8, 9, 15, 16, 13, 7}; + Node root = ctf.createTree(inorder, preorder); + DegenerateBinaryTreeToSortedLL dbt = new DegenerateBinaryTreeToSortedLL(); + root = dbt.degenerate(root); + dbt.printList(root); + } + +} diff --git a/showmecode_100/java/com/interview/tree/DiameterOfTree.java b/showmecode_100/java/com/interview/tree/DiameterOfTree.java new file mode 100644 index 00000000..0d8e3a93 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/DiameterOfTree.java @@ -0,0 +1,52 @@ +package com.interview.tree; + +class Height{ + int height; +} + +/** + * http://www.geeksforgeeks.org/diameter-of-a-binary-tree/ + * Test cases + * All left nodes + * All right nodes + */ +public class DiameterOfTree { + + public int diameter(Node root){ + Height height = new Height(); + return diameter(root,height); + } + + private int diameter(Node root, Height height){ + + if(root == null){ + return 0; + } + + Height leftHeight = new Height(); + Height rightHeight = new Height(); + int dial = diameter(root.left,leftHeight); + int diar = diameter(root.right,rightHeight); + height.height = Math.max(leftHeight.height, rightHeight.height) + 1; + return Math.max(Math.max(dial, diar),(1 + leftHeight.height + rightHeight.height)); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + head = bt.addNode(21, head); + head = bt.addNode(11, head); + head = bt.addNode(12, head); + head = bt.addNode(13, head); + head = bt.addNode(14, head); + DiameterOfTree dt = new DiameterOfTree(); + System.out.println(dt.diameter(head)); + } +} diff --git a/showmecode_100/java/com/interview/tree/FenwickTree.java b/showmecode_100/java/com/interview/tree/FenwickTree.java new file mode 100644 index 00000000..f41d26d8 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/FenwickTree.java @@ -0,0 +1,92 @@ +package com.interview.tree; + +/** + * Date 04/27/2015 + * @author tusroy + * + * Write a program to implement fenwick or binary indexed tree + * + * A Fenwick tree or binary indexed tree is a data structure providing efficient methods + * for calculation and manipulation of the prefix sums of a table of values. + * + * Space complexity for fenwick tree is O(n) + * Time complexity to create fenwick tree is O(nlogn) + * Time complexity to update value is O(logn) + * Time complexity to get prefix sum is O(logn) + * + * References + * http://www.geeksforgeeks.org/binary-indexed-tree-or-fenwick-tree-2/ + * https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/ + * http://en.wikipedia.org/wiki/Fenwick_tree + */ +public class FenwickTree { + + /** + * Start from index+1 if you updating index in original array. Keep adding this value + * for next node till you reach outside range of tree + */ + public void updateBinaryIndexedTree(int binaryIndexedTree[], int val, int index){ + while(index < binaryIndexedTree.length){ + binaryIndexedTree[index] += val; + index = getNext(index); + } + } + + /** + * Start from index+1 if you want prefix sum 0 to index. Keep adding value + * till you reach 0 + */ + public int getSum(int binaryIndexedTree[], int index){ + index = index + 1; + int sum = 0; + while(index > 0){ + sum += binaryIndexedTree[index]; + index = getParent(index); + } + return sum; + } + + /** + * Creating tree is like updating Fenwick tree for every value in array + */ + public int[] createTree(int input[]){ + int binaryIndexedTree[] = new int[input.length+1]; + for(int i=1; i <= input.length; i++){ + updateBinaryIndexedTree(binaryIndexedTree, input[i-1], i); + } + return binaryIndexedTree; + } + + /** + * To get parent + * 1) 2's complement to get minus of index + * 2) AND this with index + * 3) Subtract that from index + */ + private int getParent(int index){ + return index - (index & -index); + } + + /** + * To get next + * 1) 2's complement of get minus of index + * 2) AND this with index + * 3) Add it to index + */ + private int getNext(int index){ + return index + (index & -index); + } + + public static void main(String args[]){ + int input[] = {1,2,3,4,5,6,7}; + FenwickTree ft = new FenwickTree(); + int binaryIndexedTree[] = ft.createTree(input); + assert 1 == ft.getSum(binaryIndexedTree, 0); + assert 3 == ft.getSum(binaryIndexedTree, 1); + assert 6 == ft.getSum(binaryIndexedTree, 2); + assert 10 == ft.getSum(binaryIndexedTree, 3); + assert 15 == ft.getSum(binaryIndexedTree, 4); + assert 21 == ft.getSum(binaryIndexedTree, 5); + assert 28 == ft.getSum(binaryIndexedTree, 6); + } +} diff --git a/showmecode_100/java/com/interview/tree/FlattenLinkListToBinaryTreePreorder.java b/showmecode_100/java/com/interview/tree/FlattenLinkListToBinaryTreePreorder.java new file mode 100644 index 00000000..bd1d11eb --- /dev/null +++ b/showmecode_100/java/com/interview/tree/FlattenLinkListToBinaryTreePreorder.java @@ -0,0 +1,53 @@ +package com.interview.tree; + +import java.util.Stack; + +/** + * Date 10/06/2016 + * @author Tushar Roy + * + * Given a binary tree, flatten it to a linked list in-place in preorder traversal. + * + * Time complexity O(n) + * + * https://leetcode.com/problems/flatten-binary-tree-to-linked-list/ + */ +public class FlattenLinkListToBinaryTreePreorder { + public void flatten(Node root) { + if (root == null) { + return; + } + Stack stack = new Stack<>(); + stack.push(root); + Node prev = null; + while (!stack.isEmpty()) { + Node node = stack.pop(); + if (prev != null) { + prev.right = node; + } + prev = node; + if (node.right != null) { + stack.push(node.right); + } + if (node.left != null) { + stack.push(node.left); + } + node.left = null; + node.right = null; + } + } + + public void flatten1(Node root) { + if(root==null) + return; + flatten(root.left); + flatten(root.right); + Node left = root.left; + Node right = root.right; + root.left = null; + root.right = left; + while(root.right!=null) + root = root.right; + root.right = right; + } +} diff --git a/showmecode_100/java/com/interview/tree/HeightBalanced.java b/showmecode_100/java/com/interview/tree/HeightBalanced.java new file mode 100644 index 00000000..d78aeeb5 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/HeightBalanced.java @@ -0,0 +1,34 @@ +package com.interview.tree; + +/** + * Date 10/06/2016 + * @author Tushar Roy + * + * Given a binary tree, determine if it is height-balanced. + * + * Time complexity O(logn) + * + * Reference + * https://leetcode.com/problems/balanced-binary-tree/ + */ +public class HeightBalanced { + public boolean isBalanced(Node root) { + return isBalancedUtil(root) >= 0; + } + + private int isBalancedUtil(Node root) { + if (root == null) { + return 0; + } + int left = isBalancedUtil(root.left); + if (left < 0) { + return -1; + } + int right = isBalancedUtil(root.right); + if (right < 0) { + return -1; + } + int diff = Math.abs(left - right); + return diff <= 1 ? (Math.max(left, right) + 1) : -1; + } +} diff --git a/showmecode_100/java/com/interview/tree/HuffmanEncoding.java b/showmecode_100/java/com/interview/tree/HuffmanEncoding.java new file mode 100644 index 00000000..eee9912d --- /dev/null +++ b/showmecode_100/java/com/interview/tree/HuffmanEncoding.java @@ -0,0 +1,87 @@ +package com.interview.tree; + +import java.util.HashMap; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Comparator; + +/** + * http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding/ + * http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding-set-2/ + */ +class HuffmanNode{ + int freq; + char input; + HuffmanNode left; + HuffmanNode right; +} + +class HuffmanNodeComparator implements Comparator{ + + @Override + public int compare(HuffmanNode o1, HuffmanNode o2) { + if(o1.freq < o2.freq){ + return -1; + }else{ + return 1; + } + } + +} + +public class HuffmanEncoding { + + public Map huffman(char[] input, int freq[]){ + HuffmanNodeComparator comparator = new HuffmanNodeComparator(); + PriorityQueue heap = new PriorityQueue(input.length,comparator); + for(int i=0; i < input.length; i++){ + HuffmanNode node = new HuffmanNode(); + node.freq = freq[i]; + node.input = input[i]; + heap.offer(node); + } + + while(heap.size() > 1){ + HuffmanNode node1 = heap.poll(); + HuffmanNode node2 = heap.poll(); + HuffmanNode node = new HuffmanNode(); + node.left = node1; + node.right = node2; + node.freq = node1.freq + node2.freq; + heap.offer(node); + } + + Map map = new HashMap(); + StringBuffer buff = new StringBuffer(); + createCode(heap.poll(),map,buff); + return map; + + } + + public void createCode(HuffmanNode node,Map map,StringBuffer buff){ + if(node == null){ + return; + } + + if(node.left == null && node.right == null){ + map.put(node.input,buff.toString()); + return; + } + buff.append("0"); + createCode(node.left,map,buff); + buff.deleteCharAt(buff.length()-1); + buff.append("1"); + createCode(node.right,map,buff); + buff.deleteCharAt(buff.length()-1); + } + + + public static void main(String args[]){ + HuffmanEncoding he = new HuffmanEncoding(); + char input[] = {'a','b','c','d','e','f'}; + int freq[] = {5,9,12,13,16,45}; + Map code = he.huffman(input, freq); + System.out.println(code); + } + +} diff --git a/showmecode_100/java/com/interview/tree/IdenticalTrees.java b/showmecode_100/java/com/interview/tree/IdenticalTrees.java new file mode 100644 index 00000000..b1e691c6 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/IdenticalTrees.java @@ -0,0 +1,165 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * http://www.geeksforgeeks.org/check-for-identical-bsts-without-building-the-trees/ + * Test cases + * Both array should be same size and have exact same elements and first element should be same + */ +public class IdenticalTrees { + + private class BigSmall{ + int big; + int small; + } + + public boolean sameBST(int tree1[], int tree2[]){ + return sameBST(tree1,tree2,Integer.MIN_VALUE,Integer.MAX_VALUE,0); + } + + private boolean sameBST(int tree1[],int tree2[],int min,int max,int index){ + if(index ==tree1.length){ + return true; + } + + int i=0; + for(i=0; i < tree2.length; i++){ + if(tree2[i] == tree1[index]){ + break; + } + } + + BigSmall bs1 = nextBigSmall(tree1,index,min,max); + BigSmall bs2 = nextBigSmall(tree2,i,min,max); + + boolean r1= tree1[bs1.big] == tree2[bs2.big] && tree1[bs1.small] == tree2[bs2.small] ; + if(r1 == false){ + return false; + } + boolean r2 = true,r3 =true; + if(bs1.small != 0){ + r2 = sameBST(tree1,tree2,min,tree1[index],bs1.small); + } + if(bs1.big != 0){ + r3 = sameBST(tree1,tree2,tree1[index],max,bs1.big); + } + return r2 && r3; + } + + private BigSmall nextBigSmall(int[] tree,int index,int min,int max){ + BigSmall bs = new BigSmall(); + boolean seenBig = false, seenSmall = false; + for(int i=index+1; i < tree.length && (!seenBig || !seenSmall); i++){ + if(tree[i] > max || tree[i] < min){ + continue; + } + if(!seenBig && tree[i] > tree[index]){ + bs.big = i; + seenBig = true; + } + if(!seenSmall && tree[i] < tree[index]){ + bs.small = i; + seenSmall = true; + } + } + return bs; + } + + /** + * Little simpler version of above implementation. Uses more space but atleast its easy to understand. + * All it does is makes 2 list one of larger and one of smaller element than root and then passes + * them into left and right sides + * @param arr1 + * @param arr2 + * @return + */ + + public boolean sameBST1(int arr1[], int arr2[]){ + List list1 = new ArrayList<>(); + for(int i : arr1){ + list1.add(i); + } + List list2 = new ArrayList<>(); + for(int i : arr2){ + list2.add(i); + } + + return sameBST1(list1, list2); + } + + /** + * It might not work for duplicate elements in array. For that you have to store + * both index and actual value to differentiate somehow. + */ + private boolean sameBST1(List arr1, List arr2){ + if(arr1.size() == 0 && arr2.size() == 0){ + return true; + } + if(arr1.size() == 0 || arr2.size() == 0){ + return false; + } + + if(arr1.get(0) != arr2.get(0)){ + return false; + } + List smaller1 = new ArrayList(); + List larger1= new ArrayList(); + boolean first = true; + for(Integer i : arr1){ + if(first){ + first = false; + continue; + } + if(i <= arr1.get(0)){ + smaller1.add(i); + }else{ + larger1.add(i); + } + } + first = true; + List smaller2 = new ArrayList(); + List larger2= new ArrayList(); + for(Integer i : arr2){ + if(first){ + first = false; + continue; + } + if(i <= arr2.get(0)){ + smaller2.add(i); + }else{ + larger2.add(i); + } + } + boolean r = compare(smaller1, smaller2) && compare(larger1, larger2); + if(!r){ + return false; + } + return sameBST1(smaller1, smaller2) && sameBST1(larger1, larger2); + + } + + private boolean compare(List l1, List l2){ + Set s = new HashSet(); + for(Integer i : l1){ + s.add(i); + } + for(Integer i : l2){ + if(!s.contains(i)){ + return false; + } + } + return true; + } + + public static void main(String args[]){ + int tree1[] = {3,-6,-2,11,9,-10,-1,15,10}; + int tree2[] = {3,11,9,15,-6,10,-2,-1,-10}; + IdenticalTrees it = new IdenticalTrees(); + System.out.println(it.sameBST(tree1, tree2)); + System.out.println(it.sameBST1(tree1, tree2)); + } +} diff --git a/showmecode_100/java/com/interview/tree/InorderSuccessor.java b/showmecode_100/java/com/interview/tree/InorderSuccessor.java new file mode 100644 index 00000000..b5ee046b --- /dev/null +++ b/showmecode_100/java/com/interview/tree/InorderSuccessor.java @@ -0,0 +1,38 @@ +package com.interview.tree; + +/** + * Date 03/27/2016 + * @author Tushar Roy + * + * Given a binary search tree and a node in it, find the in-order successor of that node in the BST. + * + * Time complexity O(h) + * Space complexity O(h) + * + * https://leetcode.com/problems/inorder-successor-in-bst/ + */ +public class InorderSuccessor { + public Node inorderSuccessor(Node root, Node p) { + if (p.right != null) { + p = p.right; + while (p.left != null) { + p = p.left; + } + return p; + } else { + return succ(root, p.data); + } + } + + private Node succ(Node root, int data) { + if (root.data == data) { + return null; + } + if (root.data < data) { + return succ(root.right, data); + } else { + Node s = succ(root.left, data); + return s == null ? root : s; + } + } +} diff --git a/showmecode_100/java/com/interview/tree/IntervalTree.java b/showmecode_100/java/com/interview/tree/IntervalTree.java new file mode 100644 index 00000000..4c4e4213 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/IntervalTree.java @@ -0,0 +1,84 @@ +package com.interview.tree; + +/** + * Date 11/07/2015 + * @author Tushar Roy + * + * Write class for interval tree + * Keep a max at every node which is max of that subtree. + * This max is used to decide which direction to move when checking + * for overlap. When an interval's high is less than max of left side go + * in that direciton otherwise go in other direction. + */ +class InternalNode { + int low; + int high; + int max; + InternalNode left; + InternalNode right; + + @Override + public String toString() { + return "InternalNode{" + + "max=" + max + + ", low=" + low + + ", high=" + high + + '}'; + } +} + +public class IntervalTree { + + public InternalNode insert(InternalNode root, int low, int high) { + if(root == null) { + InternalNode node = new InternalNode(); + node.low = low; + node.high = high; + node.max = high; + return node; + } + + if(low < root.low) { + root.left = insert(root.left, low, high); + } else { + root.right = insert(root.right, low, high); + } + + root.max = Math.max(root.high, high); + return root; + } + + public InternalNode isOverlap(InternalNode root, int low, int high) { + if(root == null) { + return null; + } + + if(root.high >= low && root.low <= high) { + return root; + } + + if(root.left != null && root.left.max > low) { + return isOverlap(root.left, low, high); + } else { + return isOverlap(root.right, low, high); + } + } + + public static void main(String args[]) { + IntervalTree it = new IntervalTree(); + InternalNode root = null; + root = it.insert(root, 10, 15); + root = it.insert(root, 11, 13); + root = it.insert(root, 18, 21); + root = it.insert(root, 20, 25); + root = it.insert(root, 0, 7); + + System.out.println(it.isOverlap(root, 8, 9)); + System.out.println(it.isOverlap(root, 17, 17)); + System.out.println(it.isOverlap(root, 21, 22)); + System.out.println(it.isOverlap(root, 21, 22)); + System.out.println(it.isOverlap(root, 12, 18)); + System.out.println(it.isOverlap(root, 24, 26)); + } + +} diff --git a/showmecode_100/java/com/interview/tree/IsBST.java b/showmecode_100/java/com/interview/tree/IsBST.java new file mode 100644 index 00000000..db0f4720 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/IsBST.java @@ -0,0 +1,87 @@ +package com.interview.tree; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * Date 04/11/2015 + * @author tusroy + * + * Youtube link - https://youtu.be/MILxfAbIhrE + * + * Given a binary tree, return true if it is binary search tree else return false. + * + * Solution + * Keep min, max for every recursion. Initial min and max is very small and very larger + * number. Check if root.data is in this range. When you go left pass min and root.data and + * for right pass root.data and max. + * + * Time complexity is O(n) since we are looking at all nodes. + * + * Test cases: + * Null tree + * 1 or 2 nodes tree + * Binary tree which is actually BST + * Binary tree which is not a BST + */ +public class IsBST { + + public boolean isBST(Node root){ + return isBST(root, Integer.MIN_VALUE, Integer.MAX_VALUE); + } + + private boolean isBST(Node root, int min, int max){ + if(root == null){ + return true; + } + if(root.data <= min || root.data > max){ + return false; + } + return isBST(root.left, min, root.data) && isBST(root.right, root.data, max); + } + + + public boolean isBSTIterative(Node root) { + if (root == null) { + return true; + } + + Deque stack = new LinkedList<>(); + Node node = root; + int prev = Integer.MIN_VALUE; + int current; + while ( true ) { + if (node != null) { + stack.addFirst(node); + node = node.left; + } else { + if (stack.isEmpty()) { + break; + } + node = stack.pollFirst(); + current = node.data; + if (current < prev) { + return false; + } + prev = current; + node = node.right; + } + } + return true; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(15, root); + root = bt.addNode(-10, root); + root = bt.addNode(17, root); + root = bt.addNode(20, root); + root = bt.addNode(0, root); + + IsBST isBST = new IsBST(); + assert isBST.isBST(root); + assert isBST.isBSTIterative(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/IsCompleteBinaryTree.java b/showmecode_100/java/com/interview/tree/IsCompleteBinaryTree.java new file mode 100644 index 00000000..edc62e52 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/IsCompleteBinaryTree.java @@ -0,0 +1,58 @@ +package com.interview.tree; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * http://www.geeksforgeeks.org/check-if-a-given-binary-tree-is-complete-tree-or-not/ + * Test cases: + * A node with only right child + * A node with only left child + * A node with both left and right child + */ +public class IsCompleteBinaryTree { + + public boolean isComplete(Node root){ + Queue queue = new LinkedList(); + queue.offer(root); + boolean foundFirstNonFull = false; + while(!queue.isEmpty()){ + root = queue.poll(); + if(foundFirstNonFull){ + if(root.left != null || root.right != null){ + return false; + } + continue; + } + if(root.left != null && root.right != null){ + queue.offer(root.left); + queue.offer(root.right); + }else if(root.left != null){ + queue.offer(root.left); + foundFirstNonFull = true; + }else if(root.right != null){ + return false; + }else{ + foundFirstNonFull = true; + } + } + return true; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(3, head); + head = bt.addNode(-6, head); + head = bt.addNode(7, head); + head = bt.addNode(-10, head); + head = bt.addNode(-15, head); + head = bt.addNode(-4, head); + head = bt.addNode(4, head); + head = bt.addNode(11, head); + head = bt.addNode(-9, head); + + IsCompleteBinaryTree icbt = new IsCompleteBinaryTree(); + System.out.println(icbt.isComplete(head)); + } +} diff --git a/showmecode_100/java/com/interview/tree/IsPreOrderArrayBST.java b/showmecode_100/java/com/interview/tree/IsPreOrderArrayBST.java new file mode 100644 index 00000000..8b31961e --- /dev/null +++ b/showmecode_100/java/com/interview/tree/IsPreOrderArrayBST.java @@ -0,0 +1,75 @@ +package com.interview.tree; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * Check if given pre array sequence will create a binary search tree or not. + * + * Idea is to keep minimal acceptable value. Any element in pre array should never be less + * than minimal acceptable value. Values are popped from stack till they are less than pre[i] + * Last popped value becomes new minimally acceptable vaue. + * + * It does not work for duplicates + * + * Time complexity - O(n) + * https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/ + * Reference - http://www.geeksforgeeks.org/check-if-a-given-array-can-represent-preorder-traversal-of-binary-search-tree/ + */ +public class IsPreOrderArrayBST { + + public boolean verifyPreorder(int pre[]) { + Deque deque = new LinkedList<>(); + int minAcceptable = Integer.MIN_VALUE; + deque.addFirst(pre[0]); + for(int i = 1; i < pre.length; i++) { + if(pre[i] < minAcceptable) { + return false; + } + while(!deque.isEmpty() && deque.peekFirst() < pre[i]) { + minAcceptable = deque.pollFirst(); + } + deque.addFirst(pre[i]); + } + return true; + } + + public boolean verifyPreorderConstantSpace(int[] preorder) { + int start = 0; + int min = Integer.MIN_VALUE; + for (int i = 1; i < preorder.length; i++) { + if (preorder[i] < min) { + return false; + } + if (preorder[i] > preorder[i - 1]) { + int index = binarySearch(preorder, start, i - 1, preorder[i]); + min = preorder[index]; + start = i; + } + } + return true; + } + + int binarySearch(int[] preorder, int start, int end, int val) { + int s = start; + int e = end; + while (s <= e) { + int middle = (s + e)/2; + if (preorder[middle] < val && (start == middle || preorder[middle - 1] > val)) { + return middle; + } else if (preorder[middle] < val) { + e = middle - 1; + } else { + s = middle + 1; + } + } + return -1; + } + + public static void main(String args[]) { + IsPreOrderArrayBST isb = new IsPreOrderArrayBST(); + int[] input = {10, 3, -1, 4, 13, 11, 12, 10}; + System.out.println(isb.verifyPreorder(input)); + System.out.println(isb.verifyPreorderConstantSpace(input)); + } +} diff --git a/showmecode_100/java/com/interview/tree/KClosestValueInBinaryTree.java b/showmecode_100/java/com/interview/tree/KClosestValueInBinaryTree.java new file mode 100644 index 00000000..4ae6cb05 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/KClosestValueInBinaryTree.java @@ -0,0 +1,120 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * Date 10/08/2016 + * @author Tushar Roy + * + * Given a non-empty binary search tree and a target value, find k values in the BST that are closest to the target. + * + * Time complexity O(log(n) + k) + * + * https://leetcode.com/problems/closest-binary-search-tree-value-ii/ + */ +public class KClosestValueInBinaryTree { + + public List closestKValues(Node root, double target, int k) { + if (root == null || k == 0) { + return new ArrayList<>(); + } + + Stack predecessor = new Stack(); + Stack successor = new Stack(); + + double closestDiff = Double.MAX_VALUE; + Node closestDiffNode = null; + while (root != null) { + predecessor.push(root); + successor.push(root); + if (Math.abs(target - root.data) < closestDiff) { + closestDiff = Math.abs(target - root.data); + closestDiffNode = root; + } + if (root.data == target) { + break; + } + + else if (target > root.data) { + root = root.right; + } else { + root = root.left; + } + } + + while (predecessor.peek() != closestDiffNode) { + predecessor.pop(); + successor.pop(); + } + predecessor.pop(); + successor.pop(); + List result = new ArrayList<>(); + result.add(closestDiffNode.data); + Node prec = closestDiffNode; + Node succ = closestDiffNode; + k--; + prec = predecessor(predecessor, prec); + succ = successor(successor, succ); + while (k > 0) { + if (succ == null || (prec != null && Math.abs(target - prec.data) < Math.abs(target - succ.data))) { + result.add(prec.data); + prec = predecessor(predecessor, prec); + } else { + result.add(succ.data); + succ = successor(successor, succ); + } + k--; + } + return result; + } + + private Node predecessor(Stack stack, Node current) { + if (current == null) { + return null; + } + if (current.left != null) { + stack.push(current); + current = current.left; + while (current.right != null) { + stack.push(current); + current = current.right; + } + return current; + } else { + while (!stack.isEmpty() && stack.peek().left == current) { + current = stack.pop(); + } + if (stack.isEmpty()) { + return null; + } else { + return stack.pop(); + } + } + } + + private Node successor(Stack stack, Node current) { + if (current == null) { + return null; + } + if (current.right != null) { + stack.push(current); + current = current.right; + while (current.left != null) { + stack.push(current); + current = current.left; + } + return current; + } else { + while (!stack.isEmpty() && stack.peek().right == current) { + current = stack.pop(); + } + if (stack.isEmpty()) { + return null; + } else { + return stack.pop(); + } + } + } +} diff --git a/showmecode_100/java/com/interview/tree/LargestBSTInBinaryTree.java b/showmecode_100/java/com/interview/tree/LargestBSTInBinaryTree.java new file mode 100644 index 00000000..2aa53b9d --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LargestBSTInBinaryTree.java @@ -0,0 +1,100 @@ +package com.interview.tree; + +/** + * Date 07/20/2014 + * @author tusroy + * + * Video link - https://youtu.be/4fiDs7CCxkc + * + * Given a binary tree, find size of largest binary search subtree in this + * binary tree. + * + * Traverse tree in post order fashion. Left and right nodes return 4 piece + * of information to root which isBST, size of max BST, min and max in those + * subtree. + * If both left and right subtree are BST and this node data is greater than max + * of left and less than min of right then it returns to above level left size + + * right size + 1 and new min will be min of left side and new max will be max of + * right side. + * + * References: + * http://www.geeksforgeeks.org/find-the-largest-subtree-in-a-tree-that-is-also-a-bst/ + * https://leetcode.com/problems/largest-bst-subtree/ + */ +public class LargestBSTInBinaryTree { + + public int largestBST(Node root){ + MinMax m = largest(root); + return m.size; + } + + private MinMax largest(Node root){ + //if root is null return min as Integer.MAX and max as Integer.MIN + if(root == null){ + return new MinMax(); + } + + //postorder traversal of tree. First visit left and right then + //use information of left and right to calculate largest BST. + MinMax leftMinMax = largest(root.left); + MinMax rightMinMax =largest(root.right); + + MinMax m = new MinMax(); + + //if either of left or right subtree says its not BST or the data + //of this node is not greater/equal than max of left and less than min of right + //then subtree with this node as root will not be BST. + //Return false and max size of left and right subtree to parent + if(leftMinMax.isBST == false || rightMinMax.isBST == false || (leftMinMax.max > root.data || rightMinMax.min <= root.data)){ + m.isBST = false; + m.size = Math.max(leftMinMax.size, rightMinMax.size); + return m; + } + + //if we reach this point means subtree with this node as root is BST. + //Set isBST as true. Then set size as size of left + size of right + 1. + //Set min and max to be returned to parent. + m.isBST = true; + m.size = leftMinMax.size + rightMinMax.size + 1; + + //if root.left is null then set root.data as min else + //take min of left side as min + m.min = root.left != null ? leftMinMax.min : root.data; + + //if root.right is null then set root.data as max else + //take max of right side as max. + m.max = root.right != null ? rightMinMax.max : root.data; + + return m; + } + + public static void main(String args[]){ + LargestBSTInBinaryTree lbi = new LargestBSTInBinaryTree(); + ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); + //this is just to create a binary tree. + int inorder[] = {-7,-6,-5,-4,-3,-2,1,2,3,16,6,10,11,12,14}; + int preorder[] = {3,-2,-3,-4,-5,-6,-7,1,2,16,10,6,12,11,14}; + Node root = ctf.createTree(inorder, preorder); + int largestBSTSize = lbi.largestBST(root); + System.out.println("Size of largest BST is " + largestBSTSize); + assert largestBSTSize == 8; + } +} + +/** + * Object of this class holds information which child passes back + * to parent node. + */ +class MinMax{ + int min; + int max; + boolean isBST; + int size ; + + MinMax(){ + min = Integer.MAX_VALUE; + max = Integer.MIN_VALUE; + isBST = true; + size = 0; + } +} diff --git a/showmecode_100/java/com/interview/tree/LargestIndependentSetInTree.java b/showmecode_100/java/com/interview/tree/LargestIndependentSetInTree.java new file mode 100644 index 00000000..e4bb456d --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LargestIndependentSetInTree.java @@ -0,0 +1,42 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/largest-independent-set-problem/ + */ +public class LargestIndependentSetInTree { + + public int largestSet(Node root){ + if(root == null){ + return 0; + } + + if(root.lis != -1){ + return root.lis; + } + int excl = 0; + int left_excl = 0; + if(root.left != null){ + left_excl = largestSet(root.left.left) + largestSet(root.left.right); + excl += largestSet(root.left); + } + int right_excl = 0; + if(root.right != null){ + right_excl = largestSet(root.right.left) + largestSet(root.right.right); + excl += largestSet(root.right); + } + + int incl = left_excl + right_excl + root.data; + root.lis = incl; + + return incl > excl ? incl : excl; + } + + public static void main(String args[]){ + int inorder[] = {4,13,1,7,6,3,19}; + int preorder[] = {13,4,6,7,1,3,19}; + ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); + Node root = ctf.createTree(inorder, preorder); + LargestIndependentSetInTree lis = new LargestIndependentSetInTree(); + System.out.println(lis.largestSet(root)); + } +} diff --git a/showmecode_100/java/com/interview/tree/LeavesOfBinaryTree.java b/showmecode_100/java/com/interview/tree/LeavesOfBinaryTree.java new file mode 100644 index 00000000..805322bd --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LeavesOfBinaryTree.java @@ -0,0 +1,44 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Date 10/08/2016 + * @author Tushar Roy + * + * Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves, repeat until the tree is empty. + * + * Time complexity O(n^2) for unbalanced tree. + * + * https://leetcode.com/problems/find-leaves-of-binary-tree/ + */ +public class LeavesOfBinaryTree { + public List> findLeaves(Node root) { + if (root == null) { + return Collections.EMPTY_LIST; + } + List> result = new ArrayList<>(); + List leaves = new ArrayList<>(); + while (stripLeaves(root, leaves) != null) { + result.add(leaves); + leaves = new ArrayList<>(); + } + result.add(leaves); + return result; + } + + Node stripLeaves(Node root, List leaves) { + if (root == null) { + return null; + } + if (root.left == null && root.right == null) { + leaves.add(root.data); + return null; + } + root.left = stripLeaves(root.left, leaves); + root.right = stripLeaves(root.right, leaves); + return root; + } +} diff --git a/showmecode_100/java/com/interview/tree/LevelOrderTraversal.java b/showmecode_100/java/com/interview/tree/LevelOrderTraversal.java new file mode 100644 index 00000000..a6634f81 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LevelOrderTraversal.java @@ -0,0 +1,53 @@ +package com.interview.tree; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * Youtube link - https://youtu.be/9PHkM0Jri_4 + * + * http://www.geeksforgeeks.org/level-order-tree-traversal/ + * Test cases + * Empty tree + * Tree with only left side + * Tree with only right side + * Mixed size tree + * Full tree + * complete tree + */ +public class LevelOrderTraversal { + + public void levelOrder(Node root){ + if(root == null){ + System.out.println("Please enter a valid tree!"); + return; + } + Queue queue = new LinkedList(); + queue.offer(root); + System.out.println(); + while(queue.size() > 0){ + root = queue.poll(); + System.out.print(root.data + " "); + if(root.left != null){ + queue.add(root.left); + } + if(root.right != null){ + queue.add(root.right); + } + } + } + + public static void main(String args[]){ + LevelOrderTraversal loi = new LevelOrderTraversal(); + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + loi.levelOrder(head); + } +} diff --git a/showmecode_100/java/com/interview/tree/LevelOrderTraversalInReverse.java b/showmecode_100/java/com/interview/tree/LevelOrderTraversalInReverse.java new file mode 100644 index 00000000..2723ccc2 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LevelOrderTraversalInReverse.java @@ -0,0 +1,69 @@ +package com.interview.tree; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + +/** + * Date 04/20/2015 + * @author tusroy + * + * Video link - https://youtu.be/D2bIbWGgvzI + * + * Given a binary tree print its level order traversal in reverse + * e.g 1 + * 2 3 + * 4 5 6 7 + * + * Output should be 4 5 6 7 2 3 1 + * + * Solution + * Maintain a stack and queue. Do regular level order traversal but + * put right first in the queue. Instead of printing put the result + * in stack. Finally print contents of the stack. + * + * Time and space complexity is O(n) + * + * References : http://www.geeksforgeeks.org/reverse-level-order-traversal/ + */ +public class LevelOrderTraversalInReverse { + + public void reverseLevelOrderTraversal(Node root){ + if(root == null){ + return; + } + Queue q = new LinkedList<>(); + Stack s = new Stack<>(); + + q.offer(root); + while(!q.isEmpty()){ + root = q.poll(); + if(root.right != null){ + q.offer(root.right); + } + if(root.left != null){ + q.offer(root.left); + } + s.push(root); + } + while(!s.isEmpty()){ + System.out.print(s.pop().data + " "); + } + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(30, root); + root = bt.addNode(25, root); + root = bt.addNode(35, root); + root = bt.addNode(-10, root); + root = bt.addNode(0, root); + root = bt.addNode(-20, root); + root = bt.addNode(-15, root); + root = bt.addNode(45, root); + LevelOrderTraversalInReverse rlo = new LevelOrderTraversalInReverse(); + rlo.reverseLevelOrderTraversal(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/LongestConsecutiveSequence.java b/showmecode_100/java/com/interview/tree/LongestConsecutiveSequence.java new file mode 100644 index 00000000..23fb4cb5 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LongestConsecutiveSequence.java @@ -0,0 +1,31 @@ +package com.interview.tree; + +/** + * Created by tushar_v_roy on 4/1/16. + */ +public class LongestConsecutiveSequence { + int max = 0; + public int longestConsecutive(Node root) { + if (root == null) { + return 0; + } + max = 0; + longestConsecutiveUtil(root, root.data - 1, 0); + return max; + } + + public void longestConsecutiveUtil(Node root, int prevData, int current) { + if (root == null) { + return; + } + + if (root.data == prevData + 1) { + current = current + 1; + } else { + current = 1; + } + max = Math.max(current, max); + longestConsecutiveUtil(root.left, root.data, current); + longestConsecutiveUtil(root.right, root.data, current); + } +} diff --git a/showmecode_100/java/com/interview/tree/LowestCommonAncestorInBinaryTree.java b/showmecode_100/java/com/interview/tree/LowestCommonAncestorInBinaryTree.java new file mode 100644 index 00000000..b49a3681 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LowestCommonAncestorInBinaryTree.java @@ -0,0 +1,30 @@ +package com.interview.tree; + +/** + * Date 04/27/2016 + * @author Tushar Roy + * + * Find lowest common ancestor in binary tree. + * + * Time complexity O(n) + * Space complexity O(h) + */ +public class LowestCommonAncestorInBinaryTree { + + public Node lca(Node root, Node n1, Node n2){ + if(root == null){ + return null; + } + if(root == n1 || root == n2){ + return root; + } + + Node left = lca(root.left, n1, n2); + Node right = lca(root.right, n1, n2); + + if(left != null && right != null){ + return root; + } + return left != null ? left : right; + } +} diff --git a/showmecode_100/java/com/interview/tree/LowestCommonAncestoryBinarySearchTree.java b/showmecode_100/java/com/interview/tree/LowestCommonAncestoryBinarySearchTree.java new file mode 100644 index 00000000..39e615c2 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/LowestCommonAncestoryBinarySearchTree.java @@ -0,0 +1,25 @@ +package com.interview.tree; + +/** + * Date 05/04/2016 + * @author Tushar Roy + * + * Lowest common ancestor in binary search tree. + * + * Time complexity O(height of tree) + * Space complexity O(height of tree) + * + * https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/ + */ +public class LowestCommonAncestoryBinarySearchTree { + + public Node lowestCommonAncestor(Node root, int p, int q) { + if (root.data > Math.max(p, q)) { + return lowestCommonAncestor(root.left, p, q); + } else if (root.data < Math.min(p, q)) { + return lowestCommonAncestor(root.right, p, q); + } else { + return root; + } + } +} diff --git a/showmecode_100/java/com/interview/tree/MorrisTraversal.java b/showmecode_100/java/com/interview/tree/MorrisTraversal.java new file mode 100644 index 00000000..962c7482 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/MorrisTraversal.java @@ -0,0 +1,81 @@ +package com.interview.tree; + +/** + * Date 03/08/2016 + * @author Tushar Roy + * + * Morris inorder/preorder traversals + * + * Time complexity O(n) + * Space complexity O(1) + */ +public class MorrisTraversal { + + public void inorder(Node root) { + Node current = root; + while(current != null) { + //left is null then print the node and go to right + if (current.left == null) { + System.out.print(current.data + " "); + current = current.right; + } + else { + //find the predecessor. + Node predecessor = current.left; + //To find predecessor keep going right till right node is not null or right node is not current. + while(predecessor.right != current && predecessor.right != null){ + predecessor = predecessor.right; + } + //if right node is null then go left after establishing link from predecessor to current. + if(predecessor.right == null){ + predecessor.right = current; + current = current.left; + }else{ //left is already visit. Go rigth after visiting current. + predecessor.right = null; + System.out.print(current.data + " "); + current = current.right; + } + } + } + } + + public void preorder(Node root) { + Node current = root; + while (current != null) { + if(current.left == null) { + System.out.print(current.data + " "); + current = current.right; + } + else { + Node predecessor = current.left; + while(predecessor.right != current && predecessor.right != null) { + predecessor = predecessor.right; + } + if(predecessor.right == null){ + predecessor.right = current; + System.out.print(current.data + " "); + current = current.left; + }else{ + predecessor.right = null; + current = current.right; + } + } + } + } + + public static void main(String args[]) { + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(50, root); + root = bt.addNode(-10, root); + root = bt.addNode(7, root); + root = bt.addNode(9, root); + root = bt.addNode(-20, root); + root = bt.addNode(30, root); + MorrisTraversal mt = new MorrisTraversal(); + mt.inorder(root); + System.out.println(); + mt.preorder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/NextInorderSuccessorIterator.java b/showmecode_100/java/com/interview/tree/NextInorderSuccessorIterator.java new file mode 100644 index 00000000..878737dd --- /dev/null +++ b/showmecode_100/java/com/interview/tree/NextInorderSuccessorIterator.java @@ -0,0 +1,53 @@ +package com.interview.tree; + +import java.util.HashSet; +import java.util.Set; +import java.util.Stack; + +/** + * http://www.glassdoor.com/Interview/Create-an-iterator-to-traverse-a-binary-tree-When-the-next-function-is-called-on-the-binary-tree-return-the-value-at-the-QTN_674695.htm + * null tree. + */ +public class NextInorderSuccessorIterator { + + private Node root = null; + Stack stack = new Stack(); + Set visited = new HashSet(); + NextInorderSuccessorIterator(Node root){ + this.root = root; + } + + public int next(){ + Node node = null; + while(root != null){ + stack.push(root); + root = root.left; + } + root = stack.pop(); + node = root; + root = root.right; + return node.data; + } + + public boolean hasNext(){ + if(root != null || stack.size() > 0){ + return true; + } + return false; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node node = null; + node = bt.addNode(10, node); + node = bt.addNode(-5, node); + node = bt.addNode(7, node); + node = bt.addNode(20, node); + node = bt.addNode(3, node); + node = bt.addNode(14, node); + NextInorderSuccessorIterator nis = new NextInorderSuccessorIterator(node); + while(nis.hasNext()){ + System.out.println(nis.next()); + } + } +} diff --git a/showmecode_100/java/com/interview/tree/NextInorderSuccessorOfTwoTree.java b/showmecode_100/java/com/interview/tree/NextInorderSuccessorOfTwoTree.java new file mode 100644 index 00000000..378a9673 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/NextInorderSuccessorOfTwoTree.java @@ -0,0 +1,84 @@ +package com.interview.tree; + +import java.util.HashSet; +import java.util.Set; +import java.util.Stack; + +/** + * Next inorder iterator of two trees. + * Merging tree to print one result + */ +public class NextInorderSuccessorOfTwoTree { + + private Node root1 = null; + private Node root2 = null; + Stack stack1 = new Stack(); + Stack stack2 = new Stack(); + Set visited = new HashSet(); + + NextInorderSuccessorOfTwoTree(Node root1, Node root2) { + this.root1 = root1; + this.root2 = root2; + } + + public boolean hasNext() { + if (root1 != null || stack1.size() > 0 || root2 != null + || stack2.size() > 0) { + return true; + } + return false; + } + + public Node next() { + Node node = null; + while (root1 != null) { + stack1.push(root1); + root1 = root1.left; + } + while (root2 != null) { + stack2.push(root2); + root2 = root2.left; + } + if (!stack1.isEmpty() && !stack2.isEmpty()) { + if (stack1.peek().data <= stack2.peek().data) { + node = stack1.pop(); + root1 = node.right; + } else { + node = stack2.pop(); + root2 = node.right; + } + } else if (stack1.isEmpty()) { + node = stack2.pop(); + root2 = node.right; + } else { + node = stack1.pop(); + root1 = node.right; + } + return node; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node node = null; + node = bt.addNode(10, node); + node = bt.addNode(-5, node); + node = bt.addNode(7, node); + node = bt.addNode(20, node); + node = bt.addNode(3, node); + node = bt.addNode(14, node); + + Node node1 = null; + node1 = bt.addNode(8, node1); + node1 = bt.addNode(-10, node1); + node1 = bt.addNode(18, node1); + node1 = bt.addNode(2, node1); + node1 = bt.addNode(11, node1); + + NextInorderSuccessorOfTwoTree nis = new NextInorderSuccessorOfTwoTree(node, node1); + while(nis.hasNext()){ + System.out.println(nis.next().data); + } + + } + +} diff --git a/showmecode_100/java/com/interview/tree/NodesAtDistanceK.java b/showmecode_100/java/com/interview/tree/NodesAtDistanceK.java new file mode 100644 index 00000000..80725eb2 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/NodesAtDistanceK.java @@ -0,0 +1,73 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/print-nodes-distance-k-given-node-binary-tree/ + * Test case + * k should not be negative + * k could be very big number which means nothing was found + * dest might/might not exists in the tree + * root could be null + */ +public class NodesAtDistanceK { + + private void findInChild(Node root, int k){ + if(root == null){ + return; + } + if(k == 0){ + System.out.println(root.data); + } + findInChild(root.left, k-1); + findInChild(root.right, k-1); + } + + public int printNodes(Node root,int dest, int k){ + if(root == null){ + return -1; + } + + if(root.data == dest){ + findInChild(root, k); + return k-1; + } + + int found = printNodes(root.left,dest,k); + if(found != -1){ + if(found == 0){ + System.out.println(root.data); + }else{ + findInChild(root.right, found-1); + } + return found -1; + } + + found = printNodes(root.right,dest,k); + if(found != -1){ + if(found == 0){ + System.out.println(root.data); + }else{ + findInChild(root.left, found-1); + } + return found-1; + } + return -1; + } + + public static void main(String args[]){ + NodesAtDistanceK nad = new NodesAtDistanceK(); + Node root = null; + BinaryTree bt = new BinaryTree(); + root = bt.addNode(10, root); + root = bt.addNode(3, root); + root = bt.addNode(-1, root); + root = bt.addNode(8, root); + root = bt.addNode(-6, root); + root = bt.addNode(-11, root); + root = bt.addNode(18, root); + root = bt.addNode(11, root); + root = bt.addNode(13, root); + root = bt.addNode(26, root); + root = bt.addNode(27, root); + nad.printNodes(root, 11, 2); + } +} diff --git a/showmecode_100/java/com/interview/tree/NodesWithNoSibling.java b/showmecode_100/java/com/interview/tree/NodesWithNoSibling.java new file mode 100644 index 00000000..708fcd72 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/NodesWithNoSibling.java @@ -0,0 +1,43 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/print-nodes-dont-sibling-binary-tree/ + * This does not print root node even though it has no sibling + * Test cases: + * Null tree + * Only one node tree + * All left side tree + * All right side tree + * Regular mix tree + */ +public class NodesWithNoSibling { + + public void printNodes(Node root){ + if(root == null){ + return; + } + if(root.left == null || root.right == null){ + if(root.left != null){ + System.out.print(root.left.data + " "); + } + if(root.right != null){ + System.out.print(root.right.data + " "); + } + } + printNodes(root.left); + printNodes(root.right); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(5, root); + root = bt.addNode(-1, root); + root = bt.addNode(-5, root); + root = bt.addNode(20, root); + root = bt.addNode(25, root); + NodesWithNoSibling nws = new NodesWithNoSibling(); + nws.printNodes(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/PathSum.java b/showmecode_100/java/com/interview/tree/PathSum.java new file mode 100644 index 00000000..e6fe3bcd --- /dev/null +++ b/showmecode_100/java/com/interview/tree/PathSum.java @@ -0,0 +1,52 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 10/06/2016 + * @author Tushar Roy + * + * Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. + * + * Time complexity O(n) + * + * https://leetcode.com/problems/path-sum/ + * https://leetcode.com/problems/path-sum-ii/ + */ +public class PathSum { + public List> pathSum(Node root, int sum) { + List> result = new ArrayList<>(); + List current = new ArrayList<>(); + pathSumUtil(root, sum, result, current); + return result; + } + + private void pathSumUtil(Node root, int sum, List> result, List currentPath) { + if (root == null) { + return; + } + if (root.left == null && root.right == null) { + if (root.data == sum) { + currentPath.add(root.data); + result.add(new ArrayList<>(currentPath)); + currentPath.remove(currentPath.size() - 1); + } + return; + } + currentPath.add(root.data); + pathSumUtil(root.left, sum - root.data, result, currentPath); + pathSumUtil(root.right, sum - root.data, result, currentPath); + currentPath.remove(currentPath.size() - 1); + } + + public boolean hasPathSum(Node root, int sum) { + if (root == null) { + return false; + } + if (root.left == null && root.right == null) { + return root.data == sum; + } + return hasPathSum(root.left, sum - root.data) || hasPathSum(root.right, sum - root.data); + } +} diff --git a/showmecode_100/java/com/interview/tree/PopulateInOrderSuccessor.java b/showmecode_100/java/com/interview/tree/PopulateInOrderSuccessor.java new file mode 100644 index 00000000..1c30bdd5 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/PopulateInOrderSuccessor.java @@ -0,0 +1,49 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/populate-inorder-successor-for-all-nodes/ + */ +public class PopulateInOrderSuccessor { + + private void populate(Node root, NodeRef nodeRef){ + if(root == null){ + return; + } + populate(root.right,nodeRef); + root.next = nodeRef.node; + nodeRef.node = root; + populate(root.left,nodeRef); + } + + public void populate(Node root){ + NodeRef nodeRef = new NodeRef(); + populate(root,nodeRef); + } + + public void print(Node root){ + if(root == null){ + return; + } + System.out.println(root.data); + print(root.next); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + head = bt.addNode(21, head); + PopulateInOrderSuccessor pio = new PopulateInOrderSuccessor(); + pio.populate(head); + while(head.left != null){ + head = head.left; + } + pio.print(head); + } +} diff --git a/showmecode_100/java/com/interview/tree/PrintPostOrderFromPreOrderInOrder.java b/showmecode_100/java/com/interview/tree/PrintPostOrderFromPreOrderInOrder.java new file mode 100644 index 00000000..499f67af --- /dev/null +++ b/showmecode_100/java/com/interview/tree/PrintPostOrderFromPreOrderInOrder.java @@ -0,0 +1,51 @@ +package com.interview.tree; + +/** + * Date 11/02/2015 + * @author Tushar Roy + * + * Given a preorder/inorder traversal of binary tree create postorder traversal of binary tree + * without creating the tree + * + * Time complexity - O(n) + * + * References + * http://www.geeksforgeeks.org/print-postorder-from-given-inorder-and-preorder-traversals/ + */ + +import java.util.concurrent.atomic.AtomicInteger; + +public class PrintPostOrderFromPreOrderInOrder { + + public int[] postOrder(int[] preorder, int[] inorder) { + int[] post = new int[inorder.length]; + AtomicInteger postIndex = new AtomicInteger(post.length - 1); + postOrder(preorder, inorder, post, 0, inorder.length -1, 0, postIndex); + return post; + } + + private void postOrder(int[] preorder, int[] inorder, int post[], int low, int high, int preIndex, AtomicInteger postIndex) { + if(low > high) { + return; + } + post[postIndex.getAndDecrement()] = preorder[preIndex]; + int i; + for(i=0; i < inorder.length; i++) { + if(preorder[preIndex] == inorder[i]) { + break; + } + } + postOrder(preorder, inorder, post, i+1, high, preIndex + (i - low) + 1, postIndex); + postOrder(preorder, inorder, post, low, i-1, preIndex + 1, postIndex); + } + + public static void main(String args[]) { + int preorder[] = {10, 5, 3, 21, 20, 18, 9 , 16}; + int inorder[] = {3, 5, 21, 10, 18, 9, 20, 16}; + PrintPostOrderFromPreOrderInOrder ppp = new PrintPostOrderFromPreOrderInOrder(); + int postorder[] = ppp.postOrder(preorder, inorder); + for(int i : postorder) { + System.out.print(i + " "); + } + } +} diff --git a/showmecode_100/java/com/interview/tree/PrintTwoBSTInSortedForm.java b/showmecode_100/java/com/interview/tree/PrintTwoBSTInSortedForm.java new file mode 100644 index 00000000..805a620f --- /dev/null +++ b/showmecode_100/java/com/interview/tree/PrintTwoBSTInSortedForm.java @@ -0,0 +1,90 @@ +package com.interview.tree; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * http://www.geeksforgeeks.org/merge-two-bsts-with-limited-extra-space/ + * Test cases + * Both tree are null + * One of the tree is null + * All elements of one tree occur before other tree + * All elements of one tree occur after other tree + * Elements are mixed + * All same elements + */ +public class PrintTwoBSTInSortedForm { + + public void print(Node root1, Node root2){ + Deque s1 = new LinkedList(); + Deque s2 = new LinkedList(); + + while(true){ + if(root1 != null){ + s1.addFirst(root1); + root1 = root1.left; + continue; + } + if(root2 != null){ + s2.addFirst(root2); + root2 = root2.left; + continue; + } + if(!s1.isEmpty()){ + root1 = s1.peekFirst(); + } + if(!s2.isEmpty()){ + root2 = s2.peekFirst(); + } + if(root1 != null && root2 != null){ + if(root1.data <= root2.data){ + System.out.println(root1.data); + root1 = s1.pollFirst(); + root1 = root1.right; + root2 = null; + }else{ + System.out.println(root2.data); + root2 = s2.pollFirst(); + root2 = root2.right; + root1 = null; + } + } + else if(root1 != null){ + System.out.println(root1.data); + root1 = s1.pollFirst(); + root1 = root1.right; + + }else if(root2 != null){ + System.out.println(root2.data); + root2 = s2.pollFirst(); + root2 = root2.right; + } + if(root1 == null && root2 == null && s1.isEmpty() && s2.isEmpty()){ + break; + } + } + } + + public static void main(String args[]){ + PrintTwoBSTInSortedForm ptb = new PrintTwoBSTInSortedForm(); + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + + Node head1 = null; + head1 = bt.addNode(-4, head1); + head1 = bt.addNode(-3, head1); + head1 = bt.addNode(6, head1); + head1 = bt.addNode(11, head1); + head1 = bt.addNode(22, head1); + head1 = bt.addNode(26, head1); + + ptb.print(head, head1); + } +} diff --git a/showmecode_100/java/com/interview/tree/RedBlackTree.java b/showmecode_100/java/com/interview/tree/RedBlackTree.java new file mode 100644 index 00000000..a0581801 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/RedBlackTree.java @@ -0,0 +1,570 @@ +package com.interview.tree; + +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Date 10/29/2015 + * @author Tushar Roy + * + * Red Black Tree + * + * Time complexity + * Insert - O(logn) + * Delete - O(logn) + * Search - O(logn) + * + * Does not work for duplicates. + * + * References + * http://pages.cs.wisc.edu/~skrentny/cs367-common/readings/Red-Black-Trees/ + * https://en.wikipedia.org/wiki/Red%E2%80%93black_tree + */ +public class RedBlackTree { + + public enum Color { + RED, + BLACK + } + + public static class Node { + int data; + Color color; + Node left; + Node right; + Node parent; + boolean isNullLeaf; + } + + private static Node createBlackNode(int data) { + Node node = new Node(); + node.data = data; + node.color = Color.BLACK; + node.left = createNullLeafNode(node); + node.right = createNullLeafNode(node); + return node; + } + + private static Node createNullLeafNode(Node parent) { + Node leaf = new Node(); + leaf.color = Color.BLACK; + leaf.isNullLeaf = true; + leaf.parent = parent; + return leaf; + } + + private static Node createRedNode(Node parent, int data) { + Node node = new Node(); + node.data = data; + node.color = Color.RED; + node.parent = parent; + node.left = createNullLeafNode(node); + node.right = createNullLeafNode(node); + return node; + } + + /** + * Main insert method of red black tree. + */ + public Node insert(Node root, int data) { + return insert(null, root, data); + } + + /** + * Main delete method of red black tree. + */ + public Node delete(Node root, int data) { + AtomicReference rootReference = new AtomicReference<>(); + delete(root, data, rootReference); + if(rootReference.get() == null) { + return root; + } else { + return rootReference.get(); + } + } + + /** + * Main print method of red black tree. + */ + public void printRedBlackTree(Node root) { + printRedBlackTree(root, 0); + } + + /** + * Main validate method of red black tree. + */ + public boolean validateRedBlackTree(Node root) { + + if(root == null) { + return true; + } + //check if root is black + if(root.color != Color.BLACK) { + System.out.print("Root is not black"); + return false; + } + //Use of AtomicInteger solely because java does not provide any other mutable int wrapper. + AtomicInteger blackCount = new AtomicInteger(0); + //make sure black count is same on all path and there is no red red relationship + return checkBlackNodesCount(root, blackCount, 0) && noRedRedParentChild(root, Color.BLACK); + } + + private void rightRotate(Node root, boolean changeColor) { + Node parent = root.parent; + root.parent = parent.parent; + if(parent.parent != null) { + if(parent.parent.right == parent) { + parent.parent.right = root; + } else { + parent.parent.left = root; + } + } + Node right = root.right; + root.right = parent; + parent.parent = root; + parent.left = right; + if(right != null) { + right.parent = parent; + } + if(changeColor) { + root.color = Color.BLACK; + parent.color = Color.RED; + } + } + + private void leftRotate(Node root, boolean changeColor) { + Node parent = root.parent; + root.parent = parent.parent; + if(parent.parent != null) { + if(parent.parent.right == parent) { + parent.parent.right = root; + } else { + parent.parent.left = root; + } + } + Node left = root.left; + root.left = parent; + parent.parent = root; + parent.right = left; + if(left != null) { + left.parent = parent; + } + if(changeColor) { + root.color = Color.BLACK; + parent.color = Color.RED; + } + } + + private Optional findSiblingNode(Node root) { + Node parent = root.parent; + if(isLeftChild(root)) { + return Optional.ofNullable(parent.right.isNullLeaf ? null : parent.right); + } else { + return Optional.ofNullable(parent.left.isNullLeaf ? null : parent.left); + } + } + + private boolean isLeftChild(Node root) { + Node parent = root.parent; + if(parent.left == root) { + return true; + } else { + return false; + } + } + + private Node insert(Node parent, Node root, int data) { + if(root == null || root.isNullLeaf) { + //if parent is not null means tree is not empty + //so create a red leaf node + if(parent != null) { + return createRedNode(parent, data); + } else { //otherwise create a black root node if tree is empty + return createBlackNode(data); + } + } + + //duplicate insertion is not allowed for this tree. + if(root.data == data) { + throw new IllegalArgumentException("Duplicate date " + data); + } + //if we go on left side then isLeft will be true + //if we go on right side then isLeft will be false. + boolean isLeft; + if(root.data > data) { + Node left = insert(root, root.left, data); + //if left becomes root parent means rotation + //happened at lower level. So just return left + //so that nodes at upper level can set their + //child correctly + if(left == root.parent) { + return left; + } + //set the left child returned to be left of root node + root.left = left; + //set isLeft to be true + isLeft = true; + } else { + Node right = insert(root, root.right, data); + //if right becomes root parent means rotation + //happened at lower level. So just return right + //so that nodes at upper level can set their + //child correctly + if(right == root.parent) { + return right; + } + //set the right child returned to be right of root node + root.right = right; + //set isRight to be true + isLeft = false; + } + + if(isLeft) { + //if we went to left side check to see Red-Red conflict + //between root and its left child + if(root.color == Color.RED && root.left.color == Color.RED) { + //get the sibling of root. It is returning optional means + //sibling could be empty + Optional sibling = findSiblingNode(root); + //if sibling is empty or of BLACK color + if(!sibling.isPresent() || sibling.get().color == Color.BLACK) { + //check if root is left child of its parent + if(isLeftChild(root)) { + //this creates left left situation. So do one right rotate + rightRotate(root, true); + } else { + //this creates left-right situation so do one right rotate followed + //by left rotate + + //do right rotation without change in color. So sending false. + //when right rotation is done root becomes right child of its left + //child. So make root = root.parent because its left child before rotation + //is new root of this subtree. + rightRotate(root.left, false); + //after rotation root should be root's parent + root = root.parent; + //then do left rotate with change of color + leftRotate(root, true); + } + + } else { + //we have sibling color as RED. So change color of root + //and its sibling to Black. And then change color of their + //parent to red if their parent is not a root. + root.color = Color.BLACK; + sibling.get().color = Color.BLACK; + //if parent's parent is not null means parent is not root. + //so change its color to RED. + if(root.parent.parent != null) { + root.parent.color = Color.RED; + } + } + } + } else { + //this is mirror case of above. So same comments as above. + if(root.color == Color.RED && root.right.color == Color.RED) { + Optional sibling = findSiblingNode(root); + if(!sibling.isPresent() || sibling.get().color == Color.BLACK) { + if(!isLeftChild(root)) { + leftRotate(root, true); + } else { + leftRotate(root.right, false); + root = root.parent; + rightRotate(root, true); + } + } else { + root.color = Color.BLACK; + sibling.get().color = Color.BLACK; + if(root.parent.parent != null) { + root.parent.color = Color.RED; + } + } + } + } + return root; + } + + /** + * Using atomicreference because java does not provide mutable wrapper. Its like + * double pointer in C. + */ + private void delete(Node root, int data, AtomicReference rootReference) { + if(root == null || root.isNullLeaf) { + return; + } + if(root.data == data) { + //if node to be deleted has 0 or 1 null children then we have + //deleteOneChild use case as discussed in video. + if(root.right.isNullLeaf || root.left.isNullLeaf) { + deleteOneChild(root, rootReference); + } else { + //otherwise look for the inorder successor in right subtree. + //replace inorder successor data at root data. + //then delete inorder successor which should have 0 or 1 not null child. + Node inorderSuccessor = findSmallest(root.right); + root.data = inorderSuccessor.data; + delete(root.right, inorderSuccessor.data, rootReference); + } + } + //search for the node to be deleted. + if(root.data < data) { + delete(root.right, data, rootReference); + } else { + delete(root.left, data, rootReference); + } + } + + private Node findSmallest(Node root) { + Node prev = null; + while(root != null && !root.isNullLeaf) { + prev = root; + root = root.left; + } + return prev != null ? prev : root; + } + + /** + * Assumption that node to be deleted has either 0 or 1 non leaf child + */ + private void deleteOneChild(Node nodeToBeDelete, AtomicReference rootReference) { + Node child = nodeToBeDelete.right.isNullLeaf ? nodeToBeDelete.left : nodeToBeDelete.right; + //replace node with either one not null child if it exists or null child. + replaceNode(nodeToBeDelete, child, rootReference); + //if the node to be deleted is BLACK. See if it has one red child. + if(nodeToBeDelete.color == Color.BLACK) { + //if it has one red child then change color of that child to be Black. + if(child.color == Color.RED) { + child.color = Color.BLACK; + } else { + //otherwise we have double black situation. + deleteCase1(child, rootReference); + } + } + } + + + /** + * If double black node becomes root then we are done. Turning it into + * single black node just reduces one black in every path. + */ + private void deleteCase1(Node doubleBlackNode, AtomicReference rootReference) { + if(doubleBlackNode.parent == null) { + rootReference.set(doubleBlackNode); + return; + } + deleteCase2(doubleBlackNode, rootReference); + } + + /** + * If sibling is red and parent and sibling's children are black then rotate it + * so that sibling becomes black. Double black node is still double black so we need + * further processing. + */ + private void deleteCase2(Node doubleBlackNode, AtomicReference rootReference) { + Node siblingNode = findSiblingNode(doubleBlackNode).get(); + if(siblingNode.color == Color.RED) { + if(isLeftChild(siblingNode)) { + rightRotate(siblingNode, true); + } else { + leftRotate(siblingNode, true); + } + if(siblingNode.parent == null) { + rootReference.set(siblingNode); + } + } + deleteCase3(doubleBlackNode, rootReference); + } + + /** + * If sibling, sibling's children and parent are all black then turn sibling into red. + * This reduces black node for both the paths from parent. Now parent is new double black + * node which needs further processing by going back to case1. + */ + private void deleteCase3(Node doubleBlackNode, AtomicReference rootReference) { + + Node siblingNode = findSiblingNode(doubleBlackNode).get(); + + if(doubleBlackNode.parent.color == Color.BLACK && siblingNode.color == Color.BLACK && siblingNode.left.color == Color.BLACK + && siblingNode.right.color == Color.BLACK) { + siblingNode.color = Color.RED; + deleteCase1(doubleBlackNode.parent, rootReference); + } else { + deleteCase4(doubleBlackNode, rootReference); + } + } + + /** + * If sibling color is black, parent color is red and sibling's children color is black then swap color b/w sibling + * and parent. This increases one black node on double black node path but does not affect black node count on + * sibling path. We are done if we hit this situation. + */ + private void deleteCase4(Node doubleBlackNode, AtomicReference rootReference) { + Node siblingNode = findSiblingNode(doubleBlackNode).get(); + if(doubleBlackNode.parent.color == Color.RED && siblingNode.color == Color.BLACK && siblingNode.left.color == Color.BLACK + && siblingNode.right.color == Color.BLACK) { + siblingNode.color = Color.RED; + doubleBlackNode.parent.color = Color.BLACK; + return; + } else { + deleteCase5(doubleBlackNode, rootReference); + } + } + + /** + * If sibling is black, double black node is left child of its parent, siblings right child is black + * and sibling's left child is red then do a right rotation at siblings left child and swap colors. + * This converts it to delete case6. It will also have a mirror case. + */ + private void deleteCase5(Node doubleBlackNode, AtomicReference rootReference) { + Node siblingNode = findSiblingNode(doubleBlackNode).get(); + if(siblingNode.color == Color.BLACK) { + if (isLeftChild(doubleBlackNode) && siblingNode.right.color == Color.BLACK && siblingNode.left.color == Color.RED) { + rightRotate(siblingNode.left, true); + } else if (!isLeftChild(doubleBlackNode) && siblingNode.left.color == Color.BLACK && siblingNode.right.color == Color.RED) { + leftRotate(siblingNode.right, true); + } + } + deleteCase6(doubleBlackNode, rootReference); + } + + /** + * If sibling is black, double black node is left child of its parent, sibling left child is black and sibling's right child is + * red, sibling takes its parent color, parent color becomes black, sibling's right child becomes black and then do + * left rotation at sibling without any further change in color. This removes double black and we are done. This + * also has a mirror condition. + */ + private void deleteCase6(Node doubleBlackNode, AtomicReference rootReference) { + Node siblingNode = findSiblingNode(doubleBlackNode).get(); + siblingNode.color = siblingNode.parent.color; + siblingNode.parent.color = Color.BLACK; + if(isLeftChild(doubleBlackNode)) { + siblingNode.right.color = Color.BLACK; + leftRotate(siblingNode, false); + } else { + siblingNode.left.color = Color.BLACK; + rightRotate(siblingNode, false); + } + if(siblingNode.parent == null) { + rootReference.set(siblingNode); + } + } + + private void replaceNode(Node root, Node child, AtomicReference rootReference) { + child.parent = root.parent; + if(root.parent == null) { + rootReference.set(child); + } + else { + if(isLeftChild(root)) { + root.parent.left = child; + } else { + root.parent.right = child; + } + } + } + + private void printRedBlackTree(Node root, int space) { + if(root == null || root.isNullLeaf) { + return; + } + printRedBlackTree(root.right, space + 5); + for(int i=0; i < space; i++) { + System.out.print(" "); + } + System.out.println(root.data + " " + (root.color == Color.BLACK ? "B" : "R")); + printRedBlackTree(root.left, space + 5); + } + + private boolean noRedRedParentChild(Node root, Color parentColor) { + if(root == null) { + return true; + } + if(root.color == Color.RED && parentColor == Color.RED) { + return false; + } + + return noRedRedParentChild(root.left, root.color) && noRedRedParentChild(root.right, root.color); + } + + private boolean checkBlackNodesCount(Node root, AtomicInteger blackCount, int currentCount) { + + if(root.color == Color.BLACK) { + currentCount++; + } + + if(root.left == null && root.right == null) { + if(blackCount.get() == 0) { + blackCount.set(currentCount); + return true; + } else { + return currentCount == blackCount.get(); + } + } + return checkBlackNodesCount(root.left, blackCount, currentCount) && checkBlackNodesCount(root.right, blackCount, currentCount); + } + + public static void main(String args[]) { + Node root = null; + RedBlackTree redBlackTree = new RedBlackTree(); + + root = redBlackTree.insert(root, 10); + root = redBlackTree.insert(root, 15); + root = redBlackTree.insert(root, -10); + root = redBlackTree.insert(root, 20); + root = redBlackTree.insert(root, 30); + root = redBlackTree.insert(root, 40); + root = redBlackTree.insert(root, 50); + root = redBlackTree.insert(root, -15); + root = redBlackTree.insert(root, 25); + root = redBlackTree.insert(root, 17); + root = redBlackTree.insert(root, 21); + root = redBlackTree.insert(root, 24); + root = redBlackTree.insert(root, 28); + root = redBlackTree.insert(root, 34); + root = redBlackTree.insert(root, 32); + root = redBlackTree.insert(root, 26); + root = redBlackTree.insert(root, 35); + root = redBlackTree.insert(root, 19); + redBlackTree.printRedBlackTree(root); + + root = redBlackTree.delete(root, 50); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 40); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, -10); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 15); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 17); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 24); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 21); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 32); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 26); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 19); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 25); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 17); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, -15); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 20); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 35); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 34); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 30); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 28); + System.out.println(redBlackTree.validateRedBlackTree(root)); + root = redBlackTree.delete(root, 10); + System.out.println(redBlackTree.validateRedBlackTree(root)); + } +} diff --git a/showmecode_100/java/com/interview/tree/RootToLeafToSum.java b/showmecode_100/java/com/interview/tree/RootToLeafToSum.java new file mode 100644 index 00000000..23b5b08d --- /dev/null +++ b/showmecode_100/java/com/interview/tree/RootToLeafToSum.java @@ -0,0 +1,69 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date 04/11/2015 + * @author tusroy + * + * Youtube link - https://youtu.be/Jg4E4KZstFE + * + * Given a binary tree and a sum, find if there is a path from root to leaf + * which sums to this sum. + * + * Solution + * Keep going left and right and keep subtracting node value from sum. + * If leaf node is reached check if whatever sum is remaining same as leaf node data. + * + * Time complexity is O(n) since all nodes are visited. + * + * Test cases: + * Negative number, 0 and positive number + * Tree with 0, 1 or more nodes + * + * Reference http://www.geeksforgeeks.org/root-to-leaf-path-sum-equal-to-a-given-number/ + */ +public class RootToLeafToSum { + + public boolean printPath(Node root, int sum, List path){ + if(root == null){ + return false; + } + + if(root.left == null && root.right == null){ + if(root.data == sum){ + path.add(root); + return true; + }else{ + return false; + } + } + if(printPath(root.left, sum-root.data, path) || printPath(root.right, sum - root.data, path)){ + path.add(root); + return true; + } + return false; + } + + public static void main(String args[]){ + RootToLeafToSum rtl = new RootToLeafToSum(); + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(4, head); + head = bt.addNode(3, head); + List result = new ArrayList<>(); + boolean r = rtl.printPath(head, 22, result); + if(r){ + result.forEach(node -> System.out.print(node.data + " ")); + }else{ + System.out.println("No path for sum " + 22); + } + } +} diff --git a/showmecode_100/java/com/interview/tree/SameTree.java b/showmecode_100/java/com/interview/tree/SameTree.java new file mode 100644 index 00000000..970373b0 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SameTree.java @@ -0,0 +1,49 @@ +package com.interview.tree; + +/** + * Date 04/11/2015 + * @author tusroy + * + * Youtube link - https://youtu.be/ySDDslG8wws + * + * Given roots of two tree, return true if they have same data and same structure + * or return false. + * + * Solution + * Keep comparing root of both data and then recursively check left and right. + * + * Time complexity is O(n) + */ +public class SameTree { + + public boolean sameTree(Node root1, Node root2){ + if(root1 == null && root2 == null){ + return true; + } + if(root1 == null || root2 == null){ + return false; + } + + return root1.data == root2.data && + sameTree(root1.left, root2.left) && + sameTree(root1.right, root2.right); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root1 = null; + root1 = bt.addNode(10, root1); + root1 = bt.addNode(20, root1); + root1 = bt.addNode(15, root1); + root1 = bt.addNode(2, root1); + + Node root2 = null; + root2 = bt.addNode(10, root2); + root2 = bt.addNode(20, root2); + root2 = bt.addNode(15, root2); + root2 = bt.addNode(2, root2); + + SameTree st = new SameTree(); + assert st.sameTree(root1, root2); + } +} diff --git a/showmecode_100/java/com/interview/tree/SegmentTree.java b/showmecode_100/java/com/interview/tree/SegmentTree.java new file mode 100644 index 00000000..8d0ecbee --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SegmentTree.java @@ -0,0 +1,125 @@ +package com.interview.tree; + +/** + * Date 08/21/2014 + * @author tusroy + * + * Video link - https://youtu.be/ZBHKZF5w4YU + * + * A segment tree is a tree data structure for storing intervals, or segments. It allows + * for faster querying (e.g sum or min) in these intervals. + * Write a program to support these operations for sum + * createSegmentTree(int arr[]) - create segment tree + * query(int segment[], int startRange, int endRange) - query in this range + * + * Similar segment trees can be created for min or max. + * + * Time complexity to create segment tree is O(nlogn) + * Space complexity to create segment tree is O(nlogn) + * Time complexity to search in segment tree is O(logn) + + * References + * http://www.geeksforgeeks.org/segment-tree-set-1-sum-of-given-range/ + * http://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/ + */ +public class SegmentTree { + + public int[] createTree(int input[], Operation operation){ + int height = (int)Math.ceil(Math.log(input.length)/Math.log(2)); + int segmentTree[] = new int[(int)(Math.pow(2, height+1)-1)]; + constructTree(segmentTree,input,0,input.length-1,0, operation); + return segmentTree; + } + + private void constructTree(int segmentTree[], int input[], int low, int high,int pos, Operation operation){ + if(low == high){ + segmentTree[pos] = input[low]; + return; + } + int mid = (low + high)/2; + constructTree(segmentTree,input,low,mid,2*pos+1, operation); + constructTree(segmentTree,input,mid+1,high,2*pos+2, operation); + segmentTree[pos] = operation.perform(segmentTree[2*pos+1], segmentTree[2*pos+2]); + } + + public int rangeQuery(int []segmentTree,int qlow,int qhigh,int len, Operation operation){ + return rangeQuery(segmentTree,0,len-1,qlow,qhigh,0, operation); + } + + private int rangeQuery(int segmentTree[],int low,int high,int qlow,int qhigh,int pos, Operation operation){ + if(qlow <= low && qhigh >= high){ + return segmentTree[pos]; + } + if(qlow > high || qhigh < low){ + return 0; + } + int mid = (low+high)/2; + return operation.perform(rangeQuery(segmentTree,low,mid,qlow,qhigh,2*pos+1, operation), + rangeQuery(segmentTree,mid+1,high,qlow,qhigh,2*pos+2, operation)); + } + + public void updateValueForSumOperation(int input[],int segmentTree[],int newVal,int index){ + int diff = newVal - input[index]; + input[index] = newVal; + updateVal(segmentTree,0,input.length-1,diff,index,0); + } + + private void updateVal(int segmentTree[],int low,int high,int diff,int index, int pos){ + if(index < low || index > high){ + return; + } + segmentTree[pos] += diff; + if(low >= high){ + return; + } + int mid = (low + high)/2; + updateVal(segmentTree,low,mid,diff,index,2*pos+1); + updateVal(segmentTree,mid+1,high,diff,index,2*pos+2); + } + + public static void main(String args[]){ + int input[] = {1,3,5,7,9,11}; + SegmentTree st = new SegmentTree(); + Operation sumOp = new SumOperation(); + Operation minOp = new MinOperation(); + int result [] = st.createTree(input, sumOp); + for(int i=0; i < result.length; i++){ + System.out.print(result[i] + " "); + } + int input1[] = {3,4,2,1,6,-1}; + int result1[] = st.createTree(input1, minOp); + for(int i=0; i < result1.length; i++){ + System.out.print(result1[i] + " "); + } + + st.updateValueForSumOperation(input, result,0 , 0); + System.out.println(); + for(int i=0; i < result.length; i++){ + System.out.print(result[i] + " "); + } + + } +} + +/** + * Provides interface to perform operations on range queue like sum or min + */ +interface Operation{ + int perform(int a, int b); +} + +class SumOperation implements Operation{ + + @Override + public int perform(int a, int b) { + return a+b; + } +} + +class MinOperation implements Operation{ + @Override + public int perform(int a, int b){ + return Math.min(a,b); + } +} + diff --git a/showmecode_100/java/com/interview/tree/SegmentTreeMinimumRangeQuery.java b/showmecode_100/java/com/interview/tree/SegmentTreeMinimumRangeQuery.java new file mode 100644 index 00000000..1f788f9a --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SegmentTreeMinimumRangeQuery.java @@ -0,0 +1,256 @@ +package com.interview.tree; + +import com.interview.bits.NextPowerOf2; + +/** + * Date 08/22/2015 + * @author Tushar Roy + * + * A segment tree is a tree data structure for storing intervals, or segments. It allows + * for faster querying (e.g sum or min) in these intervals. Lazy propagation is useful + * when there are high number of updates in the input array. + + * Write a program to support mininmum range query + * createSegmentTree(int arr[]) - create segment tree + * query(int segment[], int startRange, int endRange) - returns minimum between startRange and endRange + * update(int input[], int segment[], int indexToBeUpdated, int newVal) - updates input and segmentTree with newVal at index indexToBeUpdated; + * updateRange(int input[], int segment[], int lowRange, int highRange, int delta) - updates all the values in given range by + * adding delta to them + * queryLazy(int segment[], int startRange, int endRange) - query based off lazy propagation + * + * Time complexity to create segment tree is O(n) since new array will be at max 4n size + * Space complexity to create segment tree is O(n) since new array will be at max 4n size + * Time complexity to search in segment tree is O(logn) since you would at max travel 4 depths + * Time complexity to update in segment tree is O(logn) + * Time complexity to update range in segment tree is O(range) + * + * References + * http://www.geeksforgeeks.org/segment-tree-set-1-sum-of-given-range/ + * http://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/ + * https://www.topcoder.com/community/data-science/data-science-tutorials/range-minimum-query-and-lowest-common-ancestor/ + */ +public class SegmentTreeMinimumRangeQuery { + + /** + * Creates a new segment tree based off input array. + */ + public int[] createSegmentTree(int input[]){ + NextPowerOf2 np2 = new NextPowerOf2(); + //if input len is pow of 2 then size of + //segment tree is 2*len - 1, otherwise + //size of segment tree is next (pow of 2 for len)*2 - 1. + int nextPowOfTwo = np2.nextPowerOf2(input.length); + int segmentTree[] = new int[nextPowOfTwo*2 -1]; + + for(int i=0; i < segmentTree.length; i++){ + segmentTree[i] = Integer.MAX_VALUE; + } + constructMinSegmentTree(segmentTree, input, 0, input.length - 1, 0); + return segmentTree; + + } + + /** + * Updates segment tree for certain index by given delta + */ + public void updateSegmentTree(int input[], int segmentTree[], int index, int delta){ + input[index] += delta; + updateSegmentTree(segmentTree, index, delta, 0, input.length - 1, 0); + } + + /** + * Updates segment tree for given range by given delta + */ + public void updateSegmentTreeRange(int input[], int segmentTree[], int startRange, int endRange, int delta) { + for(int i = startRange; i <= endRange; i++) { + input[i] += delta; + } + updateSegmentTreeRange(segmentTree, startRange, endRange, delta, 0, input.length - 1, 0); + } + + /** + * Queries given range for minimum value. + */ + public int rangeMinimumQuery(int []segmentTree,int qlow,int qhigh,int len){ + return rangeMinimumQuery(segmentTree,0,len-1,qlow,qhigh,0); + } + + /** + * Updates given range by given delta lazily + */ + public void updateSegmentTreeRangeLazy(int input[], int segmentTree[], int lazy[], int startRange, int endRange, int delta) { + updateSegmentTreeRangeLazy(segmentTree, lazy, startRange, endRange, delta, 0, input.length - 1, 0); + } + + /** + * Queries given range lazily + */ + public int rangeMinimumQueryLazy(int segmentTree[], int lazy[], int qlow, int qhigh, int len) { + return rangeMinimumQueryLazy(segmentTree, lazy, qlow, qhigh, 0, len - 1, 0); + } + + private void constructMinSegmentTree(int segmentTree[], int input[], int low, int high,int pos){ + if(low == high){ + segmentTree[pos] = input[low]; + return; + } + int mid = (low + high)/2; + constructMinSegmentTree(segmentTree, input, low, mid, 2 * pos + 1); + constructMinSegmentTree(segmentTree, input, mid + 1, high, 2 * pos + 2); + segmentTree[pos] = Math.min(segmentTree[2*pos+1], segmentTree[2*pos+2]); + } + + private void updateSegmentTree(int segmentTree[], int index, int delta, int low, int high, int pos){ + + //if index to be updated is less than low or higher than high just return. + if(index < low || index > high){ + return; + } + + //if low and high become equal, then index will be also equal to them and update + //that value in segment tree at pos + if(low == high){ + segmentTree[pos] += delta; + return; + } + //otherwise keep going left and right to find index to be updated + //and then update current tree position if min of left or right has + //changed. + int mid = (low + high)/2; + updateSegmentTree(segmentTree, index, delta, low, mid, 2 * pos + 1); + updateSegmentTree(segmentTree, index, delta, mid + 1, high, 2 * pos + 2); + segmentTree[pos] = Math.min(segmentTree[2*pos+1], segmentTree[2*pos + 2]); + } + + private void updateSegmentTreeRange(int segmentTree[], int startRange, int endRange, int delta, int low, int high, int pos) { + if(low > high || startRange > high || endRange < low ) { + return; + } + + if(low == high) { + segmentTree[pos] += delta; + return; + } + + int middle = (low + high)/2; + updateSegmentTreeRange(segmentTree, startRange, endRange, delta, low, middle, 2 * pos + 1); + updateSegmentTreeRange(segmentTree, startRange, endRange, delta, middle + 1, high, 2 * pos + 2); + segmentTree[pos] = Math.min(segmentTree[2*pos+1], segmentTree[2*pos+2]); + } + + private int rangeMinimumQuery(int segmentTree[],int low,int high,int qlow,int qhigh,int pos){ + if(qlow <= low && qhigh >= high){ + return segmentTree[pos]; + } + if(qlow > high || qhigh < low){ + return Integer.MAX_VALUE; + } + int mid = (low+high)/2; + return Math.min(rangeMinimumQuery(segmentTree, low, mid, qlow, qhigh, 2 * pos + 1), + rangeMinimumQuery(segmentTree, mid + 1, high, qlow, qhigh, 2 * pos + 2)); + } + + private void updateSegmentTreeRangeLazy(int segmentTree[], + int lazy[], int startRange, int endRange, + int delta, int low, int high, int pos) { + if(low > high) { + return; + } + + //make sure all propagation is done at pos. If not update tree + //at pos and mark its children for lazy propagation. + if (lazy[pos] != 0) { + segmentTree[pos] += lazy[pos]; + if (low != high) { //not a leaf node + lazy[2 * pos + 1] += lazy[pos]; + lazy[2 * pos + 2] += lazy[pos]; + } + lazy[pos] = 0; + } + + //no overlap condition + if(startRange > high || endRange < low) { + return; + } + + //total overlap condition + if(startRange <= low && endRange >= high) { + segmentTree[pos] += delta; + if(low != high) { + lazy[2*pos + 1] += delta; + lazy[2*pos + 2] += delta; + } + return; + } + + //otherwise partial overlap so look both left and right. + int mid = (low + high)/2; + updateSegmentTreeRangeLazy(segmentTree, lazy, startRange, endRange, + delta, low, mid, 2*pos+1); + updateSegmentTreeRangeLazy(segmentTree, lazy, startRange, endRange, + delta, mid+1, high, 2*pos+2); + segmentTree[pos] = Math.min(segmentTree[2*pos + 1], segmentTree[2*pos + 2]); + } + + private int rangeMinimumQueryLazy(int segmentTree[], int lazy[], int qlow, int qhigh, + int low, int high, int pos) { + + if(low > high) { + return Integer.MAX_VALUE; + } + + //make sure all propagation is done at pos. If not update tree + //at pos and mark its children for lazy propagation. + if (lazy[pos] != 0) { + segmentTree[pos] += lazy[pos]; + if (low != high) { //not a leaf node + lazy[2 * pos + 1] += lazy[pos]; + lazy[2 * pos + 2] += lazy[pos]; + } + lazy[pos] = 0; + } + + //no overlap + if(qlow > high || qhigh < low){ + return Integer.MAX_VALUE; + } + + //total overlap + if(qlow <= low && qhigh >= high){ + return segmentTree[pos]; + } + + //partial overlap + int mid = (low+high)/2; + return Math.min(rangeMinimumQueryLazy(segmentTree, lazy, qlow, qhigh, + low, mid, 2 * pos + 1), + rangeMinimumQueryLazy(segmentTree, lazy, qlow, qhigh, + mid + 1, high, 2 * pos + 2)); + + } + + public static void main(String args[]){ + SegmentTreeMinimumRangeQuery st = new SegmentTreeMinimumRangeQuery(); + + int input[] = {0,3,4,2,1,6,-1}; + int segTree[] = st.createSegmentTree(input); + + //non lazy propagation example + assert 0 == st.rangeMinimumQuery(segTree, 0, 3, input.length); + assert 1 == st.rangeMinimumQuery(segTree, 1, 5, input.length); + assert -1 == st.rangeMinimumQuery(segTree, 1, 6, input.length); + st.updateSegmentTree(input, segTree, 2, 1); + assert 2 == st.rangeMinimumQuery(segTree, 1, 3, input.length); + st.updateSegmentTreeRange(input, segTree, 3, 5, -2); + assert -1 == st.rangeMinimumQuery(segTree, 5, 6, input.length); + assert 0 == st.rangeMinimumQuery(segTree, 0, 3, input.length); + + //lazy propagation example + int input1[] = {-1,2,4,1,7,1,3,2}; + int segTree1[] = st.createSegmentTree(input1); + int lazy1[] = new int[segTree.length]; + st.updateSegmentTreeRangeLazy(input1, segTree1, lazy1, 0, 3, 1); + st.updateSegmentTreeRangeLazy(input1, segTree1, lazy1, 0, 0, 2); + assert 1 == st.rangeMinimumQueryLazy(segTree1, lazy1, 3, 5, input1.length); + } +} diff --git a/showmecode_100/java/com/interview/tree/SerializeDeserializeBinaryTree.java b/showmecode_100/java/com/interview/tree/SerializeDeserializeBinaryTree.java new file mode 100644 index 00000000..94d85854 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SerializeDeserializeBinaryTree.java @@ -0,0 +1,155 @@ +package com.interview.tree; + +import javax.swing.tree.TreeNode; +import java.util.Deque; +import java.util.LinkedList; + +/** + * Date 03/12/2016 + * @author Tushar Roy + * + * Serialize/Deserialize a binary tree whose data is a number. + * + * Time complexity O(n) + * Space complexity O(n) + * + * Reference + * https://leetcode.com/problems/serialize-and-deserialize-binary-tree/ + */ +public class SerializeDeserializeBinaryTree { + + /** + * Serialize Tree using preorder DFS + * @param root + * @return + */ + public String serialize(Node root) { + StringBuffer buff = new StringBuffer(); + serializeUtil(root, buff); + return buff.toString(); + } + + private void serializeUtil(Node root, StringBuffer buff) { + if (root == null) { + buff.append("%,"); + return; + } + + buff.append(root.data).append(","); + if (root.left != null || root.right != null) { + buff.append("$,"); + serializeUtil(root.left, buff); + serializeUtil(root.right, buff); + } else { + return; + } + + } + int index = 0; + + /** + * Deserialize Tree using preorder DFS + * @param data + * @return + */ + public Node deserialize(String data) { + String[] input = data.split(","); + index = 0; + return deserializeUtil(input); + } + + private Node deserializeUtil(String input[]) { + if (index == input.length) { + return null; + } + + if (input[index].equals("%")) { + index++; + return null; + } + Node n = new Node(); + n.data = Integer.parseInt(input[index]); + if (index < input.length - 1) { + if (input[index + 1].equals("$")) { + index += 2; + n.left = deserializeUtil(input); + n.right = deserializeUtil(input); + } else { + index++; + } + } + return n; + } + + /** + * Serialize tree using level order traversal. + */ + public String serializeLevelOrder(Node root) { + if (root == null) { + return ""; + } + + Deque queue = new LinkedList<>(); + queue.offerFirst(root); + StringBuffer buff = new StringBuffer(); + while (!queue.isEmpty()) { + root = queue.pollFirst(); + if (root == null) { + buff.append("%,"); + } else { + buff.append(root.data).append(","); + queue.offer(root.left); + queue.offer(root.right); + } + } + for (int i = buff.length() - 1; i >= 0; i--) { + if (buff.charAt(i) == '%' || buff.charAt(i) == ',') { + buff.deleteCharAt(i); + } else { + break; + } + } + return buff.toString(); + } + + /** + * Deserialize Tree using level order traversal. + */ + public Node deserializeLevelOrder(String data) { + if (data == null || data.length() == 0) { + return null; + } + String[] input = data.split(","); + Deque queue = new LinkedList<>(); + int index = 0; + queue.offerFirst(Node.newNode(Integer.parseInt(input[index]))); + Node root = queue.peekFirst(); + index++; + while (!queue.isEmpty()) { + Node current = queue.pollFirst(); + if (index < input.length && !input[index].equals("%")) { + current.left = Node.newNode(Integer.parseInt(input[index])); + queue.offerLast(current.left); + } + index++; + if (index < input.length && !input[index].equals("%")) { + current.right = Node.newNode(Integer.parseInt(input[index])); + queue.offerLast(current.right); + } + index++; + } + return root; + } + + + public static void main(String args[]) { + SerializeDeserializeBinaryTree sd = new SerializeDeserializeBinaryTree(); + Node node = sd.deserialize("10,$,30,15,$,%,20,$,21,16,$,%,18"); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(node); + String serializedTree= sd.serializeLevelOrder(node); + Node root = sd.deserializeLevelOrder("1,2"); + tt.inOrder(root); + } +} + diff --git a/showmecode_100/java/com/interview/tree/SinkNegativeToBottom.java b/showmecode_100/java/com/interview/tree/SinkNegativeToBottom.java new file mode 100644 index 00000000..33ab3e26 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SinkNegativeToBottom.java @@ -0,0 +1,58 @@ +package com.interview.tree; + +/** + * http://www.careercup.com/question?id=5344154741637120 + */ +public class SinkNegativeToBottom { + + public void sinkZero(Node root) { + if (root == null) { + return; + } + + sinkZero(root.left); + sinkZero(root.right); + + if (root.data < 0) { + pushDown(root); + } + } + + private void pushDown(Node root) { + if(root == null){ + return; + } + // find a child with non zero node value + if (root.left == null && root.right == null) { + // already leaf node. nothing to do. just return + return; + } + + //if root left is not null and root left data is not 0 pick it to swap + if (root.left != null && root.left.data >= 0) { + int temp = root.data; + root.data = root.left.data; + root.left.data = temp; + pushDown(root.left); + } + else if(root.right != null && root.right.data >= 0){ + int temp = root.data; + root.data = root.right.data; + root.right.data = temp; + pushDown(root.right); + } + } + + public static void main(String args[]){ + int preorder[] = {-1,1,6,-2,11,3,2,-3,31,22,17}; + int inorder[] = {-2,6,11,1,3,-1,31,-3,22,2,17}; + ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); + Node root = ctf.createTree(inorder, preorder); + SinkNegativeToBottom szb = new SinkNegativeToBottom(); + szb.sinkZero(root); + LevelOrderTraversal lot = new LevelOrderTraversal(); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + lot.levelOrder(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/SizeOfBinaryTree.java b/showmecode_100/java/com/interview/tree/SizeOfBinaryTree.java new file mode 100644 index 00000000..b14bff50 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SizeOfBinaryTree.java @@ -0,0 +1,42 @@ +package com.interview.tree; + +/** + * Date 03/05/2015 + * @author tusroy + * + * Given a root of binary tree, return size of binar tree + * + * Solution: + * Recursively find size of left side, right side and add one to them and return that to calling function. + * + * Time complexity - O(n) + * Space complexity(because of recursion stack) - height of binary tree. Worst case O(n) + * + * Test cases: + * Null tree + * 1 node tree + * multi node tree + */ +public class SizeOfBinaryTree { + + public int size(Node root){ + if(root == null){ + return 0; + } + return size(root.left) + size(root.right) + 1; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(5, head); + head = bt.addNode(7, head); + head = bt.addNode(19, head); + head = bt.addNode(20, head); + head = bt.addNode(-1, head); + SizeOfBinaryTree sbt = new SizeOfBinaryTree(); + System.out.println(sbt.size(head)); + } +} diff --git a/showmecode_100/java/com/interview/tree/SortedArrayToBST.java b/showmecode_100/java/com/interview/tree/SortedArrayToBST.java new file mode 100644 index 00000000..ec7887ce --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SortedArrayToBST.java @@ -0,0 +1,29 @@ +package com.interview.tree; + +/** + * Date 10/06/2016 + * @author Tushar Roy + * + * Given an array where elements are sorted in ascending order, convert it to a height balanced BST. + * + * Time complexity O(n) + * + * Reference + * https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ + */ +public class SortedArrayToBST { + public Node sortedArrayToBST(int[] nums) { + return toBST(nums, 0, nums.length - 1); + } + + private Node toBST(int[] nums, int low, int high) { + if (low > high) { + return null; + } + int mid = (low + high)/2; + Node n = Node.newNode(nums[mid]); + n.left = toBST(nums, low, mid - 1); + n.right = toBST(nums, mid + 1, high); + return n; + } +} diff --git a/showmecode_100/java/com/interview/tree/SortedOrderPrintCompleteTreeArray.java b/showmecode_100/java/com/interview/tree/SortedOrderPrintCompleteTreeArray.java new file mode 100644 index 00000000..e5136388 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SortedOrderPrintCompleteTreeArray.java @@ -0,0 +1,30 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/sorted-order-printing-of-an-array-that-represents-a-bst/ + * Test case + * empty array + * 1 element array + * multi element array + */ +public class SortedOrderPrintCompleteTreeArray { + + private void print(int arr[],int current){ + if(current >= arr.length){ + return; + } + print(arr,2*current+1); + System.out.println(arr[current]); + print(arr,2*current+2); + } + + public void print(int arr[]){ + print(arr,0); + } + + public static void main(String args[]){ + int arr[] = {4, 2, 5, 1, 3}; + SortedOrderPrintCompleteTreeArray sop = new SortedOrderPrintCompleteTreeArray(); + sop.print(arr); + } +} diff --git a/showmecode_100/java/com/interview/tree/SuccinctTree.java b/showmecode_100/java/com/interview/tree/SuccinctTree.java new file mode 100644 index 00000000..db0ad8e2 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SuccinctTree.java @@ -0,0 +1,87 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Date 11/01/2015 + * @author Tushar + * + * Encode and decode binary tree using succinct encoding technique + * + * References - http://www.geeksforgeeks.org/succinct-encoding-of-binary-tree/ + * https://en.wikipedia.org/wiki/Binary_tree#Succinct_encodings + */ +public class SuccinctTree { + + public static class Result { + List binaryRep = new ArrayList<>(); + List actualData = new ArrayList<>(); + } + + public Result encode(Node root) { + Result r = new Result(); + encode(root, r); + return r; + } + + private void encode(Node root, Result r) { + if(root == null) { + r.binaryRep.add(0); + return; + } + r.actualData.add(root.data); + r.binaryRep.add(1); + + encode(root.left, r); + encode(root.right, r); + } + + public Node decode(Result r) { + AtomicInteger x = new AtomicInteger(0); + AtomicInteger y = new AtomicInteger(0); + return decode(r, x, y); + } + + private Node decode(Result r, AtomicInteger x, AtomicInteger y) { + if(r.binaryRep.get(x.get()) == 0) { + x.getAndIncrement(); + return null; + } + + Node root = new Node(); + root.data = r.actualData.get(y.getAndIncrement()); + x.getAndIncrement(); + root.left = decode(r, x, y); + root.right = decode(r, x, y); + return root; + } + + public static void main(String args[]) { + Node root = null; + BinaryTree bt = new BinaryTree(); + root = bt.addNode(10, root); + root = bt.addNode(-10, root); + root = bt.addNode(20, root); + root = bt.addNode(15, root); + root = bt.addNode(-7, root); + root = bt.addNode(22, root); + root = bt.addNode(-4, root); + root = bt.addNode(12, root); + System.out.println("Before decoding"); + TreeTraversals tt = new TreeTraversals(); + tt.inOrder(root); + System.out.println(); + tt.preOrder(root); + System.out.println(); + SuccinctTree st = new SuccinctTree(); + Result r = st.encode(root); + root = st.decode(r); + System.out.println("After decoding"); + tt.inOrder(root); + System.out.println(); + tt.preOrder(root); + } + +} diff --git a/showmecode_100/java/com/interview/tree/SumTree.java b/showmecode_100/java/com/interview/tree/SumTree.java new file mode 100644 index 00000000..66ebe677 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/SumTree.java @@ -0,0 +1,44 @@ +package com.interview.tree; + + +class Count{ + int size; +} + +/** + * http://www.geeksforgeeks.org/check-if-a-given-binary-tree-is-sumtree/ + * A SumTree is a Binary Tree where the value of a node is equal to sum of the nodes present + * in its left subtree and right subtree + */ +public class SumTree { + + public boolean isSumTree(Node root){ + Count count = new Count(); + return isSumTree(root,count); + } + + private boolean isSumTree(Node root,Count count){ + if(root == null){ + return true; + } + if(root.left == null && root.right == null){ + count.size = root.data; + return true; + } + Count leftCount = new Count(); + Count rightCount = new Count(); + boolean isLeft = isSumTree(root.left,leftCount); + boolean isRight = isSumTree(root.right,rightCount); + count.size = root.data + leftCount.size + rightCount.size; + return isLeft && isRight && root.data == (leftCount.size + rightCount.size); + } + + public static void main(String args[]){ + ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); + int inorder[] = {4,10,6,46,11,13,2}; + int preorder[] = {46,10,4,6,13,11,2}; + Node root = ctf.createTree(inorder, preorder); + SumTree st = new SumTree(); + System.out.println(st.isSumTree(root)); + } +} diff --git a/showmecode_100/java/com/interview/tree/TreeIsomorphism.java b/showmecode_100/java/com/interview/tree/TreeIsomorphism.java new file mode 100644 index 00000000..a725dd11 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/TreeIsomorphism.java @@ -0,0 +1,40 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/tree-isomorphism-problem/ + * Test cases: + * Same tree + * Exact mirror + * Some nodes flipped + */ +public class TreeIsomorphism { + + public boolean areIsomorphicTrees(Node root1, Node root2) { + if (root1 == null && root2 == null) { + return true; + } + + if(root1 == null || root2 == null){ + return false; + } + + return root1.data == root2.data + && ((areIsomorphicTrees(root1.left, root2.left) && areIsomorphicTrees( + root1.right, root2.right)) || (areIsomorphicTrees( + root1.left, root2.right) && areIsomorphicTrees( + root1.right, root2.left))); + + } + + public static void main(String args[]){ + int in1[] = {8,5,6,10,11,9,12}; + int pre1[] = {10,5,8,6,9,11,12}; + int in2[] = {11,9,12,10,6,5,15}; + int pre2[] = {10,9,11,12,5,6,15}; + ConstructTreeFromInOrderPreOrder ct = new ConstructTreeFromInOrderPreOrder(); + Node root1 = ct.createTree(in1, pre1); + Node root2 = ct.createTree(in2, pre2); + TreeIsomorphism ti = new TreeIsomorphism(); + System.out.println(ti.areIsomorphicTrees(root1, root2)); + } +} diff --git a/showmecode_100/java/com/interview/tree/TreeTraversalInSpiralOrder.java b/showmecode_100/java/com/interview/tree/TreeTraversalInSpiralOrder.java new file mode 100644 index 00000000..0eb64558 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/TreeTraversalInSpiralOrder.java @@ -0,0 +1,179 @@ +package com.interview.tree; + +import java.util.Deque; +import java.util.LinkedList; +import java.util.Stack; + +/** + * Date 04/16/2015 + * @author tusroy + * + * Video link - https://youtu.be/vjt5Y6-1KsQ + * + * Given a root of binary tree, print in spiral order. + * e.g 1 + * 2 3 + * 4 5 6 7 + * 8 9 10 11 + * should print 1 3 2 4 5 6 7 8 9 10 11 + * + * Solution 1 : Use two stack. Put root in stack1. While stack1 is not + * empty take items from stack1 and put its child left,right in stack2. + * Then once stack1 is empty pop from stack2 and put its child right, + * left into stack1. + * + * Solution 2 : Use one dequeue. Technique is like above but instead of + * using two stack use dequeue. Also keep count till which point you read + * in the dequeue. + * + * Solution 3: Use one dequeue. Use a delimiter to separate between one + * stack growing from top and another one growing from bottom. + * + * Time complexity is O(n) + * Space complexity is O(n) + * + * Reference + * https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ + */ +public class TreeTraversalInSpiralOrder { + + /** + * Two stack to print in spiral way + */ + public void spiralWithTwoStack(Node root) { + if (root == null) { + return; + } + Stack s1 = new Stack<>(); + Stack s2 = new Stack<>(); + s1.push(root); + + while (!s1.isEmpty() || !s2.isEmpty()) { + while (!s1.isEmpty()) { + root = s1.pop(); + System.out.print(root.data + " "); + if (root.left != null) { + s2.push(root.left); + } + if (root.right != null) { + s2.push(root.right); + } + } + while (!s2.isEmpty()) { + root = s2.pop(); + System.out.print(root.data + " "); + if (root.right != null) { + s1.push(root.right); + } + if (root.left != null) { + s1.push(root.left); + } + } + } + } + + /** + * One deque with count method to print tree in spiral order + */ + public void spiralWithOneDeque(Node root) { + if (root == null) { + return; + } + Deque deque = new LinkedList(); + deque.offerFirst(root); + int count = 1; + boolean flip = true; + while (!deque.isEmpty()) { + int currentCount = 0; + while (count > 0) { + if (flip) { + root = deque.pollFirst(); + System.out.print(root.data + " "); + if (root.left != null) { + deque.offerLast(root.left); + currentCount++; + } + if (root.right != null) { + deque.offerLast(root.right); + currentCount++; + } + } else { + root = deque.pollLast(); + System.out.print(root.data + " "); + if (root.right != null) { + deque.offerFirst(root.right); + currentCount++; + } + if (root.left != null) { + deque.offerFirst(root.left); + currentCount++; + } + } + count--; + } + flip = !flip; + count = currentCount; + } + } + + /** + * One deque with delimiter to print tree in spiral order + */ + public void spiralWithOneDequeDelimiter(Node root) + { + if(root == null){ + return; + } + Deque q = new LinkedList<>(); + q.offer(null); + q.offerFirst(root); + //if only delimiter(in this case null) is left in queue then break + while(q.size() > 1){ + root = q.peekFirst(); + while(root != null){ + root = q.pollFirst(); + System.out.print(root.data + " "); + if(root.left != null){ + q.offerLast(root.left); + } + if(root.right != null){ + q.offerLast(root.right); + } + root = q.peekFirst(); + } + root = q.peekLast(); + while(root != null){ + System.out.print(root.data + " "); + root = q.pollLast(); + if(root.right != null){ + q.offerFirst(root.right); + } + if(root.left != null){ + q.offerFirst(root.left); + } + root = q.peekLast(); + } + } + } + public static void main(String args[]) { + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(30, root); + root = bt.addNode(25, root); + root = bt.addNode(35, root); + root = bt.addNode(-10, root); + root = bt.addNode(0, root); + root = bt.addNode(-20, root); + root = bt.addNode(-15, root); + root = bt.addNode(45, root); + + TreeTraversalInSpiralOrder tt = new TreeTraversalInSpiralOrder(); + System.out.println("Two stack method"); + tt.spiralWithTwoStack(root); + System.out.println("\nOne deque with count"); + tt.spiralWithOneDeque(root); + System.out.println("\nOne deque with delimiter"); + tt.spiralWithOneDequeDelimiter(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/TreeTraversalLevelByLevel.java b/showmecode_100/java/com/interview/tree/TreeTraversalLevelByLevel.java new file mode 100644 index 00000000..7517eeba --- /dev/null +++ b/showmecode_100/java/com/interview/tree/TreeTraversalLevelByLevel.java @@ -0,0 +1,157 @@ +package com.interview.tree; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * Date 04/18/2015 + * @author tusroy + * + * Video link - https://youtu.be/7uG0gLDbhsI + * + * Given a binary tree print each level on new line. + * + * e.g 10 + * 5 15 + * 0 -1 2 6 + * Output : 10 + * 5 15 + * 0 -1 2 6 + * + * Solution + * Technique 1: + * Use 2 queue. Keep polling from q1 and offer to q2 till q1 is empty. + * After that print a new line. Keep polling from q2 and offer to q1 + * till q2 is empty. Keep doing this still both q1 and q2 are empty. + * + * Technique 2 + * Use one queue with delimiter. Add a delimiter null after every level. + * As soon as you encounter a null print a new line and add null at end of queue + * + * Technique 3 + * Use one queue with count. Keep count of nodes at every level. As soon as this + * count is 0 print a new line. + * + * Time space complexity for all above algorithm is O(n). + */ +public class TreeTraversalLevelByLevel { + + /** + * Use two queue to print level by level + */ + public void levelByLevelTwoQueue(Node root) { + if (root == null) { + return; + } + Queue q1 = new LinkedList<>(); + Queue q2 = new LinkedList<>(); + q1.add(root); + while (!q1.isEmpty() || !q2.isEmpty()) { + while (!q1.isEmpty()) { + root = q1.poll(); + System.out.print(root.data + " "); + if (root.left != null) { + q2.offer(root.left); + } + if (root.right != null) { + q2.offer(root.right); + } + } + System.out.println(); + while (!q2.isEmpty()) { + root = q2.poll(); + System.out.print(root.data + " "); + if (root.left != null) { + q1.offer(root.left); + } + if (root.right != null) { + q1.offer(root.right); + } + } + System.out.println(); + } + } + + /** + * Use one queue and delimiter to print level by level + */ + public void levelByLevelOneQueueUsingDelimiter(Node root) { + if (root == null) { + return; + } + Queue q = new LinkedList(); + q.offer(root); + q.offer(null); + while (!q.isEmpty()) { + root = q.poll(); + if (root != null) { + System.out.print(root.data + " "); + if (root.left != null) { + q.offer(root.left); + } + if (root.right != null) { + q.offer(root.right); + } + } else { + if (!q.isEmpty()) { + System.out.println(); + q.offer(null); + } + } + } + } + + /** + * Use one queue and count to print level by level + */ + public void levelByLevelOneQueueUsingCount(Node root) { + if (root == null) { + return; + } + Queue q = new LinkedList(); + int levelCount = 1; + int currentCount = 0; + q.offer(root); + while (!q.isEmpty()) { + while (levelCount > 0) { + root = q.poll(); + System.out.print(root.data + " "); + if (root.left != null) { + currentCount++; + q.offer(root.left); + } + if (root.right != null) { + currentCount++; + q.offer(root.right); + } + levelCount--; + } + System.out.println(); + levelCount = currentCount; + currentCount = 0; + } + } + + public static void main(String args[]) { + TreeTraversalLevelByLevel tt = new TreeTraversalLevelByLevel(); + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(20, root); + root = bt.addNode(30, root); + root = bt.addNode(15, root); + root = bt.addNode(-10, root); + root = bt.addNode(0, root); + root = bt.addNode(5, root); + root = bt.addNode(-5, root); + root = bt.addNode(-15, root); + root = bt.addNode(27, root); + root = bt.addNode(35, root); + System.out.println("1. Two queue technique"); + tt.levelByLevelTwoQueue(root); + System.out.println("\n2. One queue and delimiter"); + tt.levelByLevelOneQueueUsingDelimiter(root); + System.out.println("\n\n3. One queue and count"); + tt.levelByLevelOneQueueUsingCount(root); + } +} diff --git a/showmecode_100/java/com/interview/tree/TreeTraversals.java b/showmecode_100/java/com/interview/tree/TreeTraversals.java new file mode 100644 index 00000000..f8abd0ca --- /dev/null +++ b/showmecode_100/java/com/interview/tree/TreeTraversals.java @@ -0,0 +1,140 @@ +package com.interview.tree; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * Youtube link - https://youtu.be/nzmtCFNae9k + * Youtube link - https://youtu.be/elQcrJrfObg + * Youtube link - https://youtu.be/qT65HltK2uE + * Youtube link - https://youtu.be/ZM-sV9zQPEs + * + * http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion/ + * http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/ + * http://www.geeksforgeeks.org/iterative-preorder-traversal/ + */ +public class TreeTraversals { + + public void inOrder(Node root){ + if(root == null){ + return; + } + inOrder(root.left); + System.out.print(root.data + " "); + inOrder(root.right); + } + + public void preOrder(Node root){ + if(root == null){ + return; + } + System.out.print(root.data + " "); + preOrder(root.left); + preOrder(root.right); + } + + public void postOrder(Node root){ + if(root == null){ + return; + } + postOrder(root.left); + postOrder(root.right); + System.out.print(root.data + " "); + } + + public void inorderItr(Node root){ + Deque stack = new LinkedList(); + Node node = root; + while(true){ + if(node != null){ + stack.addFirst(node); + node = node.left; + } + else{ + if(stack.isEmpty()){ + break; + } + node = stack.pollFirst(); + System.out.println(node.data); + node = node.right; + } + } + } + + public void preOrderItr(Node root){ + Deque stack = new LinkedList(); + stack.addFirst(root); + while(!stack.isEmpty()){ + root = stack.pollFirst(); + System.out.print(root.data + " "); + if(root.right != null){ + stack.addFirst(root.right); + } + if(root.left!= null){ + stack.addFirst(root.left); + } + } + } + + public void postOrderItr(Node root){ + Deque stack1 = new LinkedList(); + Deque stack2 = new LinkedList(); + stack1.addFirst(root); + while(!stack1.isEmpty()){ + root = stack1.pollFirst(); + if(root.left != null){ + stack1.addFirst(root.left); + } + if(root.right != null){ + stack1.addFirst(root.right); + } + stack2.addFirst(root); + } + while(!stack2.isEmpty()){ + System.out.print(stack2.pollFirst().data + " "); + } + } + + public void postOrderItrOneStack(Node root){ + Node current = root; + Deque stack = new LinkedList<>(); + while(current != null || !stack.isEmpty()){ + if(current != null){ + stack.addFirst(current); + current = current.left; + }else{ + Node temp = stack.peek().right; + if (temp == null) { + temp = stack.poll(); + System.out.print(temp.data + " "); + while (!stack.isEmpty() && temp == stack.peek().right) { + temp = stack.poll(); + System.out.print(temp.data + " "); + } + } else { + current = temp; + } + } + } + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(10, head); + head = bt.addNode(15, head); + head = bt.addNode(19, head); + head = bt.addNode(17, head); + head = bt.addNode(11, head); + + head = bt.addNode(-11, head); + + + TreeTraversals tt = new TreeTraversals(); + tt.postOrder(head); + System.out.println(); + tt.postOrderItr(head); + System.out.println(); + tt.postOrderItrOneStack(head); + } +} diff --git a/showmecode_100/java/com/interview/tree/UpsidedownBinaryTree.java b/showmecode_100/java/com/interview/tree/UpsidedownBinaryTree.java new file mode 100644 index 00000000..719a6788 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/UpsidedownBinaryTree.java @@ -0,0 +1,30 @@ +package com.interview.tree; + +/** + * Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that + * shares the same parent node) or empty, flip it upside down and turn it into a tree where the original + * right nodes turned into left leaf nodes. Return the new root. + * + * https://leetcode.com/problems/binary-tree-upside-down/ + */ +public class UpsidedownBinaryTree { + public Node upsideDownBinaryTree(Node root) { + if (root == null) { + return null; + } + return upsideDownBinaryTree(root, null, null); + } + + public Node upsideDownBinaryTree(Node root, Node parent, Node rightChild) { + if (root == null) { + return parent; + } + Node left = root.left; + Node right = root.right; + + root.right = parent; + root.left = rightChild; + + return upsideDownBinaryTree(left, root, right); + } +} diff --git a/showmecode_100/java/com/interview/tree/VertexCoverBinaryTreeDP.java b/showmecode_100/java/com/interview/tree/VertexCoverBinaryTreeDP.java new file mode 100644 index 00000000..2701fcb5 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/VertexCoverBinaryTreeDP.java @@ -0,0 +1,61 @@ +package com.interview.tree; + +/** + * http://www.geeksforgeeks.org/vertex-cover-problem-set-2-dynamic-programming-solution-tree/ + * http://en.wikipedia.org/wiki/Vertex_cover + * Using lis to store the cover data + * Test cases: + * null root + * Only left child + * Only right child + * Tree with only one child at every node + */ +public class VertexCoverBinaryTreeDP { + + public int cover(Node root){ + if(root == null){ + return 0; + } + //no need to include leaf node ever + if(root.left == null && root.right == null){ + return 0; + } + //store result + if(root.lis != -1){ + return root.lis; + } + //if root is included + int inclRoot = 1 + cover(root.left) + cover(root.right); + int exclRoot = 0; + //if root is not included + if(root.left!=null){ + exclRoot += (1 + cover(root.left.left) + cover(root.left.right)); + } + if(root.right!=null){ + exclRoot += (1 + cover(root.right.left) + cover(root.right.right)); + } + root.lis = Math.min(inclRoot, exclRoot); + return root.lis; + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node root = null; + root = bt.addNode(10, root); + root = bt.addNode(0, root); + root = bt.addNode(-5, root); + root = bt.addNode(5, root); + root = bt.addNode(7, root); + root = bt.addNode(3, root); + root = bt.addNode(30, root); + root = bt.addNode(40, root); + root = bt.addNode(25, root); + root = bt.addNode(46, root); + root = bt.addNode(-8, root); + root = bt.addNode(-2, root); + root = bt.addNode(-1, root); + root = bt.addNode(28, root); + VertexCoverBinaryTreeDP vc = new VertexCoverBinaryTreeDP(); + System.out.println(vc.cover(root)); + } +} diff --git a/showmecode_100/java/com/interview/tree/VerticalOrder.java b/showmecode_100/java/com/interview/tree/VerticalOrder.java new file mode 100644 index 00000000..eff3d798 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/VerticalOrder.java @@ -0,0 +1,57 @@ +package com.interview.tree; + +import java.util.*; + +/** + * Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bottom, column by column). + * If two nodes are in the same row and column, the order should be from left to right. + * + * https://leetcode.com/problems/binary-tree-vertical-order-traversal/ + */ +public class VerticalOrder { + public List> verticalOrder(Node root) { + if (root == null) { + return new ArrayList<>(); + } + int minVal = 0; + int maxVal = 0; + Map> map = new HashMap<>(); + + Deque queue = new LinkedList<>(); + Deque verticalQueue = new LinkedList<>(); + + queue.offerFirst(root); + verticalQueue.offerFirst(0); + int vertical; + while (!queue.isEmpty()) { + root = queue.pollFirst(); + vertical = verticalQueue.pollFirst(); + minVal = Math.min(minVal, vertical); + maxVal = Math.max(maxVal, vertical); + + List r = map.get(vertical); + if (r == null) { + r = new ArrayList<>(); + map.put(vertical, r); + } + r.add(root.data); + + if (root.left != null) { + queue.offerLast(root.left); + verticalQueue.offerLast(vertical - 1); + } + + if (root.right != null) { + queue.offerLast(root.right); + verticalQueue.offerLast(vertical + 1); + } + } + + List> result = new ArrayList<>(); + for (int i = minVal; i <= maxVal; i++) { + List r = map.get(i); + result.add(r); + } + return result; + } +} \ No newline at end of file diff --git a/showmecode_100/java/com/interview/tree/VerticalTreePrinting.java b/showmecode_100/java/com/interview/tree/VerticalTreePrinting.java new file mode 100644 index 00000000..ef7f3704 --- /dev/null +++ b/showmecode_100/java/com/interview/tree/VerticalTreePrinting.java @@ -0,0 +1,60 @@ +package com.interview.tree; + +import java.util.ArrayList; +import java.util.Map; +import java.util.List; +import java.util.TreeMap; + +/** + * http://www.geeksforgeeks.org/print-binary-tree-vertical-order-set-2/ + */ +public class VerticalTreePrinting { + + public void printVertical(Node root){ + Map> map = new TreeMap>(); + populateMap(root,map,0); + printLevel(map); + } + + private void printLevel(Map> map){ + for(Integer key : map.keySet()){ + List listNodes = map.get(key); + for(Node n : listNodes){ + System.out.print(n.data + " "); + } + System.out.println(); + } + } + + private void populateMap(Node root, Map> map,int level){ + if(root == null){ + return; + } + List listNodes = null; + if(map.containsKey(level)){ + listNodes = map.get(level); + }else{ + listNodes = new ArrayList(); + map.put(level, listNodes); + } + listNodes.add(root); + populateMap(root.left,map,level-1); + populateMap(root.right,map,level+1); + } + + public static void main(String args[]){ + BinaryTree bt = new BinaryTree(); + Node head = null; + head = bt.addNode(3, head); + head = bt.addNode(-6, head); + head = bt.addNode(-7, head); + head = bt.addNode(2, head); + head = bt.addNode(9, head); + head = bt.addNode(6, head); + head = bt.addNode(11, head); + head = bt.addNode(13, head); + head = bt.addNode(12, head); + VerticalTreePrinting vtp = new VerticalTreePrinting(); + vtp.printVertical(head); + } +} diff --git a/showmecode_100/java_test/com/interview/TestUtil.java b/showmecode_100/java_test/com/interview/TestUtil.java new file mode 100644 index 00000000..9d5e255a --- /dev/null +++ b/showmecode_100/java_test/com/interview/TestUtil.java @@ -0,0 +1,23 @@ +package com.interview; + +import org.junit.Assert; + +import java.util.List; + +public class TestUtil { + public void compareList(List expected, List actual) { + int i = 0; + for (T str : expected) { + Assert.assertEquals("Failed at index " + i, str, actual.get(i++)); + } + } + + public void compareListOfList(List> expected, List> actual) { + Assert.assertEquals(expected.size(), actual.size()); + for (int i = 0; i < expected.size(); i++) { + List a1 = expected.get(i); + List a2 = expected.get(i); + compareList(a1, a2); + } + } +} diff --git a/showmecode_100/java_test/com/interview/array/AdditiveNumberTest.java b/showmecode_100/java_test/com/interview/array/AdditiveNumberTest.java new file mode 100644 index 00000000..607001d3 --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/AdditiveNumberTest.java @@ -0,0 +1,12 @@ +package com.interview.array; + +import org.junit.Assert; + +public class AdditiveNumberTest { + public static void main(String args[]) { + AdditiveNumber additiveNumber = new AdditiveNumber(); + Assert.assertTrue(additiveNumber.isAdditiveNumber("12351174")); + Assert.assertFalse(additiveNumber.isAdditiveNumber("1023")); + Assert.assertTrue(additiveNumber.isAdditiveNumber("198019823962")); + } +} diff --git a/showmecode_100/java_test/com/interview/array/ArrayAdditionTest.java b/showmecode_100/java_test/com/interview/array/ArrayAdditionTest.java new file mode 100644 index 00000000..1149d00c --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/ArrayAdditionTest.java @@ -0,0 +1,17 @@ +package com.interview.array; + +import org.junit.Assert; +import org.junit.Test; + +public class ArrayAdditionTest { + + @Test + public void testAddSimple() { + ArrayAddition arrayAddition = new ArrayAddition(); + int arr1[] = {9,9,9,9,9,9,9}; + int arr2[] = {1,6,8,2,6,7}; + int[] result = arrayAddition.add(arr1, arr2); + int[] expected = {1, 0, 1, 6, 8, 2, 6, 6}; + Assert.assertArrayEquals(expected, result); + } +} diff --git a/showmecode_100/java_test/com/interview/array/MaximumMinimumArrangementTest.java b/showmecode_100/java_test/com/interview/array/MaximumMinimumArrangementTest.java new file mode 100644 index 00000000..499a1da8 --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/MaximumMinimumArrangementTest.java @@ -0,0 +1,20 @@ +package com.interview.array; + +import org.junit.Assert; +import org.junit.Test; + +public class MaximumMinimumArrangementTest { + @Test + public void differentCases() { + MaximumMinimumArrangement maximumMinimumArrangement = new MaximumMinimumArrangement(); + int[] input1 = {1, 2, 3, 4, 5, 6, 7}; + maximumMinimumArrangement.rearrange(input1); + int[] expected1 = {7, 1, 6, 2, 5, 3, 4}; + Assert.assertArrayEquals(expected1, input1); + + int[] input2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + maximumMinimumArrangement.rearrange(input2); + int[] expected2 = {10, 1, 9, 2, 8, 3, 7, 4, 6, 5}; + Assert.assertArrayEquals(expected2, input2); + } +} diff --git a/showmecode_100/java_test/com/interview/array/MeetingRoomsTest.java b/showmecode_100/java_test/com/interview/array/MeetingRoomsTest.java new file mode 100644 index 00000000..899b7177 --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/MeetingRoomsTest.java @@ -0,0 +1,21 @@ +package com.interview.array; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; + +public class MeetingRoomsTest { + + @Test + public void testDifferentCases() { + MeetingRooms meetingRooms = new MeetingRooms(); + MeetingRooms.Interval[] interval = new MeetingRooms.Interval[4]; + interval[0] = new MeetingRooms.Interval(0,3); + interval[1] = new MeetingRooms.Interval(2,5); + interval[2] = new MeetingRooms.Interval(6,8); + interval[3] = new MeetingRooms.Interval(8,10); + Assert.assertEquals(2, meetingRooms.minMeetingRooms(interval)); + Assert.assertEquals(2, meetingRooms.minMeetingRooms1(interval)); + } +} diff --git a/showmecode_100/java_test/com/interview/array/MultiplyAllFieldsExceptOwnPositionTest.java b/showmecode_100/java_test/com/interview/array/MultiplyAllFieldsExceptOwnPositionTest.java new file mode 100644 index 00000000..f8535488 --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/MultiplyAllFieldsExceptOwnPositionTest.java @@ -0,0 +1,23 @@ +package com.interview.array; + +import org.junit.Assert; +import org.junit.Test; + +public class MultiplyAllFieldsExceptOwnPositionTest { + + @Test + public void testDifferentCases() { + MultiplyAllFieldsExceptOwnPosition mop = new MultiplyAllFieldsExceptOwnPosition(); + int[] input1 = {0, 9, -2}; + int[] output1 = {-18, 0, 0}; + Assert.assertArrayEquals(output1, mop.multiply(input1)); + + int[] input2 = {1, 1}; + int[] output2 = {1, 1}; + Assert.assertArrayEquals(output2, mop.multiply(input2)); + + int[] input3 = {3, 1, -3, 6}; + int[] output3 = {-18, -54, 18, -9}; + Assert.assertArrayEquals(output3, mop.multiply(input3)); + } +} diff --git a/showmecode_100/java_test/com/interview/array/NumberOfTriangledInUnsortedArrayTest.java b/showmecode_100/java_test/com/interview/array/NumberOfTriangledInUnsortedArrayTest.java new file mode 100644 index 00000000..46037ee1 --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/NumberOfTriangledInUnsortedArrayTest.java @@ -0,0 +1,15 @@ +package com.interview.array; + +import org.junit.Assert; +import org.junit.Test; + +public class NumberOfTriangledInUnsortedArrayTest { + + @Test + public void testSimpleCase() { + NumberOfTrianglesInUnsortedArray numberOfTrianglesInUnsortedArray = new NumberOfTrianglesInUnsortedArray(); + int[] input = {3, 4, 5, 6, 8, 9, 15}; + int result = numberOfTrianglesInUnsortedArray.numberOfTriangles(input); + Assert.assertEquals(15, result); + } +} diff --git a/showmecode_100/java_test/com/interview/array/ThreeSumSmallerThanTargetTest.java b/showmecode_100/java_test/com/interview/array/ThreeSumSmallerThanTargetTest.java new file mode 100644 index 00000000..8bcb9589 --- /dev/null +++ b/showmecode_100/java_test/com/interview/array/ThreeSumSmallerThanTargetTest.java @@ -0,0 +1,14 @@ +package com.interview.array; + +import junit.framework.Assert; +import org.junit.Test; + +public class ThreeSumSmallerThanTargetTest { + + @Test + public void testDifferentCases() { + ThreeSumSmallerThanTarget threeSumSmallerThanTarget = new ThreeSumSmallerThanTarget(); + int[] input = {-2, 0, 1, 3}; + Assert.assertEquals(2, threeSumSmallerThanTarget.threeSumSmaller(input, 2)); + } +} diff --git a/showmecode_100/java_test/com/interview/bits/CountingBitsTillNumTest.java b/showmecode_100/java_test/com/interview/bits/CountingBitsTillNumTest.java new file mode 100644 index 00000000..21e4395d --- /dev/null +++ b/showmecode_100/java_test/com/interview/bits/CountingBitsTillNumTest.java @@ -0,0 +1,24 @@ +package com.interview.bits; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by tushar_v_roy on 4/3/16. + */ +public class CountingBitsTillNumTest { + + @Test + public void testDifferentCases() { + CountingBitsTillNum countingBitsTillNum = new CountingBitsTillNum(); + int[] expected1 = {0, 1, 1}; + int[] expected2 = {0, 1, 1, 2, 1, 2}; + int[] expected3 = {0, 1, 1, 2, 1, 2, 2, 3, 1}; + int[] expected4 = {0, 1, 1, 2, 1, 2, 2, 3 ,1, 2, 2, 3}; + + Assert.assertArrayEquals(expected1, countingBitsTillNum.countBits(2)); + Assert.assertArrayEquals(expected2, countingBitsTillNum.countBits(5)); + Assert.assertArrayEquals(expected3, countingBitsTillNum.countBits(8)); + Assert.assertArrayEquals(expected4, countingBitsTillNum.countBits(11)); + } +} diff --git a/showmecode_100/java_test/com/interview/bits/MaxProductWordLengthTest.java b/showmecode_100/java_test/com/interview/bits/MaxProductWordLengthTest.java new file mode 100644 index 00000000..695ef51c --- /dev/null +++ b/showmecode_100/java_test/com/interview/bits/MaxProductWordLengthTest.java @@ -0,0 +1,17 @@ +package com.interview.bits; + +import org.junit.Assert; +import org.junit.Test; + +public class MaxProductWordLengthTest { + + @Test + public void testDifferentCases() { + MaxProductWordLength maxProductWordLength = new MaxProductWordLength(); + String[] words1 = {"abcw", "baz", "foo", "bar", "xtfn", "abcdef"}; + Assert.assertEquals(16, maxProductWordLength.maxProduct(words1)); + + String[] words2 = {"a", "ab", "abc", "d", "cd", "bcd", "abcd"}; + Assert.assertEquals(4, maxProductWordLength.maxProduct(words2)); + } +} diff --git a/showmecode_100/java_test/com/interview/dynamic/DecodeWaysTest.java b/showmecode_100/java_test/com/interview/dynamic/DecodeWaysTest.java new file mode 100644 index 00000000..c5cb6c2d --- /dev/null +++ b/showmecode_100/java_test/com/interview/dynamic/DecodeWaysTest.java @@ -0,0 +1,11 @@ +package com.interview.dynamic; + +import org.junit.Test; + +public class DecodeWaysTest { + @Test + public void testDifferentCases() { + DecodeWays decodeWays = new DecodeWays(); + System.out.println(decodeWays.numDecodings("20320")); + } +} diff --git a/showmecode_100/java_test/com/interview/dynamic/PalindromePartitionTest.java b/showmecode_100/java_test/com/interview/dynamic/PalindromePartitionTest.java new file mode 100644 index 00000000..653f1e4f --- /dev/null +++ b/showmecode_100/java_test/com/interview/dynamic/PalindromePartitionTest.java @@ -0,0 +1,41 @@ +package com.interview.dynamic; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +public class PalindromePartitionTest { + + @Test + public void testAllPartitions() { + PalindromePartition palindromePartition = new PalindromePartition(); + List> result = palindromePartition.partition("aab"); + + List> expected = new ArrayList<>(); + List r1 = new ArrayList<>(); + r1.add("a"); + r1.add("a"); + r1.add("b"); + + expected.add(r1); + r1 = new ArrayList<>(); + r1.add("aa"); + r1.add("b"); + expected.add(r1); + int index = 0; + for (List r : result) { + Assert.assertEquals(expected.get(index++), r); + } + } + + @Test + public void palindromePartitionMinCuts() { + PalindromePartition palindromePartition = new PalindromePartition(); + Assert.assertEquals(3, palindromePartition.minCut("ABCCDCCLMLCCD")); + Assert.assertEquals(0, palindromePartition.minCut("bb")); + Assert.assertEquals(0, palindromePartition.minCut("b")); + + } +} diff --git a/showmecode_100/java_test/com/interview/graph/CourseScheduleTest.java b/showmecode_100/java_test/com/interview/graph/CourseScheduleTest.java new file mode 100644 index 00000000..3a1df013 --- /dev/null +++ b/showmecode_100/java_test/com/interview/graph/CourseScheduleTest.java @@ -0,0 +1,22 @@ +package com.interview.graph; + +import org.junit.Assert; +import org.junit.Test; + +public class CourseScheduleTest { + + @Test + public void testDifferentCases() { + CourseSchedule cs = new CourseSchedule(); + int[][] courses = {{1,0},{2,0},{3,1},{3,2}}; + int[] output = cs.findOrder(4, courses); + int[] expected = {0, 2, 1, 3}; + Assert.assertArrayEquals(expected, output); + + + int[][] courses1 = {{1,0},{2,0},{3,1},{3,2}, {0, 3}}; + int[] output1 = cs.findOrder(4, courses1); + int[] expected1 = {}; + Assert.assertArrayEquals(expected1, output1); + } +} diff --git a/showmecode_100/java_test/com/interview/graph/TravelingSalesmanHeldKarpTest.java b/showmecode_100/java_test/com/interview/graph/TravelingSalesmanHeldKarpTest.java new file mode 100644 index 00000000..7a3a105d --- /dev/null +++ b/showmecode_100/java_test/com/interview/graph/TravelingSalesmanHeldKarpTest.java @@ -0,0 +1,31 @@ +package com.interview.graph; + +import org.junit.Assert; +import org.junit.Test; + +public class TravelingSalesmanHeldKarpTest { + + @Test + public void testDifferentCases() { + TravelingSalesmanHeldKarp tsp = new TravelingSalesmanHeldKarp(); + int[][] distance = {{0, 12, 3, 9, 6, 1, 2}, + {12, 0, 6, 1, 8, 2, 10}, + {3, 6, 0, 6, 7, 11, 7}, + {9, 1, 6, 0, 9, 10, 3}, + {6, 8, 7, 9, 0, 1, 11}, + {1, 2, 11, 10, 1, 0, 12}, + {2, 10, 7, 3, 11, 12, 0}}; + + int cost = tsp.minCost(distance); + Assert.assertEquals(19, cost); + + int[][] distance1 = {{0, 1, 15, 6}, + {2, 0, 7, 3}, + {9, 6, 0, 12}, + {10, 4, 8, 0}, + }; + + cost = tsp.minCost(distance1); + Assert.assertEquals(21, cost); + } +} diff --git a/showmecode_100/java_test/com/interview/graph/WallsAndGatesTest.java b/showmecode_100/java_test/com/interview/graph/WallsAndGatesTest.java new file mode 100644 index 00000000..b20f779c --- /dev/null +++ b/showmecode_100/java_test/com/interview/graph/WallsAndGatesTest.java @@ -0,0 +1,29 @@ +package com.interview.graph; + +import org.junit.Assert; +import org.junit.Test; + +public class WallsAndGatesTest { + + @Test + public void testDifferentScenarios() { + WallsAndGates wallsAndGates = new WallsAndGates(); + int INF = Integer.MAX_VALUE; + int[][] rooms = {{INF, -1, 0, INF}, + {INF, INF, INF, -1}, + {INF, -1, INF, -1}, + {0, -1, INF, INF}}; + + int[][] output = {{3, -1, 0, 1}, + {2, 2, 1, -1}, + {1, -1, 2, -1}, + {0, -1, 3, 4}}; + + wallsAndGates.wallsAndGates(rooms); + int i = 0; + for (int[] o : output) { + Assert.assertArrayEquals(o, rooms[i++]); + } + } +} + diff --git a/showmecode_100/java_test/com/interview/linklist/DeleteDuplicateNodesTest.java b/showmecode_100/java_test/com/interview/linklist/DeleteDuplicateNodesTest.java new file mode 100644 index 00000000..7228c75c --- /dev/null +++ b/showmecode_100/java_test/com/interview/linklist/DeleteDuplicateNodesTest.java @@ -0,0 +1,17 @@ +package com.interview.linklist; + +import org.junit.Test; + +public class DeleteDuplicateNodesTest { + + @Test + public void testDifferentCases() { + DeleteDuplicateNodes deleteDuplicateNodes = new DeleteDuplicateNodes(); + LinkList linkList = new LinkList(); + Node node = null; + node = linkList.addNode(1, node); + node = linkList.addNode(2, node); + node = linkList.addNode(2, node); + deleteDuplicateNodes.deleteDuplicates(node); + } +} diff --git a/showmecode_100/java_test/com/interview/misc/IntegerListParserTest.java b/showmecode_100/java_test/com/interview/misc/IntegerListParserTest.java new file mode 100644 index 00000000..d59d9f69 --- /dev/null +++ b/showmecode_100/java_test/com/interview/misc/IntegerListParserTest.java @@ -0,0 +1,39 @@ +package com.interview.misc; + +import org.junit.Assert; +import org.junit.Test; + +public class IntegerListParserTest { + + @Test + public void testDifferentCases() { + IntegerListParser integerListParser = new IntegerListParser(); + IntegerListParser.NestedInteger nestedInteger = integerListParser.deserialize("123"); + String result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("123", result); + nestedInteger = integerListParser.deserialize("[]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[]", result); + nestedInteger = integerListParser.deserialize("[123]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123]", result); + nestedInteger = integerListParser.deserialize("[123,41]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123,41]", result); + nestedInteger = integerListParser.deserialize("[123,41,[1]]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123,41,[1]]", result); + nestedInteger = integerListParser.deserialize("[123,41,[[[]]]]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123,41,[[[]]]]", result); + nestedInteger = integerListParser.deserialize("[123,41,[[[],[]]],[],[]]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123,41,[[[],[]]],[],[]]", result); + nestedInteger = integerListParser.deserialize("[123,41,[[[121,41,[1]],[2]]],[2],[4]]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123,41,[[[121,41,[1]],[2]]],[2],[4]]", result); + nestedInteger = integerListParser.deserialize("[123,41,[[1,2,[],[]]],[],[],[[1],[3]]]"); + result = integerListParser.serialize(nestedInteger); + Assert.assertEquals("[123,41,[[1,2,[],[]]],[],[],[[1],[3]]]", result); + } +} diff --git a/showmecode_100/java_test/com/interview/multiarray/Mutable2DSumRangeQueryTest.java b/showmecode_100/java_test/com/interview/multiarray/Mutable2DSumRangeQueryTest.java new file mode 100644 index 00000000..b690a330 --- /dev/null +++ b/showmecode_100/java_test/com/interview/multiarray/Mutable2DSumRangeQueryTest.java @@ -0,0 +1,26 @@ +package com.interview.multiarray; + +import org.junit.Assert; +import org.junit.Test; + +public class Mutable2DSumRangeQueryTest { + + @Test + public void testDifferentCases() { + int[][] input = {{2, 3, 6}, {-1, 2, 4}, {-3, 2, 5}}; + Mutable2DSumRangeQuery mutable2DSumRangeQuery = new Mutable2DSumRangeQuery(input); + int total = mutable2DSumRangeQuery.sumRegion(1, 1, 2, 2); + Assert.assertEquals(13, total); + + total = mutable2DSumRangeQuery.sumRegion(0, 1, 2, 1); + Assert.assertEquals(7, total); + + mutable2DSumRangeQuery.update(1, 1, 4); + total = mutable2DSumRangeQuery.sumRegion(1, 1, 2, 2); + Assert.assertEquals(15, total); + + total = mutable2DSumRangeQuery.sumRegion(0, 1, 2, 1); + Assert.assertEquals(9, total); + + } +} diff --git a/showmecode_100/java_test/com/interview/number/AllStrobogrammaticNumberTest.java b/showmecode_100/java_test/com/interview/number/AllStrobogrammaticNumberTest.java new file mode 100644 index 00000000..c2187add --- /dev/null +++ b/showmecode_100/java_test/com/interview/number/AllStrobogrammaticNumberTest.java @@ -0,0 +1,15 @@ +package com.interview.number; + +import org.junit.Assert; +import org.junit.Test; + +public class AllStrobogrammaticNumberTest { + + @Test + public void testDifferentCases() { + AllStrobogrammaticNumber allStrobogrammaticNumber = new AllStrobogrammaticNumber(); + Assert.assertEquals(19, allStrobogrammaticNumber.strobogrammaticInRange("0", "1000")); + Assert.assertEquals(34171, allStrobogrammaticNumber.strobogrammaticInRange("1011010", "2210101121121")); + + } +} diff --git a/showmecode_100/java_test/com/interview/number/BasicCalculatorTest.java b/showmecode_100/java_test/com/interview/number/BasicCalculatorTest.java new file mode 100644 index 00000000..b31e906f --- /dev/null +++ b/showmecode_100/java_test/com/interview/number/BasicCalculatorTest.java @@ -0,0 +1,18 @@ +package com.interview.number; + +import org.junit.Assert; +import org.junit.Test; + +public class BasicCalculatorTest { + + @Test + public void testDifferentCases() { + BasicCalculator basicCalculator = new BasicCalculator(); + Assert.assertEquals(0, basicCalculator.calculate("0")); + Assert.assertEquals(9, basicCalculator.calculate("0 + 9")); + Assert.assertEquals(19, basicCalculator.calculate("1 + 9 * 2")); + Assert.assertEquals(15, basicCalculator.calculate("3 + 9/2 * 3")); + Assert.assertEquals(6, basicCalculator.calculate("8 -2 + 3/ 5 ")); + + } +} diff --git a/showmecode_100/java_test/com/interview/recursion/RestoreIPAddressesTest.java b/showmecode_100/java_test/com/interview/recursion/RestoreIPAddressesTest.java new file mode 100644 index 00000000..491ebce0 --- /dev/null +++ b/showmecode_100/java_test/com/interview/recursion/RestoreIPAddressesTest.java @@ -0,0 +1,26 @@ +package com.interview.recursion; + +import com.interview.TestUtil; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +public class RestoreIPAddressesTest { + + @Test + public void testDifferenceCases() { + RestoreIPAddresses restoreIPAddresses = new RestoreIPAddresses(); + List result = restoreIPAddresses.restoreIpAddresses("25525511135"); + List expected = new ArrayList<>(); + expected.add("255.255.11.135"); + expected.add("255.255.111.35"); + TestUtil t = new TestUtil<>(); + t.compareList(expected, result); + + List result1 = restoreIPAddresses.restoreIpAddresses("0000"); + expected = new ArrayList<>(); + expected.add("0.0.0.0"); + t.compareList(expected, result1); + } +} diff --git a/showmecode_100/java_test/com/interview/string/LongestSubstringWithKDistinctCharactersTest.java b/showmecode_100/java_test/com/interview/string/LongestSubstringWithKDistinctCharactersTest.java new file mode 100644 index 00000000..ac0a39e7 --- /dev/null +++ b/showmecode_100/java_test/com/interview/string/LongestSubstringWithKDistinctCharactersTest.java @@ -0,0 +1,20 @@ +package com.interview.string; + +import org.junit.Assert; +import org.junit.Test; + +public class LongestSubstringWithKDistinctCharactersTest { + + @Test + public void testDifferenceCases() { + LongestSubstringWithKDistinctCharacters longestSubstringWithKDistinctCharacters = new LongestSubstringWithKDistinctCharacters(); + Assert.assertEquals(3, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinct("eceba", 2)); + Assert.assertEquals(1, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinct("aba", 1)); + Assert.assertEquals(5, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinct("caebegcle", 4)); + Assert.assertEquals(0, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinct("eceba", 0)); + Assert.assertEquals(3, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinctUsingMap("eceba", 2)); + Assert.assertEquals(1, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinctUsingMap("aba", 1)); + Assert.assertEquals(5, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinctUsingMap("caebegcle", 4)); + Assert.assertEquals(0, longestSubstringWithKDistinctCharacters.lengthOfLongestSubstringKDistinctUsingMap("eceba", 0)); + } +} diff --git a/showmecode_100/java_test/com/interview/string/PalindromePairTest.java b/showmecode_100/java_test/com/interview/string/PalindromePairTest.java new file mode 100644 index 00000000..2627778d --- /dev/null +++ b/showmecode_100/java_test/com/interview/string/PalindromePairTest.java @@ -0,0 +1,42 @@ +package com.interview.string; + +import com.interview.TestUtil; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +public class PalindromePairTest { + + @Test + public void testDifferentCases() { + PalindromePair palindromePair = new PalindromePair(); + TestUtil testUtil = new TestUtil(); + String[] words = {"bat", "tab"}; + List> result = palindromePair.palindromePairs(words); + testUtil.compareListOfList(createList(0, 1, 1, 0), result); + String[] words1 = {"abcd", "dcba", "lls", "s", "sssll"}; + result = palindromePair.palindromePairs(words1); + testUtil.compareListOfList(createList(0, 1, 1, 0, 3, 2, 2, 4), result); + String[] words2 = {"", "abcd", "abba"}; + result = palindromePair.palindromePairs(words2); + testUtil.compareListOfList(createList(0, 2, 2, 0), result); + String[] words3 = {"a","abc","aba",""}; + result = palindromePair.palindromePairs(words3); + testUtil.compareListOfList(createList(3, 0, 0, 3, 3, 2, 2, 3), result); + String[] words4 = {"abcd","dcba","lls","s","sssll"}; + result = palindromePair.palindromePairs(words4); + testUtil.compareListOfList(createList(0, 1, 1, 0, 3, 2, 2, 4), result); + } + + private List> createList(int... index) { + List> result = new ArrayList<>(); + for (int i = 0; i < index.length; i += 2) { + List r = new ArrayList<>(); + r.add(index[i]); + r.add((index[i + 1])); + result.add(r); + } + return result; + } +} diff --git a/showmecode_100/java_test/com/interview/string/StringEncoderDecoderTest.java b/showmecode_100/java_test/com/interview/string/StringEncoderDecoderTest.java new file mode 100644 index 00000000..f6e537bd --- /dev/null +++ b/showmecode_100/java_test/com/interview/string/StringEncoderDecoderTest.java @@ -0,0 +1,23 @@ +package com.interview.string; + +import com.interview.TestUtil; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +public class StringEncoderDecoderTest { + + @Test + public void testDifferentCases() { + StringEncoderDecoder stringEncoderDecoder = new StringEncoderDecoder(); + List input = new ArrayList<>(); + input.add("Tushar"); + input.add("Roy"); + input.add(""); + String encoded = stringEncoderDecoder.encode(input); + List result = stringEncoderDecoder.decode(encoded); + TestUtil testUtil = new TestUtil(); + testUtil.compareList(input, result); + } +} diff --git a/showmecode_100/java_test/com/interview/string/ValidPalindromeTest.java b/showmecode_100/java_test/com/interview/string/ValidPalindromeTest.java new file mode 100644 index 00000000..3631a882 --- /dev/null +++ b/showmecode_100/java_test/com/interview/string/ValidPalindromeTest.java @@ -0,0 +1,14 @@ +package com.interview.string; + +import org.junit.Assert; +import org.junit.Test; + +public class ValidPalindromeTest { + + @Test + public void testDifferentCases() { + ValidPalindrome validPalindrome = new ValidPalindrome(); + Assert.assertTrue(validPalindrome.isPalindrome("A man, a plan, a canal: Panama")); + Assert.assertFalse(validPalindrome.isPalindrome("race a car")); + } +} diff --git a/showmecode_100/java_test/com/interview/string/ValidWordAbbreviationTest.java b/showmecode_100/java_test/com/interview/string/ValidWordAbbreviationTest.java new file mode 100644 index 00000000..9c1dd1e0 --- /dev/null +++ b/showmecode_100/java_test/com/interview/string/ValidWordAbbreviationTest.java @@ -0,0 +1,15 @@ +package com.interview.string; + +import org.junit.Assert; +import org.junit.Test; + +public class ValidWordAbbreviationTest { + + @Test + public void testDifferentCases() { + String[] dict = {"eersynoiyqkqubhdd","ylz","yldongowlrnsafafcgmz","rxcjc","dvgdtnknareecongydc","ixiwz","erjfyctsla","xovvrnbbvivbsuhb","bpslbpzbwphhwvhtcr","wptflnqkvekpkt","hwoiniqvfe","dgidjd","ecgsghxuesvqmhxe","kfgppbbvwfyp","qntzitqjuazrqwz","yjbycoyngfrreiyibdsk","nguqbtdistlgicmjfrs","yjqrqibgp","avulamdverhdpkpqjtae","cbwvtowh","yhgvjnvo","rihywmuspvzvp","rbkpetmovkwj","jtsehilffmfkicusup","ficdolmdtvk","qwldknj","hseogl","pdyxrfdxekk","xnrliooqnsqfzwgd","utnumabyrkasiizsjx","urygh","odj","nttcedxgpkjqzwfb","gxs","rkizfdlfmm","pjlz","fvjm","edkozzeuhxp","pbjcmakwqkdm","ppuhqdpaokitaowrzkfh","yimgbxllumgkbqadjjqf","sqsytssfjbaldz","llkw","aliw","hagvoxjnuuhsafkmxww","hahndehh","fqmrjyuogqpxyv","gnzbcrikf","auopjpwsepqwmend","xfgsbfafytrrkyevtz","acrtfozvjdvg","hspkwabiheogyk","uvlcpqien","eaamufqeal","wsvuyeysox","oywhf","kasdlmnj","fjpryefc","ftdqq","ftfqzqqig","dloh","tleszaz","yajyoyaxmmos","zbobgedfdpacbkzmxt","lmcj","dtjonkbwsg","xeiqjxvsfjdfddclnso","gpeutivfqwzfyrtax","wjoo","pptzwdcynnfpnirfkfo","wsudzgwuouof","ykjmbtoafrjjsehckh","oqhamskusmqofrsgkqfv","yifmkodzvk","vmufzdavpwjagmlcv","dtamuegujvtzdxui","nxdyotptdjdhst","rsthatscf","kdpwhmjtnkunabzaxv","ggzytma","sdypdz","xncvkmcddpkhkoalh","qnjndoizypqqqxewgla","czc","ojhzmxxceltwzg","hmwvynbzpuebokl","weuuontazzovia","ohwqtugyirw","lrtftghr","fngstcishaseslmb","athpsapnlyx","tcdnqc","fjfyvg","fneurgd","xddiwjfbshgfbbejmpe","ynscraxwlwsqhsioe","eaderhxrlwrjpp","wpnlrfxgnbfpuuiggsvo","ogqmzw","xai","fdtbvhaosybjczyfcsdx","abbcbqhcuoiaggs","qtdwhsqqjt","dqdvabloavvjhunafwhw","gcpqevfuos","hipvttjbniv","acheeyf","seqrnvez","hszzzvbvmhjg","kkwpshwuvsrbjqm","jqxo","sukagbkkrvbquzkfsj","axbrmcroycbyykkdhl","zrtshq","cgwssttvz","nbwccbisxtkccgmkmped","ivplojduvs","wmblfkhtnj","jeoodscttkmjrszzjgh","qmadddn","ssdauwepilwi","wghuntzaltedkacttafj","rxojnfrleq","qzkuejnvhncjzc","cromyllbcleqipqaitzd","yjdzifptqtcmrfyjrfj","svinvs","uftn"}; + ValidWordAbbreviation validWordAbbreviation = new ValidWordAbbreviation(dict); + + Assert.assertTrue(validWordAbbreviation.isUnique("hello")); + } +} diff --git a/showmecode_100/java_test/com/interview/suffixprefix/TrieTest.java b/showmecode_100/java_test/com/interview/suffixprefix/TrieTest.java new file mode 100644 index 00000000..fa8ca38a --- /dev/null +++ b/showmecode_100/java_test/com/interview/suffixprefix/TrieTest.java @@ -0,0 +1,41 @@ +package com.interview.suffixprefix; + +import org.junit.Assert; +import org.junit.Test; + +public class TrieTest { + + @Test + public void testDifferentCases() { + Trie trie = new Trie(); + + trie.insert("abcd"); + trie.insert("abgl"); + trie.insertRecursive("lmn"); + trie.insertRecursive("lmnpq"); + trie.insert("cdeg"); + trie.insert("ghijk"); + + Assert.assertFalse(trie.search("ab")); + Assert.assertFalse(trie.search("abc")); + Assert.assertTrue(trie.search("abcd")); + Assert.assertFalse(trie.search("abg")); + Assert.assertTrue(trie.search("abgl")); + Assert.assertFalse(trie.search("lm")); + Assert.assertTrue(trie.search("lmn")); + Assert.assertFalse(trie.search("lmnp")); + Assert.assertTrue(trie.search("lmnpq")); + + trie.delete("abcd"); + Assert.assertTrue(trie.search("abgl")); + Assert.assertFalse(trie.search("abcd")); + + trie.delete("lmn"); + Assert.assertFalse(trie.search("lmn")); + Assert.assertTrue(trie.search("lmnpq")); + + trie.delete("lmnpq"); + Assert.assertFalse(trie.search("lmnpq")); + + } +} diff --git a/showmecode_100/java_test/com/interview/tree/KClosestValueInBinaryTreeTest.java b/showmecode_100/java_test/com/interview/tree/KClosestValueInBinaryTreeTest.java new file mode 100644 index 00000000..01db13eb --- /dev/null +++ b/showmecode_100/java_test/com/interview/tree/KClosestValueInBinaryTreeTest.java @@ -0,0 +1,32 @@ +package com.interview.tree; + +import com.interview.TestUtil; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +public class KClosestValueInBinaryTreeTest { + + @Test + public void testDifferentCases() { + Node root = null; + BinaryTree bt = new BinaryTree(); + root = bt.addNode(10, root); + root = bt.addNode(20, root); + root = bt.addNode(30, root); + root = bt.addNode(0, root); + root = bt.addNode(6, root); + root = bt.addNode(-6, root); + root = bt.addNode(16, root); + root = bt.addNode(19, root); + + KClosestValueInBinaryTree kClosestValueInBinaryTree = new KClosestValueInBinaryTree(); + List result = kClosestValueInBinaryTree.closestKValues(root, 18, 2); + TestUtil testUtil = new TestUtil(); + testUtil.compareList(Arrays.asList(19, 20), result); + + result = kClosestValueInBinaryTree.closestKValues(root, 18, 4); + testUtil.compareList(Arrays.asList(19, 20, 16, 10), result); + } +} diff --git a/showmecode_100/java_test/com/interview/tree/VerticalOrderTest.java b/showmecode_100/java_test/com/interview/tree/VerticalOrderTest.java new file mode 100644 index 00000000..4467bdd5 --- /dev/null +++ b/showmecode_100/java_test/com/interview/tree/VerticalOrderTest.java @@ -0,0 +1,43 @@ +package com.interview.tree; + +import com.interview.TestUtil; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class VerticalOrderTest { + + @Test + public void testDifferentCases() { + SerializeDeserializeBinaryTree serializeDeserializeBinaryTree = new SerializeDeserializeBinaryTree(); + Node root = serializeDeserializeBinaryTree.deserializeLevelOrder("5,1,6,%,3,%,%,2,4"); + VerticalOrder verticalOrder = new VerticalOrder(); + List> result = verticalOrder.verticalOrder(root); + List> expected = new ArrayList<>(); + expected.add(Arrays.asList(1, 2)); + expected.add(Arrays.asList(5, 3)); + expected.add(Arrays.asList(6, 4)); + + int index = 0; + TestUtil t = new TestUtil<>(); + for (List r : result) { + t.compareList(expected.get(index++), r); + } + + expected = new ArrayList<>(); + expected.add(Arrays.asList(9)); + expected.add(Arrays.asList(3, 15)); + expected.add(Arrays.asList(20)); + expected.add(Arrays.asList(7)); + + root = serializeDeserializeBinaryTree.deserializeLevelOrder("3,9,20,%,%,15,7"); + result = verticalOrder.verticalOrder(root); + index = 0; + for (List r : result) { + t.compareList(expected.get(index++), r); + } + } + +} diff --git a/showmecode_100/python/array/arrayaddition.py b/showmecode_100/python/array/arrayaddition.py new file mode 100644 index 00000000..36a973a9 --- /dev/null +++ b/showmecode_100/python/array/arrayaddition.py @@ -0,0 +1,46 @@ +def add(arr1, arr2): + + l = max(len(arr1), len(arr2)) + result = [0 for j in range(l)] + c = 0 + i = len(arr1) - 1 + j = len(arr2) - 1 + r = 0 + l -= 1 + + while i >= 0 and j >= 0: + r = arr1[i] + arr2[j] + c + i -= 1 + j -= 1 + c = r // 10 + result[l] = r % 10 + l -= 1 + + while i >= 0: + r = arr1[i] + c + i -= 1 + c = r // 10 + result[l] = r % 10 + l -= 1 + + while j >= 0: + r = arr1[j] + c + j -= 1 + c = r // 10 + result[l] = r % 10 + l -= 1 + + if c != 0: + new_result = [0 for j in range(len(result) + 1)] + t = len(new_result) - 1 + while t > 0: + new_result[t] = result[t - 1] + t -= 1 + new_result[0] = c + return new_result + return result + +arr1 = [9, 9, 9, 9, 9, 9, 9] +arr2 = [1, 6, 8, 2, 6, 7] +result = add(arr1, arr2) +print(result) diff --git a/showmecode_100/python/array/commonthreesortedarray.py b/showmecode_100/python/array/commonthreesortedarray.py new file mode 100644 index 00000000..0a0feca9 --- /dev/null +++ b/showmecode_100/python/array/commonthreesortedarray.py @@ -0,0 +1,27 @@ +# http://www.geeksforgeeks.org/find-common-elements-three-sorted-arrays/ + +def common_elements(input1, input2, input3): + result = [] + i = 0 + j = 0 + k = 0 + while i < len(input1) and j < len(input2) and k < len(input3): + if input1[i] == input2[j] and input2[j] == input3[k]: + result.append(input1[i]) + i = i + 1 + j = j + 1 + k = k + 1 + elif input1[i] < input2[j]: + i = i + 1 + elif input2[j] < input3[k]: + j = j + 1 + else: + k = k + 1 + return result + +if __name__ == '__main__': + input1 = [1, 5, 10, 20, 40, 80] + input2 = [6, 7, 20, 80, 100] + input3 = [3, 4, 15, 20, 30, 70, 80, 120] + + print(common_elements(input1, input2, input3)) diff --git a/showmecode_100/python/array/countinversionofsize3.py b/showmecode_100/python/array/countinversionofsize3.py new file mode 100644 index 00000000..c238fb53 --- /dev/null +++ b/showmecode_100/python/array/countinversionofsize3.py @@ -0,0 +1,21 @@ +# http://www.geeksforgeeks.org/count-inversions-of-size-three-in-a-give-array/ + +def find_inversions(input): + inversion = 0 + for i in range(1, len(input) - 1): + larger = 0 + for k in range(0, i): + if input[k] > input[i]: + larger = larger + 1 + smaller = 0 + for k in range(i+1, len(input)): + if input[k] < input[i]: + smaller = smaller + 1 + + inversion += larger*smaller + return inversion + +if __name__ == '__main__': + input = [9, 6, 4, 5, 8] + print(find_inversions(input)) + diff --git a/showmecode_100/python/array/flip0smaximum1s.py b/showmecode_100/python/array/flip0smaximum1s.py new file mode 100644 index 00000000..46135e44 --- /dev/null +++ b/showmecode_100/python/array/flip0smaximum1s.py @@ -0,0 +1,24 @@ +# http://www.geeksforgeeks.org/find-zeroes-to-be-flipped-so-that-number-of-consecutive-1s-is-maximized/ + +def flip_0s_to_maximize_consecutive_1s(input, flips_allowed): + window_start = 0 + count_zero = 0 + result = 0 + for i in range(len(input)): + if input[i] == 1: + result = max(result, i - window_start + 1) + else: + if count_zero < flips_allowed: + count_zero = count_zero + 1 + result = max(result, i - window_start + 1) + else: + while True: + if input[window_start] == 0: + window_start = window_start + 1 + break + window_start = window_start + 1 + return result + +if __name__ == '__main__': + input = [0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1] + print(flip_0s_to_maximize_consecutive_1s(input, 1)) diff --git a/showmecode_100/python/array/longestsamesumspan.py b/showmecode_100/python/array/longestsamesumspan.py new file mode 100644 index 00000000..75eca56c --- /dev/null +++ b/showmecode_100/python/array/longestsamesumspan.py @@ -0,0 +1,29 @@ +# http://www.geeksforgeeks.org/longest-span-sum-two-binary-arrays/ +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/array/LongestSameSumSpan.java + +def longest_span(input1, input2): + if len(input1) != len(input2): + raise ValueError; + + diff = {} + prefix1 = 0 + prefix2 = 0 + max_span = 0 + diff[0] = -1 + for i in range(len(input1)): + prefix1 += input1[i] + prefix2 += input2[i] + curr_diff = prefix1 - prefix2 + if curr_diff in diff: + max_span = max(max_span, i - diff[curr_diff]) + else: + diff[curr_diff] = i + return max_span + +if __name__ == '__main__': + input1 = [1, 0, 0, 1, 1, 0] + input2 = [0, 1, 1, 0, 1, 1] + + print(longest_span(input1, input2)) + + diff --git a/showmecode_100/python/array/maximumsumpathtwoarrays.py b/showmecode_100/python/array/maximumsumpathtwoarrays.py new file mode 100644 index 00000000..29e51161 --- /dev/null +++ b/showmecode_100/python/array/maximumsumpathtwoarrays.py @@ -0,0 +1,46 @@ +# http://www.geeksforgeeks.org/maximum-sum-path-across-two-arrays/ + +def max_sum(input1, input2): + max_sum = 0 + i = 0 + j = 0 + sum1 = 0 + sum2 = 0 + while i < len(input1) and j < len(input2): + if input1[i] == input2[j]: + if sum1 > sum2: + max_sum += sum1 + input1[i] + else: + max_sum += sum2 + input2[j] + i = i + 1 + j = j + 1 + sum1 = 0 + sum2 = 0 + elif input1[i] < input2[j]: + sum1 += input1[i] + i = i + 1 + else: + sum2 += input2[j] + j = j + 1 + + while i < len(input1): + sum1 += input1[i] + i = i + 1 + + while j < len(input2): + sum2 += input2[j] + j = j + 1 + + if sum1 > sum2: + max_sum += sum1 + else: + max_sum += sum2 + + return max_sum + +if __name__ == '__main__': + input1 = [2, 3, 7, 10, 12, 15, 30, 34] + input2 = [1, 5, 7, 8, 10, 15, 16, 19] + + print(max_sum(input1, input2)) + diff --git a/showmecode_100/python/array/maxproductsubarray.py b/showmecode_100/python/array/maxproductsubarray.py new file mode 100644 index 00000000..bb8aa126 --- /dev/null +++ b/showmecode_100/python/array/maxproductsubarray.py @@ -0,0 +1,24 @@ +# http://www.geeksforgeeks.org/maximum-product-subarray/ + +def max_product(input): + max_ending = 1 + min_ending = 1 + max_so_far = 1 + for i in input: + if i > 0: + max_ending = max_ending * i + min_ending = min(min_ending*i, 1) + elif i == 0: + max_ending = 1 + min_ending = 1 + else: + t = max_ending + max_ending = max(min_ending*i, 1) + min_ending = t * i + if max_so_far < max_ending: + max_so_far = max_ending + return max_so_far + +if __name__ == '__main__': + input = [-6,-3,8,-9,-1,-1,3,6,9,0,3,-1] + print(max_product(input)) diff --git a/showmecode_100/python/array/numberoftrianglesunsortedarray.py b/showmecode_100/python/array/numberoftrianglesunsortedarray.py new file mode 100644 index 00000000..1829e2f4 --- /dev/null +++ b/showmecode_100/python/array/numberoftrianglesunsortedarray.py @@ -0,0 +1,20 @@ +# http://www.geeksforgeeks.org/find-number-of-triangles-possible/ + +def number_of_triangles(input): + input.sort() + count = 0 + for i in range(len(input)-2): + k = i + 2 + for j in range(i+1, len(input)): + while k < len(input) and input[i] + input[j] > input[k]: + k = k + 1 + count += k - j - 1 + return count + +if __name__ == '__main__': + input = [15, 9, 8, 3, 4, 5, 6] + print(number_of_triangles(input)) + + + + diff --git a/showmecode_100/python/array/positiveandnegativealternativelymaintainingorder.py b/showmecode_100/python/array/positiveandnegativealternativelymaintainingorder.py new file mode 100644 index 00000000..cae2516c --- /dev/null +++ b/showmecode_100/python/array/positiveandnegativealternativelymaintainingorder.py @@ -0,0 +1,34 @@ +# http://www.geeksforgeeks.org/rearrange-array-alternating-positive-negative-items-o1-extra-space/ + +def rearrange(input): + for i in range (len(input)): + if i%2 == 0 and input[i] >= 0: + index_of_next_negative = find_next(input, i+1, False) + if index_of_next_negative == -1: + return + else: + right_rotate(input, i, index_of_next_negative) + elif i % 2 != 0 and input[i] < 0: + index_of_next_positive = find_next(input, i+1, True) + if index_of_next_positive == -1: + return + else: + right_rotate(input, i, index_of_next_positive) + +def find_next(input, start, isPositive): + for i in range(start, len(input)): + if (isPositive and input[i] >= 0) or (not isPositive and input[i] < 0): + return i; + return -1 + +def right_rotate(input, start, end): + t = input[end] + for i in range(end, start -1, -1): + input[i] = input[i-1] + input[start] = t + +if __name__ == '__main__': + input = [-5, -2, 5, 2, 4, 7, 1, 8, 0, -8]; + rearrange(input) + print(input) + diff --git a/showmecode_100/python/array/rearrangearrayperindex.py b/showmecode_100/python/array/rearrangearrayperindex.py new file mode 100644 index 00000000..26d6a2f2 --- /dev/null +++ b/showmecode_100/python/array/rearrangearrayperindex.py @@ -0,0 +1,26 @@ +# http://www.geeksforgeeks.org/rearrange-array-arrj-becomes-arri-j/ + +def rearrange(input): + for i in range(len(input)): + input[i] += 1 + + for i in range(len(input)): + if input[i] > 0: + rearrange_util(input, i) + + for i in range(len(input)): + input[i] = -input[i] - 1 + +def rearrange_util(input, start): + i = start + 1 + v = input[start] + while v > 0: + t = input[v-1] + input[v-1] = -i + i = v + v = t + +if __name__ == '__main__': + input = [1, 2, 0, 5, 3, 4]; + rearrange(input) + print(input) diff --git a/showmecode_100/python/array/reorderarraybyindex.py b/showmecode_100/python/array/reorderarraybyindex.py new file mode 100644 index 00000000..e2aea0c7 --- /dev/null +++ b/showmecode_100/python/array/reorderarraybyindex.py @@ -0,0 +1,25 @@ +# http://www.geeksforgeeks.org/reorder-a-array-according-to-given-indexes/ + +def reorder(input, index): + if len(input) != len(index): + raise ValueError + for i in range(len(index)): + while index[i] != i: + s_index = index[index[i]] + s_val = input[index[i]] + + index[index[i]] = index[i] + input[index[i]] = input[i] + + index[i] = s_index + input[i] = s_val + +if __name__ == '__main__': + input = [50, 40, 70, 60, 90] + index = [3, 0, 4, 1, 2] + + reorder(input, index) + print(input) + print(index) + + diff --git a/showmecode_100/python/array/rotationwithmaxsum.py b/showmecode_100/python/array/rotationwithmaxsum.py new file mode 100644 index 00000000..bb8c319e --- /dev/null +++ b/showmecode_100/python/array/rotationwithmaxsum.py @@ -0,0 +1,20 @@ +# http://www.geeksforgeeks.org/find-maximum-value-of-sum-iarri-with-only-rotations-on-given-array-allowed/ + +def max_sum(input): + arr_sum = 0 + rotation_sum = 0 + for i in range(len(input)): + arr_sum += input[i] + rotation_sum += i*input[i] + + max_rotation_sum = rotation_sum + + for i in range(1, len(input)): + rotation_sum += len(input)*input[i-1] - arr_sum + max_rotation_sum = max(max_rotation_sum, rotation_sum) + + return max_rotation_sum + +if __name__ == '__main__': + input = [10, 1, 2, 3, 4, 5, 6, 7, 8, 9] + print(max_sum(input)) diff --git a/showmecode_100/python/array/smallestintegernotrepresentedbysubsetsum.py b/showmecode_100/python/array/smallestintegernotrepresentedbysubsetsum.py new file mode 100644 index 00000000..18769eb0 --- /dev/null +++ b/showmecode_100/python/array/smallestintegernotrepresentedbysubsetsum.py @@ -0,0 +1,14 @@ +# http://www.geeksforgeeks.org/find-smallest-value-represented-sum-subset-given-array/ + +def find_smallest_integer(input): + result = 1 + for i in range(len(input)): + if input[i] <= result: + result += input[i] + else: + break + return result + +if __name__ == '__main__': + input = [1, 2, 3, 8] + print(find_smallest_integer(input)) diff --git a/showmecode_100/python/array/tripletsumlessthantotal.py b/showmecode_100/python/array/tripletsumlessthantotal.py new file mode 100644 index 00000000..cc774a53 --- /dev/null +++ b/showmecode_100/python/array/tripletsumlessthantotal.py @@ -0,0 +1,21 @@ +# http://www.geeksforgeeks.org/count-triplets-with-sum-smaller-that-a-given-value/ + +def find_all_triplet(input, total): + input.sort() + result = 0 + for i in range(len(input) - 2): + j = i + 1 + k = len(input) - 1 + while j < k: + if input[i] + input[j] + input[k] >= total: + k = k - 1 + else: + result += k - j + j = j + 1 + return result + + +if __name__ == '__main__': + input = [5, 1, 3, 4, 7] + print(find_all_triplet(input, 12)) + diff --git a/showmecode_100/python/array/zigzagarrangement.py b/showmecode_100/python/array/zigzagarrangement.py new file mode 100644 index 00000000..6d62882d --- /dev/null +++ b/showmecode_100/python/array/zigzagarrangement.py @@ -0,0 +1,23 @@ +# http://www.geeksforgeeks.org/convert-array-into-zig-zag-fashion/ + +def rearrange(input): + is_less = True + for i in range(len(input)-1): + if is_less: + if input[i] > input[i+1]: + swap(input, i, i+1) + else: + if input[i] < input[i+1]: + swap(input, i, i+1) + is_less = not is_less + +def swap(input, i, j): + t = input[i] + input[i] = input[j] + input[j] = t + +if __name__ == '__main__': + input = [4, 3, 2, 6, 7, 1, 9] + rearrange(input) + print(input) + diff --git a/showmecode_100/python/dynamic/bitonicsequence.py b/showmecode_100/python/dynamic/bitonicsequence.py new file mode 100644 index 00000000..10982788 --- /dev/null +++ b/showmecode_100/python/dynamic/bitonicsequence.py @@ -0,0 +1,48 @@ +""" +Problem Statement +================= + +Find the length of the longest Bitonic Sequence in a given sequence of numbers. A Bitonic sequence is a sequence of +numbers which are increasing and then decreasing. + +Video +----- +* https://youtu.be/TWHytKnOPaQ + +Analysis +-------- +* Runtime O(n) + +Reference +--------- +* http://www.geeksforgeeks.org/dynamic-programming-set-15-longest-bitonic-subsequence/ +""" + + +def longest_bitonic(sequence): + length_of_input = len(sequence) + increasing_sequence = [1] * length_of_input + decreasing_sequence = [1] * length_of_input + + for i in range(1, length_of_input): + for j in range(0, i): + if sequence[i] > sequence[j]: + increasing_sequence[i] = max(increasing_sequence[i], increasing_sequence[j] + 1) + + for i in range(length_of_input - 2, -1, -1): + for j in range(length_of_input - 1, i, -1): + if sequence[i] > sequence[j]: + decreasing_sequence[i] = max(decreasing_sequence[i], decreasing_sequence[j] + 1) + + max_value = 0 + + for i in range(len(sequence)): + bitonic_sequence_length = increasing_sequence[i] + decreasing_sequence[i] - 1 + max_value = max(max_value, bitonic_sequence_length) + + return max_value + + +if __name__ == '__main__': + max_value = longest_bitonic([1, 4, 3, 7, 2, 1, 8, 11, 13, 0]) + assert 7 == max_value # 1, 4, 7, 8, 11, 13, 0 diff --git a/showmecode_100/python/dynamic/boxstacking.py b/showmecode_100/python/dynamic/boxstacking.py new file mode 100644 index 00000000..d545374f --- /dev/null +++ b/showmecode_100/python/dynamic/boxstacking.py @@ -0,0 +1,94 @@ +""" +Problem Statement +================= + +Given different dimensions and unlimited supply of boxes for each dimension, stack boxes on top of each other such that +it has maximum height but with caveat that length and width of box on top should be strictly less than length and width +of box under it. You can rotate boxes as you like. + +1) Create all rotations of boxes such that length is always greater or equal to width +2) Sort boxes by base area in non increasing order (length * width). This is because box + with more area will never ever go on top of box with less area. +3) Take T[] and result[] array of same size as total boxes after all rotations are done +4) Apply longest increasing subsequence type of algorithm to get max height. + +Analysis +-------- +If n number of dimensions are given total boxes after rotation will be 3n. +* Space complexity is O(n) +* Time complexity - O(nlogn) to sort boxes. O(n^2) to apply DP on it So really O(n^2) + +Video +----- +* https://youtu.be/9mod_xRB-O0 + +References +---------- +* http://www.geeksforgeeks.org/dynamic-programming-set-21-box-stacking-problem/ +* http://people.cs.clemson.edu/~bcdean/dp_practice/ +""" + +from collections import namedtuple +from itertools import permutations + +dimension = namedtuple("Dimension", "height length width") + + +def create_rotation(given_dimensions): + """ + A rotation is an order wherein length is greater than or equal to width. Having this constraint avoids the + repetition of same order, but with width and length switched. + + For e.g (height=3, width=2, length=1) is same the same box for stacking as (height=3, width=1, length=2). + + :param given_dimensions: Original box dimensions + :return: All the possible rotations of the boxes with the condition that length >= height. + """ + for current_dim in given_dimensions: + for (height, length, width) in permutations((current_dim.height, current_dim.length, current_dim.width)): + if length >= width: + yield dimension(height, length, width) + + +def sort_by_decreasing_area(rotations): + return sorted(rotations, key=lambda dim: dim.length * dim.width, reverse=True) + + +def can_stack(box1, box2): + return box1.length < box2.length and box1.width < box2.width + + +def box_stack_max_height(dimensions): + boxes = sort_by_decreasing_area([rotation for rotation in create_rotation(dimensions)]) + num_boxes = len(boxes) + T = [rotation.height for rotation in boxes] + R = [idx for idx in range(num_boxes)] + + for i in range(1, num_boxes): + for j in range(0, i): + if can_stack(boxes[i], boxes[j]): + stacked_height = T[j] + boxes[i].height + if stacked_height > T[i]: + T[i] = stacked_height + R[i] = j + + max_height = max(T) + start_index = T.index(max_height) + + # Prints the dimensions which were stored in R list. + while True: + print boxes[start_index] + next_index = R[start_index] + if next_index == start_index: + break + start_index = next_index + + return max_height + + +if __name__ == '__main__': + + d1 = dimension(3, 2, 5) + d2 = dimension(1, 2, 4) + + assert 11 == box_stack_max_height([d1, d2]) diff --git a/showmecode_100/python/dynamic/breakword.py b/showmecode_100/python/dynamic/breakword.py new file mode 100644 index 00000000..e23c6f50 --- /dev/null +++ b/showmecode_100/python/dynamic/breakword.py @@ -0,0 +1,153 @@ +""" +Problem Statement +================= + +Given a string and a dictionary, split the string in to multiple words so that each word belongs to the dictionary. + +Video +----- + +* https://youtu.be/WepWFGxiwRs + +Analysis +-------- + +* word_break_recursive: Exponential +* word_break_dp : O(n^3) + +Solution +-------- + +if input[i..j] belongs in a dictionary: + DP[i][j] = True +else: + DP[i][j] = True if DP[i][k-1] and DP[k][j] for any k between i to j. + +Multiple different implementations are given below. +""" + + +def word_break_recursive(given_string, dictionary): + """"Returns None if the given string cannot be broken into words, otherwise returns space separate words.""" + + given_string_length = len(given_string) + if given_string_length == 0: + return "" + string = "" + for i in range(given_string_length): + string += given_string[i] + if string in dictionary: + r = word_break_recursive(given_string[i + 1:], dictionary) + if r is not None: + string += " " + r + return string + return None + + +def word_break_dp(given_string, dictionary): + """Returns None if the given string cannot be broken into words, otherwise returns space separated words.""" + + given_string_length = len(given_string) + + # -1 indicates the word cannot be split. + DP = [[-1 for _ in range(given_string_length)] for _ in range(given_string_length)] + + for substring_length in range(1, given_string_length + 1): + for start in range(0, given_string_length - substring_length + 1): + end = start + substring_length - 1 + substring = given_string[start: end + 1] + if substring in dictionary: + DP[start][end] = start + continue + + for split in range(start + 1, end + 1): + if DP[start][split - 1] != -1 and DP[split][end] != -1: + DP[start][end] = split + break + + if DP[0][-1] == -1: + return None + + words = [] + start_index = 0 + end_index = given_string_length - 1 + while start_index < given_string_length: + split_index = DP[start_index][end_index] + if start_index == split_index: + words.append(given_string[start_index: end_index + 1]) + break + else: + words.append(given_string[start_index: split_index]) + start_index = split_index + + return " ".join(words) + + +def is_word_break_possible(given_string, dictionary): + """Returns if any word break is possible amongst the multiple word breaks in the sentence.""" + + DP = dict() + max_word_length = len(max(dictionary, key=len)) + return is_word_break_possible_recursive_helper(given_string, dictionary, 0, max_word_length, DP) + + +def is_word_break_possible_recursive_helper(given_string, dictionary, start, max_word_length, DP): + if start == len(given_string): + return True + + if start in DP: + return DP[start] + + for i in range(start, start + max_word_length): + if i < len(given_string): + new_word = given_string[start: i + 1] + if new_word in dictionary: + continue + if is_word_break_possible_recursive_helper(given_string, dictionary, i + 1, max_word_length, DP): + DP[start] = True + return True + + DP[start] = False + return False + + +def all_possible_word_break_helper(given_string, dictionary, start, max_word_length, DP): + """"Returns all possible word breaks in a given sentence.""" + if start == len(given_string): + return [""] + + if start in DP: + return DP[start] + + words = [] + for i in range(start, start + max_word_length): + if i < len(given_string): + new_word = given_string[start: i + 1] + if new_word not in dictionary: + continue + sub_words = all_possible_word_break_helper(given_string, dictionary, i + 1, max_word_length, DP) + for word in sub_words: + extra_space = "" if len(word) == 0 else " " + words.append(new_word + extra_space + word) + + DP[start] = words + return words + + +def all_possible_word_breaks(given_string, dictionary): + DP = dict() + max_word_length = len(max(dictionary, key=len)) + return all_possible_word_break_helper(given_string, dictionary, 0, max_word_length, DP) + + +if __name__ == '__main__': + dictionary = {"joy", "likes", "to", "play"} + given_string = "joylikestoplay" + + assert True == is_word_break_possible(given_string, dictionary) + assert "joy likes to play " == word_break_recursive(given_string, dictionary) + assert "joy likes to play" == word_break_dp(given_string, dictionary) + + dictionary = {"pea", "nut", "peanut", "butter"} + given_string = "peanutbutter" + assert ['pea nut butter', 'peanut butter'] == all_possible_word_breaks(given_string, dictionary) diff --git a/showmecode_100/python/dynamic/coin_change_num_ways.py b/showmecode_100/python/dynamic/coin_change_num_ways.py new file mode 100644 index 00000000..e8572adc --- /dev/null +++ b/showmecode_100/python/dynamic/coin_change_num_ways.py @@ -0,0 +1,77 @@ +""" +Problem Statement +================= + +Given a total and coins of certain denominations find number of ways total can be formed from coins assuming infinity +supply of coins. + +Analysis +-------- +* Runtime : O(num_of_coins * total) + +Video +----- +* https://youtu.be/_fgjrs570YE + +Reference +--------- +* http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ +""" + + +def coin_changing_num_ways(coins, total): + cols = total + 1 # 1 for value 0 in total + rows = len(coins) + T = [[1 if col == 0 else 0 for col in range(cols)] for _ in range(rows)] + + for i in range(rows): + for j in range(cols): + if (i - 1) < 0: + continue + if j < coins[i]: + T[i][j] = T[i - 1][j] + else: + T[i][j] = T[i - 1][j] + T[i][j - coins[i]] + + return T[rows - 1][cols - 1] + + +def coin_changing_num_ways2(coins, total): + cols = total + 1 + num_coins = len(coins) + + # Using 1-D Array instead of 2-D Array. Approach is same as coin_changing_num_ways. + T = [1 if col == 0 else 0 for col in range(cols)] + + for i in range(num_coins): + for col in range(1, cols): + if col >= coins[i]: + T[col] += T[col - coins[i]] + + return T[cols - 1] + + +def print_coin_changes_recursive(coins, total, results_stack, pos): + if total == 0: + for coin in results_stack: + print "%d " % coin, + print + + for idx in range(pos, len(coins)): + if total >= coins[idx]: + results_stack.append(coins[idx]) + print_coin_changes_recursive(coins, total - coins[idx], results_stack, idx) + results_stack.pop() # Remove last inserted coin from stack to use new coin with different index. + + +def print_coin_changes(coins, total): + print_coin_changes_recursive(coins, total, list(), 0) + + +if __name__ == '__main__': + coins = [1, 2, 3] + total = 5 + expected = 5 + assert expected == coin_changing_num_ways(coins, total) + assert expected == coin_changing_num_ways2(coins, total) + print_coin_changes(coins, total) diff --git a/showmecode_100/python/dynamic/coinchangingmincoins.py b/showmecode_100/python/dynamic/coinchangingmincoins.py new file mode 100644 index 00000000..eb1af05e --- /dev/null +++ b/showmecode_100/python/dynamic/coinchangingmincoins.py @@ -0,0 +1,95 @@ +""" +Problem Statement +================= + +Given coins of certain denominations with infinite supply find minimum number of coins it takes to form given total + +Video +----- + +* Topdown DP - https://youtu.be/Kf_M7RdHr1M +* Bottom Up DP - https://youtu.be/Y0ZqKpToTic (Approach 1. 2D array.) +* Bottom up DP - https://youtu.be/NJuKJ8sasGk (Same as Approach 1. Uses 1D array since 2D array is not required.) + +Analysis +-------- + +* Time complexity - O(len(coins) * total) +* Space complexity - O(len(coins) * total) +""" + + +def min_coins(coins, total): + cols = total + 1 + rows = len(coins) + T = [[0 if col == 0 else float("inf") for col in range(cols)] for _ in range(rows)] + + for i in range(rows): + for j in range(1, cols): + if j < coins[i]: + T[i][j] = T[i - 1][j] + else: + T[i][j] = min(T[i - 1][j], 1 + T[i][j - coins[i]]) + + return T[rows - 1][cols - 1] + + +def print_coins(R, coins): + start = len(R) - 1 + + if R[start] == -1: + print "No Solution Possible." + return + + print "Coins:", + while start != 0: + coin = coins[R[start]] + print "%d " % coin, + start = start - coin + + +def min_coins2(coins, total): + cols = total + 1 + T =[0 if idx == 0 else float("inf") for idx in range(cols)] + R = [-1 for _ in range(total + 1)] + + for j in range(len(coins)): + for i in range(1, cols): + coin = coins[j] + if i >= coins[j]: + if T[i] > 1 + T[i - coin]: + T[i] = 1 + T[i - coin] + R[i] = j + + print_coins(R, coins) + return T[cols - 1] + + +def min_coins_top_down(coins, total, memo): + if total == 0: + return 0 + + if total in memo: + return memo[total] + + min_value = float("inf") + for i in range(len(coins)): + coin = coins[i] + if coin > total: + continue + val = min_coins_top_down(coins, total - coin, memo) + min_value = min(min_value, val) + + min_value += 1 + + memo[total] = min_value + return min_value + + +if __name__ == '__main__': + coins = [1, 5, 6, 8] + total = 11 + expected = 2 + assert expected == min_coins(coins, total) + assert expected == min_coins2(coins, total) + assert expected == min_coins_top_down(coins, total, dict()) diff --git a/showmecode_100/python/dynamic/count_num_A.py b/showmecode_100/python/dynamic/count_num_A.py new file mode 100644 index 00000000..68633be3 --- /dev/null +++ b/showmecode_100/python/dynamic/count_num_A.py @@ -0,0 +1,61 @@ +""" +Problem Statement +================= + +Imagine you have a special keyboard with the following keys: + +Key 1: Prints 'A' on screen +Key 2: (Ctrl-A): Select screen +Key 3: (Ctrl-C): Copy selection to buffer +Key 4: (Ctrl-V): Print buffer on screen appending it + after what has already been printed. + +If you can only press the keyboard for N times (with the above four +keys), write a program to produce maximum numbers of A's. That is to +say, the input parameter is N (No. of keys that you can press), the +output is M (No. of As that you can produce). + +Complexity +---------- + +* Recursive Solution : Exponential > O(2^n) +* Dynamic Programming: Quadratic O(n^2) + +Reference +--------- +* http://www.geeksforgeeks.org/how-to-print-maximum-number-of-a-using-given-four-keys/ +""" + + +def count_a_recursive(n_times): + if n_times < 7: + return n_times + + result = float("-inf") + + for sub_prob in range(n_times - 3, 0, -1): + result = max(result, (n_times - sub_prob - 1) * count_a_recursive(sub_prob)) + + return result + + +def count_a(n_times): + if n_times < 7: + return n_times + + T = [0 for _ in range(n_times + 1)] + + for num in range(7): + T[num] = num + + for n in range(7, n_times + 1): + for sub_prob in range(n - 3, 0, -1): + T[n] = max(T[n], T[sub_prob] * (n - sub_prob - 1)) + + return T[n_times] + + +if __name__ == '__main__': + expected = 9 + assert expected == count_a_recursive(7) + assert expected == count_a(7) diff --git a/showmecode_100/python/dynamic/count_num_binary_without_consec_1.py b/showmecode_100/python/dynamic/count_num_binary_without_consec_1.py new file mode 100644 index 00000000..c37cbfba --- /dev/null +++ b/showmecode_100/python/dynamic/count_num_binary_without_consec_1.py @@ -0,0 +1,37 @@ +""" +Problem Statement +================= + +Given a positive integer N, count all the numbers from 1 to 2^N, whose binary representation does not have consecutive +1s. + +This is a simple application of fibonacci series. + +Video +----- + +* https://www.youtube.com/watch?v=a9-NtLIs1Kk + +Complexity +---------- + +* Runtime Complexity: O(n) + + +Reference +--------- + +* http://www.geeksforgeeks.org/count-number-binary-strings-without-consecutive-1s/ +""" + + +def consec_one(num_n): + f1 = f2 = 1 + + for _ in range(num_n): + f1, f2 = f1 + f2, f1 + + return f1 + +if __name__ == '__main__': + assert 13 == consec_one(5) diff --git a/showmecode_100/python/dynamic/cutting_rod.py b/showmecode_100/python/dynamic/cutting_rod.py new file mode 100644 index 00000000..da737f3f --- /dev/null +++ b/showmecode_100/python/dynamic/cutting_rod.py @@ -0,0 +1,58 @@ +""" +Problem Statement +================= + +Given a rod of length n inches and an array of prices that contains prices of all pieces of size smaller than n. +Determine the maximum value obtainable by cutting up the rod and selling the pieces. + +Video +----- + +* https://youtu.be/IRwVmTmN6go + + +Time Complexity +--------------- + +1. Recursive Solution = O(2^n) +2. Dynamic Programming Solution = O(n^2) + +Reference +--------- +http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/ +""" + + +def max_profit_dp(prices, rod_length): + rod_length_values = [0 for _ in range(rod_length + 1)] + + for length in range(1, rod_length + 1): + + max_value = float("-inf") + + for cut_length in range(1, length + 1): + max_value = max(max_value, prices[cut_length - 1] + rod_length_values[length - cut_length]) + + rod_length_values[length] = max_value + + return rod_length_values[rod_length] + + +def max_profit_recursive(prices, rod_length): + if rod_length == 0: + return 0 + + max_price = float('-inf') + + for length in range(1, rod_length + 1): + max_price = max(max_price, prices[length - 1] + max_profit_recursive(prices, rod_length - length)) + + return max_price + + +if __name__ == '__main__': + prices = [3,5,8,9,10,20,22,25] + rod_length = 8 + expected_max_profit = 26 + assert expected_max_profit == max_profit_recursive(prices, rod_length) + assert expected_max_profit == max_profit_dp(prices, rod_length) diff --git a/showmecode_100/python/dynamic/dice_throw_ways.py b/showmecode_100/python/dynamic/dice_throw_ways.py new file mode 100644 index 00000000..3edfc9be --- /dev/null +++ b/showmecode_100/python/dynamic/dice_throw_ways.py @@ -0,0 +1,40 @@ +""" +Problem Statement +================= + +Given n dice each with m faces, numbered from 1 to m, find the number of ways to get sum X. X is the summation of values +on each face when all the dice are thrown. + +Complexity +---------- + +* Run time complexity: O(m * n * x) where m is number of faces, n is number of dice and x is given sum. + + +References +---------- + +* http://www.geeksforgeeks.org/dice-throw-problem/ +""" + + +def num_ways(faces, dices, sumX): + + T = [[0 for _ in range(sumX + 1)] for _ in range(dices + 1)] + + # For a single dice + for face_value in range(1, faces + 1): + if face_value <= sumX: + T[1][face_value] = 1 + + for dice in range(2, dices + 1): + for partial_sum in range(1, sumX + 1): + for face_value in range(1, faces + 1): + if face_value < partial_sum: + T[dice][partial_sum] += T[dice - 1][partial_sum - face_value] + + return T[dices][sumX] + + +if __name__ == '__main__': + assert 7 == num_ways(3, 3, 6) diff --git a/showmecode_100/python/dynamic/editdistance.py b/showmecode_100/python/dynamic/editdistance.py new file mode 100644 index 00000000..97dc431a --- /dev/null +++ b/showmecode_100/python/dynamic/editdistance.py @@ -0,0 +1,82 @@ +""" +Problem Statement +================= + +Given two strings str1 and str2, find the minimum number of edits (edit one character to another, delete char from str1 +or delete char from str2) to change str1 to str2. + +Video +----- +* https://youtu.be/We3YDTzNXEk + +Analysis +-------- +* DP Runtime : O(len(str1) * len(str2)) +* Recursive Solution: Exponential (O(3^(m+n-1))) + +Reference +--------- +* https://www.clear.rice.edu/comp130/12spring/editdist/ +""" + + +def print_edits(T, str1, str2): + i = len(T) - 1 + j = len(T[0]) - 1 + while True: + if i == 0 or j == 0: + break + if str2[i - 1] == str1[j - 1]: + i -= 1 + j -= 1 + elif T[i][j] == T[i - 1][j - 1] + 1: + print "Edit %s in string1 to %s in string2." % (str1[j - 1], str2[i - 1]) + i -= 1 + j -= 1 + elif T[i][j] == T[i - 1][j] + 1: + print "Delete %s in string2." % str2[i - 1] + i -= 1 + elif T[i][j] == T[i][j - 1] + 1: + print "Delete %s in string1." % str1[j - 1] + j -= 1 + + +def min_edit_distance(str1, str2): + rows = len(str2) + 1 + cols = len(str1) + 1 + T = [[0 for _ in range(cols)] for _ in range(rows)] + + for j in range(cols): + T[0][j] = j + + for i in range(rows): + T[i][0] = i + + for i in range(1, rows): + for j in range(1, cols): + if str2[i - 1] == str1[j - 1]: + T[i][j] = T[i - 1][j - 1] + else: + T[i][j] = 1 + min(T[i - 1][j - 1], T[i - 1][j], T[i][j - 1]) + + print_edits(T, str1, str2) + return T[rows - 1][cols - 1] + +def min_edit_distance_recursive(str1, str2): + i = len(str1) + j = len(str2) + + if i == 0: return j + if j == 0: return i + + return min(min_edit_distance_recursive(str1[:i - 1], str2) + 1, + min_edit_distance_recursive(str1, str2[:j - 1]) + 1, + min_edit_distance_recursive(str1[:i - 1], str2[:j - 1]) + (1 if str1[i - 1] != str2[j - 1] else 0)) + +if __name__ == '__main__': + str1 = "azced" + str2 = "abcdef" + expected = 3 + assert expected == min_edit_distance(str1, str2) + assert expected == min_edit_distance(str2, str1) + assert expected == min_edit_distance_recursive(str1, str2) diff --git a/showmecode_100/python/dynamic/egg_drop.py b/showmecode_100/python/dynamic/egg_drop.py new file mode 100644 index 00000000..291faceb --- /dev/null +++ b/showmecode_100/python/dynamic/egg_drop.py @@ -0,0 +1,64 @@ +""" +Problem Statement +================= + +Given a certain number of eggs and a certain number of floors, determine the minimum number of attempts required to find +the egg breaking floor. + +Analysis +-------- + +* Dynamic Programming Time Complexity: O(eggs * num_floors^2) +* Recursive Solution: Exponential + +Video +----- + +* https://youtu.be/3hcaVyX00_4 + +Reference +--------- + +* http://www.geeksforgeeks.org/dynamic-programming-set-11-egg-dropping-puzzle/ + +""" + + +def min_attempts_egg_drop(eggs, floors): + num_eggs = eggs + 1 + num_floors = floors + 1 + + T = [[floor if egg == 1 else 0 for floor in range(num_floors)] for egg in range(num_eggs)] + + for egg in range(2, num_eggs): + for floor in range(1, num_floors): + T[egg][floor] = min(1 + max(T[egg - 1][k - 1], T[egg][floor - k]) for k in range(1, floor + 1)) + + return T[num_eggs - 1][num_floors - 1] + + +def min_attempts_egg_drop_recursive(eggs, floors): + if eggs == 1 or floors == 0: + return floors + + min_value = float("inf") + + for floor in range(1, floors + 1): + min_value = min(min_value, + 1 + max(min_attempts_egg_drop_recursive(eggs - 1, floor - 1), + min_attempts_egg_drop_recursive(eggs, floors - floor))) + + return min_value + + +if __name__ == '__main__': + eggs = 3 + floors = 100 + expected_attempts = 9 + + assert expected_attempts == min_attempts_egg_drop(eggs, floors) + + eggs = 2 + floors = 6 + expected_attempts = 3 + assert expected_attempts == min_attempts_egg_drop_recursive(eggs, floors) diff --git a/showmecode_100/python/dynamic/knapsack_01.py b/showmecode_100/python/dynamic/knapsack_01.py new file mode 100644 index 00000000..2549b277 --- /dev/null +++ b/showmecode_100/python/dynamic/knapsack_01.py @@ -0,0 +1,79 @@ +""" +Problem Statement +================= + +0/1 Knapsack Problem - Given items of certain weights/values and maximum allowed weight how to pick items to pick items +from this set to maximize sum of value of items such that sum of weights is less than or equal to maximum allowed +weight. + +Runtime Analysis +---------------- +Time complexity - O(W*total items) + +Video +----- +* Topdown DP - https://youtu.be/149WSzQ4E1g +* Bottomup DP - https://youtu.be/8LusJS5-AGo + +References +---------- +* http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/ +* https://en.wikipedia.org/wiki/Knapsack_problem +""" + + +def knapsack_01(values, weights, total): + total_items = len(weights) + + rows = total_items + 1 + cols = total + 1 + + T = [[0 for _ in range(cols)] for _ in range(rows)] + + for i in range(1, rows): + for j in range(1, cols): + if j < weights[i - 1]: + T[i][j] = T[i - 1][j] + else: + T[i][j] = max(T[i - 1][j], values[i - 1] + T[i - 1][j - weights[i - 1]]) + + return T[rows - 1][cols -1] + + +def knapsack_01_recursive_util(values, weights, remaining_weight, total_items, current_item, memo): + if current_item >= total_items or remaining_weight <= 0: + return 0 + + key = (total_items - current_item - 1, remaining_weight) + + if key in memo: + return memo[key] + + if remaining_weight < weights[current_item]: + max_value = knapsack_01_recursive_util(values, weights, remaining_weight, total_items, current_item + 1, memo) + else: + max_value = max(values[current_item] + knapsack_01_recursive_util(values, weights, remaining_weight - weights[current_item], total_items, current_item + 1, memo), + knapsack_01_recursive_util(values, weights, remaining_weight, total_items, current_item + 1, memo)) + + memo[key] = max_value + return max_value + + +def knapsack_01_recursive(values, weights, total_weight): + memo = dict() + return knapsack_01_recursive_util(values, weights, total_weight, len(values), 0, memo) + + +if __name__ == '__main__': + total_weight = 7 + weights = [1, 3, 4, 5] + values = [1, 4, 5, 7] + expected = 9 + assert expected == knapsack_01(values, weights, total_weight) + assert expected == knapsack_01_recursive(values, weights, total_weight) + total_weight = 8 + weights = [2, 2, 4, 5] + values = [2, 4, 6, 9] + expected = 13 + assert expected == knapsack_01(values, weights, total_weight) + assert expected == knapsack_01_recursive(values, weights, total_weight) diff --git a/showmecode_100/python/dynamic/kth_ugly_number.py b/showmecode_100/python/dynamic/kth_ugly_number.py new file mode 100644 index 00000000..acd605f4 --- /dev/null +++ b/showmecode_100/python/dynamic/kth_ugly_number.py @@ -0,0 +1,43 @@ +""" +Problem Statement +================= + +Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, +shows the first 11 ugly numbers. By convention, 1 is included. + +Write a program to find the kth ugly number. + +Complexity +---------- + +* Time Complexity O(n) +* Space Complexity O(n) + +Reference +--------- +* http://www.geeksforgeeks.org/ugly-numbers/ +""" + + +def ugly_number(kth): + ugly_factors = [1] # By convention 1 is included. + + factor_index = { + 2: 0, + 3: 0, + 5: 0} + + for num in range(1, kth): + minimal_factor = min(min(ugly_factors[factor_index[2]] * 2, ugly_factors[factor_index[3]] * 3), + ugly_factors[factor_index[5]] * 5) + + ugly_factors.append(minimal_factor) + + for factor in [2, 3, 5]: + if minimal_factor % factor == 0: + factor_index[factor] += 1 + + return ugly_factors[kth - 1] + +if __name__ == '__main__': + assert 5832 == ugly_number(150) diff --git a/showmecode_100/python/dynamic/longest_common_subsequence.py b/showmecode_100/python/dynamic/longest_common_subsequence.py new file mode 100644 index 00000000..3069579d --- /dev/null +++ b/showmecode_100/python/dynamic/longest_common_subsequence.py @@ -0,0 +1,69 @@ +""" +Problem Statement +================= + +Given two sequences A = [A1, A2, A3,..., An] and B = [B1, B2, B3,..., Bm], find the length of the longest common +subsequence. + +Video +----- + +* https://youtu.be/NnD96abizww + +Complexity +---------- + +* Recursive Solution: O(2^n) (or O(2^m) whichever of n and m is larger). +* Dynamic Programming Solution: O(n * m) + +Reference +--------- + +* https://en.wikipedia.org/wiki/Longest_common_subsequence_problem +* http://www.geeksforgeeks.org/dynamic-programming-set-4-longest-common-subsequence/ +""" + + +def lcs_recursive_helper(sequence1, sequence2, index1, index2): + if (index1 == len(sequence1)) or (index2 == len(sequence2)): + return 0 + + if sequence1[index1] == sequence2[index2]: + return 1 + lcs_recursive_helper(sequence1, sequence2, index1 + 1, index2 + 1) + + return max(lcs_recursive_helper(sequence1, sequence2, index1 + 1, index2), + lcs_recursive_helper(sequence1, sequence2, index1, index2 + 1)) + + +def longest_common_subsequence_recursive(sequence1, sequence2): + return lcs_recursive_helper(sequence1, sequence2, 0, 0) + + +def longest_common_subsequence(sequence1, sequence2): + cols = len(sequence1) + 1 # Add 1 to represent 0 valued column for DP + rows = len(sequence2) + 1 # Add 1 to represent 0 valued row for DP + + T = [[0 for _ in range(cols)] for _ in range(rows)] + + max_length = 0 + + for i in range(1, rows): + for j in range(1, cols): + if sequence2[i - 1] == sequence1[j - 1]: + T[i][j] = 1 + T[i - 1][j - 1] + else: + T[i][j] = max(T[i - 1][j], T[i][j - 1]) + + max_length = max(max_length, T[i][j]) + + return max_length + + +if __name__ == '__main__': + sequence1 = "ABCDGHLQR" + sequence2 = "AEDPHR" + expected_length = 4 + assert expected_length == longest_common_subsequence_recursive(sequence1, sequence2) + assert expected_length == longest_common_subsequence_recursive(sequence2, sequence1) + assert expected_length == longest_common_subsequence(sequence1, sequence2) + assert expected_length == longest_common_subsequence(sequence2, sequence1) diff --git a/showmecode_100/python/dynamic/longest_common_substring.py b/showmecode_100/python/dynamic/longest_common_substring.py new file mode 100644 index 00000000..eae3a7cc --- /dev/null +++ b/showmecode_100/python/dynamic/longest_common_substring.py @@ -0,0 +1,80 @@ +""" +Problem Statement +================= + +Given two sequences A = [A1, A2, A3,..., An] and B = [B1, B2, B3,..., Bm], find the length of the longest common +substring. + +Video +----- + +* https://youtu.be/BysNXJHzCEs + +Complexity +---------- + +* Recursive Solution: O(2^n) (or O(2^m) whichever of n and m is larger). +* Dynamic Programming Solution: O(n * m) + +Reference +--------- + +* http://en.wikipedia.org/wiki/Longest_common_substring_problem +""" + + +def longest_common_string_recursive_helper(str1, str2, pos1, pos2, check_equal): + if pos1 == -1 or pos2 == -1: + return 0 + + if check_equal: + if str1[pos1] == str2[pos2]: + return 1 + longest_common_string_recursive_helper(str1, str2, pos1 - 1, pos2 - 1, True) + else: + return 0 + + longest = 0 # start (again) to find the longest from the current positions + if str1[pos1] == str2[pos2]: + longest = 1 + longest_common_string_recursive_helper(str1, str2, pos1 - 1, pos2 - 1, True) + + return max(longest, + longest_common_string_recursive_helper(str1, str2, pos1, pos2 - 1, False), + longest_common_string_recursive_helper(str1, str2, pos1 - 1, pos2, False)) + + +def longest_common_substring_recursive(str1, str2): + return longest_common_string_recursive_helper(str1, str2, len(str1) - 1, len(str2) - 1, False) + + +def longest_common_substring(str1, str2): + cols = len(str1) + 1 # Add 1 to represent 0 valued col for DP + rows = len(str2) + 1 # Add 1 to represent 0 valued row for DP + + T = [[0 for _ in range(cols)] for _ in range(rows)] + + max_length = 0 + + for i in range(1, rows): + for j in range(1, cols): + if str2[i - 1] == str1[j - 1]: + T[i][j] = T[i - 1][j - 1] + 1 + max_length = max(max_length, T[i][j]) + + return max_length + + +if __name__ == '__main__': + str1 = "abcdef" + str2 = "zcdemf" + expected = 3 + assert expected == longest_common_substring(str1, str2) + assert expected == longest_common_substring_recursive(str1, str2) + str1 = "abcdef" + str2 = "cde" + expected = 3 + assert expected == longest_common_substring(str1, str2) + str1 = "cde" + str2 = "zcdemf" + expected = 3 + assert expected == longest_common_substring(str1, str2) + diff --git a/showmecode_100/python/dynamic/longest_increasing_subsequence.py b/showmecode_100/python/dynamic/longest_increasing_subsequence.py new file mode 100644 index 00000000..71b8a683 --- /dev/null +++ b/showmecode_100/python/dynamic/longest_increasing_subsequence.py @@ -0,0 +1,89 @@ +""" +Problem Statement +================= + +Find a subsequence in given array in which the subsequence's elements are in sorted order, lowest to highest, and in +which the subsequence is as long as possible. + +Video +----- +* https://youtu.be/CE2b_-XfVDk + +Solution +-------- + +Dynamic Programming is used to solve this question. DP equation is.:: + + if(arr[i] > arr[j]) { T[i] = max(T[i], T[j] + 1) } + +* Time complexity is O(n^2). +* Space complexity is O(n) + +Reference +--------- + +* http://en.wikipedia.org/wiki/Longest_increasing_subsequence +* http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/ +""" + + +def longest_increasing_subsequence(sequence): + sequence_length = len(sequence) + + T = [1 for _ in range(sequence_length)] + solution_indices = [i for i in range(sequence_length)] + + for index_i in range(1, sequence_length): + for index_j in range(0, index_i): + if (sequence[index_i] > sequence[index_j]) and (T[index_i] < T[index_j] + 1): + T[index_i] = T[index_j] + 1 + solution_indices[index_i] = index_j + + # find the index of the max number in T + max_value = max(T) + max_index = T.index(max_value) + + # Print solution using linked values in solution_indices + + next_index = max_index + + while True: + print sequence[next_index], + + old_index = next_index + next_index = solution_indices[next_index] + if next_index == old_index: + break + + return T[max_index] + + +def longest_increasing_subsequence_recursive(sequence): + sequence_length = len(sequence) + longest = 0 + + for index in range(sequence_length - 1): + longest_so_far = longest_subsequence_recursive_helper(sequence, index + 1, sequence[index]) + if longest_so_far > longest: + longest = longest_so_far + + return longest + 1 + + +def longest_subsequence_recursive_helper(sequence, next_position, current_position_value): + if next_position == len(sequence): + return 0 + + temp1 = 0 + if sequence[next_position] > current_position_value: + temp1 = 1 + longest_subsequence_recursive_helper(sequence, next_position + 1, sequence[next_position]) + + temp2 = longest_subsequence_recursive_helper(sequence, next_position + 1, current_position_value) + + return max(temp1, temp2) + + +if __name__ == '__main__': + sequence = [23, 10, 22, 5, 33, 8, 9, 21, 50, 41, 60, 80, 99, 22, 23, 24, 25, 26, 27] + assert 10 == longest_increasing_subsequence(sequence) + assert 10 == longest_increasing_subsequence_recursive(sequence) diff --git a/showmecode_100/python/dynamic/longest_palindromic_subsequence.py b/showmecode_100/python/dynamic/longest_palindromic_subsequence.py new file mode 100644 index 00000000..20c5c6a0 --- /dev/null +++ b/showmecode_100/python/dynamic/longest_palindromic_subsequence.py @@ -0,0 +1,64 @@ +""" +Problem Statement +================= + +Given a string find longest palindromic subsequence in this string. + +Complexity +---------- + +* Dynamic Programming Time Complexity: O(n^2) +* Recursive Solution Time Complexity: O(2^n) + +Video +----- +* https://youtu.be/_nCsPn7_OgI + +References +---------- +* http://www.geeksforgeeks.org/dynamic-programming-set-12-longest-palindromic-subsequence/ +""" + + +def longest_palindromic_subsequence(given_string): + rows = cols = string_length = len(given_string) + T = [[0 for _ in range(cols)] for _ in range(rows)] + + for row in range(rows): + T[row][row] = 1 + + for substring_length in range(2, string_length + 1): + for row in range(0, string_length - substring_length + 1): + col = row + substring_length - 1 + + if given_string[row] == given_string[col]: + if string_length == 2: + T[row][col] = 2 + else: + T[row][col] = 2 + T[row + 1][col - 1] + else: + T[row][col] = max(T[row + 1][col], T[row][col - 1]) + + return T[0][-1] + + +def palindromic_subsequence_recursive_helper(given_string, start_index, length): + if length == 0 or length == 1: + return length + + if given_string[start_index] == given_string[length - start_index - 1]: + return 2 + palindromic_subsequence_recursive_helper(given_string, start_index + 1, length - 2) + else: + return max(palindromic_subsequence_recursive_helper(given_string, start_index, length - 1), + palindromic_subsequence_recursive_helper(given_string, start_index + 1, length - 1)) + + +def longest_palindromic_subsequence_recursive(given_string): + return palindromic_subsequence_recursive_helper(given_string, 0, len(given_string)) + + +if __name__ == '__main__': + given_string = "agbdba" + expected_result = 5 + assert expected_result == longest_palindromic_subsequence(given_string) + assert expected_result == longest_palindromic_subsequence_recursive(given_string) diff --git a/showmecode_100/python/dynamic/matrix_chain_order.py b/showmecode_100/python/dynamic/matrix_chain_order.py new file mode 100644 index 00000000..bf9095ec --- /dev/null +++ b/showmecode_100/python/dynamic/matrix_chain_order.py @@ -0,0 +1,51 @@ +""" +Problem Statement +================= + +Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of dimension p[i-1] x p[i]. We +need to write a function matrix_chain_order() that should return the minimum number of multiplications needed to +multiply the chain. + +Video +----- +* https://youtu.be/vgLJZMUfnsU + +Note +---- + +In the code below we give matrices length as an array and each matrix takes 2 indices from the array. +For e.g. {2, 3, 4} represents two matrices (2, 3) and (3, 4) in (row, col) format. + + +Complexity +---------- + +Time Complexity: O(n^3) + +Reference +--------- + +* http://www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/ +""" + + +def matrix_chain_order(matrices): + matrices_length = len(matrices) + + T = [[0 for _ in range(matrices_length)] for _ in range(matrices_length)] + + for gap in range(2, matrices_length): + for index_i in range(0, matrices_length - gap): + index_j = index_i + gap + T[index_i][index_j] = 10000 + for index_k in range(index_i + 1, index_j): + temp = T[index_i][index_k] + T[index_k][index_j] + matrices[index_i] * matrices[index_k] * matrices[index_j] + if temp < T[index_i][index_j]: + T[index_i][index_j] = temp + + return T[0][-1] + + +if __name__ == '__main__': + matrices = [4, 2, 3, 5, 3] + assert 84 == matrix_chain_order(matrices) diff --git a/showmecode_100/python/dynamic/maximum_increasing_subsequence.py b/showmecode_100/python/dynamic/maximum_increasing_subsequence.py new file mode 100644 index 00000000..d6ddefb0 --- /dev/null +++ b/showmecode_100/python/dynamic/maximum_increasing_subsequence.py @@ -0,0 +1,38 @@ +""" +Problem Statement +================= + +Given an array of n positive integers. Write a program to find the sum of maximum sum subsequence of the given array +such that the integers in the subsequence are in increasing order. + +Complexity +---------- + +* Time Complexity: O(n^2) +* Space Complexity: O(n) + +Video +----- + +* https://youtu.be/99ssGWhLPUE + +Reference +--------- +* http://www.geeksforgeeks.org/dynamic-programming-set-14-maximum-sum-increasing-subsequence/ +""" + + +def maximum_sum_subsequence(sequence): + sequence_length = len(sequence) + T = [sequence[i] for i in range(sequence_length)] + + for index_i in range(1, sequence_length): + for index_j in range(0, index_i): + if sequence[index_j] < sequence[index_i]: + T[index_i] = max(T[index_i], T[index_j] + sequence[index_i]) + + return max(T) + +if __name__ == '__main__': + sequence = [1, 101, 10, 2, 3, 100, 4] + assert 111 == maximum_sum_subsequence(sequence) diff --git a/showmecode_100/python/dynamic/nth_fibonacci.py b/showmecode_100/python/dynamic/nth_fibonacci.py new file mode 100644 index 00000000..055bb0df --- /dev/null +++ b/showmecode_100/python/dynamic/nth_fibonacci.py @@ -0,0 +1,40 @@ +""" +Problem Statement +================= + +Given the number n, find the nth fibanacci number. + +The fibonacci series is 0, 1, 1, 2, 3 ... + +And follows the formula Fn = Fn-1 + Fn-2 + +Complexity +---------- + +* Recursive Solution: O(2^n) +* Dynamic Programming: O(n) + +""" + + +def fibonacci_recursive(n): + if n == 0 or n == 1: + return n + + return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2) + + +def fibonacci(n): + n1, n2 = 0, 1 + + if n == n1 or n == n2: + return n + + for i in range(2, n + 1): + n1, n2 = n2, n1 + n2 + + return n2 + +if __name__ == '__main__': + assert 610 == fibonacci_recursive(15) + assert 610 == fibonacci(15) diff --git a/showmecode_100/python/dynamic/num_bst.py b/showmecode_100/python/dynamic/num_bst.py new file mode 100644 index 00000000..10abe2b0 --- /dev/null +++ b/showmecode_100/python/dynamic/num_bst.py @@ -0,0 +1,49 @@ +""" +Problem Statement +================= +Count number of binary search trees created for array of size n. The solution is the nth catalan number. + + +Complexity +---------- +* Dynamic Programming: O(n^2) +* Recursive Solution: O(2^n) + +Video +----- + +* https://youtu.be/YDf982Lb84o + +Reference +--------- +* http://www.geeksforgeeks.org/program-nth-catalan-number/ +""" + + +def num_bst(num_nodes): + T = [0 for _ in range(num_nodes + 1)] + T[0] = 1 + T[1] = 1 + + for node in range(2, num_nodes+1): + for sub in range(0, node): + T[node] += T[sub] * T[node - sub - 1] + + return T[num_nodes] + + +def num_bst_recursive(num_nodes): + if num_nodes == 0 or num_nodes == 1: + return 1 + + result = 0 + + for root in range(1, num_nodes + 1): + result += num_bst_recursive(root - 1) * num_bst_recursive(num_nodes - root) + + return result + + +if __name__ == '__main__': + assert 5 == num_bst(3) + assert 5 == num_bst_recursive(3) diff --git a/showmecode_100/python/dynamic/num_paths_nm_matrix.py b/showmecode_100/python/dynamic/num_paths_nm_matrix.py new file mode 100644 index 00000000..3f8d2844 --- /dev/null +++ b/showmecode_100/python/dynamic/num_paths_nm_matrix.py @@ -0,0 +1,40 @@ +""" +Problem Statement +================= + +Count the number of Paths from 1,1 to N,M in an NxM matrix. + +Analysis +-------- + +* Dynamic Programing Solution: O(rows * cols) +* Recursive: O(2^rows) if rows > cols else O(2^cols) + + +References +---------- +* http://www.geeksforgeeks.org/count-possible-paths-top-left-bottom-right-nxm-matrix/ + +""" + + +def num_paths_matrix(rows, cols): + T = [[1 if row == 0 or col == 0 else 0 for row in range(cols)] for col in range(rows)] + for row in range(1, rows): + for col in range(1, cols): + T[row][col] = T[row - 1][col] + T[row][col - 1] + return T[rows - 1][cols - 1] + + +def num_paths_matrix_recursive(rows, cols): + if rows == 1 or cols == 1: + return 1 + return num_paths_matrix(rows-1, cols) + num_paths_matrix(rows, cols - 1) + + +if __name__ == '__main__': + rows = 3 + cols = 3 + expected = 6 + assert expected == num_paths_matrix(rows, cols) + assert expected == num_paths_matrix_recursive(rows, cols) diff --git a/showmecode_100/python/dynamic/num_trees_preorder.py b/showmecode_100/python/dynamic/num_trees_preorder.py new file mode 100644 index 00000000..dcc2956e --- /dev/null +++ b/showmecode_100/python/dynamic/num_trees_preorder.py @@ -0,0 +1,49 @@ +""" +Problem Statement +================= + +Given the number of nodes N, in a pre-order sequence how many unique trees can be created? Number of tree is exactly +same as number of unique BST create with array of size n. The solution is a catalan number. + +Complexity +---------- +* Dynamic Programming: O(n^2) +* Recursive Solution: O(2^n) + +Video +----- +* https://youtu.be/RUB5ZPfKcnY +""" + + +def num_trees(num_nodes): + T = [0 for _ in range(num_nodes + 1)] + T[0] = 1 + T[1] = 1 + for n in range(2, num_nodes + 1): + for j in range(0, n): + T[n] += T[j] * T[n - j - 1] + return T[num_nodes] + + +def num_trees_recursive(num_nodes): + if num_nodes == 0 or num_nodes == 1: + return 1 + + result = 0 + + for n in range(1, num_nodes + 1): + result += num_trees_recursive(n - 1) * num_trees_recursive(num_nodes - n) + + return result + + + + +if __name__ == '__main__': + assert 5 == num_trees(3) + assert 14 == num_trees(4) + assert 42 == num_trees(5) + assert 5 == num_trees_recursive(3) + assert 14 == num_trees_recursive(4) + assert 42 == num_trees_recursive(5) diff --git a/showmecode_100/python/dynamic/optimal_bst.py b/showmecode_100/python/dynamic/optimal_bst.py new file mode 100644 index 00000000..dcabe90f --- /dev/null +++ b/showmecode_100/python/dynamic/optimal_bst.py @@ -0,0 +1,71 @@ +""" +Problem Statement +================= + +Given a sorted array keys[0.. n-1] of search keys and an array freq[0.. n-1] of frequency counts, where freq[i] is the +number of searches to keys[i]. Construct a binary search tree of all keys such that the total cost of all the searches +is as small as possible. + +Video +----- +* https://youtu.be/hgA4xxlVvfQ + +Analysis +-------- +* Recursive: Exponential O(n^n) +* Dynamic Programming: O(n^3) + +Reference +--------- +* http://www.geeksforgeeks.org/dynamic-programming-set-24-optimal-binary-search-tree/ +""" + + +def min_cost_bst(input_array, freq): + size = rows = cols = len(input_array) + T = [[0 for _ in range(cols)] for _ in range(rows)] + + for idx in range(rows): + T[idx][idx] = freq[idx] + + for sub_tree_size in range(2, size + 1): + for start in range(size + 1 - sub_tree_size): + end = start + sub_tree_size - 1 + T[start][end] = float("inf") + total = sum(freq[start:end + 1]) + for k in range(start, end + 1): + val = total + (0 if k - 1 < 0 else T[start][k - 1]) + (0 if k + 1 > end else T[k + 1][end]) + T[start][end] = min(val, T[start][end]) + + return T[0][-1] + + +def min_cost_bst_recursive_helper(input_array, freq, low_index, high_index, level): + if low_index > high_index: + return 0 + min_value = float("inf") + + for index in range(low_index, high_index + 1): + val = (min_cost_bst_recursive_helper(input_array, freq, low_index, index - 1, level + 1) # left tree + + level * freq[index] # value at level + + min_cost_bst_recursive_helper(input_array, freq, index + 1, high_index, level + 1)) # right tree + min_value = min(val, min_value) + + return min_value + + +def min_cost_bst_recursive(input_array, freq): + return min_cost_bst_recursive_helper(input_array, freq, 0, len(input_array) - 1, 1) + + +if __name__ == '__main__': + input_array = [10, 12, 16, 21] + freq = [4, 2, 6, 3] + expected = 26 + assert expected == min_cost_bst(input_array, freq) + assert expected == min_cost_bst_recursive(input_array, freq) + input_array = [10, 12, 20, 35, 46] + freq = [34, 8, 50, 21, 16] + expected = 232 + assert expected == min_cost_bst(input_array, freq) + assert expected == min_cost_bst_recursive(input_array, freq) diff --git a/showmecode_100/python/dynamic/stockbuysellktransactions.py b/showmecode_100/python/dynamic/stockbuysellktransactions.py new file mode 100644 index 00000000..c7070d7a --- /dev/null +++ b/showmecode_100/python/dynamic/stockbuysellktransactions.py @@ -0,0 +1,91 @@ +"""" +Problem Statement +================= + +Given certain stock values over a period of days (d days) and a number K, the number of transactions allowed, find the +maximum profit that be obtained with at most K transactions. + +Video +----- +* https://youtu.be/oDhu5uGq_ic + +Complexity +---------- + +* Space Complexity O(days * transctions) +* Time Complexity: Slow Solution O (days^2 * transactions), Faster Solution O(days * transaction) +""" + + +def max_profit(prices, K): + if K == 0 or prices == []: + return 0 + + days = len(prices) + num_transactions = K + 1 # 0th transaction up to and including kth transaction is considered. + + T = [[0 for _ in range(days)] for _ in range(num_transactions)] + + for transaction in range(1, num_transactions): + max_diff = - prices[0] + for day in range(1, days): + T[transaction][day] = max(T[transaction][day - 1], # No transaction + prices[day] + max_diff) # price on that day with max diff + max_diff = max(max_diff, + T[transaction - 1][day] - prices[day]) # update max_diff + + print_actual_solution(T, prices) + + return T[-1][-1] + + +def max_profit_slow_solution(prices, K): + if K == 0 or prices == []: + return 0 + + days = len(prices) + num_transactions = K + 1 + + T = [[0 for _ in range(len(prices))] for _ in range(num_transactions)] + + for transaction in range(1, num_transactions): + for day in range(1, days): + # This maximum value of either + # a) No Transaction on the day. We pick the value from day - 1 + # b) Max profit made by selling on the day plus the cost of the previous transaction, considered over m days + T[transaction][day] = max(T[transaction][day - 1], + max([(prices[day] - prices[m] + T[transaction - 1][m]) for m in range(day)])) + + print_actual_solution(T, prices) + return T[-1][-1] + + +def print_actual_solution(T, prices): + transaction = len(T) - 1 + day = len(T[0]) - 1 + stack = [] + + while True: + if transaction == 0 or day == 0: + break + + if T[transaction][day] == T[transaction][day - 1]: # Didn't sell + day -= 1 + else: + stack.append(day) # sold + max_diff = T[transaction][day] - prices[day] + for k in range(day - 1, -1, -1): + if T[transaction - 1][k] - prices[k] == max_diff: + stack.append(k) # bought + transaction -= 1 + break + + for entry in range(len(stack) - 1, -1, -2): + print("Buy on day {day} at price {price}".format(day=stack[entry], price=prices[stack[transaction]])) + print("Sell on day {day} at price {price}".format(day=stack[entry], price=prices[stack[transaction - 1]])) + + +if __name__ == '__main__': + prices = [2, 5, 7, 1, 4, 3, 1, 3] + assert 10 == max_profit(prices, 3) + assert 10 == max_profit_slow_solution(prices, 3) diff --git a/showmecode_100/python/dynamic/string_interleaving.py b/showmecode_100/python/dynamic/string_interleaving.py new file mode 100644 index 00000000..ddda745e --- /dev/null +++ b/showmecode_100/python/dynamic/string_interleaving.py @@ -0,0 +1,58 @@ +""" +Problem Statement +================= + +Given three strings A, B and C. Write a function that checks whether C is an interleaving of A and B. C is said to be +interleaving A and B, if it contains all characters of A and B and order of all characters in individual strings is +preserved. + +http://www.geeksforgeeks.org/check-whether-a-given-string-is-an-interleaving-of-two-other-given-strings-set-2/ + +Video: https://www.youtube.com/watch?v=ih2OZ9-M3OM +""" + +def is_interleaved_recursive(str1, str2, str3, pos1, pos2, pos3): + if pos1 == len(str1) and pos2 == len(str2) and pos3 == len(str3): + return True + + if pos3 == len(str3): + return False + + return (((pos1 < len(str1) and str1[pos1] == str3[pos3]) and is_interleaved_recursive(str1, str2, str3, pos1 + 1, pos2, pos3 + 1)) or + (pos2 < len(str2) and str2[pos2] == str3[pos3]) and is_interleaved_recursive(str1, str2, str3, pos1, pos2 + 1, pos3 + 1)) + + +def is_interleaved(str1, str2, str3): + if len(str3) != (len(str1) + len(str2)): + return False + + cols = len(str1) + 1 + rows = len(str2) + 1 + + T = [[False for _ in range(cols)] for _ in range(rows)] + + for row in range(rows): + for col in range(cols): + index = row + col - 1 + if row == 0 and col == 0: + T[row][col] = True + elif row == 0: + if str3[index] == str1[col - 1]: + T[row][col] = True and T[row][col - 1] + elif col == 0: + if str3[index] == str2[row - 1]: + T[row][col] = True and T[row - 1][col] + else: + T[row][col] = ((T[row][col - 1] if str3[index] == str1[col - 1] else False) or + (T[row - 1][col] if str3[index] == str2[row - 1] else False)) + + return T[rows - 1][cols - 1] + + +if __name__ == '__main__': + str1 = "XXYM" + str2 = "XXZT" + str3 = "XXXZXYTM" + + assert True == is_interleaved(str1, str2, str3) + assert True == is_interleaved_recursive(str1, str2, str3, 0, 0, 0) diff --git a/showmecode_100/python/dynamic/sub_rectangular_maximum_sum.py b/showmecode_100/python/dynamic/sub_rectangular_maximum_sum.py new file mode 100644 index 00000000..04fa5c1a --- /dev/null +++ b/showmecode_100/python/dynamic/sub_rectangular_maximum_sum.py @@ -0,0 +1,86 @@ +""" +Problem Statement +================= + +Write a program to find maximum sum rectangle in give 2D matrix. Assume there is at least one positive number in the 2D +matrix. + +Solution: +-------- + +* Keep temp array with size as number of rows. Start left and right from 0 and keep adding values for each row and + maintain them in this temp array. +* Run Kadane's algorithm to find max sum subarray in temp. Now increment right by 1. +* When right reaches last column reset right to 1 and left to 1. + +Analysis +-------- +* Space complexity of this algorithm is O(row) +* Time complexity of this algorithm is O(row*col*col) + +Video +----- +* https://youtu.be/yCQN096CwWM + +References +---------- +* http://www.geeksforgeeks.org/dynamic-programming-set-27-max-sum-rectangle-in-a-2d-matrix/ +""" + +from collections import namedtuple + +Result = namedtuple("Result","maxSum leftBound rightBound upBound lowBound") + +KadanesResult = namedtuple("KadanesResult","maxSum start end") + + +def kadanes(temp): + max = 0 + maxStart = -1 + maxEnd = -1 + currentStart = 0 + maxSoFar = 0 + + for i in range(0, len(temp)): + maxSoFar += temp[i] + + if maxSoFar < 0: + maxSoFar = 0 + currentStart = i + 1 + + if maxSoFar > max: + maxStart = currentStart + maxEnd = i + max = maxSoFar + + return KadanesResult(max, maxStart, maxEnd) + + +def max_sub_sub_rectangle(rectangle): + + rows = len(rectangle) + cols = len(rectangle[0]) + + result = Result(float("-inf"), -1, -1, -1, -1) + + for left in range(cols): + temp = [0 for _ in range(rows)] + for right in range(left, cols): + for i in range(rows): + temp[i] += rectangle[i][right] + + kadanes_result = kadanes(temp) + if kadanes_result.maxSum > result.maxSum: + result = Result(kadanes_result.maxSum, left, right, kadanes_result.start, kadanes_result.end) + + return result + +if __name__ == '__main__': + rectangle = [[2, 1, -3, -4, 5], + [0, 6, 3, 4, 1], + [2, -2, -1, 4, -5], + [-3, 3, 1, 0, 3]] + + result = max_sub_sub_rectangle(rectangle) + assert 18 == result.maxSum + print result diff --git a/showmecode_100/python/dynamic/subset_sum.py b/showmecode_100/python/dynamic/subset_sum.py new file mode 100644 index 00000000..1e59cd33 --- /dev/null +++ b/showmecode_100/python/dynamic/subset_sum.py @@ -0,0 +1,60 @@ +""" +Problem Statement +================= + +Given an array of non negative numbers and a total, is there subset of numbers in this array which adds up to given +total. Another variation is given an array is it possible to split it up into 2 equal sum partitions. Partition need not +be equal sized. Just equal sum. + +Video +----- + +* https://youtu.be/s6FhG--P7z0 + +Solution +-------- + +* Time complexity is O(input.size * total_sum) +* Space complexity is O(input.size*total_sum) + +Reference +--------- + +* https://en.wikipedia.org/wiki/Subset_sum_problem +""" + + +def subset_sum(sequence, sum_value): + cols = sum_value + 1 # Plus 1 for 0 valued col. + rows = len(sequence) + 1 # Plus 1 for 0 valued row. + T = [[False for _ in range(cols)] for _ in range(rows)] + + for row in range(rows): + T[row][0] = True + + for index_i in range(1, rows): + for index_j in range(1, cols): + if index_j >= sequence[index_i - 1]: + T[index_i][index_j] = T[index_i - 1][index_j] or T[index_i - 1][index_j - sequence[index_i - 1]] + else: + T[index_i][index_j] = T[index_i - 1][index_j] + + return T[rows - 1][cols - 1] + + +def partition(sequence): + sequence_sum = sum(sequence) + if sequence_sum % 2 != 0: + return False + + expected = sequence_sum / 2 + + return subset_sum(sequence, expected) + + +if __name__ == '__main__': + sequence = [2, 3, 7, 8] + assert True == subset_sum(sequence, 11) + + sequence = [1, 3, 5, 5, 2, 1, 1, 6] + assert True == partition(sequence) diff --git a/showmecode_100/python/dynamic/symbolexpressionevaluation.py b/showmecode_100/python/dynamic/symbolexpressionevaluation.py new file mode 100644 index 00000000..88c45457 --- /dev/null +++ b/showmecode_100/python/dynamic/symbolexpressionevaluation.py @@ -0,0 +1,67 @@ +""" +Problem Statement +================= + +Let there be a binary operation for 3 symbols a, b, c and result of these binary operation given in a table. +Given an expression of these 3 symbols and a final result, tell if this expression can be parenthesize in certain +way to produce the final result. + +Complexity +---------- + +* Run time Complexity: O(n^3) +* SpaceL O(n^2) + +Where n is the length of the expression. +""" + + +def evaluate_expression(expression_map, expression, result): + expression_length = len(expression) + T = [[set() for _ in range(expression_length)] for _ in range(len(expression))] + + for idx, expr in enumerate(expression): + T[idx][idx].add(expr) + + # We take a sub expression of length 2 until the total expression length + for sub_length in range(2, expression_length + 1): + for left_index in range(0, expression_length - sub_length + 1): + right_index = left_index + sub_length - 1 + # we split the expression at different k indices for the total sub-expression length and store the result. + # at T[left_index][right_index] + # Like bbc, will be treated for (b(bc) and ((bb) c) and the final result is stored in a set at T[0][2] + for k in range(left_index, right_index): + for expr1 in T[left_index][k]: + for expr2 in T[k+1][right_index]: + T[left_index][right_index].add(expression_map[(expr1, expr2)]) + + for expr in T[0][-1]: + if result in expr: + return True + + return False + +if __name__ == '__main__': + expressions = ['a', 'b', 'c'] + # expression table denotes the binary operation between two expression and its result. + expression_table = [ + ['b', 'b', 'a'], + ['c', 'b', 'a'], + ['a', 'a', 'c'] + ] + + # For convenience, we can modify it to be more explicit and use the expression table + + expression_map = { + ('a', 'a'): 'b', + ('a', 'b'): 'b', + ('a', 'c'): 'a', + ('b', 'a'): 'c', + ('b', 'b'): 'b', + ('b', 'c'): 'a', + ('c', 'a'): 'a', + ('c', 'b'): 'a', + ('c', 'c'): 'c' + } + + assert True == evaluate_expression(expression_map, 'bbbbac', 'a') diff --git a/showmecode_100/python/dynamic/weighted_job_scheduling_max_profit.py b/showmecode_100/python/dynamic/weighted_job_scheduling_max_profit.py new file mode 100644 index 00000000..daa9926d --- /dev/null +++ b/showmecode_100/python/dynamic/weighted_job_scheduling_max_profit.py @@ -0,0 +1,53 @@ +""" +Problem Statement +================= + +Given set of jobs with start and end interval and profit, how to maximize profit such that jobs in subset do not +overlap. + +Video +----- +* https://youtu.be/cr6Ip0J9izc + +Complexity +---------- + +* Runtime Complexity: O(n^2) +* Space Complexity: O(n) + +Reference Link +-------------- +* http://www.cs.princeton.edu/courses/archive/spr05/cos423/lectures/06dynamic-programming.pdf +""" + + +def can_sequence(job1, job2): + _, job1_finish_time = job1 + job2_start_time, _ = job2 + return job1_finish_time <= job2_start_time + + +def find_max_profit(jobs): + sequenced_jobs = sorted(jobs.keys(), key=lambda x: x[1]) + T = [jobs[job_key] for job_key in sequenced_jobs] + num_jobs = len(sequenced_jobs) + + for j in range(1, num_jobs): + for i in range(0, j): + if can_sequence(sequenced_jobs[i], sequenced_jobs[j]): + T[j] = max(T[j], T[i] + jobs[sequenced_jobs[j]]) + + return max(T) + + +if __name__ == '__main__': + jobs = { + (1, 3): 5, # (start_time, end_time, total_cost) + (2, 5): 6, + (4, 6): 5, + (6, 7): 4, + (5, 8): 11, + (7, 9): 2 + } + + assert 17 == find_max_profit(jobs) diff --git a/showmecode_100/python/geometry/skylinedrawing.py b/showmecode_100/python/geometry/skylinedrawing.py new file mode 100644 index 00000000..049bb4bf --- /dev/null +++ b/showmecode_100/python/geometry/skylinedrawing.py @@ -0,0 +1,62 @@ +# https://leetcode.com/problems/the-skyline-problem/ + +class BuildingPoint(object): + + def __init__(self, point, is_start, height): + self.point = point; + self.is_start = is_start + self.height = height + + def __lt__(self, other): + if self.point != other.point: + return self.point < other.point + else: + if self.is_start: + h1 = -self.height + else: + h1 = self.height + + if other.is_start: + h2 = -other.height; + else: + h2 = other.height + + return h1 < h2 + +def get_skyline(buildings): + + building_points = [] + for building in buildings: + building_points.append(BuildingPoint(building[0], True, building[2])) + building_points.append(BuildingPoint(building[1], False, building[2])) + + building_points = sorted(building_points) + + queue = {} + queue[0] = 1 + prev_max_height = 0 + result = [] + for building_point in building_points: + if building_point.is_start: + if building_point.height in queue: + queue[building_point.height] = queue[building_point.height] + 1 + else: + queue[building_point.height] = 1 + + else: + if queue[building_point.height] == 1: + del queue[building_point.height] + else: + queue[building_point.height] = queue[building_point.height] - 1 + + current_max_height = max(queue.keys()) + + if prev_max_height != current_max_height: + result.append([building_point.point, current_max_height]) + prev_max_height = current_max_height + return result + +if __name__ == '__main__': + buildings = [[1, 3, 4], [3, 4, 4], [2, 6, 2], [8, 11, 4], [7, 9, 3], [10, 11, 2]] + print(get_skyline(buildings)) + diff --git a/showmecode_100/python/graph/cycledirectedgraph.py b/showmecode_100/python/graph/cycledirectedgraph.py new file mode 100644 index 00000000..d04060ee --- /dev/null +++ b/showmecode_100/python/graph/cycledirectedgraph.py @@ -0,0 +1,49 @@ +# detect cycle in directed graph +# https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/CycleInDirectedGraph.java + +from graph import * + +def has_cycle(graph): + white = set() + gray = set() + black = set() + + for vertex in graph.all_vertex.values(): + white.add(vertex) + + while len(white) > 0: + current = next(iter(white)) + if dfs(current, white, gray, black) == True: + return True + + return False + +def dfs(current, white, gray, black): + move_vertex(current, white, gray) + for neighbor in current.adjacent_vertices: + if neighbor in black: + continue + if neighbor in gray: + return True + if dfs(neighbor, white, gray, black) == True: + return True + + move_vertex(current, gray, black) + return False + +def move_vertex(vertex, source_set, destination_set): + source_set.remove(vertex) + destination_set.add(vertex) + +if __name__ == '__main__': + graph = Graph(True) + graph.add_edge(1,2) + graph.add_edge(1,3) + graph.add_edge(2,3) + graph.add_edge(4,1) + graph.add_edge(4,5) + graph.add_edge(5,6) + graph.add_edge(6,4) + + print(has_cycle(graph)); + diff --git a/showmecode_100/python/graph/cycleundirectedgraph.py b/showmecode_100/python/graph/cycleundirectedgraph.py new file mode 100644 index 00000000..474719e9 --- /dev/null +++ b/showmecode_100/python/graph/cycleundirectedgraph.py @@ -0,0 +1,57 @@ +# detect cycle in undirected graph +# https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/CycleUndirectedGraph.java + +from graph import * +from disjointset import * + +def has_cycle_dfs(graph): + visited = set() + for vertex in graph.all_vertex.values(): + if vertex in visited: + continue + flag = has_cycle_dfs_util(vertex, visited, None) + if flag: + return True + return False + +def has_cycle_dfs_util(vertex, visited, parent): + visited.add(vertex) + for adjacent in vertex.adjacent_vertices: + if parent is not None and adjacent == parent: + continue + if adjacent in visited: + return True + has_cycle = has_cycle_dfs_util(adjacent, visited, vertex) + if has_cycle: + return True + return False + +def has_cycle_using_disjoint_set(graph): + disjoint_set = DisjointSet() + + for vertex in graph.all_vertex.values(): + disjoint_set.make_set(vertex.id) + + for edge in graph.all_edges: + parent1 = disjoint_set.find_set(edge.vertex1.id) + parent2 = disjoint_set.find_set(edge.vertex2.id) + if parent1 == parent2: + return True + disjoint_set.union(edge.vertex1.id, edge.vertex2.id) + + return False + + +if __name__ == '__main__': + graph = Graph(False) + graph.add_edge(0,1) + graph.add_edge(1,2) + graph.add_edge(0,3) + graph.add_edge(3,4) + graph.add_edge(4,5) + graph.add_edge(5,1) + + has_cycle1 = has_cycle_dfs(graph) + has_cycle2 = has_cycle_using_disjoint_set(graph) + print(str(has_cycle1) + " " + str(has_cycle2)) + diff --git a/showmecode_100/python/graph/dijkstrashortestpath.py b/showmecode_100/python/graph/dijkstrashortestpath.py new file mode 100644 index 00000000..b07bfed9 --- /dev/null +++ b/showmecode_100/python/graph/dijkstrashortestpath.py @@ -0,0 +1,61 @@ +#dijkstra's algorithm + +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/DijkstraShortestPath.java + +from priorityqueue import PriorityQueue +from graph import Graph +import sys + + +def shortest_path(graph, sourceVertex): + + min_heap = PriorityQueue(True) + distance = {} + parent = {} + + for vertex in graph.all_vertex.values(): + min_heap.add_task(sys.maxsize, vertex) + + min_heap.change_task_priority(0, sourceVertex) + distance[sourceVertex] = 0 + parent[sourceVertex] = None + + while min_heap.is_empty() is False: + task = min_heap.peek_task() + weight = min_heap.get_task_priority(task) + current = min_heap.pop_task() + distance[current] = weight + + for edge in current.edges: + adjacent = get_other_vertex_for_edge(current, edge) + if min_heap.contains_task(adjacent) is False: + continue + + new_distance = distance[current] + edge.weight; + if min_heap.get_task_priority(adjacent) > new_distance: + min_heap.change_task_priority(new_distance, adjacent) + parent[adjacent] = current + + + return distance + + +def get_other_vertex_for_edge(vertex, edge): + if edge.vertex1.id == vertex.id: + return edge.vertex2 + else: + return edge.vertex1 + + +if __name__ == '__main__': + graph = Graph(False) + graph.add_edge(1,2,5) + graph.add_edge(2,3,2) + graph.add_edge(1,4,9) + graph.add_edge(1,5,3) + graph.add_edge(5,6,2) + graph.add_edge(6,4,2) + graph.add_edge(3,4,3) + + distance = shortest_path(graph, graph.all_vertex[1]) + print(distance) diff --git a/showmecode_100/python/graph/disjointset.py b/showmecode_100/python/graph/disjointset.py new file mode 100644 index 00000000..a357fc2e --- /dev/null +++ b/showmecode_100/python/graph/disjointset.py @@ -0,0 +1,77 @@ +# disjoint sets +# https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/DisjointSet.java + +class Node(object): + + def __init__(self, data, parent = None, rank = 0): + self.data = data + self.parent = parent + self.rank = rank + + def __str__(self): + return str(self.data) + + def __repr__(self): + return self.__str__() + + +class DisjointSet(object): + + def __init__(self): + self.map = {} + + def make_set(self, data): + node = Node(data) + node.parent = node + self.map[data] = node + + def union(self, data1, data2): + node1 = self.map[data1] + node2 = self.map[data2] + + parent1 = self.find_set_util(node1) + parent2 = self.find_set_util(node2) + + if parent1.data == parent2.data: + return + + if parent1.rank >= parent2.rank: + if parent1.rank == parent2.rank: + parent1.rank = parent1.rank + 1 + parent2.parent = parent1 + else: + parent1.parent = parent2 + + def find_set(self, data): + return self.find_set_util(self.map[data]) + + def find_set_util(self, node): + parent = node.parent + if parent == node: + return parent + node.parent = self.find_set_util(node.parent) + return node.parent + +if __name__ == '__main__': + ds = DisjointSet() + ds.make_set(1) + ds.make_set(2) + ds.make_set(3) + ds.make_set(4) + ds.make_set(5) + ds.make_set(6) + ds.make_set(7) + + ds.union(1,2) + ds.union(2,3) + ds.union(4,5) + ds.union(6,7) + ds.union(5,6) + ds.union(3,7) + + for i in range(1,8): + print(ds.find_set(i)) + + + + diff --git a/showmecode_100/python/graph/floydwarshall.py b/showmecode_100/python/graph/floydwarshall.py new file mode 100644 index 00000000..0eb29f7e --- /dev/null +++ b/showmecode_100/python/graph/floydwarshall.py @@ -0,0 +1,72 @@ +# floyd warshall all pair shortest path +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/FloydWarshallAllPairShortestPath.java +import sys + +INF = 1000000 + +class NegativeWeightCycleException(Exception): + def __init__(self): + pass + +def all_pair_shortest_path(distance_matrix): + + size = len(distance_matrix) + distance = [[0 for x in range(size)] + for x in range (size)] + + path = [[0 for x in range(size)] + for x in range (size)] + + for i in range(size): + for j in range(size): + distance[i][j] = distance_matrix[i][j] + if distance_matrix[i][j] != INF and i != j: + path[i][j] = i + else: + path[i][j] = -1 + + + for k in range(size): + for i in range(size): + for j in range(size): + if distance[i][k] == INF or distance[k][j] == INF: + continue + if distance[i][j] > distance[i][k] + distance[k][j]: + distance[i][j] = distance[i][k] + distance[k][j] + path[i][j] = path[k][j] + + for i in range(size): + if distance[i][i] < 0: + raise NegativeWeightCycleException() + + print_path(path, 3, 2) + return (distance, path) + +def print_path(path, start, end): + stack = [] + stack.append(end) + while True: + end = path[start][end] + if end == -1: + return + stack.append(end) + if end == start: + break + + print(stack[::-1]) + +if __name__ == '__main__': + + distance_matrix = [[0, 3, 6, 15], + [INF, 0, -2, INF], + [INF, INF, 0, 2], + [1, INF, INF, 0]] + + distance, path = all_pair_shortest_path(distance_matrix) + + print(distance) + #print(path) + + + + diff --git a/showmecode_100/python/graph/fordfulkerson.py b/showmecode_100/python/graph/fordfulkerson.py new file mode 100644 index 00000000..20ea22bc --- /dev/null +++ b/showmecode_100/python/graph/fordfulkerson.py @@ -0,0 +1,67 @@ +#ford fulkerson method Edomonds Karp algorithm for finding max flow +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/FordFulkerson.java +from queue import Queue +import sys + +def max_flow(capacity, source, sink): + residual_capacity = [x[:] for x in capacity] + augmented_paths = [] + max_flow = 0 + while True: + found_augmented_path, parent = bfs(residual_capacity, source, sink) + if not found_augmented_path: + break + augmented_path = [] + v = sink + flow = sys.maxsize + while not v == source: + augmented_path.append(v) + u = parent[v] + if flow > residual_capacity[u][v]: + flow = residual_capacity[u][v] + v = u + augmented_path.append(source) + augmented_paths.append(augmented_path[::-1]) + max_flow += flow + + v = sink + while not v == source: + u = parent[v] + residual_capacity[u][v] -= flow + residual_capacity[v][u] += flow + v = u + + print("Augmented path") + print(augmented_paths) + return max_flow + +def bfs(residual_capacity, source, sink): + visited = set() + queue = Queue() + parent = {} + queue.put(source) + visited.add(source) + found_augmented_path = False + while not queue.empty(): + u = queue.get() + for v in range(len(residual_capacity)): + if v not in visited and residual_capacity[u][v] > 0: + parent[v] = u + visited.add(v) + queue.put(v) + if v == sink: + found_augmented_path = True + break; + return found_augmented_path, parent + +if __name__ == '__main__': + capacity = [[0, 3, 0, 3, 0, 0, 0], + [0, 0, 4, 0, 0, 0, 0], + [3, 0, 0, 1, 2, 0, 0], + [0, 0, 0, 0, 2, 6, 0], + [0, 1, 0, 0, 0, 0, 1], + [0, 0, 0, 0, 0, 0, 9], + [0, 0, 0, 0, 0, 0, 0]] + + max_val = max_flow(capacity, 0, 6) + print(max_val) diff --git a/showmecode_100/python/graph/graph.py b/showmecode_100/python/graph/graph.py new file mode 100644 index 00000000..6ddea31f --- /dev/null +++ b/showmecode_100/python/graph/graph.py @@ -0,0 +1,96 @@ +#Graph class +# Java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/Graph.java + +class Graph(object): + + def __init__(self, is_directed): + self.all_edges = [] + self.all_vertex = {} + self.is_directed = is_directed + + def add_edge(self, id1, id2, weight=0): + if id1 in self.all_vertex: + vertex1 = self.all_vertex[id1] + else: + vertex1 = Vertex(id1) + self.all_vertex[id1] = vertex1 + + if id2 in self.all_vertex: + vertex2 = self.all_vertex[id2] + else: + vertex2 = Vertex(id2) + self.all_vertex[id2] = vertex2 + + edge = Edge(vertex1, vertex2, self.is_directed, weight) + self.all_edges.append(edge) + vertex1.add_adjacent_vertex(edge, vertex2) + if self.is_directed is not True: + vertex2.add_adjacent_vertex(edge,vertex1) + + +class Edge(object): + + def __init__(self, vertex1, vertex2, is_directed, weight): + self.vertex1 = vertex1 + self.vertex2 = vertex2 + self.is_directed = is_directed + self.weight = weight + + def __eq__(self, other): + return self.vertex1.id == other.vertex1.id and self.vertex2.id == other.vertex2.id + + def __hash(self): + return hash(vertex1) + hash(vertex2) + + def __str__(self): + return "Edge " + str(self.vertex1) + " " + str(self.vertex2) + " Weight-" + str(self.weight) + + def __repr__(self): + return self.__str__() + +class Vertex(object): + + def __init__(self, id): + self.id = id; + self.edges = [] + self.adjacent_vertices = [] + + def add_adjacent_vertex(self, edge, vertex): + self.edges.append(edge) + self.adjacent_vertices.append(vertex) + + def get_degree(self): + return len(self.edges) + + def __eq__(self, other): + return self.id == other.id + + def __hash__(self): + return hash(self.id) + + def __str__(self): + return str("Vertex-" + str(self.id)) + + def __repr__(self): + return self.__str__(); + + def __lt__(self, other): + return self.id < other.id + + def __gt__(self, other): + return self.id > other.id + +if __name__ == '__main__': + g = Graph(False) + g.add_edge(1,2,10) + g.add_edge(2,3,5) + g.add_edge(1,4,6) + + for edge in g.all_edges: + print(edge) + + for vertex in g.all_vertex: + print("Vertex " + str(g.all_vertex[vertex])) + for edge in g.all_vertex[vertex].edges: + print("Edge " + str(edge)) + diff --git a/showmecode_100/python/graph/graphtraversal.py b/showmecode_100/python/graph/graphtraversal.py new file mode 100644 index 00000000..e6216fc2 --- /dev/null +++ b/showmecode_100/python/graph/graphtraversal.py @@ -0,0 +1,43 @@ +#doing BFS and DFS traversal of the graph +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/GraphTraversal.java + +from graph import * +import queue + +def dfs_util(v, visited): + if v in visited: + return + visited.add(v) + print(v) + for vertex in v.adjacent_vertices: + dfs_util(vertex, visited) + +def dfs(graph): + visited = set() + for id in graph.all_vertex: + dfs_util(graph.all_vertex[id], visited) + +def bfs(graph): + q = queue.Queue() + visited = set() + for vertex in graph.all_vertex.values(): + if vertex not in visited: + q.put(vertex) + visited.add(vertex) + while not q.empty(): + v = q.get(); + print(v) + for adj in v.adjacent_vertices: + if adj not in visited: + q.put(adj) + visited.add(adj) + + +if __name__ == '__main__': + g = Graph(False) + g.add_edge(1,2,10) + g.add_edge(2,3,5) + g.add_edge(1,4,6) + + dfs(g) + bfs(g) diff --git a/showmecode_100/python/graph/kruskalmst.py b/showmecode_100/python/graph/kruskalmst.py new file mode 100644 index 00000000..bcdeb875 --- /dev/null +++ b/showmecode_100/python/graph/kruskalmst.py @@ -0,0 +1,49 @@ +# kruskal minimum spanning tree +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/KruskalMST.java + +from disjointset import * +from graph import * + +def get_key(edge): + return edge.weight + +def minimum_spanning_tree(graph): + + disjoint_set = DisjointSet() + sorted_edges = sorted(graph.all_edges, key = get_key) + print(sorted_edges) + + for vertex in graph.all_vertex.values(): + disjoint_set.make_set(vertex.id) + + result_edge = [] + + for edge in sorted_edges: + root1 = disjoint_set.find_set(edge.vertex1.id) + root2 = disjoint_set.find_set(edge.vertex2.id) + + if root1 == root2: + continue + else: + result_edge.append(edge) + disjoint_set.union(edge.vertex1.id, edge.vertex2.id) + + return result_edge + +if __name__ == '__main__': + graph = Graph(False) + graph.add_edge(1,3,1) + graph.add_edge(1,2,4) + graph.add_edge(2,4,2) + graph.add_edge(2,5,1) + graph.add_edge(2,6,3) + graph.add_edge(3,4,5) + graph.add_edge(3,7,8) + graph.add_edge(4,7,2) + graph.add_edge(6,5,2) + graph.add_edge(6,4,3) + + result = minimum_spanning_tree(graph) + for edge in result: + print(edge) + diff --git a/showmecode_100/python/graph/primmst.py b/showmecode_100/python/graph/primmst.py new file mode 100644 index 00000000..2349f97c --- /dev/null +++ b/showmecode_100/python/graph/primmst.py @@ -0,0 +1,54 @@ +#Prim's MST +# Java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/PrimMST.java + +from graph import Graph +from priorityqueue import PriorityQueue +import sys + +def minimum_spanning_tree(graph): + + min_heap = PriorityQueue(True) + vertex_to_edge = {} + result = [] + + for vertex in graph.all_vertex.values(): + min_heap.add_task(sys.maxsize, vertex) + + start_vertex = next(iter((graph.all_vertex.values()))) + min_heap.change_task_priority(0, start_vertex) + while min_heap.is_empty() is False: + current = min_heap.pop_task() + + if(current in vertex_to_edge): + spanning_tree_edge = vertex_to_edge[current] + result.append(spanning_tree_edge) + + for edge in current.edges: + adjacent = get_other_vertex_for_edge(current, edge) + if min_heap.contains_task(adjacent) is True and min_heap.get_task_priority(adjacent) > edge.weight: + min_heap.change_task_priority(edge.weight, adjacent) + vertex_to_edge[adjacent] = edge + + return result + + +def get_other_vertex_for_edge(vertex, edge): + if edge.vertex1.id == vertex.id: + return edge.vertex2 + else: + return edge.vertex1 + +if __name__ == '__main__': + graph = Graph(False) + graph.add_edge(1,2,3) + graph.add_edge(2,3,1) + graph.add_edge(3,1,1) + graph.add_edge(1,4,1) + graph.add_edge(2,4,3) + graph.add_edge(4,5,6) + graph.add_edge(5,6,2) + graph.add_edge(3,5,5) + graph.add_edge(3,6,4) + + result = minimum_spanning_tree(graph) + print(result) diff --git a/showmecode_100/python/graph/priorityqueue.py b/showmecode_100/python/graph/priorityqueue.py new file mode 100644 index 00000000..6c55a056 --- /dev/null +++ b/showmecode_100/python/graph/priorityqueue.py @@ -0,0 +1,99 @@ +# add to heapq things like removing any item and changing key value +# implementation of priority queue to support contains, change_task_priority +# and remove_task in log time + +from heapq import * + +class PriorityQueue(object): + + def __init__(self, is_min_heap): + self.pq = [] + self.entry_finder = {} + if(is_min_heap is True): + self.mul = 1 + else : + self.mul = -1 + + def contains_task(self, task): + if task in self.entry_finder: + return True + else: + return False + + def get_task_priority(self, task): + if task in self.entry_finder: + return (self.entry_finder[task])[0] + raise ValueError("task does not exist") + + def add_task(self, priority, task): + if task in self.entry_finder: + raise KeyError("Key already exists") + entry = [self.mul*priority, False, task] + self.entry_finder[task] = entry + heappush(self.pq, entry) + + def change_task_priority(self, priority, task): + if task not in self.entry_finder: + raise KeyError("Task not found") + self.remove_task(task) + entry = [self.mul*priority, False, task] + self.entry_finder[task] = entry + heappush(self.pq, entry) + + def remove_task(self, task): + entry = self.entry_finder.pop(task) + entry[1] = True + + def pop_task(self): + while self.pq: + priority, removed, task = heappop(self.pq) + if removed is False: + del self.entry_finder[task] + return task + raise KeyError("pop from an empty priority queue") + + def peek_task(self): + while self.pq: + priority, removed, task = tuple(heappop(self.pq)) + if removed is False: + heappush(self.pq, [priority, False, task]) + return task + raise KeyError("pop from an empty priority queue") + + def is_empty(self): + try: + self.peek_task() + return False + except KeyError: + return True + + def __str__(self): + return str(self.entry_finder) + " " + str(self.pq) + + +if __name__ == '__main__': + task1 = "Tushar" + task2 = "Roy" + task3 = "is" + task4 = "coder" + + min_pq = PriorityQueue(True) + min_pq.add_task(1, task1) + min_pq.add_task(3, task2) + min_pq.add_task(6, task3) + min_pq.add_task(7, task4) + print(min_pq.contains_task(task3)) + print(min_pq.get_task_priority(task3)) + print(min_pq) + while min_pq.is_empty() is False: + print(min_pq.pop_task()) + + max_pq = PriorityQueue(False) + max_pq.add_task(1, task1) + max_pq.add_task(3, task2) + max_pq.add_task(6, task3) + max_pq.add_task(7, task4) + while max_pq.is_empty() is False: + print(max_pq.pop_task()) + + diff --git a/showmecode_100/python/graph/topologicalsort.py b/showmecode_100/python/graph/topologicalsort.py new file mode 100644 index 00000000..aeae012f --- /dev/null +++ b/showmecode_100/python/graph/topologicalsort.py @@ -0,0 +1,38 @@ +#topological sort +# java code https://github.com/mission-peace/interview/blob/master/src/com/interview/graph/TopologicalSort.java + +from graph import Graph + +def top_sort(graph): + stack = [] + visited = set() + for vertex in graph.all_vertex.values(): + if vertex in visited: + continue + top_sort_util(vertex, stack, visited) + return stack + +def top_sort_util(vertex, stack, visited): + visited.add(vertex) + for adjacent in vertex.adjacent_vertices: + if adjacent in visited: + continue + top_sort_util(adjacent, stack, visited) + stack.append(vertex) + +if __name__ == '__main__': + graph = Graph(True) + graph.add_edge(1,3) + graph.add_edge(1,2) + graph.add_edge(3,4) + graph.add_edge(5,6) + graph.add_edge(6,3) + graph.add_edge(3,8) + graph.add_edge(8,11) + + stack = top_sort(graph) + + print(stack[::-1]) + + + diff --git a/showmecode_100/python/recursion/setpairtogether.py b/showmecode_100/python/recursion/setpairtogether.py new file mode 100644 index 00000000..bcf5a1c9 --- /dev/null +++ b/showmecode_100/python/recursion/setpairtogether.py @@ -0,0 +1,54 @@ +# http://www.geeksforgeeks.org/minimum-number-of-swaps-required-for-arranging-pairs-adjacent-to-each-other/ + +def find_minimum_swaps(input, pair): + index = {} + for i, val in enumerate(input): + index[val] = i + return find_minimum_swaps_util(input, pair, index, 0) + +def find_minimum_swaps_util(input, pair, index, current): + if current == len(input): + return 0 + + v1 = input[current] + v2 = input[current + 1] + pv2 = pair[v1] + + if pv2 == v2: + return find_minimum_swaps_util(input, pair, index, current + 2) + else: + idx1 = index.get(v1) + idx2 = index.get(v2) + idx3 = index.get(pair[v1]) + idx4 = index.get(pair[v2]) + + swap(index, input, idx2, idx3) + val1 = find_minimum_swaps_util(input, pair, index, current+2) + swap(index, input, idx2, idx3) + + swap(index, input, idx1, idx4) + val2 = find_minimum_swaps_util(input, pair, index, current+2) + swap(index, input, idx1, idx4) + + return 1 + max(val1, val2) + + +def swap(index, input, i, j): + index[input[i]] = j + index[input[j]] = i + t = input[i] + input[i] = input[j] + input[j] = t + +if __name__ == '__main__': + input = [3, 5, 6, 4, 1, 2] + pair = {} + pair[1] = 3 + pair[3] = 1 + pair[2] = 6 + pair[6] = 2 + pair[4] = 5 + pair[5] = 4 + + print(find_minimum_swaps(input, pair)) + diff --git a/showmecode_100/python/recursion/stringpermutation.py b/showmecode_100/python/recursion/stringpermutation.py new file mode 100644 index 00000000..7e24e6d2 --- /dev/null +++ b/showmecode_100/python/recursion/stringpermutation.py @@ -0,0 +1,35 @@ +# string permutation in lexicographically order with repetition of characters in the string + +def permute(input): + count_map = {} + for ch in input: + if ch in count_map.keys(): + count_map[ch] = count_map[ch] + 1 + else: + count_map[ch] = 1 + + keys = sorted(count_map) + str = [] + count = [] + for key in keys: + str.append(key) + count.append(count_map[key]) + result = [0 for x in range(len(input))] + permute_util(str, count, result, 0) + +def permute_util(str, count, result, level): + if level == len(result): + print(result) + return + + for i in range(len(str)): + if count[i] == 0: + continue; + result[level] = str[i] + count[i] -= 1 + permute_util(str, count, result, level + 1) + count[i] += 1 + +if __name__ == '__main__': + input = ['B', 'C', 'A', 'A'] + permute(input) diff --git a/showmecode_100/python/string/Z_Algorithm.py b/showmecode_100/python/string/Z_Algorithm.py new file mode 100644 index 00000000..0a499641 --- /dev/null +++ b/showmecode_100/python/string/Z_Algorithm.py @@ -0,0 +1,54 @@ +#author: Pankaj Kumar + +#time complexity: O(length(string) + length(pattern)) + +#space complexity: O(length(string) + length(pattern)) + +#Link to theory: http://www.geeksforgeeks.org/z-algorithm-linear-time-pattern-searching-algorithm/ + +def z_algo(arr): + z = [0 for i in range(len(arr))] + left , right = 0 , 0 + for k in range(1 , len(arr)): + if k > right: + left = k + right = k + while right < len(arr) and arr[right] == arr[right-left]: + right += 1 + z[k] = right - left + right -= 1 + else: + k1 = k - left + if z[k1] < right - k + 1: + z[k] = z[k1] + else: + left = k + while right < len(arr) and arr[right] == arr[right-left]: + right += 1 + z[k] = right - left + right -= 1 + return z + + +def makepattern(string , pattern): + n , m = len(string) , len(pattern) + str_arr = [] + for i in range(m): + str_arr.append(pattern[i]) + str_arr.append('$') + for i in range(n): + str_arr.append(string[i]) + + z_values = z_algo(str_arr) + result = [] + for i in range(len(z_values)): + if z_values[i] == m: + result.append(i - m - 1) + print result + + + +if __name__ == '__main__': + string = 'abcdeabcd' + pattern = 'abc' + makepattern(string , pattern) diff --git a/showmecode_100/python/string/knuthmorrispratt.py b/showmecode_100/python/string/knuthmorrispratt.py new file mode 100644 index 00000000..657e2f50 --- /dev/null +++ b/showmecode_100/python/string/knuthmorrispratt.py @@ -0,0 +1,49 @@ +# Knuth-Morris-Pratt algorithm + + +# Compute temporary array to maintain size of suffix which is same as prefix +# Time/space complexity is O(size of pattern) +def compute_temporary_array(pattern): + n = len(pattern) + lsp = [0 for j in range(n)] + index = 0 + i = 1 + while i < len(pattern): + if pattern[i] == pattern[index]: + lsp[i] = index + 1 + index += 1 + i += 1 + else: + if index != 0: + index = lsp[index - 1] + else: + lsp[i] = 0 + i += 1 + return lsp + + +# KMP algorithm of pattern matching. +def kmp(text, pattern): + lsp = compute_temporary_array(pattern) + i = 0 + j = 0 + while i < len(text) and j < len(pattern): + if text[i] == pattern[j]: + i += 1 + j += 1 + else: + if j != 0: + j = lsp[j - 1] + else: + i += 1 + if j == len(pattern): + return True + else: + return False + +src = 'abcxabcdabcdabcy' +sub_string = 'abcdabcy' +result = kmp(src, sub_string) +print(result) + + diff --git a/showmecode_100/python/string/rabinkarp.py b/showmecode_100/python/string/rabinkarp.py new file mode 100644 index 00000000..fa2daf37 --- /dev/null +++ b/showmecode_100/python/string/rabinkarp.py @@ -0,0 +1,53 @@ +#Rabin Karp algorithm +# Java code https://github.com/mission-peace/interview/blob/master/src/com/interview/string/RabinKarpSearch.java + +prime = 101 +def pattern_matching(text, pattern): + m = len(pattern) + n = len(text) + pattern_hash = create_hash(pattern, m - 1) + text_hash = create_hash(text, m - 1) + + for i in range(1, n - m + 2): + if pattern_hash == text_hash: + if check_equal(text[i-1:i+m-1], pattern[0:]) is True: + return i - 1; + if i < n - m + 1: + text_hash = recalculate_hash(text, i-1, i+m-1, text_hash, m) + return -1; + +def check_equal(str1, str2): + if len(str1) != len(str2): + return False; + i = 0 + j = 0 + for i, j in zip(str1, str2): + if i != j: + return False; + return True + +def create_hash(input, end): + hash = 0 + for i in range(end + 1): + hash = hash + ord(input[i])*pow(prime, i) + return hash + +def recalculate_hash(input, old_index, new_index, old_hash, pattern_len): + new_hash = old_hash - ord(input[old_index]) + new_hash = new_hash/prime + new_hash += ord(input[new_index])*pow(prime, pattern_len - 1) + return new_hash; + + +index = pattern_matching("TusharRoy", "sharRoy") +print("Index ", index) +index = pattern_matching("TusharRoy", "Roy") +print("Index ", index) +index = pattern_matching("TusharRoy", "shar") +print("Index ", index) +index = pattern_matching("TusharRoy", "usha") +print("Index ", index) +index = pattern_matching("TusharRoy", "Tus") +print("Index ", index) +index = pattern_matching("TusharRoy", "Roa") +print("Index ", index) diff --git a/showmecode_100/python/tree/binary_tree.py b/showmecode_100/python/tree/binary_tree.py new file mode 100644 index 00000000..ef94c322 --- /dev/null +++ b/showmecode_100/python/tree/binary_tree.py @@ -0,0 +1,56 @@ +from collections import namedtuple + +Color = namedtuple("Color", "RED BLACK") + + +class Node: + def __init__(self): + self.color = None + self.height = None + self.lis = None + self.data = None + self.size = None + self.next = None + self.right = None + self.left = None + + @staticmethod + def newNode(data): + n = Node() + n.data = data + n.lis = -1 + n.height = 1 + n.size = 1 + n.color = Color.RED + return n + + +class BinaryTree: + + def __init__(self): + pass + + @staticmethod + def add_head(data, head): + temp_head = head + n = Node.newNode(data) + + if head is None: + head = n + return head + + prev = None + + while head is not None: + prev = head + if head.data < data: + head = head.right + else: + head = head.left + + if prev.data < data: + prev.right = n + else: + prev.left = n + + return temp_head diff --git a/showmecode_100/python/tree/construct_tree_from_inorder_preorder.py b/showmecode_100/python/tree/construct_tree_from_inorder_preorder.py new file mode 100644 index 00000000..735d2718 --- /dev/null +++ b/showmecode_100/python/tree/construct_tree_from_inorder_preorder.py @@ -0,0 +1,23 @@ +from binary_tree import Node + + +class ConstructTreeFromInorderPreOrder: + def __init__(self): + self.index = 0 + + def _createTree(self, inorder, preorder, start, end): + if start > end: + return None + i = 0 + for i in range(start, end + 1): + if preorder[self.index] == inorder[i]: + break + + node = Node.newNode(preorder[self.index]) + self.index += 1 + node.left = self._createTree(inorder, preorder, start, i - 1) + node.right = self._createTree(inorder, preorder, i + 1, end) + return node + + def createTree(self, inorder, preorder): + return self._createTree(inorder, preorder, 0, len(inorder) - 1) diff --git a/showmecode_100/python/tree/fenwick_tree.py b/showmecode_100/python/tree/fenwick_tree.py new file mode 100644 index 00000000..794610ad --- /dev/null +++ b/showmecode_100/python/tree/fenwick_tree.py @@ -0,0 +1,54 @@ +################################################################################################################################# +#Implementation of Binary Indexed Tree OR Fenwick Tree +#Time Complexities: +# Construction of Tree: O (n.log (n)) +# Updating an element: O (log (n)) +# Prefix Query (sum of elements 0 to i) or Range Minimum Query (sum of elements x to y): O (log (n)) +#Space Complexity: O (n) +################################################################################################################################# + +class FenTree (object): + def __init__ (self, array): + self.array, self.tree = [0] * len (array), [0] * (len (array) + 1); + for i in range (len (array)): + self.update (i, array [i]); + + def get_parent (self, child): + return (child - (child & -child)); + + def get_next (self, index): + return (index + (index & -index)); + + def update (self, index, item): + current, self.array [index] = self.array [index], item; + item -= current; + index += 1; + while (index <= len (self.array)): + self.tree [index] += item; + index = self.get_next (index); + + def prefix_sum (self, index): + index += 1; + total = 0; + while (index > 0): + total += self.tree [index]; + index = self.get_parent (index); + return (total); + + def range_sum (self, x, y): + return (self.prefix_sum (max (x, y)) - self.prefix_sum (min (x, y) - 1)); + + def describe (self): + print ('ARRAY =>\t', self.array); + print ('Binary Indexed Tree =>\t', self.tree); + +if (__name__ == '__main__'): + tree = FenTree ([3,2,-1,6,5,4]); +# tree = FenTree ([int (i) for i in input ('Enter the array (space-separated integers): ').split ()]); + tree.describe (); + + tree.update (4, 8); #replaces 5 with 8 in the list given to the fenwick tree + tree.describe (); + + print (tree.range_sum (1, 5)); #returns 2-1+6+5+4 + print (tree.prefix_sum (5)); #returns 3+2-1+6+5+4 diff --git a/showmecode_100/python/tree/largest_bst_in_binary_tree.py b/showmecode_100/python/tree/largest_bst_in_binary_tree.py new file mode 100644 index 00000000..ecf780a7 --- /dev/null +++ b/showmecode_100/python/tree/largest_bst_in_binary_tree.py @@ -0,0 +1,73 @@ +""" Given a binary tree, find size of largest binary search subtree in this binary tree. + +Approach +-------- + +Traverse tree in post order fashion. Left and right nodes return 4 piece of information to root which isBST, size of max +BST, min and max in those subtree. + +If both left and right subtree are BST and this node data is greater than max of left and less than min of right then it +returns to above level left size + right size + 1 and new min will be min of left side and new max will be max of right +side. + +Video link +---------- +* https://youtu.be/4fiDs7CCxkc + +References +---------- +* http://www.geeksforgeeks.org/find-the-largest-subtree-in-a-tree-that-is-also-a-bst/ +* https://leetcode.com/problems/largest-bst-subtree/ +* http://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/ +""" + +from construct_tree_from_inorder_preorder import ConstructTreeFromInorderPreOrder + +class MinMax: + + def __init__(self): + self.min = float("inf") + self.max = float("-inf") + self.isBST = True + self.size = 0 + + +class LargestBSTBinaryTree: + + def largestBST(self, root): + m = self.largest(root) + return m.size + + def largest(self, root): + + if root is None: + return MinMax() + + leftMinMax = self.largest(root.left) + rightMinMax = self.largest(root.right) + + m = MinMax() + + if ((leftMinMax.isBST == False or rightMinMax.isBST == False) + or (leftMinMax.max > root.data or rightMinMax.min <= root.data)): + + m.isBST = False + m.size = max(leftMinMax.size, rightMinMax.size) + return m + + m.isBST = True + m.size = leftMinMax.size + rightMinMax.size + 1 + m.min = leftMinMax.min if root.left is not None else root.data + m.max = rightMinMax.max if root.right is not None else root.data + return m + + +if __name__ == '__main__': + lbi = LargestBSTBinaryTree() + ctf = ConstructTreeFromInorderPreOrder() + inorder = [-7, -6, -5, -4, -3, -2, 1, 2, 3, 16, 6, 10, 11, 12, 14] + preorder = [3, -2, -3, -4, -5, -6, -7, 1, 2, 16, 10, 6, 12, 11, 14] + root = ctf.createTree(inorder, preorder) + largestBSTSize = lbi.largestBST(root) + print "Size of the largest BST in the Binary Tree is ", largestBSTSize + assert 8 == lbi.largestBST(root) diff --git a/showmecode_100/python/tree/max_depth_binary_tree.py b/showmecode_100/python/tree/max_depth_binary_tree.py new file mode 100644 index 00000000..98a986df --- /dev/null +++ b/showmecode_100/python/tree/max_depth_binary_tree.py @@ -0,0 +1,54 @@ +""" +Problem Statement +================= + +Given a binary tree, write a program to find the maximum depth at any given node. + +For e.g, for this binary tree. + + 1 + / \ +2 3 + / \ + 4 5 + +The height at 1 is 3, and the height at 3 is 2. + +""" + +class Node: + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + +n1 = Node(1) +n2 = Node(2) +n3 = Node(3) +n4 = Node(4) +n5 = Node(5) + +# construct the tree as given in the problem. + +n1.left = n2 +n1.right = n3 +n3.left = n4 +n3.right = n5 + + +def find_max_depth(n): + if n is None: + return 0 + left_height = find_max_depth(n.left) + right_height = find_max_depth(n.right) + if left_height > right_height: + result = left_height + 1 + else: + result = right_height + 1 + return result + + +if __name__ == '__main__': + assert 3 == find_max_depth(n1) + assert 2 == find_max_depth(n3) diff --git a/showmecode_100/python/tree/morris_traversal.py b/showmecode_100/python/tree/morris_traversal.py new file mode 100644 index 00000000..90638238 --- /dev/null +++ b/showmecode_100/python/tree/morris_traversal.py @@ -0,0 +1,82 @@ +"""Morris Traversal of a Binary Tree. + +Video +----- + +* https://youtu.be/wGXB9OWhPTg + +Analysis +-------- + +* Time complexity O(n) +* Space complexity O(1) + +""" + +from binary_tree import BinaryTree + + +class MorrisTraversal: + + def __init__(self): + pass + + @staticmethod + def find_predecessor(current): + predecessor = current.left + while predecessor.right != current and predecessor.right is not None: + predecessor = predecessor.right + return predecessor + + @staticmethod + def inorder(root_node): + current = root_node + while current is not None: + if current.left is None: + print "{data} ".format(data=current.data), + current = current.right + else: + predecessor = MorrisTraversal.find_predecessor(current) + + if predecessor.right is None: + predecessor.right = current + current = current.left + else: + predecessor.right = None + print "{data} ".format(data=current.data), + current = current.right + + @staticmethod + def preorder(root_node): + current = root_node + while current is not None: + if current.left is None: + print "{data} ".format(data=current.data), + current = current.right + else: + predecessor = MorrisTraversal.find_predecessor(current) + + if predecessor.right is None: + print "{data} ".format(data=current.data), + predecessor.right = current + current = current.left + else: + predecessor.right = None + current = current.right + + +if __name__ == '__main__': + bt = BinaryTree() + root = None + root = bt.add_head(10, root) + root = bt.add_head(50, root) + root = bt.add_head(-10, root) + root = bt.add_head(7, root) + root = bt.add_head(9, root) + root = bt.add_head(-20, root) + root = bt.add_head(30, root) + + mt = MorrisTraversal() + mt.inorder(root) + print "\n", + mt.preorder(root) diff --git a/showmecode_100/python/tree/segmenttreesum.py b/showmecode_100/python/tree/segmenttreesum.py new file mode 100644 index 00000000..be7b524e --- /dev/null +++ b/showmecode_100/python/tree/segmenttreesum.py @@ -0,0 +1,68 @@ +def create_segment_tree(input): + size = next_power_of_2(len(input)); + segment_tree = [0 for x in range(2*size - 1)] + construct_tree(segment_tree, input, 0, len(input) - 1, 0) + return segment_tree + +def construct_tree(segment_tree, input, low, high, pos): + if low == high: + segment_tree[pos] = input[low] + return + + mid = (low + high)/2 + construct_tree(segment_tree, input, low, mid, 2*pos + 1) + construct_tree(segment_tree, input, mid + 1, high, 2*pos + 2) + segment_tree[pos] = segment_tree[2*pos+1] + segment_tree[2*pos+2] + +def sum_range_query(segment_tree, q_low, q_high, len): + return sum_range_query_util(segment_tree, 0, len - 1, q_low, q_high, 0) + +def sum_range_query_util(segment_tree, low, high, q_low, q_high, pos): + if q_low <= low and q_high >= high: + return segment_tree[pos] + + if q_high < low or q_low > high: + return 0 + + mid = (low + high)/2 + return sum_range_query_util(segment_tree, low, mid, q_low, q_high, 2*pos + 1)\ + + sum_range_query_util(segment_tree, mid + 1, high, q_low, q_high, 2*pos + 2) + +def update_value(input, segment_tree, new_value, index): + diff = new_value - input[index] + input[index] = new_value + update_value_util(segment_tree, 0, len(input)-1, diff, index, 0) + +def update_value_util(segment_tree, low, high, diff, index, pos): + if low > index or high < index: + return + segment_tree[pos] += diff + + if low >= high: + return + mid = (low + high)/2 + update_value_util(segment_tree, low, mid, diff, index, 2*pos + 1) + update_value_util(segment_tree, mid + 1, high, diff, index, 2*pos + 2) + + +def next_power_of_2(n): + if n == 0: + return 1 + if n & (n - 1) == 0: + return n + while n & (n - 1) > 0: + n &= (n - 1) + + return n << 1 + +if __name__ == '__main__': + input = [1,3,5,7,9,11] + segment_tree = create_segment_tree(input) + print(segment_tree) + print(sum_range_query(segment_tree, 2, 5, len(input))) + print(sum_range_query(segment_tree, 1, 3, len(input))) + update_value(input, segment_tree, 4, 3) + print(sum_range_query(segment_tree, 2, 5, len(input))) + print(sum_range_query(segment_tree, 1, 3, len(input))) + + diff --git a/website/.vuepress/config.js b/website/.vuepress/config.js deleted file mode 100644 index 4996ec52..00000000 --- a/website/.vuepress/config.js +++ /dev/null @@ -1,35 +0,0 @@ -module.exports = { - title: "小浩算法", - plugins: [require('../../lib/autobar.js'), require('../../lib/Notification.js')], - description: '和小浩一起学算法', - // root : "./hell-algorithm", - theme: "reco", - themeConfig: { - sidebar: "auto", - searchPlaceholder: "搜索:KMP", - nav: [ - {text: 'GitHub', link: 'https://github.com/geekxh/hello-algorithm', icon: 'reco-github'} - ], - head:[ - ['link',{rel:'shortcut icon',href:'/favicon.ico'}] - ], - type: 'blog', - search: true, - searchMaxSuggestions: 10, - lastUpdated: '文章修订于', - author: '程序员小浩', - authorAvatar: '/code.png', - startYear: '2019', - valineConfig: { - placeholder: "留下你的问题,或者你想要的资源...", - avatar: "wavatar", - requiredFields: ['nick'], - appId: 'sINkW5sfpPxoqDyBqbpvTN79-gzGzoHsz', - appKey: '5tkDVulRNyjuAbCUekxU6zHW', - }, - noFoundPageByTencent: false - }, - markdown: { - lineNumbers: true, - } -} \ No newline at end of file diff --git a/website/.vuepress/public/1.gif b/website/.vuepress/public/1.gif deleted file mode 100644 index fedbb863..00000000 Binary files a/website/.vuepress/public/1.gif and /dev/null differ diff --git a/website/.vuepress/public/avatar.png b/website/.vuepress/public/avatar.png deleted file mode 100644 index 589db88f..00000000 Binary files a/website/.vuepress/public/avatar.png and /dev/null differ diff --git a/website/.vuepress/public/book.png b/website/.vuepress/public/book.png deleted file mode 100644 index d618cb0e..00000000 Binary files a/website/.vuepress/public/book.png and /dev/null differ diff --git a/website/.vuepress/public/code-2.jpg b/website/.vuepress/public/code-2.jpg deleted file mode 100644 index be466d72..00000000 Binary files a/website/.vuepress/public/code-2.jpg and /dev/null differ diff --git a/website/.vuepress/public/code-3.png b/website/.vuepress/public/code-3.png deleted file mode 100644 index 48592707..00000000 Binary files a/website/.vuepress/public/code-3.png and /dev/null differ diff --git a/website/.vuepress/public/code.jpeg b/website/.vuepress/public/code.jpeg deleted file mode 100644 index 14bab389..00000000 Binary files a/website/.vuepress/public/code.jpeg and /dev/null differ diff --git a/website/.vuepress/public/code.png b/website/.vuepress/public/code.png deleted file mode 100644 index 14bab389..00000000 Binary files a/website/.vuepress/public/code.png and /dev/null differ diff --git a/website/.vuepress/public/contact.jpeg b/website/.vuepress/public/contact.jpeg deleted file mode 100644 index ce2f3dbf..00000000 Binary files a/website/.vuepress/public/contact.jpeg and /dev/null differ diff --git a/website/.vuepress/public/daotu-1.png b/website/.vuepress/public/daotu-1.png deleted file mode 100644 index 77974f64..00000000 Binary files a/website/.vuepress/public/daotu-1.png and /dev/null differ diff --git a/website/.vuepress/public/daotu-2.png b/website/.vuepress/public/daotu-2.png deleted file mode 100644 index c65b7f63..00000000 Binary files a/website/.vuepress/public/daotu-2.png and /dev/null differ diff --git a/website/.vuepress/public/demo-1.png b/website/.vuepress/public/demo-1.png deleted file mode 100644 index c65b7f63..00000000 Binary files a/website/.vuepress/public/demo-1.png and /dev/null differ diff --git a/website/.vuepress/public/demo-2.png b/website/.vuepress/public/demo-2.png deleted file mode 100644 index da88e99a..00000000 Binary files a/website/.vuepress/public/demo-2.png and /dev/null differ diff --git a/website/.vuepress/public/demo.png b/website/.vuepress/public/demo.png deleted file mode 100644 index 550093fd..00000000 Binary files a/website/.vuepress/public/demo.png and /dev/null differ diff --git a/website/.vuepress/public/favicon.ico b/website/.vuepress/public/favicon.ico deleted file mode 100755 index 2582fc5c..00000000 Binary files a/website/.vuepress/public/favicon.ico and /dev/null differ diff --git a/website/.vuepress/public/img.png b/website/.vuepress/public/img.png deleted file mode 100644 index f4f1e1dd..00000000 Binary files a/website/.vuepress/public/img.png and /dev/null differ diff --git a/website/.vuepress/public/img2.png b/website/.vuepress/public/img2.png deleted file mode 100644 index 263b6bbb..00000000 Binary files a/website/.vuepress/public/img2.png and /dev/null differ diff --git a/website/.vuepress/public/mark.png b/website/.vuepress/public/mark.png deleted file mode 100644 index a1fd0c96..00000000 Binary files a/website/.vuepress/public/mark.png and /dev/null differ diff --git a/website/.vuepress/public/suggest.jpeg b/website/.vuepress/public/suggest.jpeg deleted file mode 100644 index f4022145..00000000 Binary files a/website/.vuepress/public/suggest.jpeg and /dev/null differ diff --git a/website/.vuepress/styles/palette.styl b/website/.vuepress/styles/palette.styl deleted file mode 100644 index 36b7a734..00000000 --- a/website/.vuepress/styles/palette.styl +++ /dev/null @@ -1,15 +0,0 @@ -// 默认值 -$accentColor = #0074af // 主题颜色 -$textColor = #2c3e50 // 文本颜色 -$borderColor = #eaecef // 边框线颜色 -$codeBgColor = #282c34 // 代码块背景色 -$backgroundColor = #ffffff // 悬浮块背景色 - - -.navbar .logo { - height: 2.2rem; - min-width: 2.2rem; - margin-right: 0.8rem; - vertical-align: top; - border-radius: 0%; -} \ No newline at end of file diff --git a/website/.vuepress/tags/README.md b/website/.vuepress/tags/README.md deleted file mode 100644 index 45c5a70f..00000000 --- a/website/.vuepress/tags/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -isTags: true -sidebar: false -isComment: false ---- - -## tag cloud \ No newline at end of file diff --git "a/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/01.md" "b/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/01.md" deleted file mode 100644 index 5118a355..00000000 --- "a/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/01.md" +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: 小浩算法 ---- - - - -小浩算法是我在疫情期间完成的一部图解算法题典!目前共完成 105道 -高频面试算法题目,全部采用漫画图解的方式。该教程目前共有 11w 人阅读。 -面向 算法小白初中阶读者。所有代码均在 leetcode 上测试运行,可以直接右上角搜索题号。 - -::: danger 重要 -目前该教程全部免费,正因如此被一些不良商家拿去卖钱! 所以我把全部的内容都同步到了 [github](https://github.com/geekxh/hello-algorithm -),希望大家可以帮我点一个 star,防止有更多的人上当受骗! 小浩感激不尽! -::: - -*** - -为了提高大家的学习效率,我做了两件事: - -1、首先创建了万人刷题群,群里无广告,不套路。下方扫码回复【进群】 即可。 - -2、同时我把自己写的所有内容整理成了一本电子书。下方扫码回复【999】 下载。 - -

JPEG
\ No newline at end of file diff --git "a/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/02.md" "b/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/02.md" deleted file mode 100644 index 0a88d00b..00000000 --- "a/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/02.md" +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: 阅读指南 ---- - -## 为什么要做这样的一个算法图解合集 - -网上的算法教程杂乱且分散,质量层次不齐,浪费了大家大量宝贵的时间。很多题解,在我掌握题目后去看都费劲,更何况对于一些初学者。 - -## 本教程阅读门槛 - -本教程基本没有学习门槛。因为在每道题目中,我都会尽量去串基础知识,以达到学以致用的效果。 - -## 学完本教程期望达到什么样的目的 - -- 掌握基本的数据结构与算法 -- 掌握各类型高频面试算法题 - -## 本教程有何特色 - -每一道算法题都配有完整图解!仅此一家! - -## 题解是围绕什么编写的 - -掌握!所有的题解都以掌握二字为前提。不会追求过多的奇淫技巧,毕竟我们不是专门研究算法的人。我见过太多算法初学者,一个题解看不懂,转头又去看第二个题解,第二个看不懂,又去看第三个,直到最后放弃掉。浪费了时间,题目还是不会做,这图什么呢?所以本教程所有的题解都是以掌握为目标,尽量把每一道题的思路都讲的明明白白的。 - -## 题解是否严谨 - -绝对严谨,所有的题解都在leetcode上进行过测试运行。 - -## 没学过 java、go 是否可以学习 - -当然可以。我期望大家更多的是去关注算法的本身,而不是语言层面的东西。所以本教程,其实各语言都会使用一些,并不局限于 java、go。但是,我绝对不会使用任何语法特性!我希望大家不要被语言所束缚! - -## 是否可以按照本教程顺序来刷题 - -当然可以。一般刷题我们有两种策略,一种就是刷 leetcode 前一百道题目,另一种就是根据分类刷题。刷 leetcode 前一百道题,是因为这些题目都是经典题目。而根据分类,更适合算法小白和初中阶段读者。所以我在这里选择了根据分类来汇编,这样我们还可以在做一些题目的时候,与前面同类型的题目进行比较。 - -## 这些题目刷完能达到什么效果 - -刷完再说! - -## 你需要做什么 - -开干!奥利给! - -## 看完题目还是不懂怎么办? - -下方扫码,加我微信,我拉你到刷题群。和大家一起交流学习!(备注:进群) - -PNG \ No newline at end of file diff --git "a/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/03.md" "b/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/03.md" deleted file mode 100644 index 9e4333ea..00000000 --- "a/website/0.0.\345\255\246\344\271\240\351\241\273\347\237\245/03.md" +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: 资源下载 ---- - -::: danger 重要 - -有一件事想额外告诉大家,我自己写的教程目前是全部免费的,但是近日我发现有人把我的教程拿去贩卖。 -正因如此, 我将我的内容全部放在 github 免费公开,希望大家可以进去帮我点一个 star ,支持一下,也防止有更多的人上当受骗!小浩感激不尽! - -[点这里支持](https://github.com/geekxh/hello-algorithm) -::: -::: tip -[点击即可下载我写的电子书:mx48 (希望下方扫码支持一下,谢谢)](https://pan.baidu.com/s/1Gb8m42Aktl3HYqI5HRmEow) - -扫码回复【999】,下载我整理的 40 张高清思维导图。 - -扫码回复【进群】,加入万人刷题群,群内可 BAT 内推。 - -扫码回复【面试】,下载 BAT 面试汇总题目。 -::: - -
JPEG
- -思维导图展示(扫码获取): - -
JPEG
- - - -我写的电子书展示(扫码获取): - -
JPEG
- diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/021.md" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/021.md" deleted file mode 100644 index 9ddad471..00000000 --- "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/021.md" +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: 指导学习(一) -date: 2020-07-01 ---- - -> 我自己有个很喜欢的话,叫做 “练习 - 坚持 - 总结 - 提高”,我们已经练习了 70 天,如果不进行一些问题的总结,永远只低头看路,恐怕就会迷路。所以今儿咱们不讲算法题,而是讲一讲到底如何“解决问题”,本文**非常非常非常重要**,是我很长一段时间的心血与积累,大家一定要耐心看完,共包含3节: -> -> - 算法对个人的意义 -> - 解决问题的策略 -> - 算法问题汇总 - -
- -## 01、算法对个人的意义 - -> 在实际项目中,算法的使用场景有很多,如“Java8中Hashmap使用红黑树来实现”、“Redis底层使用LRU来进做淘汰策略”、“大数据领域很多问题都基于TopK”、“JS原型链里使了类似链表的成环检测”、“特别复杂的业务逻辑经常涉及到DAG”、“MySql为什么索引要用B+树”、“Oracle里的开窗函数如何实现” 等等等等,这些今天我们统统不谈。而我,更多的是想和大家聊一聊,算法对个人有什么意义? - -
- -市面上大部分的算法书籍,第一章介绍算法,都会给大家列一列类似上面的那些话,或者就是使用栈或队列来做一个引子,告诉大家算法很重要,你得需要去学,吧啦吧啦....但是不知道大家有没有想过这样一个问题,算法对于个人而言到底有什么意义呢?如果这个问题大家陌生,那你一定会听到有写了几年业务逻辑的老程序员,说过“我这些年从来没有用过算法,除了出去面试的时候”之类的话。其实,我这里真想说一句脏话,这些思想真的是TMD害人不浅啊。甚至我怀疑大多数说这句话本身的人,有两种:一种就是严重缺乏自信心,觉得自己一辈子都没办法学好算法了,所以就这样吧。第二种就是故意误人子弟,驱动来源于自己不会,方式采用侃大山,反正忽悠一个是一个,再来身边也没有其他这方面厉害的朋友,说完之后自己都没意识到哪里有问题,却对别人带去很不好的影响。**所以如果你今天看到我的这篇文章,我希望你能记住一世,这辈子都不要说出这种类似的话来,保持对这个学科基本的尊重,哪怕多一点点匠心精神**。算法对个人的意义如下: - -
- -- 算法题目的程序规模大多都是比较小的,也就意味着切入点很小。使得每一个做题人,可以最大化的投入时间研究问题的本身。而在工作中,稍大一点的项目,基本上是没办法随意改变代码结构的,甚至还会为了整体性能牺牲程序的简洁与优雅。所以**算法题是可以让你通过练习编写出好代码的最好的方式,没有之一**。 -- 算法题目中基本不会有图形化界面,只利用文本进行输入和输出。**你可以相当专注的去解决问题**。而在工作中,你能获得专注去研究一个问题的机会,几乎很难。想一想,假如你用JAVA写一个后台功能,其核心代码不到10行逻辑,但是MVC得占据你三分之一工作量,定义接口占据你三分之一工作量,公司假如没前端,再占据你三分之一工作量。整个这个过程,我有一个Amazon的朋友形容的很贴切,**“掏粪”**。 -- **预测能力的构建**,在大多数算法练习平台中,因为会将运算时间和内存使用状况等信息实时提供给做题人,所以做题人甚至可以一边修改代码,一边观察修改对程序产生的影响。这个是不得了的,在工作中,绝对不可能有这样的机会。而在这个过程中,做题人可以提高对逻辑结构复杂程序进行性能预测的能力,该能力将伴随其一身。 -- **提升coding能力的最好方式**。假如我们打王者荣耀,你要上王者,不开排位,一直打电脑,能上的去吗?在工作中,你来回接触的就那么几个人,有几个能写出特别优秀的代码,见到了,那说明老天眷顾你,大部分人都见不到。但是在算法平台的练习中,基本上我们每一个问题,我们都能看到全世界最优秀的人提交的代码。没有对比,虽然不成伤害,却更难成为进步!只有我们去阅读别人优秀的逻辑,读懂别人思考的过程,与全世界顶尖的程序员编写代码的能力进行比较,才可以成为真正的大牛。 -- **算法题让你难受**。用脚指头想一个问题,在各行各业中,想成为其行业的佼佼者,是不是一定有一个难受的过程。假如天天写CRUD,并且还得意洋洋,我用一套Generator生成只需要5分钟,其他时间就可以打打炉石,勾搭勾搭妹子。不经历一个难受的过程,如何可以进步?就连郭德纲出名之前,也在玻璃窗里被关过两天两夜。罗马不是一天建成的,但是如果不修,那就永远建不成。难受就是真理,说明你正在进步。 -- **单测都是“骗人的”**。请大家不要高估工作中QA的能力(当然,也有牛逼的QA,我见过...),大部分的公司里,QA来做单测时,基本上是重新走了一遍开发者的逻辑。更有甚者,开发直接说出“我写完都已经测完了,要QA有什么用处”,其实这并不是一个段子,因为大部分QA是做不到完美的cover业务逻辑的,换句话说,也就不可能构建出完美的测试用例测出你代码的问题。但是算法不是,大部分的算法平台,都提供了实时反馈的机制,如果自己编写的代码可以得到快速,客观的意见反馈,这绝对是有如神助。就好像是你打王者,旁边有个小精灵,总是会在合适的时机告诉你,“去下路,中路没人”,“小心草丛”。那如果不被带飞,你信吗? - -
- -总之,**正是因为算法题目中只保留了必备的要素,舍弃了其他无关紧要的部分,所以可以对每一位做题人都构建一个学习解决问题的最佳环境**,而在这个环境中的成长与提高,将对一个软件工程师的生涯产生深远影响,乃至一世。所以,请大家能有一颗匠心,你可以选择不去了解学习掌握算法,但是请不要耽误他人进步。山高水长,江湖路远,珍重万千,有缘再见! - -
- -## 02、解决问题的策略 - -> 解决简单的问题时,直接利用已知的技术便可轻松解决问题。但是如果遇到难题,恐怕就需要用各种手段。管他是花猫野猫,抓住耗子都是好猫。在解决问题的策略构建中,我们首先要对问题和答案结构有一个直观的感受,或者说猜测。如果可以把控住当前算法的问题,具备一个什么样的形态,然后就可以把毫无头绪的事情,变得有迹可循。在这样一个过程中,一点点的积累经验,最终就可以提升自己。 - -
- -上面说的内容,玄而又玄,那到底如何来构建策略。假如我们遇到一个问题,让我们找一个国家铁路网中,两个城市的最短路径。这种问题,大家肯定首先想到的就是使用迪杰斯特拉算法。但是如果问题变成“换乘火车次数少于N次,寻找最短路径”,这种问题将不能直接套用最短路径的算法。有时候只是改变题中条件,就可以让整个题目完全走向另一个逻辑,这就需要大家对原算法的原理和执行过程特别了解,并且熟读题意。所以这里我们抽象出两个步骤: - -
- -- 读题 -- 重构 - -
- -读题的目的,就是阅读并理解问题。不管是是不是算法老手,在这上面栽跟头的绝对不是一个两个,审题不清是所有人的共性(绝不是你的个人问题),人的天性就期望可以快速得到反馈,这是身体欲望导致的,和你看到漂亮的妹子下半身竖立本质没有什么区别。所以这就引出我们的解决方法 - 重构。 - -
- -什么是重构,重构其实就是一个抽象化的过程。**借用我们已经掌握的数学/计算机知识,将其表达成现实世界概念**。大部分的现实世界概念都是比较复杂的,我们对其抽茧剥丝,保留本质,表述成易于理解的形式。而对其重构的过程,就可以决定其程序设计的方向。举一个最简单的例子,比如我们要用代码实现一个整数平方根的开方,可以选用牛顿法或者二分法,那这两种方法是如何被想到的。假如我们把问题重构成图形的表达方式,就比较容易会推出牛顿法。假如我们把问题重构成已有的知识概念,自然就可以想到二分法。而如果我们把问题抽象成公式,甚至可以通过数学法来进行解题。划重点,**不同的重构方式,决定最终程序的走向**。 - -
- -在重构的基础上,其实我们就可以来进行解题了。但是这里我还要对其加一个步骤,**化简**。什么又是化简,如何化简?假如我们有一个题,我们有一个二维网格,里边有N个点,两点的距离是X坐标和Y坐标的的和。比如坐标(5,1)和(4,7)的点间距就是1+6=7。我们要找到给出的N个点距离之和最小的新点的坐标。 - -PNG - -题目因为本身是二维的,我们写代码其实不是很好写。所以我们可以将其化简为一维。我们把每一个点的左边,通过映射的方式,分别映射到 x轴 和 y轴。然后我们把问题转化成**在直线上寻找到给出点的距离之和最小的点**。这就是化简。万物之始,大道至简,至拙至美。生活中咱们也说透过现象看本质,放在算法里你就不会了? - -
- -读题-重构-化简,下来自然就是解题了。那如何解题?这个范畴虽然很大,但也不是无迹可寻,下面两点: - -
- -- 基本数据结构和算法的掌握(略) -- 常见算法问题的汇总 - -
- -基本数据结构和算法的掌握,这个自不必说,是人都知道,那么常见算法问题的汇总又是什么,我们看下一节。 - -
- -## 03、算法问题汇总 - -> 写算法最怕什么?当然是出错。**与其重复相同的错误,不如从错误中吸取教训。与其从自己的错误中吸取教训,不如从别人的错误中学习经验**。总结常见的算法问题,我总不能和你去说我们需要掌握数组、链表、二叉树、Map等这些数据结构。我认为的总结,就是错误的总结。所以为了快速拔高大家的水准,我准备了以下这些错误,请一定耐心看完,反复阅读。 - -
- -- **递归,防止死循环和内存泄露**。由于递归需要堆栈,**所以内存消耗要比非递归代码要大很多**。而且,如果递归深度太大,可能系统撑不住。内存会存在突然飙升的情况。如果是数据错误导致无限循环,那问题就大了。所以这方面问题在开发的时候需要注意。 -- **访问数组越界**,绝大多数的数组越界,根本原因在于对定义混淆。比如定义的时候想的是“以0起始”,但是写的时候写成了“以1起始”。究其根本,数组越界的问题,其实是对区间把控的问题。 -- **区间表意不明。**大部分的语言中,数组都以0为起始元素,但是人的思维习惯于以1为起始。那为什么数组要以0为起始元素,历史原因有很多,咱不说。对咱们有用的,3个。第一,因为我们选择左闭右开区间,比如 [0,n),我们可以很容易通过 n-0 得到数组中元素个数。这点大家要形成条件发射,看到数组,明确其个数。第二,闭区间很难去表示一个空数组,不信你试试,非常难受。第三,左闭右开的区间,迭代器只需要最少的操作符。可以让代码写起来非常的舒服,STL的算法和容器中基本都是如此。 -- **差一问题(栅栏错误)。**建造一条直栅栏(即不围圈),长30米、每条栅栏柱间相隔3米,需要多少条栅栏柱? 求数组 A[i]到 A[j] 的平均值,A[i] 到 A[j] 的和应该除以多少,是 j-i+1,还是 j-i?二分法中的 while 条件,到底是用 <= 还是 < ?这些都是差一问题,这类问题如何解决。**利用最小的的输入值测试代码的执行过程,长期反复,达到条件反射**。这个过程一定是在大量的题目练习中掌握的,如果你到目前还在纠结这个问题,请先扣心自问,是否刷过至少200道算法题。如果没有,请不要纠结,干就对了。如果有,来找我。 -- **内存溢出问题**。分为两种,一种是因为运算超出变量取值范围发生的内存溢出,比如二分法中的mid,就要使用 left+(right-left)>>1。另一种就是因为代码不严谨,比如递归没有退出条件,while死循环,等等导致内存溢出。 -- **初学者定义问题。**比如统计26个字母出现的次数,初学者会用hashmap,其实这种已知值范围的,定义成数组就可以了。其他类似数字0-9,每个月的天数,都是一样的 -- **写一半忘记题意。**这个根本原因还是因为思维脉络不清晰导致的,有时候初学者还会遇到一个问题。定义一个函数,比如叫做 juge() 返回 bool 值,本来应该是判断某条件成立时返回true,但是用的时候却以为,在条件不成立的时候返回true,最终导致结果错误。 -- **变量名错误。**不管是和方法参数中的变量名称冲突,还是因为本身表意不明,最终出现赋值错误,或者编译不通过。 -- **运算优先级错误。**比如位运算,各个语言中的优先级定义是略有不同的。有时候需要加括号,有时候不需要加。 -- **特殊值的处理。**一些找规律的题目,往往在等于0,等于1的时候,规律和其他的数不同,所以这种题目,需要对这种特殊值进行特殊处理。 - -
- -以上就是我挑选过的一些具有代表性的错误示例(后续还会补充),同时,算法指导篇我打算出一个系列,包括算法中常用技巧,常见错误,题目常见误导 等等,都是我的珍藏。今天的文章呕心泣血,希望大家可以帮我转发,我想如果你身边有学习计算机的朋友看到,他一定会感谢你。支持我的朋友们,还没有关注的,快点来个关注。最后,山高水长,江湖路远,珍重万千,下期再见! \ No newline at end of file diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/021/1.jpg" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/021/1.jpg" deleted file mode 100644 index 3878fadd..00000000 Binary files "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/021/1.jpg" and /dev/null differ diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022.md" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022.md" deleted file mode 100644 index a4c95da4..00000000 --- "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022.md" +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: 指导学习(二) -date: 2020-07-08 ---- - -> **今天是小浩算法“365刷题计划” - 刷题指导篇(小白篇)。**三年高考,五年刷题。leetcode不算从其他各处收录的题目,单就自己的题库,总共有1600+,如果按照每天刷一道的话,总共需要5年。那我们真的需要把这些题目全部刷完吗?如果不是,刷多少合适?又该怎么刷呢?本文我尽量言简意赅,直击大家的疑惑。(本文适合算法初学者) - -## 01、刷多少题 - -> 不下百人问过我这个问题。我的建议是,对于大部分的人,200道是一个合适的数字。 - -
- -估计到这里,有人会喷我。你不设前提,不谈目的,直接就说200道,这不是扯淡吗。我想说的是,这不是扯淡。 - -
- -前面我已经说了,**对于大部分人**,我的建议是200道。大部分人指的是什么呢?我这里统指**没有系统刷题经验的同学**。无论是工作3-5年的职场老司机,还是即将毕业的应届生,只要没怎么刷过题,通通归为此类。 - -
- -对于上面这个群体(请先自行判断是否可以归为此类),**刷题的目的基本是为了面试**。不管我多么巧舌如簧,告诉你算法可以提高思维,增强逻辑,是成为top coder的必然条件,等等等等。但最终都还是会回归到这个目的:**面试**。 - -PNG - -所以现在我们换掉问题:**没什么刷题经验的同学为了面试需要刷多少道题**?我的答案是:200道。 - -## 02、为什么是200 - -> 这个问题,不妨换做 ”刷完200道题可以掌握到什么程度?“ - -
- -常见tag无外乎那么七八种,200道题听起来很多,但是分散到每一个tag,每种也就只包含二三十个。倘若我们算多点,每一个tag包含30道题,其中大概是15-20道easy,5-10道medium,2-3道hard。200道不多不少,基本可以完美覆盖整个算法体系,所以我认为200道是一个不错的数字。 - -
- -那么回到问题 “刷完200道题可以掌握到什么程度?” 我当然可以给你一些信心,告诉你200道题可以让你吊打面试官,完虐BAT。但是呢,**其实这都是骗小孩子的,或者就是骗 ¥**。那真实的200道题能让你到达一个什么程度呢? - -
- -- 在算法方面超过大概80%的同行(这里单指基础算法,非ML、AI等) -- 在面试时不至于对方拿出一道题目整个人就陷入懵逼,而是有资格享受面试思考题目的过程 -- 身边有朋友聊到算法敢过去和他们交流,而不是默默的走开 -- 对于应届生,谋取一份拿到offer的可能性 -- 对于老司机,去大厂镀金的必备条件 -- 对于培训生,极大的缩小和科班学生的差距 - -## 03、200道刷多久 - -> “我之前立了个flag,一天刷一道都没坚持下来。你特么让我刷两百道,我一年都搞不定。这不扯淡吗?” - -
- -如果你有上面的疑惑,那么:你错了。坚持不下来一天一道的人和刷完200道题,毛关系都没有。回到我上面的例子,200道题目里。大概easy在130-150道左右,medium在30-50道,hard只占据了不到20道题。 - -PNG - -跑步和刷题不同。跑步是越来越慢,刷题却是越来越快的。对于初学者(正常人),在每一个tag刷了10道左右简单题之后,基本同类型的题目可以提高到每天2-3道easy题目,有的掌握好的,甚至能提高到每天刷5-10题。很多同类型题目,基本都是一个模子刻出来的。 - -
- -所以我认为,200道题刷的特别慢的话大概在150天左右完成,中不溜的在100天左右,刷的快的话在60天左右。同时,如果我们再把这里边的 medium 和 hard 通通remove 掉。再不济,也应该在3个月左右掌握大概100-150道简单题目。剩下的,just do it。 - -## 04、刷完就忘 - -> 你忘我也忘,大家都旺旺。 - -
- -忘就对了。如果你在刷题的时候发现怎么也写不出来,别担心,这是正常的。如果你还发现,之前明明刷过的题,过段时间再做的时候,自己还是不会。别担心,这特么还是正常的。 - -
- -作为一个正常人,大脑就会忘记,如果不忘,可能说明你大脑出了问题。这个不是我说的,是医生说的: - -
- -PNG - -
- -所以如果有些题你刷了好多遍都还是不会,那就需要进行总结。思考到底是哪一环节卡住了你,反复进行练习。当然,这里有人建议是每道题都刷个3遍,其实我觉得倒是没有这个必要。我建议是找个小本本,记一下每一道的核心要素与考察要点。在刷题的这段时间里,没啥事就瞅瞅翻翻。 - -## 05、没基础怎么办 - -> 我没学过算法和数据结构,能不能刷题? - -
- -能。刷题本身就是一个学习的过程。比如二叉树的题,刷个30道,你一定会遇到BST。所以我个人认为学习系统的算法知识(也就是你们问我的,要不要买一本书,先看一遍再进行刷题)和 刷题 本身并不矛盾。你可以双管齐下,也可以单点突破,都ok。主要是,干就对了。 - -PNG - -到这里就会出现另一个问题,“我是从头刷,还是分类刷?” 我的建议是,如果稍微有点算法基础,你就从头刷leetcode前200道题。如果完全没有算法基础,可以考虑分tag来刷。并不是说按照tag的方式更好,而是在没有算法基础的前提下分tag来刷,除了掌握题型之外,对于知识的掌握很有益处。(想一想初高中是如何学习的)那为什么又说从头刷也是可以的?这个是因为,如果一直刷某一种类型的题,容易出现刷完一类忘掉前一类的问题,也容易对某一类题目疲惫。总之,**使用哪种方式取决于你**。关键是:干就对了! - -
- -另外,我认为leetcode前200题是相当经典的。可能大家不知道,早期leetcode总共也就一百来道题。这些题目基本都是精华,后面的很多题目都是在这些题目的基础上进行演化而成。比如 合并两个有序链表,后来就演化成 合并K个有序链表。并且前200道题基本覆盖了所有的算法类型,我是很建议大家刷一遍的。 - -## 06、其他 - -> 初学者拿到题目没有思路怎么办?为什么看完题解自己还是写不出来?别人的代码为什么可以那么简单?为了面试要不要尽可能多的掌握最优解?等等等等,这些我打算出在下一次的算法指导篇中。 - -今天基本就到这里了,还有很多想和大家说的,后面我再一一分享出来。如果意犹未尽,那么下面这篇文章是必看的: - - [算法指导篇](0.0.学习须知/011.md) - diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/1.gif" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/1.gif" deleted file mode 100644 index 22eea653..00000000 Binary files "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/1.gif" and /dev/null differ diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/2.gif" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/2.gif" deleted file mode 100644 index cbbbda53..00000000 Binary files "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/2.gif" and /dev/null differ diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/3.jpg" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/3.jpg" deleted file mode 100644 index e8e43db1..00000000 Binary files "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/3.jpg" and /dev/null differ diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/4.gif" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/4.gif" deleted file mode 100644 index 342226af..00000000 Binary files "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/022/4.gif" and /dev/null differ diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/023.md" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/023.md" deleted file mode 100644 index b24181e1..00000000 --- "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/023.md" +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: 指导学习(三) -date: 2020-07-12 ---- - -今天的文章,不浪,没图。给大家加加油! - -PNG - -回顾过去一年,京东、知乎、美团、微博、去哪儿、滴滴等。爆出裁员的有多少,虽然最终都被官方辟谣。**但是,你们懂的。** - -
- -互联网寒冬之下,所有公司都勒紧裤腰带过活。那么,对于个体的你,不努力,不学习,想去大厂?凭什么。 - -
- -请大家原谅我说话的直白。2020年就目前来看,对于企业是明显的买方市场(供过于求)。**而且,未来几年应该都是这样**。所以,大部分企业在招聘时,是要在很多优秀的人中去选出一个更优秀的人,而不是在一群普通人中选择一个优秀的人。 - -
- -毕竟,如果你不够格,可能简历都过不了。**而对于应届生,如果不能多维度的获取你的信息。那么出几道难题,在没有更好的替代方案之前,目前是唯一的选择。** - -
- -所以我最终很直白的告诉这位同学,刷题,你还是得刷。该记的,你还是得记。尤其如果目标本身就是一个好的offer,那更应是如此。 - -
- -但是,**这样的回答其实是不负责任的**。虽然我考虑到给对方一点压力,很直白的回复了他。但如果放开这一切,我们为什么学算法?为什么学数据结构? - -
- -“面试造火箭,工作拧螺丝” ,工作四五年,别说红黑树,就连普通二叉树基本都没手写过,**我知道很多人都是这个状态**。这种状态正常吗?**正常**。但不写不等于不用。就算真的不用,也不等于不需要知道怎么用。 - -
- -**其实,很多学生学习数据结构是有问题的**。就这位同学而言,至少出现背代码,就是绝对错误的。数据结构的本质,在我看来是去契合一些应用场景,自然而然的产生,而不是死记硬背。 - -
- -比如说红黑树,我们需要知道这是一种常用的平衡二叉树(或者说特殊的平衡二叉树)知道其对于查找, 插入,删除的复杂度都是log(n) --- n 这里是说树中元素的个数。如果你是java栈,你可能还需要知道 hashmap 为什么选用红黑树来实现。要知道红黑树可以在一些非实时任务调度中,可以高效公平的调度任务。要知道其所有的应用,都是围绕着“平衡”二字。这才是数据结构的核心。 - -
- -至于实现的细枝末节,**知道固然好,但没必要去逼着自己记忆**。因为,我们的职业生涯里,绝对不可能出现让你手写红黑树的节点删除的场景。 - -
- -但你需要知道为什么创造/引入它,它有什么特殊的,它满足哪些场景,又不满足哪些场景,不满足的场景又如何替代。这才是对数据结构的良好理解。 - -
- -其实,除了算法,在我看来很多别的知识也是这样。**只是说算法,更容易在面试的时候去展示而已。本身而言,并没有什么特殊的。** - -
- -比如学习操作系统。那我们为什么学习操作系统?难道是让我们造出来一个操作系统吗?显而易见并不是。学习操作系统是让我们了解为什么会提出OS,如果没有OS又会是什么样子。它怎么样做任务调度,怎么样做进程管理,怎么样对可用的硬件做成抽象,死锁是如何产生的,内存是怎么管理的,文件系统是如何实现的,通信是指谁与谁的通信。不是说应付了考试就算学了,而是带着脑子掌握这个东西的脉络,这才是核心。 - -
- -比如学习数据库原理,不是说让你去造一个数据库。当然你有这本事,那也ok。更多的是去了解数据库是如何来抽象数据管理的,大数据在什么场景下应运而生。学了之后,你会知道关系型数据库只是数据库中的冰山一角。你知道缓存,索引,批处理,中间件之中都是有着数据库的影子。你用 git 你会知道 .git 文件下,其实就用几个很简单的数据结构,就构建了一个数据库的雏形。你知道事务控制,其实最初只是想把事情做正确,你知道 ACID 是在保证什么。你知道数据库的整个设计中,很多时候我们是在性能和正确性中做选择。你知道除了程序员之外,还有 DBA 更加会关注高可用。你不会再觉得读写分离,主从备份多么高大上,因为你知道除了读写分离之外,还有快慢分离,异地多活,**Replication 和 Failover 很多东东**,都是上个世纪就有了完美的理论支撑。 - -
- -比如学习计算机网络,不是说让你去死记硬背几层网络模型,都各自是什么。而是让你知道全球互联网是如何运作的,知道TCP为了保证数据可靠做了多少额外的工作,握手为什么是3次,不是456次。知道滑动窗口并不等于leetcode上的几道题。知道层与层之间是如何划分的。知道在计算机网络的基础下,还有计算机网络安全一大块基石。 - -
- -比如学习编译原理,没人让你死记硬背那些分词算法。而是去知道为什么要划分词法,语法,语义分析。知道为什么很多语言要提出中间代码这个东东。知道编译原理很多东西,其实就是 NLP 的基础,其实就是智能机器人的基础。知道在 ES 的设计中,其实也参考很多编译器的设计。 - -
- -当然,我们很可能不会完美的掌握上面所说的所有。**但我们会在这个过程中,去发现自己的知识盲点,进而刻意提高**。而不是一直陷入“学不会-理解不了-记不住”的死循环。 - -
- -当然,对于要找工作的人,我们可以直接去击打一些面试痛点,更好的兼容社会。**但我们面试过后,总归是要知识落地,这才能体现你的最终价值。** - -
- -不要说什么“面试造火箭,工作拧螺丝”,拧螺丝的人,只能一直留在位置上拧螺丝。而努力拧螺丝的人,说不定就有机会去造火箭。而那些有造火箭能力的人,他们终究会造上火箭。 \ No newline at end of file diff --git "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/023/1.jpg" "b/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/023/1.jpg" deleted file mode 100644 index 39c8566f..00000000 Binary files "a/website/0.01.\346\214\207\345\257\274\345\255\246\344\271\240/023/1.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001.md" deleted file mode 100644 index 4de0108d..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001.md" +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: 两个数组的交集(350) ---- - -## 01、题目分析 - -我们先来看一道题目: - -| 第350题:两个数组的交集 | -| ----------------------------------------------------- | -| 给定两个数组,编写一个函数来计算它们的交集。 | - -**示例 1:** - -``` -输入: nums1 = [1,2,2,1], nums2 = [2,2] - -输出: [2,2] -``` - -**示例 2:** - -``` -输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] - -输出: [4,9] -``` - -说明: - -- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 -- 我们可以不考虑输出结果的顺序。 - -进阶: - -- 如果给定的数组已经排好序呢?将如何优化你的算法呢? - -思路:设定两个为0的指针,比较两个指针的元素是否相等。如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。 - -## 02、题解分析 - -> 首先拿到这道题,我们基本马上可以想到,此题可以看成是一道传统的**映射题(map映射)**,为什么可以这样看呢,因为**我们需找出两个数组的交集元素,同时应与两个数组中出现的次数一致。这样就导致了我们需要知道每个值出现的次数,所以映射关系就成了<元素,出现次数>**。剩下的就是顺利成章的解题。 - -由于该种解法过于简单,我们不做进一步分析,直接给出题解: - -```go -//GO -func intersect(nums1 []int, nums2 []int) []int { - m0 := map[int]int{} - for _, v := range nums1 { - //遍历nums1,初始化map - m0[v] += 1 - } - k := 0 - for _, v := range nums2 { - //如果元素相同,将其存入nums2中,并将出现次数减1 - if m0[v] > 0 { - m0[v] -=1 - nums2[k] = v - k++ - } - } - return nums2[0:k] -} -``` - -这个方法比较简单,相信大家都能看的懂! - -## 03、题目进阶 - -> 题目在进阶问题中问道:如果给定的数组已经排好序呢?你将如何优化你的算法?我们分析一下,假如两个数组都是有序的,分别为:arr1 = [1,2,3,4,4,13],arr2 = [1,2,3,9,10] - -![PNG](./001/1.jpg) - -对于两个已经排序好数组的题,我们可以很容易想到使用双指针的解法~ - -解题步骤如下: - -<1>设定两个为0的指针,**比较两个指针的元素是否相等。**如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。下图中我们的指针分别指向第一个元素,判断元素相等之后,将相同元素放到空白的数组。 - -![PNG](./001/2.png) - -<2>如果两个指针的元素不相等,**我们将小的一个指针后移。**图中我们指针移到下一个元素,判断不相等之后,将元素小的指针向后移动,继续进行判断。 - -![PNG](./001/3.png) - -<3>反复以上步骤。 - -![PNG](./001/4.png) - -<4>直到任意一个数组终止。 - -![PNG](./001/5.png) - -## 04、题目解答 - -根据分析,我们很容易得到下面的题解: - -```go -//GO -func intersect(nums1 []int, nums2 []int) []int { - i, j, k := 0, 0, 0 - sort.Ints(nums1) - sort.Ints(nums2) - for i < len(nums1) && j < len(nums2) { - if nums1[i] > nums2[j] { - j++ - } else if nums1[i] < nums2[j] { - i++ - } else { - nums1[k] = nums1[i] - i++ - j++ - k++ - } - } - return nums1[:k] -} -``` - -> 提示:解答中我们并没有创建空白数组,因为遍历后的数组其实就没用了。我们可以**将相等的元素放入用过的数组中,就为我们节省下了空间**。 diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/1.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/1.jpg" deleted file mode 100644 index 422bfc6f..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/1.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/2.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/2.png" deleted file mode 100644 index 63f1cfe8..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/2.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/3.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/3.png" deleted file mode 100644 index c78500ad..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/3.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/4.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/4.png" deleted file mode 100644 index 87cea773..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/4.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/5.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/5.png" deleted file mode 100644 index 674cf977..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/001/5.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002.md" deleted file mode 100644 index 744d9776..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002.md" +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: 最长公共前缀(14) ---- - -## 01、题目分析 - -首先还是看下题目: - -| 题目14: 最长公共前缀 | -| ------------------------------------------------------------ | -| 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回"" | - -**示例1:** - -``` -输入: ["flower","flow","flight"] -输出: "fl" -``` - -**示例 2:** - -``` -输入: ["dog","racecar","car"] -输出: "" -``` - -解释: - -- 输入不存在公共前缀。 - -说明: - -- 所有输入只包含小写字母 a-z - -## 02、题解分析 - ->我们要想寻找最长公共前缀,那么**首先这个前缀是公共的,我们可以从任意一个元素中找到它**。假定我们现在就从一个数组中寻找最长公共前缀,那么首先,我们可以将第一个元素设置为基准元素x0。假如数组为["flow","flower","flight"],flow就是我们的基准元素x0。 - - -然后我们只需要**依次将基准元素和后面的元素进行比较**(假定后面的元素依次为x1,x2,x3....),**不断更新基准元素,直到基准元素和所有元素都满足最长公共前缀的条件**,就可以得到最长公共前缀。 - -具体比对过程如下: - -- 如果strings.Index(x1,x) == 0,则直接跳过(因为此时x就是x1的最长公共前缀),对比下一个元素。(如flower和flow进行比较) -- 如果strings.Index(x1,x) != 0, 则截取掉基准元素x的最后一个元素,再次和x1进行比较,直至满足string.Index(x1,x) == 0,此时截取后的x为x和x1的最长公共前缀。(如flight和flow进行比较,依次截取出flow-flo-fl,直到fl被截取出,此时fl为flight和flow的最长公共前缀) - - - -具体过程如下图所示: - -PNG - ->我们需要注意的是,在处理基准元素的过程中,**如果基准元素和任一一个元素无法匹配,则说明不存在最长公共元素。** - -最后,我们记得处理一下临界条件。如果给定数组是空,也说明没有最长公共元素。 - -然后我们就可以开始写我们的代码了。 - -## 03、代码分析 - -根据分析,我们很容易得到下面的题解: - -```go -//GO -func longestCommonPrefix(strs []string) string { - if len(strs) < 1 { - return "" - } - prefix := strs[0] - for _,k := range strs { - for strings.Index(k,prefix) != 0 { - if len(prefix) == 0 { - return "" - } - prefix = prefix[:len(prefix) - 1] - } - } - return prefix -} -``` - -运行结果: - -PNG - -当然,我们也可以用分治法或者其他方法来解答这道题目。你可以自己尝试尝试哈。我们下期见! diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002/1.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002/1.png" deleted file mode 100644 index 356397ea..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002/1.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002/2.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002/2.jpg" deleted file mode 100644 index 4c7500f5..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/002/2.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003.md" deleted file mode 100644 index abf2e2d3..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003.md" +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: 买卖股票的最佳时机(122) ---- - -## 01、题目分析 - -在leetcode上,股票相关的题目有8道之多: - -PNG - -而且这一类型的题,面试时出现的频率非常的高。稍微改一改条件,就让我们防不胜防。那我们如何攻克这一类题型呢?我们从最简单的一道开始看起: - -| 第122题:买卖股票的最佳时机 II | -| ------------------------------------------------------------ | -| 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 | - -如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。 - -**示例 1:** - -``` -输入: [7,1,5,3,6,4] -输出: 7 -``` - -解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 - -​ 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 - -**示例 2:** - -``` -输入: [1,2,3,4,5] -输出: 4 -``` - -解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 - -​ 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 - -​ 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 - -**示例 3:** - -``` -输入: [7,6,4,3,1] -输出: 0 -``` - -解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 - - - -题目分析:首先我们看一下题目中给出的两个条件: - -1、**不能参与多笔交易**。换句话讲,我们只能在手上没有股票的时候买入,也就是**必须在再次购买前出售掉之前的股票**。像我们平时买股票时的追涨杀跌是不可以的。 - -2、**尽可能地多进行交易**。这个非常好理解。像是黄金,一年基本上都有2-3次涨跌。我们只要把握住机会,在每一次涨跌的时候,低价卖入高价卖出,就可以使利益达到最大化。这个条件也是相当重要的,如果我们把这里变成,最多完成两笔交易,就变成另一道题。 - -现在题目搞清楚了,我们来思考一下。 - -## 02、题解分析 - -假设给定的数组为:[7, 1, 5, 3, 6, 4] 我们将其绘制成折线图,大概是下面这样: - -PNG - -如我们上面分析,我们要在满足1和2的条件下获取最大利益,其实就是尽可能多的低价买入高价卖出。而**每一次上升波段,其实就是一次低价买入高价卖出**。而我们没有限制交易次数,也就是我们需要**求出所有的上升波段的和**。上图里就是A+B,也就是(5-1)+(6-3) = 7,就是我们能获取到的最大利益。 - -其实也就是尽可能多的低价买入,高价卖出啦。 - -## 03、代码分析 - -根据以上分析,我们很容易得到下面的题解: - -```go -//GO -func maxProfit(prices []int) int { - if len(prices) < 2 { - return 0 - } - dp := make([][2]int, len(prices)) - dp[0][0] = 0 - dp[0][1] = -prices[0] - for i := 1; i < len(prices); i++ { - dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]) - dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1]) - } - return dp[len(prices)-1][0] -} - -func max(a,b int) int { - if a > b { - return a - } - return b -} -``` - -## 04、题目扩展 - -图解的方式其实在各种算法题中,屡见不鲜。而我们通过图解的方式,也可以抽丝剥茧一样,一层一层剥掉算法题目的外壳,寻找到最直观的解题思路,直捣黄....咳咳,直奔核心。那我们又如何用图解的观察方式,来对本系列的其他题目寻找到一种通用解法,来规避题目中的陷阱呢?浩仔讲算法,我们下期再见喽! - diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003/1.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003/1.jpg" deleted file mode 100644 index 1ec9f5ea..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003/1.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003/2.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003/2.png" deleted file mode 100644 index d86cfd57..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/003/2.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004.md" deleted file mode 100644 index f0be2dd6..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004.md" +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: 旋转数组(189) ---- - -## 01、题目分析 - -| 题目189: 旋转数组 | -| ------------------------------------------------------------ | -| 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 | - -**示例 1:** - -``` -输入: [1,2,3,4,5,6,7] 和 k = 3 -输出: [5,6,7,1,2,3,4] -``` - -解释: - -- 向右旋转 1 步: [7,1,2,3,4,5,6] -- 向右旋转 2 步: [6,7,1,2,3,4,5] -- 向右旋转 3 步: [5,6,7,1,2,3,4] - -**示例 2:** - -``` -输入: [-1,-100,3,99] 和 k = 2 -输出: [3,99,-1,-100] -``` - -解释: - -- 向右旋转 1 步: [99,-1,-100,3] -- 向右旋转 2 步: [3,99,-1,-100] - -说明: - -尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 - -**要求使用空间复杂度为 O(1) 的 原地 算法。** - -
- -> 这道题如果不要求原地翻转的话,其实相当简单。但是原地翻转的方法却并不容易想到,我们直接看题解。 - -## 02、题目图解 - -> 这个方法基于这个事实:**若我们需要将数组中的元素向右移动 k 个位置, 那么 k%l (l为数组长度) 的尾部元素会被移动到头部,剩下的元素会被向后移动。** - -假设 我们现在数组为[1,2,3,4,5,6,7], l=7 且 k=3 。 - -如下图可以看到5,6,7 被移动到 数组头部。 - -PNG - -通过观察我们可以得到,我们要得到最终的结果。**我们只需要将所有元素反转,然后反转前 k 个元素,再反转后面l-k个元素,就能得到想要的结果。** - -如下图: - -PNG - -## 03、题目解答 - -根据分析,我们可以得到下面的题解: - -```go -//GO -func rotate(nums []int, k int) { - reverse(nums) - reverse(nums[:k%len(nums)]) - reverse(nums[k%len(nums):]) -} - -func reverse(arr []int) { - for i := 0; i < len(arr)/2; i++ { - arr[i], arr[len(arr)-i-1] = arr[len(arr)-i-1], arr[i] - } -} -``` - diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004/1.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004/1.png" deleted file mode 100644 index 10402e12..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004/1.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004/2.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004/2.png" deleted file mode 100644 index f79a9b78..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/004/2.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005.md" deleted file mode 100644 index 78ef4f63..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005.md" +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: 原地删除(27) ---- - -## 01、题目分析 - -| 题目27:移除元素 | -| ------------------------------------------------------------ | -| 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 | - -不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 - -元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 - -**示例 1:** - -``` -给定 nums = [3,2,2,3], val = 3, -函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 -你不需要考虑数组中超出新长度后面的元素。 -``` - - - -> 这道题比较简单哦,只要把握好“原地删除”这个关键字,就可以顺利求解啦! - -具体过程如下图所示: - -PNG - -根据分析,我们可以得到下面的题解: - -```go -//GO -func removeElement(nums []int, val int) int { - for i := 0; i < len(nums);{ - if nums[i] == val { - nums = append(nums[:i],nums[i+1:]...) - }else{ - i++ - } - } - retunums) -} -``` - -
- -和这道题类似的还有LeetCode 26题,大家可以尝试自己先做一做,然后再看答案哦。 - -## 02、类似题目分析 - -| 题目26:删除排序数组中的重复项 | -| ------------------------------------------------------------ | -| 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次。 | - -返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 - -**示例 1:** - -``` -给定数组 nums = [1,1,2], -函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 -你不需要考虑数组中超出新长度后面的元素。 -``` - -**示例 2:** - -``` -给定 nums = [0,0,1,1,1,2,2,3,3,4], -函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 -你不需要考虑数组中超出新长度后面的元素。 -``` - -
- -> 这道题的重点是原地两个字,也就是要求必须在O(1)的空间下完成。并且题中已经告知了数组为有序数组,这样重复的元素一定是连在一起的,我们只需要一个一个移除重复的元素即可,具体方案方案怎么做,我们看看下面就会明白了。 - -移除的具体过程: - -PNG - -根据分析,我们可以得到下面的题解: - -```go -//GO -func removeDuplicates(nums []int) int { - for i := 0; i+1 < len(nums);{ - if nums[i] == nums[i+1]{ - nums = append(nums[:i],nums[i+1:]...) - }else{ - i++ - } - } - return len(nums) -} -``` - -
- -好啦,关于数组原地操作的两道题就讲到这里啦,如果大家有兴趣的话,可以参考做一下LeetCode 283题(移动O),也是一样的做法哦! diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005/1.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005/1.jpg" deleted file mode 100644 index 2a9867cd..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005/1.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005/2.jpeg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005/2.jpeg" deleted file mode 100644 index f5d938dc..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/005/2.jpeg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006.md" deleted file mode 100644 index 777fd751..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006.md" +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: 加一(66) ---- - -> 看到这个标题,大家肯定会觉得,不就是“加1”嘛,这么简单的问题我可以!但是就是这么简单的“加1”可是面试的高频题哦,所以我们就一起来看看吧。按照往例,我们还是从一道LeetCode题开始吧。 -## 01、题目分析 - -| 第66题:加一 | -| ------------------------------------------------------------ | -| 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 | - -最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。 - -**示例 1:** - -``` -输入: [1,2,3] -输出: [1,2,4] -解释: 输入数组表示数字 123。 -``` - -**示例 2:** - -``` -输入: [4,3,2,1] -输出: [4,3,2,2] -解释: 输入数组表示数字 4321。 -``` - -
- -> 题目分析: - -根据题目,我们需要加一!没错,加一很重要。因为它只是加一,所以我们会考虑到两种情况: - -- **普通情况,除9之外的数字加1。** - -- **特殊情况,9加1。(因为9加1需要进位)** - -所以我们只需要模拟这两种运算,就可以顺利进行求解! - -## 02、题目图解 - -假设我们的数为[1,9,9] - -大概是下面这样:(这个图解...真的有点太简单了...) - -PNG - -当然,这里我们需要考虑一种特殊情况,就是类似99,或者999,我们需要进行拼接数组。具体如下图: - -PNG - -通过以上分析,我们最后只需要将其转换成代码即可!这样看来,“加1”是不是也不像想象中的那么简单? - -## 03、GO语言示例 - -根据以上分析,我们可以得到下面的题解: - -``` -func plusOne(digits []int) []int { - var result []int - addon := 0 - for i := len(digits) - 1;i >= 0; i-- { - digits[i]+=addon - addon = 0 - if i == len(digits) - 1 { - digits[i]++ - } - if digits[i] == 10 { - addon = 1 - digits[i] = digits[i] % 10 - } - } - if addon == 1 { - result = make([]int, 1) - result[0] = 1 - result = append(result,digits...) - }else{ - result = digits - } - return result -} -``` - -**提示:** - -``` -append(a,b...) 的含义是:将b切片中的元素追加到a中。 -``` \ No newline at end of file diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006/1.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006/1.png" deleted file mode 100644 index 9d45397d..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006/1.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006/2.png" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006/2.png" deleted file mode 100644 index b0e03083..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/006/2.png" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007.md" deleted file mode 100644 index 3b3ff029..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007.md" +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: 两数之和(1) ---- - -## 01、题目分析 - -| 第1题:两数之和 | -| ------------------------------------------------------------ | -| 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 | - -你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 - -**示例:** - -``` -给定 nums = [2, 7, 11, 15], target = 9 -因为 nums[0] + nums[1] = 2 + 7 = 9 -所以返回 [0, 1] -``` - -
- -> 题目分析 - -首先我们拿到题目一看,马上可以想到**暴力题解**。我们只需要 “**遍历每个元素 x,并查找是否存在一个值与 target - x 相等的目标元素。**” -
-由于该种解题思路过于简单,直接上代码(如果有问题请留言..): - -``` -func twoSum(nums []int, target int) []int { - for i, v := range nums { - for k := i + 1; k < len(nums); k++ { - if target-v == nums[k] { - return []int{i, k} - } - } - } - return []int{} -} -``` - -执行结果: - -PNG - -> 运行成功,但是该种解题方式的时间复杂度过高,达到了O(n²)。为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。我们可以想到用**哈希表**的方式,通过以空间换取时间的方式来进行。 - -## 02、题目图解 - -假设 nums = [2, 7, 11, 15], target = 9 - -
- -<1> 首先,我们还是先遍历数组 nums,i 为当前下标。我们需要将每一个遍历的值放入 map 中作为 key。 - -PNG - -<2> 同时,对每个值都判断 map 中是否存在 **target-nums[i]** 的 key 值。在这里就是 9-7=2。我们可以看到 2 在 map 中已经存在。 - -PNG - -<3> 所以,2 和 7 所在的 key 对应的 value,也就是 [0,1]。就是我们要找的两个数组下标。 - -PNG - -## 03、Go语言示例 - -根据以上分析,我们可以得到下面的题解: - -``` -func twoSum(nums []int, target int) []int { - result := []int{} - m := make(map[int]int) - for i,k := range nums { - if value,exist := m[target-k];exist { - result = append(result,value) - result = append(result,i) - } - m[k] = i - } - return result -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/1.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/1.jpg" deleted file mode 100644 index c92a1d51..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/1.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/2.jpeg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/2.jpeg" deleted file mode 100644 index c5c9e2aa..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/2.jpeg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/3.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/3.jpg" deleted file mode 100644 index c2c50a58..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/3.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/4.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/4.jpg" deleted file mode 100644 index 931c91bc..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/4.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/5.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/5.jpg" deleted file mode 100644 index 5fa46ee4..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/007/5.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008.md" deleted file mode 100644 index cd7d1939..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008.md" +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: 三数之和(15) -date: 2020-07-06 ---- - -> “时代中的一粒灰,落在个人那里,可能就是一座山。而我们偏偏处在一个尘土飞扬的时代之中。” 为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院于4月3日发布公告,决定 2020年4月4日 举行全国性哀悼活动。而我,在这里也致谢那些扛起大山的人! - -
- -今天给大家讲解一道经典鹅厂面试题,有一定难度。大家认真看哦。 - -
- -建议先回顾一下前面关于该题简化版,二数之和。 - - [两数之和(1)](1.0.数组系列/007.md) - -## 01、题目示例 - -> 该题为 二数之和 的进阶版本,当然还有一个进阶版本为 四数之和。我们将会一一进行分析! - -| 第15题:三数之和 | -| ------------------------------------------------------------ | -| 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。 | - -**示例:** - -``` -给定数组 nums = [-1, 0, 1, 2, -1, -4], -满足要求的三元组集合为: -[ - [-1, 0, 1], - [-1, -1, 2] -] -``` - -## 02、题目分析 - -> 本题的暴力题解可以仿照二数之和,直接三层遍历,取和为0的三元组,并记录下来,最后再去重。但是作为一个有智慧的人,我们不能这么去做。 - -
- -因为我们的目标是找数,当然使用指针的方式最简单。假若我们的数组为: - -``` -[-1, 0, 1, 2, -1, -4] -``` - -求解过程如下:首先我们先把数组排个序(原因一会儿说),排完序长这样: - -PNG - -因为我们要同时找三个数,所以**采取固定一个数,同时用双指针来查找另外两个数的方式**。所以初始化时,我们选择固定第一个元素(当然,这一轮走完了,这个蓝框框我们就要也往前移动),同时将下一个元素和末尾元素分别设上 left 和 right 指针。画出图来就是下面这个样子: - -PNG - -现在已经找到了三个数,当然是计算其三值是否满足三元组。但是这里因为我们已经排好了序,如果**固定下来的数(上面蓝色框框)本身就大于 0,那三数之和必然无法等于 0**。比如下面这种: - -PNG - -然后自然用脚指头也能想到,我们需要移动指针。现在我们的排序就发挥出用处了,**如果和大于0,那就说明 right 的值太大,需要左移。如果和小于0,那就说明 left 的值太小**,需要右移。(上面这个思考过程是本题的核心) 整个过程如下图所示: - -PNG - -其中:在第6行时,因为三数之和大于0,所以right进行了左移。最后一行,跳过了重复的-1。 - -
- -然后啰嗦一句,因为我们需要处理重复值的情况。除了固定下来的i值(蓝框框),left 和 right 当然也是需要处理重复的情况,所以对于 left 和 left+1,以及 right 和 right-1,我们都单独做一下重复值的处理。(其实没啥处理,就是简单的跳过) - -## 03、代码展示 - -> 四数之和其实与本题解法差不太多,把固定一个数变成两个,同样还是使用双指针进行求解就可以了。 - -
- -根据上面的分析,顺利得出代码(给一个Java版本的): - -```java -//java -class Solution { - public List> threeSum(int[] nums) { - Arrays.sort(nums); - List> res = new ArrayList(); - for (int i = 0; i < nums.length; i++) { - int target = 0 - nums[i]; - int l = i + 1; - int r = nums.length - 1; - if (nums[i] > 0) - break; - if (i == 0 || nums[i] != nums[i - 1]) { - while (l < r) { - if (nums[l] + nums[r] == target) { - res.add(Arrays.asList(nums[i], nums[l], nums[r])); - while (l < r && nums[l] == nums[l + 1]) l++; - while (l < r && nums[r] == nums[r - 1]) r--; - l++; - r--; - } else if (nums[l] + nums[r] < target) - l++; - else - r--; - } - } - } - return res; - } -} -``` - -执行结果: - -PNG - -给一个python版本的(这个我就直接拿别人的代码了,思想都一样) - -```python -//python -class Solution: - def threeSum(self, nums: List[int]) -> List[List[int]]: - - n=len(nums) - res=[] - if(not nums or n<3): - return [] - nums.sort() - res=[] - for i in range(n): - if(nums[i]>0): - return res - if(i>0 and nums[i]==nums[i-1]): - continue - L=i+1 - R=n-1 - while(L0): - R=R-1 - else: - L=L+1 - return res -``` - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/1.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/1.jpg" deleted file mode 100644 index 3f8be3f2..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/1.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/2.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/2.jpg" deleted file mode 100644 index 07103f69..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/2.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/3.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/3.jpg" deleted file mode 100644 index afbab6bc..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/3.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/4.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/4.jpg" deleted file mode 100644 index 64ba01ba..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/4.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/5.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/5.jpg" deleted file mode 100644 index 41de52a8..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/008/5.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009.md" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009.md" deleted file mode 100644 index 7f2a4e5f..00000000 --- "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009.md" +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Z字形变换(6) -date: 2020-07-08 ---- - -> 今天为大家分享一道让很多人头疼过的题目 - Z字形变化。 - -## 01、题目示例 - -> 额。。。不知道是不是我瞎,明明是N么(杠精勿扰,只是说说) - -
- -| 第6题:Z 字形变换 | -| ------------------------------------------------------------ | -| 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 **"LEETCODEISHIRING" **行数为 3 时,排列如下: | - -``` -L C I R -E T O E S I I G -E D H N -``` - -
- -之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:**"LCIRETOESIIGEDHN"**。 - -
- -请你实现这个将字符串进行指定行数变换的函数: - -``` -string convert(string s, int numRows); -``` - -**示例 1:** - -``` -输入: s = "LEETCODEISHIRING", numRows = 3 -输出: "LCIRETOESIIGEDHN" -``` - -**示例 2:** - -``` -输入: s = "LEETCODEISHIRING", numRows = 4 -输出: "LDREOEIIECIHNTSG" - -解释: -L D R -E O E I I -E C I H N -T S G -``` - -PNG - -## 02、题目分析 - -> 这是我比较推崇的一道“小学题目”,因为其没有任何复杂的思维逻辑,只需要按部就班,就可以顺利解答。难的是,按部就班的过程里,却极其容易出错。 - -
- -因为最终目的是变换字符串的顺序,并且题中也没有限制说不可用额外空间,所以我们秉承不重复造轮子的原则,想办法利用某种结构对原字符串做文章。 - -
- -假若我们采用示例2的数据来进行分析,输入字符串 s 为 "LEETCODEISHIRING", numRows 为 4 ,画成图大概长这样: - -PNG - -重点来了,**我们的目标是按行打印,那总得有个东西来存储每行的数据吧**?因为只需要存储**每行**的数据,那是不是用个数组就可以了。(当然,你硬说搞个map来存也没啥毛病,就是有点闲得蛋疼) - -
- -问题来了,那数组设置多大呢?自然是有多少行我们就设置多大呗,换句话说,numRows多大,我们的数组就设置多大。画成图大概就是下面这个样子: - -PNG - -存储的容器有了,原字符串也列出来是啥样了,现在嘎哈?自然就是把原字符串放到容器里咯。怎么放?**根据 numRows 的大小来回进行放置即可**(即从0到n-1,再从n-1到0)。具体的请看下图: - -PNG - -上面的图长得不得了,但是观察我们能看出来,**每 2n-2 即为一个周期**。到了这里,应该没有人会质疑这是一道小学题目了吧。。。把所有的字符串放完之后,大概就是下面这个样子: - -PNG - -最后一步,咱们让这个数组排排坐,就可以开始吃果果: - -PNG - -如果看不清楚,不如这样: - -PNG - -根据分析,得出代码(好久没翻go的牌子了): - -```go -//go -func convert(s string, numRows int) string { - if numRows == 1{ - return s - } - var b = []rune(s) - var res = make([]string, numRows) - var length = len(b) - var period = numRows * 2 - 2 - for i := 0 ;i < length; i ++ { - var mod = i % period - if mod < numRows { - res[mod] += string(b[i]) - } else { - res[period - mod] += string(b[i]) - } - } - return strings.Join(res, "") -} -``` - -执行结果: - -PNG - -上面的代码要强调两点: - -
- -第一:用了一个rune,这个其实是go里的用法,用来处理unicode或utf-8字符而已,并没有什么特别的。 - -第二:12-15行的意思是,在周期内,正着走 numRows-1 下,剩余的反着走。(也就是上面那个长长的图) - -
- -为了照顾Java的小伙伴,再给出一个Java版本的: - -```java -//java -class Solution { - public static String convert(String s, int numRows) { - if (numRows == 1) return s; - String[] arr = new String[numRows]; - Arrays.fill(arr, ""); - char[] chars = s.toCharArray(); - int len = chars.length; - int period = numRows * 2 - 2; - for (int i = 0; i < len; i++) { - int mod = i % period; - if (mod < numRows) { - arr[mod] += chars[i]; - } else { - arr[period - mod] += String.valueOf(chars[i]); - } - } - StringBuilder res = new StringBuilder(); - for (String ch : arr) { - res.append(ch); - } - return res.toString(); - } -} -``` - -和Go语言的示例一样,代码的关键仍然是计算轨迹的过程(10-17),这里再提供另外一种计算轨迹的方式: - -```java -//java -class Solution { - public String convert(String s, int numRows) { - if (numRows == 1) return s; - String[] arr = new String[numRows]; - Arrays.fill(arr, ""); - int i = 0, flag = -1; - for (char c : s.toCharArray()) { - arr[i] += c; - if (i == 0 || i == numRows - 1) flag = -flag; - i += flag; - } - StringBuilder res = new StringBuilder(); - for (String ch : arr) { - res.append(ch); - } - return res.toString(); - } -} -``` - -通过使用一个标志位,来使轨迹回移。(本质其实是一样的) - -
- -## 03、总结 - -> 这道题目的意义在于考察coding的能力,本身的思维过程并不复杂。有的同学一看这种题目,**就想通过二维数组来进行计算,殊不知已经落入了题目的陷阱(不信你试试,二维数组出错率一定远胜一维数组)**。当然,本题也是可以不借助额外空间来进行实现的,核心的逻辑完全相同,建议大家下去自己动手练习一下。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/1.gif" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/1.gif" deleted file mode 100644 index b3379672..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/1.gif" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/2.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/2.jpg" deleted file mode 100644 index 8da8f340..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/2.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/3.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/3.jpg" deleted file mode 100644 index 276efeb4..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/3.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/4.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/4.jpg" deleted file mode 100644 index 7db599ea..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/4.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/5.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/5.jpg" deleted file mode 100644 index ca7d0b0e..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/5.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/6.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/6.jpg" deleted file mode 100644 index 644f6e55..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/6.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/7.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/7.jpg" deleted file mode 100644 index e8cd8e12..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/7.jpg" and /dev/null differ diff --git "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/8.jpg" "b/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/8.jpg" deleted file mode 100644 index d79f5c8f..00000000 Binary files "a/website/1.0.\346\225\260\347\273\204\347\263\273\345\210\227/009/8.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101.md" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101.md" deleted file mode 100644 index 11f5fd78..00000000 --- "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101.md" +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: 删除链表倒数第N个节点(19) ---- - -## 01、哨兵节点 - -在链表的题目中,十道有九道会用到**哨兵节点**,所以我们先讲一下什么是哨兵节点。 - -哨兵节点,其实就是一个**附加在原链表最前面用来简化边界条件的附加节点,它的值域不存储任何东西,只是为了操作方便而引入。** - -比如原链表为a->b->c,则加了哨兵节点的链表即为x->a->b>c,如下图: - -PNG - -那我们为什么需要引入哨兵节点呢?举个例子,比如我们要删除某链表的第一个元素,**常见的删除链表的操作是找到要删元素的前一个元素**,假如我们记为 pre。我们通过: - ->
pre.Next = pre.Next.Next
- -来进行删除链表的操作。但是此时若是删除第一个元素的话,你就很难进行了,因为按道理来讲,此时第一个元素的前一个元素就是nil(空的),如果使用pre就会报错。那如果此时你设置了哨兵节点的话,此时的pre就是哨兵节点了。这样对于链表中的任何一个元素,你要删除都可以通过pre.Next=pre.Next.Next的方式来进行,这就是哨兵节点的作用。 - -下面我们看一道题目,看一下哨兵节点的应用 - -## 02、题目讲解 - -| 第19题:删除链表倒数第N个节点 | -| ------------------------------------------------------------ | -| 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 | - -**示例:** - -``` -给定一个链表: 1->2->3->4->5, 和 n = 2. -当删除了倒数第二个节点后,链表变为 1->2->3->5. -``` - -说明: - -- 给定的 n 保证是有效的。 - -进阶: - -- 你能尝试使用一趟扫描实现吗? - -
- -思路分析: - -> 首先我们思考,让我们删除倒数第N个元素,那我们**只要找到倒数第N个元素就可以了**,那怎么找呢?我们**只需要设置两个指针变量,中间间隔N-1元素。当后面的指针遍历完所有元素指向nil时,前面的指针就指向了我们要删除的元素。**如下图所示: - -PNG - -接下来,我们只要同时定位到要删除的元素的前1个元素,通过前面讲过的删除操作,就可以很顺利的完成这道题目啦。 - -## 03、解题过程 - -现在我们来完整捋一遍解题过程: - -1. 首先我们定义好哨兵节点result,指向哨兵节点的目标元素指针cur,以及目标指针cur的前一个指针pre,此时pre指向nil。 -2. 接下来我们开始遍历整个链表。 -3. 当head移动到距离目标元素cur的距离为N-1时,同时开始移动cur。 -4. 当链表遍历完之后,此时head指向nil,这时的cur就是我们要找的待删除的目标元素。 -5. 最后我们通过pre.Next = pre.Next.Next完成删除操作,就完成了整个解题过程。 - -下面是解题过程图,可以看得更清楚哦。 - -PNG - -## 04、题目解答 - -根据以上分析,我们可以得到下面的题解: - -```go -func removeNthFromEnd(head *ListNode, n int) *ListNode { - result := &ListNode{} - result.Next = head - var pre *ListNode - cur := result - i := 1 - for head != nil { - if i >= n { - pre = cur - cur = cur.Next - } - head = head.Next - i++ - } - pre.Next = pre.Next.Next - return result.Next -} -``` diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/1.png" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/1.png" deleted file mode 100644 index b2238d3a..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/1.png" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/2.png" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/2.png" deleted file mode 100644 index 44706d61..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/2.png" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/3.jpeg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/3.jpeg" deleted file mode 100644 index 7a7e6986..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/101/3.jpeg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102.md" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102.md" deleted file mode 100644 index 690ece4b..00000000 --- "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102.md" +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: 合并两个有序链表(21) ---- - -## 01、题目分析 - -| 第21题:合并两个有序链表 | -| ------------------------------------------------------------ | -| 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 | - -**示例:** - -``` -输入:1->2->4, 1->3->4 -输出:1->1->2->3->4->4 -``` - -
- -首先我们拿到题目乍眼一看,类似这种**链表的合并问题**。基本上马上可以想到**需要设置一个哨兵节点,这可以在最后让我们比较容易地返回合并后的链表。**(不懂哨兵节点的同学,可以先移驾到 [06.删除链表倒数第N个节点(19)](c1/006.md) 进行学习) - -
- -假设我们的链表分别为: - -l1 = [1,2,4] - -l2 = [1,3,4] - -同时我们设定一个 "prehead" 的哨兵节点,大概是下面这样: - -PNG - -## 02、题目图解 - -如上图所示,首先我们**维护一个 prehead 的哨兵节点**。我们其实**只需要调整它的 next 指针**。让它总是**指向l1或者l2中较小的一个,直到l1或者l2任一指向null**。这样到了最后,如果l1还是l2中任意一方还有余下元素没有用到,那**余下的这些元素一定大于prehead已经合并完的链表(因为是有序链表)**。我们只需要将这些元素全部追加到prehead合并完的链表后,最终就得到了我们需要的链表。大概流程如下: - -1. 首先我们将 prehead 指向 l1 或者 l2 中比较小的一个。如果相等,则任意一个都可以。此时的 l1 为 [2,4],l2 为 [1,3,4] - - PNG - -2. 我们继续上面的步骤。将 prehead 的链表指向 l1 和 l2 中较小的一个。现在这里就是指向1。 - - PNG - -3. 反复上图步骤。 - - PNG - -4. 现在 prehead.Next 就是我们需要的链表。 - -
- -## 03、Go语言示例 - -根据以上分析,我们可以得到下面的题解: - -```go -func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { - prehead := &ListNode{} - result := prehead - for l1 != nil && l2 != nil { - if l1.Val < l2.Val { - prehead.Next = l1 - l1 = l1.Next - }else{ - prehead.Next = l2 - l2 = l2.Next - } - prehead = prehead.Next - } - if l1 != nil { - prehead.Next = l1 - } - if l2 != nil { - prehead.Next = l2 - } - return result.Next -} -``` diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/1.png" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/1.png" deleted file mode 100644 index b9f0adea..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/1.png" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/2.png" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/2.png" deleted file mode 100644 index 85ae27a9..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/2.png" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/3.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/3.jpg" deleted file mode 100644 index d45c829f..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/3.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/4.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/4.jpg" deleted file mode 100644 index a77366ad..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/102/4.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103.md" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103.md" deleted file mode 100644 index 5f92f3c9..00000000 --- "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103.md" +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: 环形链表(21) ---- - -> 今天为大家带来,**链表检测成环**的经典题目。如果你觉得你会了,请你不妨耐心些认真看下去,我相信会有一些不一样的收获!还是先从一道题目开始哟,准备好了吗? Let' s go ! -## 01、题目分析 - -| 第141题:环形链表 | -| ------------------------------------------------------------ | -| 给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。 | - -**示例 1:** - -``` -输入:head = [3,2,0,-4], pos = 1 -输出:true -解释:链表中有一个环,其尾部连接到第二个节点。 -``` - -PNG - -**示例 2:** - -``` -输入:head = [1,2], pos = 0 -输出:true -解释:链表中有一个环,其尾部连接到第一个节点。 -``` - -PNG - -**示例 3:** - -``` -输入:head = [1], pos = -1 -输出:false -解释:链表中没有环。 -``` - -PNG - -> **题目可能你会觉得过于简单!但是不妨耐心看完!** -> -> **则一定会有收获!** - -## 02、题目分析 - -**题解一:哈希表判定** - -
- -思路:**通过hash表来检测节点之前是否被访问过**,来判断链表是否成环。这是最容易想到的一种题解了。过于简单,直接上代码: - -```go -func hasCycle(head *ListNode) bool { - m := make(map[*ListNode]int) - for head != nil { - if _,exist := m[head];exist { - return true - } - m[head]= 1 9 - head = head.Next - } - return false12 -} -``` - -
- -**题解二:JS特殊解法** - -
- -相信对于 JS 中的 JSON.stringify() 方法大家都用过,主要用于**将 JS 对象 转换为 JSON 字符串**。基本使用如下: - -```go -var car = { - name: '小喵', - age: 20, -} -var str = JSON.stringify(car); -console.log(str)  -//=> {"name":"小喵","age":20} -``` - -大家想一下,如果是自己实现这样的一个函数,我们需要处理什么样的特殊情况?对,就是**循环引用**。因为对于循环引用,我们很难通过 JSON 的结构将其进行展示!比如下面: - -```go - var a = {} - var b = { - a: a - } - a.b = b - console.log(JSON.stringify(a)) - //=> TypeError: Converting circular structure to JSON -``` - -那我们思考,对于环形链表,是不是就是一个循环结构呢?当然是!因为只要是环形链表,它一定存在类似以下代码: - ->
a.Next = b
-> ->
b.Next = a
- -所以我们可以通过 JSON.stringify() 的特性进行求解: - -```go -var hasCycle = function(head) { - try{ - JSON.stringify(head) - }catch(e){ - return true - } - return false -}; -``` - -当然,这种解法并不是建议的标准题解!在此列出是为了拓宽思维!(大家如有兴趣,可以自己去看下JSON.stringify 内部的实现,是如何检测循环引用的。) - -
- -**题解三:双指针解法** - -
- -本题标准解法!常识内容,**必须掌握**! - -
- -思路来源:先想象一下,**两名运动员以不同速度在跑道上进行跑步**会怎么样?**相遇**!好了,这道题你会了。 - -
- -解题方法:通过**使用具有 不同速度 的快、慢两个指针遍历链表**,空间复杂度可以被降低至 O(1)。**慢指针每次移动一步,而快指针每次移动两步**。 - -假设链表为 PNG, 其步骤如下: - -PNG - -分析完毕,直接上代码: - -```go -func hasCycle(head *ListNode) bool { - if head == nil { - return false - } - fast := head.Next // 快指针,每次走两步 - for fast != nil && head != nil && fast.Next != nil { - if fast == head { // 快慢指针相遇,表示有环 - return true - } - fast = fast.Next.Next - head = head.Next // 慢指针,每次走一步 - } - return false -} -``` - -这里我们要特别说明一下,为什么慢指针的步长设置为 1 ,而快指针步长设置为 2 。 - -
- -首先,慢指针步长为 1,很容易理解,因为我们需要让**慢指针步行至每一个元素**。而快指针步长为 2 ,通俗点可以理解为他们的**相对速度只差 1**,快的只能一个一个格子的去追慢的,必然在一个格子相遇。 - -
- -如果没看懂,我们来分析:在快的快追上慢的时,他们之间一定是只差 1 个或者 2 个格子。如果落后 1 个,那么下一次就追上了。如果落后 2 个,那么下一次就落后 1 个,再下一次就能追上!如下图: - -PNG - -所以我们的快指针的步长可以设置为 2 。 - -## 03、特别说明 - -我们常会遇到一些所谓的“简单题目“,然后用着前人留下来的那些”经典题解“迅速作答。在解题的过程中,追求公式化、模板化。当然,这个过程是好的,因为社会、工作、学业要求我们如此!但是,我希望我们也可以留下一些自己的思考,纵然不是最优解,但是是我们自己想到的、创造的!真正在算法题中去收获快乐~ \ No newline at end of file diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/1.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/1.jpg" deleted file mode 100644 index b5e051f7..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/1.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/2.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/2.jpg" deleted file mode 100644 index f0155f84..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/2.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/3.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/3.jpg" deleted file mode 100644 index 7f8be2b2..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/3.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/4.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/4.jpg" deleted file mode 100644 index 5b561e2c..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/4.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/5.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/5.jpg" deleted file mode 100644 index 5e2b5290..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/5.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/6.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/6.jpg" deleted file mode 100644 index bcb1e739..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/103/6.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104.md" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104.md" deleted file mode 100644 index d2f0f0cc..00000000 --- "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104.md" +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: 两数相加(2) -date: 2020-07-09 ---- - -> 前几天写了一篇“小白为了面试如何刷题”的文章大受好评。随之而来的是好多小伙伴私下跑来问我“**浩哥,你说前200道题很好,但是前两百道题的难度很大,我不会怎么办**”这问题我想了一两天。。。好吧,既然你们说难不会。那我干脆就把前两百道题都给你们配上图解,全部安排,这样总可以了吧?牛气冲天有木有,哪个公号主敢这么干的!奥利给,搞起。今儿为大家分享经典面试题目 - 两数相加。做过的朋友,也不要急着叉掉,不妨借机复习一番。 - -## 01、题目示例 - -> 各数据结构中的“加减乘除”都是很爱考察的内容。 - -| 第2题:两数相加 | -| ------------------------------------------------------------ | -| 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 | - -给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 - -
- -如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 - -
- -您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 - -
- -**示例:** - -``` -输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) -输出:7 -> 0 -> 8 -原因:342 + 465 = 807 -``` - -## 02、算法图解 - -> 烧饼(哨兵)节点:烧饼节点就是说有一个节点长的像烧饼,站在最前面。往往第一个节点小子都会来啃一口,因为是牛肉拔丝烧饼,扯不掉就连起来了。。。好了,我实在编不下去了~囧.... - -
- -不了解哨兵节点的可以看下: - -
- - [删除链表倒数第N个节点(19)](1.0.数组系列/101.md) - -
- -好了,了解了哨兵节点,其实这道题和哨兵节点**并没有什么毛线关系,**我只是让你复习一下(会不会想打我)。现在开始正式分析题目。 - -
- -老样子,我们还是先画图,假若我们的链表是 (2 -> 4 -> 3) + (5 -> 6 -> 4) ,大概就是这样(注意,这里我们其实是要完成 342 + 465): - -PNG - -加法肯定是从最低位到最高位进行相加,也就是这里的**链表头到链表尾进行相加,所以需要遍历链表**。我们令 l1 和 l2 指向两个链表的头,用一个 tmp 值来存储同一位相加的结果,以及一个新的链表来存储 tmp 的值。(为什么不直接用新链表存储结果,而是用 tmp 先存储结果,再用新链表存储 tmp 的值呢?请继续往下看) - -PNG - -记住:**所有模拟运算的题目,都需要考虑进位**。这里因为个位不涉及进位,开始计算十位。我们同时遍历 l1,l2,以及新链表到下一位。 - -PNG - -重复上面的操作,可以看到十位与个位不同,发生了进位。这时,刚才的 tmp 就有了用武之地。**我们使用 tmp 携带进位的值到下一位的运算**。自然,这里的链表也不能直接存储 tmp 的值了,而是要存储 tmp%10 的值。重复这个步骤,**直到两个链表都遍历完成,并且 tmp 没有进位值**: - -PNG - -现在只需要返回我们的新链表就可以了。问题来了,**因为我们没有构造哨兵节点,所以此时不太容易直接返回新链表**。所以在整个流程的第一步,我们还需要用一个哨兵节点指向我们的新链表。 - -PNG - -分析完毕,直接上代码(好久没翻Go的牌子了): - -```go -//go -func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { - list := &ListNode{0, nil} - //这里用一个result,只是为了后面返回节点方便,并无他用 - result := list - tmp := 0 - for l1 != nil || l2 != nil || tmp != 0 { - if l1 != nil { - tmp += l1.Val - l1 = l1.Next - } - if l2 != nil { - tmp += l2.Val - l2 = l2.Next - } - list.Next = &ListNode{tmp % 10, nil} - tmp = tmp / 10 - list = list.Next - } - return result.Next -} -``` - -执行结果: - -PNG - -## 03、总结 - -> 1950年6月19日,毛泽东写信给当时的教育部部长马叙伦:“要各校注意健康第一,学习第二。营养不足,宜酌增经费。”1951年9月底,毛泽东接见安徽参加国庆的代表团,代表团成员中有渡江小英雄马三姐。毛泽东关切地问她念书情况,还送她一本精美的笔记本,并且在扉页上题词:**好好学习,天天向上**。这8个字的题词迅速在全国传播开来。 - -
- -今天的题目到这里就结束了。你学会了吗?快来评论区留下你的想法吧! - diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/1.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/1.jpg" deleted file mode 100644 index edc89320..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/1.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/2.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/2.jpg" deleted file mode 100644 index fbdd8ee0..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/2.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/3.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/3.jpg" deleted file mode 100644 index a5e3e1ef..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/3.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/4.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/4.jpg" deleted file mode 100644 index 134eb0ea..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/4.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/5.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/5.jpg" deleted file mode 100644 index 4ac87bb7..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/5.jpg" and /dev/null differ diff --git "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/6.jpg" "b/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/6.jpg" deleted file mode 100644 index 59e8bb0c..00000000 Binary files "a/website/1.1.\351\223\276\350\241\250\347\263\273\345\210\227/104/6.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201.md" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201.md" deleted file mode 100644 index 34e88a69..00000000 --- "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201.md" +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: 爬楼梯(70) ---- - -## 01、概念讲解 - -> 关于动态规划的资料很多,官方的定义是**指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解**。概念中的**各阶段之间的关系**,其实指的就是**状态转移方程**。很多人觉得DP难(下文统称动态规划为DP),根本原因是因为**DP跟一些固定形式的算法不同**(比如DFS、二分法、KMP),它没有实际的步骤规定第一步、第二步来做什么,所以准确来说,**DP其实是一种解决问题的思想**。 - - -
这种思想的本质是:**一个规模比较大的问题**(可以用两三个参数表示的问题),可以**通过若干规模较小的问题的结果来得到**的(通常会寻求到一些特殊的计算逻辑,如求最值等),如下图所示,一个大规模的问题由若干个子问题组成。 - -
img - - -
那么我们应该如何通过子问题去得到大规模问题呢?这就用到了**状态转移方程**(上面有介绍状态转移方程哦,不懂的请往上翻哦),我们一般看到的状态转移方程,基本都是这样: - -``` -opt :指代特殊的计算逻辑,通常为 max or min。 - -i,j,k 都是在定义DP方程中用到的参数。 - -dp[i] = opt(dp[i-1])+1 - -dp[i][j] = w(i,j,k) + opt(dp[i-1][k]) - -dp[i][j] = opt(dp[i-1][j] + xi, dp[i][j-1] + yj, ...) -``` - - - -
每一个状态转移方程,多少都有一些细微的差别。这个其实很容易理解,世间的关系多了去了,不可能抽象出完全可以套用的公式。所以我个人其实**不建议去死记硬背各种类型的状态转移方程**。但是DP的题型真的就完全无法掌握,无法归类进行分析吗?我认为不是的。在本系列中,我将由简入深为大家讲解动态规划这个主题。 - - ## 02、题目分析 - -我们先看一道最简单的DP题目,熟悉DP的概念: - -| 第70题:爬楼梯 | -| :----------------------------------------------------------- | -| 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? **注意:**给定 *n* 是一个正整数。 | - -**示例 1:** - -``` -输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 -1. 1 阶 + 1 阶 -2. 2 阶 -``` - -**示例 2:** - -``` -输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 -1. 1 阶 + 1 阶 + 1 阶 -2. 1 阶 + 2 阶 -3. 2 阶 + 1 阶 -``` - -## 03 、图解分析 - -通过分析我们可以明确,该题可以被分解为一些包含最优子结构的子问题,即它的**最优解可以从其子问题的最优解来有效地构建**。满足“**将大问题分解为若干个规模较小的问题**”的条件。所我们令 **dp[n] 表示能到达第 n 阶**的方法总数,可以得到如下状态转移方程: - ->
dp[n]=dp[n-1]+dp[n-2]
- -- 上 1 阶台阶:有1种方式。 - -- 上 2 阶台阶:有1+1和2两种方式。 - -- 上 3 阶台阶:到达第3阶的方法总数就是到第1阶和第2阶的方法数之和。 - -- 上 n 阶台阶,到达第n阶的方法总数就是到第 (n-1) 阶和第 (n-2) 阶的方法数之和。 - -
img - -## 04、GO语言示例 - -根据以上分析,可以得到代码如下: - -```go -func climbStairs(n int) int { - if n == 1 { - return 1 - } - dp := make([]int, n+1) - dp[1] = 1 - dp[2] = 2 - for i := 3; i <= n; i++ { - dp[i] = dp[i-1] + dp[i-2] - } - return dp[n] -} -``` diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201/1.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201/1.png" deleted file mode 100644 index da859a9f..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201/1.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201/2.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201/2.png" deleted file mode 100644 index 2c0bedbd..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/201/2.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202.md" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202.md" deleted file mode 100644 index 02d04cf5..00000000 --- "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202.md" +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: 最大子序和(53) ---- - -> 在上一篇文章[011.动态规划系列 —第一讲(70)](c1/011.md)中,我们讲解了DP的概念并且通过示例了解了什么是动态规划。本篇中,我们将继续通过1道简单题型,进一步学习动态规划的思想。 -## 01、题目分析 - -| 第53题:最大子序和 | -| ------------------------------------------------------------ | -| 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 | - -**示例:** - -``` -输入: [-2,1,-3,4,-1,2,1,-5,4], -输出: 6 -解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 -``` -拿到题目请不要直接看下方题解,先自行思考2-3分钟.... - -## 02、题目图解 - -首先我们分析题目,**一个连续子数组一定要以一个数作为结尾**,那么我们可以将状态定义成如下: - -
- ->
dp[i]:表示以 nums[i] 结尾的连续子数组的最大和。
- -
那么为什么这么定义呢?因为这样定义其实是最容易想到的!在上一节中我们提到,状态转移方程其实是通过1-3个参数的方程来描述小规模问题和大规模问题间的关系。 - -当然,如果你没有想到,其实也非常正常!因为**该问题最早于 1977 年提出,但是直到 1984 年才被发现了线性时间的最优解法。** - -根据状态的定义,我们继续进行分析:如果要得到 dp[i],那么 nums[i] 一定会被选取。并且 dp[i] 所表示的连续子序列与 dp[i-1] 所表示的连续子序列很可能就差一个 nums[i] 。即: - -
- ->
dp[i] = dp[i-1]+nums[i] , if (dp[i-1] >= 0)
- -
但是这里我们遇到一个问题,**很有可能 dp[i-1] 本身是一个负数**。那这种情况的话,**如果 dp[i] 通过 dp[i-1]+nums[i] 来推导,那么结果其实反而变小了**,因为我们 dp[i] 要求的是最大和。所以在这种情况下,**如果 dp[i-1] < 0,那么 dp[i] 其实就是 nums[i] 的值**。即 - -
- ->
dp[i] = nums[i] , if (dp[i-1] < 0)
- -
综上分析,我们可以得到: - -
- ->
dp[i]=max(nums[i], dp[i−1]+nums[i])
- -
得到了状态转移方程,但是我们还需要通过一个已有的状态的进行推导,我们可以想到 **dp[0] 一定是以 nums[0] 进行结尾**,所以 - -
- ->
dp[i] = dp[i-1]+nums[i] , if (dp[i-1] >= 0)
->
dp[0] = nums[0]
- -
在很多题目中,**因为 dp[i] 本身就定义成了题目中的问题,所以 dp[i] 最终就是要的答案**。但是这里状态中的定义,**并不是题目中要的问题,不能直接返回最后的一个状态 (这一步经常有初学者会摔跟头)**。所以最终的答案,其实我们是寻找: - -
- ->
max(dp[0], dp[1], ..., d[i-1], dp[i])
- -
分析完毕,我们绘制成图(图中假定 nums 为 [-2,1,-3,4,-1,2,1,-5,4]): - -PNG - -## 03、Go语言示例 - - 根据以上分析,可以得到代码如下: - -```go -//Go -func maxSubArray(nums []int) int { - if len(nums) < 1 { - return 0 - } - dp := make([]int, len(nums)) - //设置初始化值 - dp[0] = nums[0] - for i := 1; i < len(nums); i++ { - //处理 dp[i-1] < 0 的情况 - if dp[i-1] < 0 { - dp[i] = nums[i] - } else { - dp[i] = dp[i-1] + nums[i] - } - } - result := -1 << 31 - for _, k := range dp { - result = max(result, k) - } - return result -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} -``` - -我们可以进一步精简代码为: - -```go -//Go -func maxSubArray(nums []int) int { - if len(nums) < 1 { - return 0 - } - dp := make([]int, len(nums)) - result := nums[0] - dp[0] = nums[0] - for i := 1; i < len(nums); i++ { - dp[i] = max(dp[i-1]+nums[i], nums[i]) - result = max(dp[i], result) - } - return result -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} -``` - -> 复杂度分析:时间复杂度:O(N)。空间复杂度:O(N) \ No newline at end of file diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202/1.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202/1.jpg" deleted file mode 100644 index 8e154042..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/202/1.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203.md" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203.md" deleted file mode 100644 index b6589bd8..00000000 --- "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203.md" +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: 最长上升子序列(300) ---- - -> 在上一篇中,我们了解了什么是DP(动态规划),并且通过DP中的经典问题 "最大子序和",学习了**状态转移方程**应该如何定义。在本节中,我们将沿用之前的分析方法,通过一道例题,进一步巩固之前的内容! -## 01、题目分析 - -| 第300题:最长上升子序列 | -| ------------------------------------------------------ | -| 给定一个无序的整数数组,找到其中最长上升子序列的长度。 | - -**示例:** - -``` -输入: [10,9,2,5,3,7,101,18] -输出: 4 -解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 -``` - -说明: - -- 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 - -> 这道题有一定难度哦!如果没有思路请回顾上一篇的学习内容! -> 不建议直接看题解! - -## 02、题目图解 - -首先我们分析题目,要找的是**最长上升子序列**(Longest Increasing Subsequence,LIS)。因为题目中没有要求连续,所以**LIS可能是连续的,也可能是非连续的。**同时,**LIS符合可以从其子问题的最优解来进行构建**的条件。所以我们可以尝试用动态规划来进行求解。首先我们定义状态: - -
->
dp[i] :表示以nums[i]结尾的最长上升子序列的长度
- -我们假定nums为[1,9,5,9,3],如下图: - -PNG - -我们分两种情况进行讨论: - -- 如果nums[i]比前面的所有元素都小,那么dp[i]等于1(即它本身)(该结论正确) -- 如果nums[i]前面存在比他小的元素nums[j],那么dp[i]就等于dp[j]+1(**该结论错误,比如nums[3]>nums[0],即9>1,但是dp[3]并不等于dp[0]+1)** - -
-我们先初步得出上面的结论,但是我们发现了一些问题。**因为dp[i]前面比他小的元素,不一定只有一个!** - -可能除了 nums[j],还包括 nums[k],nums[p] **等等等等**。所以 dp[i] 除了可能等于 dp[j]+1,还有可能等于 dp[k]+1,dp[p]+1 **等等等等**。所以我们求 dp[i],需要找到 dp[j]+1,dp[k]+1,dp[p]+1 **等等等等** 中的最大值。(我在3个等等等等上都进行了加粗,主要是因为初学者非常容易在这里摔跟斗!这里强调的目的是希望能记住这道题型!) 即: - -
->
dp[i] = max(dp[j]+1,dp[k]+1,dp[p]+1,.....)
->
只要满足:
->
nums[i] > nums[j]
->
nums[i] > nums[k]
->
nums[i] > nums[p]
->
....
- -
-最后,我们只需要找到dp数组中的最大值,就是我们要找的答案。 - -分析完毕,我们绘制成图: - -PNG - -## 03、Go语言示例 - -根据以上分析,可以得到代码如下: - -```go -func lengthOfLIS(nums []int) int { - if len(nums) < 1 { - return 0 - } - dp := make([]int, len(nums)) - result := 1 - for i := 0; i < len(nums); i++ { - dp[i] = 1 - for j := 0; j < i; j++ { - if nums[j] < nums[i] { - dp[i] = max(dp[j]+1, dp[i]) - } - } - result = max(result, dp[i]) - } - return result -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} -``` \ No newline at end of file diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203/1.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203/1.png" deleted file mode 100644 index 3ea35527..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203/1.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203/2.jpeg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203/2.jpeg" deleted file mode 100644 index b3b1cd90..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/203/2.jpeg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204.md" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204.md" deleted file mode 100644 index 0f17f1ce..00000000 --- "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204.md" +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: 三角形最小路径和(120) ---- - -> 在上一篇中,我们通过题目**“最长上升子序列” 以及 "最大子序和",**学习了DP(动态规划)在**线性关系**中的分析方法。这种分析方法,也在运筹学中被称为“线性动态规划”,具体指的是 “目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的是求目标函数的最大值或最小值”。这点大家作为了解即可,不需要死记,更不要生搬硬套! -> -> 在本节中,我们将继续分析一道略微区别于之前的题型,希望可以由此题与之前的题目进行对比论证,进而顺利求解! -## 01、题目分析 - -| 第120题:三角形最小路径和 | -| ------------------------------------------------------------ | -| 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 | - -**例如,给定三角形:** - -``` -[ - [2], - [3,4], - [6,5,7], - [4,1,8,3] -] -``` - -则自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。 - -> **这道题有一定难度哦!如果没有思路请回顾上一篇的学习内容!** -> -> **不建议直接看题解!** - -## 02、题目图解 - -首先我们分析题目,要找的是**三角形最小路径和,**这是个啥意思呢?假设我们有一个三角形:[[2], [3,4], [6,5,7], - -[4,1,8,3]] - -PNG - -那从上到下的最小路径和就是2-3-5-1,等于11。 - -由于我们是使用数组来定义一个三角形,所以便于我们分析,我们将三角形稍微进行改动: - -PNG - -这样相当于我们将整个三角形进行了拉伸。这时候,我们根据题目中给出的条件:每一步只能移动到下一行中相邻 - -的结点上。其实也就等同于,**每一步我们只能往下移动一格或者右下移动一格**。将其转化成代码,假如2所在的元 - -素位置为[0,0],那我们往下移动就只能移动到[1,0]或者[1,1]的位置上。假如5所在的位置为[2,1],同样也只能移动 - -到[3,1]和[3,2]的位置上。如下图所示: - -PNG - -题目明确了之后,现在我们开始进行分析。题目很明显是**一个找最优解的问题,并且可以从子问题的最优解进** - -**行构建**。所以我们通过动态规划进行求解。首先,我们定义状态: - ->
dp[i][j] : 表示包含第i行j列元素的最小路径和
- -我们很容易想到可以自顶向下进行分析。并且,无论最后的路径是哪一条,它一定要经过最顶上的元素,即 [0,0]。所以我们需要对 dp[0][0] 进行初始化。 - ->
dp[0][0] = [0][0]位置所在的元素值
- -继续分析,如果我们要求dp[i][j],那么其一定会从自己头顶上的两个元素移动而来。 - -PNG - -如5这个位置的最小路径和,要么是从2-3-5而来,要么是从2-4-5而来。然后取两条路径和中较小的一个即可。进 - -而我们得到状态转移方程: - ->
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j]) + triangle[i][j]
- -但是,我们这里会遇到一个问题!除了最顶上的元素之外, - -PNG - -**最左边的元素只能从自己头顶而来**。(2-3-6-4) - -PNG - -**最右边的元素只能从自己左上角而来**。(2-4-7-3) - -然后,我们观察发现,**位于第2行的元素,都是特殊元素**(**因为都只能从[0,0]的元素走过来**) - -PNG - -我们可以直接将其特殊处理,得到: - ->
dp[1][0] = triangle[1][0] + triangle[0][0]
->
dp[1][1] = triangle[1][1] + triangle[0][0]
- -
- -最后,我们只要找到**最后一行元素中,路径和最小的一个**,就是我们的答案。即: - ->
l:dp数组长度
->
result = min(dp[l-1,0],dp[l-1,1],dp[l-1,2]....)
- -综上我们就分析完了,我们总共进行了4步: - -1. 定义状态 -2. 总结状态转移方程 -3. 分析状态转移方程不能满足的特殊情况。 -4. 得到最终解 - -## 03、Go语言示例 - -根据以上分析,可以得到代码如下: - -```go -func minimumTotal(triangle [][]int) int { - if len(triangle) < 1 { - return 0 - } - if len(triangle) == 1 { - return triangle[0][0] - } - dp := make([][]int, len(triangle)) - for i, arr := range triangle { - dp[i] = make([]int, len(arr)) - } - result := 1<<31 - 1 - dp[0][0] = triangle[0][0] - dp[1][1] = triangle[1][1] + triangle[0][0] - dp[1][0] = triangle[1][0] + triangle[0][0] - - for i := 2; i < len(triangle); i++ { - for j := 0; j < len(triangle[i]); j++ { - if j == 0 { - dp[i][j] = dp[i-1][j] + triangle[i][j] - } else if j == (len(triangle[i]) - 1) { - dp[i][j] = dp[i-1][j-1] + triangle[i][j] - } else { - dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j] - } - } - } - for _,k := range dp[len(dp)-1] { - result = min(result, k) - } - return result -} - -func min(a, b int) int { - if a > b { - return b - } - return a -} -``` - -运行结果: - -PNG - -运行上面的代码,我们发现使用的内存过大。我们有没有什么办法可以压缩内存呢?通过观察我们发现,**在我们** - -**自顶向下的过程中,其实我们只需要使用到上一层中已经累积计算完毕的数据,并且不会再次访问之前的元素数** - -**据**。绘制成图如下: - -PNG - -优化后的代码如下: - -```go -func minimumTotal(triangle [][]int) int { - l := len(triangle) - if l < 1 { - return 0 - } - if l == 1 { - return triangle[0][0] - } - result := 1<<31 - 1 - triangle[0][0] = triangle[0][0] - triangle[1][1] = triangle[1][1] + triangle[0][0] - triangle[1][0] = triangle[1][0] + triangle[0][0] - for i := 2; i < l; i++ { - for j := 0; j < len(triangle[i]); j++ { - if j == 0 { - triangle[i][j] = triangle[i-1][j] + triangle[i][j] - } else if j == (len(triangle[i]) - 1) { - triangle[i][j] = triangle[i-1][j-1] + triangle[i][j] - } else { - triangle[i][j] = min(triangle[i-1][j-1], triangle[i-1][j]) + triangle[i][j] - } - } - } - for _,k := range triangle[l-1] { - result = min(result, k) - } - return result -} - -func min(a, b int) int { - if a > b { - return b - } - return a -} -``` - -运行结果: - -PNG - diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/1.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/1.png" deleted file mode 100644 index 76008243..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/1.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/10.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/10.jpg" deleted file mode 100644 index 98aa8634..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/10.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/2.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/2.png" deleted file mode 100644 index 4b2084ca..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/2.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/3.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/3.png" deleted file mode 100644 index 57d00db3..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/3.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/4.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/4.png" deleted file mode 100644 index 7a0c3ad4..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/4.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/5.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/5.png" deleted file mode 100644 index d7a26c7b..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/5.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/6.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/6.png" deleted file mode 100644 index 652b3d76..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/6.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/7.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/7.png" deleted file mode 100644 index 2901edf3..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/7.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/8.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/8.jpg" deleted file mode 100644 index 38f40089..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/8.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/9.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/9.png" deleted file mode 100644 index c6453f9c..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/204/9.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205.md" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205.md" deleted file mode 100644 index dcf9b8fa..00000000 --- "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205.md" +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: 最小路径和(64) ---- - -> 在上一篇中,我们通过分析,顺利完成了“**三角形最小路径和**”的动态规划题解。在本节中,我们继续看一道相似题型,以求能完全掌握这种“路径和”的问题。话不多说,先看题目: -## 01、题目分析 - -| 第64题:最小路径和 | -| ------------------------------------------------------------ | -| 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 | - -说明:每次只能向下或者向右移动一步。 - -**示例:** - -``` -输入: -[ - [1,3,1], - [1,5,1], - [4,2,1] -] -输出: 7 -解释: 因为路径 1→3→1→1→1 的总和最小。 -``` - -
- -> **这道题有一定难度哦!如果没有思路请回顾上一篇的学习内容!** -> -> **不建议直接看题解!** - -## 02、题目图解 - -首先我们分析题目,要找的是 **最小路径和,**这是个啥意思呢?假设我们有一个 m * n 的矩形 :[[1,3,1],[1,5,1],[4,2,1]] - -PNG - -那从**左上角到右下角**的最小路径和,我们可以很容易看出就是 1-3-1-1-1 ,这一条路径,结果等于 7 。 - -
- -题目明确了,我们继续进行分析。该题与上一道求三角形最小路径和一样,题目明显符合可以**从子问题的最优解进行构建**,所以我们考虑使用动态规划进行求解。首先,我们定义状态: - ->
dp[i][j] : 表示包含第i行j列元素的最小路径和
- -同样,因为任何一条到达右下角的路径,都会经过 [0,0] 这个元素。所以我们需要对 dp[0][0] 进行初始化。 - ->
dp[0][0] = [0][0]位置所在的元素值
- -继续分析,根据题目给的条件,如果我们要求 dp[i][j] ,那么它一定是从自己的上方或者左边移动而来。如下图所示: - -PNG - ->
5,只能从3或者1移动而来
-> ->
2,只能从5或者4移动而来
-> ->
4,从1移动而来
-> ->
3,从1移动而来
-> ->
(红色位置必须从蓝色位置移动而来)
- -进而我们得到状态转移方程: - ->
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
- -同样我们需要考虑两种特殊情况: - -- 最上面一行,只能由左边移动而来(1-3-1) -- 最左边一列,只能由上面移动而来(1-1-4) - -PNG - -最后,因为我们的目标是**从左上角走到右下角**,**整个网格的最小路径和其实就是包含右下角元素的最小路径和**。即: - ->
设:dp的长度为l
-> ->
最终结果就是:dp[l-1][len(dp[l-1])-1]
- -综上我们就分析完了,我们总共进行了 4 步: - -1. 定义状态 -2. 总结状态转移方程 -3. 分析状态转移方程不能满足的特殊情况。 -4. 得到最终解 - -## 03、GO语言示例 - - 根据以上分析,可以得到代码如下: - -```go -func minPathSum(grid [][]int) int { - l := len(grid) - if l < 1 { - return 0 - } - dp := make([][]int, l) - for i, arr := range grid { - dp[i] = make([]int, len(arr)) - } - dp[0][0] = grid[0][0] - for i := 0; i < l; i++ { - for j := 0; j < len(grid[i]); j++ { - if i == 0 && j != 0 { - dp[i][j] = dp[i][j-1] + grid[i][j] - } else if j == 0 && i != 0 { - dp[i][j] = dp[i-1][j] + grid[i][j] - } else if i !=0 && j != 0 { - dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j] - } - } - } - return dp[l-1][len(dp[l-1])-1] -} - -func min(a, b int) int { - if a > b { - return b - } - return a -} -``` - -运行结果: - -PNG - -同样,运行上面的代码,我们发现使用的内存过大。有没有什么办法可以压缩内存呢?通过观察我们发现,**在我们自左上角到右下角计算各个节点的最小路径和的过程中,我们只需要使用到之前已经累积计算完毕的数据,并且不会再次访问之前的元素数据**。绘制成图如下:(大家看这个过程像不像扫雷,其实如果大家研究扫雷外挂的话,就会发现在扫雷的核心算法中,就有一处颇为类似这种分析方法,这里就不深究了) - -PNG - -优化后的代码如下: - -```go -func minPathSum(grid [][]int) int { - l := len(grid) - if l < 1 { - return 0 - } - for i := 0; i < l; i++ { - for j := 0; j < len(grid[i]); j++ { - if i == 0 && j != 0 { - grid[i][j] = grid[i][j-1] + grid[i][j] - } else if j == 0 && i != 0 { - grid[i][j] = grid[i-1][j] + grid[i][j] - } else if i !=0 && j != 0 { - grid[i][j] = min(grid[i-1][j], grid[i][j-1]) + grid[i][j] - } - } - } - return grid[l-1][len(grid[l-1])-1] -} - -func min(a, b int) int { - if a > b { - return b - } - return a -} -``` - -运行结果: - -PNG - -
- -> **课后思考:路径和类问题和之前的子序列类问题有何区别?** \ No newline at end of file diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/1.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/1.jpg" deleted file mode 100644 index 8d5ed526..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/1.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/2.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/2.jpg" deleted file mode 100644 index 858043aa..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/2.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/3.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/3.jpg" deleted file mode 100644 index 97db1610..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/3.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/4.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/4.jpg" deleted file mode 100644 index 73afdaa7..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/4.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/5.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/5.jpg" deleted file mode 100644 index a64d6e58..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/5.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/6.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/6.jpg" deleted file mode 100644 index 1fda252a..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/205/6.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206.md" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206.md" deleted file mode 100644 index c6cd7162..00000000 --- "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206.md" +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: 打家劫舍(198) ---- - -> 在前两篇中,我们分别学习了 “**三角形最小路径和**” 以及“**矩形最小路径和**” 的问题,相信已经掌握了这类题型的解题方式。我们只要**明确状态的定义**,基本上都可以顺利求解。 -> -> 在本节中,我们将回归一道简单点的题目,目的是剖析一下**状态定义的过程**,并且举例说明如果状态定义错误,会对我们带来多大困扰!希望大家不要轻视! -## 01、题目分析 - -| 第198题:打家劫舍 | -| ------------------------------------------------------------ | -| 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 | - -给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 - -**示例 1:** - -``` -输入: [1,2,3,1] -输出: 4 -解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 - 偷窃到的最高金额 = 1 + 3 = 4 。 -``` - -**示例 2:** - -``` -输入: [2,7,9,3,1] -输出: 12 -解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 - 偷窃到的最高金额 = 2 + 9 + 1 = 12 。 -``` - -
- -> **本题主要剖析状态定义的过程!强烈建议先进行前面5节内容的学习!** -> -> **以达到最好的学习效果!** - -## 02、题目图解 - -假设有i间房子,我们可能会定义出两种状态: - -- dp[i] : 偷盗 含 第 i个房子时,所获取的最大利益 -- dp[i] : 偷盗 至 第 i个房子时,所获取的最大利益 - -
- -如果我们定义为状态一,因为我们没办法知道**获取最高金额时**,小偷到底偷盗了哪些房屋。所以我们需要找到**所有状态中的最大值**,才能找到我们的最终答案。即: - ->
max(dp[0],dp[1],.....,dp[len(dp)-1])
- -如果我们定义为状态二,因为小偷一定会**从前偷到最后**(强调:偷盗至第i个房间,不代表小偷要从第i个房间中获取财物)。所以我们的最终答案很容易确定。即: - -
dp[i]
- -现在我们分析这两种状态定义下的状态转移方程: - -
- -如果是状态一,偷盗含第 i 个房间时能获取的最高金额,我们相当于要**找到偷盗每一间房子时可以获取到的最大金额**。比如下图,我们要找到 dp[4] ,也就是偷盗 9 这间房子时,能获取到的最大金额。 - -PNG - -那我们就需要找到与9不相邻的前后两段中能获取到的最大金额。 - -PNG - -我们发现题目进入恶性循环,因为我们若要找到与9不相邻的两端中能偷盗的最大金额,根据 dp[i] 的定义,我们就又需要分析在这两段中盗取每一间房子时所能获取的最大利益!想想都很可怕!所以我们放弃掉这种状态的定义。 - -
- -如果是状态二,偷盗至第 i 个房子时,所能获取的最大利益。那我们可以想到,**由于不可以在相邻的房屋闯入,所以 至i房屋可盗窃的最大值,要么就是至 i-1 房屋可盗窃的最大值,要么就是至 i-2 房屋可盗窃的最大值加上当前房屋的值,二者之间取最大值,即:** - -
dp[i] = max(dp[i-2]+nums[i], dp[i-1])
- -如果不能理解可以看下图: - -(相当于小贼背了个背包,里边装了之前偷来的财物,每到达下一个房间门口,来选择是偷还是不偷。) - -PNG - -## 03、GO语言示例 - -分析完毕,我们根据第二种状态定义进行求解: - -```go -func rob(nums []int) int { - if len(nums) < 1 { - return 0 - } - if len(nums) == 1 { - return nums[0] - } - if len(nums) == 2 { - return max(nums[0],nums[1]) - } - dp := make([]int, len(nums)) - dp[0] = nums[0] - dp[1] = max(nums[0],nums[1]) - for i := 2; i < len(nums); i++ { - dp[i] = max(dp[i-2]+nums[i],dp[i-1]) - } - return dp[len(dp)-1] -} - -func max(a,b int) int { - if a > b { - return a - } - return b -} -``` - -运行结果: - -PNG - -同样,运行上面的代码,我们发现使用的内存过大。有没有什么办法可以压缩内存呢?我们很容易想到,在小贼偷盗的过程中,不可能转回头去到自己已经偷过的房间!(太蠢)小偷只需要每次将财物搬到下一个房间就行! - -
- -根据上面思路,优化后的代码如下: - -```go -func rob(nums []int) int { - if len(nums) < 1 { - return 0 - } - if len(nums) == 1 { - return nums[0] - } - if len(nums) == 2 { - return max(nums[0],nums[1]) - } - nums[1] = max(nums[0],nums[1]) - for i := 2; i < len(nums); i++ { - nums[i] = max(nums[i-2]+nums[i],nums[i-1]) - } - return nums[len(nums)-1] -} - -func max(a,b int) int { - if a > b { - return a - } - return b -} -``` - -运行结果: - -PNG - diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/1.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/1.jpg" deleted file mode 100644 index 34937480..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/1.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/2.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/2.jpg" deleted file mode 100644 index c71685d7..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/2.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/3.png" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/3.png" deleted file mode 100644 index 9c284498..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/3.png" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/4.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/4.jpg" deleted file mode 100644 index ada1796c..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/4.jpg" and /dev/null differ diff --git "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/5.jpg" "b/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/5.jpg" deleted file mode 100644 index 94b8ad67..00000000 Binary files "a/website/1.2.\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/206/5.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301.md" deleted file mode 100644 index 48f0beba..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301.md" +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: 反转字符串(301) ---- - -## 01、题目分析 - -| 第344题:反转字符串 | -| ------------------------------------------------------------ | -| 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 | - -不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 - -**示例 1:** - -``` -输入:["h","e","l","l","o"] -输出:["o","l","l","e","h"] -``` - -**示例 2:** - -``` -输入:["H","a","n","n","a","h"] -输出:["h","a","n","n","a","H"] -``` - -## 02、题目图解 - -这是一道相当简单的经典题目,直接上题解:使用双指针进行反转字符串。 - -假设输入字符串为["h","e","l","l","0"] - -- 定义left和right分别指向首元素和尾元素 -- 当left < right ,进行交换。 -- 交换完毕,left++,right-- -- 直至left == right - -具体过程如下图所示: - - -PNG - -## 03、Go语言示例 - -根据以上分析,我们可以得到下面的题解: - -```go -//Go -func reverseString(s []byte) { - left := 0 - right := len(s) - 1 - for left < right { - s[left], s[right] = s[right], s[left] - left++ - right-- - } -} -``` diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301/1.jpg" deleted file mode 100644 index 28bfac19..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/301/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302.md" deleted file mode 100644 index 3b1ec7a4..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302.md" +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: 字符串中的第一个唯一字符(387) ---- - -## 01、题目分析 - -| 第387题:字符串中的第一个唯一字符 | -| ------------------------------------------------------------ | -| 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1 。 | - -**案例:** - -``` -s = "leetcode" -返回 0. - -s = "loveleetcode", -返回 2. -``` - - **注意事项:**您可以假定该字符串只包含小写字母。 - ->
常考题目,建议自行思考 1-2 分钟先~
- -## 02、题目图解 - -题目不难,直接进行分析。由于字母共有 26 个,所以我们可以声明一个 26 个长度的数组(该种方法在本类题型很常用)因为字符串中字母可能是重复的,所以我们可以先进行第一次遍历,在数组中记录**每个字母的最后一次出现的所在索引**。然后再通过一次循环,**比较各个字母第一次出现的索引是否为最后一次的索引**。如果是,我们就找到了我们的目标,如果不是我们将其设为 -1(**标示该元素非目标元素**)如果第二次遍历最终没有找到目标,直接返回 -1即可。 - -
- -图解如下: - -PNG - -## 03、GO语言示例 - - 根据以上分析,可以得到代码如下: - -```go -func firstUniqChar(s string) int { - var arr [26]int - for i,k := range s { - arr[k - 'a'] = i - } - for i,k := range s { - if i == arr[k - 'a']{ - return i - }else{ - arr[k - 'a'] = -1 - } - } - return -1 -} -``` - diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302/1.jpg" deleted file mode 100644 index e5a887ff..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/302/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303.md" deleted file mode 100644 index 974ab65e..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303.md" +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: 实现 Sunday 匹配 -date: 2020-07-08 ---- - -> 前几天的内容大家可能会觉得比较散。这是因为我目前正在筹划**背包系列**和**贪心系列**两个主题的内容,所以时间比较紧张,就拿出了之前写的一些题解凑凑数。不过呢,今天我将为大家开启一个新的篇章 - **字符串匹配系列篇**,文章写得很用心,相信大家定有所获。 - -## 01、实现 strStr() - -> 字符串匹配类型的题目,是字符串类型中占比很大的一个支类。 - -
- -| 题目:实现 strStr() | -| ------------------------------------------------------------ | -| 实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 | - -**示例 1:** - -``` -输入: haystack = "hello", needle = "ll" -输出: 2 -``` - -**示例 2:** - -``` -输入: haystack = "aaaaa", needle = "bba" -输出: -1 -``` - -**说明:** - -
- -当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 - -
- -对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。 - -## 02、Sunday 匹配 - -> Sunday 算法是 Daniel M.Sunday 于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法**能跳过尽可能多的字符**以进行下一步的匹配,从而提高了匹配效率。 - -
- -因为该问是字符串匹配篇第一讲,所以先普及几个概念: - -- 串:串是字符串的简称 -- 空串:长度为零的串称为空串 -- 主串:包含子串的串相应地称为主串 -- 子串:串中任意个连续字符组成的子序列称为该串的子串 -- 模式串:子串的定位运算又称为串的模式匹配,是一种求子串第一个字符在主串中序号的运算。被匹配的主串称为目标串,子串称为模式串。 - -
- -了解这些基本概念,回到这个算法。Sunday匹配不是说这人在周末发现了这个算法,而是这人名字叫星期天(可能父母总加班,所以起了这么个名)。听起来牛叉的不得了,其实是个啥意思: - -
- -假若我们的目标串为:Here is a little Hao - -模式串为:little - -
- -一般来讲,字符串匹配算法第一步,**都是把目标串和模式串对齐**。不管是KMP,BM,SUNDAY都是这样。 - -PNG - -而对于SUNDAY算法,我们**从头部开始比较,一旦发现不匹配,直接找到主串中位于模式串后面的第一个字符**,即下面绿色的 “s”。(这里说明一下,为什么是找模式串后面的第一个字符。在把模式串和目标串对齐后,如果发现不匹配,那肯定需要移动模式串。问题是需要移动多少步。各字符串匹配算法之间的差别也来自于这个地方,对于KMP,是建立部分匹配表来计算。BM,是反向比较计算移动量。对于SUNDAY,就是找到模式串后的第一个字符。因为,无论模式串移动多少步,模式串后的第一个字符都要参与下一次比较,也就是这里的 “s”) - -PNG - -找到了模式串后的第一个字符 “s”,接下来该怎么做?我们需要**查看模式串中是否包含这个元素,如果不包含那就可以跳过一大片,从该字符的下一个字符开始比较。** - -PNG - -因为仍然不匹配(空格和l),我们继续重复上面的过程。找到模式串的下一个元素:t - -PNG - -现在有意思了,我们发现 t 被包含于模式串中,并且 t 出现在模式串倒数第3个。所以我们把模式串向前移动3个单位: - -PNG - -有内味了,我们发现竟然匹配成功了,是不是很神奇?证明的过程今天暂且不谈(后面我会出一个算法证明篇,来证明之前讲过的一些算法。**我需要你做的是,掌握上面这些!**) - -
- -捞干货,这个过程里我们做了一些什么: - -
- -- 对齐目标串和模式串,从前向后匹配 -- **关注主串中位于模式串后面的第一个元素(核心)** -- 如果关注的字符没有在子串中出现则直接跳过 -- 否则开始移动模式串,移动位数 = 子串长度 - 该字符最右出现的位置(以0开始) - -## 03、算法应用 - -> 自然是把这个算法应用到我们的题目中咯... - -
- -根据分析,得出代码:(给一个保证你能看的懂的JAVA版本的) - -```java -//JAVA -class Solution { - public int strStr(String origin, String aim) { - if (origin == null || aim == null) { - return 0; - } - if (origin.length() < aim.length()) { - return -1; - } - //目标串匹配索 - int originIndex = 0; - //模式串匹配索引 - int aimIndex = 0; - // 成功匹配完终止条件:所有aim均成功匹配 - while (aimIndex < aim.length()) { - // 针对origin匹配完,但aim未匹配完情况处理 如 mississippi sippia - if (originIndex > origin.length() - 1) { - return -1; - } - if (origin.charAt(originIndex) == aim.charAt(aimIndex)) { - // 匹配则index均加1 - originIndex++; - aimIndex++; - } else { - //在我们上面的样例中,第一次计算值为6,第二次值为13 - int nextCharIndex = originIndex - aimIndex + aim.length(); - //判断下一个目标字符(上面图里的那个绿框框)是否存在。 - if (nextCharIndex < origin.length()) { - // 判断目标字符在模式串中匹配到,返回最后一个匹配的index - int step = aim.lastIndexOf(origin.charAt(nextCharIndex)); - if (step == -1) { - // 不存在的话,设置到目标字符的下一个元素 - originIndex = nextCharIndex + 1; - } else { - // 存在的话,移动对应的数字(参考上文中的存在公式) - originIndex = nextCharIndex - step; - } - //模式串总是从第一个开始匹配 - aimIndex = 0; - } else { - return -1; - } - } - } - return originIndex - aimIndex; - } -} -``` - -## 04、啰嗦吧唧 - -> **调研一下,这种通过题目来讲解知识的方式,大家是否喜欢?**如果喜欢,请留言区扣1。如果不喜欢,请说明理由~ - -
- -发现网上上来就讲解字符串匹配算法的文章实在是太多了,也不缺我这一个。所以我尝试了这种通过“**图解+题目+知识串讲**”的形式,文中我也尽可能的减少公式化的东西,让大家能看的进去。**希望大家可以给我反馈**,如果大家觉得这种形式ok,那么我后面会更高频的去使用这种形式。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/1.jpg" deleted file mode 100644 index d358abd5..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/2.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/2.jpg" deleted file mode 100644 index eb105473..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/2.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/3.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/3.jpg" deleted file mode 100644 index c9df0953..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/3.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/4.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/4.jpg" deleted file mode 100644 index 78df4441..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/4.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/5.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/5.jpg" deleted file mode 100644 index 3b0d0f2b..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/303/5.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304.md" deleted file mode 100644 index 8a4b35b8..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304.md" +++ /dev/null @@ -1,207 +0,0 @@ ---- -title: 大数打印 -date: 2020-07-08 ---- - -> 穿插着为大家分享一道经典面试题目。额外说明的一点是,这道题本身很简单,但是却可以作为很多 中等/困难 题目的基础,比如 超级次方,实现pow(x,n) 等等,在面试时需要额外小心。建议大家掌握!话不多说,直接看题。 - -## 01、题目示例 - -> 本题原始版本出自《剑指offer》,leetcode或许是因为自身原因,并没有很好的进行移植。当然,这道题本身也确实不太好移植,尤其是测试样例的构建,很容易把系统搞崩掉,所以一些测试样例处理成内存溢出,也是情有可原。 - -
- -| 题目:大数打印 | -| ------------------------------------------------------------ | -| 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 | - -**示例 1:** - -``` -输入: n = 1 -输出: [1,2,3,4,5,6,7,8,9] -``` - -
- -**说明:** - -- 用返回一个整数列表来代替打印 -- n 为正整数 - -## 02、简单解法 - -> 如果是第一次看到本题,应该是会想到👇👇👇的解法。 - -
- -**直接通过 Math.pow 函数,计算出最大的 n 位十进制数,通过遍历求解**。因为过于简单,所以直接上代码: - -```java -//java -class Solution { - public int[] printNumbers(int n) { - int len = (int) Math.pow(10, n); - int[] res = new int[len - 1]; - for (int i = 1; i < len; i++) { - res[i - 1] = i; - } - return res; - } -} -``` - -补一个c++版本的: - -```c++ -//c++ -class Solution { - public: - vector printNumbers(int n) { - vector res; - if (n == 0) return res; - //打印到数组中 - for (int i=1,max=pow(10,n);i 面试官说话了,“不允许使用math.pow,请手动实现一下”,“恶毒”的面试官发问了。 - -
- -不让使用 **math.pow** , 那我们就不使用呗。根据上面的题解,我们已经把握到了关键,只要能找到 **最大的 n 位十进制数**,就可以解决问题。那我们就手动算一下: - -```go -//go -func printNumbers(n int) []int { - res := []int{} - l := 0 - for 0 < n { - n-- - l = l*10+9 - } - for i := 1; i < l+1; i++ { - res = append(res, i) - } - return res -} -``` - -执行结果: - -PNG - -## 04、题目继续升级 - -> 面试官又说话了,**“这道题目的名字叫做大数打印,如果阈值超出long类型,该怎么办呢?请手动实现一下!”** 面试官总是可以想方设法为难咱们。(玩笑归玩笑,其实这个才是本题的核心) - -
- -到现在为止,本题才进入到关键环节。因为如果一个数很大,肯定没办法用单个变量类型进行表达。问题也发生了转化:**如何使用其他的数据类型来模拟大数的表达?** - -
- -这里先复习一下大数加法:在加法运算的时候假如有两个10000位数的两个数进行相加,那么用int、long、double型都装不下这么多位数,**一般采用char数组来实现加法运算,解决精度的问题**。说白了是啥意思,我们用 1234567 和 1234 来模拟一下: - -PNG - -- 取两个数位数大的一个作为数组长度 -- 对两个数建立char数组,保存每一位上的值 -- 对于位数小的数,高位补0。 -- 同时创建sumArr,用来保存两数之和 -- 考虑进位 - -
- -当然,一般我们还使用一些比如 **翻转存储计算** 之类的技巧,这里就不说了,回头我会出一个单独的**大数计算系列篇**单独讲解。回到今天的题目。 - -
- -对于本题,我们该如何模拟一个 “最大的n位十进制数” 呢?其实也是一样的,**我们采用 char 数组进行存储**。而我们每次递增1,相当于进行一次**字符串相加**的运算。但是这里额外要说明的一点是,我把题解恢复成了原题的要求:**使用打印输出,而不是通过数组返回的形式。**毕竟返回数组的形式只是 leetcode 为了兼容平台测试而改编的。这里我就直接给出从剑指offer改编的题解了(JAVA): - -```java -//java -public void printNumbers(int n) { - //声明字符数组,用来存放一个大数 - char[] number = new char[n]; - Arrays.fill(number, '0'); - while (!incrementNumber(number)) { - saveNumber(number); //存储数值 - } - } - - private boolean incrementNumber(char[] number) { - //循环体退出标识 - boolean isBreak = false; - //进位标识 - int carryFlag = 0; - int l = number.length; - for (int i = l - 1; i >= 0; i--) { - //取第i位的数字转化位int - int nSum = number[i] - '0' + carryFlag; - if (i == l - 1) { - //最低位加1 - ++nSum; - } - if (nSum >= 10) { - if (i == 0) { - isBreak = true; - } else { - //进位之后减10,并把进位标识设置为1 - nSum -= 10; - carryFlag = 1; - number[i] = (char) ('0' + nSum); - } - } else { - number[i] = (char) (nSum + '0'); - break; - } - } - return isBreak; - } - private void saveNumber(char[] number) { - boolean isBegin0 = true; - for (char c : number) { - if (isBegin0 && c != '0') { - isBegin0 = false; - } - if (!isBegin0) { - // 到这里并没有继续往下实现一个存储数组的版本,是因为原题其实就是要求打印数值。 - // 这道题目在leetcode上被改动成返回int数组的形式,也只是为了测试方便, - // 本身leetcode并没有提供对应的大数测试样例,也是担心其内存溢出。 - // 总之大家知道本题的考察点所在就可以了。 - System.out.print(c); - } - } - System.out.println(); - } -``` - -上面的代码强调两点: - -
- -- 对最低位 nSum 的值递增(也就是字符串加1运算),当大于等于10时,我们把进位标识改为1,同时恢复对 nSum 减10(29-31) -- 通过判断首位是否进位来判断到达最大的n位数情况。比如 n=4,只有对 9999 加 1,才会对第一个字符进位。 - -
- -同样,我也实验了一下,如果我硬性的把代码改成数组的形式,然后在leetcode测试用例中构造 n = 10,就会出现这个: - -PNG - -所以建议大家是在IDE里练习,今天的题目到这里就结束了。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/1.jpg" deleted file mode 100644 index f72c6826..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/2.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/2.jpg" deleted file mode 100644 index cf1cf51b..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/2.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/3.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/3.jpg" deleted file mode 100644 index 51e1546f..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/304/3.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305.md" deleted file mode 100644 index 9a6c6bd0..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305.md" +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: 验证回文串(125) -date: 2020-07-10 ---- - -> **今天是小浩算法 “365刷题计划”- 储备日。**难顶,我本来今天在写最长回文子串这个题目。然后我突然在想,直接讲这个会不会仍然有同学看不懂,为什么不从最简单的讲起呢。于是,今天的文章诞生了。于是,小浩又熬夜到了凌晨。 - -## 01、题目示例 - -> 见微知著,发现一组数据很有趣,分享给大家。leetcode 第一题通过次数为 993,335,第二题通过次数为 396,160,第三题通过次数为 69,508。我想说什么,请自己悟。 - -| 第125题:验证回文串 | -| ------------------------------------------------------------ | -| 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 | - -**说明:**本题中,我们将空字符串定义为有效的回文串。 - -
- -**示例 1:** - -``` -输入: "A man, a plan, a canal: Panama" -输出: true -``` - -**示例 2:** - -``` -输入: "race a car" -输出: false -``` - -## 02、图解教程 - -> 经典题目,你需要像掌握反转字符串一样掌握本题。 - -
- -首先,我想确保你知道什么是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。 - -
- -当然,对于本题而言,因为原字符串还包括了除字母,数字之外的一些幺蛾子,所以我们第一步可以考虑将其替换。因为使用正则实在是方便,所以直接用正则替了。 - -```java -//JAVA -s = s.toLowerCase().replaceAll("[^0-9a-z]", ""); -``` - -假若原字符串为: - -``` -A man, a plan, a canal: Panama -``` - -替换完就是这样: - -``` -amanaplanacanalpanama -``` - -剩下的就很简单了,我们同时遍历两边的字符,如果不等直接就返回 false,代码基本就是这样(因为实在简单到无地自容,所以我不知道如何画图....) - -```java -//JAVA -class Solution { - public boolean isPalindrome(String s) { - s = s.toLowerCase().replaceAll("[^0-9a-z]", ""); - char[] c = s.toCharArray(); - int i = 0, j = c.length - 1; - while (i < j) { - if (c[i] != c[j]) return false; - i++; - j--; - } - return true; - } -} -``` - -执行结果: - -PNG - -然后上面的代码大家肯定也觉得简单的一批。但是既然我们都知道哪些字符是幺蛾子(**除了字母和数字,都是幺蛾子**),为啥子不直接遍历的时候跳过嘞?这样是不是就不用先做一个替换的预处理了。 - -```java -//JAVA -class Solution { - public boolean isPalindrome(String s) { - s = s.toLowerCase(); - char[] c = s.toCharArray(); - int i = 0; - int j = s.length() - 1; - while(i < j) { - if (!((c[i] >= '0' && c[i] <= '9') || (c[i] >= 'a' && c[i] <= 'z'))) { - i++; - continue; - } - if (!((c[j] >= '0' && c[j] <= '9') || (c[j] >= 'a' && c[j] <= 'z'))) { - j--; - continue; - } - if(c[i] != c[j]){ - return false; - } - i++; - j--; - } - return true; - } -} -``` - -执行结果: - -PNG - -好吧,那既然我们都可以把幺蛾子跳过了,那有木有现成的跳过幺蛾子的API来用嘞?我找了找,java 中没有特别现成的拿来主义,但是我又不想造轮子,那就去别的语言里找找呗。 - -```cpp -//CPP -class Solution { -public: - bool isPalindrome(string s) { - for (int i = 0, j = s.size() - 1; i < j; i++, j--) - { - while (!isalnum(s[i]) && i < j) i++; - while (!isalnum(s[j]) && i < j) j--; - if (toupper(s[i]) != toupper(s[j])) return false; - } - return true; - } -}; -``` - -提示:isalnum() 方法检测字符串是否由字母和数字组成,是c++标准库函数。当然,c库也有 - -
- -但是这样感觉代码还是好长好难受,有没有更加简洁的写法?祭出大杀器! - -```python -//py3 -class Solution: - def isPalindrome(self, s: str) -> bool: - s = list(filter(str.isalnum, s.lower())) - return s == s[::-1]  -``` - -然后,我还想祭出终极大杀器 之 战斗魔鬼! - -PNG - -## 03、总结 - -> 万丈高楼平地起,盘龙卧虎高山齐。希望大家对于回文串的判断烂熟于心,为后面的题目做好准备~ - -
- -今天的题目到这里就结束了。你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/1.jpg" deleted file mode 100644 index 2a745a17..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/2.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/2.jpg" deleted file mode 100644 index e4e31caa..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/2.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/3.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/3.jpg" deleted file mode 100644 index 1170b400..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/305/3.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306.md" deleted file mode 100644 index 76691d06..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306.md" +++ /dev/null @@ -1,368 +0,0 @@ ---- -title: KMP(上篇) -date: 2020-07-11 ---- - -> 今天打算为大家讲解一下KMP。 - -
- -KMP 其实已经念念叨叨挺长时间了,一直没写的原因是我觉得自己可能写不好。**与其误人子弟,宁可错失良机**。毕竟自己懂是一码事,能讲清楚是另一码事。 - -
- -所以为了写好这篇文章,我又去参考了很多别的资料。嗯。。**我发现网上讲解 KMP 的文章实在是太多了,但大多数看完后还是云里雾里(纵然我已经会了,读对方的文章还是懵逼)**。 - -
- -我希望我的这篇文章能达到的目的是:**让小白也能学会KMP**。如果届时达到了目的,请帮我进行一次转发。否则,你只需要叉掉即可。 - -
- -话不多说,我们直接开始。 - -## 01、图解分析 - -> KMP 算法常被称为“看毛片算法”,由一个姓K的,一个姓M的,一个姓P 一起提出。**是一种由暴力匹配改进的字符串匹配算法**。 - -
- -我看了下网上的 KMP 讲解基本都是由 **next匹配表** 开始讲起。但是说实话,如果是我第一次看这玩意,你给我讲 next匹配表,我肯定一脸懵逼。所以我打算换一种讲法。 - -
- -上面说了,**KMP 是由暴力匹配改进的字符串匹配算法**。那什么是暴力匹配?假若我们的目标串和模式串如下图。(之前在 Sunday 匹配中讲过,**所有的字符串匹配算法第一步都是对齐**。不管是 暴力匹配,KMP,Sunday,BM 都是一样) - -PNG - -暴力匹配,就是目标串和模式串一个一个的对比。 - -PNG - -当A匹配成功,继续开始比对,直到我们遇见一个不匹配的字符。 - -PNG - -然后我们调整模式串,**从目标串的下一个字符开始匹配(注意,这里是核心)**。很遗憾,还是没有匹配成功(A和B) - -PNG - -继续这个步骤: - -PNG - -直到我们完成整个匹配过程: - -PNG - -假若我们目标串长度为m,模式串长度为n。模式串与目标串至少比较m次,又因其自身长度为n,所以理论的时间复杂度为**O(m\*n)。**但我们可以看到,**因为途中遇到不能匹配的字符时,就可以停止,并不需要完全对比(比如上图第2行)**。所以虽然理论时间复杂度为 **O(m\*n)** ,但其实大部分情况效率高很多。 - -
- -暴力匹配又称为BF算法,暴风算法。代码比较简单: - -```go -//GO -func BFSearch(haystack string, needle string) int { - l1 := len(haystack) - l2 := len(needle) - i, j := 0, 0 - for i < l1 && j < l2 { - if haystack[i] == needle[j] { - i++ - j++ - } else { - i -= j - 1 - j = 0 - } - } - if j == l2 { - return i - j - } - return -1 -} -``` - -接下来我们开始说KMP。假如还是上面的这个串。最开始其实还是一样,我们依次对比A-A,B-B,C-C,直到遇见第一个无法匹配的字符A-E。 - -PNG - -现在开始不一样了,如果按照上面的暴力匹配。此时目标串我们应该回到 B 这个位置,模式串应直接回到头。但是按照 KMP 的思路,**在我们在第一次匹配后,因为 BC 匹配成功了,所以我们知道了 BC 不等于 A(注意这个逻辑关系)**: - -PNG - -那既然已知了 BC 不等于 A,我们就没必要用 A 和 BC 进行匹配了。那我们直接用 A 越过前面不需要匹配的 BC: - -PNG - -继续向下适配,我们发现在 D-C 处,匹配不上了。 - -PNG - -那我们因为前面的 B 又匹配成功了,那我们就知道 B 不等于 A,所以我们又可以直接略过前面的 B: - -PNG - -也就是说,我们可以直接从 D 处开始比较: - -PNG - -继续向下比较: - -PNG - -到现在为止,你已经掌握了 KMP 的前百分之五十:**在KMP中,如果模式串和目标串没有匹配成功,目标串不回溯**。现在我们需要换一个新串,来掌握接下来的百分之五十: - -PNG - -我们还是从头开始匹配,直到遇到第一个不匹配的字符: - -PNG - -到这里和上面的例子还是一样,**因为我们的 BC 匹配成功了,所以我们知道 BC 不等于 A,所以我们可以跳过 BC(注意这个逻辑)**: - -PNG - -所以我们从 A 处开始比较: - -PNG - -直到我们再次匹配失败: - -PNG - -我想到现在你已经知道怎么做了,来和我一起说。**因为前面的 B 匹配成功了,所以我们知道 B 不等于 A,所以我们可以跳过 B。**当然,跳过之后下一次的匹配直接失败了(A-D)。 - -PNG - -重点来了!!!然后我们继续匹配下一位。我们发现这一次,我们的匹配基本就要匹配成功了,但是卡在了最后一步的比较(D-B)。 - -PNG - -现在怎么办?假若我们把两个串修改一下(把里边的AB修改成XY),那么显而易见,你当然知道从哪里开始: - -PNG - -但是现在的问题是,在模式串中 AB 重复出现了,那我们是不是可以在下次比较的时候直接把 AB 给让出来? - -PNG - -所以我们把这个AB让出来,让出来之后,我们相当于在 模式串 上又跳过了 2个字符。(也就是说模式串下一次匹配从C开始) - -PNG - -其实到这里 KMP 就基本完事了。我们可以稍微总结下: - -
- -- 如果模式串和目标串匹配成功,长串短串都加一 - -- 如果模式串和目标串没有匹配成功: - -- - 目标串不回溯(**在上面的分割线之前,我都是给你讲这个**) - - 模式串回溯到匹配未成功的字符前的子串的相同的真前缀和真后缀的最大长度**(在上面的分割线之后,我重点是给你讲这个)** - -
- -好了,我知道上面匹配成功后的第二种情况有点拗口。所以我又单独拎出来和你说。这句话是啥意思呢? - -
- -假若我们有个串 abbaab: - -- a, ab, abb, abba, abbaa,就是它的真前缀。 -- b, ab, aab, baab, bbaab, 就是它的真后缀。 -- “真”字,**说白了就是不包含自己**。 - -
- -在我们上面的示例中,未成功的字符前的子串是 ABCEAB,它相同的最长的真前缀和真后缀就是 AB,最大长度就是2。所以我们就把模式串回溯到第2个位置处。 - -PNG - -我猜有人要说话了,“不是说模式串是回溯到真前缀和真后缀的最大长度位置处吗?那为什么上面的第一个例子,是回到了起始位置呢?” - -PNG - -其实,不是我们没有回溯模式串,而是此时的最大长度(指的是相同真前缀和真后缀的最大长度,后面都省略)其实就是 0。 - -
- -那我们怎么获取最大长度呢?就可以很自然的引入 next表 了。**不管你是把next表 理解成描述最大长度的东东,还是把 next表 理解成用来回溯模式串的东东,其实都是可以的!!!这也是为什么你在网上看到很多人文章对next表理解不一致的原因。** - -PNG - -我们拿上面标黄色那个解释一下,ABCEAB 不包含自己,那就是 ABCEA,ABCEA的 真前缀 和 真后缀 为: - -
- -- A,AB,ABC,ABCE -- A,EA,CEA,BCEA - -
- -所以最大长度就是 1。那这个 1 干啥用呢?我们可以在下次比的时候就直接把这个 A 让过去,直接从 B 开始比。 - -PNG - -这里注意,如果我们模式串稍微修改成下面这样,此时 F 的最大长度就是 0,并不是 2。初学者很容易把 AB 误认为是最长相同的真前缀和真后缀。 - -PNG - -到这里为止,其实 KMP 的思路已经快说完了。但是大神说话了,大神认为这个匹配表,还得再改改,不然会出问题。 - -PNG - -为什么会出问题呢,我们说了,对 KMP 而言,**如果没有匹配成功,****目标串是不回溯的**。那如果目标串不回溯,如果模式串一直都是 0,是不是意味着这个算法就没办法继续进行下去?所以大神把这个 next匹配表 改了一下,把 0 位置处的 next表 值改为了 -1。 - -PNG - -那这个 -1 是干嘛用的呢?**其实只是一个代码技巧**!大家注意一下第 7 行代码,假若没有 j == -1,此时如果 next[j] 等于 0,是不是就进死循环了。而加上这一句,相当于说无论什么情况下,模式串的第一个字符都可以匹配(对 j 而言,此时 -1++,是不是还是0。但是此时模式串却向前走了。不就不会因为死循环而卡死了吗?**请大家自行脑补没有 j==-1 这行代码时,死循环卡死在11行的过程**) - -```go - //GO -func KmpSearch(haystack string, needle string, next []int) int { - l1 := len(haystack) - l2 := len(needle) - i, j := 0, 0 - for i < l1 && j < l2 { - if j == -1 || haystack[i] == needle[j] { - i++ - j++ - } else { - j = next[j] - } - } - if j == l2 { - return i - j - } - return -1 -} -``` - -到这里为止,其实 KMP 就讲的差不太多了,代码还是比较简单的。但是麻烦的是?一般我们并没有现成的 next表 直接使用。那 next表 又该如何生成呢? - -
- -其实 next表 的生成,我们也可以看作是字符串匹配的过程:**即原模式串和原模式串自身前缀进行匹配的过程。** - -
- -我们用下面这个字符串来讲一下:XXYXXYXXX。 - -PNG - -对于该字符串: - -
- -- 真前缀为 X,XX,XXY,XXYX,XXYXX..... -- 真后缀为 X,XX,XXX,YXXX,XYXXX..... - -
- -为了方便大家理解,我画了两种图(左图是真实的填表过程,右图是脑补过程): - -
- -- 首先 index[0] 肯定是填写 0 - - PNG - -- 然后填写 index[1]。**如果匹配上,我们把 i 和 j 都加一**。 - - PNG - -- 然后填写 index[2],**如果没有匹配上,就把 j 回溯到 j 当前指向的前一个位置的 index 处。在这里,也就是 0 。** - - PNG - -- 注意,是回溯完成后才开始填表,此时 index[2] 为 0 - - PNG - -- 然后我们移动 i,发现下一位匹配成功。同时给 i 和 j 加一,并填表。 - - PNG - -- 填完表后,我们发现下一位仍然匹配。继续移动 i 和 j。 - - PNG - -
(填表)
- - PNG - -
(仍然匹配,继续移动 i 和 j)
- -- 仍然匹配成功,继续重复上面的操作。 - - PNG - - PNG - - PNG - -- 注意,**到这里开始匹配失败了**。上面说了,如果没有匹配成功,**把 j 回溯到 j 当前指向的前一个位置的 index 处**。在这里,也就是 2 。 - - PNG - - PNG - -
(j 的前一个位置的 index)
- - PNG - -
(回溯完成后,我们发现仍然不匹配)
- -- 继续这个回溯的过程。。。(这一步是整个 next表 构建的核心) - - PNG - -
(这个蓝色的小标是下次的回溯位置)
- - PNG - -
(回溯后,我们发现匹配成功了)
- - PNG - -
(然后我们可以填表了)
- -- 注意!这里为什么是填2,其实就是填写上次回溯到的那个匹配成功的位置的index值加1。 - -
- -细心的读者,估计到这里发现一点问题。我们把填完后的表拿出来: - -PNG - -我们发现这个表和我们最上面说的不太一样,我们最上面说的 next表 的首位是 -1,并且要记录哪一个 index 位置的 next 值,是去看该元素前面所有子串的真前缀和真后缀的最大长度。这句话有点拗口,我们还是看到下面这个。 - -PNG - -比如 index 为 5 时,此时next的值是看 ABCEA 的最大长度(真后缀A,真前缀A,所以为1)。**但是在我们下面这个表中,我们发现我们是记录的当前索引位置处的最大长度**。其实我这里要说一下,下面这个表,其实我们一般称为**部分匹配表**,或者pmt。 - -PNG - -那这个表和我们的 next 表有什么关系吗,我们发现把这个表往后串一位,就得到了我们最终的 next 表。 - -PNG - -但是但是但是!!!并不是所有讲解 KMP 的地方都会给你提一提部分匹配表的概念,有的地方干脆就直接把这个 pmt 等同于 next 表使用。**这种属于错误讲解吗?其实不是的!**因为我上面也说了,next表 在最初始位置补 -1,或者甚至干脆把 pmt 的第一位补一个 -1 当作 next表,这都统统是可以的。**因为最关键的还是说你到时候怎么去使用!毕竟 next表 的定义也是人们给它赋予的!** - -
- -举个例子,假如你 next表 的首位不补 -1,我们其实就可以在前面 KMP 的算法中,去掉 -1 的逻辑。而单独加一个 if 判断来解决上面说的死循环的问题。 - -## 02、总结 - -KMP上篇到这里就结束了! KMP系列打算分上下两篇来讲,第一讲就是讲明白 KMP 是干嘛的,next 表是干嘛的,pmt 又是干嘛的。第二讲会给大家讲讲关于 next表 的计算,以及 next表 的优化。 - -
- -总之,我个人认为本篇内容放在全网讲解KMP的文章里,质量都还是可以的。如果是小白,学习本篇文章其实就够了。 - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/1.jpg" deleted file mode 100644 index 9a5dd93c..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/10.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/10.jpg" deleted file mode 100644 index cda65c2b..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/10.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/11.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/11.jpg" deleted file mode 100644 index 8d73766f..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/11.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/12.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/12.jpg" deleted file mode 100644 index 2493e472..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/12.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/13.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/13.jpg" deleted file mode 100644 index 0a0c8bf9..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/13.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/14.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/14.jpg" deleted file mode 100644 index 939d4167..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/14.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/15.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/15.jpg" deleted file mode 100644 index ddc1f71b..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/15.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/16.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/16.jpg" deleted file mode 100644 index 24425dca..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/16.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/17.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/17.jpg" deleted file mode 100644 index 28e7d8d6..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/17.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/18.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/18.jpg" deleted file mode 100644 index eb7dda94..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/18.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/19.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/19.jpg" deleted file mode 100644 index 3f50beaa..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/19.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/2.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/2.jpg" deleted file mode 100644 index 8ac89863..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/2.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/20.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/20.jpg" deleted file mode 100644 index f2856e3c..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/20.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/21.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/21.jpg" deleted file mode 100644 index f1536ae1..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/21.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/22.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/22.jpg" deleted file mode 100644 index a079d299..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/22.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/23.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/23.jpg" deleted file mode 100644 index 05baf6eb..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/23.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/24.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/24.jpg" deleted file mode 100644 index 746a88cf..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/24.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/25.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/25.jpg" deleted file mode 100644 index 28e7d8d6..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/25.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/26.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/26.jpg" deleted file mode 100644 index 4f45d3f0..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/26.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/27.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/27.jpg" deleted file mode 100644 index 04724e0b..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/27.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/28.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/28.jpg" deleted file mode 100644 index d4d855f5..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/28.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/29.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/29.jpg" deleted file mode 100644 index 34be4d50..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/29.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/3.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/3.jpg" deleted file mode 100644 index 91f326b2..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/3.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/30.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/30.jpg" deleted file mode 100644 index 9e0e0944..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/30.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/31.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/31.jpg" deleted file mode 100644 index 921bf6a4..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/31.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/32.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/32.jpg" deleted file mode 100644 index 256aab1d..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/32.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/33.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/33.jpg" deleted file mode 100644 index d31bb764..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/33.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/34.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/34.jpg" deleted file mode 100644 index 82f11387..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/34.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/35.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/35.jpg" deleted file mode 100644 index 67973ce7..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/35.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/36.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/36.jpg" deleted file mode 100644 index 6ef226c6..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/36.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/37.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/37.jpg" deleted file mode 100644 index 52adcd3a..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/37.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/38.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/38.jpg" deleted file mode 100644 index 06347357..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/38.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/39.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/39.jpg" deleted file mode 100644 index 6b1ffc57..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/39.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/4.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/4.jpg" deleted file mode 100644 index f382492a..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/4.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/40.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/40.jpg" deleted file mode 100644 index dcd0b7f1..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/40.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/41.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/41.jpg" deleted file mode 100644 index 0c8d6770..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/41.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/42.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/42.jpg" deleted file mode 100644 index 45aba18c..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/42.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/43.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/43.jpg" deleted file mode 100644 index bd828a9e..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/43.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/44.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/44.jpg" deleted file mode 100644 index 564fc9b2..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/44.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/45.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/45.jpg" deleted file mode 100644 index 35c99d21..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/45.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/46.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/46.jpg" deleted file mode 100644 index ea9ea88f..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/46.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/47.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/47.jpg" deleted file mode 100644 index 44f1d678..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/47.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/48.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/48.jpg" deleted file mode 100644 index aceadb33..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/48.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/49.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/49.jpg" deleted file mode 100644 index 39a90f69..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/49.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/5.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/5.jpg" deleted file mode 100644 index f34ed783..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/5.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/50.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/50.jpg" deleted file mode 100644 index aceadb33..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/50.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/51.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/51.jpg" deleted file mode 100644 index 39bde6e3..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/51.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/6.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/6.jpg" deleted file mode 100644 index cf505783..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/6.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/7.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/7.jpg" deleted file mode 100644 index 29b80683..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/7.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/8.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/8.jpg" deleted file mode 100644 index 9aa7da7b..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/8.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/9.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/9.jpg" deleted file mode 100644 index 2106da05..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/306/9.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307.md" deleted file mode 100644 index 7f073808..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307.md" +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: 旋转字符串(796) -date: 2020-07-12 ---- - -> 今天是小浩算法 “365刷题计划” 第103天。分享的这道题虽然很简单,但是在笔试或者面试当中,出现的频率却非常高。 - -## 01、题目示例 - -> 经典常考类算法题目。 - -
- -| 第796题:旋转字符串 | -| ------------------------------------------------------------ | -| 给定两个字符串, A 和 B。A 的旋转操作就是将 A 最左边的字符移动到最右边。例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。 | - -**示例 1:** - -``` -输入: A = 'abcde', B = 'cdeab' -输出: true -``` - -**示例 2:** - -``` -输入: A = 'abcde', B = 'abced' -输出: false -``` - -
- -**注意:**A 和 B 长度不超过 100。 - -
- -题意还是很容易理解的,说白了就是每次把前面的元素放到最后面: - -PNG - -## 02、题解分析 - -> 这道题目看起来简单,但其实很容易出错。 - -
- -这道题目最容易想到的解法,其实就是跟着题意来。每次将旋转后的A和目标串对比: - -PNG - -```java -//java -class Solution { - public boolean rotateString(String A, String B) { - if (A.equals("") && B.equals("")) { - return true; - } - int len = A.length(); - for (int i = 0; i < len; i++) { - String first = A.substring(0, 1); - String last = A.substring(1, len); - A = last + first; - if (A.equals(B)) { - return true; - } - } - return false; - } -} -``` - -但是代码其实并不优雅,我们继续观察一下这个字符串: - -PNG - -无论它怎样旋转,最终的 A + A包含了所有可以通过旋转操作从 A 得到的字符串: - -PNG - -那我们是不是只需要判断 B 是否为 A + A 的子串就可以了: - -```java -//java -class Solution {     - public boolean rotateString(String A, String B) {         - return A.length() == B.length() && (A + A).contains(B);     - } -} -``` - -执行结果: - -PNG - -一般面试写的话,基本就是到这个程度。但是大概率面试官这时还会问你一个问题:如何继续进行优化? - -PNG - -注意我们上面问题,其实已经转化为了:**判断 B 是否为 A + A 的子串**。那我们就可以引申答出 KMP,SUNDAY,BF 等字符串匹配策略。(当然,这里其实 SUNDAY 并不是特别适合) - -
- -然后就是用相应的匹配策略,来实现转化后的问题。 - -
- -这里附上一份 KMP 解题代码: - -```java -class Solution { - public boolean rotateString(String A, String B) { - int N = A.length(); - if (N != B.length()) return false; - if (N == 0) return true; - - //Compute shift table - int[] shifts = new int[N+1]; - Arrays.fill(shifts, 1); - int left = -1; - for (int right = 0; right < N; ++right) { - while (left >= 0 && (B.charAt(left) != B.charAt(right))) - left -= shifts[left]; - shifts[right + 1] = right - left++; - } - - //Find match of B in A+A - int matchLen = 0; - for (char c: (A+A).toCharArray()) { - while (matchLen >= 0 && B.charAt(matchLen) != c) - matchLen -= shifts[matchLen]; - if (++matchLen == N) return true; - } - - return false; - } -} -``` - -这个有兴趣可以看看,代码是 leetcode 官方的。 - -
- -## 03、算法小知识 - -> KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 - -PNG - -大家有兴趣可以看我之前写的一篇KMP教程: - - [KMP(上篇)](1.3.字符串系列/306.md) \ No newline at end of file diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/1.jpg" deleted file mode 100644 index 0ca67baa..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/2.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/2.jpg" deleted file mode 100644 index 192994dd..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/2.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/3.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/3.jpg" deleted file mode 100644 index 687ab3d4..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/3.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/4.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/4.jpg" deleted file mode 100644 index e91f5383..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/4.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/5.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/5.jpg" deleted file mode 100644 index e767786f..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/5.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/6.gif" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/6.gif" deleted file mode 100644 index 67887d88..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/6.gif" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/7.gif" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/7.gif" deleted file mode 100644 index 35524ba0..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/307/7.gif" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308.md" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308.md" deleted file mode 100644 index 6892bff2..00000000 --- "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308.md" +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: 最后一个单词的长度(58) -date: 2020-07-12 ---- - -> 今天是小浩算法 “365刷题计划” 第107天。满血,复活! - -
- -即日起,我们从这个题目开始,把 leetcode 前 200 道题,还没有讲过的,全部讲一遍。 - -
- -暂定的目标是一周 3-5 篇题解。希望大家支持!一起进步!奥利给! - -PNG - -## 01、题目示例 - -> 这是一道简单题,只需要普通的遍历就可以完成。不过会遇到一些坑,如果不注意,还是挺容易出错的。 - -
- -| 第58题:最后一个单词的长度 | -| ------------------------------------------------------------ | -| 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 | - -**示例:** - -``` -输入: "Hello World"  -输出: 5 -``` - -**说明:**一个单词是指仅由字母组成、不包含任何空格字符的 **最大子字符串**。 - -
- -## 02、题解分析 - -> 因为我们要获取的是**最后一个单词的长度**,不难想到可以从尾开始遍历。 - -
- -题中的陷阱在于,**结尾处仍然可能有空格**。 - -
- -所以一般的解题思路为,先去掉末尾的空格,然后从尾向前开始遍历,直到遇到第一个空格处结束。 - -
- -但这里可以取一个巧,我们可以通过一个 count 来记数,**从第一个不为空格的数开始记起**。换句话说,如果末尾处为空格,此时 count 值为 0,可以直接略过。 - -PNG - -实现代码如下: - -```java -//JAVA -class Solution {     - public int lengthOfLastWord(String s) {         - if(s == null || s.length() == 0) return 0;         - int count = 0;         - for(int i = s.length()-1; i >= 0; i--){             - if(s.charAt(i) == ' '){                 - if(count == 0) continue;                - break;            - }             - count++;       - }         - return count;           - } -} -``` - -当然,并不是说我们不能直接用 API,来进行一些“机智”的解题,大不了就是被挂。 - -```java -//java -class Solution { - public int lengthOfLastWord(String s) { - s = s.trim(); - int start = s.lastIndexOf(" ") + 1; - return s.substring(start).length(); - } -} -``` - -这个代码应该大家都能看懂,首先 trim 掉两边的空格,然后直接定位到最后一个单词的位置,将其截取下来获取长度。 - -
- -额。既然我们 trim 都用了,那为什么我们不直接使用 split 得到最后一个单词的长度呢? - -```java -//java -public class Solution { - public int lengthOfLastWord(String s) { - String[] words = s.split(" "); - if (words.length < 1) return 0; - return words[words.length - 1].length(); - } -} -``` - -## 03、函数学习 - -> 上面的题解中用到了 trim,那 trim 除了去除两边的空格,是否还会去除其他字符呢?一起来看下 trim 的源码。 - -```java -//JAVA -public String trim() {   - int len = value.length;   - int st = 0;   - char[] val = value;    /* avoid getfield opcode */   - while ((st < len) && (val[st] <= ' ')) {       - st++;   - }   - while ((st < len) && (val[len - 1] <= ' ')) {       - len--;   - }   - return ((st > 0) || (len < value.length)) ? substring(st, len) : this; -} -``` - -可以看到,Java 中的 trim 函数除了去除空格之外,还去除了所有在 ASCII 码表中排行小于等于空格的字符。 - -PNG - -空格在 ASCII 码表中排行是 32位,可以看到 tab,换行,回车等都在 trim 的控制范围内。 - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/1.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/1.jpg" deleted file mode 100644 index aa0fb89d..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/1.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/2.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/2.jpg" deleted file mode 100644 index d1b4c199..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/2.jpg" and /dev/null differ diff --git "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/3.jpg" "b/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/3.jpg" deleted file mode 100644 index a40ecba2..00000000 Binary files "a/website/1.3.\345\255\227\347\254\246\344\270\262\347\263\273\345\210\227/308/3.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401.md" deleted file mode 100644 index 3ff262ea..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401.md" +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: 最大深度与DFS(104) ---- - -> 在计算机科学中,二叉树是**每个结点最多有两个子树**的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于**实现二叉查找树**和**二叉堆**。树比链表稍微复杂,因为链表是线性数据结构,而树不是。树的问题很多都可以由**广度优先搜索**或**深度优先搜索解决**。 -> -> 在本系列中,我们将通过一些例题,学习关于二叉树的经典操作! -## 01、题目分析 - -| 第104题:二叉树的最大深度 | -| ------------------------------------------------------------ | -| 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数 | - -说明: 叶子节点是指没有子节点的节点。 - -**示例:** - -``` -给定二叉树 [3,9,20,null,null,15,7], - 3 - / \ - 9 20 - / \ - 15 7 -``` - -
- -
本系列内容均为必须掌握!
- -## 02、递归求解 - -我们知道,**每个节点的深度与它左右子树的深度有关,且等于其左右子树最大深度值加上 1 **。即: - ->
maxDepth(root) = max(maxDepth(root.left),
-> ->
maxDepth(root.right)) + 1
- -以 [3,4,20,null,null,15,7] 为例: - -
- -<1>我们要对根节点的最大深度求解,就要对其左右子树的深度进行求解 - -img - -<2>我们看出。以4为根节点的子树没有左右节点,其深度为 1 。而以 20 为根节点的子树的深度,同样取决于它的左右子树深度。 - -img - -<3>对于15和7的子树,我们可以一眼看出其深度为 1 。 - -img - -<4>由此我们可以得到根节点的最大深度为: - -``` -maxDepth(root-3) -=max(**maxDepth**(sub-4),**maxDepth**(sub-20))+1 -=max(1,max(**maxDepth**(sub-15),**maxDepth**(sub-7))+1)+1 -=max(1,max(1,1)+1)+1 -=max(1,2)+1 -=3 -``` - -
- -根据分析,我们通过**递归**进行求解代码如下: - -```go -func maxDepth(root *TreeNode) int { - if root == nil { - return 0 - } - return max(maxDepth(root.Left), maxDepth(root.Right)) + 1 -} - -func max(a int, b int) int { - if a > b { - return a - } - return b -} -``` - -
- -## 03、DFS - -其实我们上面用的递归方式,本质上是使用了DFS的思想。先介绍一下DFS:深度优先搜索算法(Depth First Search),对于二叉树而言,它沿着**树的深度遍历树的节点,尽可能深的搜索树的分支**,**这一过程一直进行到已发现从源节点可达的所有节点为止**。 - -img - -如上图二叉树,它的访问顺序为: - ->
A-B-D-E-C-F-G
- -A-B-D-E-C-F-G - -
- -到这里,我们思考一个问题?虽然我们用递归的方式根据DFS的思想顺利完成了题目。但是这种方式的缺点却显而易见。因为**在递归中,如果层级过深,我们很可能保存过多的临时变量,导致栈溢出**。这也是为什么我们一般不在后台代码中使用递归的原因。如果不理解,下面我们详细说明: - -
- -事实上,函数调用的参数是通过栈空间来传递的,在调用过程中会**占用线程的栈资源**。而递归调用,**只有走到最后的结束点后函数才能依次退出**,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。 - -
- -所以,我们引出下面的话题:如何将递归的代码转化成非递归的形式。这里请记住,**99%的递归转非递归,都可以通过栈来进行实现**。 - -
- -非递归的DFS,代码如下: - -```java -private List traversal(TreeNode root) {     List res = new ArrayList<>(); - Stack stack = new Stack<>(); - stack.add(root); - while (!stack.empty()) { - TreeNode node = stack.peek(); - res.add(node);          - stack.pop();         - if (node.right != null) { - stack.push(node.right); - } - if (node.left != null) { - stack.push(node.left); - } - } - return res; -} -``` - -上面的代码,唯一需要强调的是,为什么需要先右后左压入数据?是因为我们需要将先访问的数据,后压入栈(请思考栈的特点)。 - -如果不理解代码,请看下图: - -img - -1:首先将a压入栈 - -2:a弹栈,将c、b压入栈(注意顺序) - -3:b弹栈,将e、d压入栈 - -4:d、e、c弹栈,将g、f压入栈 - -5:f、g弹栈 - -
- -至此,非递归的DFS就讲解完毕了。那我们如何通过非递归DFS的方式,来进行本题求解呢?相信已经很简单了,留下课后作业,请自行实践! \ No newline at end of file diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/1.jpg" deleted file mode 100644 index 217d4492..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/2.jpg" deleted file mode 100644 index 1fea0aab..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/3.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/3.jpg" deleted file mode 100644 index 9ca62e9a..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/3.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/4.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/4.jpg" deleted file mode 100644 index b511e6b9..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/4.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/5.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/5.jpg" deleted file mode 100644 index 138a866f..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/401/5.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402.md" deleted file mode 100644 index e1fb9834..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402.md" +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: 层次遍历与BFS(102) ---- - -> 在上一节中,我们通过例题学习了二叉树的DFS(深度优先搜索),其实就是**沿着一个方向一直向下遍历**。那我们可不可以**按照高度一层一层的访问树中的数据**呢?当然可以,就是本节中我们要讲的BFS(宽度优先搜索),同时也被称为广度优先搜索。 -> -> 我们仍然通过例题进行讲解。 -## 01、题目分析 - -| 第102题:二叉树的层次遍历 | -| ------------------------------------------------------------ | -| 给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。 | - -**示例:** - -``` -给定二叉树 [3,9,20,null,null,15,7], - 3 - / \ - 9 20 - / \ - 15 7 -返回其层次遍历结果:[[3],[9,20],[15,7]] -``` - -
- ->
本系列内容均为必须掌握!
- -## 02、BFS介绍 - -BFS,广度/宽度优先。其实就是**从上到下,先把每一层遍历完之后再遍历一下一层**。假如我们的树如下: - -img - -按照BFS,访问顺序如下: - ->
a->b->c->d->e->f->g
- -了解了BFS,我们开始对本题进行分析。 - -## 03、递归求解 - -同样,我们先考虑本题的递归解法。想到递归,我们一般先想到DFS。我们可以对该二叉树进行**先序遍历(根左右的顺序)**,同时,记录节点所在的层次level,并且对每一层都定义一个数组,然后将访问到的节点值放入对应层的数组中。 - -
- -假设给定二叉树为[3,9,20,null,null,15,7],图解如下: - -img - -img - -根据以上分析,代码如下: - -```go -func levelOrder(root *TreeNode) [][]int { - return dfs(root, 0, [][]int{}) -} - -func dfs(root *TreeNode, level int, res [][]int) [][]int { - if root == nil { - return res - } - if len(res) == level { - res = append(res, []int{root.Val}) - } else { - res[level] = append(res[level], root.Val) - } - res = dfs(root.Left, level+1, res) - res = dfs(root.Right, level+1, res) - return res -} -``` - -## 04、BFS求解 - -上面的解法,其实相当于是用DFS的方法实现了二叉树的BFS。那我们能不能直接使用BFS的方式进行解题呢?当然,我们可以使用Queue的数据结构。我们将root节点初始化进队列,通过**消耗尾部,插入头部**的方式来完成BFS。 - -
- -具体步骤如下图: - -img - -根据以上分析,代码如下: - -```go -func levelOrder(root *TreeNode) [][]int { - var result [][]int - if root == nil { - return result - } - // 定义一个双向队列 - queue := list.New() - // 头部插入根节点 - queue.PushFront(root) - // 进行广度搜索 - for queue.Len() > 0 { - var current []int - listLength := queue.Len() - for i := 0; i < listLength; i++ { -   // 消耗尾部 - // queue.Remove(queue.Back()).(*TreeNode):移除最后一个元素并将其转化为TreeNode类型 - node := queue.Remove(queue.Back()).(*TreeNode) - current = append(current, node.Val) - if node.Left != nil { -  //插入头部 - queue.PushFront(node.Left) - } - if node.Right != nil { - queue.PushFront(node.Right) - } - } - result = append(result, current) - } - return result -} -``` - diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/1.jpg" deleted file mode 100644 index b1b52487..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/2.jpg" deleted file mode 100644 index 3bbc3e53..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/3.jpeg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/3.jpeg" deleted file mode 100644 index 415974d3..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/3.jpeg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/4.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/4.jpg" deleted file mode 100644 index 9a0214ed..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/402/4.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403.md" deleted file mode 100644 index c3356f5a..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403.md" +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: BST与其验证(98) ---- - -> 在上一节中,我们分别学习了DFS与BFS。在本节中,我们将继续学习一种特殊的二叉树结构 —— **二叉搜索树(BST)**。 -## 01、二叉搜索树 - -先看定义:二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是**一棵空树**,或者是具有下列性质的二叉树:若**它的左子树不空,则左子树上所有结点的值均小于它的根结点的值**;若**它的右子树不空,则右子树上所有结点的值均大于它的根结点的值**;它的左、右子树也分别为**二叉搜索树**。 - -
- -这里强调一下子树的概念:设T是有根树,a是T中的一个顶点,由**a以及a的所有后裔(后代)**导出的子图称为有向树T的子树。具体来说,**子树就是树的其中一个节点以及其下面的所有的节点**所构成的树。 - -
- -比如下面这就是一颗二叉搜索树: - -img - -下面这两个都不是: - -img - -<1>图中4节点位置的数值应该大于根节点 - -<2>图中3节点位置的数值应该大于根节点 - -
- -那我们如何来验证一颗二叉搜索树?我们看题。 - -## 02、题目分析 - -| 第98题:验证二叉搜索树 | -| -------------------------------------------------- | -| 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 | - -**示例 1:** - -``` -输入: - 5 - / \ - 1 4 - / \ - 3 6 -输出: false -解释: 输入为: [5,1,4,null,null,3,6]。 - 根节点的值为 5 ,但是其右子节点值为 4 。 -``` - -**示例 2:** - -``` -输入: - 5 - / \ - 1 4 - / \ - 3 6 -输出: false -解释: 输入为: [5,1,4,null,null,3,6]。 - 根节点的值为 5 ,但是其右子节点值为 4 。 -``` - -首先看完题目,我们很容易想到 遍历整棵树,比较所有节点,通过 左节点值<节点值,右节点值>节点值 的方式来进行求解。但是这种解法是错误的,因为**对于任意一个节点**,我们不光需要左节点值小于该节点,并且**左子树上的所有节点值都需要小于该节点**。(右节点一致)所以我们在此引入上界与下界,用以保存之前的节点中出现的**最大值与最小值**。 - -## 03、递归求解 - -明确了题目,我们直接使用递归进行求解。这里需要强调的是,在每次递归中,我们除了**进行左右节点的校验,还需要与上下界进行判断**。由于该递归分析有一定难度,所以我们先展示代码: - -```go -func isValidBST(root *TreeNode) bool { - if root == nil{ - return true - } - return isBST(root,math.MinInt64,math.MaxInt64) -} - -func isBST(root *TreeNode,min, max int) bool{ - if root == nil{ - return true - } - if min >= root.Val || max <= root.Val{ - return false - } - return isBST(root.Left,min,root.Val) && isBST(root.Right,root.Val,max) -} -``` - -运行结果: - -img - -如果觉得上文中的递归不太容易理解,可以通过下图理解: - -img - diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/1.jpg" deleted file mode 100644 index c2a8f8f2..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/2.jpg" deleted file mode 100644 index 449375b7..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/3.png" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/3.png" deleted file mode 100644 index 129d4baa..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/3.png" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/4.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/4.jpg" deleted file mode 100644 index 0bcc54ba..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/403/4.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404.md" deleted file mode 100644 index 5a06b8b4..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404.md" +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: BST 的查找(700) ---- - -> 在上一节中,我们学习了**二叉搜索树**。那我们如何**在二叉搜索树中查找一个元素**呢?和普通的二叉树又有何不同?我们将在本节内容中进行学习! -> -> 下面我们仍然通过例题进行讲解。 -## 01、题目分析 - -| 第700题:二叉搜索树中的搜索 | -| ------------------------------------------------------------ | -| 给定二叉搜索树(BST)的根节点和一个值。你需要在 BST 中找到节点值等于给定值的节点。返回以该节点为根的子树。如果节点不存在,则返回 NULL 。 | - -**示例:** - -``` -给定二叉搜索树: - - 4 - / \ - 2 7 - / \ - 1 3 - -和值: 2 -``` - -你应该返回如下子树: - -``` - 2 - / \ - 1 3 -``` - -在上述示例中,如果要找的值是 5 ,但因为没有节点值为 5 ,我们应该返回 NULL 。 - -
- -> 本题为必须掌握! 需要非常熟悉 -> -> 为后续题目打基础! - -## 02、复习巩固 - -先复习一下,**二叉搜索树**(BST)的特性: - -
- -- **若它的左子树不为空,则所有左子树上的值均小于其根节点的值** -- **若它的右子树不为空,则所有右子树上的值均大于其根节点得值** -- **它的左右子树也分别为二叉搜索树** - -
- -如下图就是一棵典型的BST: - -img - -## 03、图解分析 - -假设目标值为 val,根据BST的特性,我们可以很容易想到查找过程 - -
- -- 如果val小于当前结点的值,转向其左子树继续搜索; -- 如果val大于当前结点的值,转向其右子树继续搜索; -- 如果已找到,则返回当前结点。 - -img - ->
很简单,不是吗?
- -## 04、代码示例 - -给出递归和迭代两种解法: - -```java -//递归 -public TreeNode searchBST(TreeNode root, int val) { - if (root == null) - return null; - if (root.val > val) { - return searchBST(root.left, val);     - } else if (root.val < val) { - return searchBST(root.right, val); - } else { - return root; - } -} -//迭代 -public TreeNode searchBST(TreeNode root, int val) { - while (root != null) { - if (root.val == val) { - return root; - } else if (root.val > val) { - root = root.left; - } else { - root = root.right; - } - } - return null; - } -``` - -
- -> 递归与迭代的区别 -> ->
-> ->递归:重复调用函数自身实现循环称为递归; -> ->迭代:利用变量的原值推出新值称为迭代,或者说迭代是函数内某段代码实现循环; - -**特别说明** - -
- -本题确实很简单!专门拉出来讲解的目的有二。第一BST确实很重要,第二希望通过重复,能加深大家对BST的印象,不至于和后面的内容出现交叉感染! \ No newline at end of file diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404/1.jpg" deleted file mode 100644 index c2a8f8f2..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404/2.jpg" deleted file mode 100644 index adee0122..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/404/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405.md" deleted file mode 100644 index 37dd76b3..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405.md" +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: BST 的删除(450) ---- - -> 在两节中,我们了解了BST(二叉搜索树)的概念,并且知道了如何在BST中查找一个元素。那我们又如何在BST中去删除一个元素呢?我们将通过本节的例题进行学习! -> -> 下面我们仍然通过例题进行讲解。 -## 01、题目分析 - -| 第450题:删除二叉搜索树中的节点 | -| ------------------------------------------------------------ | -| 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 | - -一般来说,删除节点可分为两个步骤: - -
- -- 首先找到需要删除的节点; -- 如果找到了,删除它。 - -
- -说明: 要求算法时间复杂度为 O(h),h 为树的高度。 - -
- -**示例:** - -``` -root = [5,3,6,2,4,null,7] -key = 3 - - 5 - / \ - 3 6 - / \ \ -2 4 7 - -给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。 - -一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。 - 5 - / \ - 4 6 - / \ -2 7 - -另一个正确答案是 [5,2,6,null,4,null,7]。 - 5 - / \ - 2 6 - \ \ - 4 7 -``` - -> **强烈建议先学习之前两节内容!** -> -> **以达到最好的学习效果!** - -## 02、复习巩固 - -先复习一下,**二叉搜索树**(BST)的特性: - -
- -- 若它的左子树不为空,则所有左子树上的值均小于其根节点的值 -- 若它的右子树不为空,则所有右子树上的值均大于其根节点得值 -- 它的左右子树也分别为二叉搜索树 - -
- -如下图就是一棵典型的BST: - -img - -## 03、图解分析 - -明确了概念,我们进行分析。我们要删除BST的一个节点,首先需要**找到该节点**。而找到之后,会出现三种情况。 - -
- -1、待删除的节点左子树为空,让待删除节点的右子树替代自己。 - -img - -2、待删除的节点右子树为空,让待删除节点的左子树替代自己。 - -img - -3、如果待删除的节点的左右子树都不为空。我们需要找到**比当前节点小的最大节点(前驱)**,来替换自己 - -img - -或者**比当前节点大的最小节点(后继)**,来替换自己。 - -img - -分析完毕,我们一起看代码怎么实现吧。 - -## 04、GO语言示例 - -这里我们给出通过**后继节点**来替代自己的方案(请后面自行动手实现另一种方案): - -```go -func deleteNode(root *TreeNode, key int) *TreeNode { - if root == nil { - return nil - } - if key < root.Val { - root.Left = deleteNode( root.Left, key ) - return root - } - if key > root.Val { - root.Right = deleteNode( root.Right, key ) - return root - } - //到这里意味已经查找到目标 - if root.Right == nil { - //右子树为空 - return root.Left - } - if root.Left == nil { - //左子树为空 - return root.Right - } - minNode := root.Right - for minNode.Left != nil { - //查找后继 - minNode = minNode.Left - } - root.Val = minNode.Val - root.Right = deleteMinNode( root.Right ) - return root -} - - -func deleteMinNode( root *TreeNode ) *TreeNode { - if root.Left == nil { - pRight := root.Right - root.Right = nil - return pRight - } - root.Left = deleteMinNode( root.Left ) - return root -} -``` - -执行结果: - -img - diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/1.jpg" deleted file mode 100644 index c2a8f8f2..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/2.jpg" deleted file mode 100644 index 4ef367cb..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/3.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/3.jpg" deleted file mode 100644 index ecb070a6..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/3.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/4.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/4.jpg" deleted file mode 100644 index 9c001327..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/4.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/5.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/5.jpg" deleted file mode 100644 index 69f5a01a..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/5.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/6.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/6.jpg" deleted file mode 100644 index 1b9bf5d3..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/405/6.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406.md" deleted file mode 100644 index 4f798f40..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406.md" +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: 平衡二叉树(110) ---- - -> 在之前的系列中,我们已经学习了**二叉树的深度**以及**DFS**,如果不会可以先查看之前的文章。今天我们将对其进行应用,直接看题目。 -## 01、题目分析 - -| 第110题:平衡二叉树 | -| ---------------------------------------------- | -| 给定一个二叉树,判断它是否是高度平衡的二叉树。 | - -本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 - -
- -**示例 1:** - -``` -给定二叉树 [3,9,20,null,null,15,7] - - 3 - / \ - 9 20 - / \ - 15 7 - -返回 true 。 -``` - -**示例 2:** - -``` -给定二叉树 [1,2,2,3,3,null,null,4,4] - - 1 - / \ - 2 2 - / \ - 3 3 - / \ - 4 4 - -返回 false 。 -``` - -## 02、图解分析 - -首先分析题目,这道题思路很简单,我们想判断一棵树是否满足平衡二叉树,无非就是判断当前结点的两个孩子是否满足平衡,同时两个孩子的高度差是否超过1。那只要我们可以得到高度,再基于高度进行判断即可。 - -
- -我们先复习一下之前对于树高度的求解: - -img - -这里唯一要注意的是,当我们判定**其中任意一个节点如果不满足平衡二叉树时,那说明整棵树已经不是一颗平衡二叉树**,我们可以**对其进行阻断,不需要继续递归下去**。 - -
- -另外,需要注意的是,下面这棵并不是平衡二叉树: - -img - -## 03、代码分析 - -根据分析,逻辑非常清晰,顺利得出代码: - -```go -func isBalanced(root *TreeNode) bool { - if root == nil { - return true - } - if !isBalanced(root.Left) || !isBalanced(root.Right) { - return false - } - leftH := maxDepth(root.Left) + 1; - rightH := maxDepth(root.Right) + 1; - if abs(leftH-rightH) > 1 { - return false - } - return true -} - -func maxDepth(root *TreeNode) int { - if root == nil { - return 0 - } - return max(maxDepth(root.Left),maxDepth(root.Right)) + 1 -} - -func max(a,b int) int { - if a > b { - return a - } - return b -} - -func abs(a int) int { - if a < 0 { - return -a - } - return a -} -``` - -执行结果: - -img - diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/1.jpg" deleted file mode 100644 index afcbaa8f..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/2.jpg" deleted file mode 100644 index 734476c7..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/3.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/3.jpg" deleted file mode 100644 index 2644ec41..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/406/3.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407.md" deleted file mode 100644 index 170fa803..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407.md" +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: 完全二叉树(222) -date: 2020-06-11 ---- - -> 在上一篇中,我们学习了解了**平衡二叉树**,并且利用DFS进行了验证。在本节中,我们将继续学习**完全二叉树**的相关内容。首先了解一下什么是完全二叉树。 - -## 01、完全二叉树 - -完全二叉树由满二叉树引出,先来了解一下什么是满二叉树: - -
- -如果**二叉树中除了叶子结点,每个结点的度都为 2**,则此二叉树称为**满二叉树**。(**二叉树的度**代表**某个结点的孩子或者说直接后继的个数。**对于二叉树而言,1度是只有一个孩子或者说单子树,2度是有两个孩子或者说左右子树都有。) - -
- -比如下面这颗: - -img - -那什么又是完全二叉树呢: - -
- -如果**二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布**,则此二叉树被称为**完全二叉树**。 - -
- -比如下面这颗: - -img - -而这颗就不是: - -img - -熟悉了概念,我们还是一起来看题目吧。 - -## 02、题目分析 - -| 第222题:完全二叉树的节点个数 | -| ---------------------------------------- | -| 给出一个完全二叉树,求出该树的节点个数。 | - -**说明:** - -完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 - -
- -**示例:** - -``` -输入: - 1 - / \ - 2 3 - / \ / -4 5 6 - -输出: 6 -``` - -## 03、递归求解 - -首先分析题目,我们很容易可以想到通过递归,来求解节点个数。 - -``` -func countNodes(root *TreeNode) int { - if root != nil { - return 1 + countNodes(root.Right) + countNodes(root.Left) - } - return 1 + countNodes(root.Right) + countNodes(root.Left) -} -``` - -执行结果: - -img - -但是很明显,出题者肯定不是要这种答案。因为这种答案和完全二叉树一毛钱关系都没有。所以我们继续思考。 - -## 04、经典解法 - -由于题中已经告诉我们这是一颗完全二叉树,我们又已知了完全二叉树除了最后一层,其他层都是满的,并且最后一层的节点全部靠向了左边。那我们可以想到,可以将该完全二叉树可以分割成**若干满二叉树和完全二叉树**,**满二叉树直接根据层高h计算出节点为2^h-1,**然后**继续计算子树中完全二叉树节点**。那如何分割成若干满二叉树和完全二叉树呢?**对任意一个子树,遍历其左子树层高left,右子树层高right,相等左子树则是满二叉树,否则右子树是满二叉树**。这里可能不容易理解,我们看图。 - -
- -假如我们有树如下: - -img - -我们看到根节点的左右子树高度都为3,那么说明左子树是一颗满二叉树。因为节点已经填充到右子树了,左子树必定已经填满了。所以左子树的节点总数我们可以直接得到,是2^left - 1,加上当前这个root节点,则正好是2^3,即 8。然后只需要再对右子树进行递归统计即可。 - -img - -那假如我们的树是这样: - -img - -我们看到左子树高度为3,右子树高度为2。说明此时最后一层不满,但倒数第二层已经满了,可以直接得到右子树的节点个数。同理,右子树节点+root节点,总数为2^right,即2^2。再对左子树进行递归查找。 - -img - -根据分析,得出代码: - -```java -class Solution { - public int countNodes(TreeNode root) { - if (root == null) { - return 0; - } - int left = countLevel(root.left); - int right = countLevel(root.right); - if (left == right) { - return countNodes(root.right) + (1 << left); - } else { - return countNodes(root.left) + (1 << right); - } - } - - private int countLevel(TreeNode root) { - int level = 0; - while (root != null) { - level++; - root = root.left; - } - return level; - } -} -``` - -运行结果: - -img \ No newline at end of file diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/1.jpg" deleted file mode 100644 index b6ded2f1..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/2.jpg" deleted file mode 100644 index dd1aae39..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/3.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/3.jpg" deleted file mode 100644 index c95ce2a1..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/3.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/4.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/4.jpg" deleted file mode 100644 index f5d5c4ad..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/4.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/5.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/5.jpg" deleted file mode 100644 index 64974b79..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/5.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/6.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/6.jpg" deleted file mode 100644 index 4e172abd..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/6.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/7.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/7.jpg" deleted file mode 100644 index c708b499..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/7.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/8.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/8.jpg" deleted file mode 100644 index ef037b96..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/8.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/9.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/9.jpg" deleted file mode 100644 index 83bfc720..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/407/9.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408.md" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408.md" deleted file mode 100644 index c815c0ef..00000000 --- "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408.md" +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: 二叉树的剪枝(814) -date: 2020-06-11 ---- - - -> 在之前的系列中。我们学习了DFS、BFS,也熟悉了平衡二叉树,满二叉树,完全二叉树,BST(二叉搜索树)等概念。在本节中,我们将学习一种二叉树中常用的操作 —**剪枝**。这里额外说一点,就本人而言,对这个操作以及其衍化形式的使用会比较频繁。因为我是做规则引擎的,在规则引擎中,我们会有一个概念叫做**决策树**,那**如果一颗决策树完全生长,就会带来比较大的过拟合问题**。因为完全生长的决策树,每个节点只会包含一个样本。所以我们就**需要对决策树进行剪枝操作,来提升整个决策模型的泛化能力**(ML概念)... 听不懂也没关系,简单点讲,就是我觉得这个很重要,或者每道算法题都很重要。如果你在工作中没有用到,不是说明算法不重要,而可能是你还不够重要。 - -## 01、剪枝概述 - -假设有一棵树,最上层的是root节点,而**父节点会依赖子节点**。如果现在有一些节点已经标记为无效,我们要删除这些无效节点。**如果无效节点的依赖的节点还有效,那么不应该删除**,如果无效节点和它的子节点都无效,则可以删除。剪掉这些节点的过程,称为剪枝,目的是**用来处理二叉树模型中的依赖问题**。 - -
- -我们还是通过一道题目来进行具体学习。 - -## 02、题目分析 - -| 第814题:二叉树的剪枝 | -| ------------------------------------------------------------ | -| 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身,以及所有 X 的后代。) | - -**示例1:** - -``` -输入: [1,null,0,0,1] -输出: [1,null,0,null,1] -``` - -img - -**解释: ** - -- 只有红色节点满足条件“所有不包含 1 的子树”。 -- 右图为返回的答案。 - -
- -**示例2:** - -``` -输入: [1,0,1,0,0,0,1] -输出: [1,null,1,null,1] -``` - -img - -**示例3:** - -``` -输入: [1,1,0,1,1,0,1,0] -输出: [1,1,0,1,1,null,1] -``` - -img - -**说明:** - -- 给定的二叉树最多有 100 个节点。 -- 每个节点的值只会为 0 或 1 。 - -## 03、递归求解 - -二叉树的问题,大多都可以通过递归进行求解。我们直接进行分析。假设我们有二叉树如下:[0,1,0,1,0,0,0,0,1,1,0,1,0] - -
- -就是下面这样: - -img - -剪枝之后是这样: - -img - -剪什么大家应该都能理解。那关键是怎么剪?过程也很简单,**在递归的过程中,如果当前结点的左右节点皆为空,且当前结点为0,我们就将当前节点剪掉即可。** - -img - -根据分析,很自然得出代码: - -```go -func pruneTree(root *TreeNode) *TreeNode { - return deal(root) -} - -func deal(node *TreeNode) *TreeNode { - if node == nil { - return nil - } - node.Left = deal(node.Left) - node.Right = deal(node.Right) - if node.Left == nil && node.Right == nil && node.Val == 0 { - return nil - } - return node -} -``` - -运行结果: - -img - -
- -> 我一度认为算法题的意义绝不简简单单只是为了面试,一度想把这种观念传递给认识我的朋友们。至少在工作中,对于栈,优先队列,红黑树,图等知识或多或少都是有机会能用到。不记得是不是李开复说的了,**算法是提高智商少数为之可行的手段**。真心希望大家可以在这个过程中为之成长,我们大家一起努力啊。 \ No newline at end of file diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/1.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/1.jpg" deleted file mode 100644 index 6efd8e56..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/1.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/2.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/2.jpg" deleted file mode 100644 index 929aa34f..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/2.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/3.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/3.jpg" deleted file mode 100644 index e0b37d6f..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/3.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/4.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/4.jpg" deleted file mode 100644 index 2b76bf13..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/4.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/5.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/5.jpg" deleted file mode 100644 index adb7426d..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/5.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/6.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/6.jpg" deleted file mode 100644 index 43ac7284..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/6.jpg" and /dev/null differ diff --git "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/7.jpg" "b/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/7.jpg" deleted file mode 100644 index bfe912ac..00000000 Binary files "a/website/1.4.\344\272\214\345\217\211\346\240\221\347\263\273\345\210\227/408/7.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1.md" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1.md" deleted file mode 100644 index 5746bbb2..00000000 --- "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1.md" +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: 全排列算法 -date: 2020-07-11 ---- - -> 今天为大家分享如何用算法来求全排列!话不多说,直接看题! - -## 01、全排列概念 - -> 什么是全排列?从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n 个不同元素中取出 m 个元素的一个排列。当 m=n 时所有的排列情况叫全排列。 - -
- -比如 [1,2,3] 全排列共有 6 种: - -PNG - -## 02、全排列题目 - -> 然后把上面的全排列稍微改改,就变成了一道算法题。。。 - -| 全排列问题 | -| ---------------------------------------------------------- | -| 给定一个 **没有重复** 数字的序列,返回其所有可能的全排列。 | - -**示例:** - -``` -输入: [1,2,3] - -输出: -[ - [1,2,3], - [1,3,2], - [2,1,3], - [2,3,1], - [3,1,2], - [3,2,1] -] -``` - -## 03、题解分析 - -> 这种由基础数学知识改编而成的题目,在面试时还是很受欢迎的。因为作为面试官,可以用这种题目,来显示自己的博学。(谬论) - -
- -假如我们不是做算法题,而是做数学题。我们会一个位置一个位置的来考虑,先写出以1开头的排列,再写出以2开头的排列,最后写出以3开头的排列。 - -PNG - -这种思路是不是很像深度优先(DFS)的求解过程呢? - -
- -1、我们先选择 1,然后为 1 的第二位选择 2,此时 1 的 第三位只能选择 3。 - -PNG - -2、然后完成了上面的步骤,我们需要回退到 1,因为只有 1 这里还存在别的选择 1-3,然后填写 1-3 后,只有 1-3-2 一种选择。 - -PNG - -3、此时我们需要从 1-3-2,回退到 1-3,再回退到 1,再回退到 根节点,然后重新选择 2。 - -PNG - -4、后面的流程与前面相似,我就不一步步的描述了。 - -PNG - -当然,如果不省略其回溯过程,就是下面这个样子: - -[TODO] - -上面分析是分析完了,但是仍然不妨碍你继续懵逼。。。“题目中不是给我的是一个数组吗?作为一个合格的算法小白,我特么根本就不知道 DFS 在这里面咋用啊!!”本来想扔完代码就走,想了想还是决定讲一下。 - -
- -我们把代码先丢出来(注意,这个代码不是最优的,这样写只是易于大家理解。比如我们还可以通过置换的方式来进行优化,又或者其他的优化方法。但是都大同小异,核心是回溯的过程): - -```java -//JAVA -class Solution { - List> ans = new ArrayList<>(); - - public List> permute(int[] nums) { - dfs(nums, new ArrayList<>()); - return ans; - } - - private void dfs(int[] nums, List tmp) { - System.out.println(Arrays.toString(nums) + "," + tmp); - if (tmp.size() == nums.length) { - ans.add(new ArrayList<>(tmp)); - } else { - for (int num : nums) { - if (!tmp.contains(num)) { - tmp.add(num); - dfs(nums, tmp); - tmp.remove(tmp.size() - 1); - } - } - } - } - -} -``` - -假若 nums 为 [1,2,3],会有下面的输出: - -PNG - -其实这个代码还是很容易理解的,他干了个啥事?就是当我们按顺序去枚举每一位时,我们要把已经选择过的数字排除掉(第16行代码),比如我们上面选择三个数字: - -
- -- 在枚举第一位的时候,就有三种情况 -- 在枚举第二位的时候,就只有两种情况(前面已经出现的一个数字不可以再出现) -- 在枚举第三位的时候,就只有一种情况(前面已经出现的两个数字不可以再出现) - -
- -整个代码其实就干了这么一件事!而 第12行 的代码,其实就是说**当枚举到最后一位的时候,这个就是我们要的排列结果,所以我们要放入到全排列结果集中。** - -
- -那这里还有一个很重要的代码,其实是 第19行,这一步其实是干啥!说白了就是在回到上一位时,我们要就把上一次的选择结果**撤销**掉。不然如果你之前选过了,后面不就不能继续用了么。 - -## 04、总结 - -> 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 - -
- -这是最简单的一道全排列题目,注意我在上面的题解中,并没有引入什么状态、路径、选择列表、结束条件之类的专业术语,甚至我连回溯的概念都没有提及。 - -PNG - -之所以这样讲,我是希望咱可以从最简单的人类思考出发,而不是去套用一些框架之类的东东。。。。当然,至于更多的概念和回溯框架的东西,我会在后面更为复杂的题目中为大家引入。 - -
- -好了,基本就是这样了。周末写文不容易,求个转发,来个评论。感谢~ \ No newline at end of file diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/1.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/1.jpg" deleted file mode 100644 index 9015652e..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/1.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/1.mp4" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/1.mp4" deleted file mode 100644 index 9ead66a7..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/1.mp4" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/2.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/2.jpg" deleted file mode 100644 index ae59f3f6..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/2.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/3.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/3.jpg" deleted file mode 100644 index a831ba18..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/3.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/4.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/4.jpg" deleted file mode 100644 index a0e8da4b..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/4.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/5.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/5.jpg" deleted file mode 100644 index 13cc1ec0..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/5.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/6.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/6.jpg" deleted file mode 100644 index d6c05e8c..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/6.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/7.jpg" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/7.jpg" deleted file mode 100644 index a7233fcb..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/7.jpg" and /dev/null differ diff --git "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/8.gif" "b/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/8.gif" deleted file mode 100644 index 5188dd4e..00000000 Binary files "a/website/1.41.\345\233\236\346\272\257\347\263\273\345\210\227/1/8.gif" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501.md" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501.md" deleted file mode 100644 index dcc89ee2..00000000 --- "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501.md" +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: 滑动窗口最大值(239) -date: 2020-06-12 ---- - -date: 2020-06-12 - -> 有读者小伙伴建议讲一下**滑动窗口**相关题型,因为经常面试会被问到。所以就开了这个系列(所以如果大家有想让分享的题型都可以留言区告诉我,任何事情我觉得都需要有反馈。比如一个错误,你不反馈,我不知道..那就只能这样过去了..)闲话不啰嗦,直接看题! - -## 01、题目分析 - -| 第239题:滑动窗口最大值 | -| ------------------------------------------------------------ | -| 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。 | - -给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 - -
- -返回滑动窗口中的最大值**所构成的数组**。 - -
- -**示例:** - -``` -输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 -输出: [3,3,5,5,6,7] -解释: - - 滑动窗口的位置 最大值 ---------------- ----- -[1 3 -1] -3 5 3 6 7 3 - 1 [3 -1 -3] 5 3 6 7 3 - 1 3 [-1 -3 5] 3 6 7 5 - 1 3 -1 [-3 5 3] 6 7 5 - 1 3 -1 -3 [5 3 6] 7 6 - 1 3 -1 -3 5 [3 6 7] 7 -``` - -> **本题有一定难度!建议认真阅读** -> -> **并课后练习~** - -## 02、题目分析 - -本题对于题目没有太多需要额外说明的,应该都能理解,直接进行分析。我们很容易想到,可以**通过遍历所有的滑动窗口,找到每一个窗口的最大值,来进行暴力求解**。那一共有多少个滑动窗口呢,小学题目,可以得到共有 **L-k+1** 个窗口。 - -
- -假设 nums = [1,3,-1,-3,5,3,6,7],和 k = 3,窗口数为6 - -img - -根据分析,直接完成代码: - -```java -class Solution { - public int[] maxSlidingWindow(int[] nums, int k) { - int len = nums.length; - if (len * k == 0) return new int[0]; - int [] win = new int[len - k + 1]; - //遍历所有的滑动窗口 - for (int i = 0; i < len - k + 1; i++) { - int max = Integer.MIN_VALUE; - //找到每一个滑动窗口的最大值 - for(int j = i; j < i + k; j++) { - max = Math.max(max, nums[j]); - } - win[i] = max; - } - return win; - } -} -``` - -运行结果: - -img - -
- -> It's Bullshit!结果令我们很不满意,时间复杂度达到了O(LK),如果面试问到这道题,基本上只写出这样的代码,一定就挂掉了。那我们怎么样优化时间复杂度呢?有没有可以O(L)的实现呢?=_= - -## 03、线性题解 - -这里不卖关子,其实这道题比较经典,我们可以采用队列,DP,堆等方式进行求解,所有思路的主要源头应该都是**在窗口滑动的过程中,如何更快的完成查找最大值的过程**。但是最典型的解法还是使用**双端队列**。具体怎么来求解,一起看一下。 - -
- -首先,我们了解一下,什么是双端队列:是一种具有**队列和栈的性质的数据结构**。双端队列中的元素可以从两端弹出或者插入。 - -img - -我们可以利用双端队列来实现一个窗口,目的是让该窗口可以做到**张弛有度**(汉语博大精深,也就是长度动态变化。其实用游标或者其他解法的目的都是一样的,就是去维护一个可变长的窗口) - -
- -然后我们再做一件事,只要**遍历该数组**,同时**在双端队列的头去维护当前窗口的最大值(在遍历过程中,发现当前元素比队列中的元素大,就将原来队列中的元素祭天),在整个遍历的过程中我们再记录下每一个窗口的最大值到结果数组中。**最终结果数组就是我们想要的,整体图解如下。 - -
- -假设 nums = [1,3,-1,-3,5,3,6,7],和 k = 3 - -img - -> (小浩os:我觉得自己画的这个图对于双端队列的解法还是介绍的比较清晰的,大家好好看一下哦,这样我的努力也就没有白费呢。) - -
- -根据分析,得出代码: - -```go -func maxSlidingWindow(nums []int, k int) []int { - if len(nums) == 0 { - return []int{} - } - //用切片模拟一个双端队列 - queue := []int{} - result := []int{} - for i := range nums { - for i > 0 && (len(queue) > 0) && nums[i] > queue[len(queue)-1] { - //将比当前元素小的元素祭天 - queue = queue[:len(queue)-1] - } - //将当前元素放入queue中 - queue = append(queue, nums[i]) - if i >= k && nums[i-k] == queue[0] { - //维护队列,保证其头元素为当前窗口最大值 - queue = queue[1:] - } - if i >= k-1 { - //放入结果数组 - result = append(result, queue[0]) - } - } - return result -} -``` - -执行结果: - -img - -
- -Perfact~题目完成!看着一下子超越百分之99的用户,是不是感觉很爽呢~ \ No newline at end of file diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/1.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/1.jpg" deleted file mode 100644 index 6d6adaae..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/1.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/2.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/2.jpg" deleted file mode 100644 index c1c624ef..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/2.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/3.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/3.jpg" deleted file mode 100644 index 8cf9f264..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/3.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/4.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/4.jpg" deleted file mode 100644 index 5c31dab0..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/4.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/5.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/5.jpg" deleted file mode 100644 index 3325ab21..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/501/5.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502.md" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502.md" deleted file mode 100644 index 3cfe936c..00000000 --- "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502.md" +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: 无重复字符的最长子串(3) -date: 2020-06-12 ---- - - - -> 在上一节中,我们使用**双端队列**完成了滑动窗口的一道颇为困难的题目,以此展示了什么是滑动窗口。在本节中我们将继续深入分析,探索滑动窗口题型一些具有模式性的解法。 - -## 01、滑动窗口介绍 - -对于大部分滑动窗口类型的题目,一般是**考察字符串的匹配**。比较标准的题目,会给出一个**模式串B**,以及一个**目标串A**。然后提出问题,找到**A中符合对B一些限定规则的子串或者对A一些限定规则的结果,**最终**再将搜索出的子串完成题意中要求的组合或者其他**。 - -
- -比如:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。 - -
- -又或者:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 - -
- -再如:给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 - -
- -都是属于这一类的标准题型。而对于这一类题目,我们常用的解题思路,**是去维护一个可变长度的滑动窗口**。无论是使用**双指针**,还是使用**双端队列**,又或者用**游标**等其他奇技淫巧,目的都是一样的。 - -
- -Now,我们通过一道题目来进行具体学习吧 - -## 02、题目分析 - -| 第3题:无重复字符的最长子串 | -| ------------------------------------------------------------ | -| 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 | - -**示例 1:** - -``` -输入: "abcabcbb" -输出: 3 -解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3 -``` - -**示例 2:** - -``` -输入: "bbbbb" -输出: 1 -解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 -``` - -**示例 3:** - -``` -输入: "pwwkew" -输出: 3 -解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 -``` - -
- -请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 - -## 03、题解分析 - -直接分析题目,假设我们的输入为“abcabcbb”,我们只需要维护一个窗口在输入字符串中进行移动。如下图: - -img - -当下一个元素在窗口没有出现过时,我们扩大窗口。 - -img - -当下一个元素在窗口中出现过时,我们缩小窗口,将**出现过的元素以及其左边的元素**统统移出: - -img - -在整个过程中,我们**记录下窗口出现过的最大值**即可。而我们唯一要做的,只需要**尽可能扩大窗口**。 - -
- -那我们代码中通过什么来维护这样的一个窗口呢?anyway~ 不管是队列,双指针,甚至通过map来做,都可以。 - -
- -我们演示一个**双指针**的做法: - -```java -public class Solution { - public static int lengthOfLongestSubstring(String s) { - int n = s.length(); - Set set = new HashSet<>(); - int result = 0, i = 0, j = 0; - while (i < n && j < n) { - //charAt:返回指定位置处的字符 - if (!set.contains(s.charAt(j))) { - set.add(s.charAt(j)); - j++; - result = Math.max(result, j - i); - } else { - set.remove(s.charAt(i)); - i++; - } - } - return result; - } -} -``` - -执行结果: - -img - -通过观察,我们能看出来。如果是最坏情况的话,我们每一个字符都可能会访问两次,left一次,right一次,时间复杂度达到了O(2N),这是不可饶恕的。不理解的话看下图: - -
- -假设我们的字符串为“abcdc”,对于abc我们都访问了2次。 - -img - -那如何来进一步优化呢? - -
- -其实我们可以定义**字符到索引的映射**,而不是简单通过一个集合来判断字符是否存在。这样的话,当我们**找到重复的字符时,我们可以立即跳过该窗口**,而不需要对之前的元素进行再次访问。 - -img - -优化代码如下: - -```java -public class Solution { - public static int lengthOfLongestSubstring(String s) { - int n = s.length(), result = 0; - Map map = new HashMap<>(); - for (int right = 0, left = 0; right < n; right++) { - if (map.containsKey(s.charAt(right))) { - left = Math.max(map.get(s.charAt(right)), left); - } - result = Math.max(result, right - left + 1); - map.put(s.charAt(right), right + 1); - } - return result; - } -} -``` - -执行结果: - -img - -修改之后,我们发现虽然时间复杂度有了一定提高,但是还是比较慢!如何更进一步的优化呢?我们可以使用一个256位的数组来替代hashmap,以进行优化。(因为ASCII码表里的**字符**总共有128个。ASCII码的长度是一个字节,8位,理论上可以表示256个字符,但是许多时候只谈128个。具体原因可以下去自行学习~) - -
- -进一步优化代码: - -```java -class Solution { - public int lengthOfLongestSubstring(String s) { - int n = s.length(); - int result = 0; - int[] charIndex = new int[256]; - for (int left = 0, right = 0; right < n; right++) { - char c = s.charAt(right); - left = Math.max(charIndex[c], left); - result = Math.max(result, right - left + 1); - charIndex[c] = right + 1; - } - - return result; - } -} -``` - -执行结果: - -img - -我们发现优化后时间复杂度有了极大的改善!这里简单说一下原因,对于数组和hashmap访问时,两个谁快谁慢不是一定的,需要思考hashmap的底层实现,以及数据量大小。但是在这里,因为已知了待访问数据的下标,可以**直接寻址**,所以极大的缩短了查询时间。 - -
- -## 04、总结 - -本题基本就到这里。最后要说的,一般建议如果要分析一道题,我们要压缩压缩再压缩,抽茧剥丝一样走到最后,尽可能的完成对题目的优化。不一定非要自己想到最优解,但绝对不要局限于单纯的完成题目,那样将毫无意义! \ No newline at end of file diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/1.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/1.jpg" deleted file mode 100644 index 17f68383..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/1.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/2.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/2.jpg" deleted file mode 100644 index 798fd269..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/2.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/3.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/3.jpg" deleted file mode 100644 index a49d6730..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/3.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/4.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/4.jpg" deleted file mode 100644 index 0446851b..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/4.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/5.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/5.jpg" deleted file mode 100644 index b01ac014..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/5.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/6.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/6.jpg" deleted file mode 100644 index 47c49e52..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/6.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/7.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/7.jpg" deleted file mode 100644 index 43abb357..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/7.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/8.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/8.jpg" deleted file mode 100644 index a8c14479..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/502/8.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503.md" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503.md" deleted file mode 100644 index 7623461f..00000000 --- "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503.md" +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: 字母异位词(438) -date: 2020-06-12 ---- - - -> 之前的两节讲解了**滑动窗口类**问题的**模式解法**,相信大家对该类题型已不陌生**。**今天将继续完成一道题目,来进行巩固学习。 - -## 01、题目分析 - -| 第438. 找到字符串中所有字母异位词 | -| ------------------------------------------------------------ | -| 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。 | - -字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。 - -**说明:** - -
- -- 字母异位词指字母相同,但排列不同的字符串。 -- 不考虑答案输出的顺序。 - -
- -**示例 1:** - -``` -输入:s: "cbaebabacd" p: "abc" - -输出:[0, 6] - -解释: -起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。 -起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。 -``` - -**示例 2:** - -``` -输入:s: "abab" p: "ab - -输出:[0, 1, 2] - -解释: -起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。 -起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。 -起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。 -``` - -> **提示:** -> -> **建议先完成上节内容的学习!** -> -> **否则可能理解会有一定困难!** - -## 02、题解分析 - -直接套用之前的模式,使用双指针来模拟一个滑动窗口进行解题。分析过程如下: - -
- -假设我们有字符串为“cbaebabacd”,目标串为“abc” - -
- -我们通过双指针维护一个窗口,由于我们只需要判断字母异位词,我们可以将窗口初始化大小和目标串保持一致。(当然,你也可以初始化窗口为1,逐步扩大) - -img - -而**判断字母异位词**,我们需要**保证窗口中的字母出现次数与目标串中的字母出现次数一致**。这里因为字母只有26个,直接使用数组来替代map进行存储(和上一讲中的ASCII使用256数组存储思想一致)。 - -
- -pArr为目标串数组,sArr为窗口数组。我们发现初始化数组,本身就满足,记录下来。(**这里图示用map模拟数组,便于理解**) - -img - -然后我们通过移动窗口,来更新窗口数组,进而和目标数组匹配,匹配成功进行记录。每一次窗口移动,**左指针前移**,原来**左指针位置处的数值减1,表示字母移出**;**同时右指针前移**,**右指针位置处的数值加1,表示字母移入**。详细过程如下: - -img - -img - -最终,当右指针到达边界,意味着匹配完成。 - -## 04、代码展示 - -根据分析,完成代码:(下面pSize相关的忽略,调试忘删了) - -```java -class Solution { - - public List findAnagrams(String s, String p) { - - if (s == null || p == null || s.length() < p.length()) return new ArrayList<>(); - - List list = new ArrayList<>(); - - int[] pArr = new int[26]; - int pSize = p.length(); - int[] sArr = new int[26]; - - for (int i = 0; i < p.length(); i++) { - sArr[s.charAt(i) - 'a']++; - pArr[p.charAt(i) - 'a']++; - } - - for (int i = 0; i < p.length(); i++) { - int index = p.charAt(i) - 'a'; - if (pArr[index] == sArr[index]) - pSize--; - } - - int i = 0; - int j = p.length(); - - // 窗口大小固定为p的长度 - while (j < s.length()) { - if (isSame(pArr, sArr)) - list.add(i); - //sArr[s.charAt(i) - 'a']-- 左指针位置处字母减1 - sArr[s.charAt(i) - 'a']--; - i++; - //sArr[s.charAt(j) - 'a']++ 右指针位置处字母加1 - sArr[s.charAt(j) - 'a']++; - j++; - } - - if (isSame( pArr, sArr)) - list.add(i); - - return list; - } - - public boolean isSame(int[] arr1, int[] arr2) { - for (int i = 0; i < arr1.length; ++i) - if (arr1[i] != arr2[i]) - return false; - return true; - } -} -``` - -执行结果: - -img - -PS:本题属于模式解法,非最优解!这里留下思考内容,如何在本解法的基础上进行优化,近一步降低时间复杂度? - diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/1.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/1.jpg" deleted file mode 100644 index f193abe7..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/1.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/2.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/2.jpg" deleted file mode 100644 index e167a5d2..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/2.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/3.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/3.jpg" deleted file mode 100644 index f02e4489..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/3.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/4.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/4.jpg" deleted file mode 100644 index d748f944..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/4.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/5.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/5.jpg" deleted file mode 100644 index f39783a4..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/503/5.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504.md" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504.md" deleted file mode 100644 index e4e86181..00000000 --- "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504.md" +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: 和为s的连续正数序列 -date: 2020-07-08 ---- - -> 昨天写了一篇感悟,没想到那么受欢迎。几百人转发,好几千人阅读,虚荣心得到了极大的满足。今天继续为大家分享一道经典面试题目。 - -## 01、题目示例 - -> 咕咕咕...一道很简单的题目~ - -
- -| 题目:和为s的连续正数序列 | -| ------------------------------------------------------------ | -| 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 | - -**示例 1:** - -``` -输入:target = 9 -输出:[[2,3,4],[4,5]] -``` - -**示例 2:** - -``` -输入:target = 15 -输出:[[1,2,3,4,5],[4,5,6],[7,8]] -``` - -## 02、题目分析 - -> 特别提醒:这两天有人问我,说浩哥,为什么看了你那么多题解,但是我一旦上机写,便啥都不记得了。这个我想说。。。你真牛掰。普通人应该都做不到看看题解,就能真的掌握一个题目(不信你看书学学KMP,再试试看能不能一次写出来)。题解只是给你提供一个思路,真正的提高,取决于coding的过程。大量的练习,忍受难受的过程,才能真正的进步! - -
- -这个题目比较简单,典型的一道**滑动窗口**的题目。如果对滑动窗口陌生,可以先看下下面的题解: - - [滑动窗口最大值(239)](1.5.滑动窗口系列/501.md) - - [无重复字符的最长子串(3)](1.5.滑动窗口系列/502.md) - - [找到字符串中所有字母异位词(438)](1.5.滑动窗口系列/503.md) - -假若我们输入的 target 为 9,大脑中应该有下面这么个玩意: - -PNG - -然后我们通过左右指针来维护一个滑动窗口,同时计算窗口内的值是否是目标值: - -PNG - -如果窗口的值过小,我们就移动右边界。 - -PNG - -如果窗口的值过大,我们就移动左边界。 - -PNG - -剩下的就是反复上面的操作就可以了。到这里分析过程看似结束了。但是我们可以观察出一丢丢规律,用来优化我们的算法。**对于任意一个正整数,总是小于它的中值与中值+1的和**。为了让大家直观,用下图举例: - -PNG - -比如这里的100,就一定小于50+51,换成其他数也一样。换句话说,**一旦窗口左边界超过中值,窗口内的和一定会大于 target**。 - -
- -根据分析,得到题解:(好久没给Go语言的示例了,刻意把代码写的比较简单,没有用啥骚操作哈) - -```go -//go -func findContinuousSequence(target int) [][]int { - result := make([][]int, 0) - i := 1 - j := 1 - win := 0 - arr := make([]int, target) - for i := range arr { - arr[i] = i + 1 - } - for i <= target/2 { - if win < target { - win += j - j++ - } else if win > target { - win -= i - i++ - }  else { - result = append(result, arr[i-1:j-1]) - win -= i - i++ - } - } - return result -} -``` - -同时也给一个java版本的: - -```java -//java -class Solution { - public int[][] findContinuousSequence(int target) { - List res = new ArrayList<>(); - int i = 1;  - int j = 1;  - int win = 0;  - while (i <= target / 2) { - if (win < target) { - win += j; - j++; - } else if (win > target) { - win -= i; - i++; - } else { - int[] arr = new int[j-i]; - for (int k = i; k < j; k++) { - arr[k-i] = k; - } - res.add(arr); - win -= i; - i++; - } - } - return res.toArray(new int[res.size()][]); - } -} -``` - -## 03、继续优化 - -> 到这里你以为这个题目就结束了吗?...哈哈哈哈哈...其实真就结束了~囧!o(╯□╰)o - -
- -本题我使用滑动窗口进行求解,是期望给出一种通用解法。有很多基础差的同学,并不能每道题目都玩出来骚操作。但是本题除了常规的滑动窗口之外,其实还有数学法,递推法等多种解题思路。这里给出数学法的提示:**等差数列求和公式**,希望大家下去自行思考一番,评论区留下你的想法!咱们明天见! - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/1.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/1.jpg" deleted file mode 100644 index b8a23a2c..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/1.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/2.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/2.jpg" deleted file mode 100644 index 94eae76a..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/2.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/3.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/3.jpg" deleted file mode 100644 index ce641c47..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/3.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/4.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/4.jpg" deleted file mode 100644 index 297ab320..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/4.jpg" and /dev/null differ diff --git "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/5.jpg" "b/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/5.jpg" deleted file mode 100644 index a4814e94..00000000 Binary files "a/website/1.5.\346\273\221\345\212\250\347\252\227\345\217\243\347\263\273\345\210\227/504/5.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601.md" deleted file mode 100644 index 733abc6b..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601.md" +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: 囚徒困境 -date: 2020-06-14 ---- - -> 本系列将为大家带来一整套的**博弈论问题**。因为在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,而这类问题中,很多都有博弈论的影子存在。这些公司里以FLAG(Facebook, LinkedIn, Amazon, Google)为典型,特别喜欢考察本类题型。同时,本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高分析问题的能力~ - -## 01、什么是“博弈论” - -古语有云,“笑人情似纸,世事如棋”。生活中每个人如同棋手,其每一个行为如同在一张看不见的棋盘上布子,精明慎重的棋手们相互揣摩、牵制、争赢,下出诸多精彩纷呈、变化多端的棋局。而什么是博弈论?就是研究棋手们 的“出棋” 过程,从中抽象出可逻辑化的部分,并将其系统化的一门科学,也是运筹学的一个重要学科。 - -
- -我们从最简单的一道“**囚徒困境**”来进行学习~ - -## 02、囚徒困境 - -| 囚徒困境 | -| ------------------------------------------------------------ | -| 一件严重的纵火案发生后,警察在现场抓到两个犯罪嫌疑人。事实上,正是他们一起放火烧了这座仓库。但是,警方没有掌握足够的证据,只得把他们分开囚禁起来,要求他们坦白交代。 | - -在分开囚禁后,警察对其分别告知: - -
- -如果你坦白,而对方不坦白,则将你释放,判对方8年。 - -如果你不坦白,而对方坦白,则将对方释放,而判你8年。 - -如果你两都坦白了,则判你两各自4年。 - -
- -那么两个囚犯应该如何做,是互相背叛还是一起合作? - -
- -**题目分析:** - -
- -从表面上看,其实囚犯最应该的就是一起合作,都不坦白,这样因为证据不足,会将两人都进行释放。但是!因为事实确实是两人放的火,所以他们**不得不进行思考,另一人采取了什么样的行为**? - -
- -犯人甲当然不傻,他根本无法相信同伙不会向警方提供任何信息!因为如果同伙一旦坦白,而自己这边如果什么都没说的话,就可以潇洒而去。但他同时也意识到,他的同伙也不傻,也会同样来这样设想他。 - -
- -所以犯人甲的结论是,**唯一理性的选择就是背叛同伙**,把一切都告诉警方!这样的话,如果他的同伙笨得只会保持沉默,那么他就会是那个离开的人。而如果他的同伙也根据这个逻辑向警方交代了,那么也没有关系,起码他不必服最重的刑! - -img - -## 03、囚徒困境与纳什均衡 - -这场博弈的过程,**显然不是顾及团体利益的最优解决方案**。以全体利益而言,如果两个参与者都合作保持沉默,两人都可以无罪释放,总体利益更高!但根据假设(人性),二人**均为理性的个人**,且只追求自己的个人利益。均衡状况会是两个囚徒都选择背叛,这就是“困境”所在! - -
- -事实上,这种**两人都选择坦白的策略以及因此被判4年的结局**被称作“**纳什均衡**”(也叫非合作均衡),换言之,在此情况下,**无一参与者可以“独自行动”(即单方面改变决定)而增加收获。** - -
- -我们看一下官方释意是多么难懂“所谓纳什均衡,指的是参与人的一种策略组合,在该策略组合上**,任何参与人单独改变策略都不会得到好处。”**简单点讲,如果在一个策略组合上,当所有其他人都不改变策略时,没有人会改变自己的策略,则该策略组合就是一个纳什均衡。 \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601/1.jpg" deleted file mode 100644 index a31190c7..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/601/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602.md" deleted file mode 100644 index 0bb65f6b..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602.md" +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: 辛普森悖论 -date: 2020-06-14 ---- - -> 本系列主要为大家带来一整套的**博弈论问题(广义)**。因为在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,而这类问题中,很多都有博弈论的影子存在。这些公司里以FLAG(Facebook, LinkedIn, Amazon, Google)为典型,特别喜欢考察本类题型。同时,本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高分析问题的能力~ - -## 01、辛普森悖论 - -| 辛普森悖论 | -| ------------------------------------------------------------ | -| 羊羊医院里统计了两种胆结石治疗方案的治愈率。在统计过程中,医生将病人分为大胆结石和小胆结石两组。统计结果如下: | - -img - -- 对于小胆结石而言,手术A的治愈率(93%)高于 手术B(87%) - -- 对于大胆结石而言,手术A的治愈率(73%)高于 手术B(69%) - -
羊羊医院的医生得出结论:
- -
无论是对于大小胆结石,手术A的治愈率都胜过手术B。
- -
- -但是真的是这样吗?当然不是,我们根据样本统计出大小胆结石总计的治愈率,发现**手术B(治愈率83%)其实是要高于手术A(治愈率78%)**。 - -img - -为什么会出现这样的结果?这就是著名的**辛普森悖论。** - -## 02、直觉的缺陷 - -得到了结论,我们来思考背后的东西。在我们的直觉里有这样一个逻辑:**如果一个事物的各部分都分别大于另一个事物的各部分,那么这个事物大于另一个事物。**比如:我们的直觉告诉我们如果手术A在两组病人中都更好,那么在所有病人中也应该更好。 - -
- -我们可以将其公式化(**该公式错误**),假设: - ->
A=A1+A2+....+An
->
B=B1+B2+....+Bn
->
如果对i=1,2...,n都有Ai>Bi,则A>B
- -乍一看,我们觉得该公式没有问题~所以这个公式也就代表了我们大部分人的思维工作。其实在这个公式中,隐藏掉了一个很重要的条件:**A1、A2、An 以及 B1、B2、Bn 并不能简单的通过“加”来得到 A 或者 B**。这就是**可加性**的前提。在大脑的思维过程中,因为我们很难直接看到这个前提,进而就导致了我们错误的思考! - -## 03、辛普森悖论举例 - -下面我们举一些在生活中常见的辛普森悖论例子: - -
- -- 打麻将的时候,把把都赢小钱,造成赢钱的假象,其实不如别人赢一把大的。 -- 在苹果和安卓的竞争中,你听见身边的人都在逃离苹果,奔向安卓。但是其实苹果的流入率还是要高于安卓。(有数据证明,很经典的案例) -- 你男票,这里比别人差,那里比别人差,但是其实他真的比别的男生差吗?(这个纯属本人胡扯了..) - -
- -好啦,这篇内容就到这里了,你学会了吗? \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602/1.jpg" deleted file mode 100644 index ce451f3f..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602/2.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602/2.jpg" deleted file mode 100644 index 62bd66ab..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/602/2.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/603.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/603.md" deleted file mode 100644 index 86d6007d..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/603.md" +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: 红眼睛和蓝眼睛 -date: 2020-06-14 ---- - -> 在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,尤其以 FLAG(Facebook, LinkedIn, Amazon, Google)等公司为典型。而这类问题的背后,很多都有博弈论的影子。所以在本系列,我将为大家分享一整套需要掌握的**博弈论**相关知识,希望大家可以喜欢。 -> ->
-> -> PS:本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高自身分析问题的能力。 - -## 01、红眼睛和蓝眼睛 - -| 红眼睛和蓝眼睛 | -| ------------------------------------------------------------ | -| 一个岛上有100个人,其中有5个红眼睛,95个蓝眼睛。这个岛有三个奇怪的宗教规则。 | - -1.他们不能照镜子,不能看自己眼睛的颜色。 - -2.他们不能告诉别人对方的眼睛是什么颜色。 - -3.一旦有人知道了自己是红眼睛,他就必须在当天夜里自杀。 - -
- -某天,有个旅行者到了这个岛上。由于不知道这里的规矩,所以他在和全岛人一起狂欢的时候,不留神就说了一句话:【你们这里有红眼睛的人。】 - -
- -问题:假设这个岛上的人每天都可以看到其他所有人,每个人都可以做出缜密的逻辑推理,请问岛上会发生什么? - -## 02、题目分析 - -题目乍看之下,没有任何逻辑可言!以目测条件,基本无法完成任何正常的推理。但是在仔细推敲之后,我们可以将问题简化,从假设只有1个红眼睛开始分析。 - -
- -我们假设岛上只有1个红眼睛的人,还有99个都是蓝眼睛。因为这个旅行者说了“这里有红眼睛的人”,**那么在第一天的时候,这个红眼睛会发现其他的人都是蓝眼睛**(与此同时,其他人因为看到了这个红眼睛的人,所以都确认了自己的安全)**那么这天晚上,这个红眼睛的人一定会自杀!** - -
- -继续分析,假设这个岛上有2个红眼睛,那么当旅行者说“这里有红眼睛的人”之后的第一天,这两个红眼睛分别发现还有别的红眼睛存在,所以他们当天晚上认为自己是安全的。但是到了第二天,红眼睛惊讶的发现**,另一个红眼睛的人竟然没有自杀(说明岛上有不止一个红眼睛),并且当天他们也没有发现有别的红眼睛存在(说明另一个红眼睛就是自己)**WTF,那肯定另一个红眼睛就是自己了,所以**在第二天夜里,两个红眼睛的人会同时自杀**! - -
- -继续分析,假如岛上红眼睛有3个。那么在第一天,红眼睛发现了岛上还有另外两个红眼睛,红眼睛呵呵一笑,“反正不是我”。到了第二天,红眼睛仍然看到了另外两个红眼睛,红眼睛心想,"这下你两该完蛋了吧",毕竟你两都知道了自己是红眼睛,晚上回去统统自杀吧!(根据上面的推论得出)但是惊奇的是,**到了第三天,红眼睛发现另外两个红眼睛竟然都没有自杀。**(**说明岛上红眼睛的人不止两个**)并且当天红眼睛也没发现新的红眼睛(**说明还有一个红眼睛就是自己**)所以在第三天的夜里,三个红眼睛会同时自杀。 - -
- -根据上面的推论,**假设有N个红眼睛,那么到了第N天,这N个红眼睛就会自杀**。所以最终这个岛上红眼睛的人会统统自杀!这就是答案,生活就是这么朴实无华,且枯燥。 - -## 03、旅客的挽回 - -上面的分析大家应该都看懂了。但若是在旅客说完这句话后,其并没有离开这个岛。同时他也看到了周围人眼里的惊慌和失措,这个时候,旅客为自己的行为感到了懊恼和悔恨!旅客决定对自己的话进行挽回,旅客又该怎么做呢? - -
- -这里我提供一种思路,**旅客可以在第N次集会上杀掉N个红眼睛**,让这N个红眼睛 “GO TO SLEEP”,就可以中断事件的推理。事实上,基于人道主义,旅客并不需要手动杀人,她只需要在第N天的时候告诉这N个人,你们是红眼睛,那么这天晚上,这N个人就会自杀。"All RETURN",一切将回归秩序~ - -
diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/604.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/604.md" deleted file mode 100644 index d694d2ae..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/604.md" +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: 海盗分金币 -date: 2020-06-14 ---- - ->在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,尤其以 FLAG(Facebook, LinkedIn, Amazon, Google)等公司为典型。而这类问题的背后,很多都有博弈论的影子。所以在本系列,我将为大家分享一整套需要掌握的**博弈论**相关知识,希望大家可以喜欢。 -> ->
-> ->PS:本系列将不一定都是算法问题,不是IT行业的小伙伴也可以进行学习,来提高自身分析问题的能力。 - -## 01、海盗分金币问题 - -| 海盗分金币 | -| ------------------------------------------------------------ | -| 在大海上,有5个海盗抢得100枚金币,他们决定每一个人按顺序依次提出自己的分配方案,如果提出的方案没有获得半数或半数以上的人的同意,则这个提出方案的人就被扔到海里喂鲨鱼。那么第一个提出方案的人要怎么做,才能使自己的利益最大化? | - -海盗们有如下特点: - -1.足智多谋,总是采取最优策略。 - -2.贪生怕死,尽量保全自己性命。 - -3.贪得无厌,希望自己得到越多宝石越好 - -4.心狠手辣,在自己利益最大的情况下希望越多人死越好。 - -5.疑心多虑,不信任彼此,尽量确保自身利益不寄希望与别人给自己更大利益。 - -## 02、题目分析 - -首先我们很容易会觉得,抽签到第一个提方案的海盗会很吃亏!因为只要死的人够多,那么平均每个人获取的金币就最多,而第一个提方案的人是最容易死的。但是事实是,在满足海盗特点的基础上,**第一个提方案的海盗是最赚的**,我们一起来分析一下。 - -
- -假如我们设想只有两个海盗。那么不管第一个说什么,只要第二个人不同意,第二个人就可以得到全部的金币!所以**第一个海盗必死无疑**,这个大家都能理解。(当然,这样的前提是一号提出方案后不可以马上自己同意,不然如果自己提出给自己全部金币的方案,然后自己支持,这样就是二号必死无疑) - -假如现在我们加入第三个海盗,这时候原来的一号成为了二号,二号成为了三号。这时候现在的二号心里会清楚,**如果他投死了一号,那么自己必死无疑**!所以根据贪生怕死的原则,二号肯定会让一号存活。而此时一号心理也清楚,无论自己提出什么样的方案,二号都会让自己存活,而这时只要加上自己的一票,就有半数通过,所以一号提出方案:把金币都给我。 - -
- -现在又继续加入了新的海盗!原来的1,2,3号,成为了现在的2,3,4号。这时候新的一号海盗洞悉了奥秘,知道了**如果自己死了,二号就可以获取全部的金币,**所以提出给三号和四号一人一个金币,一起投死2号。而与此同时,现在的3号和4号获取的要比三个人时多(三个人时自己获取不了任何金币),所以他们会同意这个方案! - -
- -现在加入我们的大Boss,最后一个海盗。根据分析,大Boss海盗1号推知出2号的方案后就可以提出(97,0,1,2,0)或者(97,0,1,0,2)的方案。这样的分配方案对现在的3号海盗相比现在的2号的分配方案还多了一枚金币,就会投赞成票,4号或者5号因为得到了2枚金币,相比2号的一枚多,也会支持1号,加上1号自己的赞成票,方案就会通过,即1号提出(97,0,1,2,0)或(97,0,1,0,2)的分配方案,大Boss成功获得了97枚金币。 - -## 03、思考 - -最终,**大Boss一号海盗得到97枚金币,投死了老二和老五**,这竟然是我们分析出的最佳方案!这个答案明显是反直觉的,如果你是老大,你敢这样分金币,必死无疑。可是,推理过程却非常严谨,无懈可击,那么问题出在哪里呢? - -
- -其实,在"海盗分赃"模型中,任何"分配者"想让自己的方案获得通过的关键是,**事先考虑清楚"对手"的分配方案是什么,****并用最小的代价获取最大收益**,**拉拢"对手"分配方案中最不得意的人们**。1号看起来最有可能喂鲨鱼,但他牢牢地把握住先发优势,结果不但消除了死亡威胁,还收益最大。而5号,看起来最安全,没有死亡的威胁,甚至还能坐收渔人之利,却因不得不看别人脸色行事而只能分得一小杯羹。 - -
- -不过,模型任意改变一个假设条件,最终结果都不一样。而现实世界远比模型复杂。**因为假定所有人都理性,本身就是不理性的**。回到“海盗分金”的模型中,只要3号、4号或5号中有一个人偏离了绝对聪明的假设,海盗1号无论怎么分都可能会被扔到海里去了。所以,1号首先要考虑的就是他的海盗兄弟们的聪明和理性究竟靠得住靠不住,否则先分者必定倒霉。 - -
- -如果某人和一号本身不对眼,就想丢他喂鲨鱼。果真如此,1号自以为得意的方案岂不成了自掘坟墓。再就是俗话所说的“人心隔肚皮”。由于信息不对称,谎言和虚假承诺就大有用武之地,而阴谋也会像杂草般疯长,并借机获益。如果2号对3、4、5号大放烟幕弹,宣称对于1号所提出任何分配方案,他一定会再多加上一个金币给他们。这样,结果又当如何? - -
- -通常,现实中人人都有自认的公平标准,因而时常会嘟嚷:“**谁动了我的奶酪?**”可以料想,一旦1号所提方案和其所想的不符,就会有人大闹。当大家都闹起来的时候,1号能拿着97枚金币毫发无损、镇定自若地走出去吗?最大的可能就是,海盗们会要求修改规则,然后重新分配。当然,大家也可以讲清楚下次再得100枚金币时,先由2号海盗来分…然后是3号……颇有点像美国总统选举,轮流主政。说白了,其实是民主形式下的分赃制。 - -
- -最可怕的是其他四人形成一个反1号的大联盟并制定出新规则:四人平分金币,将1号扔进大海。这就颇有点阿Q式的革命理想:高举平均主义的旗帜,将富人扔进死亡深渊。 - -
- -最后,这里也提供一份代码实现,供有兴趣的同学参考(该代码我大概看了一下,但是因为时间的关系,没有跑单测进行验证,特此说明!) - -
- -``` -以上代码输出:5人时分配方案:[97, 0, 1, 0, 2] -``` - -
- -看懂了吗?如果看懂了,这里提出一个问题:假如我们将**人性**考虑在内,同时也进行**理性**的分析,如果你是老大,又该如何提出这个方案呢?大家在留言区留下自己的回答吧! \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605.md" deleted file mode 100644 index dfa01fda..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605.md" +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: 智猪博弈 -date: 2020-07-01 ---- - -> 今天给大家讲解一个博弈论中很有趣的问题,智猪博弈。 - -## 01、智猪博弈 - -> 在博弈论(Game Theory)经济学中,“智猪博弈”是一个著名的纳什均衡的例子。如果不了解什么是纳什均衡,可以先看下下面的文章。 - -[博弈论系列 - 囚徒困境](1.6.博弈论系列/601.md) - -| 题目:智猪博弈 | -| ------------------------------------------------------------ | -| 假设猪圈里有一头大猪、一头小猪。猪圈的一头有猪食槽,另一头安装着控制猪食供应的按钮,按一下按钮会有10个单位的猪食进槽,,但是按按钮以后跑到食槽所需要付出的劳动量,加起来要消耗相当于2个单位的猪食。并且因为按钮和食槽分置笼子的两端,等到按按钮的猪付出劳动跑到食槽的时候,坐享其成的另一头猪早已吃了不少。 | - -
- -如果大猪先到(小猪按),大猪吃掉9个单位,小猪只能吃到1个单位;如果同时到达(也就是一起按),大猪吃掉7个单位,小猪吃到3个单位;如果小猪先到(大猪按),小猪可以吃到4个单位,而大猪吃到6个单位 - -
- -那么,在两头猪都足够聪明的前提下,最终的结果是什么? - -## 02、推导过程 - -> "智猪博弈"由约翰·纳什(JohnFNash),于1950年提出。 - -
- -这个推导过程还是比较简单的。首先小猪如果去按按钮,然后再回来的话,只能吃到一份猪食,直接就嗝屁了,这种可能性肯定是不行的。自然,这时大猪也就只有去按按钮这一个选项了。所以最终的结果会是:**小猪选择等待,大猪去按按钮**。 - -
- -用博弈论中的报酬矩阵,将图画出来,可能更加有助于大家思考: - -PNG - -- 如果小猪和大猪同时行动的话,则它们同时到达食槽,分别得到1个单位和5个单位的纯收益(付出4个单位的成本) -- 如果大猪行动,小猪等待,小猪可得到4个单位的纯收益,大猪得到的6个单位,付出2个单位的成本,实得4个单位; - -- 如果大猪等待,小猪行动,小猪只能吃到1个单位,则小猪的收入将不抵成本,纯收益为-1。 - -- 如果大猪等待,小猪也等待,那么小猪的收益为零,成本也为零,总之,小猪等待还是要优于行动。 - -
- -## 03、题目意义 - -我猜测会有一些朋友,在看到这样一道题目后,会觉得这不是很简单吗,有什么可说的,其实不是这样。这道题目是一个很经典的“**劣势策略”下的可预测问题**,其在各高校经济学课程中也被放在一个举足轻重的地位上。原因无他,正是大猪做出这样一个“决策”,目的不是出于对小猪的爱,**而是基于“自利”的原则**。 - -
- -类比到科技领域,我们都知道研发成本一定高于模仿成本,而各发达国家的研发实力又强于发展中国家,那为什么发达国家还得耗费更大的资源去探索新的技术,难道真的是对外说的为人类为社会吗?其实我认为并不是,这**无关个体天性和民族禀赋**。我想说到这里,估计会有人不同意:说浩哥,你这样太不尊重这些为人类做出贡献的先辈了。注意,我上面说了,你得把这件事放大了看。对于个体而言,我其实是非常非常尊重的,甚至我也愿意成为这样的一个人。但是对于集体利益,或者整个国家而言,请不要过于天真,童话都是骗人的。 - -
- -当年英国政府将流放澳洲的犯人交给往来于澳洲之间的商船来完成,由此经常会发生因商船主或水手虐待犯人,致使大批流放人员因此死在途中(葬身大海)的事件发生。后来大英帝国对运送犯人的办法(制度)稍加改变,流放人员仍然由往来于澳洲的商船来运送,只是运送犯人的费用要等到犯人送到澳洲后才由政府按实到犯人人数支付给商船。仅就这样一点小小的“改变”,几乎再也没有犯人于中途死掉的事情发生。大家不要高估人性,“虐待”的本身,其实就是权利的滋生,而权利是大多数人都想尝尝的滋味。通过支付方式的一点点改变,船主不得不保护犯人,来保障自己的利益,这背后的原因其实正是智猪博弈。 - -
- -作为“大猪”,如果想要获得更大利益,就得“一直跑”。这和看不看得顺眼小猪无关,和小猪卖不卖萌也无关,真实的社会,毕竟不是小猪佩奇。现实是残酷的,如果有一天小猪突然长大了,大猪还会为小猪“奔波”吗?当然不会,看看最近的贸易战,不就是因为“小猪”长大了,所以才出现的吗。但是长大了就是长大了,总不能藏起来吧。 - -
- -等到格局到了这一步,其实博弈的结构也已经发生了变化,看看川普一日三变,我想大家都会有一些体悟。最大宏观战略的彻底转变,绝对不会因为其一方简单闹一闹,怼一怼就结束,也并不是把某个看上去比较疯狂的人换掉就可以改变的,请大家一定要记清楚这点。毕竟,这无关个体天性和民族禀赋。 - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605/1.jpg" deleted file mode 100644 index c96e9940..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/605/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606.md" deleted file mode 100644 index bf8b3094..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606.md" +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: 生男生女的问题 -date: 2020-07-05 ---- - -> 长时间的二分估计大家也看的头晕眼花了,所以今天为大家分享一个非常有趣的概率题目。 - -## 01、生娃的问题 - ->问:国家开放二胎的意义是什么? -> ->答:大号练废了,重新开小号。 -> ->回:滚! - -
- -| 题目:国家为了调控男女比例,制定了一个政策:新婚夫妇都必须生娃(接地气),如果生出的是男娃就不能再生了,如果生出的是女娃就必须继续生下去,直到生出第一个男娃为止(出题人牛P)。 | -| ------------------------------------------------------------ | -| 问题是:若干年后,该国的男女比例会发生怎样的变化? | - -## 02、题目分析 - -> “娃”字最初的意思是成熟美丽的女人。《说文解字》中对于“娃”的解释是“圜深目皃(貌)。或曰,吴楚之闲(间)谓好曰娃。从女,圭声。”“好”的本义也是美貌。在汉代,大约是最初使用“娃”这个字的时候,它的意思是“美女”,是形容成熟的女人。明以后的“娃”字的年龄降得更低。到了今天的俗语中,除了亲昵的小名,“娃”字则更多地用于婴幼儿。在我国一些地区,“娃”就是孩子的方言。 - -
- -其实这个问题答案是比较反直觉的:**没有变化**。原因是因为:**生男生女的概率永远都是百分之50**。不相信的话,你可以尝试去当一下妇产科大夫,若干年后一定可以得出这个结论。 - -PNG - -或者我们也可以换一种思路:我们不妨假设把一大批新婚夫妇关在一个超大的屋子里,逼着他们进行一轮一轮的生孩子游戏。第一轮里,有一半的夫妇生了男娃,退出了游戏;另一半夫妇得到的是女娃,进入第二轮。在第二轮里面,又有一半由于生出男娃而退出,自然,另一半生出女娃的夫妇进入第三轮……注意到,在每一轮里,新生男娃和新生女娃都是一样多的,因此把所有轮数合在一起看,男娃的总数和女娃的总数也一定是相同的。 - -## 03、小知识 - -> 既然科学上生男生女几率是一样的,那为什么很多国家男女比例还失衡呢?以下知识本人未核实,特此说明! - -
- -1、**气候变暖促使染色体活动变强**。孩子的性别是由染色体决定。男的有X和Y,女的只有X。随着全球气候变暖,染色体Y的活动会更加活跃,所以男宝宝出生的概率也随之升高。(我有点好奇,难道说X就不会受到温度影响???) - -
- -2、**身体酸碱度。**酸性体质容易疲惫,让人感觉到累。所以很多养生专家建议让身体处于碱性环境。前面这个,我觉得还是没问题的。但是养生专家同时也说:碱性环境下生孩子的几率会大一点。(这个我就搞不懂了??) - -PNG - -3、先有人后,才做数据统计,其他自己悟。如果悟不出来,可以看看家后面的那口井,只能说细思极恐。(并且我个人认为这是主要原因。。) - -PNG - -4、突然写到这里就不想写了,看到上面结论有点难受。。。就这样吧。。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/1.jpg" deleted file mode 100644 index 7bcb1f99..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/2.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/2.jpg" deleted file mode 100644 index e760e4da..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/2.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/3.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/3.jpg" deleted file mode 100644 index 3303ba0e..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/606/3.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607.md" deleted file mode 100644 index c47a2333..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607.md" +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: 硬币问题 -date: 2020-07-06 ---- - -> 今天继续为大家分享一道有趣的概率类问题(是有小伙伴咨询我的,在面试时会被问到哈~) - -## 01、硬币问题 - -> 小知识:硬币类型的问题经常会被用来考察DP或者贪心。 - -
- -| 题目:A和B两人为了竞价一个拍卖品,决定用抛掷硬币的办法来判断谁有资格。为了让游戏过程更加刺激,A提出了这样一个方案:连续抛掷硬币,直到最近三次硬币抛掷结果是“正反反”或者“反反正”。如果是前者,那么A获胜;如果是后者,那么B获胜 | -| ------------------------------------------------------------ | -| 问题是:B应该接受A的提议吗?换句话说,这个游戏是公平的吗? | - -## 02、题目分析 - -> 遇到这种看上去“貌似”一眼就可以得出答案的题目,一定要认真思考。直觉 != 正确 - -
- -连续投掷三次,能产生八种结果,“正反反”和“反反正”两种可能性各占 1/8,序列也完全对称,获胜概率怎么说都应该是一样的。 - -PNG - -所以对B而言,不应该有任何理由来怀疑该玩法的公平性。但是,答案真的是这样吗?事实,该游戏并不公平。虽然“正反反”和“反反正”在频率上出现的一样,但是其之间却有一个竞争关系:**一旦抛硬币产生其中一种序列,游戏即结束**。所以不论何时,只要抛出一个正面,也就意味着B必输无疑。换句话说,在整个游戏的前两次抛掷中,只要出现“正正”,“正反”,“反正”其中任一,A则一定会取得胜利。A和B的概率比达到3:1,优势不言而喻。 - -PNG - -PNG - -## 03、加强版 - -> 扑克牌有四种花色,分别为:黑桃、红桃、梅花、方块。四个花色分别代表了春夏秋冬,其中红心、方片代表白昼,黑桃、梅花代表黑夜。扑克牌其实是历法的缩影,54张牌中大王代表太阳,小王代表月亮,剩下的52张牌代表一年有五十二个星期。每一个季节为13个星期,所以扑克牌中每种花色为13张;而每一个季节为91天,13张牌点数相加相加刚好是91点,再加上小王的1点,一共为365点代表了365天;加上大王的1点则表示闰年的366天。 - -
- -一副扑克牌不算大小王刚好是52张,随意洗牌。如果出现连续三张牌,花色依次是红黑黑,那么玩家A加一分;同时把翻开了的牌都丢掉,继续一张张翻没翻开的牌;类似地,一 旦出现连续三张牌恰好是黑黑红,则玩家B得一分,弃掉已翻开的牌后继续。结果会如何呢?(大家不妨写一个程序来进行验证) - -PNG - -上面的问题请认真思考(毕竟硬币题目只是简化版本,下面这种才是面试时更容易被问到的),评论区留下你们的想法,写的好的顶你到天花板。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/1.jpg" deleted file mode 100644 index 6085f015..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/2.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/2.jpg" deleted file mode 100644 index 1b16dfd5..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/2.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/3.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/3.jpg" deleted file mode 100644 index 6821c09b..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/3.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/4.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/4.jpg" deleted file mode 100644 index 2ec9446c..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/607/4.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608.md" deleted file mode 100644 index 3bf1debc..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608.md" +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: 画圈圈的问题 -date: 2020-07-06 ---- - -> 这次小浩又出去面试了,面试官说想和我画圈圈(原题为狼厂校招面试题),想起来还有点羞羞的。 - -## 01、题目示例 - -| 面试题:小浩出去面试时,面试官拿出一张纸,在纸上从左到右画了一百个小圆圈(手速快,没办法)接下来,面试官要求两人轮流涂掉其中一个或者两个相邻的小圆圈。 | -| ------------------------------------------------------------ | -| 规定:谁涂掉最后一个小圆圈谁就赢了(换句话说,谁没有涂的了谁就输了)。问题是:小浩应该选取先涂还是后涂?如何才能有必胜策略? | - -## 02、题目分析 - -> 策梅洛定理(英语:Zermelo's theorem)是博弈论的一条定理,以恩斯特·策梅洛命名。策梅洛的论文于1913年以德文发表。表示在二人的有限游戏中,如果双方皆拥有完全的资讯,并且运气因素并不牵涉在游戏中,那先行或后行者当一必有一方有必胜/必不败的策略。 - -
- -作为聪明机智的小浩(没见过这么夸自己的),最后当然是小浩获胜。获胜的方法:**小浩强烈要求先手进行游戏,并且在游戏开始时,先把正中间的两个小圆圈涂黑,于是左右两边各剩下了49个圆圈**。像是下面这样: - -PNG - -然后小浩开始模仿(逼死)面试官,面试官在左边涂掉哪些圆圈,小浩就对称地在右边涂掉哪些圆圈;面试官在右边涂掉哪些圆圈, 小浩就对称地在左边涂掉哪些圆圈。因此,只要面试官有走的,小浩就一定有走的,最终保证能获胜。 - -PNG - -## 03、改编版 - -> 大概的思想还是一致,想办法找到可以使用 “对称大法”的时机,就可以必胜。 - -
- -假若刚开始的时候,100小圆圈成环排列,游戏规则完全相同,此时如何可以让小浩有必胜策略?评论区留下你的想法吧!(为了让大家不对纯粹的算法题产生疲惫,以后采取 算法题 - 逻辑题 穿插的形式来进行讲解) - -## 04、补充说明 - -> 在组合博弈论里,无偏博弈是一类任意局势对于游戏双方都是平等的回合制双人游戏。这里平等的意思是所有可行的走法仅仅依赖于当前的局势,而与现在正要行动的是哪一方无关。换句话说,两个游戏者除了先后手之外毫无区别。 - -
- -有兴趣的可以看一下 掰巧克力 的题目: - - [巧克力问题](1.9.二分法系列/907.md) - -本题,以及之前的掰巧克力题目,其实都属于博弈论中的一类问题,它们有三个共同特征: - -- 游戏信完全透明的,每个人都知道对方可以怎么走,结果会怎么样; -- 下一步可以怎么走与下一步是谁走没有关系,换句话说我能以哪些方式操作哪些棋子,你就能以哪些方式操作哪些棋子(排除了象棋之类的游戏); -- 整个游戏必然会在有限步之内结束,谁先没走的了谁就输了。 - -
- -在博弈论中,这类游戏就叫做“**无偏博弈**”(impartial game)。**在无偏博弈中,如果对于某个棋局状态,谁遇到了它谁就有办法必胜,我们就把它叫做“必胜态”;如果对于某个棋局状态,谁遇到了它对手就会有办法必胜,我们就把它叫做“必败态”**。 - -
- -一般而言,根据题意我们可以立即判断出,那些不能走的状态就是必败态了。从这些必败态出发,我们可以按照下面两条规则,自底向上地推出其他所有状态的性质:有办法走到必败态的状态就是必胜态,只能走到必胜态的状态就是必败态。最终,我们总会得出初始状态的性质:它要么是必胜的,要么是必败的。因而,我们可以证明,在一切无偏博弈中,总有一个玩家有必胜策略。 - -
- -如果后面再给大家分享博弈论的问题,我将会讲解一些“非无偏”类型的题目,供大家学习和参考。 \ No newline at end of file diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608/1.jpg" deleted file mode 100644 index 5652498d..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608/2.gif" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608/2.gif" deleted file mode 100644 index f6f5ad72..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/608/2.gif" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609.md" deleted file mode 100644 index eafc0671..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609.md" +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: 巧克力问题 -date: 2020-07-06 ---- - -> 这次小浩又出去面试,虽然面试官没让他修电暖气,但却给了他一块巧克力。。。(题目由读者在美团面试后提供) - -## 01、题目示例 - -> 巧克力的凹槽是干嘛用的?大量的凹槽设计增加了巧克力的接触面积,可以使巧克力快速的凝固,并且保证凝固均匀。试想一下,如果是把巧克力放入平整的没有凹槽的方形盒子中,是不是凝固后很难取下来呢。 - -
- -| 面试题:小浩出去面试时,面试官掏出一块10×10个小块的巧克力。首先,面试官把巧克力掰成两大块,并且吃掉其中一块,把另一块交给小浩。小浩再把剩下的巧克力掰成两大块,吃掉其中一块,把另一块交回给面试官。两个人就这样无聊且枯燥的掰呀掰。。。 | -| ------------------------------------------------------------ | -| 规定:谁没办法往下继续掰,谁就输了。如果面试官先开始掰的话,面试官和小浩谁有必胜策略?(面试官输了,小浩将赢得面试) | - -## 02、题目分析 - -> 原题由读者 venus 提供,小浩在其基础上改编而成。 - -
- -作为聪明机智的小浩(没见过这么夸自己的),最后当然是小浩获胜。获胜的方法:**只要小浩一直保持巧克力是正方形就可以了**。刚开始,巧克力是10×10的,长这样: - -PNG - -不管面试官咋掰,最后都会掰成一个长宽不相等的正方形。举个栗子,假若面试官把巧克力掰成6×10的: - -PNG - -小浩就再把它掰成6×6的: - -PNG - -不管面试官咋整,小浩都将其变成正方形,直到最后一次将其变成一个1×1的巧克力,此时面试官就输掉了面试。哦不,是小浩赢得了面试。 - -PNG - -## 03、超级改编版 - -> 下面的问题不要陷入固定思维哈~ - -
- -如果巧克力换成边长为10的等边三角形,长这样: - -PNG - -每次只能**沿着线条掰下一个小等边三角形吃掉**,假若还是由面试官开局,请问,谁必胜?评论区留下你的分析过程吧(另外小浩为了感谢广大读者一直以来的支持,后面每周都会送出**百元红包**,得奖率20%,拉到最下面就可以参与了。如果可以的话,要是能帮我再点个**在看**,我将感激涕零~) - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/1.jpg" deleted file mode 100644 index 2976f37d..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/2.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/2.jpg" deleted file mode 100644 index 2307fb9d..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/2.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/3.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/3.jpg" deleted file mode 100644 index 80edc16a..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/3.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/4.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/4.jpg" deleted file mode 100644 index 4b8da494..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/4.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/5.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/5.jpg" deleted file mode 100644 index 20665c16..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/609/5.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610.md" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610.md" deleted file mode 100644 index bc054dfd..00000000 --- "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610.md" +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: 大鱼和小鱼的问题 -date: 2020-07-08 ---- - -> 十年前有一款很出名的游戏叫做“孢子”,不知道大家玩没玩过。玩家最初扮演一个单细胞生物,通过“大鱼吃小鱼,小鱼吃虾米,虾米吃水藻”的规则,逐步进化为宇宙文明生物。换句话说,大鱼之上总是有更大的鱼存在。当然我们这里不是讨论这个游戏,而是思考一个有趣的问题:倘若所有的鱼都是理性的,那会出现怎样的情况呢? - -
- -## 01、题目分析 - -> 总有一条更大的鱼(Always a Bigger Fish)不但是电影情节中的经典桥段,也是各种恶搞的灵感来源——小鱼总是被大鱼吃掉,而大鱼上面始终还有更大的鱼。久而久之,聪明的大鱼或许就不会去吃小鱼了,否则按照传统剧情,它身后会出现一条更大的鱼吃掉自己。让我们完整叙述一下问题: - -
- -| 大鱼小鱼的问题:假设有10条鱼,它们从小到大依次编号为1, 2, …, 10。我们规定,吃鱼必须要严格按顺序执行。也就是说,大鱼只能吃比自己小一级 的鱼,不能越级吃更小的鱼;并且只有等到第k条鱼吃了第 k-1 条鱼后,第 k+1条鱼 才能吃第 k 条鱼。 | -| ------------------------------------------------------------ | -| 同时:第1条鱼则啥都不能吃,只有被吃的份儿。我们假设,如果有小鱼 吃的话,大鱼肯定不会放过;但是,保全性命的优先级显然更高,在吃小鱼之前, 大鱼得先保证自己不会被吃掉才行。假设每条鱼都是无限聪明的(并且它们也都知 道这一点,并且它们也都知道它们知道这一点……),那么第1条鱼能存活下来吗? | - -## 02、题目分析 - -> 这个题目是相当有意思的.... - -
- -首先,我想聪明的大家已经猜到这是一道什么类型的题。对,**博弈论**!因为题中出现了博弈论中的经典条件“**无限聪明**”。现在让我们思考该题: - -
- -我们是有十条鱼,分析起来是比较麻烦的。所以我们从最简单的两条鱼开始分析: - -PNG - -两条鱼的情况下,第二条鱼就是无敌的存在,他不用担心自己被吃掉!如果是三条鱼: - -PNG - -3条鱼的情况下,第2条鱼不能吃第1条鱼,否则将化为只有2条鱼的情形,它将会被第3条鱼吃掉。如果是四条鱼,就有意思了: - -PNG - -此时第2条鱼可以大胆地吃掉第1条鱼,因为根据前面的结论,它知道第3条鱼是不敢吃它的。问题来了,五条鱼会如何: - -PNG - -5条鱼的情况下,第2条鱼是不敢吃第1条鱼的,因为如果它吃了第一条鱼。问题转化为4条鱼的场景,原3号鱼就可以大胆吃掉原2号鱼,因为它知道4号鱼是不敢吃它的,否则5号鱼就会吃掉4号鱼(绕不绕) - -
- -我们发现一个有趣的结论,只要鱼有奇数个,那么第一条鱼将总是可以活下来。如果鱼是偶数个,那么第二条鱼将总是可以吃掉第一条鱼,将状态转化到奇数条鱼的场景。 - -
- -所以该题的答案是:不能,在十条鱼的场景下,第一条鱼必死无疑。 - -## 03、改编版本 - -> 下面这个和上面的题目如出一辙,建议大家自己思考一下。 - -
- -假如你在旅途中遇到一个老头,老头向你推销一个魔壶,魔壶里有一个魔鬼,可以满足你的任何愿望。但是,使用了这个魔壶会让你死后永受炼狱之苦。唯一的解法,就是你把这个魔壶再以一个更低的价格卖给别人。问题是:你会不会买下这个魔壶?以什么价格买下?(假设你足够聪明) - -
- -简单分析一下这个问题:因为我们并不知道用什么价格来买这个魔壶,所以自然是从最小的价格还是尝试,假设我们用最小的货币单位 1 来购买这个魔壶,那么这个魔壶将永远都不能卖给下一个人,所以 1 货币单位 肯定是不行的。那么现在我们使用 2 货币单位来购买这个魔壶,你同样找不到下一个买家。事情开始变得有趣,你开始尝试 3 货币单位 到 N 货币单位,然后你发现:根据类推,你不应该以任何价钱去购买这个瓶子,因为每个都都知道他没办法卖掉这个瓶子。 - -
- -问题来了,为什么会推出这样一个和现实完全背道而驰的“谬论”,这是因为在推理中,我们假设每个人都做出了最优的决策,并且就这一点达成了共识。注意,这里有两个条件: - -
- -- 最优决策 -- 共识 - -
- -最优决策好理解,那这个共识该如何理解呢?最优决策指的是,大家都足够聪明。而共识,指的是大家都知道大家足够聪明。那如果大家并不知道大家都是足够聪明的,这种情况就称之为“不完全信息” - -
- -这里值得强调的一点是,信息不对称 和 不完全信息,这两个的概念是有所不同的。划重点:不完全信息同时是经济学和博弈论中的概念,但是信息不对称大多指经济学中概念。这个大家了解一下即可(其实我个人觉得这种东东理解其本质就ok了,并不需要过于较真)下面的问题,摘自《经济学基础》题库 - -PNG - -理论的东西就是这么枯燥,总之大家拿到这种题目知道怎么分析就ok了。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/1.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/1.jpg" deleted file mode 100644 index 91a54f23..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/1.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/2.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/2.jpg" deleted file mode 100644 index 759ed8f2..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/2.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/3.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/3.jpg" deleted file mode 100644 index 5bb37a62..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/3.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/4.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/4.jpg" deleted file mode 100644 index fed527d5..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/4.jpg" and /dev/null differ diff --git "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/5.jpg" "b/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/5.jpg" deleted file mode 100644 index c717a286..00000000 Binary files "a/website/1.6.\345\215\232\345\274\210\350\256\272\347\263\273\345\210\227/610/5.jpg" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701.md" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701.md" deleted file mode 100644 index a6d9ffa3..00000000 --- "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701.md" +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: 按奇偶排序数组(905) -date: 2020-06-14 ---- - -> 在本系列中,将为大家讲解**排序算法**相关内容。同时,由于网上排序相关的教程太多了,我会尽可能的讲解一些不一样的内容。而不是按照 排序讲解 标准Titile,什么“十大排序算法”,“经典排序算法”,“排序算法必知必会” 之类的一个一个来进行讲解。所以,如果内容引起不适,概不负责... - -## 01、排序的重要性 - -在leetcode中,直接搜索**排序标签**出现的题目有80余道,这是与排序直接相关的题目,不包括其他一些用到排序思想的题目。 - -PNG - -同时,各个公司在面试的过程中,或多或少都直接或间接问到过排序相关的内容(毕竟面试官不知道问什么时,都会用排序算法来救救场。不要问我是怎么知道的...),尤其是 **快排、堆排序、全排列** 等 Topic,在面试中屡试不爽。 - -
- -
百度:堆排序
-PNG - -
滴滴:全排列
-PNG - -综上,得出结论**:为了offer~排序很重要,我们需要进行掌握。** - -## 02、从“插入排序”说起 - -为什么要先讲**插入排序**的原因,是因为我觉得插入排序是最容易理解的一个,而且插入这个词有一定的神秘感(好吧,反正我不觉得冒泡最容易理解,谁没事一天去观察吐泡泡?) - -
- -插入排序:就是炸金花的时候,你**接一个同花顺**的过程。(标准定义:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的) - -PNG - -代码示例: - -```go -func main(){      - arr := []int{5, 4, 3, 2, 1} - insert_sort(arr) -} -func insert_sort(arr []int) {     - for i := 1; i < len(arr); i++ {        - for j := i; j > 0; j-- { -            if arr[j] < arr[j-1] { - arr[j], arr[j-1] = arr[j-1], arr[j] - } - } - fmt.Println(arr) - } -} -``` - -输入: - -PNG - -讲解完了插入排序,我们根据其思想,完成下面这道题目吧 - -## 03、题目分析 - -| 第905题:按奇偶排序数组 | -| ------------------------------------------------------------ | -| 给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。 | - -**示例:** - -``` -输入:[3,1,2,4] -输出:[2,4,3,1] -输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。 -``` - -
- -**提示:** - - 1 <= A.length <= 5000 - 0 <= A[i] <= 5000 - -## 04、题目图解 - -这道题,按照插入排序的思想,很容易可以想到题解。我们只需要遍历数组,当我们**遇到偶数时**,**将其插入到数组前最近的一个为奇数的位置,****与该位置的奇数元素交换**。为了达成该目的,我们引入一个指针 j,来维持这样一个奇数的位置。 - -
- -假设我们的数组为:[3,1,2,4] - -PNG - -根据以上分析,得到代码: - -```go -func sortArrayByParity(A []int) []int { - j := 0 - for i := range A { - if A[i]%2 == 0 { - A[j], A[i] = A[i], A[j] - j++ - } - } - return A -} -``` - -执行结果: - -PNG - diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/1.jpg" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/1.jpg" deleted file mode 100644 index f96263c2..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/1.jpg" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/2.jpg" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/2.jpg" deleted file mode 100644 index 8b24d0d1..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/2.jpg" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/3.jpg" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/3.jpg" deleted file mode 100644 index 1a8d3c33..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/3.jpg" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/4.gif" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/4.gif" deleted file mode 100644 index 082e089d..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/4.gif" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/5.jpg" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/5.jpg" deleted file mode 100644 index e75a51df..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/5.jpg" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/6.jpg" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/6.jpg" deleted file mode 100644 index e4d10a07..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/6.jpg" and /dev/null differ diff --git "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/7.jpg" "b/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/7.jpg" deleted file mode 100644 index 31b72e6a..00000000 Binary files "a/website/1.7.\346\216\222\345\272\217\347\261\273\351\242\230\347\233\256/701/7.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801.md" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801.md" deleted file mode 100644 index 300f015c..00000000 --- "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801.md" +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: 使用位运算求和 -date: 2020-06-19 ---- - -> 今天为大家分享一道本应很简单的题目,但是却因增加了特殊条件,而大幅增加了难度。话不多说,直接看题。 - -## 01、题目示例 - -> 该题很容易出现在各大厂的面试中,属于必须掌握的题型。 - -
- -| 连续n个数的和 | -| ------------------------------------------------------------ | -| 求 1 2 ... n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 | - -**示例 1:** - -``` -输入: n = 3 输出: 6 -``` - -**示例 2:** - -``` -输入: n = 9 输出: 45 -``` - -**限制:** - -``` -1 <= n <= 10000 -``` - -## 02、题目分析 - -> 这道题目出自《贱指offer》,因为比较有趣,就拿来分享给大家。 - -题目上手,因为不能使用公式直接计算(公式中包含乘除法),所以考虑使用递归进行求解,但是**递归中一般又需要使用if来指定返回条件(这里不允许使用if)**,所以没办法使用普通的递归思路。那该怎么办呢?这里我们直接上代码(本题将展示多个语言),再进行分析。 - -```java -//JAVA -class Solution { - public int sumNums(int n) { - boolean b = n > 0 && ((n  = sumNums(n - 1)) > 0); - return n; - } -} -``` - -首先我们了解一下 && 的特性,比如有 A&&B - -- 如果A为true,返回B的布尔值(继续往下执行) -- 如果A为false,直接返回false(相当于短路) - -
- -利用这一特性,我们**将递归的返回条件取非然后作为 && 的第一个条件,递归主体转换为第二个条件语句**。我知道肯定有人又会懵圈了,所以我们绘图说明。假若这里n=3,大概就是下面这样: - -PNG - -这里还有一点要强调的就是,受制于各语言的语法规则,我们需要做一些额外的处理。比如Java,这里如果去掉前面的变量申明,就会直接报错。 - -PNG - -但是如果是C 就没有这样的问题: - -```c -//c   -int sumNums(int n) { - n && (n  = sumNums(n-1)); - return n; -} -``` - -python就是下面这样: - -```python -//py3 -class Solution: - def sumNums(self, n: int) -> int: - return n and n  self.sumNums(n-1) -``` - -Go怎么搞? - -```go -//go -func plus(a *int, b int) bool { - *a  = b - return true -} -func sumNums(n int) int { - _ = n > 0 && plus(&n, sumNums(n - 1))  - return n10} -``` - -什么,还要我给一个PHP的?惹不起..惹不起...大佬请拿走... - -```php -//PHP -class Solution { - function sumNums($n) { - $n > 0 && $n  = $this->sumNums($n - 1); - return $n; - } -} -``` - -## 03、额外福利 - -> 另外,我还看到这样一个解法,感觉很有趣(思想很简单)。因为不是自己写的,所以这里得额外说明,咱不能白嫖,对不?(所以你们这些白嫖的不去给我点个star嘛...) - -```go -//go -func sumNums(n int) int { - return (int(math.Pow(float64(n),float64(2))) n)>>1 -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/1.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/1.jpg" deleted file mode 100644 index 8b38d5e3..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/1.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/2.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/2.jpg" deleted file mode 100644 index 97af01ad..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/2.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/3.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/3.jpg" deleted file mode 100644 index 64eafe01..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/801/3.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802.md" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802.md" deleted file mode 100644 index fdc72829..00000000 --- "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802.md" +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: 2的幂(231) -date: 2020-06-21 ---- - -> 今天给大家分享一道比较简单但是很经典的题目。话不多说,直接看题。 - -## 01、题目示例 - -> 这道题,大家先想一想是用什么思路进行求解? - -
- -| 第231题:2的幂 | -| ----------------------------------------------------- | -| 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 | - -**示例 1:** - -``` -输入: 1 -输出: true -解释: 20 = 1 -``` - -**示例 2:** - -``` -输入: 16 -输出: true -解释: 24 = 16 -``` - -**示例 3:** - -``` -输入: 218 -输出: false -``` - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -## 02、题目分析 - -> 这道题是**通过位运算来进行求解的非常典型的题目。**当然,其他的题解也有很多:比如暴力求解,又或者是不停除以2通过递归的方式求解,等等。但是并不是今天我想说的。 - -
- -先观察一些是2的幂的二进制数: - -PNG - -**可以发现这些数,都是最高位为1,其他位为0**。所以我们把问题转化为“判断一个数的二进制,除了最高位为1,是否还有别的1存在”。然后我们再观察下面这样的一组数,对应着上面的数减去1: - -PNG - -我们对两组数求“&”运算: - -PNG - -可以看到,对于N为2的幂的数,**都有 N&(N-1)=0 ,**所以这就是我们的判断条件。(这个技巧可以记忆下来,在一些别的位运算的题目中也是会用到的) - -
- -根据分析,完成代码: - -```go -//go -func isPowerOfTwo(n int) bool { - return n > 0 && n&(n-1) == 0 -} -``` - -执行结果: - -PNG - -## 03、证明过程 - -> “下里巴人”和“阳春白雪”是古代楚国的歌曲名,屈原的大弟子宋玉曾著有《对楚王问》:“客有歌于郢中者,其始曰下里巴人,国中属而和者数千人……其为阳春白雪,国中属而和者不过数十人。”“下里巴人”和“阳春白雪”一词后来被用来泛指通俗和高雅的文艺作品。 古琴十大名曲之一。 - -
- -“阳春白雪,下里巴人”这个比喻虽然有点牵强,但是却难掩位运算的重要性。位运算在整个算法体系里,不少人可能会觉得有点食之无味、弃之可惜的意思。但其实,完全不是这样!有这种想法的,大多是初学者。对于这点,应该C系的玩家,会深有感触。万丈高楼平地起,暂且不说位运算在底层运算中占据了多大比重,单是整个leetcode列表里,打着位运算标签的题目就超过80余道,我想已经说明了问题。**至少,在面试这块,你必须对位运算了如指掌!**所以,今天的题目算是一个引子,后面我会出一个位运算的专题,希望尽我所能,帮助大家攻克这一类型的问题。 - -PNG - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/1.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/1.jpg" deleted file mode 100644 index d1a4e76c..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/1.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/2.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/2.jpg" deleted file mode 100644 index db36f1f6..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/2.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/3.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/3.jpg" deleted file mode 100644 index eda710a2..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/3.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/4.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/4.jpg" deleted file mode 100644 index badd9c9c..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/4.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/5.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/5.jpg" deleted file mode 100644 index bc50a966..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/802/5.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803.md" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803.md" deleted file mode 100644 index ac466a3e..00000000 --- "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803.md" +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: 返回二进制中1的个数(191) -date: 2020-06-21 ---- - -> 今天继续分享一道和位运算有关的题型,同样在难度上属于简单。我们还是从一道题开始吧 - -## 01、题目示例 - -> 这道题,大家先想一想是用什么思路进行求解? - -
- -| 第191题:位1的个数 | -| ------------------------------------------------------------ | -| 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 | - -**示例 1:** - -``` -输入:00000000000000000000000000001011 -输出:3 -解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。 -``` - -**示例 2:** - -``` -输入:00000000000000000000000010000000 -输出:1 -解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。 -``` - -**示例 3:** - -``` -输入:11111111111111111111111111111101 -输出:31 -解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。 -``` - -**提示:** - -- 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 -- 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。 - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -## 02、题目分析 - -> 这道题仍然是**通过位运算来进行求解的非常典型的题目。**掩码是指使用一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。 - -
- -首先最容易想到的方法是:**我们直接把目标数转化成二进制数,然后遍历每一位看看是不是1,如果是1就记录下来**。通过这种比较暴力的方式,来进行求解。比如Java中,int类型是32位,我们只要能计算出当前是第几位,就可以顺利进行求解。 - -
- -那如何计算当前是第几位呢,我们可以构造一个掩码来进行,说掩码可能大家听着有点懵逼,其实就是弄个1出来,1的二进制是这样: - -PNG - -我们只需要让这个掩码每次向左移动一位,然后与目标值求“&”,就可以判断目标值的当前位是不是1。比如目标值为21,21的二进制是这样: - -PNG - -然后每次移动掩码,来和当前位进行计算: - -PNG - -根据分析,完成代码: - -```java -//java -public class Solution { - public int hammingWeight(int n) { - int result = 0; - //初始化掩码为1 - int mask = 1; - for (int i = 0; i < 32; i++) { - if ((n & mask) != 0) { - result++; - } - mask = mask << 1; - } - return result; - } -} -``` - -执行结果: - -PNG - -注意:这里判断 n&mask 的时候,千万不要错写成 (n&mask) == 1,因为这里你对比的是十进制数。(恰好这个题我之前面试别人的时候问到过,对方就直接这么写了...) - -## 03、继续优化 - -> 位运算小技巧: 对于任意一个数,将 n 和 n-1 进行 & 运算,我们都可以把 n 中最低位的 1 变成 0 - -
- -大家是否还记得昨天学会的技巧,昨天的题目我们通过计算 n & n-1 的值,来判断是否是 2 的幂。今天我们继续使用这个技巧,观察一下,**对于任意一个数,将 n 和 n-1 进行 & 运算,我们都可以把 n 中最低位的 1 变成 0**。比如下面这两对数: - -PNG - -那下面就简单了,只需要不断进行这个操作就可以了。(翻CPP牌子,有没有好评的?) - -```c -//c -class Solution { -public: - int hammingWeight(uint32_t n) { - int count = 0; - while(n > 0) - { - n &= (n - 1); - ++count; - } - return count; - } -}; -``` - -肯定有人又是看的一脸懵逼,我们拿 11 举个例子:(注意最后一位1变成0的过程) - -PNG - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/1.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/1.jpg" deleted file mode 100644 index 709cf433..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/1.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/2.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/2.jpg" deleted file mode 100644 index 303d0783..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/2.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/3.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/3.jpg" deleted file mode 100644 index 83e50ac6..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/3.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/4.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/4.jpg" deleted file mode 100644 index da7efea2..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/4.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/5.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/5.jpg" deleted file mode 100644 index bbacc2a0..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/5.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/6.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/6.jpg" deleted file mode 100644 index 49e1cc0f..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/803/6.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804.md" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804.md" deleted file mode 100644 index 21b2ec9e..00000000 --- "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804.md" +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: 只出现一次的数字(136) -date: 2020-06-23 ---- - -> 今天仍然分享一道关于位运算颇为简单的题型,同时,从明天开始将会提高难度,大家做好准备。 - -## 01、题目示例 - -> 这道题,大家先想一想是用什么思路进行求解? - -
- -| 第136题:只出现一次的数字 | -| ------------------------------------------------------------ | -| 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 | - -**说明:** - -你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? - -
- -**示例 1:** - -``` -输入: [2,2,1] -输出: 1 -``` - -**示例 2:** - -``` -输入: [4,1,2,1,2] -输出: 4 -``` - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -## 02、题目分析 - -> 位运算的题目我们已经讲了好几道了,这道也不例外,也是其中一个非常典型的例子!属于必须掌握的题型。 - -
- -直接分析,**我们要找只出现一次的数字,并且已知了其他的数字都只出现了两次。**那么这种一听其实就应该想到需使用**位运算**来进行求解。最好的,就是在读完题目的瞬间,直接条件反射!(当然,如果你现在第一反应是想到 通过遍历统计,或者其他如使用hashmap 等方式来进行求解,那我觉得你的位运算这块,是有必要加强练习力度的。如果你第一反应,连思路都没有,那我觉得对于整个算法的能力这块,都是比较欠缺的,需要下苦功!) - -
- -回到题目,如何使用位运算进行求解呢?对于任意两个数a和b,我们对其使用 “**异或**”操作,应该有以下性质: - -- 任意一个数和0异或仍然为自己: - -
a⊕0 = a
- -- 任意一个数和自己异或是0: - -
a⊕a=0
- -- 异或操作满足交换律和结合律: - -
a⊕b⊕a=(a⊕a)⊕b=0⊕b=b
- -可能有人直接都不知道异或是什么,所以还是举个例子,比如5异或3,也就是5⊕3,也就是5^3,是下面这样: - -PNG - -根据分析,得出代码:(c 版本) - -```c -//CPP -class Solution { -public: - int singleNumber(vector& nums) { - int ans = 0; - for (int num : nums) { - ans ^= num; - } - return ans; - } -}; -``` - -(java版本) - -```java -//JAVA -class Solution { - public int singleNumber(int[] nums) { - int ans = nums[0]; - for (int i = 1; i < nums.length; i++) { - ans = ans ^ nums[i]; - } - return ans; - } -} -``` - -(python版本) - -```python -//py -class Solution: - def singleNumber(self, nums: List[int]) -> int: - res = 0 - for i in range(len(nums)): - res ^= nums[i] - return res -``` - -执行结果: - -PNG - -## 03、题目进阶 - -> 如果修改上面的题目,除了某个元素只出现一次,其余元素都出现了3次以上,那么该如何求解? - -
- -修改一个条件之后,本题的难度大幅度提升!“异或”的方式看起来似乎没办法运用在“其余数出现3次以上”的条件中。那对于这种问题又该如何求解?我这里给出几种思路,大家下去分析一下,明天我会公布这道衍化题型的解决方案: - -
- -- 思路1:使用hashmap,统计每个数字出现的次数,最后返回次数为1的数字。。。然后等待一段时间,接到很遗憾的通知。 - -- 思路2:上面的题目,对于相同的两个数,进行异或运算,我们可以进行“抵消”,那是否可以找到一种方式,来让相同的三个数进行相互抵消呢? - -- 思路3:是不是可以通过数学的方式来进行计算? - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804/1.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804/1.jpg" deleted file mode 100644 index 68f3269f..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804/1.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804/2.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804/2.jpg" deleted file mode 100644 index d8a11e04..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/804/2.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805.md" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805.md" deleted file mode 100644 index 05af0d24..00000000 --- "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805.md" +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: 只出现一次的数字Ⅱ(137) -date: 2020-06-23 ---- - -> 昨天我们在“除了某个元素只出现一次以外,其余每个元素均出现二次”的条件下,通过使用“异或”的操作,找到了只出现一次的元素。那对于其余每个元素均出现三次的case,我们应该如何解决呢?一起来看下吧。 - -
- -看之前强烈建议复习昨天的文章: - -
- - [只出现一次的数字(136)](learning/1.8/804.md) - -## 01、题目示例 - -> 这种通过改变题中条件,进而增加难度的方式,其实是出题者惯用的一种手段! - -
- -| 第137题:只出现一次的数字Ⅱ | -| ------------------------------------------------------------ | -| 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗? | - -**说明:** - -你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? - -
- -**示例 1:** - -``` -输入: [2,2,3,2] -输出: 3 -``` - -**示例 2:** - -``` -输入: [0,1,0,1,0,1,99] -输出: 99 -``` - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -## 02、HashMap求解 - -> 很简单就能想到,说白了就是**统计每个元素出现的次数,最终再返回次数为1的元素**。但是使用了额外空间。 - -
- -直接上代码:(go版本) - -```go -func singleNumber(nums []int) int { - m := make(map[int]int) - for _, k := range nums { - //如果是其他语言,请注意对应的判空操作!     - m[k]   - } - for k, v := range m { - if v == 1 { - return k - } - } - return 0 -} -``` - -执行结果: - -PNG - -## 03、数学方式 - -> 这个题目曾经在Google很火~目前国内应该也有很多厂子会问到。 - -
- -原理:[A,A,A,B,B,B,C,C,C] 和 [A,A,A,B,B,B,C],差了两个C。即: - -3×(*a* *b* *c*)−(*a* *a* *a* *b* *b* *b* *c*)=2*c* - -也就是说,如果把**原数组去重、再乘以3得到的值,刚好就是要找的元素的2倍**。举个例子: - -PNG - -利用这个性质,进行求解:(python代码如下,这里要注意的是,使用int可能会因为超出界限报错) - -```python -class Solution: - def singleNumber(self, nums: List[int]) -> int: - return int((sum(set(nums)) * 3 - sum(nums)) / 2) -``` - -执行结果: - -PNG - -## 04、位运算 - -> 对于“每个其余元素,均出现了二次”之所以可以使用“**异或**”进行求解,原因是因为“异或”操作可以让两数相同归 0。那对于其余元素出现三次的,是不是只要可以让其三者相同归 0,就能达到我们的目的呢? - -
- -这个思想可能比较简单,但是要让大家理解,还是有一定难度。如果大家准备好了,可以开始往下看。我看过leetcode上的题解,很多都是直接扔出来一个公式,其实讲的我认为并不是特别的清楚。所以我打算先把本题退化到“每个其余元素,均出现二次”的case来进行分析一下。 - -
- -假如我们有 [21,21,26] 三个数,是下面这样: - -PNG - -回想一下,之所以能用“**异或**”,其实我们是完成了一个 **同一位上有2个1清零** 的过程。上面的图看起来可能容易,如果是这样 (下图应为26^21): - -PNG - -那对于“每个其余元素,均出现了三次”也是一样,如果我们可以完成 **一个同一位上的三个1清零的过程,**也就是 a ?a ?a = 0,问题则迎刃冰解。那因为各语言中都没有这样一个现成的方法可以使用,所以我们需要构造一个。(想象一下,位运算也是造出来的对不对?) - -PNG - -如何构造,这里先说第一种方法(注意,到这里我们的问题已经转化成了定义一种 a ? a ? a = 0 的运算),观察一下“异或”运算: - -
1^1=0
-
1^0=1
-
0^1=1
-是不是可以理解为,其实就是二进制的加法,然后砍掉进位呢? - -PNG - -**砍掉进位的过程,是不是又可以理解为对 2 进行取模**,也就是取余。到了这里,问题已经非常非常明确了。那我们要完成一个 a ? a ? a = 0 的运算,是不是其实就是让其二进制的每一位数都相加,最后再对 3 进行一个取模的过程呢?(一样,如果要定义一个 a ? a ? a ? a = 0 的运算,那就最后对 4 进行取模就可以了) - -```go -//go -func singleNumber(nums []int) int { - number, res := 0, 0 - for i := 0; i < 64; i++ { - //初始化每一位1的个数为0 - number = 0 - for _, k := range nums { - //通过右移i位的方式,计算每一位1的个数 - number + = (k >> i) & 1 - } - //最终将抵消后剩余的1放到对应的位数上 - res |= (number) % 3 << i - } - return res -} -``` - -如果对上面的代码不能理解,可以看看这个图,假设只有一个数 [21],我们通过不断右移的方式,获取其每一位上的1。当然,这里因为余数都是1,所以肯定都保留了下来,然后与 1 进行 “与”运算,最终再将其放入到对应的位数上。 - -PNG - -执行结果: - -PNG - -在上面的代码中,**我们通过一个number,来记录每一位数出现的次数**。但是缺点是,我们记录了64位(Go语言中,int为32位以上) - -PNG - -那如果我们可以同时对所有位进行计数,是不是就可以简化过程。因为我们的目的是把每一位与3取模进行运算,是不是就可以理解为其实是一个**三进制**。如果大家听不懂三进制的话,可以简单理解为3次一循环,也就是 00 - 01 - 10 - 11。但是又因为对于 11 这种情况,我们需要砍掉(上面已经说过了,相当于 11 - 00 的转化),所以我们就只有3个状态,00 - 01 - 10,所以我们采用 a 和 b 来记录状态。其中的状态转移过程如下: - -PNG - -这里 a‘ 和 b’ 的意思代表着 a 和 b 下一次的状态。next 代表着下一个 bit 位对应的值。然后这是什么,不就是状态机嘛。。。我们通过 a 和 b 的状态变化,来完成次数统计。 - -
- -然后因为此图复杂,将其分别简化成 a 和 b 的卡诺图(卡诺图是逻辑函数的一种图形表示。两逻辑相邻项,合并为一项,保留相同变量,消去不同变量。先 b’ 后 a‘ ) - -| next\a,b | 00 | 01 | 11 | 10 | -| --------- | ---- | ---- | ---- | ---- | -| 1 | 1 | 0 | X | 0 | -| 0 | 0 | 1 | X | 0 | - -| next\a,b | 00 | 01 | 11 | 10 | -| --------- | ---- | ---- | ---- | ---- | -| 1 | 0 | 1 | X | 0 | -| 0 | 0 | 0 | X | 1 | - -然后我们根据卡诺图(这个卡诺图其实并不难看。。如果学习一下话,还是挺简单的。)写出关系式: - -
a` = (a &~ next) | (b & next)
-
b` = (~a & ~b & next) | (b & ~next)
-然后就是套公式:(Java代码,注意Go语言中是不天然支持 ~ 这种运算的) - -```go -class Solution { - public int singleNumber(int[] nums) { - int a = 0, b = 0, tmp = 0; - for (int next : nums) { - tmp = (a & ~next) | (b & next); - b = (~a & ~b & next) | (b & ~next); - a = tmp; - } - return b; - } -} -``` - -当然,其实题解还可以再进一步优化,其实就是化简上一步中的公式: - -```go -class Solution { - public int singleNumber(int[] nums) { - int a = 0, b = 0; - for (int next : nums) { - b = (b ^ next) & ~a; - a = (a ^ next) & ~b; 7        } - return b; - } -} -``` - -当然,这个解法就相当牛皮了,反正我第一次做肯定是想不到的。。。我看了一下,第一个给出这个解法的人,应该是一位国外的工程师(某扣上面有很多人其实都是把题解翻译过来的,当然我有时也会哈哈哈哈,我觉得这某种意义上讲也是一个好的现象,挺好)不过毕竟非原创,还是得说明一下! - -PNG - -
- -总之,今天的题目,有一定的难度!希望大家动脑动手动脚, 认真想想。 - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/1.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/1.jpg" deleted file mode 100644 index 2bcdaef7..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/1.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/10.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/10.jpg" deleted file mode 100644 index 5f411cec..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/10.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/11.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/11.jpg" deleted file mode 100644 index 099c315a..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/11.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/12.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/12.jpg" deleted file mode 100644 index 986f122c..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/12.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/2.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/2.jpg" deleted file mode 100644 index 6b2f5bd7..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/2.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/3.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/3.jpg" deleted file mode 100644 index 6c079280..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/3.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/4.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/4.jpg" deleted file mode 100644 index 262463a1..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/4.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/5.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/5.jpg" deleted file mode 100644 index 1889875a..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/5.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/6.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/6.jpg" deleted file mode 100644 index 67dc89aa..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/6.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/7.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/7.jpg" deleted file mode 100644 index d55c7251..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/7.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/8.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/8.jpg" deleted file mode 100644 index 17dcc0fa..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/8.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/9.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/9.jpg" deleted file mode 100644 index 99e34e7d..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/805/9.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806.md" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806.md" deleted file mode 100644 index edceaf62..00000000 --- "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806.md" +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: 缺失数字(268) -date: 2020-06-24 ---- - -> 上一篇题目的难度可能对很多同学引起了不适,今天将回归一道比较简单的题目,大概耗时2-3分钟即可学习! - -
- -有兴趣回顾上一篇题目的: - -
- - [只出现一次的数字Ⅱ(137)](learning/1.8/805.md) - -## 01、题目示例 - -> 本题比较简单哈~尽可能多的给出解法吧! - -| 第268题:缺失数字 | -| ------------------------------------------------------------ | -| 给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。 | - -
- -**示例 1:** - -``` -输入: [3,0,1] -输出: 2 -``` - -**示例 2:** - -``` -输入: [9,6,4,2,3,5,7,0,1] -输出: 8 -``` - -**说明:** - -
- -你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现? - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -## 02、题目分析 - -> 说高斯公式,估计大家听着懵逼,其实就是那个 1 2 3 ... n = (1 n) * n / 2,即: -> -> PNG - -
- -首先求出数组的和,然后再利用公式求出前n 1项之和,最终求差值,即为缺失的值!比如下面长度为4的数组,缺失4。 - -PNG - -- 2 + 3 + 1 + 5 = 11 -- (1 5) * 5 / 2=15 -- 15 - 11 = 4 - -
- -根据分析完成题解:(翻一个CPP牌子吧) - -```c -//CPP -class Solution { - public: - int missingNumber(vector& nums) { - int length=nums.size(); - int result=(length + 1)*length/2; - for(int e:nums) - result-=e; - return result; - } -}; -``` - -时间复杂度O(N),空间复杂度O(1) - -
- -执行结果: - -PNG - -## 03、位运算求解 - -> 位运算的方式,本质和数学法一样,都是通过与无序序列抵消,然后找到缺失值。所以不能说哪个更好,都掌握最好~ - -
- -直接使用“异或”进行求解。这个其实讲了好多次了,就是利用“**两个相同的数,使用异或可以相消除**”的原理。 - -
- -先给一个Go语言的示例: - -```go -//Go -func missingNumber(nums []int) int { - result := 0 - for i,k := range nums { - result ^= k ^ i - } - return result ^ len(nums) -} -``` - -再给一个Java的版本: - -```java -//java -class Solution { - public int missingNumber(int[] nums) { - int res = 0; - for(int i = 0; i < nums.length; i++ ) - res ^= nums[i] ^ i; - return res ^ nums.length; - } -} -``` - -为了照顾各语言大爷们的情绪,我还是会尽可能的多给出几种语言示例,但是,请记住:**算法思想才是最重要的。** - -
- -最后再补一个python的吧,毕竟这种语言,对于这种短短的题目,往往都可以弄出来一行代码求解的骚操作.... - -```python -#python -class Solution: - def missingNumber(self, nums: List[int]) -> int: - return sum(range(len(nums) + 1)) - sum(nums) -``` - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/1.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/1.jpg" deleted file mode 100644 index 5e82f363..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/1.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/2.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/2.jpg" deleted file mode 100644 index 5d2b0b9e..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/2.jpg" and /dev/null differ diff --git "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/3.jpg" "b/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/3.jpg" deleted file mode 100644 index f9c14447..00000000 Binary files "a/website/1.8.\344\275\215\350\277\220\347\256\227\347\263\273\345\210\227/806/3.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901.md" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901.md" deleted file mode 100644 index b327145a..00000000 --- "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901.md" +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: 爱吃香蕉的珂珂(875) -date: 2020-06-30 ---- - -## 01、题目示例 - -> 不知道为什么叫做爱吃香蕉的阿珂,难道不应该是爱吃香蕉的猴子么...或者爱吃队友的露娜么? - -| 第875题:阿珂喜欢吃香蕉 | -| ------------------------------------------------------------ | -| 这里总共有 N 堆香蕉,第 i 堆中有piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 阿珂可以决定她吃香蕉的速度 K (单位:根/小时),每个小时,她将会选择一堆香蕉,从中吃掉 K 根。 | - -如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 - -
- -珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。 - -
- -**示例 1:** - -``` -输入: piles = [3,6,7,11], H = 8 -输出: 4 -``` - -**示例 2:** - -``` -输入: piles = [30,11,23,4,20], H = 5 -输出: 30 -``` - -**示例 3:** - -``` -输入: piles = [30,11,23,4,20], H = 6 -输出: 23 -``` - -**提示:** - - 1 <= piles.length <= 10^4 - piles.length <= H <= 10^9 - 1 <= piles[i] <= 10^9 - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -
- -## 02、二分查找 - -> 十个二分九个错,该算法被形容 "思路很简单,细节是魔鬼"。第一个二分查找算法于 1946 年出现,然而第一个完全正确的二分查找算法实现直到 1962 年才出现。下面的二分查找,其实是二分查找里最简单的一个模板,在后面的文章系列里,我将逐步为大家讲解二分查找的其他变形形式。 - -
- -二分查找是计算机科学中最基本、最有用的算法之一。它描述了**在有序集合中搜索特定值的过程**。一般二分查找由以下几个术语构成: - -- 目标 Target —— 你要查找的值 - -- 索引 Index —— 你要查找的当前位置 - -- 左、右指示符 Left,Right —— 我们用来维持查找空间的指标 - -- 中间指示符 Mid —— 我们用来应用条件来确定我们应该向左查找还是向右查找的索引 - -
- -在最简单的形式中,二分查找对具有指定左索引和右索引的**连续序列**进行操作。我们也称之为**查找空间**。二分查找维护查找空间的左、右和中间指示符,并比较查找目标;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。 - -PNG - -举例说明:比如你需要找1-100中的一个数字,你的目标是**用最少的次数**猜到这个数字。你每次猜测后,我会说大了或者小了。而你只需要每次猜测中间的数字,就可以将余下的数字排除一半。 - -PNG - -不管我心里想的数字如何,你在7次之内都能猜到,这就是一个典型的二分查找。每次筛选掉一半数据,所以我们也称之为 **折半查找**。一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步。 - -PNG - -当然,一般题目不太可能给你一个如此现成的题型,让你上手就可以使用二分,所以我们需要思考,如何来构造一个成功的二分查找。大部分的二分查找,基本都由以下三步组成: - -- 预处理过程(大部分场景就是对未排序的集合进行排序) - -- 二分查找过程(找到合适的循环条件,每一次将查找空间一分为二) - -- 后处理过程(在剩余的空间中,找到合适的目标值) - -
- -了解了二分查找的过程,我们对二分查找进行**一般实现**(这里给出一个Java版本,比较正派的代码,没有用一些缩写形式) - -```java -//JAVA -public int binarySearch(int[] array, int des) { - int low = 0, high = array.length - 1; - while (low <= high) { - int mid = low + (high - low) / 2; - if (des == array[mid]) { - return mid; - } else if (des < array[mid]) { - high = mid - 1; - } else { - low = mid + 1; - } - } - return -1; -} -``` - -注意:上面的代码,mid 使用 low + (high - low)/2 的目的,是防止 high low 溢出内存。 - -
- -为什么说是一般实现? - -
- -1、**根据边界的不同(开闭区间调整),有时需要弹性调整low与high的值,以及循环的终止条件**。 - -
- -2、根据元素是否有重复值,以及是否需要找到重复值区间,有时需要对原算法进行改进。 - -
- -那上面我们说了,一般二分查找的过程分为:预处理 - 二分查找 - 后处理,上面的代码,就没有后处理的过程,因为在每一步中,你都检查了元素,如果到达末尾,也已经知道没有找到元素。 - -
- -总结一下一般实现的几个条件: - -
- -- **初始条件:left = 0, right = length-1** -- **终止:left > right** -- **向左查找:right = mid-1** -- **向右查找:left = mid +1** - -
- -请大家记住这个模板原形,在后面的系列中,我们将介绍二分查找其他的模板类型。 - -## 03、题目分析 - -> 简单复习了二分查找,我们来看本题。 - -
- -注意,绝大部分**「在递增递减区间中搜索目标值」** 的问题,都可以转化为二分查找问题。并且,二分查找的题目,基本逃不出三种:找特定值,找大于特定值的元素(上界),找小于特定值的元素(下界)。 - -
- -而根据这三种,代码又最终会转化为以下这些问题: - -
- -- low、high 要初始化为 0、n-1 还是 0、n 又或者 1,n? - -- 循环的判定条件是 low < high 还是 low <= high? - -- if 的判定条件应该怎么写? - -- if 条件正确时,应该移动哪边的边界? - -- 更新 low 和 high 时,mid 如何处理? - -
- -处理好了上面的问题,自然就可以顺利解决问题。将上面的思想代入到本题,我们要找 “**阿珂在 H 小时吃掉所有香蕉的最小速度 K**”。那最笨的就是阿珂吃的特别慢,每小时只吃掉 1 根香蕉,然后我们逐渐递增阿珂吃香蕉的速度到 i,刚好满足在 H 小时可以吃掉所有香蕉,此时 i 就是我们要找的最小速度。当然,我们没有这么笨,所以可以想到使用二分的思想来进行优化。 - -
- -然后就简单了,我们寻找二分查找模板中初始条件和终止条件(注意,这里的 high、low、mid 都代表的是速度): - -```java -//这里我把最小速度定义成了1,可能大家会觉得奇怪,模板里不是0吗? -//所以这里我其实是想说,算法千变万化,大家不要生搬硬套。 -//从字面理解,如果定义成0,意味着阿珂会选择一个香蕉都不吃,难道阿珂傻? - var low = 1 - //最大的速度,当然等于吃掉最大一堆的香蕉,毕竟一小时只能吃一堆,再大也没有意义 - var high = maxArr(piles) - //中间速度 - var mid = (low + high) / 2 -``` - -
- -```java -//JAVA -public class Solution { - public int minEatingSpeed(int[] piles, int H) { - int maxVal = 1; - for (int pile : piles) { - maxVal = Math.max(maxVal, pile); - } - int left = 1; - int right = maxVal; - while (left < right) { - int mid = (left + right) >> 1; - if (canEat(piles, mid, H)) { - left = mid + 1; - } else { - right = mid; - } - } - return left; - } - - private boolean canEat(int[] piles, int speed, int H) { - int sum = 0; - for (int pile : piles) { - //向上取整 - sum += Math.ceil(pile * 1.0 / speed); - } - return sum > H; - } -} -``` - -执行结果: - -PNG - -
- -额外补充(昨天有人问我的问题): - -
- -- 第一:**就是不需要再对原数组进行排序了**,因为我们是把这样一个问题转化为二分查找的问题,而通过 canEat,计算在 mid 速度下吃完 piles 共需要多少小时。已经将 piles 利用进去了,所以此时并不需要对 piles 排序。 -- 第二:就是昨天有人私下问我,对 (pile speed - 1)/speed 不能理解。这个其实就是向上取整的一个小技巧,相当于 Math.ceil(pile * 1.0 / speed)。 - -
- -留下一个问题,假如我们的阿珂就是笨笨的,将 low 初始化成了 0,此时的循环条件应该如何写?if 条件如果成立,low 和 high 又该如何进行调整?大家可以尝试一下!(一百个人有一百个二分,不要妄图和别人写出一模一样的代码,这是没有意义的。只有自己理解了,一步步的分析问题,写出自己的代码,才是真正属于你的) - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/1.gif" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/1.gif" deleted file mode 100644 index ce23f4f6..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/1.gif" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/2.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/2.jpg" deleted file mode 100644 index 79af8c0d..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/2.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/3.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/3.jpg" deleted file mode 100644 index 6c81cd96..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/3.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/4.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/4.jpg" deleted file mode 100644 index 66bcf5e0..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/901/4.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902.md" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902.md" deleted file mode 100644 index dee2c05e..00000000 --- "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902.md" +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: x的平方根(69) -date: 2020-06-30 ---- - -> 今天继续为大家分享二分法系列篇的内容,看一道比较简单的题目。 - -## 01、题目分析 - -> 这道题目是比较简单,但我认为同时也是非常经典,建议大家掌握! - -| 第69题:x的平方根 | -| ------------------------------------------------------------ | -| 计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 | - -
- -**PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。** - -
- -## 02、二分查找 - -> 使用二分法来完成平方根还是比较容易被想到的,在有限的“区间”中,每次通过筛选一半的元素,到最终只剩下一个数(收敛),这个数就是题目要求的取整的平方根整数。 - -
- -根据之前说过的二分法模板,要使用二分法,我们当然要找到Left,Right,Mid,那在这里,Mid 自然被作为最终我们要找的平方根的值(不像上一道题,Mid是作为速度,不太容易被想到),而 Left 和 Right,我们采用 1 和 x/2。 - -
- -Left 设置为 1 比较容易理解,因为我们可以直接处理掉 x 为 0 的情况(当然,也可以把 Left 初始化为 2,然后我们额外处理 0 和 1 的情况,我之前说过,二分法一万个人有一万种写法,只要能解释清楚,那就是你自己的)。但是为什么 Right 是 x/2 呢? - -
- -我们看一下下面这些数的值: - -PNG - -很容易观察出,当 x>2 时,它的**整数平方根**一定小于等于 x/2 。即有 0 < 整数平方根 <= x/2。所以我们的问题转化为在 [0,x/2] 中找一个**特定值**,满足二分查找的条件。(当然,如果没有想到使用 x/2 作为 Right 而 直接使用 x ,其实也是可以的) - -
- -剩下的逻辑就很简单了,我们不停缩小mid的范围,如果最终平方大于x就放回它前面一个值,否则就正常返回,直到两边的边界完全收敛。 - -```java -public class Solution { - public int mySqrt(int x) { - if (x == 0) return 0; - long left = 1; - long right = x / 2; - while (left < right) { - //注意这一行代码 - long mid = (right + left) / 2 + 1; - if (mid > x / mid) { - right = mid - 1; - } else { - left = mid; - } - } - return (int) left; - } -} -``` - -上面的代码,有三处需要进行讲解: - -
- -- 第一,就是这里将 left 和 right 都设置为了 long,这是因为担心超出界限。同时,也正是因为设置为了 long,所以后面我可以直接使用 right left,而不用担心报错。 - -- 第二,还是这行代码,大家肯定会疑惑,为什么我要在 (right left)/ 2 后面再加1。这其实是一种技巧,一般人我不告诉他。因为在面试的时候,我们往往需要快速写出freebug 的代码,但是如果遇到二分的题目,你很可能会不停的纠结 mid 到底如何设置,是左边界还是右边界。其实,面试官大多时候,并不需要你写出一个非常非常标准的二分,找到绝对的中值。那这里我们是不是就可以偷懒了?我们通过略微增大搜索空间,来降低自己代码的难度,并且因为代码完美的通过,别人还会觉得你牛逼。 - -- 第三,这点本来不需要额外说明的,正是在第二的基础上,我们通过不停的缩小搜索空间,最终 left 就变成我们要找的 mid 值,所以直接返回 left 就可以了。(因为昨天的题目有人问我,问为什么最后是返回 left,而不是 mid)其实这也勉强算是一种技巧,一般熟悉二分的人,都不会多余的去写一个mid,而是通过这种返回边界的方式,来找到目标值。这有2个好处,第一是可以让代码更加简洁,第二是不容易出错。 - -
- -这里,我给出上面代码的三种 mid 衍化形式,大家琢磨琢磨: - -```java -public class Solution { - public int mySqrt(int x) { - if (x == 0) return 0; - long left = 1; - long right = x / 2; - while (left < right) { - #1 long mid = (right + left) / 2 + 1; - #2 long mid = left + (right - left + 1) / 2; - #3 long mid = (left + right + 1) >> 1 - if (mid > x / mid) { - right = mid - 1; - } else { - left = mid; - } - } - return (int) left; - } -} -``` - -同时,我也再给出一个没想到将 Right 设置为 x/2 的解法,这个解法是非常正派的,特别的适合新手。 - -```java -//java -public class Solution { - - public int mySqrt(int x) { - int left = 0; - int right = x; - while (left <= right) { - long mid = (left + right) / 2; - if (mid * mid == x) - return (int) mid; - else if (mid * mid < x) - left = (int) (mid + 1); - else - right = (int) (mid - 1); - } - return right; - } - -} -``` - -读算法文章的目的,是跟着对方的思路走,而不是说这个我会了,就不需要学习了,这样恐怕进步很难。本题自然可以通过 **牛顿法,递归** 等多种方式求解,但并不是我想说的。 - -
- -## 03、一点建议 - -> 我拉出来讲这道题的原因,绝对不是说你会了,知道怎么样做了就可以了。我是希望通过本题,各位去深度思考二分法中几个元素的建立过程,比如 **Left 和 Right 我们应该如何去设置**,如本题中 Right 既可以设置为 x 也可以设置为 x/2;又比如 **mid 值该如何计算**。大家一定要明确 mid 的真正含义有两层,第一:大部分题目最后的 mid 值就是我们要找的目标值 第二:我们通过 mid 值来收敛搜索空间。 - -
- -那么问题来了,如何可以彻底掌握二分法?初期我并不建议大家直接去套模板,这样意义不是很大,因为套模板很容易边界值出现错误(当然,也可能我的理解还不够深入,网上有很多建议是去直接套模板的)我的建议是:**去思考二分法的本质,了解其通过收敛来找到目标的内涵****,对每一个二分的题目都进行深度剖析,多分析别人的答案**。你得知道,**每一个答案,背后都是对方的思考过程**。从这些过程中抽茧剥丝,最终留下的,才是二分的精髓。也只有到这一刻,我认为才可以真正的说一句掌握了二分。毕竟模板的目的,也是让大家去思考模板背后的东西,而不是模板本身。 - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902/1.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902/1.jpg" deleted file mode 100644 index 19990b36..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/902/1.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903.md" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903.md" deleted file mode 100644 index 1df4f10c..00000000 --- "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903.md" +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: 第一个错误的版本(287) -date: 2020-06-30 ---- - -> 如果你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的,所以我们需要回滚代码,那如何能找到错误的版本呢? - -## 01、题目示例 - -| 第278题:第一个错误的版本 | -| ------------------------------------------------------------ | -| 假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。 | - -
- -你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。 - -
- -**示例:** - -``` -给定 n = 5,并且 version = 4 是第一个错误的版本。 - -调用 isBadVersion(3) -> false -调用 isBadVersion(5) -> true -调用 isBadVersion(4) -> true - -所以,4 是第一个错误的版本。 -``` - -## 02、推导过程 - -> 这个题目还是相当简单的....我拿出来讲的原因,是因为我的开发生涯中,真的遇到过这样一件事。当时我们做一套算薪系统,算薪系统主要复杂在业务上,尤其是销售的薪资,设计到数百个变量,并且还需要考虑异动(比如说销售A是团队经理,但是下调到B团队成为一名普通销售,然后就需要根据A异动的时间,来切分他的业绩组成。同时,最恶心的是,普通销售会影响到其团队经理的薪资,团队经理又会影响到营业部经理的薪资,一直到最上层,影响到整个大区经理的薪资构成)要知道,当时我司的销售有近万名,每个月异动的人就有好几千,这是非常非常复杂的。然后我们遇到的问题,就是同一个月,有几十个团队找上来,说当月薪资计算不正确(放在个人来讲,有时候差个几十块,别人也是会来找的)最后,在一阵漫无目的的排查之后,我们采用二分的思想,通过切变量,最终切到错误的异动逻辑上,进行了修正。 - -
- -回到本题,我们当然可以一个版本一个版本的进行遍历,直到找到最终的错误版本。但是如果是这样,还讲毛线呢。。。 - -```java -//JAVA -public int firstBadVersion(int n) { - for (int i = 1; i < n; i++ ) { - if (isBadVersion(i)) { - return i; - } - } - return n; -} -``` - -我们自然是采用二分的思想,来进行查找。举个例子,比如我们版本号对应如下: - -PNG - -如果中间的mid如果是错误版本,那我们就知道 mid 右侧都不可能是第一个错误的版本。那我们就令 right = mid,把下一次搜索空间变成[left, mid],然后自然我们很顺利查找到目标。 - -PNG - -根据分析,代码如下: - -```java -//JAVA -public int firstBadVersion(int n) { - int left = 1; - int right = n; - while (left < right) { - int mid = left + (right - left) / 2; - if (isBadVersion(mid)) { - right = mid; - } else { - left = mid + 1; - } - } - return left; -} -``` - -额外补充: - -
- -- 请大家习惯这种返回left的写法,保持代码简洁的同时,也简化了思考过程,何乐而不为呢。 - -
- -当然,代码也可以写成下面这个样子(是不是感觉差点意思?) - -```java -//JAVA -public class Solution extends VersionControl { - public int firstBadVersion(int n) { - int left = 1; - int right = n; - int res = n; - while (left <= right) { - int mid = left + ((right - left) >> 1); - if (isBadVersion(mid)) { - res = mid; - right = mid - 1; - } else { - left = mid + 1; - } - } - return res; - } -} -``` - -03、杂谈 - -> 据查,医书有服用响豆的方法,响豆就是槐树果实在夜里爆响的,这种豆一棵树上只有一个,辨认不出来。取这种豆的方法是,在槐树刚开花时,就用丝网罩在树上,以防鸟雀啄食。结果成熟后,缝制许多布囊贮存豆荚。夜里用来当枕头,没有听到声音,便扔掉。就这么轮着枕,肯定有一个囊里有爆响声。然后把这一囊的豆类又分成几个小囊装好,夜里再枕着听。听到响声再一分为二,装进囊中枕着听。这么分下去到最后只剩下两颗,再分开枕听,就找到响豆了。 - -
- -前三章的题目,都是比较简单的,目的是让大家对二分能有一些深层次的思考。下面我就会增大难度,为大家讲解一些,不那么容易可以直接想到使用二分法进行求解的题目,希望大家支持! \ No newline at end of file diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903/1.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903/1.jpg" deleted file mode 100644 index 0f596e3e..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903/1.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903/2.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903/2.jpg" deleted file mode 100644 index 5cd4fc6e..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/903/2.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904.md" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904.md" deleted file mode 100644 index adca910e..00000000 --- "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904.md" +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: 旋转排序数组中的最小值Ⅰ(153) -date: 2020-07-03 ---- - -> 今天继续为大家讲解二分查找,分享一道知乎面试题。话不多说,直接看题。 - -## 01、题目示例 - -> 这道题目有两个版本,一道简单,一道困难。我们从简单的开始讲起。 - -
- -| 第153题:旋转排序数组最小值Ⅰ | -| ------------------------------------------------------------ | -| 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。 | - -**示例 1:** - -``` -输入: [3,4,5,1,2] -输出: 1 -``` - -**示例 2:** - -``` -输入: [4,5,6,7,0,1,2] -输出: 0 -``` - -## 02、题解分析 - -> 这道题目的关键点取决于是否可以想到二分,难点:无。但是如果把题中的条件,换成数组中元素可重复,本题的难度就会大幅上升。 - -
- -当然,本题可以直接暴力搜索,但是这就就会被面试官撵出去。为了不被他撵出去,我们还是使用二分更为稳妥!**在****二分搜索中,我们找到区间的中间点并根据某些条件决定去区间左半部分还是右半部分搜索**。但是麻烦的是,我们的数组被旋转了,因此肯定不能直接使用二分。那我们需要先观察一下,假若我们的原始数组如下: - -PNG - -无论怎么旋转,我们都可以得到一个结论,首元素 > 尾元素,像是下面这样。虽然不知道这个结论有什么用,但是我们先记下来。 - -PNG - -继续进行观察,上面其实是两种极端情况,那如果普通的情况旋转,大概是下面这样: - -PNG - -问题似乎变得简单了,旋转将原数组一分为二,并且我们已知了首元素值总是大于尾元素,那我们只要找到将其一分为二的那个点(该点左侧的元素都大于首元素,该点右侧的元素都小于首元素),是不是就可以对应找到数组中的最小值。 - -PNG - -然后我们通过二分来进行查找,先找到中间节点mid,如果中间元素大于首元素,我们就把mid向右移动。 - -PNG - -如果中间元素小于首元素,我们就把mid向左移动。 - -PNG - -根据分析,完成题解: - -java版本 - -```java -//java -class Solution { - public int findMin(int[] nums) { - int left = 0; - int right = nums.length - 1; - while (left < right) { - int mid = left + (right - left) / 2 + 1; - if (nums[left] < nums[mid]) { - left = mid; - } else if (nums[left] > nums[mid]) { - right = mid - 1; - } - } - return nums[(right + 1) % nums.length]; - } -}; -``` - -python版本 - -```python -//python -class Solution: - def findMin(self, nums: List[int]) -> int: - left = 0 - right = len(nums) - 1 - while left < right: - mid = (left + right) >> 1 - if nums[mid] > nums[right]:          - left = mid + 1 - else:                                - right = mid - return nums[left] -``` - -c版本 - -```c -//c -int findMin(int* nums, int numsSize){ - int left=0; - int right=numsSize-1; - while(right>left) - { - int mid=left+(right-left)/2; - if(nums[mid]>nums[right]) - left=mid+1; - else - right=mid; - } - return nums[left]; -} -``` - -执行结果: - -PNG - -## 03、课后思考 - -> 本题有多种变形,是一道练习二分法的绝佳题目。比如“把元素中不可重复的条件去掉”,又或者是“编写一个函数来判断目标值是否在数组中”等等,不同的改动,都会对题目解题方式有略微的影响,但是万变不离其宗,统统都是二分法。 - -
- -其他的就不啰嗦了,明天将为大家答疑分析,解决“元素可重复”的版本。所以,今天的问题你学会了吗,评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/1.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/1.jpg" deleted file mode 100644 index 762cd3c9..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/1.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/2.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/2.jpg" deleted file mode 100644 index 0b454427..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/2.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/3.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/3.jpg" deleted file mode 100644 index 9a3e6f24..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/3.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/4.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/4.jpg" deleted file mode 100644 index 0f61a62d..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/4.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/5.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/5.jpg" deleted file mode 100644 index 210c13bf..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/5.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/6.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/6.jpg" deleted file mode 100644 index a3ab0842..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/6.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/7.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/7.jpg" deleted file mode 100644 index 3d71ad73..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/904/7.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905.md" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905.md" deleted file mode 100644 index 9af7d12d..00000000 --- "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905.md" +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: 旋转排序数组中的最小值Ⅱ(154) -date: 2020-07-03 ---- - -> 今天继续为大家讲解二分法系列篇 - 旋转排序数组最小值Ⅱ(进阶版)。话不多说,直接看题: - -## 01、题目示例 - -> 昨天为大家讲解了元素不可重复的版本,那如果元素重复该如何处理呢? - -| 第154题:旋转排序数组最小值Ⅱ | -| ------------------------------------------------------------ | -| 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。 注意数组中可能存在重复的元素。 | - -**示例 1:** - -``` -输入: [1,3,5] -输出: 1 -``` - -**示例 2:** - -``` -输入: [2,2,2,0,1] -输出: 0 -``` - -
- -**说明:** - -- 这道题是 [旋转排序数组中的最小值(153)](1.9/904.md) 的延伸题目。 -- 允许重复会影响算法的时间复杂度吗?会如何影响,为什么? - -## 02、题目回顾 - -> 之前我也说过,通过改变题中条件,使得题目难度上升的做法。在算法题目的设计中,是一种非常常见的手段。本题就是这样,从中等变成了困难。 - -PNG - -PNG - -在讲解本题之前,首先要对昨天的题目进行一个答疑。昨天有人问我为什么题目中讲的是与left进行比较,但是最后代码中写的时候变成了和right比较。这个确实是我讲的时候讲忘了,但是这其实是一个思维转化的问题:因为在旋转之前的原数组是一个递增序列,那一定是左边的数小,右边的数大,而我们要找的是最小值,所以比较偏向左找。那如果和left进行比较,其实也是完全ok的,那我们的思路就变成了找到偏右的最大值,进而向右再移动一位,自然也就是最小值。如果不能理解的话,可以回顾一下昨天的文章: - -[旋转排序数组中的最小值(153)](1.9/904.md) - -
- -并且我这里对昨天的题目,补上一个和left对比的版本,供大家参考学习(昨天没有给Go的示例,所以今天补一个Go的) - -```go -//go -func findMin(nums []int) int { - left, right := 0, len(nums)-1 - for left < right { - mid := left + (right-left)>>1 + 1 - if nums[left] < nums[mid] { - left = mid - } else if nums[left] > nums[mid] { - right = mid - 1 - } - } - return nums[(right+1)%len(nums)] -} -``` - -上面的代码有两处需要说明,第一:mid中最后加1的目的,是为了使得mid更加靠近right,增加容错性。当然,你写到里边也是可以的,甚至更好。我怕大家看不懂,所以写在外面了。第二:最后一行代码取模,是需要考虑最大值刚好在最右边的情况。 - -## 03、题解分析 - -> 二分查找的本质,其实就是通过收敛查找空间,找到目标值的一种方式。请大家认真阅读这句话。不管是采用不同的mid定义方式,又或者是不一样的while条件,统统都是为了这个目的。在完成这个目的的基础上,我们才去考虑如何减少冗余代码,减少循环次数等等,完成进一步的优化。 - -
- -现在再来看今天的题目。相对比昨天题目而言,其实只是多了**nums[mid] 等于 nums[right] 时的额外处理**。(当然, 如果是和left进行比较,就是nums[mid]等于nums[left]) - -
- -对比一下下面两个图: - -PNG - -
(无重复)
-PNG - -
(有重复)
-其实直接就可以给出代码了: - -```java -//java -class Solution { - public int findMin(int[] nums) { - int left = 0; - int right = nums.length - 1; - while (left < right) { - int mid = left + (right - left) / 2; - if (nums[mid] > nums[right]) { - left = mid + 1; - } else if (nums[mid] < nums[right]) { - right = mid; - } else { - right--; - } - } - return nums[left]; - } -}; - -``` - -如果我们再对比一下代码的差异,就会非常的明显: - -PNG - -
(左边是有重复,右边是无重复)
-可以看到在 nums[mid] 等于 nums[right] 时的情况下,我们只多了一个 right-1 的操作。这里需要额外说明的是,为什么要这样做?我看leetcode上的题解,这块很多都是长篇大论,其实没那么复杂,一句话就可以给你讲明白,看看下面这个! - -PNG - -因为 mid 和 right 相等时,最小值既可能在左边,又可能在右边,所以此时自然二分思想作废,咱们就砍掉一个右边界。说白了,就是**让子弹再飞一会儿**。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! - diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/1.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/1.jpg" deleted file mode 100644 index 0cc592b4..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/1.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/2.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/2.jpg" deleted file mode 100644 index 02e145b3..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/2.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/3.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/3.jpg" deleted file mode 100644 index 7d3c7f7d..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/3.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/4.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/4.jpg" deleted file mode 100644 index 69844654..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/4.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/5.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/5.jpg" deleted file mode 100644 index 2cd9c6b7..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/5.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/6.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/6.jpg" deleted file mode 100644 index b617e8ba..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/905/6.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906.md" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906.md" deleted file mode 100644 index 897a51d1..00000000 --- "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906.md" +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: 供暖器(475) -date: 2020-07-06 ---- - -> 当然不能让你真的去修供暖器,但是如果你真的很有兴趣,可以参考下面步骤: - -PNG - -今天为大家分享一道腾讯校招面试题,话不多说,一起来看题吧。 - -## 01、题目示例 - -> 这道题的重点在于对**题意的理解**,建议先自行思考,再看题解。 - -| 第475题:供暖器 | -| ------------------------------------------------------------ | -| 冬季已经来临。你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。 | - -**说明:** - -- 给出的房屋和供暖器的数目是非负数且不会超过 25000。 - -- 给出的房屋和供暖器的位置均是非负数且不会超过10^9。 - -- 只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。 - -- 所有供暖器都遵循你的半径标准,加热的半径也一样。 - -
- -**示例 1:** - -``` -输入: [1,2,3],[2] -输出: 1 -解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。 -``` - -**示例 2:** - -``` -输入: [1,2,3,4],[1,4] -输出: 1 -解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。 -``` - -## 02、题目分析 - -> 这道题目容易进入两个极端,要么就是没有读懂题意完全不知所云,要么就是觉得非常简单没什么可说的。 - -
- -这个题目还是比较有趣的,解题的关键在于读懂题意:我们要对任意一个房屋供暖,要么用前面的暖气,要么用后面的暖气,两者之间取最近的,这就是距离。同时,如果要覆盖到所有的房屋,我们要选择上述距离中最大的一段,这就是最小的加热半径。 - -PNG - -当然,我们可以采用暴力题解,通过双层遍历,第一层:遍历所有的房子,第二层:遍历加热器,找出距离该房子的最小距离。但是我们其实可以通过二分搜索来优化这个过程。 - -
- -根据分析,得出代码:(再不写CPP,有读者就要给我寄刀片了) - -```c++ -//c++ -class Solution { -public: - int findRadius(vector& houses, vector& heaters) { - //找到每个房屋位置所需要的最小半径的最大值 - int res = 0; - int n = heaters.size(); - sort(heaters.begin(), heaters.end()); - for (auto house : houses) - { - //二分法找不小于house的第一个值 - int left = 0, right = n; - while (left < right) - { - int mid = left + (right - left)/2; - if (house > heaters[mid]) left = mid + 1; - else right = mid; - } - int dist1 = (right == 0) ? INT_MAX : abs(house - heaters[right - 1]); - int dist2 = (right == n) ? INT_MAX : abs(house - heaters[right]); - res = max(res, min(dist1, dist2)); - } - return res; - } -}; -``` - -这个代码逻辑还是比较简单的,不需要额外补充。另外,其实本题还可以使用滑动窗口来进行求解,但是考虑到输入规模,**房屋数量有可能远远大于供暖器数量**,所以还是建议使用二分。 - -
- -最后还有一点要强调的就是:代码在刚开始的时候进行了一次排序。这个也是容易进入的误区,题目给的样例给人一种错觉 “提供的就是有序数组”,其实题中并没有说明,我第一次就犯了这样的错误。如果去掉排序的代码,就会报错: - -PNG - -## 03、其他 - -> 大家可以尝试用滑动窗口的方式来解答本题,也是很容易的。提供一个思路:首先还是保证数组**有序**,同时维护一个双指针,记录每一个房子左边的暖气,并且让其成为下一个房子左边的起始值,最后滑动窗口即可。 - -
- -今天看到很多IT行业的自媒体,都发表了 “前端大佬司徒正美去世” 的相关推文,这个行为我不做评论,说不上好或坏,因为是我的话,我不太愿意炒作去世的人。但是,换个角度,也许这样的炒作又可以为其家人带来一些体恤。“逝者已矣,生者如斯”,想说的是:这个行业还是蛮不容易的,钱一辈子挣不完,健康才是第一位,希望大家都能照顾好自己的身体,珍惜眼前人,幸福安康。 - -
- -所以,今天的问题你学会了吗,评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/1.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/1.jpg" deleted file mode 100644 index 5860d330..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/1.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/2.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/2.jpg" deleted file mode 100644 index 352503d1..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/2.jpg" and /dev/null differ diff --git "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/3.jpg" "b/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/3.jpg" deleted file mode 100644 index d180555d..00000000 Binary files "a/website/1.9.\344\272\214\345\210\206\346\263\225\347\263\273\345\210\227/906/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01.md" deleted file mode 100644 index 2d7b886f..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01.md" +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: 螺旋矩阵Ⅰ(54) -date: 2020-06-15 ---- - -> 今天为大家分享一道关于**螺旋矩阵**的问题。话不多说,直接看题目吧。 - -## 01、题目分析 - -| 第54题:螺旋矩阵 | -| ------------------------------------------------------------ | -| 定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 | - -**示例 1:** - -``` -输入: -[ - [ 1, 2, 3 ], - [ 4, 5, 6 ], - [ 7, 8, 9 ] -] -输出: [1,2,3,6,9,8,7,4,5] -``` - -**示例 2:** - -``` -输入: -[ - [1, 2, 3, 4], - [5, 6, 7, 8], - [9,10,11,12] -] -输出: [1,2,3,4,8,12,11,10,9,5,6,7] - - -``` - -## 02、题目分析 - -本题的思路,在于**模拟螺旋的移动轨迹**。 - -问题的难点,在于**想明白模拟过程中会遇到什么问题**。 - -那模拟的过程中会遇到什么样的问题?**边界处理**。 - -
- -因为只有我们能找到边界(边界包括:1、数组的边界 2、已经访问过的元素),才可以通过“**右,下,左,上**”的方向来进行移动。同时,每一次**碰壁**,就可以调整到下一个方向。 - -
- -思路明确了,我们看一下整个过程。假如我们的数组为: - -[ - - [1, 2, 3, 4], - - [5, 6, 7, 8], - - [9,10,11,12] - -] - -数组如下图所示: - -PNG - -我们首先对其设置好四个边界: - -``` -up := 0 -down := len(matrix) - 1 -left := 0 -right := len(matrix[0]) - 1 -``` - -如下图所示: - -PNG - -同时,我们定义x和y,来代表行和列。 - -如x=2,y=1,则 arr[2][1]=10(第3行第2列) - -PNG - -然后我们从第一个元素开始行军(y=left),完成第一行的遍历,直到碰壁。(y<=right) - -PNG - -下面关键的一步来了,**因为第一行已经走过了,我们将上界下调****(up++)**,同时转弯向下走。 - -PNG - -直到碰到底部时(x<=down),我们将**右界左调(right--)**,转弯向左走。 - -PNG - -后面向左和向上,分别完成**下界上调(down--)**和**左界右调(left++)**。 - -PNG - -最后,对剩下的矩阵重复整个过程,直到上下、左右的壁与壁碰在一起**(up <= down && left <= right,这是避免碰壁的条件)**。 - -## 03、Go语言示例 - -所以这道题很简单,只要会碰壁,就可以顺利得到代码(很漂亮,不是吗?),代码如下: - -```go -func spiralOrder(matrix [][]int) []int { - var result []int - if len(matrix) == 0 { - return result - } - left, right, up, down := 0, len(matrix[0])-1, 0, len(matrix)-1 - - var x, y int - for left <= right && up <= down { - for y = left; y <= right && avoid(left, right, up, down); y++ { - result = append(result, matrix[x][y]) - } - y-- - up++ - for x = up; x <= down && avoid(left, right, up, down); x++ { - result = append(result, matrix[x][y]) - } - x-- - right-- - for y = right; y >= left && avoid(left, right, up, down); y-- { - result = append(result, matrix[x][y]) - } - y++ - down-- - for x = down; x >= up && avoid(left, right, up, down); x-- { - result = append(result, matrix[x][y]) - } - x++ - left++ - } - return result -} - -func avoid(left, right, up, down int) bool { - return up <= down && left <= right -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/1.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/1.png" deleted file mode 100644 index 55f7571e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/1.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/2.png" deleted file mode 100644 index 11f0aa93..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/3.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/3.png" deleted file mode 100644 index 1db89377..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/3.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/4.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/4.jpeg" deleted file mode 100644 index 04aeff2a..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/4.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/5.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/5.png" deleted file mode 100644 index 35eefdf6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/5.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/6.jpg" deleted file mode 100644 index 657b710d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/7.jpg" deleted file mode 100644 index a2f2c1c4..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/8.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/8.png" deleted file mode 100644 index 1213db91..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/01/8.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02.md" deleted file mode 100644 index 1aad5e42..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02.md" +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: 只有两个键的键盘(650) -date: 2020-06-15 ---- - ->今天为大家分享一道关于**“复制” + “粘贴”**的题目。话不多说,直接看题吧。 - -## 01、题目分析 - -| 第650题:只有两个键的键盘 | -| ------------------------------------------------------------ | -| 最初在一个记事本上只有一个字符 'A' 。你每次可以对这个记事本进行两种操作:Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。Paste (粘贴) : 你可以粘贴你上一次复制的字符。 | - -给定一个数字 n 。你需要使用**最少的操作次数**,在记事本中打印出恰好 n 个 'A'。输出能够打印出 n 个 'A' 的最少操作次数。 - -
- -**示例 1:** - -``` -输入: 3 -输出: 3 -解释: -最初, 我们只有一个字符 'A'。 -第 1 步, 我们使用 Copy All 操作。 -第 2 步, 我们使用 Paste 操作来获得 'AA'。 -第 3 步, 我们使用 Paste 操作来获得 'AAA'。 -``` - -
- -**说明:** - -n 的取值范围是 [1, 1000] 。 - -## 02、题目分析 - -本题的思路,在于**想明白复制和粘贴过程中的规律,找到如何组成N个A的最小操作数。** - -
- -我们从最简单的开始分析,假如我们给定数字为1,那啥也不用做,因为面板上本来就有一个A。 - -PNG - -假如我们给定数字为2,那我们需要做C-P,共计2次操作来得到。 - -PNG - -假如我们给定数字为3,那我们需要做C-P-P,共计3次操作来得到。 - -PNG - -假如我们给定数字为4,我们发现好像变得不一样了。因为我们有两种方法都可以得到目标。(C-P-C-P) - -PNG - -或者(C-P-P-P) - -PNG - -但是需要的步骤还是一样。 - -
- -好了,到这里为止,STOP!通过上面的分析,我们至少可以观察出:**如果 i 为质数,那么 i 是多少,就需要粘贴多少次**。即:素数次数为本身的结论。如 两个A = 2,三个A = 3,五个A = 5。 - -
- -那对于合数又该如何分析呢?(自然数中除能被1和本身整除外,还能被其他的数整除的数)这里我们直接给出答案:合数的次数为**将其分解质因数的操作次数的和。**解释一下,这是个啥意思?举个例子: - -
- -比如30,可以分解为:3*2*5。什么意思呢?我们演示一遍:首先复制1,进行2次粘贴得到3。然后复制3,进行1次粘贴得到6。然后复制6,进行4次粘贴得到30。总共需要(CPPCPCPPPP) - -PNG - -> 注意:这里由于每一次都需要进行一次复制,**所以直接就等于分解质因数的操作次数的和**。并且分解的顺序,不会影响到结果。 - -
- -综合上面的分析,我们得出分析结果: - -1、质数次数为其本身。 - -2、合数次数为将其分解到**所有不能再分解的质数的操作次数的和**。 - -
- -## 03、Go语言示例 - -分析完毕,代码如下所示: - -```go -func minSteps(n int) int { - res := 0 - for i := 2; i <= n; i++ { - for n%i == 0 { - res += i - n /= i - } - } - return res -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/1.jpg" deleted file mode 100644 index bb56c2e4..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/2.jpg" deleted file mode 100644 index 650d04fb..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/3.jpg" deleted file mode 100644 index 770dfe96..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/4.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/4.png" deleted file mode 100644 index b3c7931e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/4.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/5.jpg" deleted file mode 100644 index 623ce411..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/6.jpg" deleted file mode 100644 index 69d1b5bc..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/7.jpg" deleted file mode 100644 index b33c16b1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/02/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03.md" deleted file mode 100644 index 9a7cdce8..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03.md" +++ /dev/null @@ -1,265 +0,0 @@ ---- -title: 24点游戏(679) -date: 2020-06-15 ---- - ->“**24点**”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。今天就为大家分享一道关于“24点”的算法题目。 -> ->
-> ->话不多说,直接看题。 - -## 01、题目分析 - -| 第679题:24点游戏 | -| ------------------------------------------------------------ | -| 你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通 *,/,+,-,(,) 的运算得到 24 。 | - -**示例 1:** - -``` -输入: [4, 1, 8, 7] -输出: True -解释: (8-4) * (7-1) = 24 -``` - -**示例 2:** - -``` -输入: [1, 2, 1, 2] -输出: False -``` - -注意: - -​ 1、除法**运算符 / 表示实数除法,而不是整数除法**。例如 4 / (1 - 2/3) = 12 。 - -​ 2、每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。 - -​ 3、你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。 - -
- -## 02、题目分析 - -拿到题目,第一反应就可以想到**暴力求解。如果我们要判断给出的4张牌是否可以通过组合得到24,那我们只需找出所有的可组合的方式进行遍历。** - -
- -4个数字,3个操作符,外加括号,基本目测就能想到组合数不会大到超出边界。所以,我们只要**把他们统统列出来,不就可以进行求解了吗**?说干就干! - -
- -我们首先定义个方法,用来判断**两个数的的所有操作符组合是否可以得到24**。 - -```go -func judgePoint24_2(a, b float64) bool { - return a+b == 24 || a*b == 24 || a-b == 24 || b-a == 24 || a/b == 24 || b/a == 24  -} -``` - -但是这个方法写的正确吗?其实不对!因为在计算机中,实数在计算和存储过程中会有一些微小的误差,**对于一些与零作比较的语句来说,有时会因误差而导致原本是等于零但结果却小于或大于零之类的情况发生**,所以常用一个很小的数 **1e-6** 代替 0,进行判读! - -
- -(1e-6:表示1乘以10的负6次方。Math.abs(x)<1e-6 其实相当于x==0。1e-6(也就是0.000001)叫做**epslon**,用来抵消浮点运算中因为误差造成的相等无法判断的情况。这个知识点需要掌握!) - -
- -举个例子: - -```go -func main() { - var a float64 - var b float64 - b = 2.0 - //math.Sqrt:开平方根 - c := math.Sqrt(2) - a = b - c*c - fmt.Println(a == 0)                  //false - fmt.Println(a < 1e-6 && a > -(1e-6)) //true -} -``` - -这里直接用 **a==0** 就会得到false,但是通过 **a < 1e-6 && a > -(1e-6)** 却可以进行准确的判断。 - -
- -所以我们将上面的方法改写: - -```go -//go语言 -//judgePoint24_2:判断两个数的所有操作符组合是否可以得到24 func judgePoint24_2(a, b float64) bool { - return (a+b < 24+1e-6 && a+b > 24-1e-6) || - (a*b < 24+1e-6 && a*b > 24-1e-6) || - (a-b < 24+1e-6 && a-b > 24-1e-6) || - (b-a < 24+1e-6 && b-a > 24-1e-6) || - (a/b < 24+1e-6 && a/b > 24-1e-6) || - (b/a < 24+1e-6 && b/a > 24-1e-6)  -} -``` - -完善了通过两个数来判断是否可以得到24的方法,现在我们加一个判断三个数是否可以得到24的方法。 - -```go -//硬核代码,不服来辩! -func judgePoint24_3(a, b, c float64) bool { 3 - return judgePoint24_2(a+b, c) || - judgePoint24_2(a-b, c) || - judgePoint24_2(a*b, c) || - judgePoint24_2(a/b, c) || - judgePoint24_2(b-a, c) || - judgePoint24_2(b/a, c) ||        - judgePoint24_2(a+c, b) || - judgePoint24_2(a-c, b) || - judgePoint24_2(a*c, b) || - judgePoint24_2(a/c, b) || - judgePoint24_2(c-a, b) || - judgePoint24_2(c/a, b) || - judgePoint24_2(c+b, a) || - judgePoint24_2(c-b, a) || - judgePoint24_2(c*b, a) || - judgePoint24_2(c/b, a) || - judgePoint24_2(b-c, a) || - judgePoint24_2(b/c, a) -} -``` - -好了。三个数的也出来了,我们再加一个判断4个数为24点的方法:(排列组合,我想大家都会....) - -```go -//硬核代码,不服来辩! -func judgePoint24(nums []int) bool { - return judgePoint24_3(float64(nums[0])+float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])-float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])*float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])/float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])-float64(nums[0]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])/float64(nums[0]), float64(nums[2]), float64(nums[3])) || - - judgePoint24_3(float64(nums[0])+float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])-float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])*float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])/float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])-float64(nums[0]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])/float64(nums[0]), float64(nums[1]), float64(nums[3])) || - - judgePoint24_3(float64(nums[0])+float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[0])-float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[0])*float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[0])/float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])-float64(nums[0]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])/float64(nums[0]), float64(nums[2]), float64(nums[1])) || - - judgePoint24_3(float64(nums[2])+float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[2])-float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[2])*float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[2])/float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])-float64(nums[2]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])/float64(nums[2]), float64(nums[0]), float64(nums[1])) || - - judgePoint24_3(float64(nums[1])+float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])-float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])*float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])/float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])-float64(nums[1]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])/float64(nums[1]), float64(nums[0]), float64(nums[3])) || - - judgePoint24_3(float64(nums[1])+float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[1])-float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[1])*float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[1])/float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[3])-float64(nums[1]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[3])/float64(nums[1]), float64(nums[2]), float64(nums[0])) -} -``` - -## 03、Go语言示例 - -我们整合全部代码如下: - -```go -func judgePoint24(nums []int) bool { - return judgePoint24_3(float64(nums[0])+float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])-float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])*float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])/float64(nums[1]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])-float64(nums[0]), float64(nums[2]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])/float64(nums[0]), float64(nums[2]), float64(nums[3])) || - - judgePoint24_3(float64(nums[0])+float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])-float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])*float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[0])/float64(nums[2]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])-float64(nums[0]), float64(nums[1]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])/float64(nums[0]), float64(nums[1]), float64(nums[3])) || - - judgePoint24_3(float64(nums[0])+float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[0])-float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[0])*float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[0])/float64(nums[3]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])-float64(nums[0]), float64(nums[2]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])/float64(nums[0]), float64(nums[2]), float64(nums[1])) || - - judgePoint24_3(float64(nums[2])+float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[2])-float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[2])*float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[2])/float64(nums[3]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])-float64(nums[2]), float64(nums[0]), float64(nums[1])) || - judgePoint24_3(float64(nums[3])/float64(nums[2]), float64(nums[0]), float64(nums[1])) || - - judgePoint24_3(float64(nums[1])+float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])-float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])*float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[1])/float64(nums[2]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])-float64(nums[1]), float64(nums[0]), float64(nums[3])) || - judgePoint24_3(float64(nums[2])/float64(nums[1]), float64(nums[0]), float64(nums[3])) || - - judgePoint24_3(float64(nums[1])+float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[1])-float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[1])*float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[1])/float64(nums[3]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[3])-float64(nums[1]), float64(nums[2]), float64(nums[0])) || - judgePoint24_3(float64(nums[3])/float64(nums[1]), float64(nums[2]), float64(nums[0])) -} - -func judgePoint24_3(a, b, c float64) bool { - return judgePoint24_2(a+b, c) || - judgePoint24_2(a-b, c) || - judgePoint24_2(a*b, c) || - judgePoint24_2(a/b, c) || - judgePoint24_2(b-a, c) || - judgePoint24_2(b/a, c) || - - judgePoint24_2(a+c, b) || - judgePoint24_2(a-c, b) || - judgePoint24_2(a*c, b) || - judgePoint24_2(a/c, b) || - judgePoint24_2(c-a, b) || - judgePoint24_2(c/a, b) || - - judgePoint24_2(c+b, a) || - judgePoint24_2(c-b, a) || - judgePoint24_2(c*b, a) || - judgePoint24_2(c/b, a) || - judgePoint24_2(b-c, a) || - judgePoint24_2(b/c, a) -} - -func judgePoint24_2(a, b float64) bool { - return (a+b < 24+1e-6 && a+b > 24-1e-6) || - (a*b < 24+1e-6 && a*b > 24-1e-6) || - (a-b < 24+1e-6 && a-b > 24-1e-6) || - (b-a < 24+1e-6 && b-a > 24-1e-6) || - (a/b < 24+1e-6 && a/b > 24-1e-6) || - (b/a < 24+1e-6 && b/a > 24-1e-6) -} -``` - -执行结果: - -PNG - -
- -> 由于代码**过于硬核**,我们直接击败100%的对手:(没想到吧!代码还可以这么写~) \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03/1.jpg" deleted file mode 100644 index 8d4fd39d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/03/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04.md" deleted file mode 100644 index 04b2d17e..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04.md" +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: 飞机座位分配概率(1227) -date: 2020-06-15 ---- - -> 坐汽车、火车、飞机的时候,大家不知道有没有想过这样一个问题?如果自己的票弄丢了,那么自己屁股随机这么一蹲,坐到自己位置的概率有多大?今天就为大家分析一下这个问题。 - -## 01、题目分析 - -| 第1227题:飞机座位分配概率 | -| ------------------------------------------------------------ | -| 有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。 | - -剩下的乘客将会: - -- 如果他们自己的座位还空着,就坐到自己的座位上, -- 当他们自己的座位被占用时,随机选择其他座位 - -第 n 位乘客坐在自己的座位上的概率是多少? - -
- -**示例 1:** - -``` -输入:n = 1 -输出:1.00000 -解释:第一个人只会坐在自己的位置上。 -``` - -**示例 2:** - -``` -输入: n = 2 -输出: 0.50000 -解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。 -``` - -## 02、题目图解 - -对于这道题,不卖关子,直接分析: - -一个位置一个人,一屁股蹲下,概率100%,这没啥可说的。 - -PNG - -两个位置两个人,第一个人已经坐下,要么坐对了,要么坐错了。所以第二个人坐在自己位置上的概率是50%。 - -PNG - -重点来了,三个位置三个人,第一个一屁股坐下,有三种坐法。PNG - -如果恰好**第一个人坐到了自己的座位**上(1/3),那这种情况下,第二个人也就可以直接坐在自己的座位上,第三个人一样。所以此时第三人坐在自己座位上的可能性是 100%。 - -PNG - -如果**第一个人占掉了第二个人的位置**(1/3)**。**此时第二人上来之后,要么坐在第一人的位置上,要么坐在第三人的位置上。(1/2)所以,在这种情况下,第三人的座位被占的可能性是 1/3*1/2=1/6。 - -PNG - -那假如第一人直接一屁股坐在第三人的座位上,此时第三人的座位被占的可能性就是第一人选择第三人座位的可能性。(1/3) - -PNG - -所以,如果三个座位三个人,第三个人坐到自己位置上的概率就是:1-1/6-1/3=1/2。当然,也可以通过 1/3+1/6=1/2 来正向计算。 - -
- -而对于 n>3 的情况,我们参照 3 个座位时进行分析: - -- 如果第 1个乘客选择第 1 个座位,那么第n个人选择到第 n 个座位的可能性就是 100%。(1/n) -- 如果第1个乘客选择了第n个座位,那么第 n 个人选择第 n 个座位的可能性就是0。(0) -- **而对于第 1 个乘客选择除了第一个和第 n 个座位之外的座位k (1 - -第一二种情况都好说,对于第三种情况。因为此时第k个座位被占用,于第 k 个乘客而言,他又会面临和第一个乘客一样的选择。**相当于乘客1将问题转移到了第k个乘客身上,等同于****本次选择无效!**且这个过程会一直持续到没有该选项**。**于是乎,对于第 n 个人,他最后将只有两个选项:1、自己的 2、第一个人。**所以对于n>=3 的情况,等同于 n=2,全部的概率都为 1/2**。 - -
- -如果还是不能理解的小伙伴,可以这样想。**登机时座位被占的乘客 ,其实相当于和上一位坐错的乘客交换了身份**。直到完成终止条件(坐对位置 或者 坐到最后一个位置),否则该交换将一直进行下去。所以第n位乘客,坐到第n个位置,自然还是 1/2。 - -## 03、Go语言示例 - -根据分析,完成代码: - -```go -func nthPersonGetsNthSeat(n int) float64 { - if n == 1 { - return 1 - } - return 0.5 -} -``` - -
- -> 小伙伴都看懂了吗? -> -> 这里留下一个疑问,假如共有200个座位,平均有多少人没有坐到自己的位置呢? -> -> 评论区留下你的想法吧! - diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/1.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/1.png" deleted file mode 100644 index 9a614c22..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/1.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/2.png" deleted file mode 100644 index f36d8a49..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/3.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/3.jpeg" deleted file mode 100644 index 6fa522a7..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/3.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/4.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/4.png" deleted file mode 100644 index 2163101c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/4.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/5.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/5.png" deleted file mode 100644 index 7fe023b2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/5.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/6.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/6.png" deleted file mode 100644 index 60576553..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/04/6.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/05.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/05.md" deleted file mode 100644 index d40b4dcb..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/05.md" +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: 水分子的产生 -date: 2020-06-16 ---- - -> 今天为大家分享一道看起来**“高大上****”**的题目。 -> -> 话不多说,直接看题吧。 - -## 01、水分子的产生 - -| 水分子的产生 | -| ------------------------------------------------------------ | -| 现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子。 | - -
- -存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。 - -
- -氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。 - -
- -这些线程应该三三成组突破屏障并能立即组合产生一个水分子。 - -
- -你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。 - -
- -换句话说: - -如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。 - -如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。 - -书写满足这些限制条件的氢、氧线程同步代码。 - -
- -**示例 1:** - -``` -输入: "HOH" -输出: "HHO" -解释: "HOH" 和 "OHH" 依然都是有效解。 -``` - -
- -**示例 2:** - -``` -输入: "OOHHHH" -输出: "HHOHHO" -解释: "HOHHHO", "OHHHHO", "HHOHOH", "HOHHOH", "OHHHOH", "HHOOHH", "HOHOHH" 和 "OHHOHH" 依然都是有效解。 -``` - -
- -限制条件: - -- 输入字符串的总长将会是 3n, 1 ≤ n ≤ 50; -- 输入字符串中的 “H” 总数将会是 2n; -- 输入字符串中的 “O” 总数将会是 n。 - -
- -代码模板: - -```java -class H2O { - public H2O() { - - } - public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {         // releaseHydrogen.run() outputs "H". Do not change or remove this line.        releaseHydrogen.run(); - } - public void oxygen(Runnable releaseOxygen) throws InterruptedException {        - // releaseOxygen.run() outputs "O". Do not change or remove this line. - releaseOxygen.run(); - } -} -``` - -## 02、JAVA分析 - -乍看之下,题目貌似很高大上,不少同学一听多线程直接就慌了神。我们一起分析一下。一个氧消耗两个氢,两个氢供给一个氧。我们只要可以模拟氢和氧的供给关系,就可以顺利进行求解。 - -
- -这里先介绍一下Java中的Semaphore:Semaphore是 synchronized 的加强版,作用是**控制线程的并发数量**。可以通过 acquire 和 release 来进行类似 lock 和 unlock 的操作。 - -```java -//请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire -void acquire() -//释放一个信号量,这时候信号量个数+1, -void release(); -``` - -什么?听不懂!大白话就是叫做 Semaphore 的这个东东,可以控制同时有多少线程可以进去,比一般的锁要稍微高级那么一点点。 - -
- -由于题目中给的限制条件,已经明确说明了H是2n,O是n,所以我们不需要考虑无法构成水分子的情况。我们分别定义H和O的信号量,都初始化为2个信号量。 - -
- -在每一次产生O的过程中,都需要等待产生了两个H。 - -```java -import java.util.concurrent.Semaphore; - -class H2O { -    public H2O() { 6 -    }     -    private Semaphore h = new Semaphore(2); - private Semaphore o = new Semaphore(2); - public void hydrogen(Runnable releaseHydrogen) throws InterruptedException { - h.acquire(1); - releaseHydrogen.run(); - o.release(1); - } - public void oxygen(Runnable releaseOxygen) throws InterruptedException { - o.acquire(2); - releaseOxygen.run(); - h.release(2); - } -} -``` - -## 03、C++代码分析 - -如果没有原生的信号量支持怎么办?其实也是一样的。我们可以通过锁来模拟信号量。这里加一个C++版本的实现。 - -```c++ -class H2O { -private: - int countOxygen; - pthread_mutex_t lockHy; - pthread_mutex_t lockOx; -public: - H2O() { - pthread_mutex_init(&lockOx,NULL);         - pthread_mutex_init(&lockHy,NULL); - pthread_mutex_lock(&lockOx); - countOxygen = 2; - } - void hydrogen(function releaseHydrogen) { - pthread_mutex_lock(&lockHy); - releaseHydrogen(); - countOxygen--; - if(countOxygen > 0){ - pthread_mutex_unlock(&lockHy); - }else{ - pthread_mutex_unlock(&lockOx); - } - } - void oxygen(function releaseOxygen) { - pthread_mutex_lock(&lockOx); - releaseOxygen(); - countOxygen = 2; - pthread_mutex_unlock(&lockHy); - } -}; -``` - -## 03、Python代码分析 - -好吧,其他语言都有并发。但是我PY竟然连并发都没有(杠精勿扰,我知道有 threading 库可以用。并且里边也已经提供了现成的信号量可以用)这种情况下怎么办? - -
- -还是可以解决,我们可以用队列模拟进行实现 - -```python -class H2O: - def __init__(self): - self.h, self.o = [], []     - def hydrogen(self, releaseHydrogen: 'Callable[[], None]') -> None: - self.h.append(releaseHydrogen) 7 - self.res() -  def oxygen(self, releaseOxygen: 'Callable[[], None]') -> None: - self.o.append(releaseOxygen) - self.res() - def res(self): - if len(self.h) > 1 and len(self.o) > 0: - self.h.pop(0)() - self.h.pop(0)() - self.o.pop(0)() -``` - -## 04、GO语言版本 - -已经提供了PY,JAVA,C++的版本。对于GO而言,不管你是通过channel来模拟信号量的方式,还是参照PY的方式进行实现,我觉得应该都可以完成。 \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/06.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/06.md" deleted file mode 100644 index 92f792ce..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/06.md" +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: 救生艇(881) -date: 2020-06-16 ---- - ->小浩算法改版了,大家看一下风格怎么样,还喜欢吗?所有的排版,绘图,文案,题解都是由小浩一人完成哦~ -> ->今天为大家分享一道关于**“救生艇****”**的题目。 -> ->话不多说,直接看题吧。 - -## 01、题目示例 - -| 第881题:救生艇 | -| ------------------------------------------------------------ | -| 第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。 | - -**示例 1:** - -``` -输入:people = [1,2], limit = 3 -输出:1 -解释:1 艘船载 (1, 2) -``` - -
- -**示例 2:** - -``` -输入:people = [3,2,2,1], limit = 3 -输出:3 -解释:3 艘船分别载 (1, 2), (2) 和 (3) -``` - -
- -**示例 3:** - -``` -输入:people = [3,5,3,4], limit = 5 -输出:4 -解释:4 艘船分别载 (3), (3), (4), (5) -``` - -
- -**提示:** - -- 1 <= people.length <= 50000 -- 1 <= people[i] <= limit <= 30000 - -## 02、题目分析 - -这不是一道算法题,这是一个脑筋急转弯。 - -
- -一个船最多可以装两个人,并且不能把船压垮。同时要求把这些人可以统统装下的最小船数。用脚趾头也可以想到,我们需要**尽最大努力的去维持一个床上得有两个人**。。哦,不,船上。这是什么思想?Bingo,贪心。 - -
- -思路很简单: - -1. 我们首先需要让这些人**根据体重进行排序。** -2. 同时**维护两个指针,每次让最重的一名上船,同时让最轻的也上船**。(因为最重的要么和最轻的一起上船。要么就无法配对,只能自己占用一艘船的资源) - -## 03、JAVA示例 - -根据分析,得到代码: - -```java -class Solution { - public int numRescueBoats(int[] people, int limit) { - Arrays.sort(people); - int i = 0, j = people.length - 1; - int ans = 0; - - while (i <= j) { - ans++; - if (people[i] + people[j] <= limit) - i++; - j--; - } - return ans; - } -} -``` - -## 04、GO示例 - -GO代码其实也一样: - -```go -func numRescueBoats(people []int, limit int) int { - sort.Ints(people) - ans :=0 - i, j :=0, 0, len(people) - 1 - for i <= j { - if people[i] + people[j] <= limit { - i++ - } else{ - j-- - } - ans++ - } - return ans -} -``` - -## 05、题目扩展 - -这里肯定马上就有细心的读者会问!为什么你每次是让最瘦的和最胖的来凑一对。而不是放弃掉这个最瘦的,去找一个逼近limit体重的人来乘船呢?这里要注意题目,**因为题中已经告诉了, 一艘船仅能坐两人**。所以去找一个逼近limit体重的人是没有意义的。 - -
- -但是,这里并不妨碍我们将此题扩展进行思考。这里留下疑问,**如果我们不对船上的人数进行限制**,那么应该如何来完成本题呢?大家可以尝试代码练习一下。 \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07.md" deleted file mode 100644 index 249c1ac0..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07.md" +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: 25匹马的经典问题 -date: 2020-06-16 ---- - ->今天为大家分享一道非常经典的面试题,和马有关。无论是校招,还是社招,在各大公司都出现过,我也曾经问过别人。 -> ->话不多说,直接看题吧。 - -## 01、题目示例 - -| 25匹马的问题 | -| ------------------------------------------------------------ | -| 有一个赛场上共有25匹马,赛场有5个跑道,不使用计时器进行比赛(也就是每次比赛只能得到本次的比赛的顺序) | - -试问最少比多少场才能选出最快的三匹马?并给出分析过程! - -## 02、题目分析 - -实在不想和那些答主一样,磨磨唧唧的分析完毕之后,再给你们扔出来正确答案。答案是7次,**懂得走人,今日合格,咱不浪费时间。**懵对的和猜错的往下看,**只会3匹马的也请往下看**。 - -
- -分析过程: - -- 5次:首先我们把25匹马分成5组(A、B、C、D、E),跑上五次,得到每组的第一名。 - - PNG - -- 1次:然后我们让这5个第一名跑上一次,得到其中的前三名。**注意:这里就可以得到所有马中跑的最快的第一名A1了。并且,D1和E1所在的组可以直接淘汰。第二名和第三名一定不会在其中产生!** - - PNG - -- 1次:因为我们已经跑出了第一名,所以A1不需要再参加比赛,同时,D1和E1所在的组已经淘汰。C1作为第三组的第一名,C组不会有跑的比C1快的。而B2有可能是比C1跑的快的第三名。同理,A2和A3也有可能是比B1和B2跑的快的。所以第7次比赛,我们让**A2,A3,B1,B2,C1**来一起完成。(求大家不要怪我啰嗦,,,我是实在担心有那么几个同学听不懂...) - - PNG - -最终,我们**通过7次比赛**,得到25匹马中的前三名。 - -## 03、升级版本 - -还是25匹马,如果我们要找到其中跑的最快的**前五名**,最少需要比赛几次呢?(这里我想说一下,我看到**网上有不少地方把这个题讲错了**,所以不会的同学建议还是认真看一看) - -
- -在上面的的分析中,我们已经明确了第一名。**但是第二名和第三名,是可以在A2-A3-B1-B2-C1中产生的,**我们需要分别进行讨论。 - -PNG - -- 假若二三名分别为:A2,A3 - - 对于这种情况,**第四名可能是A4**,此时第五名是A5或者B1。**第四名也可能是B1**,此时第五名是B2或者C1。所以我们只需要让[A4,B1,A5,B2,C1]参加一次比赛,就可以得到前五名。 - -- 假若二三名分别为:A2,B1 - - 对于这种情况,第四名可能是A3、B2、C1。**假设第4名为A3**,第5名可能为A4、B2、C1。**假设第4名为B2**,第5名可能为A3、B3、C1。**假设第4名为C1**,第5名可能为A3、B2、C2、D1。此时我们需要至少两次比赛,才能在[A3,A4,B2,B3,C1,C2,D1]中找到第四名和第五名,所以就需要9次。 - -
- -其他的可能性还有: - -- 假若二三名分别为:B1,A2 -- 假若二三名分别为:B1,B2 -- 假若二三名分别为:B1,C1 - -
- -上面这三种情况分析的方法一致,就不一一说明了,大概的思路就是,我们需要**根据第三名,分析出可能的第四名**。**再根据第四名,分析出对应情况下的第五名**。最终再在这些马匹里,抉择出真正的第四名和第五名。 - -
- -因为题中问的是**最少比多少场可以跑出前五名**。所以根据分析,假如**第二名和第三名是A2和A3的话,只需要8次就可以跑出前五名**。最少次数是8。(这个题目其实是不严谨的,所以如果有面试官问到这个题,最好是给出所有可能性的推导过程) - -
- -我看到很多答主有讲这道题,上来就给一个8,但是都没有说清楚原因。之前我去成电校招的时候,也问过一个学生这个问题,对方上来就给我一个8,问其过程,一脸懵逼。我希望看过这篇文章的朋友,下次遇到这个问题,能直接给出所有的分析结果,**挂掉面试官**。**毕竟我们这些懂得人,就是这样朴实无华且枯燥。** - -
- -所以,今天的问题你听明白了吗?评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/1.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/1.png" deleted file mode 100644 index 61c82c35..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/1.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/2.png" deleted file mode 100644 index 812cb667..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/3.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/3.png" deleted file mode 100644 index 5a7c3877..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/3.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/4.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/4.png" deleted file mode 100644 index 8f879cbb..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/07/4.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08.md" deleted file mode 100644 index 70d28773..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08.md" +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: 灯泡开关(319) -date: 2020-06-17 ---- - -> 今天为大家分享一道关于**"电灯泡"**的题目。 -> -> 话不多说,直接看题。 - -## 01、题目示例 - -| 第319题:开关灯泡 | -| ------------------------------------------------------------ | -| 初始时有 n 个灯泡关闭。第 1 轮,你打开所有的灯泡。第 2 轮,每两个灯泡关闭一次。第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。对于第 n 轮,你只切换最后一个灯泡的开关。找出 n 轮后有多少个亮着的灯泡。 | - -**示例:** - -``` -输入: 3 -输出: 1 -解释: -初始时, 灯泡状态 [关闭, 关闭, 关闭]. -第一轮后, 灯泡状态 [开启, 开启, 开启]. -第二轮后, 灯泡状态 [开启, 关闭, 开启]. -第三轮后, 灯泡状态 [开启, 关闭, 关闭]. - -你应该返回 1,因为只有一个灯泡还亮着。 -``` - -## 02、题目图解 - -这是一道难度评定为**困难**的题目。但是,其实这并不是一道算法题,而是一个脑筋急转弯。只要我们模拟一下开关灯泡的过程,大家就会瞬间get,一起来分析一下: - -
- -我们模拟一下n从1到12的过程。在第一轮,你打开了12个灯泡: - -PNG - -因为对于大于n的灯泡你是不care的,所以我们用黑框框表示: - -PNG - -然后我们列出n从1-12的过程中所有的灯泡示意图: - -PNG - -可以得到如下表格: - -PNG - -观察一下,这是什么?观察不出来,咱们看看这个: - -```go -//go -func main() { - for n := 1; n <= 12; n++ { - fmt.Println("n=", n, "\t灯泡数\t", math.Sqrt(float64(n))) - } -} -``` - -```go -//print -n= 1     灯泡数  1 -n= 2     灯泡数  1.4142135623730951 -n= 3     灯泡数  1.7320508075688772 -n= 4     灯泡数  2 -n= 5     灯泡数  2.23606797749979 -n= 6     灯泡数  2.449489742783178 -n= 7     灯泡数  2.6457513110645907 -n= 8     灯泡数  2.8284271247461903 -n= 9     灯泡数  3 -n= 10     灯泡数  3.1622776601683795 -n= 11     灯泡数  3.3166247903554 -n= 12     灯泡数  3.4641016151377544 -``` - -没错,只要我们对n进行开方,就可以得到最终的灯泡数。根据分析,得出代码: - -```c++ -//给一个c++版本的 -class Solution { -public: - int bulbSwitch(int n) { - return sqrt(n); - } -}; -``` - -执行结果: - -PNG - -## 03、证明 - -我不服,没有证明,你说毛线!证明如下: - -
- -约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。 - -
- -从我们观察可以发现,如果一个灯泡有奇数个约数,那么最后这个灯泡一定会亮着。 - -
- -什么,你问我奇数是什么?奇数(odd)指不能被2整除的整数 ,数学表达形式为:2k+1, 奇数可以分为正奇数和负奇数。 - -
- -所以其实我们是求,**从1-n有多少个数的约数有奇数个**。而**有奇数个约数的数一定是完全平方数。**这是因为,对于数n,如果m是它的约数,则n/m也是它的约数,若m≠n/m,则它的约数是以m、n/m的形式成对出现的。而m=n/m成立且n/m是正整数时,n是完全平方数,而它有奇数个约数。 - -
- -我们再次转化问题,**求1-n有多少个数是完全平方数**。 - -
- -什么,你又不知道什么是完全平方数了?完全平方指用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,**则称这个数为完全平方数**。 - -
- -到这里,基本就很明朗了。剩下的,我想不需要再说了吧! - diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/1.jpg" deleted file mode 100644 index f9989ce0..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/2.png" deleted file mode 100644 index c5faa492..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/3.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/3.png" deleted file mode 100644 index 36788df2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/3.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/4.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/4.png" deleted file mode 100644 index 29d942db..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/4.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/5.jpg" deleted file mode 100644 index 9949d8fd..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/08/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09.md" deleted file mode 100644 index 8356c6b6..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09.md" +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: 三门问题 -date: 2020-06-17 ---- - -> 三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,出自美国的电视游戏节目Let's Make a Deal。今天为大家进行完整分析。 -> -> 话不多说,直接看题目。 - -## 01、题目示例 - -| 三门问题 | -| ------------------------------------------------------------ | -| 参赛者的面前有三扇关闭着的门,其中一扇的后面是天使,选中后天使会达成你的一个愿望,而另外两扇门后面则是恶魔,选中就会死亡。 | - -当你选定了一扇门,但未去开启它的时候,上帝会开启剩下两扇门中的一扇,露出其中一只恶魔。(上帝是全能的,必会打开恶魔门)随后上帝会问你要不要更换选择,选另一扇仍然关着的门。 - -## 02、题目分析 - -按照常理,参赛者在做出最开始的决定时,对三扇门后面的事情一无所知,因此他选择正确的概率是1/3,这个应该大家都可以想到。 - -
- -接下来,主持人排除掉了一个错误答案(有恶魔的门),于是剩下的两扇门必然是一扇是天使,一扇是恶魔,那么此时无论选择哪一扇门,胜率都是1/2,依然合乎直觉。 - -
- -所以你作为参赛者,你会认为换不换都无必要,获胜概率均为1/2。但是,真的是这样吗? - -
- -正确的答案是,**如果你选择了换,碰见天使的概率会高达2/3,而不不换的话,碰见天使的概率只有1/3。**怎么来的? - -
- -我们用一个很通俗的方法,能让你一听就懂。首先刚开始选择的一扇门的概率为1/3,而另外两扇门的总概率为2/3。 - -PNG - -现在上帝打开了其中一扇为恶魔的门,我们知道这个门后面不会再有天使,所以相当于这部分概率被第三个门持有。 - -PNG - -剩下的那扇门的概率(2/3)相当于刚开始选择的门(1/3)的二倍。所以我们得换。 - -
- -如果还没有听懂。我们可以假设有一百扇门,里边有99只都是恶魔。现在你随机选择一扇门,选择到天使的概率是1/100。 - -PNG - -这时,上帝打开其中的98扇,里边都是恶魔。这时候就相当于99/100的概率都集中在了另一扇门里。自然,我们需要选择换。PNG - -## 04、代码证明 - -为了验证结果,我用代码跑了一百万次。什么?用贝叶斯分析分析!太俗(请隔壁去找李永乐老师),咱们还是直接上代码。 - -```go -func main() { - //换门遇见天使的次数和不换门遇见天使的次数     changeAngelCount, unchangeAngelCount := 0, 0     for i := 0; i < 1000000; i++ { - //门的总数 - doors := []int{0, 1, 2} - //天使门和选中的门         angelDoor, selectedDoor := rand.Intn(3), rand.Intn(3) - //上帝移除一扇恶魔门 - for j := 0; j < len(doors); j++ { - if doors[j] != selectedDoor && doors[j] != angelDoor { - doors = append(doors[:j], doors[j+1:]...) - break - } - } - //统计         - if selectedDoor == angelDoor { - unchangeAngelCount++ - } else { - changeAngelCount++ - } - } - fmt.Println("不换门遇见天使次数:", unchangeAngelCount, "比例:", (float32(unchangeAngelCount) / 1000000)) - fmt.Println("换门遇见天使次数:", changeAngelCount, "比例:", (float32(changeAngelCount) / 1000000)) -} -``` - -跑了一百万次,结果当然不让我们失望!执行结果为: - -PNG - -所以,今天的问题你听明白了吗?评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/1.jpg" deleted file mode 100644 index c970f092..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/2.png" deleted file mode 100644 index 042887e0..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/3.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/3.jpeg" deleted file mode 100644 index 86654f7c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/3.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/4.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/4.jpeg" deleted file mode 100644 index 43853af5..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/4.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/5.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/5.png" deleted file mode 100644 index 1d2338f3..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/09/5.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10.md" deleted file mode 100644 index 698b577e..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10.md" +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: 猜数字游戏(299) -date: 2020-06-17 ---- - ->今天为大家分享一道非常经典的题目,**猜数字**。话不多说,直接看题。 - -## 01、题目分析 - -| 第299题:猜数字(Bulls and Cows)游戏 | -| ------------------------------------------------------------ | -| 你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。 | - -请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。 - -
- -请注意秘密数字和朋友的猜测数都可能含有重复数字。 - -
- -**示例 1:** - -``` -输入: secret = "1807", guess = "7810" -输出: "1A3B" -解释: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。 -``` - -**示例 2:** - -``` -输入: secret = "1123", guess = "0111" -输出: "1A1B" -解释: 朋友猜测数中的第一个 1 是公牛,第二个或第三个 1 可被视为奶牛。 -``` - -
- -**说明:** 你可以假设秘密数字和朋友的猜测数都只包含数字,并且它们的长度永远相等。 - -## 02、题目图解 - -这道题,虽然被评定为“简单”,但是其实非常有趣。基本拿到题目,我们就能想到可以使用hashmap进行求解,一起来分析一下。 - -- 因为secret数字和guess数字长度相等,所以我们遍历secret数字。 - -- 如果当前索引两个数字相同,就将公牛数加1。 - - PNG - -- **如果不相同,我们将secret和guess当前索引位置处的数字通过map记录下来,统计他们出现的次数。**当然,之前我们讲过。有限的map,比如数字 0-10,字母 a-z,都可以通过**数组**来进行替换,用以压缩空间。 - - PNG - -- 最后,如果记录的两个map中,**数字出现重叠**(可以通过最小值来判断),则意味着该数字在两边都出现过,就将母牛数加一(我就想说是母牛,不服来辩) - -## 03、GO语言示例 - -根据分析,完成代码(这次翻Go的牌子): - -```go -func getHint(secret string, guess string) string { - a, b := 0, 0 - mapS, mapG := make([]int, 10), make([]int, 10) - for i := range secret { - //注意:这里是获取对应数字的ASCII码 - tmp, charGuess := secret[i], guess[i] - if tmp == guess[i] { - a++ - } else { - mapS[tmp-'0']++ - mapG[charGuess-'0']++ - } - } - for i := 0; i < 10; i++ { - //找到重叠的 - b += min(mapS[i], mapG[i]) - } - //strconv.Itoa : 整数转字符串 - return strconv.Itoa(a) + "A" + strconv.Itoa(b) + "B" -} - -func min(a, b int) int { - if a > b { - return b - } - return a -} -``` - -执行结果: - -PNG - -## 04、奇怪的知识 - -**奶牛包不包括公牛?**为了研究这个问题,我google了好一会儿。首先,国际定义,**奶牛包括公牛**。那公奶牛能不能产奶呢?答案是**不能**。那现在就有意思了,为什么公牛不产奶,还可以被称为奶牛?这是因为公奶牛是用来交配的,他们要保证所有的母奶牛都在哺乳期,所以他们需要不停的交配。一般一个养殖场,公母的比例大约是8:100。母牛当然舒服了,挤挤奶就成。但是这些公牛,却是相当辛苦。正所谓,“吃水不忘挖井人”,如此含辛茹苦的公牛,凭什么就不能被称为奶牛呢? - -
- -所以,今天的问题你听明白了吗?评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/1.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/1.png" deleted file mode 100644 index 945c206e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/1.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/2.jpg" deleted file mode 100644 index e6d7a86f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/3.jpg" deleted file mode 100644 index 328deb91..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/10/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11.md" deleted file mode 100644 index 9b6c93f1..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11.md" +++ /dev/null @@ -1,496 +0,0 @@ ---- -title: LRU缓存机制(146) -date: 2020-06-17 ---- - -> 今天为大家分享很出名的 LRU 算法,第一讲共包括 4 节。 -> -> - LRU概述 -> - LRU使用 -> - LRU实现 -> - Redis近LRU概述 - -## 01、LRU 概述 - -LRU 是 Least Recently Used 的缩写,译为最近最少使用。它的理论基础为“**最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然不会被使用**”由于该思想非常契合业务场景 ,并且可以解决很多实际开发中的问题,所以我们经常通过 LRU 的思想来作缓存,一般也将其称为**LRU缓存机制**。因为恰好 leetcode 上有这道题,所以我干脆把题目贴这里。但是对于 LRU 而言,希望大家不要局限于本题(大家不用担心学不会,我希望能做一个全网最简单的版本,希望可以坚持看下去!)下面,我们一起学习一下。 - -| 第146题:LRU缓存机制 | -| ------------------------------------------------------------ | -| 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作:获取数据 get 和 写入数据 put 。 | - -获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1 。 - -
- -写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 - -
- -进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作? - -
- -**示例:** - -``` -LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); -cache.put(1, 1); -cache.put(2, 2); -cache.get(1); // 返回 1 -cache.put(3, 3); // 该操作会使得密钥 2 作废 -cache.get(2); // 返回 -1 (未找到) -cache.put(4, 4); // 该操作会使得密钥 1 作废 -cache.get(1); // 返回 -1 (未找到) -cache.get(3); // 返回 3 -cache.get(4); // 返回 4 -``` - -## 02、LRU 使用(解释) - -由于我实在担心部分同学完全懵逼零基础,所以我把上面的LRUCache的示例解释一下。 - -第一步:我们申明一个 LRUCache ,长度为 2。 - -PNG - -第二步:我们分别向 cache 里边 put(1,1) 和 put(2,2),这里因为最近使用的是 2( put 也算作使用)所以2在前,1 在后。 - -PNG - -第三步:我们 get(1),也就是我们使用了 1,所以需要将 1 移到前面。 - -PNG - -第四步:此时我们 put(3,3),因为 2 是最近最少使用的,所以我们需要将 2 进行作废。此时我们再 get(2),就会返回 -1 。 - -PNG - -第五步:我们继续 put(4,4),同理我们将 1 作废。此时如果 get(1) ,也是返回 -1 。 - -PNG - -第六步:此时我们 get(3) ,实际为调整 3 的位置。 - -PNG - -第七步:同理,get(4),继续调整 4 的位置。 - -PNG - -## 03、LRU 实现(层层剖析) - -> 上面的图搞了我半小时,基本不是弱智的话,应该都能理解 LRU 的使用了。现在我们聊一下实现。LRU 一般来讲,我们是使用**双向链表**实现。基本上在面试的时候,能写出来双向链表的实现,已经可以打 9 分了。但是这里我要强调的是,其实在项目中,并不绝对是这样。比如 Redis 源码里,LRU 的淘汰策略,就没有使用双向链表,而是使用一种模拟链表的方式。因为 Redis 大多是当内存在用(我知道可以持久化),如果再在内存中去维护一个链表,就平添了一些复杂性,同时也会多耗掉一些内存,后面我会单独拉出来 Redis 的源码给大家分析,这里不细说。 - -
- -回到题目,为什么我们要选择双向链表来实现呢?看看上面的使用步骤图,大家会发现,在整个 LRUCache 的使用中,我们需要**频繁的去调整首尾元素的位置**。而双向链表的结构,刚好满足这一点(再啰嗦一下,前几天我刚好看了 groupcache 的源码,里边就是用双向链表来做的 LRU,当然它里边做了一些改进。groupcache 是memcache 作者实现的 go 版本,如果有 go 的读者,可以去看看源码,还是有一些收获。) - -
- -下面,我们采用 hashmap+ 双向链表的方式进行实现。 - -
- -首先,我们定义一个 LinkNode ,用以存储元素。因为是双向链表,自然我们要定义 pre 和 next。同时,我们需要存储下元素的 key 和 value 。val 大家应该都能理解,关键是为什么需要存储 key?举个例子,比如当整个cache 的元素满了,此时我们需要删除 map 中的数据,需要通过 LinkNode 中的 key 来进行查询,否则无法获取到 key。 - -```go -type LinkNode struct { - key, val int - pre, next *LinkNode -} -``` - -现在有了 LinkNode ,自然需要一个 Cache 来存储所有的 Node。我们定义 cap 为 cache 的长度,m 用来存储元素。head 和 tail 作为 Cache 的首尾。 - -```go -type LRUCache struct { - m map[int]*LinkNode - cap int - head, tail *LinkNode -} -``` - -接下来我们对整个 Cache 进行初始化。在初始化 head 和 tail 的时候将它们连接在一起。 - -```go -func Constructor(capacity int) LRUCache { - head := &LinkNode{0, 0, nil, nil} - tail := &LinkNode{0, 0, nil, nil} - head.next = tail - tail.pre = head - return LRUCache{make(map[int]*LinkNode), capacity, head, tail} -} -``` - -大概是这样: - -PNG - -现在我们已经完成了 Cache 的构造,剩下的就是添加它的 API 了。因为 Get 比较简单,我们先完成 Get 方法。这里分两种情况考虑,如果没有找到元素,我们返回 -1。如果元素存在,我们需要把这个元素移动到首位置上去。 - -```go -func (this *LRUCache) Get(key int) int { - head := this.head - cache := this.m - if v, exist := cache[key]; exist { - v.pre.next = v.next - v.next.pre = v.pre 7 - v.next = head.next - head.next.pre = v         v.pre = head - head.next = v - return v.val - } else { - return -1 - } -} -``` - -大概就是下面这个样子(假若 2 是我们 get 的元素) - -PNG - -我们很容易想到这个方法后面还会用到,所以将其抽出。 - -```go -func (this *LRUCache) AddNode(node *LinkNode) { - head := this.head - //从当前位置删除 - node.pre.next = node.next - node.next.pre = node.pre - //移动到首位置 - node.next = head.next - head.next.pre = node - node.pre = head - head.next = node -} - -func (this *LRUCache) Get(key int) int { - cache := this.m - if v, exist := cache[key]; exist { - this.MoveToHead(v) - return v.val - } else { - return -1 - } -} -``` - -现在我们开始完成 Put。实现 Put 时,有两种情况需要考虑。假若元素存在,其实相当于做一个 Get 操作,也是移动到最前面(**但是需要注意的是,这里多了一个更新值的步骤**)。 - -```go -func (this *LRUCache) Put(key int, value int) { -  head := this.head - tail := this.tail - cache := this.m - //假若元素存在 - if v, exist := cache[key]; exist { - //1.更新值 - v.val = value - //2.移动到最前 - this.MoveToHead(v) - } else { - //TODO - } -} -``` - -假若元素不存在,我们将其插入到元素首,并把该元素值放入到 map 中。 - -```go -func (this *LRUCache) Put(key int, value int) { -  head := this.head - tail := this.tail - cache := this.m - //存在 - if v, exist := cache[key]; exist { - //1.更新值 - v.val = value - //2.移动到最前 - this.MoveToHead(v) - } else { - v := &LinkNode{key, value, nil, nil} - v.next = head.next - v.pre = head - head.next.pre = v - head.next = v - cache[key] = v - } -} -``` - -但是我们漏掉了一种情况,**如果恰好此时Cache中元素满了,需要删掉最后的元素。**处理完毕,附上 Put 函数完整代码。 - -```go -func (this *LRUCache) Put(key int, value int) { -  head := this.head - tail := this.tail - cache := this.m - //存在 - if v, exist := cache[key]; exist { - //1.更新值 - v.val = value - //2.移动到最前 - this.MoveToHead(v) - } else { - v := &LinkNode{key, value, nil, nil} - if len(cache) == this.cap { - //删除最后元素             - delete(cache, tail.pre.key) - tail.pre.pre.next = tail - tail.pre = tail.pre.pre - } - v.next = head.next - v.pre = head - head.next.pre = v - head.next = v - cache[key] = v - } -} -``` - -PNG - -最后,我们完成所有代码: - -```go -type LinkNode struct { - key, val int - pre, next *LinkNode -} - -type LRUCache struct { - m map[int]*LinkNode - cap int - head, tail *LinkNode -} - -func Constructor(capacity int) LRUCache { - head := &LinkNode{0, 0, nil, nil} - tail := &LinkNode{0, 0, nil, nil} - head.next = tail - tail.pre = head - return LRUCache{make(map[int]*LinkNode), capacity, head, tail} -} - -func (this *LRUCache) Get(key int) int { - cache := this.m - if v, exist := cache[key]; exist { - this.MoveToHead(v) - return v.val - } else { - return -1 - } -} -func (this *LRUCache) AddNode(node *LinkNode) { - head := this.head - //从当前位置删除 - node.pre.next = node.next - node.next.pre = node.pre - //移动到首位置 - node.next = head.next - head.next.pre = node - node.pre = head - head.next = node -} -func (this *LRUCache) Put(key int, value int) { -  head := this.head - tail := this.tail - cache := this.m - //存在 - if v, exist := cache[key]; exist { - //1.更新值 - v.val = value - //2.移动到最前 - this.MoveToHead(v) - } else { - v := &LinkNode{key, value, nil, nil} - if len(cache) == this.cap { - //删除最后元素             - delete(cache, tail.pre.key) - tail.pre.pre.next = tail - tail.pre = tail.pre.pre - } - v.next = head.next - v.pre = head - head.next.pre = v - head.next = v - cache[key] = v - } -} -``` - -优化后: - -```g -type LinkNode struct { - key, val int - pre, next *LinkNode -} - -type LRUCache struct { - m map[int]*LinkNode - cap int - head, tail *LinkNode -} - -func Constructor(capacity int) LRUCache { - head := &LinkNode{0, 0, nil, nil} - tail := &LinkNode{0, 0, nil, nil} - head.next = tail - tail.pre = head - return LRUCache{make(map[int]*LinkNode), capacity, head, tail} -} - -func (this *LRUCache) Get(key int) int { - cache := this.m - if v, exist := cache[key]; exist { - this.MoveToHead(v) - return v.val - } else { - return -1 - } -} - -func (this *LRUCache) RemoveNode(node *LinkNode) { - node.pre.next = node.next - node.next.pre = node.pre -} - -func (this *LRUCache) AddNode(node *LinkNode) { - head := this.head - node.next = head.next - head.next.pre = node - node.pre = head - head.next = node -} - -func (this *LRUCache) MoveToHead(node *LinkNode) { - this.RemoveNode(node) - this.AddNode(node) -} - -func (this *LRUCache) Put(key int, value int) { - tail := this.tail - cache := this.m - if v, exist := cache[key]; exist { - v.val = value - this.MoveToHead(v) - } else { - v := &LinkNode{key, value, nil, nil} - if len(cache) == this.cap { - delete(cache, tail.pre.key) - this.RemoveNode(tail.pre) - } - this.AddNode(v) - cache[key] = v - } -} -``` - -执行结果: - -PNG - -因为该算法过于重要,给一个 Java 版本的: - -```go -//java版本 -import java.util.Hashtable; -public class LRUCache { - class DLinkedNode { - int key; - int value; - LinkedNode prev; - LinkedNode next; - } - - private void addNode(DLinkedNode node) { - node.prev = head; - node.next = head.next; - head.next.prev = node; - head.next = node; - } - - private void removeNode(DLinkedNode node){ - LinkedNode prev = node.prev; - LinkedNode next = node.next; - prev.next = next; - next.prev = prev; - } - - private void moveToHead(DLinkedNode node){ - removeNode(node); - addNode(node); - } - - private DLinkedNode popTail() { - DLinkedNode res = tail.prev; - removeNode(res); - return res; - } - - private Hashtable cache = - new Hashtable(); - private int size; - private int capacity; - private DLinkedNode head, tail; - - public LRUCache(int capacity) { - this.size = 0; - this.capacity = capacity; - head = new DLinkedNode(); - tail = new DLinkedNode(); - head.next = tail; - tail.prev = head; - } - - public int get(int key) { - DLinkedNode node = cache.get(key); - if (node == null) return -1; - moveToHead(node); - return node.value; - } - - public void put(int key, int value) { - DLinkedNode node = cache.get(key); - - if(node == null) { - DLinkedNode newNode = new DLinkedNode(); - newNode.key = key; - newNode.value = value; - cache.put(key, newNode); - addNode(newNode); - ++size; - if(size > capacity) { - DLinkedNode tail = popTail(); - cache.remove(tail.key); - --size; - } - } else { - node.value = value; - moveToHead(node); - } - } -} - -``` - -## 04、Redis 近LRU 介绍 - -> 上文完成了咱们自己的 LRU 实现,现在现在聊一聊 Redis 中的近似 LRU 。由于**真实LRU需要过多的内存(在数据量比较大时)**,所以 Redis 是使用一种随机抽样的方式,来实现一个近似 LRU 的效果。说白了,LRU 根本只是一个**预测键访问顺序的模型**。 - -在 Redis 中有一个参数,叫做 “maxmemory-samples”,是干嘛用的呢? - -``` -# LRU and minimal TTL algorithms are not precise algorithms but approximated  # algorithms (in order to save memory), so you can tune it for speed or  # accuracy. For default Redis will check five keys and pick the one that was  # used less recently, you can change the sample size using the following  # configuration directive.  6#  # The default of 5 produces good enough results. 10 Approximates very closely  # true LRU but costs a bit more CPU. 3 is very fast but not very accurate.  # 10maxmemory-samples 5 -``` - -上面我们说过了,**近似LRU是用随机抽样的方式来实现一个近似的LRU效果**。这个参数其实就是作者提供了一种方式,可以让我们人为干预样本数大小,将其设的越大,就越接近真实 LRU 的效果,当然也就意味着越耗内存。(初始值为 5 是作者默认的最佳) - -PNG - -这个图解释一下,绿色的点是新增加的元素,深灰色的点是没有被删除的元素,浅灰色的是被删除的元素。最下面的这张图,是真实 LRU 的效果,第二张图是默认该参数为 5 的效果,可以看到浅灰色部分和真实的契合还是不错的。第一张图是将该参数设置为 10 的效果,已经基本接近真实 LRU 的效果了。 - -
- -今天基本就说到这里。那 Redis 中的近似 LRU 是如何实现的呢?因为时间的关系,我打算做到下一期的内容。最后,评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/1.jpg" deleted file mode 100644 index a62f8bca..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/10.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/10.jpeg" deleted file mode 100644 index f48b8b94..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/10.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/11.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/11.jpeg" deleted file mode 100644 index 08fb8ddf..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/11.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/12.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/12.jpeg" deleted file mode 100644 index 5f37ea5b..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/12.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/2.png" deleted file mode 100644 index 53c5b9dc..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/3.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/3.png" deleted file mode 100644 index 148c86ca..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/3.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/4.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/4.png" deleted file mode 100644 index eb8f2bef..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/4.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/5.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/5.png" deleted file mode 100644 index 726ce84e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/5.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/6.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/6.png" deleted file mode 100644 index 1d9f0466..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/6.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/7.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/7.png" deleted file mode 100644 index 23a057a6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/7.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/8.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/8.png" deleted file mode 100644 index a2bb580c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/8.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/9.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/9.jpeg" deleted file mode 100644 index 60d39f14..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/11/9.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12.md" deleted file mode 100644 index 754ca5ad..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12.md" +++ /dev/null @@ -1,210 +0,0 @@ ---- -title: 最小的k个数 -date: 2020-06-18 ---- - -> 今天分享一道比较简单的题目,希望大家可以5分钟掌握! - -## 01、题目示例 - -| 最小的k个数 | -| ------------------------------------------------------------ | -| 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 | - -**示例 1:** - -``` -输入:arr = [3,2,1], k = 2 -输出:[1,2] 或者 [2,1] -``` - -**示例 2:** - -``` -输入:arr = [0,1,2,1], k = 1 -输出:[0] -``` - -**限制:** - -``` -0 <= k <= arr.length <= 10000 -0 <= arr[i] <= 10000 -``` - -## 02、堆和大小顶堆 - -> 这道题出自《剑指offer》,是一道非常高频的题目。可以通过排序等多种方法求解。但是这里,我们使用较为经典的**大顶堆(大根堆)**解法进行求解。因为我知道有很多人可能一脸懵逼,所以,我们先复习一下大顶堆。 - -首先复习一下**堆**,堆(Heap)是计算机科学中一类特殊的数据结构的统称,我们通常是指一个可以被看做一棵**完全二叉树**的数组对象。如果不记得什么是完全二叉树,可以复习这篇: - -[二叉树第七讲 - 完全二叉树(222)](1.4/407.md) - -堆的特性是**父节点的值总是比其两个子节点的值大或小**。如果父节点比它的两个子节点的值都要大,我们叫做**大顶堆**。如果父节点比它的两个子节点的值都要小,我们叫做**小顶堆**。 - -PNG - -我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子。 - -PNG - -大顶堆,满足以下公式: - ->
arr[i] >= arr[2i 1] && arr[i] >= arr[2i 2]
- -小顶堆也一样: - -PNG - -小顶堆,满足以下公式: - ->
arr[i] <= arr[2i 1] && arr[i] <= arr[2i 2]
- -## 03、题目分析 - -> 上面我们学习了大顶堆,现在考虑如何用大根堆进行求解。 - -首先,我们创建一个大小为k的大顶堆。假如数组为[4,5,1,6,2,7,3,8],k=4。大概是下面这样: - -PNG - -我想肯定这里有不知道如何建堆的同学。记住:**对于一个没有维护过的堆(完全二叉树),我们可以从其最后一个节点的父节点开始进行调整**。这个不需要死记硬背,其实就是一个层层调节的过程。 - -
- -从最后一个节点的父节点调整 - -PNG - -继续向上调整 - -PNG - -继续向上调整 - -PNG - -建堆 调整的代码大概就是这样:(翻Java牌子) - -```java -//建堆。对于一个还没维护过的堆,从他的最后一个节点的父节点开始进行调整。 -private void buildHeap(int[] nums) { - //最后一个节点 - int lastNode = nums.length - 1; - //记住:父节点 = (i - 1) / 2  左节点 = 2 * i   1  右节点 = 2 * i   2; - //最后一个节点的父节点 7 - int startHeapify = (lastNode - 1) / 2; - while (startHeapify >= 0) { - //不断调整建堆的过程 - heapify(nums, startHeapify--); - } -} -    //调整大顶堆的过程 -private void heapify(int[] nums, int i) { - //和当前节点的左右节点比较,如果节点中有更大的数,那么交换,并继续对交换后的节点进行维护 - int len = nums.length; - if (i >= len) - return; - //左右子节点 - int c1 = ((i << 1)   1), c2 = ((i << 1)   2); - //假定当前节点最大 - int max = i; - //如果左子节点比较大,更新max = c1; - if (c1 < len && nums[c1] > nums[max]) max = c1; - //如果右子节点比较大,更新max = c2; - if (c2 < len && nums[c2] > nums[max]) max = c2; - //如果最大的数不是节点i的话,那么heapify(nums, max),即调整节点i的子树。 - if (max != i) { - swap(nums, max, i); - //递归处理 - heapify(nums, max); - } -} -private void swap(int[] nums, int i, int j) { - nums[i] = nums[i]   nums[j] - (nums[j] = nums[i]); -} -``` - -然后我们从下标 k 继续开始依次遍历数组的剩余元素。**如果元素小于堆顶元素,那么取出堆顶元素,将当前元素入堆**。在上面的示例中 ,因为2小于堆顶元素6,所以将2入堆。我们发现现在的完全二叉树不满足大顶堆,所以对其进行调整。 - -
- -调整前 - -PNG - -调整后 - -PNG - -继续重复上述步骤,依次将7,3,8入堆。这里因为7和8都大于堆顶元素5,所以只有3会入堆。 - -
- -调整前 - -PNG - -调整后 - -PNG - -最后得到的堆,就是我们想要的结果。由于堆的大小是 K,所以这里空间复杂度是O(K),时间复杂度是O(NlogK)。 - -
- -根据分析,完成代码: - -```java -//java -class Solution { - public int[] getLeastNumbers(int[] arr, int k) { - if (k == 0) - return new int[0]; - int len = arr.length; - if (k == len) - return arr; - //对arr数组的前k个数建堆         - int[] heap = new int[k]; - System.arraycopy(arr, 0, heap, 0, k); - buildHeap(heap); - - //对后面较小的树建堆 - for (int i = k; i < len; i++) { - if (arr[i] < heap[0]) { - heap[0] = arr[i]; - heapify(heap, 0); - } - } - //返回这个堆 - return heap; - } - private void buildHeap(int[] nums) { - int lastNode = nums.length - 1; - int startHeapify = (lastNode - 1) / 2; - while (startHeapify >= 0) { - heapify(nums, startHeapify--); - } - } - private void heapify(int[] nums, int i) { - int len = nums.length; - if (i >= len) - return; - int c1 = ((i << 1)   1), c2 = ((i << 1)   2); - int max = i; - if (c1 < len && nums[c1] > nums[max]) max = c1; - if (c2 < len && nums[c2] > nums[max]) max = c2; - if (max != i) { - swap(nums, max, i); - heapify(nums, max); - } - } - private void swap(int[] nums, int i, int j) { - nums[i] = nums[i]   nums[j] - (nums[j] = nums[i]); - } -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/1.jpg" deleted file mode 100644 index 2c312338..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/10.jpg" deleted file mode 100644 index 0fa478ab..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/11.jpg" deleted file mode 100644 index a6508f8e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/12.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/12.jpg" deleted file mode 100644 index 99bd8b8f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/12.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/2.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/2.png" deleted file mode 100644 index 1798db8e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/2.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/3.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/3.png" deleted file mode 100644 index 3066590f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/3.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/4.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/4.png" deleted file mode 100644 index eae03abc..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/4.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/5.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/5.png" deleted file mode 100644 index fca9c44c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/5.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/6.jpg" deleted file mode 100644 index 6e66eb62..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/7.jpg" deleted file mode 100644 index ebdd1f16..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/8.jpg" deleted file mode 100644 index b6797c1c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/9.png" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/9.png" deleted file mode 100644 index 4b0267aa..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/12/9.png" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13.md" deleted file mode 100644 index 00a65d35..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13.md" +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: 不同路径 -date: 2020-06-18 ---- - -> 今天为大家分享一道BAT常考题目,不同路径。 - -## 01、题目示例 - -该题很容易出现在各大厂的面试中,一般会要求手写,所以需要完整掌握。 - -| 不同路径 | -| ------------------------------------------------------------ | -| 一个机器人位于一个 m x n 网格的左上角,起始点在下图中标记为“Start”。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,在下图中标记为“Finish”。 问:总共有多少条不同的路径? | - -PNG - -例如,上图是一个7 x 3 的网格。有多少可能的路径? - -
- -**说明:**m 和 n 的值均不超过 100。 - -
- -**示例 1:** - -``` -输入: m = 3, n = 2 -输出: 3 - -解释: -从左上角开始,总共有 3 条路径可以到达右下角。 -\1. 向右 -> 向右 -> 向下 -\2. 向右 -> 向下 -> 向右 -\3. 向下 -> 向右 -> 向右 -``` - -**示例 2:** - -``` -输入: m = 7, n = 3 -输出: 28 -``` - -## 02、题目分析 - -> 这道题属于相当标准的动态规划,虽然还有一些公式法等其他解法,但是如果面试官问到,基本就是想考察你的动态规划。 - -拿到题目,首先定义状态。因为有横纵坐标,明显属于二维DP。我们定义**DP[i][j]表示到达i行j列的最多路径**。同时,因为第0行和第0列都只有一条路径,所以需要初始化为1。 - -PNG - -状态转移方程一目了然,dp[i][j] = dp[i-1][j] dp[i][j-1]。(想象你站在一个十字路口,到达这个十字路口可能的所有路径,就是从东南西北四个方向过来可能出现的所有路径和。放在这道题里,其实就是砍掉东南。) - -PNG - -根据分析,完成代码: - -```go -//go -func uniquePaths(m int, n int) int { - dp := make([][]int, m) - for i := 0; i < m; i   { - dp[i] = make([]int, n) - } - for i := 0; i < m; i   { - dp[i][0] = 1 - } - for j := 0; j < n; j   { - dp[0][j] = 1 - } - for i := 1; i < m; i   { - for j := 1; j < n; j   { - dp[i][j] = dp[i-1][j]   dp[i][j-1] - } - } - return dp[m-1][n-1] -} -``` - -执行结果: - -PNG - -## 03、代码优化 - -> 上面的答案,如果在面试时给出,可以给到7分,后面3分怎么拿,我们真的需要用一个二维数组来存储吗?一起看下! - -在上文中,我们使用**二维数组**记录状态。但是这里观察一下,每一个格子可能的路径,**都是由左边的格子和上面的格子的总路径计算而来, 对于之前更早的数据,其实已经用不到了**。如下图,计算第三行时,已经用不到第一行的数据了。 - -PNG - -那我们只要能定义一个状态,同时可以表示左边的格子和上面的格子,是不是就可以解决问题?所以我们定义状态dp[j],用来表示**当前行到达第j列的最多路径**。这个“当前行”三个字很重要,比如我们要计算dp[3],因为还没有计算出,所以这时dp[3]保存的其实是4(上一行的数据),而dp[2]由于已经计算出了,所以保存的是6(当前行的数据)。理解了这个,就理解如何压缩状态。 - -PNG - -最后,根据分析得出代码: - -```go -//go -func uniquePaths(m int, n int) int { - dp := make([]int, n) - for j := 0; j < n; j   { - dp[j] = 1 - } - for i := 1; i < m; i   { - for j := 1; j < n; j   { - //注意,这里dp[j-1]已经是新一行的数据了,而dp[j]仍然是上一行的数据 - dp[j]  = dp[j - 1] - } - } - return dp[n-1] -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/1.jpg" deleted file mode 100644 index 2c06c4f7..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/2.jpg" deleted file mode 100644 index dfddcd12..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/3.jpg" deleted file mode 100644 index 2c5f573a..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/4.jpg" deleted file mode 100644 index 95c7ebd9..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/5.jpg" deleted file mode 100644 index 21c9f9e2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/6.jpg" deleted file mode 100644 index 5d625e1a..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/7.jpg" deleted file mode 100644 index e72003d2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/13/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14.md" deleted file mode 100644 index 9c7fe697..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14.md" +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: 不同路径 - 障碍物 -date: 2020-06-18 ---- - -上一篇为大家分享了不同路径的DP解法之后,有很多小伙伴后台给我留言,说直接用公式法一步就可以得到答案。给你们点个赞!确实是这样,我没有用公式法的原因,是因为我的目的是想层层推进难度为大家分析不同路径这一类题型。后面我会单独拉出一系列,专门为大家讲解公式法一类的题目。 - -
- -如果还没有学习上一篇内容,建议先进行学习: - -[不同路径](1.99/13.md) - -## 01、题目示例 - -> 多了一点障碍物之后,题目会有何不同?(这可是困难题目哦~ - -| 不同路径 - 障碍物 | -| ------------------------------------------------------------ | -| 一个机器人位于一个 m x n 网格的左上角,起始点在下图中标记为“Start”。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,在下图中标记为“Finish”。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 问总共有多少条不同的路径? | - -PNG - -网格中的障碍物和空位置分别用 1 和 0 来表示。 - -
- -**说明:**m 和 n 的值均不超过 100。 - -
- -**示例 1:** - -``` -输入: -[ - [0,0,0], - [0,1,0], - [0,0,0] -] -输出: 2 - -解释: -3x3 网格的正中间有一个障碍物。 -从左上角到右下角一共有 2 条不同的路径: -\1. 向右 -> 向右 -> 向下 -> 向下 -\2. 向下 -> 向下 -> 向右 -> 向右 -``` - -## 02、题目分析 - -> 因为只是多了一点障碍物,题目的本质并没什么不同,所以直接进行分析即可。 - -首先我们还是定义状态,**用****DP[i][j]表示到达i行j列的最多路径**。同时,因为第0行和第0列都只有一条路径,所以需要初始化为1。但有一点不一样的就是:**如果在0行0列中遇到障碍物,后面的就都是0,意为此路不通**。 - -PNG - -完成了初始化,下面就是状态转移方程。和没有障碍物的相比没什么特别的,仍然是dp[i][j] = dp[i-1][j] dp[i][j-1]。唯一需要处理的是:**如果恰好[i][j]位置上有障碍物,则dp[i][j]为0**。比如下图,有dp[1][2]为0。 - -PNG - -根据分析,得出代码:(今天翻java牌子) - -```java -//JAVA -class Solution { - public int uniquePathsWithObstacles(int[][] obstacleGrid) { - int m = obstacleGrid.length; - int n = obstacleGrid[0].length; - int[][] dp = new int[m][n]; - if (obstacleGrid[0][0] != 1) { - dp[0][0] = 1; - } - for (int j = 1; j < n; j  ) { - dp[0][j] = obstacleGrid[0][j] == 1 ? 0 : dp[0][j - 1]; - } - for (int i = 1; i < m; i  ) { - dp[i][0] = obstacleGrid[i][0] == 1 ? 0 : dp[i - 1][0]; - } - for (int i = 1; i < m; i  ) { - for (int j = 1; j < n; j  ) { - dp[i][j] = obstacleGrid[i][j] == 1 ? 0 : dp[i - 1][j]   dp[i][j - 1]; - } - } - return dp[m - 1][n - 1]; - } -} -``` - -执行结果: - -PNG - -## 03、代码优化 - -> 不啰嗦,我们当然要继续**压缩内存**。 - -为了大家更好的理解代码,我们还是绘图说明。假若我们的网格如下,其中黑色表示障碍物。 - -PNG - -因为计算每一个格子能到达的最多路径,只需要左边和上边的元素,所以我们定义状态**dp[j]表示到达当前行第j位置的最多路径**。这里有一个需要额外说的,就是我们把dp[0]初始化为1,因为在到达第一行的第一个元素时,路径只有一个。下面的图,左边的表示当前网格,右边的是指网格中对应dp数组的值。 - -PNG - -根据分析,得出代码: - -```java -//JAVA -class Solution {      - public int uniquePathsWithObstacles(int[][] obstacleGrid) { - int m = obstacleGrid.length; - int n = obstacleGrid[0].length; - int[] dp = new int[n]; - dp[0] = 1; - for (int[] ints : obstacleGrid) { - for (int j = 0; j < n; j  ) { - if (ints[j] == 1) { - dp[j] = 0; - } else if (j > 0) { - dp[j]  = dp[j - 1]; - } - } - } - return dp[n - 1]; - } -} -``` - -
- -**思考:**上面的代码其实还可以优化内存,大家想想怎么做 \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/1.jpg" deleted file mode 100644 index 46b98652..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/2.jpg" deleted file mode 100644 index 4763de6c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/3.jpg" deleted file mode 100644 index d07f42b8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/4.jpg" deleted file mode 100644 index 973e2934..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/5.jpg" deleted file mode 100644 index d0e01415..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/6.jpg" deleted file mode 100644 index 7f1a068f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/14/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15.md" deleted file mode 100644 index b79af801..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15.md" +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: 伪蒙特卡洛 -date: 2020-06-28 ---- - -> 分享一道由群员“Melbourne”,外号 “Paper Machine”,有数学小王子之称的小伙伴分享的题目! - -
- -**特别说明:本文非原创,经投稿者同意后发表。** - -## 01、算法介绍 - -> 期望:在概率论和统计学中,数学期望(mean)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。 - -
- -| 题目:在1*1的正方形中随机撒三个点,两两点都可构成长方形的一组对顶点,这样一共有三个长方形,需要求面积第二大的长方形的面积的期望。 | -| ------------------------------------------------------------ | -| 算法:每次随机三个点,计算第二大面积,最后统计期望。 | - -## 02、蒙特卡洛 - -> 蒙特卡罗法也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡罗是摩纳哥的著名赌城,该法为表明其随机抽样的本质而命名。故适用于对离散系统进行计算仿真试验。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。 - -
- -蒙特卡洛方法(Monte Carlo Method) 指的是一类使用随机变量解决概率问题的方法。比较常见的是计算积分、计算概率、计算期望等问题。 - -
- -常见的蒙特卡洛方法依赖于随机变量的“随机性”,即未发生的事件无法根据已有信息进行预测,比如抛硬币、掷骰子等。在计算机中,常见的随机数是由一系列确定性算法进行生成的,通常称之为伪随机数(pseudo random number)。由于计算精度有限,且这些随机数在统计意义上“不够随机”,会出现可预测的重复序列,这些数在统计意义上收敛精度有限。 - -
- -与常见的蒙特卡洛方法不同的是,伪蒙特卡洛使用了低差异序列(low discrepancy sequence,常见的有halton序列、sobol序列等),不使用常见的(伪)随机数,其收敛速率更快(记 N 为样本数量,伪蒙特卡洛收敛速率可达PNG,而普通蒙特卡洛方法收敛速率仅为 PNG。另一个最重要的性质是伪蒙特卡洛使用的低差异序列是可复现的(replicable),即不会随环境改变而改变,没有随机种子;而普通蒙特卡洛使用的伪随机数会因随机种子不同而导致结果不同,收敛效果也不尽相同。 - -## 03、题目分析 - -> 本算法利用伪蒙特卡洛完成。 - -
- -CPP代码如下: - -```c -#include  -#include  -#include  -#include  -#include  -const int UP=100; -bool sieve[UP 100]; -int primes[UP],top=0; -void init() -{ - for (int i=2;i<=UP;  i) - if (!sieve[i]) - { - primes[top  ]=i; - for (int j=i;j<=UP/i;  j) - sieve[i*j]=true; - } -} -std::vector halton(long long i,const int &dim) -{ - assert(dim<=top); - std::vector prime_inv(dim,0),r(dim,0); - std::vector t(dim,i); - for (int j=0;j &t)->long long { - long long ret=0; - for (const auto &e:t) - ret =e; - return ret; - }; - for (;f(t)>0;) - for (int j=0;j li=halton(idx,6); - double area1=fabs((li.at(0)-li.at(2))*(li.at(1)-li.at(3))); - double area2=fabs((li.at(0)-li.at(4))*(li.at(1)-li.at(5))); - double area3=fabs((li.at(2)-li.at(4))*(li.at(3)-li.at(5))); - double w=area1 area2 area3-std::max(std::max(area1,area2),area3)-std::min(std::min(area1,area2),area3); - return w; -} -const int BATCH=100000; -const int THREADS=40; -int main() -{ - init(); - double total=0; - for (long long trial=0;;) - { - std::vector li(THREADS,0); - omp_set_dynamic(0); - omp_set_num_threads(THREADS); - #pragma omp parallel for - for (long long thread=0;thread - -分析:使用了并行计算,批量跑随机实验,速度大大提升。其中halton函数会生成halton低差异序列,其值域为[0,1],参数i表示第i个抽样,dim表示生成数据的维度(本例中每次实验需要6个点,使用6维数据点即可),不同样本之间**互不影响**,故可使用并行计算提速。 - -
- -\#表示随机试验次数×10^7,Avg表示第二大面积的平均值,Err表示与真实值的绝对误差×10^(-10)。 - -
- -| # | Avg | Err | # | Avg | Err | -| :--: | :----------: | :--: | :--: | :----------: | :--: | -| 1 | 0.1017786804 | 55 | 2 | 0.1017786707 | 152 | -| 3 | 0.1017786905 | 46 | 4 | 0.1017786889 | 30 | -| 5 | 0.1017786809 | 50 | 6 | 0.1017786836 | 23 | -| 7 | 0.1017786849 | 10 | 8 | 0.1017786868 | 9 | -| 9 | 0.1017786799 | 60 | 10 | 0.1017786837 | 22 | -| 11 | 0.1017786845 | 14 | 12 | 0.1017786839 | 20 | -| 13 | 0.1017786874 | 15 | 14 | 0.1017786839 | 20 | -| 15 | 0.1017786848 | 11 | 16 | 0.1017786868 | 9 | -| 17 | 0.1017786851 | 8 | 18 | 0.1017786863 | 4 | -| 19 | 0.1017786854 | 5 | 20 | 0.1017786887 | 28 | -| 21 | 0.1017786858 | 1 | 22 | 0.1017786844 | 15 | -| 23 | 0.1017786841 | 18 | 24 | 0.1017786852 | 7 | -| 25 | 0.1017786849 | 10 | 26 | 0.101778684 | 19 | -| 27 | 0.1017786838 | 21 | 28 | 0.1017786852 | 7 | -| 29 | 0.1017786838 | 21 | 30 | 0.1017786846 | 13 | -| 31 | 0.1017786859 | 0 | 32 | 0.1017786862 | 3 | -| 33 | 0.1017786859 | 0 | 34 | 0.1017786853 | 6 | -| 35 | 0.1017786854 | 5 | 36 | 0.1017786859 | 0 | -| 37 | 0.101778685 | 9 | 38 | 0.1017786854 | 5 | -| 39 | 0.1017786853 | 6 | 40 | 0.1017786858 | 1 | -| 41 | 0.1017786848 | 11 | 42 | 0.1017786851 | 8 | -| 43 | 0.1017786847 | 12 | 44 | 0.1017786841 | 18 | -| 45 | 0.101778685 | 9 | 46 | 0.1017786842 | 17 | -| 47 | 0.1017786852 | 7 | 48 | 0.1017786848 | 11 | -| 49 | 0.1017786854 | 5 | 50 | 0.1017786851 | 8 | -| 51 | 0.1017786842 | 17 | 52 | 0.1017786844 | 15 | - -可以看到,在实验次之后,收敛精度可达**9**位小数,非常精确。由于使用的随机数“不够随机”,普通的蒙特卡洛在同样的实验次数下仅能收敛至五位小数的精度。 - -
- -上述方法可扩展至其他随机问题中,非常实用且高效,欢迎大家讨论! - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15/1.jpg" deleted file mode 100644 index 841fb145..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15/2.jpg" deleted file mode 100644 index 77ad3df6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/15/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16.md" deleted file mode 100644 index cbb7c3d4..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16.md" +++ /dev/null @@ -1,117 +0,0 @@ ---- - -title: 盛最多水的容器 -date: 2020-06-19 ---- - -> 今天为大家分享一道鹅厂的面试题。话不多说,直接看题目。 - -## 01、题目示例 - -> 这道题目会了的朋友可能觉得很简单,但是我觉得这题实在很经典,所以还是得拿出来讲讲。还有一个进阶版本“接雨水”,将在后面为大家讲解。 - -| 盛最多水的容器 | -| ------------------------------------------------------------ | -| 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 | - -说明:你不能倾斜容器,且 n 的值至少为 2。 - -PNG - -图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 - -
- -**示例:** - -``` -输入:[1,8,6,2,5,4,8,3,7] -输出:49 -``` - -## 02、题目分析 - -> 观察可得,垂直的两条线段将会与坐标轴构成一个矩形区域,较短线段的长度将会作为矩形区域的宽度,两线间距将会作为矩形区域的长度,我们求解容纳水的最大值,实为找到该矩形最大化的区域面积。 - -首先,本题自然可以暴力求解,只要**找到每对可能出现的线段组合,然后找出这些情况下的最大面积**。这种解法直接略过,大家有兴趣可以下去自己尝试。这道题比较经典是是使用双指针进行求解,已经会的朋友不妨复习复习。 - -
- -假若我们的数组为:[1 8 6 2 5 4 8 3 7],长这样: - -PNG - -首先,我们初始化两个指针,分别指向两边,构成我们的第一个矩形区域。 - -PNG - -我们尝试将长的一侧向短的一侧移动,发现对于区域面积增加没有任何意义。比如下图: - -PNG - -所以我们选择将短的一侧向长的一侧移动。根据木桶原理,水的高度取决于短的一侧。 - -PNG - -继续重复这个过程,我们总是**选择将短的一侧向长的一侧移动**。并且在每一次的移动中,我们记录下来当前面积大小。(下面这些图,都是我拿PPT一张张做的....) - -PNG - -PNG - -PNG - -PNG - -PNG - -一直到两个棒子撞在一起。 - -PNG - -根据分析,得到代码:(翻Java牌子) - -```java -//JAVA -class Solution { - public int maxArea(int[] height) { - int i = 0, j = height.length - 1, res = 0; - while(i < j){ - res = height[i] < height[j] ?  - Math.max(res, (j - i) * height[i  ]):  - Math.max(res, (j - i) * height[j--]);  - } - return res; - } -} -``` - -## 03、反证法证明 - -> 可能有的朋友想让我证明一下。其实我觉得,这就是个木桶原理。木桶原理:**一只水桶能装多少水取决于它最短的那块木板**。 - -PNG - -采用反证法进行证明: - -PNG - ->
area = h(m) * w
- -移动n到n,如果n比m短,则有: - -area = h(n) * (w-1) - -有 area < area - -PNG - -移动n到n,如果n比m长,则有: - -area = h(m) * (w-1) - -有 area < area - -PNG - -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/1.jpg" deleted file mode 100644 index 976079a5..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/10.jpg" deleted file mode 100644 index 7cb84233..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/11.jpg" deleted file mode 100644 index 1fb433a5..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/12.jpeg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/12.jpeg" deleted file mode 100644 index 0db49e3e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/12.jpeg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/13.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/13.jpg" deleted file mode 100644 index a28d9060..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/13.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/14.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/14.jpg" deleted file mode 100644 index 3f100251..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/14.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/15.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/15.jpg" deleted file mode 100644 index a9c89bda..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/15.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/2.jpg" deleted file mode 100644 index 40cc348f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/3.jpg" deleted file mode 100644 index d1367eff..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/4.jpg" deleted file mode 100644 index 3ceaf63a..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/5.jpg" deleted file mode 100644 index a6d4baeb..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/6.jpg" deleted file mode 100644 index 807a2034..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/7.jpg" deleted file mode 100644 index d96c77a4..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/8.jpg" deleted file mode 100644 index 86afcde8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/9.jpg" deleted file mode 100644 index 0c70e970..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/16/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17.md" deleted file mode 100644 index 2e9c6762..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17.md" +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: 扑克牌中的顺子容器 -date: 2020-06-19 ---- - -> 今天给分享一道比较简单的扑克牌题目。 - -## 01、题目示例 - -> 拿到题目的小伙伴,可能觉得“我次奥”,这特么也能出一道题 ?不得不说《贱止offer》,嗯....不错! - -| 扑克牌中的顺子 | -| ------------------------------------------------------------ | -| 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。 | - -**示例 1:** - -``` -输入: [1,2,3,4,5] -输出: True -``` - -**示例 2:** - -``` -输入: [0,0,1,2,5] -输出: True -``` - -**限制:** - -``` -数组长度为 5 -数组的数取值为 [0, 13] -``` - -## 02、题目分析 - -> 题目就是找一个顺子....啥?你不知道什么是顺子,看下面这个。 - -顺子长这样: - -PNG - -因为此题本身属于简单到要屎系列,所以直接给题解。数组长度限制了是5,非常省事,意味着我们不需要一些额外的处理。拿到牌,第一个想法是啥?排序!我想打过牌的人,都会知道这点(想象那个插插插的过程)。**因为是5连,无论接没接到大小王,最小值和最大值之间,一定小于5**。 - -PNG - -排序后,我们通过累积每两张牌之间的差值,来计算最小值和最大值中间的总差值。 - -PNG - -拿到了王,就相当于拿到了通行证,直接跳过。 - -
- -因为是排序的牌,如果接到对子,也就意味着不是五连,直接返回false。(怎么每次说到五连,我就想到“penta kill” ) - -PNG - -根据分析,得出代码:(翻个go的牌子吧) - -```go -//go -func isStraight(nums []int) bool { - sort.Ints(nums) - sub := 0 - for i := 0; i < 4; i   { - if nums[i] == 0 { - continue - } - if nums[i] == nums[i 1] { - return false - } - sub  = nums[i 1] - nums[i] - } - return sub < 5 -} -``` - -执行结果: - -PNG - -## 03、不排序咋整 - -> “没吃过猪肉,也见过猪跑”这句话来源于《红楼梦》第十六回,有云:“偏你又怕他不在行了。谁都是在行的?孩子们这么大了,没吃过猪肉,也见过猪跑。” - -没吃过猪肉还没见过猪跑么,一模一样的整法!和排序本质上没啥区别,还是**通过计算最大值和最小值之间的差值,来判断是否为五连**。唯一的区别,是需要记录一些数据。包括:用数组或者map记录下是否有重复牌,记录下最大值和最小值用来做最终差值计算。 - -
- -直接给代码:(好奇c 有木有人看?) - -```c -//C   -class Solution { - public: - bool isStraight(vector& nums) { - vector arr(14,0); - for(int i = 0; i < nums.size();  i){ - arr[nums[i]]  ; - } - for(int i = 1;i < 14;  i){ - if(arr[i] > 1) - return false; - } - int min = 1,max = 13; - while(min < 14 && arr[min] == 0) min  ; - while(max >= 0 && arr[max] == 0) max--; - return max - min <= 4; - } -}; -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/1.jpg" deleted file mode 100644 index 138432d6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/2.jpg" deleted file mode 100644 index 39d19bef..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/3.jpg" deleted file mode 100644 index aa55d885..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/4.jpg" deleted file mode 100644 index 4970f2fd..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/5.jpg" deleted file mode 100644 index da58edc5..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/6.jpg" deleted file mode 100644 index ae047975..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/17/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18.md" deleted file mode 100644 index 801c1f31..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18.md" +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: 整数拆分(343) -date: 2020-06-19 ---- - -> 能跟着看到现在,大家都有点疲惫了。为了提高各位积极性,我打算每天在文首放一张女神的图(不为别的,只为激励大家,毕竟美女对男女都是通杀的。祝大家早日拿到理想offer,实现人生赢家)话不多说,直接看题! - -## 01、题目示例 - -> 这两天越来越多的读者私信小浩,说觉得只看题的话,不是很系统,想让我系统的讲一讲各类数据结构。对于这个问题,我统一回复一下,首先**后面肯定是有系统的讲解各类数据结构的打算的**,这个目前正在筹划中,所以大家请放心!另外对于看题,如果担心缺乏基础知识看不懂的朋友们,大家请一万个放心。老读者都知道,我讲题,一般都是会把这个题涉及到的基础知识都给你过一遍的。当然后面我也会用系列篇,把这些题目再串起来,所以大家还是耐心点的去看。记住,干就对了! - -| 第343题:整数拆分 | -| ------------------------------------------------------------ | -| 给定一个正整数 *n*,将其拆分为**至少**两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。 | - -**示例 1:** - -``` -输入: 2 -输出: 1 -解释: 2 = 1 1, 1 × 1 = 1。 -``` - -**示例 2:** - -``` -输入: 10 -输出: 36 -解释: 10 = 3 3 4, 3 × 3 × 4 = 36。 -``` - -
- -**说明: **你可以假设 n 不小于 2 且不大于 58。 - -## 02、题目分析 - -> 这个题理解了题意的话,其实还是比较简单的,一起看下。 - -要对一个整数进行拆分,并且要使这些拆分完后的因子的乘积最大。我们可以先尝试拆分几个数值,测试一下。 - -PNG - -通过观察,首先肯定可以明确,**2 和 3 是没办法进行拆分的最小因子**。同时,我们好像能看出来: - -- 只要把 n 尽可能的拆分成包含3的组合,就可以得到最大值。 -- 如果没办法拆成 3 的组合,就退一步拆成 2 的组合。 -- 对于 3 和 2 ,没办法再进行拆分。 - -
- -根据分析,我们尝试使用**贪心**进行求解。因为一个数(假设为n)除以另一个数,总是包括整数部分(x)和余数部分(y)。那刚才也得到了,**最优因子是3**,所以我们需要让 n/3,这样的话,余数可能是 1,2 两种可能性。 - -- 如果余数是 1 ,刚才我们也分析过,对于 1 的拆分是没有意义的,所以我们退一步,将最后一次的 3 和 1 的拆分,用 2 和 2 代替。 -- 如果余数是 2 ,那不消多说,直接乘以最后的 2 即可。 - -
- -根据分析,得出代码: - -```java -//JAVA -public static int integerBreak(int n) { - if (n <= 3) return n - 1; - int x = n / 3, y = n % 3; - //恰好整除,直接为3^x - if (y == 0) return (int) Math.pow(3, x); - //余数为1,退一步 3^(x-1)*2*2 - if (y == 1) return (int) Math.pow(3, x - 1) * 4; - //余数为2,直接乘以2 - return (int) Math.pow(3, x) * 2; -} -``` - -## 03、证明过程 - -> 答案是碰出来了,但是我们是通过观察,发现最优因子应该是 3 。那如何来证明这个结论的正确性呢? - -首先,通过均值不等式,很容易验证当每一个拆分值都相等的时候,才具有最大值,所以实际上就是将这个数均分。那么,对于整数![img](18.assets/640.svg),我们将其分解成![img](18.assets/640.svg)份,每一份为![img](18.assets/640.svg)则有 - - - -求![img](18.assets/640-1592573502117.svg)的极值点为![img](18.assets/640-1592573502133.svg),最接近的也就是 3 了。(注意:这里是整数,如果是实数,该证明则有漏洞) - -## 04、都看不懂 - -> 一力破万法,乱拳打死老师傅,使用万能的动态规划求解。 - -dp[i]代表 i 拆分之后得到的乘积的最大的元素,比如dp[4]就保存将4拆分后得到的最大的乘积。状态转移方程式为 - ->
dp[i]=max(dp[i],(i-j)*max(dp[j],j))
- -整体思路就是这样,将一个大的问题,分解成一个一个的小问题,然后完成一个**自底向上**的过程。举一个例子,比如计算 10 ,可以拆分 6 和 4 ,因为 6 的最大值 3x3,以及 4 的最大值 2x2 都已经得到,所以就替换成 9 和 4 ,也就是 10=3x3x4。 - -
- -代码如下:(CPP听说很受欢迎?) - -```cpp -//C   -class Solution { - public: - int integerBreak(int n) - { - vector dp(n   1, 0); - dp[1] = 1; - for (int i = 2; i <= n; i  ) - { - for (int j = 1; j < i; j  ) - { - dp[i] = max(dp[i], max(dp[j], j) * (i - j)); - } - } - return(dp[n]); - } -}; -``` - -今天的题目可能有一定难度,建议大家自己写写画画,才能真正的做到理解和巩固。 \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18/1.jpg" deleted file mode 100644 index 71e89575..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/18/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19.md" deleted file mode 100644 index 53c75bc8..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19.md" +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: 移动石子直到连续(1033) -date: 2020-06-20 ---- - -> 今天为大家分享一个**脑筋急转弯**类型的算法题。leetcode这个脑筋急转弯的tag打的我措手不及... - -PNG - -## 01、题目示例 - -> 分享这道题目的原因,是因为有很多同学,在拿到题目的一瞬间,如果发现题目很长,然后自己就慌了。其实,对于这种题目,如果认真的分析下去,非常简单。 - -| 第1033题:移动石子直到连续 | -| ------------------------------------------------------------ | -| 三枚石子放置在数轴上,位置分别为 a,b,c。每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < z 且 k != y。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。要使游戏结束,你可以执行的最小和最大移动次数分别是多少?以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves] | - -**示例1:** - -``` -输入:a = 1, b = 2, c = 5 -输出:[1, 2] -解释:将石子从 5 移动到 4 再移动到 3,或者我们可以直接将石子移动到 3。 -``` - -**示例 2:** - -``` -输入:a = 4, b = 3, c = 2 -输出:[0, 0] -解释:我们无法进行任何移动。 -``` - -**提示:** - -``` -1 <= a <= 100 -1 <= b <= 100 -1 <= c <= 100 -a != b, b != c, c != a -``` - -## 02、题目分析 - -> 这种题,基本上不慌,就赢了一半。 - -通过分析题中的样例,就算再笨,画一画应该都能理解题意。 - -
- -比如:a = 1, b = 2, c = 5 - -PNG - -比如:a = 4, b = 3, c = 2 - -PNG - -
(无法移动)
- -读懂了题意,开始进行分析。首先可以明确,每一次我们其实**是从边上来挑选石子,然后往中间进行移动**。所以,我们首先得找到min(左),max(右)以及mid(中)三个值。我们设,min和mid中的距离为x,max和min中的距离为y。大概就是下面这样: - -PNG - -然后只需要计算x和y的和,就是我们要找的最大值。而最小值,就很容易了,只有0,1,2三种可能性。 - -
- -根据分析,得到代码: - -```go -func numMovesStones(a int, b int, c int) []int { - arr := []int{a, b, c} - sort.Ints(arr) - x := arr[1] - arr[0] - 1 - y := arr[2] - arr[1] - 1 - max := x + y - min := 0 - if x != 0 || y != 0 { - if x > 1 && y > 1 { - min = 2 - } else { - min = 1 - } - } - return []int{min, max} -} -``` - -## 03、C 代码 - -> 当然,也可以不用排序,把代码写漂亮一点。像是下面这样... - -代码如下: - -```c -class Solution { -public: - vector numMovesStones(int a, int b, int c) { - int max = a > b ? (a > c ? a : c) : (c > b ? c : b); - int min = a < b ? (a < c ? a : c) : (b < c ? b : c); - int med = a + b + c - max - min; - int maxMove = max - min - 2; - int minMove = 2; - if (max - med == 1 && med - min == 1) { - minMove = 0; - } else if (max - med == 1 || med - min == 1) { - minMove = 1; - }else if (max - med == 2 || med - min == 2) { - minMove = 1; - } - return vector{minMove,maxMove}; - } -}; -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/1.jpg" deleted file mode 100644 index 95375f71..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/2.jpg" deleted file mode 100644 index 2814ba43..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/3.jpg" deleted file mode 100644 index 81f87668..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/4.jpg" deleted file mode 100644 index d6837296..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/5.jpg" deleted file mode 100644 index c4584f47..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/19/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20.md" deleted file mode 100644 index 64bfd9eb..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20.md" +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Nim 游戏(292) -date: 2020-06-20 ---- - -> 上一篇是为大家分享了一道打着“脑筋急转弯”tag的题目,然后我顺便就把这个类型的题目全部筛选出来看了看,发现总共没几个,所以就想的干脆一次全部讲完吧。 - -PNG - -## 01、题目示例 - -> 这个类型的题目,其实除了废话多一点,好像没什么特别的。 - -
- -| 第292题:Nim 游戏 | -| ------------------------------------------------------------ | -| 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人,每一步都是最优解。编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。 | - -**示例:** - -``` -输入: 4 -输出: false -解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛; - 因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。 -``` - -
- -PS:建议大家停留个两分钟先想一想...直接拉下去看题解就没什么意思了。 - -## 02、题目分析 - -> 这种问题,如果没有思路,可以先自己找个纸写写画画,找找规律 - -
- -首先如果石头数小于4个,那么因为你是先手,一把拿走,肯定会赢。 - -PNG - -而如果石头是4个,那不管你是拿了1,2,3个,最后一个都可以被你的对手拿走,所以怎么样都赢不了。 - -PNG - -再继续分析到8个石头:对于5,6,7而言,你只需要对应的拿走1,2,3,然后留下4个,则对方必输。但是如果你要面对的是8,不管先拿(1,2,3)个,另一个人都可以通过 8-(1,2,3) ,使得你面对4个石头,则你必输无疑。通过观察,我们发现,好像是**只要N是4的倍数,我们就必输无疑**。 - -PNG - -尝试性的写下代码:(这个,什么语言都无所谓吧....) - -```go -//go -func canWinNim(n int) bool { - return n % 4 != 0 -} -``` - -执行结果: - -PNG - -## 03、证明过程 - -> 脑筋急转弯的题目不是很多见,但是某些公司的某些人却钟情于此,如果是本着考察对方的思维能力,那我觉得还是挺好的。但若是为了寻找作为面试官的一丝丝优越感,那就只能是。。呵,打扰了。。 - -
- -首先需要说下的是,这个问题属于**博弈论**。NIM的意思就是“尼姆”,并不是什么高大上的英文缩写。所以,NIM游戏一般也称之为尼姆游戏。说白了,就是**设置两个对手,通过回合制的方式来玩的一种数学战略游戏,**在早期网络不发达的时候很火。毕竟那时候连梦幻都没有,更别说王者。(非戏说,很多回合制游戏,其实本质就是数学游戏。而对于王者这种多人实时竞技游戏更是如此,如果想玩好,数学学不好,基本就凉凉。有兴趣的,可以了解一下**游戏平衡师**) - -
- -回到本题,假若对于先手有N个石头,那么后手的可能性有N-1,N-2,N-3三种。**只有当后手的这三种可能性都必胜时,N才会必败**。因为题目说了,我们都是聪明人(一般博弈论的问题都会有这句话),那如果后手的三种可能性中,有哪一种必败,作为先手,我们一定会走出这种可能性。那这种可能性是什么,其实就是让对方去面对4的倍数。如果先手我们遇到一个不是4的倍数的值x,有: - -
4k > N > 4(k-1)
- -N一定处于两个4的倍数之间,因为N本身不是4的倍数,那N距离最近的4的倍数的值最大为3。所以,只要我们不是面对4的倍数,作为先手,我们一定可以取走(12,3),使剩余的值变成4的倍数,则后手必输无疑。 - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/1.jpg" deleted file mode 100644 index c183b160..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/2.jpg" deleted file mode 100644 index d947d9c1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/3.jpg" deleted file mode 100644 index 365ee90e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/4.jpg" deleted file mode 100644 index 50439a09..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/5.jpg" deleted file mode 100644 index 0bc01cdd..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/20/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21.md" deleted file mode 100644 index b665c94f..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21.md" +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: 寻找两个正序数组的中位数(292) -date: 2020-06-20 ---- - -> 今天为大家分享一道FLAG和BAT都出现过的经典面试题。题目有一定难度,建议大家耐着性子看完!不要说没天赋看不懂。在这个浮躁到努力的人都很少的年代,还谈不上说天赋这件事。 - -## 01、题目示例 - -> 这道题是非常好的一道题目,也是前面100道里最难的题目之一,相当经典! - -
- -| 第4题:寻找两个正序数组的中位数 | -| ------------------------------------------------------------ | -| 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m n))。你可以假设 nums1 和 nums2 不会同时为空。 | - -**示例 1:** - -``` -nums1 = [1, 3] -nums2 = [2] -则中位数是 2.0 -``` - -**示例 2:** - -``` -nums1 = [1, 2] -nums2 = [3, 4] -则中位数是 (2 3)/2 = 2.5 -``` - -## 02、题目分析 - -> 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 - -
- -题意还是比较简单的,没有什么需要额外补充。当然可以直接暴力求解,因为都是有序数组,直接进行合并,再对合并后的数组通过判断是否是偶数个,求出中位数。但是由于这种方法肯定是达不到O(log(n))的,所以我们直接略过。如果是为了练习code能力的小伙伴,下去可以自行试试。 - -
- -那如何保证时间复杂度在O(log(n))呢?这里有一个小技巧,**一般如果题目要求时间复杂度在O(log(n)),大部分都是可以使用二分的思想来进行求解**。当然,本题的二分是有一点反直觉的,可能不是很容易想到,一起看下。 - -
- -首先,我们考虑一个问题,如果只有一个有序数组,我们需要找中位数,那肯定需要判断元素是奇数个还是偶数个,如果是奇数个那最中间的就是中位数,如果是偶数个的话,那就是最中间两个数的和除以2。 - -PNG - -那如果是两个数组,也是一样的,我们先求出两个数组长度之和。如果为奇数,就找中间的那个数,也就是 **(长度之和 1)/2** 。如果为偶数,那就找 **长度之和/2**。比如下面的 (9 5)/2 = 7,那我们最终就是**找到排列第7位的值**。此时,问题其实已经转化为“**找到两个数组中第k小的元素**”。找到了第7位之后,第8位我们已经知道了,然后第7位和第8位的和,除以2就是我们要找的中位数(**注意:这里的7和8你其实是不知道的,图中画出来,只是为了帮助理解**) - -PNG - -现在的问题是,我们如何用二分的思想来找到中间排列第7位的数。这里有一种不太好想到的方式,**是用删的方式**,因为**如果我们可以把多余的数排除掉,最终剩下的那个数,是不是就是我们要找的数?**对于上面的数组,我们可以先删掉 7/2=3 个数。那这里,可以选择删上面的,也可以选择删下面的。那这里因为 i - -
(删除前)
- -PNG - -
(删除后)
- -由于我们已经排除掉了 3 个数字,现在对于两个数组,我们需要找到7-3=4的数字,来进行下一步运算。我们可以继续删掉4/2=2个数。我们比较i和j的值,删除小的一边。 - -PNG - -
(删除前)
- -PNG - -
(删除后)
- -继续上面的步骤,我们删除 2/2=1 个数。**同理,比较7和6的大小,删除小的一边**。删完后是下面这样: - -PNG - -
(7和6,删除6)
- -不要忘记我们的目的,我们是为了找第7小的数。此时,**两个数组的第一个元素,哪个小,就是我们要找的那个数**。因为7<8,所以7就是我们要找的第7小的数。 - -PNG - -这里有一点比较特殊的,如果在删除过程中,我们**要删除的K/2个数,大于其中一边的数组长度**,那我们就将小的一侧数组元素都删除。比如下面这个,此时7/2=3,但是下面的数组只有2个元素,我们就将它全部删除。 - -PNG - -删完之后,此时因为只删除了2个元素,所以k变成了5。那我们只需要返回其中一边的第5个元素就ok。 - -PNG - -整个上面的过程,完成了本题的算法架构! - -
- -## 03、证明过程 - -> 今天的题目有一定难度,但是并不是没办法攻克!最重要的还是三点: -> -> - 从整体把握整个问题的算法基础,想明白是如何从找中位数,转化成找“两个有序数组第k大的元素” -> - 能理解折半“删除”元素的过程,将问题转化为二分 -> - 独立的思考 一点点的努力 - -
- -根据分析,完成代码: - -```java -//JAVA -class Solution { - public double findMedianSortedArrays(int[] nums1, int[] nums2) { - int len1 = nums1.length; - int len2 = nums2.length; - int total = len1 + len2; - int left = (total + 1) / 2; - int right = (total + 2) / 2; - return (findK(nums1, 0, nums2, 0, left) + findK(nums1, 0, nums2, 0, right)) / 2.0; - - } - - //找到两个数组中第k小的元素 - public int findK(int[] nums1, int i, int[] nums2, int j, int k) { - if (i >= nums1.length) - return nums2[j + k - 1]; - if (j >= nums2.length) - return nums1[i + k - 1]; - if (k == 1) { - return Math.min(nums1[i], nums2[j]); - } - //计算出每次要比较的两个数的值,来决定 "删除"" 哪边的元素 - int mid1 = (i + k / 2 - 1) < nums1.length ? nums1[i + k / 2 - 1] : Integer.MAX_VALUE; - int mid2 = (j + k / 2 - 1) < nums2.length ? nums2[j + k / 2 - 1] : Integer.MAX_VALUE; - //通过递归的方式,来模拟删除掉前K/2个元素 - if (mid1 < mid2) { - return findK(nums1, i + k / 2, nums2, j, k - k / 2); - } - return findK(nums1, i, nums2, j + k / 2, k - k / 2); - } -} -``` - -执行结果: - -PNG \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/1.jpg" deleted file mode 100644 index 9c3eb2b8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/10.jpg" deleted file mode 100644 index f29fc513..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/11.jpg" deleted file mode 100644 index 3ad52423..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/2.jpg" deleted file mode 100644 index 4ceb6954..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/3.jpg" deleted file mode 100644 index 69425e8e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/4.jpg" deleted file mode 100644 index a006fad8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/5.jpg" deleted file mode 100644 index 15228b87..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/6.jpg" deleted file mode 100644 index e763c6a6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/7.jpg" deleted file mode 100644 index 47c8bb74..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/8.jpg" deleted file mode 100644 index e75362ff..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/9.jpg" deleted file mode 100644 index b346cd7d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/21/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22.md" deleted file mode 100644 index 23b735e9..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22.md" +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: 第k个最大元素(215) -date: 2020-07-01 ---- - -> 今天给大家分享一道美团面试题。话不多说,直接看题。 - -## 01、题目示例 - -> 这个题目的变形很多,比如找 "前 K 个高频元素"、 "数据流中的第K大元素" 、"最接近原点的 K 个值" 等等等等。 - -| 第215题:第K个最大元素 | -| ------------------------------------------------------------ | -| 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 | - -**示例 1:** - -``` -输入: [3,2,1,5,6,4] 和 k = 2 -输出: 5 -``` - -**示例 2:** - -``` -输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 -输出: 4 -``` - -**说明:** - -你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 - -
- -## 02、大顶堆 - -> 堆在算法题目中的应用主要包括以下几点: -> -> - TopK 问题 (尤其是大数据处理) -> - 优先队列 -> - 利用堆求中位数 - -
- -这种题目,从个人来讲,我一般是比较偏好使用堆来做的。毕竟大小顶堆,刚好有着与本类题型契合的特性。如果对堆不太熟悉的话,可以先看下这篇文章: - - - -那本题如何使用堆来做呢?假若我们的数组为[3,2,1,5,6,4],k=2,我们对其构造一个小顶堆(每个结点的值均不大于其左右孩子结点的值,堆顶元素为整个堆的最小值),整个过程是这样: - -
- -- 构造一个小顶堆,依次将元素放入堆中,并保证堆中元素为k。 - - PNG - -- 如果当前元素小于堆顶元素,那基本就不用看了(因为我们要找的是 排序后的第 k 个最大的元素) - - PNG - -- 自然,如果我们遇到比堆顶元素大的元素,就把它放入到堆中。 - - PNG - -- 重复上面的步骤: - - PNG - -然后根据分析,完成代码(今天就不手撕堆了,因为之前已经手撕过了。同时这里给大家一个建议,如果面试的时候,遇到这种TOPK的问题,**假如特别有把握,肯定得手撕数据结构,一定会加分**。但是如果没有把握,那就先用API实现,以 BugFree 为目标吧!) - -```java -//java -class Solution { - public int findKthLargest(int[] nums, int k) { - PriorityQueue minQueue = new PriorityQueue<>(k); - for (int num : nums) { - if (minQueue.size() < k || num > minQueue.peek()) { - minQueue.offer(num); - } - if (minQueue.size() > k) { - minQueue.poll(); - } - } - return minQueue.peek(); - } -} - -``` - -我也不知道为啥,Python永远就是这么牛X,朴实无华且枯燥! - -```python -//python -class Solution: - def findKthLargest(self, nums: List[int], k: int) -> int: - return heapq.nlargest(k, nums)[-1] # [6,5] -``` - -**注:**python可以使用heapq.nlargest 或 heapq.nsmallest,来找出某个集合中找出最大或最小的N个元素。 - -```python -//python ->>> import heapq ->>> nums=[1,8,2,23,7,-4,18,23,42,37,2] ->>> print(heapq.nlargest(3,nums)) -[42, 37, 23] ->>> print(heapq.nsmallest(3,nums)) -[-4, 1, 2] -``` - -## 03、快排 - -> 快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 - -
- -那对于本题,我们就是使用快排的思想,选定一个基准值,把比基准值大的放在基准值的右边,把基准值小的放在基准值的左边。若基准值刚好位于倒数第k个数,则基准值为目标值;反之,则递归处理目标值所处的那一部分数组。 - -```go -func findKthLargest(nums []int, k int) int { - idx := quickSort(0, len(nums) - 1, len(nums) - k, nums) - return nums[idx] -} - -func quickSort(l, r, pos int, nums []int) int { - povit_idx := partition(l, r, nums) - if pos == povit_idx { - return povit_idx - } else if pos > povit_idx { - return quickSort(povit_idx + 1, r, pos, nums) - } else { - return quickSort(l, povit_idx - 1, pos, nums) - } -} - -func partition(l, r int, nums []int) int { - s := l - povit_value := nums[l] - for l < r { - for ;l < r && nums[r] >= povit_value; { - r-- - } - for ;l < r && nums[l] <= povit_value; { - l++ - } - if l < r { - nums[l] = nums[r] ^ nums[l] - nums[r] = nums[l] ^ nums[r] - nums[l] = nums[r] ^ nums[l] - } - } - nums[s] = nums[l] - nums[l] = povit_value - return l -} -``` - -执行结果: - -PNG - -整个快排的核心,其实就partition。partition 有 单向扫描,双向扫描 等多种写法。上面的代码,大家可以参考参考,看不懂也没关系,我后面是会单独安排一个快排的系列篇来进行讲解的,到时候一堆图解砸进来,保准你看的醍醐灌顶! - -
- -所以,今天的问题你学会了吗?评论区留下你的想法! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/1.jpg" deleted file mode 100644 index c4d610bd..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/2.jpg" deleted file mode 100644 index c95549f6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/3.jpg" deleted file mode 100644 index 2d727bb8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/4.jpg" deleted file mode 100644 index fe44356f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/5.jpg" deleted file mode 100644 index 5c3a65d2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/22/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23.md" deleted file mode 100644 index ef085561..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23.md" +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: 镜面反射(858) -date: 2020-07-09 ---- - -> 这两天熟悉的朋友该知道我情绪不太好。但总不能借着由头,便拖期延稿诉衷肠。毕竟消除恐惧的最好方法就是面对恐惧。微笑着面对它,坚持才是胜利,加油!奥利给! - -## 01、题目示例 - -> 王者荣耀新赛季出了个“镜”,那我也出个“镜”呗。那个不会玩,这个总该会“玩”吧? - -| 第858题:镜面反射 | -| ------------------------------------------------------------ | -| 有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0,1,以及 2。正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。 | - -**示例:** - -``` -输入: p = 2, q = 1 -输出: 2 -解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。 -``` - -上面的题目绕得很,大概就是这么个意思: - -PNG - -## 02、题目分析 - -> 这是一道数学题...不喜勿喷 - -
- -我们知道光是由西南角发出的,也就是左下角。发出之后可能会出现多种情况(注意,下图略过了部分光线反射的情况)。看起来是十分复杂,无迹可寻。 - -PNG - -但是如果我们把光线的运动轨迹拆开来看,就可以观测到,**光线每经过一次折反,都会在纵向距离上移动 q**(首次与东墙相距的距离)。同时,**一旦其向上行走的距离为 p 的整数倍,就一定会碰到某个接收点(**注意:这里我们不需要考虑北面墙是否存在,根据光的反射定律可得**)**可以参考一下下面这张图: - -PNG - -问题变得简单了,**光线最终向上走的距离,其实就是 p 和 q 的最小公倍数**。我们设最小公倍数为 L,会发现如果 L 是 p 的**奇数倍**,光线则到达**北墙**(可以参考上面的图)当 L 是 p 的 **偶数倍**,光线将会射到**南墙**。 - -
- -问题来了,如果光线是射向南墙,因为只有一个接收器了,必定只能遇到接收器 0。但是如果射到了北墙,如何区分是 1 和 2。这回到了一个初中数学题,我们可以通过**光线与东西墙的接触次数,来判断最终的落点是 1 还是 2。** - -
- -根据分析,得出代码(这道题应该不需要给多语言版本吧,都长一样....): - -```java -//JAVA -class Solution {     - public int mirrorReflection(int p, int q) {         - int m = p, n = q;         - int r;         - while (n > 0) {             - r = m % n;             - m = n;             - n = r;         - }         - if ((p / m) % 2 == 0) {             - return 2;         - } else if ((q / m) % 2 == 0) { - return 0;         - } else {             - return 1;        - }    - } -} -``` - -执行结果: - -PNG - -这道题学会了吗?如果不会就不要玩镜了吧(皮一个)。 - -
- -快来评论区留下你的想法吧! - diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/1.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/1.gif" deleted file mode 100644 index b3379672..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/1.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/1.jpg" deleted file mode 100644 index f82d2c4d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/2.jpg" deleted file mode 100644 index 035a1acb..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/3.jpg" deleted file mode 100644 index 14929086..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/4.jpg" deleted file mode 100644 index 6395a975..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/5.jpg" deleted file mode 100644 index ca7d0b0e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/6.jpg" deleted file mode 100644 index 644f6e55..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/7.jpg" deleted file mode 100644 index e8cd8e12..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/8.jpg" deleted file mode 100644 index d79f5c8f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/23/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25.md" deleted file mode 100644 index 28b97507..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25.md" +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: 整数转罗马数字(12) -date: 2020-07-10 ---- - -> 今天穿插为大家讲解一道臭长臭长的经典题目。我把字体加大了,加大了,加大了。 - -## 01、题目示例 - -> 本题是leetcode第12题,意为整数转罗马数字,题目难度中等,代码通过九万次,建议掌握。 - -| 第12题:整数转罗马数字 | -| --------------------------------------------------- | -| 罗马数字包含以下七种字符:I, V, X,L,C,D 和 M。 | - -``` -字符 数值 -I 1 -V 5 -X 10 -L 50 -C 100 -D 500 -M 1000 -``` - -
- -例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做 XXVII, 即为 XX + V + II 。 - -
- -通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: - -
- -I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 - -X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 - -C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 - -
- -给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。 - -
- -**示例 1:** - -``` -输入: 3 -输出: "III" -``` - -**示例 2:** - -``` -输入: 4 -输出: "IV" -``` - -**示例 3:** - -``` -输入: 9 -输出: "IX" -``` - -**示例 4:** - -``` -输入: 58 -输出: "LVIII" -解释: L = 50, V = 5, III = 3. -``` - -**示例 5:** - -``` -输入: 1994 -输出: "MCMXCIV" -解释: M = 1000, CM = 900, XC = 90, IV = 4. -``` - -## 02、题解分析 - -> 看见长长的题目,别怂。 - -
- -因为题目很长,所以读懂题意很重要。这道题说是让我们转换罗马数字,其实说白了就是让我们用特殊的规则凑数。**罗马数字本身就可以理解为一种特殊的数学规则。** - -PNG - -那如何来凑数?自然就需要读懂题意,比如 2 就是通过 1+1 凑;3 通过 1+1+1 凑;6 通过 5+1 凑。同时,在凑的过程中,又加入了一些奇怪的规则。比如说,4 不允许 1+1+1+1 凑,而是得 5-1 凑;而 9 不能 5+1+1+1+1 凑,而是得 10-1 凑;这个分析怎么出来的?题目中说的: - -
- -- I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 -- X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 -- C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 - -
- -看到这里,估计熟悉的小伙伴,能找到那么点感觉。凑数,凑数,凑钱。有一道很经典的题目 “硬币找零” 不也是一样的玩法吗。 - -
- -然后,我们把题目中所有的字符列出来: - -PNG - -当然,除了这些还不够。因为上面我们还分析出了一些特殊的规则,也得列出来: - -PNG - -然后我们利用这张表格,对给出的数字进行转化(拼凑)。假设我们要找的数为2834,大概的流程如下(其实是一种类似贪心的思想): - -PNG - -对比着代码看更为明朗: - -```java -//java -class Solution { - public String intToRoman(int num) { - int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; - String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; - int index = 0; - StringBuilder result = new StringBuilder(); - while (index < 13) { - if (num >= nums[index]) { - result.append(romans[index]); - num -= nums[index]; - } else { - index ++; - } - } - return result.toString(); - } -} -``` - -执行结果: - -PNG - -## 03、啰嗦一下 - -> 这道题目限制了最大数为 3999,时间复杂度也就被限制成了O(1)。 - -
- -我还看到了一个西PP很骚的解法,拿出来大家瞅瞅: - -```cpp -//cpp -class Solution { -public: - string intToRoman(int num) - { - char* c[4][10] = { - {"","I","II","III","IV","V","VI","VII","VIII","IX"}, - {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}, - {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}, - {"","M","MM","MMM"} - }; - string roman; - roman.append(c[3][num / 1000]); - roman.append(c[2][num / 100 % 10]); - roman.append(c[1][num / 10 % 10]); - roman.append(c[0][num % 10]); - - return roman; - } -}; -``` - -这个解法应该没什么解释的,就是把每一位 0-10 的情况枚举出来。这道题目稍微长了点,但是分析下来并没有什么难度。有的同学一看到题目很长,直接就怂了,这种其实就很不好。唔,再放一张女神照片: - -PNG - -
- -今天的题目到这里就结束了。你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/1.jpg" deleted file mode 100644 index 5f42d4c8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/2.jpg" deleted file mode 100644 index 58188c2f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/3.jpg" deleted file mode 100644 index 9ca08aa6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/4.jpg" deleted file mode 100644 index 96578d0a..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/5.jpg" deleted file mode 100644 index beb07f4a..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/6.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/6.gif" deleted file mode 100644 index 47765031..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/25/6.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26.md" deleted file mode 100644 index 9c52e3bb..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26.md" +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: 荷兰国旗问题 -date: 2020-07-10 ---- - -> 今天为大家分享经典的荷兰国旗问题。最近折腾了挺多事情,状态有点乱糟糟的。这两天刚刚调整好,全副武装,横戈马上行! - -## 01、题目示例 - -> "荷兰国旗问题" 是计算机科学中的一个经典题目,它是由Edsger Dijkstra提出的。荷兰国旗由红、白、蓝三色组成。 - -| 荷兰国旗问题:现在有若干个红、白、蓝三种颜色的球随机排列成一条直线。现在我们的任务是把这些球按照红、白、蓝排序。 | -| ------------------------------------------------------------ | -| 这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。 | - -大概就是这么个意思: - -PNG - -PNG - -## 02、题解分析 - -> 这道题很经典,很高频。 - -
- -便于分析,我们把上面的图稍微改一下: - -PNG - -改成这样: - -PNG - -好了,这道题结束了。O(∩_∩)O - -
- -Emmmm....不开玩笑,现在我们讲解如何完成这个过程。 - -
- -首先,用脚趾头都可以想到的是,最终排序完成后的数组是分成三份的: - -
- -
红-白-蓝
- -红-白-蓝 - -
- -那总共就三个颜色,我们要区分开来,是不是最少需要两条分隔线?A线的左侧为0,右侧为1。B线的左侧为1,右侧为2。 - -PNG - -但是刚开始的时候,红-白-蓝 三色是乱序的,所以此时的两条线我们是不是可以看成在最两侧? - -PNG - -那我们剩下的是不是只需要把 A线 和 B线 间的数据维护成满足 AB 线的规则就可以了?那要维护 AB 线间的数据,是不是至少你得遍历下 AB 线间的数据? - -PNG - -我们从 C 位置处开始,**我们发现此时 C 等于0。是不是意味着,我们应把这个元素放到 A 的左侧,所以我们移动 A线。当然,我们也需要移动一下 C 的位置。(CASE-1)** - -PNG - -然后我们发现**新的 C 位置处等于2,那是不是说明这个元素应该位于 B 的右侧。所以我们要把该位置的元素 和 B位置处的元素进行交换,同时移动B。(CASE-2)** - -PNG - -但是这里要注意,**C 交换完毕后,C 不能向前移**。因为C指向的元素可能是属于前部的,若此时 C 前进则会导致该位置不能被交换到前部。继续向下遍历。 - -PNG - -有意思了,**我们发现 C 指向位置处等于1。有没有发现这种本身就满足规则了?所以我们忽略就可以了。(CASE-3)**继续移动 C。 - -PNG - -主要就这三种 CASE,我们把剩下的图都绘制出来: - -PNG - -PNG - -PNG - -PNG - -**总结一下:** - -
- -- 1)若遍历到的位置为0,则说明它一定位于A的左侧。于是就和A处的元素交换,同时向右移动A和C。 - -- 2)若遍历到的位置为1,则说明它一定位于AB之间,满足规则,不需要动弹。只需向右移动C。 -- 3)若遍历到的位置为2,则说明它一定位于B的右侧。于是就和B处的元素交换,交换后只把B向左移动,C仍然指向原位置。(因为交换后的C可能是属于A之前的,所以C仍然指向原位置) - -
- -大概就是这么一个分析过程,代码其实就很简单了(注意体会一下下面两种代码 C 的处理逻辑): - -
- -python版本: - -```python -//py3 -class Solution: - def sortColors(self, nums: List[int]) -> None: - a = c = 0 - b = len(nums) - 1 - while c <= b: - if nums[c] == 0: - nums[a], nums[c] = nums[c], nums[a] - a += 1 - c += 1 - elif nums[c] == 2: - nums[c], nums[b] = nums[b], nums[c] - b -= 1 - else: - c += 1 -``` - -go版本: - -```go -//go -func sortColors(nums []int) { - a := 0 - b := len(nums) - 1 - for c := 0; c <= b; c++ { - if nums[c] == 0 { - nums[c], nums[a] = nums[a], nums[c] - a++ - } - if nums[c] == 2 { - nums[c], nums[b] = nums[b], nums[c] - c-- - b-- - } - } -} -``` - -执行结果: - -PNG - -## 03、总结 - -> 这道题目限制了最大数为 3999,时间复杂度也就被限制成了O(1)。(这句话忽略!上次的文章忘记删除了。。) - -
- -好吧,基本就是这样了。这道题目在 leetcode 上对应的是: - -PNG - -我觉得我讲的还是可以的。大家要是认为ok的话,给我来个转发吧~感谢! - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/1.jpg" deleted file mode 100644 index eb1f7461..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/10.jpg" deleted file mode 100644 index 6b9dfdc1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/11.jpg" deleted file mode 100644 index 976aa822..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/12.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/12.jpg" deleted file mode 100644 index 89d55917..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/12.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/13.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/13.jpg" deleted file mode 100644 index a0793a24..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/13.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/14.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/14.jpg" deleted file mode 100644 index c1cdfd52..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/14.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/15.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/15.jpg" deleted file mode 100644 index 1b7c7ffb..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/15.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/16.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/16.jpg" deleted file mode 100644 index b36166a2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/16.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/17.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/17.jpg" deleted file mode 100644 index 256099b1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/17.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/2.jpg" deleted file mode 100644 index f3e77913..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/3.jpg" deleted file mode 100644 index 6cbfcdce..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/4.jpg" deleted file mode 100644 index 5be0a6a6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/5.jpg" deleted file mode 100644 index cf6ddead..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/6.jpg" deleted file mode 100644 index cbaeeeba..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/7.jpg" deleted file mode 100644 index 16d7054e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/8.jpg" deleted file mode 100644 index c8a69637..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/9.jpg" deleted file mode 100644 index 0aadeec0..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/26/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27.md" deleted file mode 100644 index 77f0e199..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27.md" +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: 六九问题 -date: 2020-07-10 ---- - -> 69式是一种。。。咳咳,六九问题是一道很有趣的算法题。嗯,不服来辩。 - -## 01、题目示例 - -> 注意,num每一位上的数字都是 6 或者 9 。 - -
- -| 题目:1323. 6 和 9 组成的最大数字 | -| -------------------------------------------- | -| 给你一个仅由数字 6 和 9 组成的正整数 `num`。 | - -
- -大概就是这么个意思: - -PNG - -``` -输入:num = 9669 -输出:9969 - -解释: -改变第一位数字可以得到 6669 。 -改变第二位数字可以得到 9969 。 -改变第三位数字可以得到 9699 。 -改变第四位数字可以得到 9666 。 -其中最大的数字是 9969 。 -``` - -## 02、题解分析 - -> 因为题目太简单了,所以。。。。我也不知道为什么拿来讲。反正不是凑字数 😂(我一定不会告诉你我是因为标题污所以选它的) - -
- -我们只要找到 num 中最高位的 6,将其翻转成 9,就可以找到答案。 - -```java -//java -class Solution {     - public int maximum69Number (int num) {         - String s = num + "";         - s = s.replaceFirst("6", "9");         - return Integer.valueOf(s);     - } -} -``` - -执行结果: - -PNG - -
- -emmmmm,大概就是这样。。。。我感觉要被锤,溜了溜了。 - -PNG - -## 03、知识点总结 - -> 写出上面的答案,大概率是被面试官锤了。那这道题到底是考察我们什么呢? - -PNG - -大家可以看到,这是一道数学题。所以我们需要用数学的方法来进行求解。具体代码如下: - -```java -//java -class Solution {     - public int maximum69Number(int num) {         - if (num / 1000 == 6) {             - num += 3000;         - } else if (num % 1000 / 100 == 6) {             - num += 300;         - } else if (num % 100 / 10 == 6) {             - num += 30;         - } else if (num % 10 == 6) {             - num += 3;         - }         - return num;     - } -} -``` - -其实这种解法,和上面的解法没什么区别。**都是从高位到低位进行判断,遇到 6 就将其变为 9**。只不过,上面是通过 replaceFirst 来进行,下面通过数值相加的方式来进行。那这种方法的效率我们看看: - -PNG - -吊炸天有没有!难怪古人说,学好数理化,走遍天下都不怕。只会 replace 画,面试结束找妈妈。 - -PNG - -现在你知道为什么你和别人一起去面试,面试官挂了你,而选择别人了吧。**面试官的思维,往往就是这么朴实无华且枯燥。** - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/1.jpg" deleted file mode 100644 index aa5ea146..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/2.jpg" deleted file mode 100644 index d8735062..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/3.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/3.gif" deleted file mode 100644 index f3c59826..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/3.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/4.jpg" deleted file mode 100644 index 278a2c41..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/5.jpg" deleted file mode 100644 index 0ab1db77..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/6.jpg" deleted file mode 100644 index 79055481..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/27/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28.md" deleted file mode 100644 index ee43a1a3..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28.md" +++ /dev/null @@ -1,193 +0,0 @@ ---- -title: 有效的数独 -date: 2020-07-10 ---- - -PNG - -> 数独相信在座的各位都玩过,那我们如何使用程序去验证一个 9×9 的数独是有效的呢?一起看下! - -## 01、题目示例 - -> 数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据 9×9 盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。 - -
- -| 题目:有效的数独 | -| ------------------------------------------------------------ | -| 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 | - -
- -- 数字 1-9 在每一行只能出现一次。 -- 数字 1-9 在每一列只能出现一次。 -- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 - -
- -**示例:** - -``` -输入: -[ - - ["5","3",".",".","7",".",".",".","."], - - ["6",".",".","1","9","5",".",".","."], - - [".","9","8",".",".",".",".","6","."], - - ["8",".",".",".","6",".",".",".","3"], - - ["4",".",".","8",".","3",".",".","1"], - - ["7",".",".",".","2",".",".",".","6"], - - [".","6",".",".",".",".","2","8","."], - - [".",".",".","4","1","9",".",".","5"], - - [".",".",".",".","8",".",".","7","9"] - -] - -输出: true - -解释: - -数独部分空格内已填入了数字,空白格用 '.' 表示。 - -``` - -**说明:** - -**一个有效的数独(部分已被填充)不一定是可解的。** - -只需要根据以上规则,验证已经填入的数字是否有效即可。 - -给定数独序列只包含数字 1-9 和字符 '.' 。 - -给定数独永远是 9x9 形式的。 - -
- -画出来就是下面这样: - -PNG - -## 02、题解分析 - -> 聊聊数独,很早之前其实研究过一阵子,还是非常有趣的。解法有很多,包括什么余数法,摒除法等等。那我们如何去评定一个数独的难度呢?一般情况下,给定的数字个数越多,数独相对越简单。 - -
- -解题的关键题目中其实已经说了: - -
- -- 数字 1-9 在每一行只能出现一次。 -- 数字 1-9 在每一列只能出现一次。 -- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 - -
- -我们要做的就是**用程序来完成这个验证的过程**,如何验证?那其实就两步: - -
- -- 第一步:遍历数独中的每一个元素 -- 第二步:验证该元素是否满足上述条件 - -
- -遍历这个没什么好说的,**从左到右,从上到下进行遍历即可**。就一个两层循环。因为题目本身就是常数级的规模,所以时间复杂度就是 O(1)。 - -PNG - -问题来了:如何验证元素在 行 / 列 / 子数独中没有重复项? - -
- -其实很简单,我们建立三个数组分别记录每行,每列,每个子数独(子数独就是上面各种颜色的小框框)中出现的数字。 - -```java -//JAVA -int[][] rows = new int[9][9]; -int[][] col = new int[9][9]; -int[][] sbox = new int[9][9]; -``` - -当然,刚开始的时候他们都是空的。然后**每遍历到一个元素,我们就看看这个元素在里边存不存在,不存在就放进去,存在那说明数独不合法**。 - -PNG - -举个栗子,比如这个数独。第6行5列为2,那我们就对 rows 和 col 进行设置:(1表示元素存在) - -
- ->
rows[当前行][当前元素值] = rows[5][2] = 1
->
col[当前列][当前元素值] = col[4][2] = 1
- -
- -但是这里有个问题,如果元素值是 9,那就越界了!所以我们对当前元素值减个一处理一下: - - - ->
rows[当前行][当前元素值] = rows[5][2-1] = 1
->
col[当前列][当前元素值] = col[4][2-1] = 1
- -
- -现在的题是,对于 sbox 该如何设置呢?我们用下面的公式来计算得到: - -``` -boxIndex = (row / 3) * 3 + columns / 3 -``` - -其实很容易理解:我们把上面的第6行5列代入到这个公式里,(5 / 3) * 3 + 4 / 3 = 3 + 1 = 4。这个 4 也就代表最终落到 4 的这个小区域中。 - -PNG - -我猜有人不能理解这个算式(是的,连公式都称不上),所以我再解释一下它是怎么来的。比如上面的第 6 行,row 为 5,5/3=1 可以理解为 **此时在第1大行上**,然后 (5/3)*3,是计算出当前第一大行处的 boxIndex 值。最后再加上的 4/3,意思是向右偏移几个大列。 - -PNG - -根据分析,给出代码: - -```java -class Solution { - public boolean isValidSudoku(char[][] board) { - int[][] rows = new int[9][9]; - int[][] col = new int[9][9]; - int[][] sbox = new int[9][9]; - for (int i = 0; i < board.length; i++) { - for (int j = 0; j < board[0].length; j++) { - if (board[i][j] != '.') { - int num = board[i][j] - '1'; - int boxIndex = (i / 3) * 3 + j / 3; - if (rows[i][num] == 1) return false; - rows[i][num] = 1; - if (col[j][num] == 1) return false; - col[j][num] = 1; - if (sbox[boxIndex][num] == 1) return false; - sbox[boxIndex][num] = 1; - } - } - } - return true; - } -} -``` - -执行结果: - -PNG - -## 03、总结 - -最后,我在这里分享给大家一个很难很难的数独,欢迎大家来挑战!!挑战成功的,评论区留下你的答案! - -PNG - -好了,今天的题目就讲完了,我觉得讲的还是挺好的。大家要是认为ok的话,给我来个转发吧~感谢! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/1.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/1.gif" deleted file mode 100644 index 0bae8e03..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/1.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/2.jpg" deleted file mode 100644 index 336bcc7d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/3.jpg" deleted file mode 100644 index 5ce40e55..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/4.jpg" deleted file mode 100644 index 1ae3e4f0..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/5.jpg" deleted file mode 100644 index 0ce09d00..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/6.jpg" deleted file mode 100644 index 03d85031..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/7.jpg" deleted file mode 100644 index 56b9864b..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/8.jpg" deleted file mode 100644 index ee1ec425..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/28/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29.md" deleted file mode 100644 index f5886b8d..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29.md" +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: 费米估算 -date: 2020-07-11 ---- - -> 今天为大家分享一道“奇葩”面试题。 - -## 01、加油站问题 - -> 信心满满的去面试,面试突然问了这样一个让人瞬间懵逼的问题.... - -
- -| 问题:北京有多少加油站? | -| -------------------------------- | -| 对的,你没看错,这就是原题。。。 | - -
- -遇到这种“智障问题”怎么办?不要怕,直接给出答案!“截止到2019年,北京共有1063个加油站。”对,就是这么刚。直接答出来,让面试官懵逼! - -## 02、费米估算 - -> 上面的答案当然是玩笑。其实这道题,并没有那么玄乎,一起分析下。 - -
- -这道题目主要考察人的估算能力。而估算界,有一个估算大牛叫做费米。 - -PNG - -这位大牛有多牛呢?据说第一颗原子弹正在试爆,费米随手把自己笔记本的一张纸撕成小碎片顺手一撒,碎纸随风飘落,在费米身后2米处落下。 - -PNG - -费米根据这个数据,心算得出核爆量大约是一万吨TNT。这个数据和一些尖端的仪器设备花了数星期时间来分析波速、波压得出的数据基本一致。 - -
- -于是这种估算方法后来就被称为费米估算。 - -## 03、题目分析 - -> 幸运的是,大师的估算方法并没有失传。 - -
- -费米估算,其实说白了就是将**正确答案,转化为一系列估算变量的乘法**。首先要把变量选的准确,其次要把变量估的准确。 - -
- -回到本题,我们要分析的问题是: - -PNG - -那我们至少得有多少辆车吧?但是并不是所有的车,每天都会上路。所以准确的说我们需要知道每天上路的车有多少。 - -PNG - -但是是所有上路的车都需要加油吗?当然不是,所以我们还得改改: - -PNG - -知道了每天上路需要加油的车辆数,我们得知道每个加油站可以满足多少辆车吧? - -PNG - -那加油站用什么满足车?自然是油咯。 - -PNG - -问题来了,那我们如何知道每天上路需要加油的车辆数?是不是我们可以转化为 北京车辆总数 / 加油频次: - -PNG - -这个加油频次,相信大家就很容易估算出来了。跑滴滴的一天一次油,正常开的话一周一次,开的少一点的话差不多半个月一次。 - -PNGPNG - -① 每天上路需要加油的车辆数 ② 每个加油站的容量 - -
- -所以我们只要回答出上面两个参数,再给出计算公式。就可以很完美的解答本题了! - -## 04、总结 - -> 数学家的嘴,骗人的鬼。 - -
- -上面的费米估算大家应该都知道是个什么东东了。还有很多类似的题目“芝加哥的钢琴家数量”,“上海有多少滴滴”,“成都有多少家星巴克”这都是一类问题。 - -PNG - -其实到这里就可以结束了,但是我还是想说“数学家的嘴,骗人的鬼”,有一个叫做德雷克的数学家,他用费米估算来解释自己单身的原因: - -
- -- 1、住在我附近的女性有多少?(伦敦:400万) -- 2、多少人有可能年龄上适合?(20%:80万) -- 3、多少人有可能是单身?(50%:40万) -- 4、多少人有可能拥有大学文凭?(26%:104000) -- 5、多少人有可能有魅力?(5%:5200) -- 6、多少人有可能觉得我有魅力?(5%:260) -- 7、多少人有可能和我合得来?(10%:26) -- 到最后,他愿意交往的女人,全世界只有26个。 - -
- -还专门发表了一篇论文,用数学大谈特谈自己没有女朋友的原因。 - -
- -然鹅。他在论文发表结束后,就马上结婚了。。哈哈哈哈哈,当然,这并不是说费米估算没有用,或许是估算错误吧! - -PNG - -好了,基本就是这样了。周末写文不容易,求个转发,来个评论。感谢~ \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/1.jpg" deleted file mode 100644 index b784c015..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/10.jpg" deleted file mode 100644 index be95ab15..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/11.jpg" deleted file mode 100644 index 83c9f3cc..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/12.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/12.jpg" deleted file mode 100644 index 5db00ed6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/12.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/2.jpg" deleted file mode 100644 index 3d5ead67..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/3.jpg" deleted file mode 100644 index 0bdec6b7..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/4.jpg" deleted file mode 100644 index b80205f1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/5.jpg" deleted file mode 100644 index 407db013..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/6.jpg" deleted file mode 100644 index 855656d4..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/7.jpg" deleted file mode 100644 index 43d25028..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/8.jpg" deleted file mode 100644 index 9a642dd1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/9.jpg" deleted file mode 100644 index eaea95ed..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/29/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30.md" deleted file mode 100644 index 3fa589ec..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30.md" +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: 分发饼干 -date: 2020-07-11 ---- - -> 今天给大家分享一道很魔性的题目(很多槽点),也是一道入门级别的贪心算法题目。 - -## 01、分发饼干 - -> 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。 - -| 问题:分发饼干 | -| ------------------------------------------------------------ | -| 假设你是一位很棒(多棒???)的家长,想要给你的孩子们一些小饼干(不能给大饼干吗???)但是,每个孩子最多只能给一块饼干(有毒吧。。。) | - -
- -对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 - -
- -注意:你可以假设胃口值为正(特么不正难道往外吐吗???)。一个小朋友最多只能拥有一块饼干。 - -
- -**示例 :** - -``` -输入: [1,2,3], [1,1] -输出: 1 - -解释: -你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 -虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 -所以你应该输出1。 -``` - -PNG - -
(难道剩下一个饼干喂狗吗?????)
- -## 02、题解分析 - -> 好吧。假如我们按照题目所说的策略来分析,尽可能的让孩纸满足,满足不了就一个饼干都不给他,忘掉那些懵逼的孩子。 - -
- -其实策略就很简单了:**我们只需要在满足孩子胃口的前提下,尽可能分配小的饼干给到他**。典型的资本主义。 - -PNG - -具体怎么做呢,我们把饼干和小朋友都按照**从大到小**排列。 - -PNG - -- 如果最大的饼干可以满足肚子最大的孩子,那就给他吃,同时比较下一个。 - -- 如果最大的饼干不能满足肚子最大的孩子,**那就让他饿着**,然后看看能不能满足第二个孩子。(有点黑暗系,**放弃小朋友**) - -
- -但是这里有个问题。凭什么就要先满足肚子最大的孩子。按道理讲,肚子越大应该越扛饿才对吧。所以我们换种思路,从**肚子最小的孩子**开始。 - -PNG - -- 如果最小的饼干可以满足肚子最小的孩子,那就给他吃,同时比较下一个。 - -- 如果最小的饼干不能满足肚子最小的孩子,**那就扔掉饼干**,看看下一个饼干能不能给他吃。(**放弃的是饼干**) - -
- -那这两种其实都算是贪心: - -- 一种是胃口太大轮到下一个孩子 -- 一种是饼干太小轮到下一个饼干 - -
- -因为要同时控制饼干和小孩,所以我们采用双指针。这里给出先满足小肚子孩子的代码: - -```java -class Solution { - public int findContentChildren(int[] grid, int[] size) { - if (grid == null || size == null) return 0; - Arrays.sort(grid); - Arrays.sort(size); - int gi = 0, si = 0; - while (gi < grid.length && si < size.length) { - if (grid[gi] <= size[si]) { - gi++; - } - si++; - } - return gi; - } -} -``` - -如果想先满足大肚子,代码也大同小异。直接从尾部向前遍历即可。执行结果: - -PNG - -## 03、一点分享 - -> 前阵子状态很差,这两天逐步调整过来啦,多谢大家的关心。后面的内容我会换一个策略,提前拟定好目录以及学习纲领,更系统的来分享题解,希望大家继续支持! - -
- -我们遇到什么困难也不要怕,微笑着面对它!消除恐惧的最好办法就是面对恐惧!坚持,才是胜利。加油!奥利给! - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/1.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/1.gif" deleted file mode 100644 index 4ab62695..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/1.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/2.jpg" deleted file mode 100644 index adb7b202..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/3.jpg" deleted file mode 100644 index 2c6df113..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/4.jpg" deleted file mode 100644 index 12fa8ab2..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/5.jpg" deleted file mode 100644 index c06fd182..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/30/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31.md" deleted file mode 100644 index 10e51364..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31.md" +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: 生命游戏(289) -date: 2020-07-11 ---- - -> 今天是小浩算法“365刷题计划”第102天。每个人的起点和终点都是一样的,但过程却各不相同。我们无法主宰生死却可以选择如何让生命有意义。我们如何用算法来进行一场生命的游戏呢! - -## 01、题目示例 - -> 生命游戏,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 - -| 第289题:生命游戏 | -| ------------------------------------------------------------ | -| 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。 | - -每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: - -
- -- 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡; -- 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活; -- 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡; -- 如果死细胞周围正好有三个活细胞,则该位置死细胞复活; - -
- -根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。 - -
- -题目有点复杂,举例说明: - -PNG - -注意:**面板上所有格子需要同时被更新**:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。 - -## 02、题解分析 - -> 这道题目的关键点是:**面板上所有格子需要同时被更新** - -
- -本题的复杂主要复杂在 4 个更新规则,所以我们需要先对 4 个规则进行掌握(我们仅对下面绿色标出的元素进行说明) - -
- -- R1:细胞数少于两个,则该位置**活细胞**死亡 - - PNG - -- R2:有两个或三个活细胞,则该位置**活细胞**仍然存活 - - PNG - -- R3:有超过三个活细胞,则该位置**活细胞**死亡 - - PNG - -- R4:有三个活细胞,则该位置**死细胞**复活 - - PNG - -四个规则理解起来并不复杂,现在考虑如何解决问题。最自然的想法是:一个个的更新细胞状态。 - -
- -但是这里我们会遇到一个问题:假设你每次更新完毕后,都把更新后的结果填入数组。那么当前轮其他格子的更新就会引用到你已经更新的结果。啥意思呢: - -PNG - -比如上面这个就是**错误**的:我们先依据规则4更新了绿色框处的状态,此时蓝色框色周围同样满足规则4。**已更新细胞的状态会影响到周围其他还未更新细胞状态的计算**。这明显不是我们想要的! - -PNG - -那我们最简单的思路:是不是只要我们能一直获取原始数组的数据,不就可以保证更新一直正确了吗!至于在哪里,其实不管是copy一个数组,还是说用hashmap存一下数值其实都ok。 - -
- -因为这种思路相对比较简单,我就直接上 leetcode 官方题解的代码了: - -```java -class Solution { - public void gameOfLife(int[][] board) { - - int[] neighbors = {0, 1, -1}; - - int rows = board.length; - int cols = board[0].length; - - // 创建复制数组 copyBoard - int[][] copyBoard = new int[rows][cols]; - - // 从原数组复制一份到 copyBoard 中 - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - copyBoard[row][col] = board[row][col]; - } - } - - // 遍历面板每一个格子里的细胞 - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - - // 对于每一个细胞统计其八个相邻位置里的活细胞数量 - int liveNeighbors = 0; - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - - if (!(neighbors[i] == 0 && neighbors[j] == 0)) { - int r = (row + neighbors[i]); - int c = (col + neighbors[j]); - - // 查看相邻的细胞是否是活细胞 - if ((r < rows && r >= 0) && (c < cols && c >= 0) && (copyBoard[r][c] == 1)) { - liveNeighbors += 1; - } - } - } - } - - // 规则 1 或规则 3 - if ((copyBoard[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) { - board[row][col] = 0; - } - // 规则 4 - if (copyBoard[row][col] == 0 && liveNeighbors == 3) { - board[row][col] = 1; - } - } - } - } -} -``` - -然后有意思的事情发生了,大神之所以是大神,就是大神的思路和普通人不一样。大神说,你这种方法可以是可以,但是占用了新的空间。 - -
- -**你不就想既可以保存原数组的状态,还可以更新新的状态吗?这些统统都可以在原有数组上搞**。具体怎么搞呢? - -
- -- 原来的 0 和 1 不就是代表死和生吗?但是你要更新新的状态,无非就是从生->死,从死->生。那我们加个状态 2,代表 生->死,加个状态 3 表示从 死>生。 -- 对于一个节点来说,如果它周边的点是 1 或者 2,就说明该点上一轮是活的。 -- 整体策略是完成 原始状态->过渡状态->真实状态 的过程。 -- 过渡状态 到 真实状态,代码就是把 0 和 2 变回 0,1 和 3 变回1的过程。用模只是代码技巧。 -- 策略实现的第一步是先找到当前节点周围的存活节点数。 - -
- -代码大概就是这样: - -```java -//JAVA -public class Solution {     - public void gameOfLife(int[][] board) {         - int m = board.length, n = board[0].length;         - // 原始状态 -> 过渡状态         - for(int i = 0; i < m; i++){             - for(int j = 0; j < n; j++){                 - int liveNeighbors  = 0;                 - // 判断上边                 - if(i > 0){                     - liveNeighbors  += board[i - 1][j] == 1 || board[i - 1][j] == 2 ? 1 : 0;                - }                 - // 判断左边                 - if(j > 0){                     - liveNeighbors  += board[i][j - 1] == 1 || board[i][j - 1] == 2 ? 1 : 0;                 - }                 - // 判断下边                 - if(i < m - 1){                     - liveNeighbors  += board[i + 1][j] == 1 || board[i + 1][j] == 2 ? 1 : 0;               - }                 - // 判断右边                 - if(j < n - 1){                     - liveNeighbors  += board[i][j + 1] == 1 || board[i][j + 1] == 2 ? 1 : 0;                 - }                 - // 判断左上角                 - if(i > 0 && j > 0){                    - liveNeighbors  += board[i - 1][j - 1] == 1 || board[i - 1][j - 1] == 2 ? 1 : 0;               - }                 - //判断右下角                 - if(i < m - 1 && j < n - 1){                    - liveNeighbors  += board[i + 1][j + 1] == 1 || board[i + 1][j + 1] == 2 ? 1 : 0;                 - }                 - // 判断右上角                - if(i > 0 && j < n - 1){                     - liveNeighbors  += board[i - 1][j + 1] == 1 || board[i - 1][j + 1] == 2 ? 1 : 0;               - }                - // 判断左下角                - if(i < m - 1 && j > 0){                   - liveNeighbors  += board[i + 1][j - 1] == 1 || board[i + 1][j - 1] == 2 ? 1 : 0;               - }                 - // 根据周边存活数量更新当前点,结果是 0 和 1 的情况不用更新                - if(board[i][j] == 0 && liveNeighbors  == 3){                  - board[i][j] = 3;               - } else if(board[i][j] == 1){                    - if(liveNeighbors  < 2 || liveNeighbors  > 3) board[i][j] = 2;               - }            - }        - }         - // 过渡状态 -> 真实状态         - for(int i = 0; i < m; i++){            - for(int j = 0; j < n; j++){                - board[i][j] = board[i][j] % 2;         - }        - }     - } -} -``` - -执行结果: - -PNG - -细心的读者也许会想到,这不就是卡诺图吗?是的。在大多数的矩阵状态变化类题目中,卡诺图、状态机 等都是一些常用的技巧。 - -
- -一般的通用解法为: - -
- -1、大部分都是遍历两次矩阵,第一遍引入中间值(中间状态),存储一些原矩阵不包含的额外信息。 - -2、通过 原始矩阵->过渡矩阵->真实矩阵 的策略,在结尾处将中间状态置成真实状态。 - -3、当遍历到某个位置时,需要查看它周边的位置,此时如果每一个周围的位置都手写,然后再判断是否越界,就很麻烦。一般用一个数组,保存向周边位置变化的坐标偏移值。 - -4、如果是 0 和 1 的状态置换,可以使用位运算来秀操作。如果涉及状态过多,考虑是否可以简化状态。 - -
- -总之:这是一道相对比较经典的题目,如果大家有兴趣,大家可以练习一下 第73题 矩阵置零,也是类似的解法。 - -## 03、每日算法 - -> 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。 - -PNG - -PNG - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/1.jpg" deleted file mode 100644 index 55ad9af8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/10.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/10.gif" deleted file mode 100644 index c6742a7e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/10.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/2.jpg" deleted file mode 100644 index 5ff68c72..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/3.jpg" deleted file mode 100644 index 50bbf261..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/4.jpg" deleted file mode 100644 index 0aaf747c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/5.jpg" deleted file mode 100644 index 9c40e4ff..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/6.jpg" deleted file mode 100644 index d52e2fc8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/7.jpg" deleted file mode 100644 index 9bd87805..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/8.jpg" deleted file mode 100644 index eb992dd0..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/9.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/9.gif" deleted file mode 100644 index 9230e8a0..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/31/9.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32.md" deleted file mode 100644 index d2cdf372..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32.md" +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: 搜索二维矩阵(74) -date: 2020-07-12 ---- - -> 问:程序员最讨厌康熙的哪个儿子。 -> -> 答:胤禩。 - -
- -今天依旧给大家分享一个面试的高频题目。话不多,来看题吧。 - -
- -## 01、题目示例 - -> 这道题目非常的高频!看起来是在考察矩阵搜索,其实和矩阵一点关系都没有.... - -
- -| 第74题:搜索二维矩阵 | -| ----------------------------------------------------------- | -| 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。 | - -
- -该矩阵具有如下特性: - -- 每行中的整数从左到右按升序排列。 -- 每行的第一个整数大于前一行的最后一个整数。 - -
- -**示例 1:** - -``` -输入: -matrix = [ - [1, 3, 5, 7], - [10, 11, 16, 20], - [23, 30, 34, 50] -] -target = 3 - -输出: true -``` - -**示例 2:** - -``` -输入: -matrix = [ - [1, 3, 5, 7], - [10, 11, 16, 20], - [23, 30, 34, 50] -] -target = 13 - -输出: false -``` - -
- -题目本身还是比较容易理解的,没有太多额外补充。 - -
- -## 02、题解分析 - ->说白了,这就是一道考察二分的题目。 - -
- -最重要的是题中给出的两个条件: - -
- -- 每行的第一个整数大于前一行的最后一个整数。 - -- 每行中的整数从左到右按升序排列。 - -
- -第一个条件意味着可以通过二分搜索确定哪行; - -第二个条件意味着可以在行里进行二分搜索确定哪个元素; - -PNG - -如何使用二分查找找到哪行呢?只需要一个上下边界,再每次拿着中间行最大的值和目标值比一比。 - -```java -//java - public int getRow(int[][] matrix, int target) { - //二分法找到target所在的行 - int top = 0, bottom = matrix.length - 1; - int col = matrix[0].length - 1; - while (top < bottom) { - int mid = (top + bottom) / 2; - if (matrix[mid][col] < target) - top = mid + 1; - else - bottom = mid; - } - return top; - } -``` - -找到是哪行之后,就和正常的二分查找没有什么区别了: - -```java -//java -public boolean find(int[] data, int target) { - //二分查找 - int l = 0, r = data.length - 1; - while (l <= r) { - int mid = (l + r) / 2; - if (data[mid] == target) - return true; - else if (data[mid] < target) - l = mid + 1; - else - r = mid - 1; - } - return false; - } -``` - -然后再把代码拼凑到一起: - -```java -//java -class Solution { - public boolean searchMatrix(int[][] matrix, int target) { - if (matrix.length < 1) return false; - int row = getRow(matrix, target); - return find(matrix[row], target); - } - - public int getRow(int[][] matrix, int target) { - int top = 0, bottom = matrix.length - 1; - int col = matrix[0].length - 1; - while (top < bottom) { - int mid = (top + bottom) / 2; - if (matrix[mid][col] < target) - top = mid + 1; - else - bottom = mid; - } - return top; - } - - public boolean find(int[] data, int target) { - int l = 0, r = data.length - 1; - while (l <= r) { - int mid = (l + r) / 2; - if (data[mid] == target) - return true; - else if (data[mid] < target) - l = mid + 1; - else - r = mid - 1; - } - return false; - } -} -``` - -## 03、小知识 - -> 斐波那契数列是以兔子繁殖为例子而引入的,所以又称为“兔子数列”。指的是这样一个数列:从第3项开始,每一项都等于前两项之和。 - -
- -**1,1,2,3,5,8,13,21,34,55,89,144........** - -PNG - -
(1+1=2,2+1=3,2+3=5.....21+5+8=21+13=34)
- -PNG - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/1.jpg" deleted file mode 100644 index 845766ef..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/2.jpg" deleted file mode 100644 index bdd5f16c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/3.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/3.gif" deleted file mode 100644 index 8fd5d40b..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/32/3.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33.md" deleted file mode 100644 index 00373a58..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33.md" +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: 子集(78) -date: 2020-07-12 ---- - -> 今天是小浩算法 “365刷题计划” 第105天。这是昨天一个同学面试快手被问到的算法题,很不幸的是他被挂掉了。征得对方同意后,拿出来分享给大家~ - -PNG - -
(如果要进入算法交流群的,扫描二维码就可以了)
- -PNG - -## 01、题目示例 - -> 子集:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。 - -
- -| 第48题:子集 | -| ------------------------------------------------------------ | -| 给定一组**不含重复元素**的整数数组 *nums*,返回该数组所有可能的子集(幂集)。 | - -
- -**说明:**解集不能包含重复的子集 - -
- -**示例:** - -``` -输入: nums = [1,2,3] - -输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] -``` - -题目本身没有太多需要补充的,初中数学知识: - -PNG - -## 02、题解分析(高级) - -> 上一个很厉害的题解。 - -
- -首先我们可以证明一下 N 个元素的子集个数有 2^N 个: - -PNG - -可以类比为 N 个不同的小球,一次拿出若干个小球(可以不拿),对于每一个球都可以选择拿或者不拿,共有 N 个球,总共判断 N 次,产生了 2^N 个子集。比如:123,共有下面 8 个子集: - -PNG - -然后考虑解题思路,**暂且不谈回溯,我们其实可以用二进制来模拟每个元素是否选中的状态。**又因为我们已知了对于 N 个元素共有 2^N 个子集,所以我们直接遍历 2^N 个元素。 - -```java -class Solution { - public List> subsets(int[] nums) { - //存放所有子集 - List> res = new ArrayList<>(); - //子集总数共有 2^N 个 - int length = 1 << nums.length; - //遍历所有的子集 - for (int i = 0; i < length; i++) { - List sub = new ArrayList<>(); - //TODO : 找到对应的子集元素 - } - return res; - } -} -``` - -但是我们并不知道具体的子集元素。那如何找到对应的子集元素呢?**对于 2^N 个 N 位的二进制数,我们可以通过从后往前的第 j 个二进制位的 0 和 1 来表示是否放入子集集合。** - -```java -for (int j = 0; j < nums.length; j++) { - if (((i >> j) & 1) == 1) sub.add(nums[j]); -} -``` - -综合一下代码: - -```java -class Solution { - public List> subsets(int[] nums) { - //存放所有子集 - List> res = new ArrayList<>(); - //子集总数公有 2^N 个 - int length = 1 << nums.length; - //遍历所有的子集 - for (int i = 0; i < length; i++) { - List sub = new ArrayList<>(); - for (int j = 0; j < nums.length; j++) { - if (((i >> j) & 1) == 1) sub.add(nums[j]); - } - res.add(sub); - } - return res; - } -} -``` - -为帮助大家理解,假设 nums 为 [1,2,3],res 的存储过程为: - -PNG - -大家可以仔细体会一下这个题解。 - -PNG - -## 03、题解分析(普通) - -> 当然,上面的题解并不是凡人可以直接想到的。所以我们这里还是给出一种更为通用的题解~ - -
- -集合中所有元素的选/不选,其实构成了一个满二叉树。左子树选,右子树不选。自然,那从根节点到所有叶子节点的路径,就构成了所有的子集。 - -PNG - -
(旋转90°)
- -PNG - -那这种解法其实就好理解很多了: - -```java -class Solution { - - List> res; - - public List> subsets(int[] nums) { - res = new ArrayList<>(); - List list = new ArrayList<>(); - dfs(nums, 0, list); - return res;10    } - - private void dfs(int[] nums, int start, List list) { - for (int i = start; i < nums.length; i++) { - list.add(nums[i]); - dfs(nums, i + 1, list); - list.remove(list.size() - 1); - } - res.add(new ArrayList<>(list)); - } - -} -``` - -总之,这道题目其实还是有一定难度的,难点主要包括: - -
- -- 数学知识的混淆,忘记考虑空集等情况。 -- 和全排列问题混淆,把 2^N 当做 N!处理。 -- 递归与回溯细节掌握不扎实。 - -
- -但并不是不可以攻克,建议大家下去自行练习一番~ - -
- -**加油,奥利给!** \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/1.jpg" deleted file mode 100644 index f0366b31..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/2.jpg" deleted file mode 100644 index d0dfd0ce..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/3.jpg" deleted file mode 100644 index e6139d29..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/4.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/4.gif" deleted file mode 100644 index 46543495..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/4.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/5.jpg" deleted file mode 100644 index 58e75f8d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/6.jpg" deleted file mode 100644 index 6f8ca0c1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/7.jpg" deleted file mode 100644 index ee306801..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/8.jpg" deleted file mode 100644 index bb12b7fb..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/9.jpg" deleted file mode 100644 index 22f4dae7..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/33/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34.md" deleted file mode 100644 index 46f275a8..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34.md" +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: 面试中的智力题 -date: 2020-07-12 ---- - -> 今天是小浩算法 “365刷题计划” 第106天。互联网公司面试,经常会出现一些奇奇怪怪的题目。今天就为大家扒几道。(第二道题目由读者提供,是真实的头条面试数据分析岗位对方问到的。防止题目侵权,本文给出的是**相似题型**) - -PNG - -## 01、量出4升水 - -> 这道题的答案并不难,但作为面试官,却可以通过这道题考察很多内容。 - -
- -| 题目:量出4升水 | -| ------------------------------- | -| 怎么用3升和5升的桶量出4升的水? | - -
- -题目没什么补充的,直接分析,一个3升和5升的水桶: - -PNG - -首先用三升水桶装满水,倒入五升水桶: - -PNG - -再次倒满三升水桶,填满后继续倒入五升水桶,直到五升水桶倒满。 - -PNG - -清空五升水桶,将三升水桶的一升水倒入: - -PNG - -再次填满三升水桶,倒入五升水桶中: - -PNG - -## 02、最大的钻石 - -> 注意,下面是 n,不是 10。网上的题目好多是 1-10 楼。。。。应该都是被简化的,分析起来并不友好。 - -
- -| 题目:最大的钻石 | -| ------------------------------------------------------------ | -| 1 楼到 n 楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从 1 楼到 n 楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到「最大」的一颗? | - -
- -不要认为这种题目不会出现在面试中,恰恰相反,这类题目出现的概率非常高。这不,有读者就碰到了。下面两个是知乎中也遇到该题的读者截图: - -PNG - -PNG - -那这种问题主要考察面试者的什么能力呢?一个是面试临场随机应变的能力。第二就是分析问题的能力。 - -
- -面试时如果被问到这种题目,其实大多数面试官心中并没有一个标准答案。(不排除有面试官深究的)事实是作为面试者,我们只要流畅的给出答案,大概率都是可以顺利过关。 - -
- -回到题目。其实题中包含一个隐藏条件:**随机放置**。所有的分析都是基于随机放置给出的。**换句话说,如果放置钻石是人为干预大小,那么本题的所以分析则全部不成立**。 - -
- -其实这个问题的原型叫做秘书问题,该类问题全部属于**最佳停止问题**。 - -PNG - -这类问题都有着统一的解法: - -PNG - -所以到我们的题目里,我们也是可以直接给出答案:**我们要选择先放弃前 37%(就是1/e)的钻石,此后选择比前 37% 都大的第一颗钻石。** - -
- -其实该法则还有很多运用,比如一些常见的推文《谈恋爱拒绝掉前面37%的人》,其实就是一样的原因。 - -
- -事实上也有人通过测试证明了这个数据: - -PNG - -当 n=30 时,测试一万次,可以看到有 4000 次我们拿到了最大的钻石。 - -
- -改题目还有一些变种,比如: - -
- -一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略? - -
- -现在要聘请 1 名秘书,共有 n 个应聘者,每面试 1 人后,就知道了应聘者的好坏程度,且必须立刻决定是否聘用,不可重复面试。策略是拒绝前 k 个应聘者,而从第 k+1 个应聘者开始,一旦有比前 k 个都好的,就立刻聘用。如何决定 k 的值,使得聘用到最佳应聘者的概率最大? - -
- -等等。这里再给出一个严谨的推导过程: - -PNG - -## 03、思维定势 - -> 下面这道题也是一道常见的智力题,但是这道题绝对不会出现在面试中了。拿出来分享给大家的原因,是期望不要被思维定势局限。 - -PNG - -这道题中有六个停车位,每个车位上都有一个数字,然而有一个车位上的数字被汽车挡住了,要求学生们在20秒内答出这个被挡住的车位上的数字。这是中国香港小学一道给6岁儿童设计的“停车场智力题”。(**大家可以在评论区留下答案**) - -
- -**加油,奥利给!** - diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/1.jpg" deleted file mode 100644 index f8d478a6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/10.jpg" deleted file mode 100644 index 453449b3..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/11.jpg" deleted file mode 100644 index 609af413..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/12.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/12.jpg" deleted file mode 100644 index 70839b28..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/12.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/13.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/13.jpg" deleted file mode 100644 index afc59917..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/13.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/2.jpg" deleted file mode 100644 index 623b9585..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/3.jpg" deleted file mode 100644 index ab501c13..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/4.jpg" deleted file mode 100644 index e038ecef..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/5.jpg" deleted file mode 100644 index b049a004..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/6.jpg" deleted file mode 100644 index 4c917fed..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/7.jpg" deleted file mode 100644 index 28cb3349..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/8.jpg" deleted file mode 100644 index 75f69491..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/9.jpg" deleted file mode 100644 index 898264de..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/34/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50.md" deleted file mode 100644 index 9040e203..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50.md" +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: 图的基础知识 -date: 2020-07-11 ---- - -PNG - -> 今天和大家聊聊关于图的一些知识。 - -## 01、图是什么 - -> 图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。 - -
- -在数据结构中,图是什么呢?喏,就是这样: - -PNG - -Emmmm.....或者说常见一点的: - -PNG - -图是一个比树形关系复杂一点点,比线性关系复杂两点点的东东。 - -
- -- 线性关系是一对一:一个前驱一个后继。 -- 树形结构是一对多:一个父多个子 -- 图形结构是多对多:任意两个顶点(图中的节点叫做顶点)都有可能相关,是一种多对多的关系。 - -
- -图我们一般表示为 G = (V,E) - -- V:代表点 -- E:代表边 - -
- -啥意思嘞,比如就上面那个绿油油的图,就可以表示为: - -- V={1,2,3,4,5,6} -- E={(1,2),(1,5),(2,3),(2,5),(3,4),(4,5),(4,6)} - -## 02、图的术语 - -> 然后我们介绍一下图的一些术语。 - -
- -图里最基本的单元是顶点(vertex),相当于树中的节点。顶点之间的关联关系,被称为边(edge)。而边可以分配一个数值(正负都ok),这个数值就叫做权重。 - -PNG - -
(数据取自真实数据.....)
- -PNG - -当然,这里值得一提的是,树也可以被当做简单的图,而链表也可以被当做简单的树。 - -## 03、无向图和有向图 - -> 有方向的图就是有向图,无方向的图就是无向图。 - -
- -**边没有方向的图称为无向图。**比如说我微信里同时加了这5个妹子,这5个妹子也都认识我。 - -PNG - -突然有一天,除了小花,其他四个妹子同时间都把我拉黑了。我的微信里能看到她们,她们却看不到我。 - -PNG - -然后嘞,无向图就变成了有向图: - -PNG - -## 04、完全图 - -> 所有的顶点互相连接在一起,那就是完全图。 - -
- -在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图。大概就是这样: - -PNG - -而在有向图中,若每对顶点之间都有二条有向边相互连接,也算是完全图。 - -## 05、循环图 和 DAG - -> 所有的这些概念,都是顺利成章产生的。 - -
- -PNGPNG - -循环图中的循环二字,指的是**起点和终点是同一节点时**产生的路径。所以,**循环图和有向图或无向图并没有什么关系,因为都有可能产生循环**。有向图,那就遵循边的方向。无向图,那只要成环就行。 - -PNG - -这三个: - -- 第一个就是无向循环图 -- 第二个就是有向非循环图 -- 第三个就是有向循环图 - -
- -那第二个,更多的是被称为,有向无环图 DAG(Directed Acyclic Graph。那下面这个也是 : - -PNG - -那上面这个像不像一棵树。。。。。所以计算机结构中的树(大多都是有向的),其实就是一个DAG。 - -## 06、加权图 - -> 用数学语言讲,设G为图,对图的每一条边e来说,都对应于一个实数W(e)(可以通俗的理解为边的“长度”,只是在数学定义中图的权可以为负数),我们把W(e)称为e的“权”。把这样的图G称为“加权图”。 - -
- -这个没啥好说的了,就是边有长度的图(**这个长度可以是各种含义**)。大部分我们接触到的图,都是加权图。 - -PNG - -但是这里如果细分的话,又分出来了。**顶点加权图和边加权图。**说白了,就是有人发现如果只给边加上权值(就是长度)并不够用,有时候也需要给顶点加上权值。 - -PNG - -## 07、连通图 - -> 在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称i和j是连通的。 - -
- -连通的图,就是连通图: - -PNG - -如果不通了,就是非连通图:(这是一个图) - -PNG - -那没有连通在一起的这两坨(或者说移动的这两坨),我们叫作**岛**。(画外音,也许当年给联通移动起名的,就是程序员。从这里看,联通和移动本身就是对立的) - -PNG - -所以,如果我们的图里包含岛,那就是非连通图。 - -## 08、稠密图和稀疏图 - -> 终于出现一个有学问的。你看 连通图-非连通图,加权图-非加权图,循环图-非循环图。。。。。人家稠密,终于知道对应一个稀疏了。 - -
- -如何定义稠密和稀疏?**梵蒂冈也有人觉得他们的圣彼得大教堂拥挤**,所以稠密稀疏本身就是一个主观定义。 - -
- -我们可以简单的认为,稀疏图的边数远远少于完全图,反之,稠密图的边数接近于或等于完全图。 - -
- -本文主要介绍了图的基础知识,下一章会继续讲解图算法。希望大家多多支持!周末写文不容易,求个转发,来个评论。感谢~ \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/1.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/1.gif" deleted file mode 100644 index c481c242..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/1.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/10.jpg" deleted file mode 100644 index 7cbc23a1..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/11.jpg" deleted file mode 100644 index 4ef1a988..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/12.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/12.jpg" deleted file mode 100644 index a65bc562..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/12.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/13.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/13.jpg" deleted file mode 100644 index 1d316179..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/13.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/14.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/14.jpg" deleted file mode 100644 index b8871ac8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/14.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/15.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/15.jpg" deleted file mode 100644 index b4f94922..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/15.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/16.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/16.jpg" deleted file mode 100644 index ed2837ca..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/16.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/17.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/17.jpg" deleted file mode 100644 index 91146ee6..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/17.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/18.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/18.jpg" deleted file mode 100644 index 73e69781..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/18.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/2.jpg" deleted file mode 100644 index f366a7e5..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/3.jpg" deleted file mode 100644 index 5e7f641f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/4.jpg" deleted file mode 100644 index 190664a7..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/5.jpg" deleted file mode 100644 index 80dfb6f3..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/6.jpg" deleted file mode 100644 index 768f66e9..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/7.jpg" deleted file mode 100644 index e6af6557..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/8.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/8.jpg" deleted file mode 100644 index a442e4ec..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/8.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/9.jpg" deleted file mode 100644 index 50692c6b..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/50/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51.md" deleted file mode 100644 index 8507aa1c..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51.md" +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: 旋转图像(48) -date: 2020-07-11 ---- - -PNG - -> 今天是小浩算法 “365刷题计划” 第103天。这是前几天一个同学去滴滴面试的原题。 - -## 01、题目示例 - -> 这道题目和昨天讲的生命游戏有一点是很像的,就是同样也要求**原地旋转**。其实在很多矩阵的题目中,都会有这样的要求,大家需要注意一下。 - -| 第48题:旋转图像 | -| --------------------------------------- | -| 给定一个 n × n 的二维矩阵表示一个图像。 | - -**说明:** - -你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 - -
- -**示例 1:** - -``` -给定 matrix = -[ - [1,2,3], - [4,5,6], - [7,8,9] -], - -原地旋转输入矩阵,使其变为: -[ - [7,4,1], - [8,5,2], - [9,6,3] -] -``` - -**示例 2:** - -``` -给定 matrix = -[ - [ 5, 1, 9,11], - [ 2, 4, 8,10], - [13, 3, 6, 7], - [15,14,12,16] -], - -原地旋转输入矩阵,使其变为: -[ - [15,13, 2, 5], - [14, 3, 4, 1], - [12, 6, 8, 9], - [16, 7,10,11] -] -``` - -题目理解起来还是很容易的: - -PNG - -## 02、题解分析 - -> 这是一道看起来容易,但其实非常考察细心程度的算法题目,有太多地方会出现失误。 - -
- -我们用代码来旋转矩阵,肯定不能说像拿着一个东西整体直接旋转,类似这样: - -PNG - -一般容易想到的是,一层层的从外到内旋转每一圈(至于为什么不从内到外,如果你觉得方便,也ok),也就是俗称的找框框: - -PNG - -对每个框框,其实都有 4 个顶点: - -PNG - -剩下的就是交换这四个顶点的值: - -PNG - -交换完毕之后,再继续交换移动后的四个顶点: - -PNG - -那代码实现其实就很简单了: - -
- -- 我们通过 x 和 y 就可以定义这个框框的边界 -- 找到框框后,我们再通过框框边界来定义出4个顶点 -- 然后完成交换 - -```java -//java -class Solution { - public void rotate(int[][] matrix) { - int temp; - for (int x = 0, y = matrix[0].length - 1; x < y; x++, y--) { - for (int s = x, e = y; s < y; s++, e--) { - temp = matrix[x][s]; - matrix[x][s] = matrix[e][x]; - matrix[e][x] = matrix[y][e]; - matrix[y][e] = matrix[s][y]; - matrix[s][y] = temp; - }; - }; - } -} -``` - -当然,上面是一个 n x n 的矩阵找框框,如果不是 n x n 其实也类似,大家有兴趣可以看下下面这道: - - [螺旋矩阵(54)](1.99.其他补充题目/01.md) - -
- -那我们除了找框框之外,还能不能有一些别的解法呢?当然可以,想想小时候我们通过对折来完成的填字游戏。 - -PNG - -我们观察这个矩阵: - -PNG - -我们观察这个矩阵,向右旋转90°,是不是可以理解为**先上下翻转,再沿对角线翻转**: - -PNG - -根据分析,完成代码(其实应该用Go写,交换元素会方便许多....): - -```java -//JAVA -class Solution {     - public void rotate(int[][] matrix) {         - int n = matrix.length;         - //上下翻转         - for (int i = 0; i < n / 2; i ++){             - int[] tmp = matrix[i];             - matrix[i] = matrix[n - i - 1];             - matrix[n - i - 1] = tmp;        - }         - //对角线翻转         - for (int i = 0; i < n; i ++){             - for (int j= i + 1; j < n; j++){                 - int tmp = matrix[i][j];                 - matrix[i][j] = matrix[j][i];                 - matrix[j][i] = tmp;             - }        - }     - } -} -``` - -执行结果: - -PNG - -## 03、算法小知识 - -> 骑士巡逻(英语:Knight's tour)是指在按照国际象棋中骑士的规定走法走遍整个棋盘的每一个方格,而且每个网格只能够经过一次。假若骑士能够从走回到最初位置,则称此巡逻为“封闭巡逻”,否则,称为“开巡逻”。对于8*8棋盘,一共有26,534,728,821,064种封闭巡逻,但是到底有多少种开巡逻仍然未知。 - -PNG - -PNG - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/1.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/1.gif" deleted file mode 100644 index f29e0232..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/1.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/10.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/10.jpg" deleted file mode 100644 index 3d23366f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/10.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/11.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/11.jpg" deleted file mode 100644 index 7956b46c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/11.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/12.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/12.gif" deleted file mode 100644 index cf349b1d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/12.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/13.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/13.gif" deleted file mode 100644 index cdf43fcc..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/13.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/2.jpg" deleted file mode 100644 index 6372b159..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/3.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/3.gif" deleted file mode 100644 index 81c7df09..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/3.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/4.jpg" deleted file mode 100644 index 7277d184..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/5.jpg" deleted file mode 100644 index fa63177c..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/6.jpg" deleted file mode 100644 index e2af1d3d..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/6.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/7.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/7.jpg" deleted file mode 100644 index 2709e75e..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/7.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/8.gif" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/8.gif" deleted file mode 100644 index 66c3a93b..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/8.gif" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/9.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/9.jpg" deleted file mode 100644 index 996583f4..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/51/9.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52.md" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52.md" deleted file mode 100644 index 8569e683..00000000 --- "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52.md" +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: 螺旋矩阵Ⅱ(59) -date: 2020-07-12 ---- - -> 今天是小浩算法 “365刷题计划” 第 108 天。为大家讲解 leetcode 第 59 题,是一道中等难度的题目。 - -
- -大家也可以先看下该题的第一个版本: - - [螺旋矩阵Ⅰ(54)](1.99.其他补充题目/01.md) - -
- -本类题目在面试时出现的频率**极高**,尤其是对于工作年限在三年内的同学。因为该题非常考验 coding 能力,**尤其是对边界条件的处理**。 - -
- -很容易筛选面试者。 - -PNG - -
- -PNG - -## 01、题目示例 - -> 做这道题之前,可以通过上面的链接做一下螺旋矩阵Ⅰ - -
- -| 第59题:螺旋矩阵Ⅱ | -| ------------------------------------------------------------ | -| 给定一个正整数 n,生成一个包含 1 到 n**2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 | - -
- -**示例:** - -``` -输入: 3 -输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] -``` - -
- -题目理解较为容易,给定 n = 3,那就生成一个 3^2 = 9 的矩阵。大家看下面的图可能更加直观一些: - -PNG - -## 02、题解分析 - -> 螺旋矩阵类的题目,**思路基本都为模拟路径,难点都是考察边界的处理**。虽然也有一些奇淫巧技,但万变不离其宗。 - -
- -既然要模拟路径,先分析下路径是什么: - -
- -
右-下-左-上
- -
- -然后模拟向内环绕的过程,逐层填充: - -PNG - -这种方法其实有一个专业点的名字,叫做:蛇形填数 - -
- -PNG - -
- -这里额外说一下,除了上面这种填充方式外,还有一种填充方式: - -PNG - -两者的区别,只是边界条件设定不同。 - -
- -第一种填充方式的代码: - -```java -//java -class Solution {     - public int[][] generateMatrix(int n) {         - int[][] res = new int[n][n];         - for(int s = 0, e = n - 1, m = 1; s<=e ; s++,e--){             - for (int j = s; j <= e; j++) res[s][j] = m++;             - for (int i = s+1; i <= e; i++) res[i][e] = m++;             - for (int j = e-1; j >= s; j--) res[e][j] = m++;            - for (int i = e-1; i >= s+1; i--) res[i][s] = m++;         - }         - return res;     - } -} -``` - -第二种填充方式的代码: - -```java -//java -class Solution {     - public int[][] generateMatrix(int n) {         - int[][] res = new int[n][n];         - for (int s = 0, e = n - 1, m = 1; s <= e; s++, e--) {             - if (s == e) res[s][e] = m++;             - for (int j = s; j <= e - 1; j++) res[s][j] = m++;             - for (int i = s; i <= e - 1; i++) res[i][e] = m++;             - for (int j = e; j >= s + 1; j--) res[e][j] = m++;             - for (int i = e; i >= s + 1; i--) res[i][s] = m++;         - }         - return res;     - } -} -``` - -看完这两种解法,有没有 get✔ 到这道题目的核心呢?正是大量的边界操作,让这道题目成为了面试官的香饽饽。如果 coding 能力比较差,基本都会栽到这道题目上。 - -
- -所以,非常建议基础较差的同学,认真练习一下上面的两种实现。 - -
- -## 03、相似题目 - -> 然后这里我准备了几道同一类型的题目,建议大家刷一刷。完成之后可能会有一些不一样的思考。 - - [螺旋矩阵Ⅰ(54)](1.99.其他补充题目/01.md) - - [旋转图像(48)](1.99.其他补充题目/51.md) - - [生命游戏(289)](1.99.其他补充题目/31.md) - -
- -今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧! \ No newline at end of file diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/1.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/1.jpg" deleted file mode 100644 index 41ca46af..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/1.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/2.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/2.jpg" deleted file mode 100644 index e0a574d8..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/2.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/3.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/3.jpg" deleted file mode 100644 index 42204586..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/3.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/4.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/4.jpg" deleted file mode 100644 index f822f4ed..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/4.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/5.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/5.jpg" deleted file mode 100644 index b2d75342..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/5.jpg" and /dev/null differ diff --git "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/6.jpg" "b/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/6.jpg" deleted file mode 100644 index 6a22cc0f..00000000 Binary files "a/website/1.99.\345\205\266\344\273\226\350\241\245\345\205\205\351\242\230\347\233\256/52/6.jpg" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/0.hello.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/0.hello.md" deleted file mode 100644 index fb065357..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/0.hello.md" +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: 排序专栏 ---- - -所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。是《数据结构与算法》中最基本的算法之一。 - -> 我们常说的十大排序算法为:冒泡、选择、插入、希尔、归并、快速、堆、计数、桶、基数 - -## 基本分类 - -我们常根据是否可以在线性时间内比较对其分类: - -![总体分类](./res/sort-0.png) - -## 时间复杂度: - -![时间复杂度](./res/sort-1.png) - -## 如何记忆时间复杂度呢? - -1. 平方阶 (O(n2)) 插入、选择、冒泡 -2. 线性对数阶 (O(nlog2n)) 快速、归并、堆 -3. 特殊的希尔 O(n^(1.3—2)) -4. 牛皮的线性 基数、桶、箱、计数 - -## 啥是稳定: - -稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面。 -不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面。 - -## 哪些稳定: - -稳定:冒泡、插入、归并和基数。 -不稳定:选择、快速、希尔、堆。 - -**排序算法大纲** - -1. [冒泡排序](1.bubbleSort.md) -2. [选择排序](2.selectionSort.md) -3. [插入排序](3.insertionSort.md) -4. [希尔排序](4.shellSort.md) -5. [归并排序](5.mergeSort.md) -6. [快速排序](6.quickSort.md) -7. [堆排序](7.heapSort.md) -8. [计数排序](8.countingSort.md) -9. [桶排序](9.bucketSort.md) -10. [基数排序](10.radixSort.md) - ----- \ No newline at end of file diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/1.bubbleSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/1.bubbleSort.md" deleted file mode 100644 index 91af5806..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/1.bubbleSort.md" +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: 冒泡排序 ---- - -冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 - -作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。 - - -## 1. 算法步骤 - -1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 - -2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 - -3. 针对所有的元素重复以上的步骤,除了最后一个。 - -4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 - - -## 2. 动图演示 - -![动图演示](./res/bubbleSort.gif) - - -## 3. 最慢和最快 - -正序时最快,反序时最慢 - -## 4. JavaScript 代码实现 - -```js -function bubbleSort(arr) { - var len = arr.length; - for (var i = 0; i < len - 1; i++) { - for (var j = 0; j < len - 1 - i; j++) { - if (arr[j] > arr[j+1]) { // 相邻元素两两对比 - var temp = arr[j+1]; // 元素交换 - arr[j+1] = arr[j]; - arr[j] = temp; - } - } - } - return arr; -} -``` - -## 5. Python 代码实现 - -```python -def bubbleSort(arr): - for i in range(1, len(arr)): - for j in range(0, len(arr)-i): - if arr[j] > arr[j+1]: - arr[j], arr[j + 1] = arr[j + 1], arr[j] - return arr -``` - -## 6. Go 代码实现 - -```go -func bubbleSort(arr []int) []int { - length := len(arr) - for i := 0; i < length; i++ { - for j := 0; j < length-1-i; j++ { - if arr[j] > arr[j+1] { - arr[j], arr[j+1] = arr[j+1], arr[j] - } - } - } - return arr -} -``` - -## 7. Java 代码实现 - -```java -public class BubbleSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - for (int i = 1; i < arr.length; i++) { - // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。 - boolean flag = true; - - for (int j = 0; j < arr.length - i; j++) { - if (arr[j] > arr[j + 1]) { - int tmp = arr[j]; - arr[j] = arr[j + 1]; - arr[j + 1] = tmp; - - flag = false; - } - } - - if (flag) { - break; - } - } - return arr; - } -} -``` - -## 8. PHP 代码实现 - -```php -function bubbleSort($arr) -{ - $len = count($arr); - for ($i = 0; $i < $len - 1; $i++) { - for ($j = 0; $j < $len - 1 - $i; $j++) { - if ($arr[$j] > $arr[$j+1]) { - $tmp = $arr[$j]; - $arr[$j] = $arr[$j+1]; - $arr[$j+1] = $tmp; - } - } - } - return $arr; -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/10.radixSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/10.radixSort.md" deleted file mode 100644 index f7c39662..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/10.radixSort.md" +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: 基数排序 ---- - -基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 - - -## 1. 基数排序 vs 计数排序 vs 桶排序 - -基数排序有两种方法: - -这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异案例看大家发的: - - - 基数排序:根据键值的每位数字来分配桶; - - 计数排序:每个桶只存储单一键值; - - 桶排序:每个桶存储一定范围的数值; - - -## 2. LSD 基数排序动图演示 - -![动图演示](./res/radixSort.gif) - - -## 3. JavaScript 代码实现 - -```js -//LSD Radix Sort -var counter = []; -function radixSort(arr, maxDigit) { - var mod = 10; - var dev = 1; - for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) { - for(var j = 0; j < arr.length; j++) { - var bucket = parseInt((arr[j] % mod) / dev); - if(counter[bucket]==null) { - counter[bucket] = []; - } - counter[bucket].push(arr[j]); - } - var pos = 0; - for(var j = 0; j < counter.length; j++) { - var value = null; - if(counter[j]!=null) { - while ((value = counter[j].shift()) != null) { - arr[pos++] = value; - } - } - } - } - return arr; -} -``` - - -## 4. python 代码实现 - -```python -def radix(arr): - - digit = 0 - max_digit = 1 - max_value = max(arr) - --- -title: 找出列表中最大的位数 - while 10**max_digit < max_value: - max_digit = max_digit + 1 - - while digit < max_digit: - temp = [[] for i in range(10)] - for i in arr: - --- -title: 求出每一个元素的个、十、百位的值 - t = int((i/10**digit)%10) - temp[t].append(i) - - coll = [] - for bucket in temp: - for i in bucket: - coll.append(i) - - arr = coll - digit = digit + 1 - - return arr -``` - - -## 5. Java 代码实现 - -```java -/** - * 基数排序 - * 考虑负数的情况还可以参考: https://code.i-harness.com/zh-CN/q/e98fa9 - */ -public class RadixSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - int maxDigit = getMaxDigit(arr); - return radixSort(arr, maxDigit); - } - - /** - * 获取最高位数 - */ - private int getMaxDigit(int[] arr) { - int maxValue = getMaxValue(arr); - return getNumLenght(maxValue); - } - - private int getMaxValue(int[] arr) { - int maxValue = arr[0]; - for (int value : arr) { - if (maxValue < value) { - maxValue = value; - } - } - return maxValue; - } - - protected int getNumLenght(long num) { - if (num == 0) { - return 1; - } - int lenght = 0; - for (long temp = num; temp != 0; temp /= 10) { - lenght++; - } - return lenght; - } - - private int[] radixSort(int[] arr, int maxDigit) { - int mod = 10; - int dev = 1; - - for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) { - // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10) - int[][] counter = new int[mod * 2][0]; - - for (int j = 0; j < arr.length; j++) { - int bucket = ((arr[j] % mod) / dev) + mod; - counter[bucket] = arrayAppend(counter[bucket], arr[j]); - } - - int pos = 0; - for (int[] bucket : counter) { - for (int value : bucket) { - arr[pos++] = value; - } - } - } - - return arr; - } - - /** - * 自动扩容,并保存数据 - * - * @param arr - * @param value - */ - private int[] arrayAppend(int[] arr, int value) { - arr = Arrays.copyOf(arr, arr.length + 1); - arr[arr.length - 1] = value; - return arr; - } -} -``` - -## 6. PHP 代码实现 - -```php -function radixSort($arr, $maxDigit = null) -{ - if ($maxDigit === null) { - $maxDigit = max($arr); - } - $counter = []; - for ($i = 0; $i < $maxDigit; $i++) { - for ($j = 0; $j < count($arr); $j++) { - preg_match_all('/\d/', (string) $arr[$j], $matches); - $numArr = $matches[0]; - $lenTmp = count($numArr); - $bucket = array_key_exists($lenTmp - $i - 1, $numArr) - ? intval($numArr[$lenTmp - $i - 1]) - : 0; - if (!array_key_exists($bucket, $counter)) { - $counter[$bucket] = []; - } - $counter[$bucket][] = $arr[$j]; - } - $pos = 0; - for ($j = 0; $j < count($counter); $j++) { - $value = null; - if ($counter[$j] !== null) { - while (($value = array_shift($counter[$j])) !== null) { - $arr[$pos++] = $value; - } - } - } - } - - return $arr; -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/2.selectionSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/2.selectionSort.md" deleted file mode 100644 index b16ba180..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/2.selectionSort.md" +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: 选择排序 ---- - -选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。 - - -## 1. 算法步骤 - -1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 - -2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 - -3. 重复第二步,直到所有元素均排序完毕。 - - -## 2. 动图演示 - -![动图演示](./res/selectionSort.gif) - - -## 3. JavaScript 代码实现 - -```js -function selectionSort(arr) { - var len = arr.length; - var minIndex, temp; - for (var i = 0; i < len - 1; i++) { - minIndex = i; - for (var j = i + 1; j < len; j++) { - if (arr[j] < arr[minIndex]) { // 寻找最小的数 - minIndex = j; // 将最小数的索引保存 - } - } - temp = arr[i]; - arr[i] = arr[minIndex]; - arr[minIndex] = temp; - } - return arr; -} -``` - -## 4. Python 代码实现 - -```python -def selectionSort(arr): - for i in range(len(arr) - 1): - --- -title: 记录最小数的索引 - minIndex = i - for j in range(i + 1, len(arr)): - if arr[j] < arr[minIndex]: - minIndex = j - --- -title: i 不是最小数时,将 i 和最小数进行交换 - if i != minIndex: - arr[i], arr[minIndex] = arr[minIndex], arr[i] - return arr -``` - -## 5. Go 代码实现 - -```go -func selectionSort(arr []int) []int { - length := len(arr) - for i := 0; i < length-1; i++ { - min := i - for j := i + 1; j < length; j++ { - if arr[min] > arr[j] { - min = j - } - } - arr[i], arr[min] = arr[min], arr[i] - } - return arr -} -``` - -## 6. Java 代码实现 - -```java -public class SelectionSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - // 总共要经过 N-1 轮比较 - for (int i = 0; i < arr.length - 1; i++) { - int min = i; - - // 每轮需要比较的次数 N-i - for (int j = i + 1; j < arr.length; j++) { - if (arr[j] < arr[min]) { - // 记录目前能找到的最小值元素的下标 - min = j; - } - } - - // 将找到的最小值和i位置所在的值进行交换 - if (i != min) { - int tmp = arr[i]; - arr[i] = arr[min]; - arr[min] = tmp; - } - - } - return arr; - } -} -``` - -## 7. PHP 代码实现 - -```php -function selectionSort($arr) -{ - $len = count($arr); - for ($i = 0; $i < $len - 1; $i++) { - $minIndex = $i; - for ($j = $i + 1; $j < $len; $j++) { - if ($arr[$j] < $arr[$minIndex]) { - $minIndex = $j; - } - } - $temp = $arr[$i]; - $arr[$i] = $arr[$minIndex]; - $arr[$minIndex] = $temp; - } - return $arr; -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/3.insertionSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/3.insertionSort.md" deleted file mode 100644 index daf30736..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/3.insertionSort.md" +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: 插入排序 ---- - -插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 - -插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。 - - -## 1. 算法步骤 - -1. 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 - -2. 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。) - - -## 2. 动图演示 - -![动图演示](./res/insertionSort.gif) - - -## 3. JavaScript 代码实现 - -```js -function insertionSort(arr) { - var len = arr.length; - var preIndex, current; - for (var i = 1; i < len; i++) { - preIndex = i - 1; - current = arr[i]; - while(preIndex >= 0 && arr[preIndex] > current) { - arr[preIndex+1] = arr[preIndex]; - preIndex--; - } - arr[preIndex+1] = current; - } - return arr; -} -``` - -## 4. Python 代码实现 - -```python -def insertionSort(arr): - for i in range(len(arr)): - preIndex = i-1 - current = arr[i] - while preIndex >= 0 and arr[preIndex] > current: - arr[preIndex+1] = arr[preIndex] - preIndex-=1 - arr[preIndex+1] = current -    return arr -``` - -## 5. Go 代码实现 -```go -func insertionSort(arr []int) []int { - for i := range arr { - preIndex := i - 1 - current := arr[i] - for preIndex >= 0 && arr[preIndex] > current { - arr[preIndex+1] = arr[preIndex] - preIndex -= 1 - } - arr[preIndex+1] = current - } - return arr -} -``` - -## 6. Java 代码实现 - -```java -public class InsertSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的 - for (int i = 1; i < arr.length; i++) { - - // 记录要插入的数据 - int tmp = arr[i]; - - // 从已经排序的序列最右边的开始比较,找到比其小的数 - int j = i; - while (j > 0 && tmp < arr[j - 1]) { - arr[j] = arr[j - 1]; - j--; - } - - // 存在比其小的数,插入 - if (j != i) { - arr[j] = tmp; - } - - } - return arr; - } -} -``` - -## 7. PHP 代码实现 - -```php -function insertionSort($arr) -{ - $len = count($arr); - for ($i = 1; $i < $len; $i++) { - $preIndex = $i - 1; - $current = $arr[$i]; - while($preIndex >= 0 && $arr[$preIndex] > $current) { - $arr[$preIndex+1] = $arr[$preIndex]; - $preIndex--; - } - $arr[$preIndex+1] = $current; - } - return $arr; -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/4.shellSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/4.shellSort.md" deleted file mode 100644 index 83466cb4..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/4.shellSort.md" +++ /dev/null @@ -1,148 +0,0 @@ ---- -title: 希尔排序 ---- - -希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 - -希尔排序是基于插入排序的以下两点性质而提出改进方法的: - - - 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; - - 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位; - -希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 - - -## 1. 算法步骤 - -1. 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; - -2. 按增量序列个数 k,对序列进行 k 趟排序; - -3. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 - - -## 2. JavaScript 代码实现 - -```js -function shellSort(arr) { - var len = arr.length, - temp, - gap = 1; - while(gap < len/3) { //动态定义间隔序列 - gap =gap*3+1; - } - for (gap; gap > 0; gap = Math.floor(gap/3)) { - for (var i = gap; i < len; i++) { - temp = arr[i]; - for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) { - arr[j+gap] = arr[j]; - } - arr[j+gap] = temp; - } - } - return arr; -} -``` - -## 3. Python 代码实现 - -```python -def shellSort(arr): - import math - gap=1 - while(gap < len(arr)/3): - gap = gap*3+1 - while gap > 0: - for i in range(gap,len(arr)): - temp = arr[i] - j = i-gap - while j >=0 and arr[j] > temp: - arr[j+gap]=arr[j] - j-=gap - arr[j+gap] = temp - gap = math.floor(gap/3) - return arr -} -``` - -## 4. Go 代码实现 - -```go -func shellSort(arr []int) []int { - length := len(arr) - gap := 1 - for gap < length/3 { - gap = gap*3 + 1 - } - for gap > 0 { - for i := gap; i < length; i++ { - temp := arr[i] - j := i - gap - for j >= 0 && arr[j] > temp { - arr[j+gap] = arr[j] - j -= gap - } - arr[j+gap] = temp - } - gap = gap / 3 - } - return arr -} -``` - -## 5. Java 代码实现 - -```java -public class ShellSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - int gap = 1; - while (gap < arr.length/3) { - gap = gap * 3 + 1; - } - - while (gap > 0) { - for (int i = gap; i < arr.length; i++) { - int tmp = arr[i]; - int j = i - gap; - while (j >= 0 && arr[j] > tmp) { - arr[j + gap] = arr[j]; - j -= gap; - } - arr[j + gap] = tmp; - } - gap = (int) Math.floor(gap / 3); - } - - return arr; - } -} -``` - -## 6. PHP 代码实现 - -```php -function shellSort($arr) -{ - $len = count($arr); - $temp = 0; - $gap = 1; - while($gap < $len / 3) { - $gap = $gap * 3 + 1; - } - for ($gap; $gap > 0; $gap = floor($gap / 3)) { - for ($i = $gap; $i < $len; $i++) { - $temp = $arr[$i]; - for ($j = $i - $gap; $j >= 0 && $arr[$j] > $temp; $j -= $gap) { - $arr[$j+$gap] = $arr[$j]; - } - $arr[$j+$gap] = $temp; - } - } - return $arr; -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/5.mergeSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/5.mergeSort.md" deleted file mode 100644 index 79ad1b14..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/5.mergeSort.md" +++ /dev/null @@ -1,227 +0,0 @@ ---- -title: 归并排序 ---- - -归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 - -作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: - - 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法); - - 自下而上的迭代; - -在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但是对于递归法,作者却认为: - -> However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle. -> -> 然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。 - - -说实话,我不太理解这句话。意思是 JavaScript 编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教。 - -和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。 - - -## 2. 算法步骤 - -1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列; - -2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置; - -3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置; - -4. 重复步骤 3 直到某一指针达到序列尾; - -5. 将另一序列剩下的所有元素直接复制到合并序列尾。 - - -## 3. 动图演示 - -![动图演示](./res/mergeSort.gif) - - -## 4. JavaScript 代码实现 - -```js -function mergeSort(arr) { // 采用自上而下的递归方法 - var len = arr.length; - if(len < 2) { - return arr; - } - var middle = Math.floor(len / 2), - left = arr.slice(0, middle), - right = arr.slice(middle); - return merge(mergeSort(left), mergeSort(right)); -} - -function merge(left, right) -{ - var result = []; - - while (left.length && right.length) { - if (left[0] <= right[0]) { - result.push(left.shift()); - } else { - result.push(right.shift()); - } - } - - while (left.length) - result.push(left.shift()); - - while (right.length) - result.push(right.shift()); - - return result; -} -``` - -## 5. Python 代码实现 - -```python -def mergeSort(arr): - import math - if(len(arr)<2): - return arr - middle = math.floor(len(arr)/2) - left, right = arr[0:middle], arr[middle:] - return merge(mergeSort(left), mergeSort(right)) - -def merge(left,right): - result = [] - while left and right: - if left[0] <= right[0]: - result.append(left.pop(0)); - else: - result.append(right.pop(0)); - while left: - result.append(left.pop(0)); - while right: - result.append(right.pop(0)); - return result -``` - -## 6. Go 代码实现 - -```go -func mergeSort(arr []int) []int { - length := len(arr) - if length < 2 { - return arr - } - middle := length / 2 - left := arr[0:middle] - right := arr[middle:] - return merge(mergeSort(left), mergeSort(right)) -} - -func merge(left []int, right []int) []int { - var result []int - for len(left) != 0 && len(right) != 0 { - if left[0] <= right[0] { - result = append(result, left[0]) - left = left[1:] - } else { - result = append(result, right[0]) - right = right[1:] - } - } - - for len(left) != 0 { - result = append(result, left[0]) - left = left[1:] - } - - for len(right) != 0 { - result = append(result, right[0]) - right = right[1:] - } - - return result -} -``` - -## 7. Java 代码实现 - -```java -public class MergeSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - if (arr.length < 2) { - return arr; - } - int middle = (int) Math.floor(arr.length / 2); - - int[] left = Arrays.copyOfRange(arr, 0, middle); - int[] right = Arrays.copyOfRange(arr, middle, arr.length); - - return merge(sort(left), sort(right)); - } - - protected int[] merge(int[] left, int[] right) { - int[] result = new int[left.length + right.length]; - int i = 0; - while (left.length > 0 && right.length > 0) { - if (left[0] <= right[0]) { - result[i++] = left[0]; - left = Arrays.copyOfRange(left, 1, left.length); - } else { - result[i++] = right[0]; - right = Arrays.copyOfRange(right, 1, right.length); - } - } - - while (left.length > 0) { - result[i++] = left[0]; - left = Arrays.copyOfRange(left, 1, left.length); - } - - while (right.length > 0) { - result[i++] = right[0]; - right = Arrays.copyOfRange(right, 1, right.length); - } - - return result; - } - -} -``` - -## 8. PHP 代码实现 - -```php -function mergeSort($arr) -{ - $len = count($arr); - if ($len < 2) { - return $arr; - } - $middle = floor($len / 2); - $left = array_slice($arr, 0, $middle); - $right = array_slice($arr, $middle); - return merge(mergeSort($left), mergeSort($right)); -} - -function merge($left, $right) -{ - $result = []; - - while (count($left) > 0 && count($right) > 0) { - if ($left[0] <= $right[0]) { - $result[] = array_shift($left); - } else { - $result[] = array_shift($right); - } - } - - while (count($left)) - $result[] = array_shift($left); - - while (count($right)) - $result[] = array_shift($right); - - return $result; -} -``` \ No newline at end of file diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/6.quickSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/6.quickSort.md" deleted file mode 100644 index 6511131b..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/6.quickSort.md" +++ /dev/null @@ -1,257 +0,0 @@ ---- -title: 快速排序 ---- - -快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 - -快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 - -快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。 - -快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案: - -> 快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。 - - -## 1. 算法步骤 - -1. 从数列中挑出一个元素,称为 “基准”(pivot); - -2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; - -3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; - -递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 - - -## 2. 动图演示 - -![动图演示](./res/quickSort.gif) - - -## 3. JavaScript 代码实现 - -```js -function quickSort(arr, left, right) { - var len = arr.length, - partitionIndex, - left = typeof left != 'number' ? 0 : left, - right = typeof right != 'number' ? len - 1 : right; - - if (left < right) { - partitionIndex = partition(arr, left, right); - quickSort(arr, left, partitionIndex-1); - quickSort(arr, partitionIndex+1, right); - } - return arr; -} - -function partition(arr, left ,right) { // 分区操作 - var pivot = left, // 设定基准值(pivot) - index = pivot + 1; - for (var i = index; i <= right; i++) { - if (arr[i] < arr[pivot]) { - swap(arr, i, index); - index++; - } - } - swap(arr, pivot, index - 1); - return index-1; -} - -function swap(arr, i, j) { - var temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; -} -function partition2(arr, low, high) { - let pivot = arr[low]; - while (low < high) { - while (low < high && arr[high] > pivot) { - --high; - } - arr[low] = arr[high]; - while (low < high && arr[low] <= pivot) { - ++low; - } - arr[high] = arr[low]; - } - arr[low] = pivot; - return low; -} - -function quickSort2(arr, low, high) { - if (low < high) { - let pivot = partition2(arr, low, high); - quickSort2(arr, low, pivot - 1); - quickSort2(arr, pivot + 1, high); - } - return arr; -} - -``` - - -## 4. Python 代码实现 - -```python -def quickSort(arr, left=None, right=None): - left = 0 if not isinstance(left,(int, float)) else left - right = len(arr)-1 if not isinstance(right,(int, float)) else right - if left < right: - partitionIndex = partition(arr, left, right) - quickSort(arr, left, partitionIndex-1) - quickSort(arr, partitionIndex+1, right) - return arr - -def partition(arr, left, right): - pivot = left - index = pivot+1 - i = index - while i <= right: - if arr[i] < arr[pivot]: - swap(arr, i, index) - index+=1 - i+=1 - swap(arr,pivot,index-1) - return index-1 - -def swap(arr, i, j): - arr[i], arr[j] = arr[j], arr[i] -``` - -## 5. Go 代码实现 - -```go -func quickSort(arr []int) []int { - return _quickSort(arr, 0, len(arr)-1) -} - -func _quickSort(arr []int, left, right int) []int { - if left < right { - partitionIndex := partition(arr, left, right) - _quickSort(arr, left, partitionIndex-1) - _quickSort(arr, partitionIndex+1, right) - } - return arr -} - -func partition(arr []int, left, right int) int { - pivot := left - index := pivot + 1 - - for i := index; i <= right; i++ { - if arr[i] < arr[pivot] { - swap(arr, i, index) - index += 1 - } - } - swap(arr, pivot, index-1) - return index - 1 -} - -func swap(arr []int, i, j int) { - arr[i], arr[j] = arr[j], arr[i] -} -``` - -## 6. C++版 - - -```C++ - //严蔚敏《数据结构》标准分割函数 - Paritition1(int A[], int low, int high) { - int pivot = A[low]; - while (low < high) { - while (low < high && A[high] >= pivot) { - --high; - } - A[low] = A[high]; - while (low < high && A[low] <= pivot) { - ++low; - } - A[high] = A[low]; - } - A[low] = pivot; - return low; - } - - void QuickSort(int A[], int low, int high) //快排母函数 - { - if (low < high) { - int pivot = Paritition1(A, low, high); - QuickSort(A, low, pivot - 1); - QuickSort(A, pivot + 1, high); - } - } -``` - -## 7. Java 代码实现 - -```java -public class QuickSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - return quickSort(arr, 0, arr.length - 1); - } - - private int[] quickSort(int[] arr, int left, int right) { - if (left < right) { - int partitionIndex = partition(arr, left, right); - quickSort(arr, left, partitionIndex - 1); - quickSort(arr, partitionIndex + 1, right); - } - return arr; - } - - private int partition(int[] arr, int left, int right) { - // 设定基准值(pivot) - int pivot = left; - int index = pivot + 1; - for (int i = index; i <= right; i++) { - if (arr[i] < arr[pivot]) { - swap(arr, i, index); - index++; - } - } - swap(arr, pivot, index - 1); - return index - 1; - } - - private void swap(int[] arr, int i, int j) { - int temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - -} -``` - -## 8. PHP 代码实现 - -```php -function quickSort($arr) -{ - if (count($arr) <= 1) - return $arr; - $middle = $arr[0]; - $leftArray = array(); - $rightArray = array(); - - for ($i = 1; $i < count($arr); $i++) { - if ($arr[$i] > $middle) - $rightArray[] = $arr[$i]; - else - $leftArray[] = $arr[$i]; - } - $leftArray = quickSort($leftArray); - $leftArray[] = $middle; - - $rightArray = quickSort($rightArray); - return array_merge($leftArray, $rightArray); -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/7.heapSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/7.heapSort.md" deleted file mode 100644 index b51c46e0..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/7.heapSort.md" +++ /dev/null @@ -1,259 +0,0 @@ ---- -title: 堆排序 ---- - -堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法: - -1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; -2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; - -堆排序的平均时间复杂度为 Ο(nlogn)。 - - -## 1. 算法步骤 - -1. 将待排序序列构建成一个堆 H[0……n-1],根据(升序降序需求)选择大顶堆或小顶堆; - -2. 把堆首(最大值)和堆尾互换; - -3. 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置; - -4. 重复步骤 2,直到堆的尺寸为 1。 - - -## 2. 动图演示 - -![动图演示](./res/heapSort.gif) - - -## 3. JavaScript 代码实现 - -```js -var len; // 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量 - -function buildMaxHeap(arr) { // 建立大顶堆 - len = arr.length; - for (var i = Math.floor(len/2); i >= 0; i--) { - heapify(arr, i); - } -} - -function heapify(arr, i) { // 堆调整 - var left = 2 * i + 1, - right = 2 * i + 2, - largest = i; - - if (left < len && arr[left] > arr[largest]) { - largest = left; - } - - if (right < len && arr[right] > arr[largest]) { - largest = right; - } - - if (largest != i) { - swap(arr, i, largest); - heapify(arr, largest); - } -} - -function swap(arr, i, j) { - var temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; -} - -function heapSort(arr) { - buildMaxHeap(arr); - - for (var i = arr.length-1; i > 0; i--) { - swap(arr, 0, i); - len--; - heapify(arr, 0); - } - return arr; -} -``` -## 4. Python 代码实现 - -```python -def buildMaxHeap(arr): - import math - for i in range(math.floor(len(arr)/2),-1,-1): - heapify(arr,i) - -def heapify(arr, i): - left = 2*i+1 - right = 2*i+2 - largest = i - if left < arrLen and arr[left] > arr[largest]: - largest = left - if right < arrLen and arr[right] > arr[largest]: - largest = right - - if largest != i: - swap(arr, i, largest) - heapify(arr, largest) - -def swap(arr, i, j): - arr[i], arr[j] = arr[j], arr[i] - -def heapSort(arr): - global arrLen - arrLen = len(arr) - buildMaxHeap(arr) - for i in range(len(arr)-1,0,-1): - swap(arr,0,i) - arrLen -=1 - heapify(arr, 0) -    return arr -``` - -## 5. Go 代码实现 - -```go -func heapSort(arr []int) []int { - arrLen := len(arr) - buildMaxHeap(arr, arrLen) - for i := arrLen - 1; i >= 0; i-- { - swap(arr, 0, i) - arrLen -= 1 - heapify(arr, 0, arrLen) - } - return arr -} - -func buildMaxHeap(arr []int, arrLen int) { - for i := arrLen / 2; i >= 0; i-- { - heapify(arr, i, arrLen) - } -} - -func heapify(arr []int, i, arrLen int) { - left := 2*i + 1 - right := 2*i + 2 - largest := i - if left < arrLen && arr[left] > arr[largest] { - largest = left - } - if right < arrLen && arr[right] > arr[largest] { - largest = right - } - if largest != i { - swap(arr, i, largest) - heapify(arr, largest, arrLen) - } -} - -func swap(arr []int, i, j int) { - arr[i], arr[j] = arr[j], arr[i] -} -``` - -## 6. Java 代码实现 - -```java -public class HeapSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - int len = arr.length; - - buildMaxHeap(arr, len); - - for (int i = len - 1; i > 0; i--) { - swap(arr, 0, i); - len--; - heapify(arr, 0, len); - } - return arr; - } - - private void buildMaxHeap(int[] arr, int len) { - for (int i = (int) Math.floor(len / 2); i >= 0; i--) { - heapify(arr, i, len); - } - } - - private void heapify(int[] arr, int i, int len) { - int left = 2 * i + 1; - int right = 2 * i + 2; - int largest = i; - - if (left < len && arr[left] > arr[largest]) { - largest = left; - } - - if (right < len && arr[right] > arr[largest]) { - largest = right; - } - - if (largest != i) { - swap(arr, i, largest); - heapify(arr, largest, len); - } - } - - private void swap(int[] arr, int i, int j) { - int temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - -} -``` - -## 7. PHP 代码实现 - -```php -function buildMaxHeap(&$arr) -{ - global $len; - for ($i = floor($len/2); $i >= 0; $i--) { - heapify($arr, $i); - } -} - -function heapify(&$arr, $i) -{ - global $len; - $left = 2 * $i + 1; - $right = 2 * $i + 2; - $largest = $i; - - if ($left < $len && $arr[$left] > $arr[$largest]) { - $largest = $left; - } - - if ($right < $len && $arr[$right] > $arr[$largest]) { - $largest = $right; - } - - if ($largest != $i) { - swap($arr, $i, $largest); - heapify($arr, $largest); - } -} - -function swap(&$arr, $i, $j) -{ - $temp = $arr[$i]; - $arr[$i] = $arr[$j]; - $arr[$j] = $temp; -} - -function heapSort($arr) { - global $len; - $len = count($arr); - buildMaxHeap($arr); - for ($i = count($arr) - 1; $i > 0; $i--) { - swap($arr, 0, $i); - $len--; - heapify($arr, 0); - } - return $arr; -} -``` diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/8.countingSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/8.countingSort.md" deleted file mode 100644 index 9a415c26..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/8.countingSort.md" +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: 计数排序 ---- - -计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 - - -## 1. 算法步骤 - -1. 找出原数组中元素值最大的,记为max。 - -2. 创建一个新数组count,其长度是max加1,其元素默认值都为0。 - -3. 遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。 - -4. 创建结果数组result,起始索引index。 - -5. 遍历count数组,找出其中元素值大于0的元素,将其对应的索引作为元素值填充到result数组中去,每处理一次,count中的该元素值减1,直到该元素值不大于0,依次处理count中剩下的元素。 - -6. 返回结果数组result。 - -## 2. 动图演示 - -![动图演示](./res/countingSort.gif) - -## 3. JavaScript 代码实现 - -```js -function countingSort(arr, maxValue) { - var bucket = new Array(maxValue+1), - sortedIndex = 0; - arrLen = arr.length, - bucketLen = maxValue + 1; - - for (var i = 0; i < arrLen; i++) { - if (!bucket[arr[i]]) { - bucket[arr[i]] = 0; - } - bucket[arr[i]]++; - } - - for (var j = 0; j < bucketLen; j++) { - while(bucket[j] > 0) { - arr[sortedIndex++] = j; - bucket[j]--; - } - } - - return arr; -} -``` - -## 4. Python 代码实现 - - -```python -def countingSort(arr, maxValue): - bucketLen = maxValue+1 - bucket = [0]*bucketLen - sortedIndex =0 - arrLen = len(arr) - for i in range(arrLen): - if not bucket[arr[i]]: - bucket[arr[i]]=0 - bucket[arr[i]]+=1 - for j in range(bucketLen): - while bucket[j]>0: - arr[sortedIndex] = j - sortedIndex+=1 - bucket[j]-=1 - return arr -``` - -## 5. Go 代码实现 - -```go -func countingSort(arr []int, maxValue int) []int { - bucketLen := maxValue + 1 - bucket := make([]int, bucketLen) // 初始为0的数组 - - sortedIndex := 0 - length := len(arr) - - for i := 0; i < length; i++ { - bucket[arr[i]] += 1 - } - - for j := 0; j < bucketLen; j++ { - for bucket[j] > 0 { - arr[sortedIndex] = j - sortedIndex += 1 - bucket[j] -= 1 - } - } - - return arr -} -``` - -## 6. Java 代码实现 - -```java -public class CountingSort implements IArraySort { - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - int maxValue = getMaxValue(arr); - - return countingSort(arr, maxValue); - } - - private int[] countingSort(int[] arr, int maxValue) { - int bucketLen = maxValue + 1; - int[] bucket = new int[bucketLen]; - - for (int value : arr) { - bucket[value]++; - } - - int sortedIndex = 0; - for (int j = 0; j < bucketLen; j++) { - while (bucket[j] > 0) { - arr[sortedIndex++] = j; - bucket[j]--; - } - } - return arr; - } - - private int getMaxValue(int[] arr) { - int maxValue = arr[0]; - for (int value : arr) { - if (maxValue < value) { - maxValue = value; - } - } - return maxValue; - } - -} -``` - -## 7. PHP 代码实现 - -```php -function countingSort($arr, $maxValue = null) -{ - if ($maxValue === null) { - $maxValue = max($arr); - } - for ($m = 0; $m < $maxValue + 1; $m++) { - $bucket[] = null; - } - - $arrLen = count($arr); - for ($i = 0; $i < $arrLen; $i++) { - if (!array_key_exists($arr[$i], $bucket)) { - $bucket[$arr[$i]] = 0; - } - $bucket[$arr[$i]]++; - } - - $sortedIndex = 0; - foreach ($bucket as $key => $len) { - if($len !== null){ - for($j = 0; $j < $len; $j++){ - $arr[$sortedIndex++] = $key; - } - } - } - - return $arr; -} -``` \ No newline at end of file diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/9.bucketSort.md" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/9.bucketSort.md" deleted file mode 100644 index 93b59012..00000000 --- "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/9.bucketSort.md" +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: 桶排序 ---- - -桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点: - -1. 在额外空间充足的情况下,尽量增大桶的数量 -2. 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中 - -同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 - - -## 1. 什么时候最快 - -当输入的数据可以均匀的分配到每一个桶中。 - - -## 2. 什么时候最慢 - -当输入的数据被分配到了同一个桶中。 - -## 3. 动图演示 - -![动图演示](./res/bucket.gif) - -## 4. JavaScript 代码实现 - -```js -function bucketSort(arr, bucketSize) { - if (arr.length === 0) { - return arr; - } - - var i; - var minValue = arr[0]; - var maxValue = arr[0]; - for (i = 1; i < arr.length; i++) { - if (arr[i] < minValue) { - minValue = arr[i]; // 输入数据的最小值 - } else if (arr[i] > maxValue) { - maxValue = arr[i]; // 输入数据的最大值 - } - } - - //桶的初始化 - var DEFAULT_BUCKET_SIZE = 5; // 设置桶的默认数量为5 - bucketSize = bucketSize || DEFAULT_BUCKET_SIZE; - var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1; - var buckets = new Array(bucketCount); - for (i = 0; i < buckets.length; i++) { - buckets[i] = []; - } - - //利用映射函数将数据分配到各个桶中 - for (i = 0; i < arr.length; i++) { - buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]); - } - - arr.length = 0; - for (i = 0; i < buckets.length; i++) { - insertionSort(buckets[i]); // 对每个桶进行排序,这里使用了插入排序 - for (var j = 0; j < buckets[i].length; j++) { - arr.push(buckets[i][j]); - } - } - - return arr; -} -``` - -## 5. Java 代码实现 - -```java -public class BucketSort implements IArraySort { - - private static final InsertSort insertSort = new InsertSort(); - - @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - - return bucketSort(arr, 5); - } - - private int[] bucketSort(int[] arr, int bucketSize) throws Exception { - if (arr.length == 0) { - return arr; - } - - int minValue = arr[0]; - int maxValue = arr[0]; - for (int value : arr) { - if (value < minValue) { - minValue = value; - } else if (value > maxValue) { - maxValue = value; - } - } - - int bucketCount = (int) Math.floor((maxValue - minValue) / bucketSize) + 1; - int[][] buckets = new int[bucketCount][0]; - - // 利用映射函数将数据分配到各个桶中 - for (int i = 0; i < arr.length; i++) { - int index = (int) Math.floor((arr[i] - minValue) / bucketSize); - buckets[index] = arrAppend(buckets[index], arr[i]); - } - - int arrIndex = 0; - for (int[] bucket : buckets) { - if (bucket.length <= 0) { - continue; - } - // 对每个桶进行排序,这里使用了插入排序 - bucket = insertSort.sort(bucket); - for (int value : bucket) { - arr[arrIndex++] = value; - } - } - - return arr; - } - - /** - * 自动扩容,并保存数据 - * - * @param arr - * @param value - */ - private int[] arrAppend(int[] arr, int value) { - arr = Arrays.copyOf(arr, arr.length + 1); - arr[arr.length - 1] = value; - return arr; - } - -} -``` - -## 6. PHP 代码实现 - -```php -function bucketSort($arr, $bucketSize = 5) -{ - if (count($arr) === 0) { - return $arr; - } - - $minValue = $arr[0]; - $maxValue = $arr[0]; - for ($i = 1; $i < count($arr); $i++) { - if ($arr[$i] < $minValue) { - $minValue = $arr[$i]; - } else if ($arr[$i] > $maxValue) { - $maxValue = $arr[$i]; - } - } - - $bucketCount = floor(($maxValue - $minValue) / $bucketSize) + 1; - $buckets = array(); - for ($i = 0; $i < count($buckets); $i++) { - $buckets[$i] = []; - } - - for ($i = 0; $i < count($arr); $i++) { - $buckets[floor(($arr[$i] - $minValue) / $bucketSize)][] = $arr[$i]; - } - - $arr = array(); - for ($i = 0; $i < count($buckets); $i++) { - $bucketTmp = $buckets[$i]; - sort($bucketTmp); - for ($j = 0; $j < count($bucketTmp); $j++) { - $arr[] = $bucketTmp[$j]; - } - } - - return $arr; -} -``` \ No newline at end of file diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/bubbleSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/bubbleSort.gif" deleted file mode 100644 index 5f767d45..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/bubbleSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/bucket.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/bucket.gif" deleted file mode 100644 index 3137e0fb..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/bucket.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/countingSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/countingSort.gif" deleted file mode 100644 index df987af7..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/countingSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/heapSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/heapSort.gif" deleted file mode 100644 index 653e17b7..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/heapSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/insertionSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/insertionSort.gif" deleted file mode 100644 index bab6db57..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/insertionSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/mergeSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/mergeSort.gif" deleted file mode 100644 index 3f0adb94..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/mergeSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/quickSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/quickSort.gif" deleted file mode 100644 index 6a3faec9..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/quickSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/radixSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/radixSort.gif" deleted file mode 100644 index f5f8c801..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/radixSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/selectionSort.gif" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/selectionSort.gif" deleted file mode 100644 index 17a2cc7b..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/selectionSort.gif" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/sort-0.png" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/sort-0.png" deleted file mode 100644 index eafe9d6e..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/sort-0.png" and /dev/null differ diff --git "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/sort-1.png" "b/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/sort-1.png" deleted file mode 100644 index 7935fff2..00000000 Binary files "a/website/2.0.\346\216\222\345\272\217\347\263\273\345\210\227/res/sort-1.png" and /dev/null differ diff --git a/website/README.md b/website/README.md deleted file mode 100644 index a03eab9e..00000000 --- a/website/README.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 奥利给 ---- - -这是一个彩蛋。 \ No newline at end of file diff --git a/yarn-error.log b/yarn-error.log deleted file mode 100644 index d5ae00cd..00000000 --- a/yarn-error.log +++ /dev/null @@ -1,45 +0,0 @@ -Arguments: - /Users/lilifan/.nvm/versions/node/v10.15.3/bin/node /Users/lilifan/.yarn/bin/yarn.js install - -PATH: - /Users/lilifan/.yarn/bin:/Users/lilifan/.config/yarn/global/node_modules/.bin:/Users/lilifan/.nvm/versions/node/v10.15.3/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/Users/lilifan/.tnvm/versions/node/v8.11.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Users/lilifan/.yarn/bin:/Users/lilifan/.config/yarn/global/node_modules/.bin:/Users/lilifan/.nvm/versions/node/v10.15.3/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/mysql/bin:/Users/lilifan/Downloads/apache-maven-3.3.9/bin:/usr/local/mysql/bin:/Users/lilifan/Downloads/apache-maven-3.3.9/bin - -Yarn version: - 1.22.4 - -Node version: - 10.15.3 - -Platform: - darwin x64 - -Trace: - Error: connect ECONNREFUSED 0.0.0.0:443 - at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14) - -npm manifest: - { - "name": "geekxh.com", - "version": "1.0.0", - "author": "geek小浩", - "scripts": { - "dev": "vuepress dev learning", - "build": "vuepress build learning" - }, - "devDependencies": { - "algoliasearch": "^4.2.0", - "vuepress": "^1.4.1", - "vuepress-theme-reco": "^1.4.5", - "vuepress-plugin-autobar": "github:boboidream/vuepress-bar" - }, - "description": "易懂的算法教程", - "dependencies": { - "vuejs-paginate": "^2.1.0" - } - } - -yarn manifest: - No manifest - -Lockfile: - No lockfile diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/ActiveMQ\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/ActiveMQ\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230.zip" deleted file mode 100644 index 96a5e8db..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/ActiveMQ\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Dubbo\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Dubbo\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" deleted file mode 100644 index 0f3a036a..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Dubbo\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Dubbo\351\235\242\350\257\225\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Dubbo\351\235\242\350\257\225\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" deleted file mode 100644 index 29e47901..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Dubbo\351\235\242\350\257\225\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/JAVA \351\235\242\350\257\225\351\242\230 18 \347\257\207.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/JAVA \351\235\242\350\257\225\351\242\230 18 \347\257\207.zip" deleted file mode 100644 index 08ce694d..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/JAVA \351\235\242\350\257\225\351\242\230 18 \347\257\207.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/JVM\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/JVM\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index c78daa46..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/JVM\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.zip" deleted file mode 100644 index 80ff451d..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\345\271\266\345\217\221\344\275\223\347\263\273\347\237\245\350\257\206\345\257\274\345\233\276\347\254\224\350\256\260.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\345\271\266\345\217\221\344\275\223\347\263\273\347\237\245\350\257\206\345\257\274\345\233\276\347\254\224\350\256\260.zip" deleted file mode 100644 index a5e94a89..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\345\271\266\345\217\221\344\275\223\347\263\273\347\237\245\350\257\206\345\257\274\345\233\276\347\254\224\350\256\260.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.zip" deleted file mode 100644 index 150944e2..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Java\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Kafka\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Kafka\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index e4602ca3..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Kafka\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Linux\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Linux\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 4539c6a2..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Linux\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MongoDB\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MongoDB\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 97538fdb..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MongoDB\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MyBatis\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MyBatis\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 469541ab..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MyBatis\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MySQL55\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MySQL55\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 5e73885d..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MySQL55\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MySQL\346\200\247\350\203\275\344\274\230\345\214\226\347\232\20421\344\270\252\346\234\200\344\275\263\345\256\236\350\267\265.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MySQL\346\200\247\350\203\275\344\274\230\345\214\226\347\232\20421\344\270\252\346\234\200\344\275\263\345\256\236\350\267\265.zip" deleted file mode 100644 index 02e8f1e7..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/MySQL\346\200\247\350\203\275\344\274\230\345\214\226\347\232\20421\344\270\252\346\234\200\344\275\263\345\256\236\350\267\265.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Netty\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Netty\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 0b64a0f5..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Netty\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Nginx\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Nginx\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 6f660777..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Nginx\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/RabbitMQ\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/RabbitMQ\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index cd2f4302..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/RabbitMQ\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Redis\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Redis\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" deleted file mode 100644 index cd9d76dc..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Redis\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SQL\344\274\230\345\214\226\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SQL\344\274\230\345\214\226\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index cee10e32..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SQL\344\274\230\345\214\226\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringBoot\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringBoot\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 94b9cdf6..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringBoot\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringCloud\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringCloud\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 55aa51ed..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringCloud\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringMVC\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringMVC\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index cfb26eb1..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/SpringMVC\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Spring\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Spring\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 1c95cfb4..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Spring\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Tomcat\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Tomcat\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 2b33c895..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/Tomcat\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/a \350\247\243\345\216\213\345\257\206\347\240\201\350\277\231\351\207\214 .jpg" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/a \350\247\243\345\216\213\345\257\206\347\240\201\350\277\231\351\207\214 .jpg" deleted file mode 100644 index 896d2cf0..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/a \350\247\243\345\216\213\345\257\206\347\240\201\350\277\231\351\207\214 .jpg" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/java\345\220\216\347\253\257\351\235\242\350\257\225\351\242\230\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/java\345\220\216\347\253\257\351\235\242\350\257\225\351\242\230\347\255\224\346\241\210.zip" deleted file mode 100644 index adb947e7..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/java\345\220\216\347\253\257\351\235\242\350\257\225\351\242\230\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/memcached\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/memcached\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 6569202f..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/memcached\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/mysql\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/mysql\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 40481f3d..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/mysql\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/redis\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/redis\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" deleted file mode 100644 index b6033599..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/redis\351\235\242\350\257\225\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/zookeeper\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/zookeeper\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index b0e1be72..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/zookeeper\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\244\232\347\272\277\347\250\213\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\244\232\347\272\277\347\250\213\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 1c6454e1..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\244\232\347\272\277\347\250\213\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\271\266\345\217\221\347\274\226\347\250\213\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\271\266\345\217\221\347\274\226\347\250\213\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" deleted file mode 100644 index ebb18d3d..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\271\266\345\217\221\347\274\226\347\250\213\345\217\212\347\255\224\346\241\210\357\274\210\344\270\212\357\274\211.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\271\266\345\217\221\347\274\226\347\250\213\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\271\266\345\217\221\347\274\226\347\250\213\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" deleted file mode 100644 index 7271fca6..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\271\266\345\217\221\347\274\226\347\250\213\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210\357\274\210\344\270\213\357\274\211.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\274\200\346\272\220\346\241\206\346\236\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\274\200\346\272\220\346\241\206\346\236\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index a35bfe0a..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\274\200\346\272\220\346\241\206\346\236\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\276\256\346\234\215\345\212\241\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\276\256\346\234\215\345\212\241\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index aae492c1..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\345\276\256\346\234\215\345\212\241\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\346\225\260\346\215\256\345\272\223\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\346\225\260\346\215\256\345\272\223\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index b8c3f9c3..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\346\225\260\346\215\256\345\272\223\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 7ea31fbb..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\346\266\210\346\201\257\344\270\255\351\227\264\344\273\266\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\350\256\276\350\256\241\346\250\241\345\274\217\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\350\256\276\350\256\241\346\250\241\345\274\217\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" deleted file mode 100644 index 8c26e362..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\350\256\276\350\256\241\346\250\241\345\274\217\351\235\242\350\257\225\344\270\223\351\242\230\345\217\212\347\255\224\346\241\210.zip" and /dev/null differ diff --git "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\351\235\242\350\257\225\345\277\205\345\244\207\344\271\213\344\271\220\350\247\202\351\224\201\344\270\216\346\202\262\350\247\202\351\224\201.zip" "b/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\351\235\242\350\257\225\345\277\205\345\244\207\344\271\213\344\271\220\350\247\202\351\224\201\344\270\216\346\202\262\350\247\202\351\224\201.zip" deleted file mode 100644 index 4f57e597..00000000 Binary files "a/\345\244\247\345\216\202\351\235\242\347\273\217\346\261\207\346\200\273 100 \347\257\207/\351\235\242\350\257\225\345\277\205\345\244\207\344\271\213\344\271\220\350\247\202\351\224\201\344\270\216\346\202\262\350\247\202\351\224\201.zip" and /dev/null differ diff --git "a/\346\270\205\346\231\260\347\211\210\347\224\265\345\255\220\344\271\246 100 \346\234\254/Python \347\224\265\345\255\220\344\271\246 100 \346\234\254.md" "b/\346\270\205\346\231\260\347\211\210\347\224\265\345\255\220\344\271\246 100 \346\234\254/Python \347\224\265\345\255\220\344\271\246 100 \346\234\254.md" deleted file mode 100644 index 7c5f87ed..00000000 --- "a/\346\270\205\346\231\260\347\211\210\347\224\265\345\255\220\344\271\246 100 \346\234\254/Python \347\224\265\345\255\220\344\271\246 100 \346\234\254.md" +++ /dev/null @@ -1,58 +0,0 @@ -## 下载地址 - -百度云密码:oqu9 - -1、 [Building.Machine.Learning.Systems.with.Pytho.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -2、 [MySQL.Cookbook(第2版).(美)迪布瓦.中文版.扫描版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -3、 [Python.Unix和Linux系统管理指南.(美)基弗特.扫描版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -4、 [Python灰帽子-黑客与逆向工程师的Python编程之道.Justin.Seitz.扫描版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -5、 [精通正则表达式(第三版).(美)佛瑞德.扫描版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -6、 [A Byte of Python.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -7、 [A Primer on Scientfic Programming with Python, Third Edition .pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -8、 [Beginning Python:Using Python 2.6 and Python 3.1.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -9、 [Developing MeeGo apps with Python and QML(1).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -10、 [Django_中文教程.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -11、 [flask-docs.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -12、 [Foundations of Python 3 Network Programming, Second Edition.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -13、 [Head_First_Python(中文版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -14、 [Learning From Data 2nd Ed (Wiley,2007).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -15、 [Learning Python, 5th Edition.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -16、 [Machine_Learning_in_Action.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -17、 [Multitreading.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -18、 [Natural Language Processing with Python.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -19、 [NumPy_1_5_Beginner__039_s_Guide.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -20、 [OReilly.-.Python for Data Analysis.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -21、 [Oreilly - Python Standard Library.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -22、 [OReilly Mining the Social Web 2nd Edition Oct.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -23、 [Python For Data Analysis (2013).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -24、 [Python 编程指南.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -25、 [Python 2.7 Tutorial 中文版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -26、 [Python3程序开发指南(第二版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -27、 [Python入门指南.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -28、 [Python参考手册(第4版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -29、 [python基础教程(第二版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -30、 [Python学习手册(第4版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -31、 [Python库参考手册.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -32、 [Python技术参考大全.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -33、 [Python技术手册(第2版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -34、 [python标准库.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -35、 [python核心笔记.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -36、 [Python核心编程(第3版)PDF高清晰完整中文版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -37、 [Python源码剖析.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -38、 [Python算法教程_中文版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -39、 [Python精要参考(第二版)_翻译.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -40、 [Python高级编程.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -41、 [quantsp研究计划书.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -42、 [Rapid+GUI+Programming+with+Python+and+Qt(1).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -43、 [thinkpython.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -44、 [visualizing_data.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -45、 [《Python标准库》中文版.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -46、 [用Python写网络爬虫.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -47、 [用Python进行自然语言处理.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -48、 [笨办法学.Python.(第三版).pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -49、 [简明python教程.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -50、 [编程小白的第一本+python+入门书.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) -51、 [集体智慧编程-python算法应用.pdf](https://pan.baidu.com/s/11McLTO5Dnam4LcVnqHEfQA) - -## 免责声明 -书籍全部来源于网络其他人的整理,我这里只是收集整理了他们的链接,如有侵权,马上联系我,我立马删除对应链接。我的邮箱:ththinking@163.com \ No newline at end of file diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/1.json" "b/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/1.json" deleted file mode 100644 index b23e14ba..00000000 --- "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/1.json" +++ /dev/null @@ -1 +0,0 @@ -{ "applyId": "30815023", "contractNo": "10004846945", "customerId": "1024924300", "dearteType": "减免测试方案", "overduePeriodNum": 1, "DearteReason": "JM006", "jieqing": "1", "productDepart": "其他", "dearteTypeC": "减免正常", "BPMdeartePeriod": 1, "BPMrepayDate": "2020-06-23" \ No newline at end of file diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/code.png" "b/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/code.png" deleted file mode 100644 index 14bab389..00000000 Binary files "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/code.png" and /dev/null differ diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/demo.png" "b/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/demo.png" deleted file mode 100644 index c65b7f63..00000000 Binary files "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/demo.png" and /dev/null differ diff --git "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/polarisxu-qrcode-m.jpg" "b/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/polarisxu-qrcode-m.jpg" deleted file mode 100644 index be466d72..00000000 Binary files "a/\350\266\205\346\270\205\346\200\235\347\273\264\345\257\274\345\233\276 100 \345\274\240/img/polarisxu-qrcode-m.jpg" and /dev/null differ