├── .gitignore ├── .travis.yml ├── Algorithm ├── 201901W4 │ ├── 201901W4-EruDev.md │ ├── 201901W4-Iris.md │ ├── 201901W4-Leo.md │ ├── 201901W4-RenshuozZ.md │ ├── 201901W4-YuanCome.md │ ├── 201901W4-ZmJ.md │ ├── 201901W4-joy.md │ ├── 201901W4-puck.md │ ├── 201901W4-tangyi.md │ ├── 201901W4-torreyxian.md │ ├── 201901W4-tvp100.md │ ├── 201901W4-xiaoerwei.md │ ├── 201901W4-yanglei094121.md │ ├── 201901W4-yu.md │ ├── 201901W4-启航.md │ ├── 201901W4-寒食君.md │ ├── 201901W4-波胖子.md │ ├── 201901W4-落英坠露.md │ ├── 201901W4-陈小渣.md │ └── 201901w4-Lin_嘉杰.md ├── 201902W1 │ ├── 201902W1-EruDev.md │ ├── 201902W1-Leo.md │ ├── 201902W1-YuanCome.md │ ├── 201902W1-ZmJ.md │ ├── 201902W1-torreyxian.md │ ├── 201902W1-yanglei094121.md │ ├── 201902W1-yu.md │ ├── 201902W1-启航.md │ ├── 201902W1-寒食君.md │ ├── 201902W1-张大Ant.md │ └── 201902W1-陈小渣.md ├── 201902W2 │ ├── 201902W2-Leo.md │ ├── 201902W2-ZmJ.md │ └── 201902W2-yanglei094121.md ├── 201902W3 │ ├── 201902W3-Leo.md │ ├── 201902W3-YuanCome.md │ ├── 201902W3-ZmJ.md │ ├── 201902W3-starichat.md │ ├── 201902W3-yanglei094121.md │ ├── 201902W3-启航.md │ └── 201902W3-陈小渣.md ├── 201902W4 │ ├── 201902W4-YuanCome.md │ ├── 201902W4-ZmJ.md │ ├── 201902W4-yanglei094121.md │ ├── 201902W4-乌守元.md │ ├── 201902W4-启航.md │ └── 201902W4-寒食君.md ├── 201902W5 │ ├── 201902W5-Leo.md │ ├── 201902W5-ZmJ.md │ ├── 201902W5-lingyunG.md │ ├── 201902W5-乌守元.md │ └── 201902W5-陈小渣.md ├── 201903W1 │ ├── 201903W1-YuanCome.md │ ├── 201903W1-lingyunG.md │ ├── 201903W1-乌守元.md │ └── 201903W1-落英坠露.md ├── 201903W2 │ ├── 201903W2-YuanCome.md │ ├── 201903W2-ZmJ.md │ ├── 201903W2-lingyunG.md │ ├── 201903W2-moye.md │ ├── 201903W2-乌守元.md │ └── 201903W2-启航.md ├── 201903W3 │ ├── 201903W3-lingyunG.md │ ├── 201903W3-moye.md │ └── 201903W3-乌守元.md ├── 201903W4 │ ├── 201903W4-starichat.md │ └── 201903W4-乌守元.md ├── 201904W1 │ └── 201904W1-lingyunG.md ├── 201904W2 │ ├── 15_3sum-HardJ.md │ └── MiddleNode-lingyunG.md ├── 201904W3 │ ├── 20190403-落英坠露.md │ ├── 201904W3-starichat.md │ ├── 201904W3-乌守元.md │ ├── LeetCode7ReverseInteger-lingyunG.md │ └── mode_number-HardJ.md ├── 201904W4 │ ├── 201904W4-lingyunG.md │ ├── 201904W4-乌守元.md │ └── LRU_cache-HardJ.md ├── 201905W1 │ ├── 201905W1-lingyunG.md │ ├── 201905W1-乌守元.md │ └── 环形链表-II-HardJ.md ├── 201905W2 │ ├── 151-翻转字符串里的单词-HardJ.md │ └── 201905W2-lingyunG.md ├── 201905W3 │ └── 200-岛屿的个数-HardJ.md └── 201906W1 │ └── 201906W1-lingyunG.md ├── Partners ├── EruDev.md ├── Leo.md ├── YuanCome.md ├── ZmJ.md ├── Zoctopus.md ├── starichat.md ├── yanglei094121.md ├── yu.md ├── 乌守元.md ├── 启航.md ├── 寒食君.md ├── 落英坠露.md └── 陈小渣.md ├── README.md ├── Review ├── 201901W4 │ ├── HelloWorld的来历-ZmJ.md │ ├── Light-Field-Rendering主要内容解析-yanglei094121.md │ ├── RabbitMQ1-Leo.md │ ├── 一名软件工程师的机器学习初体验-寒食君.md │ ├── 个性化推荐系统的概述与样例实现-huzujun.md │ ├── 中国出台措施保护并修复长江生态-puck.md │ ├── 中国餐饮业的发展趋势-启航.md │ ├── 在PyCharm中设置Flask程序-EruDev.md │ ├── 外卖员工资超过一些白领-陈小渣.md │ ├── 如何成为一名杰出的开发者-YuanCome.md │ ├── 科技改变生活-波胖子.md │ ├── 财富不均衡-torreyxian.md │ ├── 需求的选择性-yu.md │ └── 鬼步舞-Iris.md ├── 201902W1 │ ├── Docker教程I-YuanCome.md │ ├── LFToolbox-yanglei094121.md │ ├── RabbitMQ2-WorkQueues-Leo.md │ ├── Zara换了个logo-torreyxian.md │ ├── 不要现场编程-yu.md │ ├── 具有公钥签名的JsonWebToke-EruDevn.md │ └── 写给程序员读的童话书-寒食君.md ├── 201902W2 │ ├── LFToolbox官方文档-yanglei094121.md │ └── RabbitMQ5-Topic-Leo.md ├── 201902W3 │ ├── Docker教程二-YuanCome.md │ ├── light-field-rendering-yanglei094121.md │ ├── 什么是数字签名-Leo.md │ ├── 教育部禁止教师用QQ或微信布置作业-陈小渣.md │ ├── 计算的未来是模拟-starichat.md │ └── 软件工程与编程的不同-ZmJ.md ├── 201902W4 │ ├── 2019年浏览器的现状-寒食君.md │ ├── Docker教程三-YuanCome.md │ ├── Information-flow-reveals-prediction-limits-in-online(1)-乌守元.md │ ├── Java-for-Python-Programmers-ZmJ.md │ ├── light-field-rendering-yanglei094121.md │ └── 写出好代码的12步-落英坠露.md ├── 201902W5 │ ├── AWS-IAM简易介绍-lingyunG.md │ ├── Android开发者指南之性能提示-落英坠露.md │ ├── Information-flow-reveals-prediction-limits-in-online(2)-乌守元.md │ ├── Java锁和Automic变量-Leo.md │ └── 《小偷家族》观后感-ZmJ.md ├── 201903W1 │ ├── Information-flow-reveals-prediction-limits-in-online(3)-乌守元.md │ ├── light-field-rendering-yanglei094121.md │ └── 什么是敏捷开发-lingyunG.md ├── 201903W2 │ ├── An_A-Z_of_useful_python_tricks-ZmJ.md │ ├── Docker教程四01-YuanCome.md │ ├── Information-flow-reveals-prediction-limits-in-online(4)-乌守元.md │ ├── Lytro-in-Matlab-yanglei094121.md │ └── 敏捷设计&&SRP&&OCP原则-lingyunG.md ├── 201903W3 │ ├── Information-flow-reveals-prediction-limits-in-online(5)-乌守元.md │ └── 敏捷设计LSP&&DIP&&ISP原则-lingyunG.md ├── 201903W4 │ ├── Information-flow-reveals-prediction-limits-in-online(6)-乌守元.md │ └── 《黑客与画家》读后感-starichat.md ├── 201904W1 │ └── HowToScaleWebApp-lingyunG.md ├── 201904W2 │ ├── HowIcutMyAWSbillByGoingServerless-lingyunG.md │ └── Java并发编程基础-HardJ.md ├── 201904W3 │ ├── GoingAtomic-lingyunG.md │ ├── Raise-Great-Developer-Not-Hire-明昭.md │ ├── Tread和Runnable-HardJ.md │ ├── why-were-bullish-on-crypto-collectibles-nfts-乌守元.md │ ├── 每个开发者都该知道的SOLID原则-落英坠露.md │ └── 线程的基础知识-starichat.md ├── 201904W4 │ ├── ExecutorService和线程池-HardJ.md │ ├── NetFlix在AWS上的安全实现-lingyunG.md │ └── how-to-simplify-your-design-乌守元.md ├── 201905W1 │ ├── DataLakeDataWareHouseDataBase-lingyunG.md │ ├── Java-Callable-and-Future-HardJ.md │ └── deep-learning-competence-乌守元.md ├── 201905W2 │ ├── HowDataInspireBuildCloudInfrastructure-lingyunG.md │ └── Java并发问题和线程同步-HardJ.md ├── 201905W3 │ └── Java锁和原子变量-HardJ.md ├── 201906W1 │ └── InversionofControlforworkflows-lingyunG.md ├── 201906W2 │ └── jdbc源码分析-lingyunG.md └── 201907W1 │ └── 程序的机器级别表示-lingyunG.md ├── Share ├── 201901W4 │ ├── Django查询优化之select_related、prefetch_related-ZmJ.md │ ├── SpringBoot和Vue前后端分离开发与合并-YuanCome.md │ ├── 《FlaskWeb开发实战》之Flask的工作流程与机制-EruDev.md │ ├── 《什么是真正的程序员》有感-yu.md │ ├── 《深入浅出设计模式》-启航.md │ ├── 《深入理解计算机系统》之操作系统管理硬件-落英坠露.md │ ├── 与百度有关的随想-陈小渣.md │ ├── 什么叫“先把书读厚,再把书读薄”笔记-波胖子.md │ ├── 从实习中领悟的软技能-Leo.md │ ├── 光场计算成像空域-yanglei094121.md │ ├── 公众号文章有感-torreyxian.md │ ├── 既生Java,何生Groovy?-寒食君.md │ ├── 百度的原罪—封杀Google的黑内幕-puck.md │ └── 解决bug的偏方-Iris.md ├── 201902W1 │ ├── RabbitMQ3-PublishSubscribe-Leo.md │ ├── SpringBoot全局统一异常处理-YuanCome.md │ ├── 《操作系统之哲学原理》--系统调用-启航.md │ ├── 《深入理解计算机系统》之存储器层次结构-落英坠露.md │ ├── 何为贵人,以及圈子的重要性-张大Ant.md │ ├── 你看到的AI与智能无关-寒食君.md │ ├── 使用matlab将灰度图转换为彩色图-yanglei094121.md │ ├── 思考与反思-torreyxian.md │ ├── 每天练习写作-yu.md │ └── 浅谈Git之拉取与合并-ZmJ.md ├── 201902W2 │ ├── Hibernate操作Oracle时主键序列化问题-启航.md │ ├── 假期小感想-Leo.md │ └── 粤语歌钟无艳学习-yanglei094121.md ├── 201902W3 │ ├── 2019考研题解读-yanglei094121.md │ ├── Go语言中管道堵塞+互斥死锁分析-Zoctopus.md │ ├── Ljava.lang.String异常-启航.md │ ├── dlv调试小结-Zoctopus.md │ ├── 《富爸爸穷爸爸》部分引言-Leo.md │ ├── 修改git-commit-message-ZmJ.md │ ├── 哈希算法的应用-starichat.md │ └── 工作日,我想分享的三个生活习惯-陈小渣.md ├── 201902W4 │ ├── markdown插入数学公式-yanglei094121.md │ ├── vim的一些插件和配置-ZmJ.md │ ├── 不要急,慢慢来-YuanCome.md │ ├── 主动一点,你的世界会更大-乌守元.md │ ├── 关于H5活动的想法-寒食君.md │ ├── 前端前端传数据时小问题-启航.md │ └── 毛泽东:有理,有利,有节-张大Ant.md ├── 201902W5 │ ├── 《见识--商业的本质和人生的智慧》之商业的本质-落英坠露.md │ ├── 信息论与编码-第一章绪论-乌守元.md │ ├── 如何生成Gitbook-ZmJ.md │ ├── 思维导图-陈小渣.md │ ├── 测试工作的一些感想-Leo.md │ └── 连岳文章《我们要成为特别优秀的人吗?》有感-lingyunG.md ├── 201903W1 │ ├── Java开发手册之命名规约-落英坠露.md │ ├── 分享一些自己喜欢的公众号-lingyunG.md │ ├── 汇编语言-第一章-基础知识-乌守元.md │ └── 闭包-漠野.md ├── 201903W2 │ ├── windows下的Linux环境-ZmJ.md │ ├── 亏格理解-yanglei094121.md │ ├── 公务员招聘要求-YuanCome.md │ ├── 汇编语言-第二章-寄存器-乌守元.md │ └── 深入理解java虚拟机-lingyunG.md ├── 201903W3 │ ├── 《智能时代》书摘-lingyunG.md │ └── 汇编语言-第三章-寄存器(内存访问)-乌守元.md ├── 201903W4 │ ├── 哈希算法的应用续-starichat.md │ └── 汇编语言-第四章-第一个程序-乌守元.md ├── 201904W1 │ └── 从女码农到女leader的忐忑之路-lingyunG.md ├── 201904W2 │ ├── 左耳听风的专栏有感-lingyunG.md │ └── 装饰者模式-HardJ.md ├── 201904W3 │ ├── 工厂模式-HardJ.md │ ├── 懒加载方式的使用-starichat.md │ ├── 汇编语言-第五章-BX-和loop指令-乌守元.md │ ├── 耗子叔对996的看法-落英坠露.md │ └── 职场上你的态度真的摆正了吗-lingyunG.md ├── 201904W4 │ ├── 单例模式-HardJ.md │ ├── 向前一步-lingyunG.md │ └── 汇编语言-第六章-包含多个段的程序-乌守元.md ├── 201905W1 │ ├── Java程序员都该知道的5个SpringBoot特性-lingyunG.md │ ├── 命令模式-HardJ.md │ └── 汇编语言-第七章-更灵活的定位内存地址的方法-乌守元.md ├── 201905W2 │ ├── 适配器模式与外观模式-HardJ.md │ └── 面试有感-lingyunG.md ├── 201905W3 │ └── 模板方法模式-HardJ.md ├── 201906W1 │ └── 计算机网络第二章-lingyunG.md ├── 201906W2 │ └── 计算机网络第三章运输层协议-lingyunG.md └── 201907W1 │ └── MySQL安装和使用-lingyunG.md ├── Tip ├── 201901W4 │ ├── CSS文章排版小技巧-yu.md │ ├── Git-Hook自定义工作流-ZmJ.md │ ├── ImagePy简单介绍-yanglei094121.md │ ├── Premiere中常用快捷键-波胖子.md │ ├── SpringCloud底层原理-Iris.md │ ├── markdown-torreyxian.md │ ├── windows下安装linux虚拟机-启航.md │ ├── 为什么使用JSON作为函数参数-陈小渣.md │ ├── 公众号爬虫的有效姿势-huzujun.md │ ├── 分享两个自己常用的工具(Everything、百度网盘客户端)-zhaopengfei.md │ ├── 如何用简单的方式生成带标签的pdf-Leo.md │ ├── 模版元编程(00)-puck.md │ ├── 第一次尝试写Markdown文章-YuanCome.md │ └── 谈一谈ThreadLocal-寒食君.md ├── 201902W1 │ ├── Android下的JNI使用-张大Ant.md │ ├── Flask的线程隔离-yu.md │ ├── GitHub团队协作git流程-yanglei094121.md │ ├── Guava为什么被取代-寒食君.md │ ├── RabbitMQ4-Routing-Leo.md │ ├── Solr的那些事-torreyxian.md │ ├── Windows工具软件-落英坠露.md │ ├── Windows索引工具Wox-YuanCome.md │ └── 集合遍历方式的选择-启航.md ├── 201902W2 │ ├── RabbitMQ6-RPC-Leo.md │ └── 光场相机模拟程序解读-yanglei094121.md ├── 201902W3 │ ├── ARTS周报脚本-ZmJ.md │ ├── AWS资源成本管理-Leo.md │ ├── update光场相机模拟程序解读-yanglei094121.md │ ├── vim的使用技巧-starichat.md │ └── 宏观CSS-陈小渣.md ├── 201902W4 │ ├── Android图像绘制与渲染-落英坠露.md │ ├── Android音视频开发1:通过三种方式绘制图片-张大Ant.md │ ├── Idea远程调试服务器代码-leozhiyu.md │ ├── PDF复制中的文字重复问题-乌守元.md │ ├── Redis为什么不推荐使用keys命令-寒食君.md │ ├── latex编译相关问题-yanglei094121.md │ ├── travis.ci持续集成工具-ZmJ.md │ └── 带BOM的UTF-8格式和普通UTF-8格式的区别-YuanCome.md ├── 201902W5 │ ├── AWS服务的一些学习资料-lingyunG.md │ ├── ELK笔记-Leo.md │ ├── cin与scanf的效率-乌守元.md │ ├── java项目中@Value读取配置文件的问题-启航.md │ ├── 时间空间复杂度-陈小渣.md │ └── 链表题中的小技巧-ZmJ.md ├── 201903W1 │ ├── AWSlambda-lingyunG.md │ ├── MySQL数据库四种隔离级别-YuanCome.md │ └── tensorflow-图像转换-乌守元.md ├── 201903W2 │ ├── BasicAuth鉴权-ZmJ.md │ ├── Java的位运算技巧-YuanCome.md │ ├── Tensorflow-数据增强方法-乌守元.md │ ├── 如何在GitBash完成ARTS任务-lingyunG.md │ └── 项目依赖安装参考-yanglei094121.md ├── 201903W3 │ ├── Git数据模型-lingyunG.md │ └── carbon-乌守元.md ├── 201903W4 │ ├── Git新手技巧-starichat.md │ └── 几枝-乌守元.md ├── 201904W1 │ └── 程序员不能忽略的基础知识-lingyunG.md ├── 201904W2 │ ├── Docker学习手册-lingyunG.md │ └── spring与事务-HardJ.md ├── 201904W3 │ ├── Java对日期的操作-starichat.md │ ├── Non-atomic64BitOperation-lingyunG.md │ ├── 如何教好的使用Java异常-HardJ.md │ ├── 算法解题思路之快慢指针-落英坠露.md │ └── 给hexo添加瀑布式相册-乌守元.md ├── 201904W4 │ ├── Fisher–Yates随机置乱算法-乌守元.md │ ├── Semaphore的使用-HardJ.md │ └── 薪水支付系统实现-lingyunG.md ├── 201905W1 │ ├── Javaclass转成XSD的maven插件-lingyunG.md │ ├── ReadWriteLock-HardJ.md │ └── 现代-JavaScript-教程-乌守元.md ├── 201905W2 │ ├── Nginx常用命令-HardJ.md │ ├── ssm项目无法读取application.properties文件信息-启航.md │ └── 工作中可能不会用到但是面试会问的题目-lingyunG.md ├── 201905W3 │ └── StampedLock-HardJ.md ├── 201906W1 │ └── 深入理解计算机系统第二章-lingyunG.md ├── 201906W2 │ └── 深入理解计算机系统第三章-lingyunG.md └── 201907W1 │ └── 初始SwaggerUI-lingyunG.md ├── Weekly ├── 201901W4.md ├── 201902W1.md ├── 201902W2.md ├── 201902W3.md ├── 201902W4.md ├── 201902W5.md ├── 201903W1.md ├── 201903W2.md ├── 201903W3.md ├── 201903W4.md ├── 201904W1.md ├── 201904W2.md ├── 201904W3.md └── 201904W4.md ├── script ├── catalogue.py ├── publish.sh └── weekly.py └── self-introduction ├── Alexdner.md ├── EruDev.md ├── HardJ.md ├── Iris.md ├── Leo.md ├── Lin_嘉杰.md ├── RenshuozZ.md ├── YuanCome.md ├── ZmJ.md ├── Zoctopus.md ├── atomic.md ├── canaskpw(波胖子).md ├── huzujun.md ├── joy.md ├── lingyunG.md ├── puck.md ├── starichat.md ├── tangyi.md ├── torreyxian(小现).md ├── tvp100.md ├── xiaoerwei.md ├── yanglei094121.md ├── yu.md ├── 乌守元.md ├── 启航.md ├── 寒食君.md ├── 漠野.md ├── 落英坠露.md └── 陈小渣.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | __pycache__/ 4 | _book/ 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | 3 | python: "3.6" 4 | 5 | branches: 6 | only: 7 | - master 8 | - script 9 | script: 10 | python ./script/weekly.py 11 | 12 | notifications: 13 | email: false 14 | 15 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-EruDev.md: -------------------------------------------------------------------------------- 1 | ### 1. 两数之和 2 | 3 | 4 | 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 5 | 6 | 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 7 | 8 | 示例: 9 | 10 | 给定 nums = [2, 7, 11, 15], target = 9 11 | 12 | 因为 nums[0] + nums[1] = 2 + 7 = 9 13 | 14 | 15 | ```python 16 | class Solution: 17 | def twoSum(self, nums, target): 18 | """ 19 | :type nums: List[int] 20 | :type target: int 21 | :rtype: List[int] 22 | """ 23 | n = len(nums) 24 | for i in range(n): 25 | for j in range(i+1, n): 26 | if nums[i] + nums[j] == target: 27 | return i,j 28 | ``` 29 | 30 | ```python 31 | class Solution: 32 | def twoSum(self, nums, target): 33 | """ 34 | :type nums: List[int] 35 | :type target: int 36 | :rtype: List[int] 37 | """ 38 | d = {} 39 | for idx, val in enumerate(nums): 40 | if target - idx in d: 41 | return d[target-idx], idx 42 | else: 43 | d[val] = idx 44 | ``` -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-Iris.md: -------------------------------------------------------------------------------- 1 | ### 287 Find the Duplicate Number 2 | 3 | > Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one. 4 | 5 | Example 1: 6 | 7 | Input: [1,3,4,2,2] 8 | Output: 2 9 | 10 | Example 2: 11 | 12 | Input: [3,1,3,4,2] 13 | Output: 3 14 | 15 | Note: 16 | 17 | 1. You must not modify the array (assume the array is read only). 18 | 2. You must use only constant, O(1) extra space. 19 | 3. Your runtime complexity should be less than O(n2). 20 | 4. There is only one duplicate number in the array, but it could be repeated more than once. 21 | ``` 22 | class Solution { 23 | public int findDuplicate(int[] nums) { 24 | if(nums == null || nums.length < 2){ 25 | return -1; 26 | } 27 | int n = nums.length; 28 | for(int e : nums){ 29 | if(e < -1 || e > n - 1){ 30 | return -1; 31 | } 32 | } 33 | for(int i = 0;i < n;++i){ 34 | while(nums[i] != i){ 35 | int val = num[num[i]]; 36 | if(num[i] == val){ 37 | return val; 38 | } 39 | swap(nums,i,nums[i]); 40 | } 41 | } 42 | return -1; 43 | } 44 | private void swap(int[] nums,int i,int j){ 45 | int t = nums[i]; 46 | nums[i] = nums[j]; 47 | nums[j] = t; 48 | } 49 | } 50 | ``` 51 | 52 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-RenshuozZ.md: -------------------------------------------------------------------------------- 1 | ### 1. 两数之和 2 | 3 | 4 | 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 5 | 6 | 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 7 | 8 | 示例: 9 | 10 | 给定 nums = [2, 7, 11, 15], target = 9 11 | 12 | 因为 nums[0] + nums[1] = 2 + 7 = 9 13 | 14 | 15 | ```js 16 | //暴力算法(O(n^2)) 17 | function violence(nums,target){ 18 | for(var i=0;i=0){ 36 | return [i,index] 37 | } 38 | } 39 | return [0,0]; 40 | } 41 | improvement( [2,3,4] ,6); 42 | ``` -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-ZmJ.md: -------------------------------------------------------------------------------- 1 | ### 53. 最大子序和 2 | 3 | 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 4 | 5 | 示例: 6 | ``` 7 | 输入: [-2,1,-3,4,-1,2,1,-5,4], 8 | 输出: 6 9 | 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 10 | ``` 11 | --- 12 | 13 | ### 思路 14 | 15 | 两个字段充当标志位, 16 | 17 | 一个res字段记录出现的最大和,一个temp字段记录此时的最大和 18 | 19 | 如果最大和出现小于等于0,将此时的最大和,归至当前值,从此处再记起 20 | 21 | 每次循环,比较两个标志位,res始终未最大和 22 | 23 | ### 解题 24 | 25 | 26 | ```python 27 | class Solution: 28 | 29 | # O(n) , O(1) 30 | def max_sub_array(self, nums: list): 31 | temp, res = 0, nums[0] 32 | for num in nums: 33 | temp = temp + num if temp > 0 else num 34 | res = max(temp, res) 35 | return res 36 | 37 | ``` 38 | 39 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-joy.md: -------------------------------------------------------------------------------- 1 | # leetcode-01 2 | 3 | 题目描述 4 | 5 | 给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那 **两个** 整数,并返回他们的数组下标。 6 | 7 | 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 8 | 9 | 示例 10 | 11 | ``` 12 | 给定 nums = [2, 7, 11, 15], target = 9 13 | 14 | 因为 nums[0] + nums[1] = 2 + 7 = 9 15 | 所以返回 [0, 1] 16 | ``` 17 | 18 | 19 | 20 | 代码 21 | 22 | ~~~python 23 | class Solution: 24 | def twoSum(self, nums, target): 25 | """ 26 | :type nums: List[int] 27 | :type target: int 28 | :rtype: List[int] 29 | """ 30 | # 单层循环 31 | x = 0 32 | y = 0 33 | n = len(nums) 34 | 35 | for i in range(n): 36 | num1 = nums[i] # 第一个数 37 | num2 = target-num1 # 预计的第二个数 38 | 39 | if num2 in nums: 40 | 41 | x = i 42 | y = nums.index(num2) 43 | if x != y: 44 | return x,y 45 | ~~~ 46 | 47 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-puck.md: -------------------------------------------------------------------------------- 1 | # 题目 2 | 1. 两数之和 3 | 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 4 | 5 | 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 6 | 7 | 示例: 8 | 9 | 给定 nums = [2, 7, 11, 15], target = 9 10 | 11 | 因为 nums[0] + nums[1] = 2 + 7 = 9 12 | 所以返回 [0, 1] 13 | 14 | ## 解 15 | 以前用暴力解法做过一次,这回改成hash_map 16 | ```c++ 17 | #include 18 | #include 19 | 20 | using std::vector; 21 | 22 | class Solution 23 | { 24 | public: 25 | vector twoSum(vector &nums, int target) 26 | { 27 | std::unordered_map nums_map; 28 | int i{}; 29 | for (auto ele : nums) 30 | { 31 | nums_map.emplace(ele, i++); 32 | } 33 | 34 | for (std::size_t i{}; i != nums.size(); ++i) 35 | { 36 | try 37 | { 38 | int index = nums_map.at(target - nums.at(i)); 39 | 40 | if (index != i) 41 | { 42 | return {static_cast(i), index}; 43 | } 44 | } 45 | catch (std::out_of_range &) 46 | { 47 | // do nothing 48 | } 49 | } 50 | 51 | return {}; 52 | } 53 | }; 54 | ``` 55 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-tangyi.md: -------------------------------------------------------------------------------- 1 | # leetcode1:两数之和 2 | 3 | 题目描述: 4 | 5 | 给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那 **两个** 整数,并返回他们的数组下标。 6 | 7 | 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 8 | 9 | 10 | 11 | **示例:** 12 | 13 | ``` 14 | 给定 nums = [2, 7, 11, 15], target = 9 15 | 16 | 因为 nums[0] + nums[1] = 2 + 7 = 9 17 | 所以返回 [0, 1] 18 | ``` 19 | 20 | **题解-Java** 21 | 22 | ~~~java 23 | class Solution { 24 | public int[] twoSum(int[] nums, int target) { 25 | //暴力算法,两个循环遍历 26 | int index1=0; 27 | int index2=0; 28 | for(int i=0;i 思路:定义一快一慢两个指针,快指针走 K 步,然后慢指针开始走,快指针到尾时,慢指针就找到了倒数第 K 个切点。 6 | 7 | ```java 8 | public ListNode FindKthToTail(ListNode head, int k) { 9 | if(head == null || k <= 0) { 10 | return null; 11 | } 12 | ListNode fast = head; 13 | ListNode slow = head; 14 | while(k-- > 1) { 15 | if(fast.next != null) { 16 | fast = fast.next; 17 | } 18 | else null; 19 | } 20 | while(fast.next != null) { 21 | fast = fast.next; 22 | slow = slow.next; 23 | } 24 | return slow; 25 | } 26 | ``` 27 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-tvp100.md: -------------------------------------------------------------------------------- 1 | ### Leetcode: 136.只出现一次的数字 2 | 3 | 题目难度:简单 4 | 5 | 题目描述: 6 | 7 | 给定一个**非空**整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 8 | 9 | **说明:** 10 | 11 | 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 12 | 13 | **示例:** 14 | 15 | ``` 16 | 输入:[2,2,1] 17 | 输出:1 18 | 19 | 输入:[4,1,2,1,2] 20 | 输出:4 21 | ``` 22 | 23 | 24 | 25 | 26 | 27 | *** 28 | 29 | 30 | 31 | 32 | 33 | **解答:** 34 | 35 | ```cpp 36 | class Solution { 37 | public: 38 | int singleNumber(vector& nums) { 39 | int size = nums.size(); 40 | int res = 0; 41 | for(int i = 0; i < size; i++) 42 | { 43 | res = res^nums[i]; 44 | } 45 | return res; 46 | } 47 | }; 48 | ``` 49 | 50 | 51 | 52 | *** 53 | 总结:对异或运算符的运用,相同为0,不同为1,很有趣。 -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-xiaoerwei.md: -------------------------------------------------------------------------------- 1 | ### Leetcode: 01.Two Sum 2 | 3 | 题目难度:简单 4 | 5 | 题目描述: 6 | 7 | 给定一个整数容器,两个数相加等于特定值,输出这两个数的索引 8 | **说明:** 9 | 10 | 假定只有一个正确答案,不能使用容器中同一个元素两次。 11 | 12 | **示例:** 13 | 14 | Given nums = [2, 7, 11, 15], target = 9, 15 | 16 | Because nums[0] + nums[1] = 2 + 7 = 9, 17 | return [0, 1]. 18 | 19 | 20 | 21 | 22 | 23 | *** 24 | 25 | 26 | 27 | 28 | 29 | **解答:** 30 | 31 | class Solution { 32 | public: 33 | vector twoSum(vector& nums, int target) { 34 | vector backup(nums); 35 | sort(nums.begin(), nums.end()); 36 | vector::iterator i1 = nums.begin(), i2 = nums.end()-1; 37 | while ((*i1 + *i2)!= target) 38 | { 39 | while ((*i1 + *i2) < target) i1++; 40 | while ((*i1 + *i2) > target) i2--; 41 | } 42 | 43 | vector res; 44 | for (unsigned int i = 0; i < nums.size(); i++) 45 | { 46 | if (backup[i]==*i1 || backup[i] == *i2) 47 | res.push_back(i); 48 | } 49 | return res; 50 | } 51 | }; 52 | ``` 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-yanglei094121.md: -------------------------------------------------------------------------------- 1 |  2 | > 程序小白一个,算法就由最基础的数据结构琢磨起吧! 3 | > 所用书籍:数据结构与算法c语言版 4 | 5 | 6 | # 线性表 7 | ## 线性表的类型定义 8 | 一个线性表是n个数据元素的有限序列。 9 | 10 | 线性表是灵活的,其长度可以根据需要增长或缩短,即对线性表的数据元素不仅可以访问,还可以进行增加或删除多种操作。 11 | 12 | ##### 已知线性表LA,LB中元素按值非递减有序排列,现要求将LA与LB合成一个新的线性表LC,且LC中的数据仍按值非递减有序排列。 13 | 14 | ###### 分析 15 | 16 | **1. LC中的数据不是天上掉下来的,而来源于LA,LB** 17 | 18 | 解决:设LC为空表,将LA与LB插入LC中即可 19 | 20 | **2. LC中数据混乱,仍需排列** 21 | 22 | 解决:设两个指针i,j分别指向LA和LB中某个元素。比较a,b大小 23 | 24 | 设i所指向元素为a,j所指向元素为b,那么LC表中应放入的元素c为 25 | $$c= 26 | \left \{\begin{array}{cc} 27 | a, &a\leq b \ 时\\ 28 | b, & a>b \ 时 29 | \end{array}\right. 30 | \tag{1} 31 | $$ 32 | 33 | **3. LC中元素如何排列** 34 | 35 | 解决:设i , j初值为1,在比较a ,b选择出c后,元素c插入已有LC后,ij位置顺序后移。 36 | 37 | 38 | 39 | ###### 具体代码 40 | ```c 41 | void MergeList(List LA,List LB,List &LC) 42 | { 43 | //已知LA,LB内元素按值非递减排列 44 | InitList(LC); 45 | i=j=1;k=0;//对i,j赋初值,保证足够小 46 | LaLen=ListLength(LA); 47 | LbLen=ListLength(LB);//获取LA,LB线性表的长度。 48 | while((i<=LaLen)&&(j<=LbLen)//循环条件:不超出LA,LB的长度 49 | { 50 | GetElem(LA,i,ai);//获得线性表LA,i值,为i值时所指向LA表中元素的值 51 | GetElem(LB,j,bj);//获得线性表LA,i值,为i值时所指向LA表中元素的值 52 | if(ai<=bj)//公式1所示代码如下,就是简单的数值比较 53 | { 54 | ListInsert(LC,++k,ai); 55 | ++i; 56 | } 57 | else 58 | { 59 | ListInsert(LC,++k,bj); 60 | ++j; 61 | } 62 | }//while循环结束。但我们的程序还没有结束。 63 | //若其中一个线性表遍历结束,另一个还没有结束,那么我们应该把另一个剩余的线性表接在LC后 64 | while(i<=LaLen) 65 | { 66 | GetElement(LA,i++,ai); 67 | ListInsert(LC,++k,ai); 68 | 69 | } 70 | while(j<=LbLen) 71 | { 72 | GetElement(LA,i++,ai); 73 | ListInsert(LC,++k,ai); 74 | } 75 | 76 | 77 | } 78 | ``` 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-yu.md: -------------------------------------------------------------------------------- 1 | > 题目:`# 771. Jewels and Stones` 2 | > 3 | > 难度:简单 4 | > 5 | > 问题描述:找出字符串 J 中元素在字符串 S 中出现的个数。 6 | 7 | 实例: 8 | 9 | ``` 10 | Example 1: 11 | Input: J = "aA", S = "aAAbbbb" 12 | Output: 3 13 | Example 2: 14 | Input: J = "z", S = "ZZ" 15 | Output: 0 16 | ``` 17 | 18 | #### 1. 遍历 19 | 20 | 首先想到双层遍历,但这是我们通常需要避免的方式。因为他的运行效率非常低。值得注意的地方是需要对 J 做 去重处理。 21 | 22 | ```python 23 | def numJewelsInStones(J, S): 24 | J = set(J) 25 | jewels = 0 26 | for j in J: 27 | for s in S: 28 | if s == j: 29 | jewels += 1 30 | return jewels 31 | ``` 32 | 33 | #### 2. count 34 | 35 | 嵌套遍历是代码编写过程中尽量要避免的问题,不仅因为效率低,还存在代码可读性太差等问题。两个列表的操作我们选择一个遍历,另外的操作尝试用内置函数或者函数式编程的思想来解决。 36 | 37 | ```python 38 | def numJewelsInStones2(self, J, S): 39 | """这个提高了代码的可读性,运行效率显著提升。""" 40 | J = set(J) 41 | jewels = 0 42 | for j in J: 43 | jewels += S.count(j) 44 | return jewels 45 | ``` 46 | 47 | #### 3. 遍历 S 48 | 49 | ```python 50 | def numJewelsInStones3(self, J, S): 51 | """这种方法在处理两个列表的处理上更加通用,而且不需要对 J 去重。""" 52 | jewels = 0 53 | for s in S: 54 | if s in J: 55 | jewels += 1 56 | return jewels 57 | ``` 58 | 59 | #### 4. 极致写法 60 | 61 | ```python 62 | def numJewelsInStones4(self, J, S): 63 | return sum([s in J for s in S]) 64 | ``` 65 | 66 | 代码要写得简洁要尽量避免多层遍历和条件控制,不免要用到函数式编程的思维。 67 | 68 | #### 总结 69 | 70 | 多个列表之间的操作要尽量避免多层遍历,嵌套遍历不仅算法复杂度显著提升,而且可读性非常差。 71 | 72 | 测试程序运行时间可以使用 timeit 模块: 73 | 74 | ```python 75 | if __name__ == "__main__": 76 | import timeit 77 | print(timeit.timeit( 78 | "numJewelsInStones('dbsfwefsfggfsf', 'dbBsadsobweffswwwsfsfwwfffwwfwfwfsfsffdf')", 79 | setup="from __main__ import numJewelsInStones")) 80 | ``` -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-启航.md: -------------------------------------------------------------------------------- 1 | ## 1.关于最大子序列的问题 2 | 3 | `给定(可能为负的)整数A1,A2,A3,A4,A5...An,求在(1<=i maxSum) { 17 | maxSum = thisSum; 18 | } 19 | } 20 | } 21 | return maxSum; 22 | } 23 | ``` 24 | 25 | `思路2: 思路二 将数组分为两份,分别求出两份的最大值,相加(注意点是要从中间开始算) 时间复杂度暂时还没看明白 26 | 27 | ``` 28 | private static int maxSumRec(int[] a, int left, int right) { 29 | if (left == right) { 30 | if (a[left] > 0) { 31 | return a[left]; 32 | } else { 33 | return 0; 34 | } 35 | } 36 | int center = (right + left) / 2; 37 | int maxLeftSum = maxSumRec(a, left, center); 38 | int maxRightSum = maxSumRec(a, center + 1, right); 39 | 40 | int maxLeftBorderSum = 0, leftBorderSum = 0; 41 | for (int i = center; i >= left; i--) { 42 | leftBorderSum += a[i]; 43 | if (leftBorderSum > maxLeftBorderSum) { 44 | maxLeftBorderSum = leftBorderSum; 45 | } 46 | } 47 | 48 | int maxRightBorderSum = 0, rightBorderSum = 0; 49 | for (int i = center + 1; i <= right; i++) { 50 | rightBorderSum += a[i]; 51 | if (rightBorderSum > maxRightBorderSum) { 52 | maxRightBorderSum = rightBorderSum; 53 | } 54 | } 55 | 56 | return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum) 57 | ``` 58 | 59 | -------------------------------------------------------------------------------- /Algorithm/201901W4/201901W4-波胖子.md: -------------------------------------------------------------------------------- 1 | ### Leet Code 88. Merge Sorted Array 2 | 3 | > 题目: 4 | > 5 | > ​ Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. 6 | > 7 | > Note: 8 | > 9 | > ​ You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively 10 | > 11 | > 12 | > 13 | > 翻译: 14 | > 15 | > ​ 给定2个排序好的整数数组nums1和nums2,把nums2合并到nums1中成为1个排序的数组。 16 | > 提示: 17 | > 18 | > ​ 你可以假定nums1有足够的空间(大小>=m+n)来容纳来自nums2的额外的元素。nums1和nums2的元素的个数各自被初始化为m和n。 19 | 20 | 21 | 22 | 分析: 23 | 24 | ​ 如果nums1从前往后遍历的话,nums2中的元素需要插入nums1,这个时候每插入一次,就会需要将nums1的元素往后移动(或者需要申请额外的存储空间)。但是我们反过来想,由于合并后的数组长度是确定的,我们可以从最大的数开始写入,这个时候由于nums1的后面部分的空间是未使用的,刚好可以直接覆写。 25 | 26 | 解答: 27 | 28 | ```java 29 | 时间复杂度:O(m+n) 30 | 31 | public class Solution { 32 | public void merge(int[] nums1, int m, int[] nums2, int n) { 33 | int p1 = m-1; 34 | int p2 = n-1; 35 | for(int i = m+n-1;i >= 0;i--){ 36 | if(p2 < 0 || (p1 >= 0 && nums1[p1] > nums2[p2])){ 37 | nums1[i]=nums1[p1]; 38 | p1--; 39 | }else{ 40 | nums1[i]=nums2[p2]; 41 | p2--; 42 | } 43 | } 44 | } 45 | } 46 | ``` 47 | 48 | 49 | 50 | 总结: 51 | 52 | ​ 需要考虑比较边界条件,就是数组可能为空。2个数组都为空自然进不去循环。但是其中一个为空,就要考虑数组可能发生越界的情况了 53 | 54 | ​ -------------------------------------------------------------------------------- /Algorithm/201901W4/201901w4-Lin_嘉杰.md: -------------------------------------------------------------------------------- 1 | ##leetcode 2 | 3 | ###1.两数之和 4 | ###难度:简单 5 | 6 | ###描述 7 | 8 | > 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 9 | 10 | ###示例 11 | 12 | >给定 nums = [2, 7, 11, 15], target = 9 13 | 14 | >因为 nums[0] + nums[1] = 2 + 7 = 9, 所以返回 [0, 1] 15 | 16 | ###解法一: 17 | ```python 18 | class Solution: 19 | def twoSum(self, nums, target): 20 | for i in range(len(nums) - 1): 21 | for j in range(len(nums)): 22 | if i!=j and nums[i]+nums[j] == target: 23 | return [i,j] 24 | return [] 25 | ``` 26 | 27 | 时间复杂度:O(n^2) 28 | 29 | ###解法二: 30 | ```python 31 | class Solution: 32 | def twoSum(self, nums, target): 33 | d = {} 34 | for index,value in enumerate(nums): 35 | rest = target - value 36 | if rest in d.keys(): 37 | return [d[rest], index] 38 | d[value] = index 39 | ``` 40 | 41 | 时间复杂度:O(n) -------------------------------------------------------------------------------- /Algorithm/201902W1/201902W1-ZmJ.md: -------------------------------------------------------------------------------- 1 | ### leetcode-88 2 | 3 | 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 4 | 5 | 说明: 6 | 7 | - 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 8 | - 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 9 | 10 | 示例: 11 | ``` 12 | 输入: 13 | nums1 = [1,2,3,0,0,0], m = 3 14 | nums2 = [2,5,6], n = 3 15 | 16 | 输出: [1,2,2,3,5,6] 17 | ``` 18 | 19 | ### 思路: 20 | 21 | 看题意是在不使用其他空间,直接修改nums1, 使得nums1和nums2的m+n个值在nums1中有序存放 22 | 23 | 首先能想到的套路代码就是先把nums2放入nums1中,再排序 24 | 25 | ```python 26 | 27 | class Solution: 28 | 29 | def use_sort_solution(self, nums1, m, nums2, n): 30 | nums1[m:] = nums2 31 | nums1.sort() 32 | 33 | ``` 34 | 35 | 这样搞虽然通过测试,不过还需要时间复杂度O(logn),主要是消耗在sort()上 36 | 37 | 38 | 第二种能想到的就是循环将nums1与nums2的值,依照最大值放到最后 39 | 40 | ```python 41 | 42 | class Solution: 43 | 44 | def merge(self, nums1, m, nums2, n): 45 | while m > 0 and n > 0: 46 | if nums1[m-1] > nums2[n-1]: 47 | nums1[m+n-1] = nums1[m-1] 48 | m -= 1 49 | else: 50 | nums1[m+n-1] = nums2[n-1] 51 | n -= 1 52 | if n > 0: 53 | nums1[:n] = nums2[:n] 54 | ``` 55 | 56 | 虽然代码量变多了,不过时间复杂度变为O(n) 57 | 58 | 59 | -------------------------------------------------------------------------------- /Algorithm/201902W1/201902W1-torreyxian.md: -------------------------------------------------------------------------------- 1 | # 算法练习 2 | 3 | ### 输入两棵二叉树 A、B,判断 B 是不是 A 的子结构。 4 | 5 | > 思路:若根节点相等,利用递归比较他们的子树是否相等,若根节点不相等,则利用递归分别在左右子树中查找。 6 | 7 | ```java 8 | public boolean HasSubtree(TreeNode root1, TreeNode root2) { 9 | boolean result = false; 10 | 11 | if(root1!=null && root2!=null) { 12 | if(root1.val == root2.val) { 13 | result = doesTree1HaveTree2(root1, root2); 14 | } 15 | if(!result) { 16 | return HasSubtree(root1.left, root2) || HashSubtree(root1.right,root2); 17 | } 18 | } 19 | 20 | return result; 21 | } 22 | 23 | public boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2){ 24 | if(node2 == null) { 25 | return true; 26 | } 27 | if(node1 == null) { 28 | return false; 29 | } 30 | if(node1.val != node2.val) { 31 | return false; 32 | } 33 | 34 | return doesTreeNode1HaveTree2(node1.left, node2.left) && 35 | doesTree1HaveTree2(node1.right, node2.right); 36 | } 37 | ``` -------------------------------------------------------------------------------- /Algorithm/201902W1/201902W1-启航.md: -------------------------------------------------------------------------------- 1 | #### leetcode-509 斐波那契数 2 | 3 | **斐波那契数**,通常用 `F(n)` 表示,形成的序列称为**斐波那契数列**。该数列由 `0` 和 `1` 开始,后面的每一项数字都是前面两项数字的和。也就是: 4 | 5 | `F(0) = 0,   F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.` 6 | 7 | 给定 `N`,计算 `F(N)`。 8 | 9 | **示例 1:** 10 | 11 | ``` 12 | 输入:2 13 | 输出:1 14 | 解释:F(2) = F(1) + F(0) = 1 + 0 = 1. 15 | ``` 16 | 17 | **示例 2:** 18 | 19 | ``` 20 | 输入:3 21 | 输出:2 22 | 解释:F(3) = F(2) + F(1) = 1 + 1 = 2. 23 | ``` 24 | 25 | **示例 3:** 26 | 27 | ``` 28 | 输入:4 29 | 输出:3 30 | 解释:F(4) = F(3) + F(2) = 2 + 1 = 3. 31 | ``` 32 | 33 | `思路一:递归` 34 | 35 | class Solution { 36 | public int fib(int N) { 37 | if(N==0){ 38 | return 0; 39 | }else if(N==1){ 40 | return 1; 41 | }else{ 42 | return fib(N-1)+f(N-2); 43 | } 44 | } 45 | } 46 | `思路二:动态规划,将前n个已经算出的数保存在数组map中,这样在后面的计算中可以直接应用前面的结果,从而避免了重复计算。 ` 47 | 48 | ```java 49 | class Solution{ 50 | public int fib(int N) { 51 | if(N <=2) { 52 | return N; 53 | } 54 | int[] m = new int[N +1]; 55 | m[0] = 0; 56 | m[1] = 1; 57 | for(int i=2;i 将Value插入到Sorted的数列中。 4 | > 5 | > 在每次做插入时,数组内容已是有序的。 6 | > 7 | > 其生活实例可以是排列扑克牌的例子。手上的扑克牌是已排列的部分,桌上扑克牌为待排列部分。 8 | 9 | 插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 10 | 11 | 插入排序的基本思想是:每步将一个待排序的记录,按其**关键码值**的大小插入前面已经排序的数据中的适当位置上,直到全部插入完为止。Java版本代码如下(升序): 12 | 13 | ~~~ 14 | for (int j = 1; j < nums.length; j++) { 15 | int key = nums[j]; 16 | int i = j - 1; 17 | while (i >= 0 && nums[i] > key) { 18 | // 交换值 19 | nums[i + 1] = nums[i]; 20 | // 迭代计算i值,相当于待插入key的位置 21 | i = i - 1; 22 | } 23 | nums[i + 1] = key; 24 | } 25 | ~~~ 26 | 27 | # 循环不变式 28 | 29 | 在上述代码中,for循环的每次迭代开始时,num[N]中的元素**已按序排列**。这种属性可称为是**循环不变式**。 30 | 31 | ![](https://raw.githubusercontent.com/ZHANGfeng-james/Data-Structure-and-Algorithm/master/%E7%AE%97%E6%B3%95/pics/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E5%BE%AA%E7%8E%AF%E4%B8%8D%E5%8F%98%E5%BC%8F.png) 32 | 33 | 循环不变式主要用来帮助我们理解算法的正确性。关于循环不变式,我们必须证明 3 条属性(**类似于数学归纳法**): 34 | 35 | 1. 初始化:循环的第一次迭代之前,循环不变式为真(已按序排列); 36 | 2. 保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真(深入到代码实现,证明下次迭代之前属性是true); 37 | 3. 终止:在循环终止时,不变式提供了一个有用的性质,有助于证明算法是正确的(当循环终止时停止归纳); 38 | 39 | 用循环不变式的 3 个条件,证明算法是正确的。 40 | 41 | # 增量法 42 | 43 | 插入排序使用了增量方法:在排序子数组A[1, j-1]后,将单个元素A[j]插入子数组的适当位置,产生排序好的子数组A[1, j]。 -------------------------------------------------------------------------------- /Algorithm/201902W1/201902W1-陈小渣.md: -------------------------------------------------------------------------------- 1 | ### 九、 Palindrome Number(回文数) 2 | 3 | 1. 题目难度 -> Easy 4 | 5 | 2. 题目内容 6 | 7 | 确定整数是否是回文。当它向前读取向后时,整数是回文。 8 | 9 | Example1: 10 | ``` 11 | 输入: 121 12 | 输出: true 13 | ``` 14 | 15 | Example2: 16 | ``` 17 | 输入: -121 18 | 输出: false 19 | 说明:从左到右,它显示为-121。从右到左,它变成121-。因此它不是回文。 20 | ``` 21 | 22 | Example3: 23 | ``` 24 | 输入: 10 25 | 输出: false 26 | 说明:从右到左读取01。因此它不是回文。 27 | ``` 28 | 29 | 3. 解答 30 | 31 | ```JavaScript 32 | var isPalindrome = function(x) { 33 | if (x < 0 || x%10 === 0 && x != 0) { 34 | return false 35 | } 36 | let origin = x; 37 | let pNum = 0; 38 | while(x > 0) { 39 | pNum = pNum*10 + Number(x)%10; 40 | x = parseInt(x/10) 41 | } 42 | return origin == pNum 43 | }; 44 | 45 | isPalindrome(1320) 46 | ``` 47 | 48 | 总结: 模十法 -------------------------------------------------------------------------------- /Algorithm/201902W2/201902W2-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## leetcode 118,119(杨辉三角) 2 | 3 | ![img](https://upload.wikimedia.org/wikipedia/commons/0/0d/PascalTriangleAnimated2.gif) 4 | 5 | 6 | 7 | #### 题目118 8 | 9 | 给定一个非负整数 num_rows,生成杨辉三角的前 num_rows 行。 10 | 11 | 在杨辉三角中,每个数是它左上方和右上方的数的和。 12 | 13 | ```python 14 | 输入: 5 15 | 输出: 16 | [ 17 | [1], 18 | [1,1], 19 | [1,2,1], 20 | [1,3,3,1], 21 | [1,4,6,4,1] 22 | ] 23 | ``` 24 | 25 | #### 思路 26 | 27 | - 每个数组(除第一个外)边缘两个都是1 28 | - 中间值都为对应的两个值之和 29 | - 下一层的都与上一层相关 30 | 31 | 综上可知,边上为`1` ,中间部分为上一层的两两合,可知每一层数组 32 | 33 | ```python 34 | [1] + [ans[i] + ans[i+1] for i in range(len(ans) - 1)] + [1] 35 | ``` 36 | 37 | #### 解答 38 | 39 | ```python 40 | class Solution: 41 | 42 | def generate(self, num_rows): 43 | if num_rows == 0: 44 | return [] 45 | ans = [1] 46 | result = [ans] 47 | for _ in range(num_rows-1): 48 | ans = [1]+[ans[i]+ans[i+1] for i in range(len(ans) - 1)] + [1] # 关键点 49 | result.append(ans) 50 | return result 51 | ``` 52 | 53 | --- 54 | 55 | #### 题目119 56 | 57 | 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 58 | 在杨辉三角中,每个数是它左上方和右上方的数的和。 59 | 60 | ```python 61 | 输入: 3 62 | 输出: [1,3,3,1] 63 | ``` 64 | 65 | #### 思路 66 | 67 | - 这道题就是上题的变种,只需要返回对应的数组即可,省去一步`append` 68 | 69 | #### 解答 70 | 71 | ```python 72 | class Solution: 73 | 74 | def get_row(self, row_index): 75 | ans = [1] 76 | for _ in range(row_index): 77 | ans = [1] + [ans[i] + ans[i+1] for i in range(len(ans) - 1)] + [1] 78 | return ans 79 | ``` 80 | 81 | -------------------------------------------------------------------------------- /Algorithm/201902W3/201902W3-Leo.md: -------------------------------------------------------------------------------- 1 | ### Leetcode:58. 最后一个单词的长度 2 | 3 | 题目描述: 4 | 5 | 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。 6 | 7 | 如果不存在最后一个单词,请返回 0 。 8 | 9 | 说明:一个单词是指由字母组成,但不包含任何空格的字符串。 10 | 11 | 12 | 13 | 示例: 14 | 15 | ``` 16 | 输入: "Hello World" 17 | 输出: 5 18 | ``` 19 | 20 | 21 | 22 | 解答: 23 | 24 | 直接从最后一个元素遍历 25 | 26 | ```java 27 | public static int lengthOfLastWord(String s) { 28 | if(s == null || s.trim().length() == 0) { 29 | return 0; 30 | } 31 | s = s.trim(); 32 | int index = s.length() - 1; 33 | int num = 0; 34 | while(index >= 0) { 35 | if(s.charAt(index) == ' ') { 36 | break; 37 | } 38 | num++; 39 | index--; 40 | } 41 | return num; 42 | } 43 | ``` 44 | 45 | 46 | 47 | ### Leetcode:66. 加一 48 | 49 | 题目描述: 50 | 51 | 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 52 | 53 | 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。 54 | 55 | 你可以假设除了整数 0 之外,这个整数不会以零开头。 56 | 57 | 58 | 59 | 示例: 60 | 61 | ``` 62 | 示例 1: 63 | 64 | 输入: [1,2,3] 65 | 输出: [1,2,4] 66 | 解释: 输入数组表示数字 123。 67 | 示例 2: 68 | 69 | 输入: [4,3,2,1] 70 | 输出: [4,3,2,2] 71 | 解释: 输入数组表示数字 4321。 72 | ``` 73 | 74 | 75 | 76 | 解答: 77 | 78 | 奇淫技巧 79 | 80 | ```java 81 | public int[] plusOne(int[] digits) { 82 | for (int i = digits.length - 1; i >= 0; i--) { 83 | if (digits[i] < 9) { 84 | digits[i]++; 85 | return digits; 86 | } 87 | digits[i] = 0; 88 | } 89 | int[] newDigits = new int[digits.length + 1]; 90 | newDigits[0] = 1; 91 | return newDigits; 92 | } 93 | ``` 94 | 95 | -------------------------------------------------------------------------------- /Algorithm/201902W3/201902W3-starichat.md: -------------------------------------------------------------------------------- 1 | 2 | 字符串匹配算法,在工程中用得很多,我们用到的最多的数据类型恐怕就是字符串了。我们用到的很多函数,诸如 indexOf(),lastIndexOf() 等,他们的底层就需要依赖字符串匹配算法了。 3 | 4 | 字符串匹配算法很多,先来看看较为简单,易理解的算法吧,他们分别是 BF 算法和 RK 算法。 5 | ### BF 算法 6 | BF 算法就是暴力破解的意思。先定义两个概念:主串和模式串。字符串匹配就是在主串中匹配模式串。 7 | 下面来看看 BF 算法定义: 8 | 在主串中,检查起始位置分别是 0,1,2....n-m 且长度为 m 的 n-m + 1 个子串,看有没有跟模式串匹配的。如下图: 9 | 从 第一个字符开始和主串匹配,每次没有匹配成功,则向后移动一位,再一次执行主串和模式串的匹配,直到匹配成功或者没有找到匹配的字符串。 10 | 11 | [![kscgOO.md.jpg](https://s2.ax1x.com/2019/02/16/kscgOO.md.jpg)](https://imgchr.com/i/kscgOO) 12 | 13 | 我们可以发现这个算法的复杂度很高,是O(n*m),但是在实际的开发中,用的还挺多的,理由如下: 14 | - 实际的软件开发,大部分情况下,模式串和主串的长度都不会太长。而且每次模式串与主串的子串匹配的时候,当中途遇到不能匹配的字符的时候,就可以停止了,不需要把 m 个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但是统计意义上大部分情况下,算法执行效率要比这个高得多。 15 | - BK 算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有 bug 也容易暴露和修复。 16 | 17 | ### RK 算法: 18 | 在 BK 算法中,我们每一次匹配都需要将模式串的每一个字符和主串进行比较,所以时间复杂度比较高 O(m*n),所以 RK 算法在此基础上进行了优化。 19 | 20 | 思路是这样的,通过哈希算法对主串的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了。因为哈希值是一个数字,数字之间比较是非常快速的。。所以比较效率就提升了。即不需要通过将每一个模式串和每一个需要匹配的主串进行字符匹配,只用匹配其哈希值就可以了。 21 | 22 | 但是,我们仍然需要遍历子串中的每个字符,所以我们设计了一个合适的哈希算法来处理这个遍历。 23 | 24 | 我们假设要匹配的字符串的字符集中只包含K个字符,我们可以用一个K进制数来表示一个子串,这个K进制数转化为十进制数,作为子串的哈希值表述起来有点抽象。 25 | 26 | 例如:我们要处理a~z这26个小写字母,那我们就用二十六进制表示一个字符串,我们把a~z这个26个字符映射到0~25这26个数字,a就表示0,b 就表示 1.。。。。。。 27 | 28 | [![kscEWt.md.jpg](https://s2.ax1x.com/2019/02/16/kscEWt.md.jpg)](https://imgchr.com/i/kscEWt) 29 | 30 | 将字符串对应成一个26进制的数,这样将这个26进制的值转换为10进制的数,这个数就是我们所需要的哈希值。 31 | 32 | 相邻两个子串对应的哈希值计算公式有交集,也就是说,我们可以使用的哈希值s[i-1]很快的计算出s[i]的哈希值,根据设计,我们可以发现RK 可以实现只扫描一遍主串就能计算出所有的子串的哈希值了,所以这部分的时间复杂度是O(n) 33 | 34 | [![kscZSP.md.jpg](https://s2.ax1x.com/2019/02/16/kscZSP.md.jpg)](https://imgchr.com/i/kscZSP) 35 | 36 | 模式串哈希值域每个子串哈希值之间的比较的时间复杂度是O(n)。所以 RK 算法整体的时间复杂度就是O(n) -------------------------------------------------------------------------------- /Algorithm/201902W3/201902W3-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第四周 Algorithm 2 | ## 栈的重要应用:括号匹配算法 3 | 4 | ```java 5 | //括号匹配算法 6 | public void pipei() throws Exception{ 7 | char temp,ch; 8 | int match;//记录匹配结果 9 | BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 10 | ch=(char) br.read(); 11 | while(ch!='0'){ 12 | if(getTop()==-1){ 13 | push(ch); 14 | } 15 | else{ 16 | temp=pop();//取出栈顶元素 17 | match=0;//判断是否匹配(默认不匹配) 18 | if(temp=='('&&ch==')' ) 19 | match=1; 20 | if(temp='['&&ch==']') 21 | match=1; 22 | if(temp=='{'&&ch=='}' ) 23 | match=1; 24 | if(temp='<'&&ch=='>') 25 | match=1; 26 | if (match==0) 27 | { 28 | /*如果不匹配*/ 29 | push(temp);//将原栈顶元素重新入栈 30 | push(ch);//将输入的括号里字符入栈 31 | } 32 | } 33 | ch=(char) br.read();//输入下一个字符 34 | } 35 | if(isEmpty()){ 36 | System.out.printIn("输入的括号完全匹配成功~"); 37 | } 38 | else{ 39 | System.out.printIn("输入的括号没有匹配成功,请检查~"); 40 | } 41 | } 42 | ``` 43 | 44 | 45 | -------------------------------------------------------------------------------- /Algorithm/201902W3/201902W3-启航.md: -------------------------------------------------------------------------------- 1 | #### leetcode-67 二进制求和 2 | 3 | 给定两个二进制字符串,返回他们的和(用二进制表示)。 4 | 5 | 输入为**非空**字符串且只包含数字 `1` 和 `0`。 6 | 7 | **示例 1:** 8 | 9 | ``` 10 | 输入: a = "11", b = "1" 11 | 输出: "100" 12 | ``` 13 | 14 | **示例 2:** 15 | 16 | ``` 17 | 输入: a = "1010", b = "1011" 18 | 输出: "10101" 19 | ``` 20 | 21 | 解答: 22 | 23 | ```java 24 | class Solution { 25 | public static String addBinary(String a, String b) { 26 | StringBuilder sb = new StringBuilder(); 27 | int i = a.length() - 1, j = b.length() - 1, carry = 0; 28 | while (i >= 0 || j >= 0) { 29 | int sum = carry; 30 | if (i >= 0) { 31 | sum += a.charAt(i--) - '0'; 32 | } 33 | if (j >= 0) { 34 | sum += b.charAt(j--) - '0'; 35 | } 36 | sb.append(sum % 2); 37 | carry = sum / 2; 38 | } 39 | if (carry != 0) { 40 | sb.append(carry); 41 | } 42 | return sb.reverse().toString(); 43 | } 44 | } 45 | ``` 46 | 47 | 理解: 从末位开始加, array.charAt(i) - '0'是把相应的字符转成整形,最后倒序 -------------------------------------------------------------------------------- /Algorithm/201902W3/201902W3-陈小渣.md: -------------------------------------------------------------------------------- 1 | #### 二十. Valid Parentheses 2 | 3 | 1、难度 -> Easy 4 | 5 | 2、题目内容 6 | 7 | 给定一个仅包含字符'('、')'、''、''、'[' 和 ']'的字符串,确定输入字符串是否有效。 8 | 9 | 输入字符串在以下情况下有效: 10 | 11 | - 开括号必须用同一类型的括号闭合。 12 | 13 | - 开方括号必须按正确顺序闭合。 14 | 15 | 注意,空字符串也被认为是有效的。 16 | 17 | Example 1: 18 | 19 | ``` 20 | Input: "()" 21 | Output: true 22 | ``` 23 | 24 | Example 4: 25 | 26 | ``` 27 | Input: "([)]" 28 | Output: false 29 | ``` 30 | 31 | 3、解答 32 | ```JavaScript 33 | var isValid = function(s) { 34 | // 定义一个对象,来存储括号类型 35 | var pairs={ 36 | "\(" : "\)", 37 | "\{" : "\}", 38 | "\[" : "\]" 39 | } 40 | var open = [] 41 | for(var i = 0; i Easy 65 | 66 | 2、题目内容 67 | 68 | 给定排序的数组nums,就地删除重复项,使每个元素只出现一次并返回新的长度。 69 | 70 | 不要为另一个数组**分配额外的空间**,必须通过使用O(1)额外内存修改输入数组来实现此目的。 71 | 72 | ```javaScript 73 | var removeDuplicates = function(nums) { 74 | for(i=0;i A 11 | 2 -> B 12 | 3 -> C 13 | ... 14 | 26 -> Z 15 | 27 -> AA 16 | 28 -> AB 17 | ... 18 | ``` 19 | 20 | **示例 1:** 21 | 22 | ``` 23 | 输入: 1 24 | 输出: "A" 25 | ``` 26 | 27 | **示例 2:** 28 | 29 | ``` 30 | 输入: 28 31 | 输出: "AB" 32 | ``` 33 | 34 | **示例 3:** 35 | 36 | ``` 37 | 输入: 701 38 | 输出: "ZY" 39 | ``` 40 | 41 | 42 | 43 | ### 思路 44 | 45 | 题意就是制作一个26进制,不过要注意的点就是,当余数等于0时,其实值为'Z' 46 | 47 | 举例`52 -> AZ`, 这里`52 % 26 = 0 需要转变了 'Z' 对应的26,而且商也需要对应的 -1 ` 48 | 49 | ``` 50 | 52 % 26 = 0 51 | 52 // 26 = 2 52 | ------------ 53 | 0 + 26 -> Z 54 | 2 - 1 -> A 55 | ``` 56 | 57 | 58 | 59 | ### 解题 60 | 61 | ```python 62 | class Solution: 63 | 64 | def convert_to_title(self, n: int) -> str: 65 | ans = [] 66 | while n > 0: 67 | n, mod = devmod(n, 26) 68 | if mod == 0: 69 | mod = 26 70 | n -= 1 71 | ans.append(chr(64 + mod)) 72 | return ''.join(ans[::-1]) 73 | ``` 74 | 75 | -------------------------------------------------------------------------------- /Algorithm/201902W4/201902W4-乌守元.md: -------------------------------------------------------------------------------- 1 | ## 蓝桥杯 PREV-32. 分糖果 2 | 3 | ### 问题描述 4 | 5 | w星球的⼀一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了了一株合根植物。 6 | 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。 7 | 如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗? 8 | 9 | ### 输入格式 10 | 第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1 49 | #include 50 | int a[1000001], ans = 0; 51 | 52 | using namespace std; 53 | int find(int x) { 54 | while(x != a[x]) 55 | x = a[x]; 56 | return x; 57 | } 58 | 59 | void uni(int x, int y) { 60 | a[find(x)] = find(y); 61 | } 62 | 63 | int main() { 64 | int m, n, k; 65 | scanf("%d%d%d", &m, &n, &k); 66 | for(int i = 0; i <= m * n; i++) 67 | a[i] = i; 68 | for(int i = 0; i < k; i++) { 69 | int t1, t2; 70 | scanf("%d%d", &t1, &t2); 71 | uni(t1, t2); 72 | } 73 | for(int i =1; i <= m*n; i++) 74 | if(find(i) == i) 75 | ans++; 76 | cout << ans << endl; 77 | return 0; 78 | } 79 | ``` 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /Algorithm/201902W4/201902W4-启航.md: -------------------------------------------------------------------------------- 1 | ## Leetcode717.1比特与2比特字符 2 | 3 | 有两种特殊字符。第一种字符可以用一比特`0`来表示。第二种字符可以用两比特(`10` 或 `11`)来表示。 4 | 5 | 现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。 6 | 7 | **示例 1:** 8 | 9 | ``` 10 | 输入: 11 | bits = [1, 0, 0] 12 | 输出: True 13 | 解释: 14 | 唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。 15 | 16 | ``` 17 | 18 | **示例 2:** 19 | 20 | ``` 21 | 输入: 22 | bits = [1, 1, 1, 0] 23 | 输出: False 24 | 解释: 25 | 唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。 26 | ``` 27 | 28 | **注意:** 29 | 30 | - `1 <= len(bits) <= 1000`. 31 | - `bits[i]` 总是`0` 或 `1`. 32 | 33 | **思路**: 34 | 35 | 最后一位必须是0 结束,所以就是能否将给出的字符正确的分割,使得最后一个字符是个单个位字符, 36 | 37 | 所以当遍历的时候遇到0 就加一位(单位字符只能是0),遇到1 就加两位(两位字符中必定包含1, 38 | 39 | 当退出循环的时候 正好i = n-1 则为true 40 | 41 | **解答**: 42 | 43 | ```java 44 | class solution { 45 | public static boolean ifOneBitCharacter(int[] bits) { 46 | int n = bits.length, i = 0; 47 | while (i < n - 1) { 48 | if (bits[i] == 0) { 49 | i++; 50 | } else { 51 | i += 2; 52 | } 53 | } 54 | return i == n - 1; 55 | } 56 | } 57 | ``` 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Algorithm/201902W4/201902W4-寒食君.md: -------------------------------------------------------------------------------- 1 | ## Leetcode #5 2 | 3 | ### 难度: 中等 4 | 5 | ### 描述: 6 | 7 | > 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 8 | 9 | 10 | ### 示例: 11 | 12 | ``` 13 | 输入: "babad" 14 | 输出: "bab" 15 | 注意: "aba" 也是一个有效答案。 16 | ``` 17 | 18 | ### 解法1: 19 | 20 | ``` 21 | class Solution { 22 | public String longestPalindrome(String s) { 23 | if (s == null || s.length() < 1) return ""; 24 | int start = 0; 25 | int end = 0; 26 | for (int i = 0; i < s.length(); i++){ 27 | int oddLen = check(s, i, i); 28 | int evenLen = check(s, i, i+1); 29 | int max = Math.max(oddLen, evenLen); 30 | if (max > end - start) { 31 | start = i -(max - 1) / 2; 32 | end = i + max / 2; 33 | } 34 | } 35 | return s.substring(start, end + 1); 36 | } 37 | 38 | private int check(String s, int left, int right) { 39 | while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){ 40 | left --; 41 | right ++; 42 | } 43 | return right - left -1; 44 | } 45 | } 46 | ``` 47 | 48 | 时间复杂度:O(n^2) 49 | 50 | ### 解法2: 51 | -------------------------------------------------------------------------------- /Algorithm/201902W5/201902W5-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## 反转链表 2 | 3 | ### 题:leetcode 206 4 | 5 | 反转一个单链表。 6 | 7 | **示例:** 8 | 9 | ``` 10 | 输入: 1->2->3->4->5->NULL 11 | 输出: 5->4->3->2->1->NULL 12 | ``` 13 | 14 | ### 思路 15 | 16 | 双指针标记链表,将`node.next`指针保留,再改变`node`指向新指针赋值给新节点,最后再保留的node.next 赋值给node (感觉有点绕),因为python支持元祖解包,以上过程可以写成一句 17 | 18 | ```python 19 | node.next, ans, node = ans, node, node.next 20 | ``` 21 | 22 | 23 | 24 | ### 解题 25 | 26 | ```python 27 | class ListNode: 28 | 29 | def __init__(self, x): 30 | self.val = x 31 | self.next = None 32 | 33 | 34 | class Solution: 35 | 36 | def reverse_list(self, head: ListNode) -> ListNode: 37 | # 循环 38 | cur, ans = head, None 39 | while cur: 40 | cur.next, ans, cur = ans, cur, cur.next 41 | # temp = cur.next 42 | # cur.next = ans 43 | # ans = cur 44 | # cur = temp 45 | return ans 46 | 47 | def recursion_solution(self, head: ListNode, ans=None): 48 | # 递归 49 | if not head: 50 | return ans 51 | head.next, ans, head = ans, head, head.next 52 | return self.recursion_solution(head, ans) 53 | ``` -------------------------------------------------------------------------------- /Algorithm/201902W5/201902W5-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | ### 难度: 简单 4 | 5 | ### 描述: 6 | 7 | > 给定一个数组和目标值,要求找出数组中两个相加之后等于目标值的两个数,并将它们的在数组中的索引返回。假定答案只有一个。 8 | 9 | 10 | ### 示例: 11 | 12 | ### 解法1: 13 | 14 | ``` 15 | class Solution { 16 | public int[] twoSum(int[] nums, int target) { 17 | for(int i =0; i 55 | #include 56 | using namespace std; 57 | 58 | int main() 59 | { 60 | int a[10001] = { 0 }; 61 | int m, n, min = 100000, max = 0; 62 | cin >> n; 63 | for(int i = 0; i < n; i++) 64 | while (1) { 65 | cin >> m; 66 | if (m > max) 67 | max = m; 68 | if (m < min) 69 | min = m; 70 | a[m]++; 71 | if (getchar() != ' ') 72 | break; 73 | } 74 | for(int i = min; i <= max; i++) 75 | { 76 | if (a[i] == 0) 77 | cout << i << " "; 78 | if (a[i] == 2) 79 | m = i; 80 | } 81 | cout << m; 82 | return 0; 83 | } 84 | ``` -------------------------------------------------------------------------------- /Algorithm/201902W5/201902W5-陈小渣.md: -------------------------------------------------------------------------------- 1 | ### 35.搜索插入位置 2 | 3 | 1、难度 -> Easy 4 | 5 | 2、题目内容 6 | 7 | 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 8 | 9 | Example 1: 10 | 11 | ``` 12 | Input: [1,3,5,6], 5 13 | Output: 2 14 | ``` 15 | 16 | Example 2: 17 | 18 | ``` 19 | Input: [1,3,5,6], 2 20 | Output: 1 21 | ``` 22 | 23 | Example 3: 24 | 25 | ``` 26 | Input: [1,3,5,6], 7 27 | Output: 4 28 | ``` 29 | 30 | Example 4: 31 | 32 | ``` 33 | Input: [1,3,5,6], 0 34 | Output: 0 35 | ``` 36 | 37 | 3、解答 38 | ```javaScript 39 | var searchInsert = function(nums, target) { 40 | if(!nums || !nums.length) return 0; 41 | 42 | var index = -1; 43 | var max = nums.length; 44 | var min = 0; 45 | while(index === -1) { 46 | var current = Math.floor((max + min) / 2); 47 | if(nums[current] === target) { 48 | index = current 49 | } else if (nums[current] < target) { 50 | min = current + 1 51 | } else { 52 | max = current + 1 53 | } 54 | if(max <= min) { 55 | index = min; 56 | } 57 | } 58 | return index; 59 | }; 60 | 61 | console.log(searchInsert([1,3,5,6], 7)) 62 | ``` 63 | 64 | 总结:二分法 -------------------------------------------------------------------------------- /Algorithm/201903W1/201903W1-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | ### 难度: 中度 4 | 5 | ### 描述: 6 | 7 | > 给定两个非负整数,将它们的数字逆序排列并存放进每个list里面,将这两个数相加,并把它们的结果逆序排列 8 | 9 | 10 | ### 示例: 11 | Input: (2->4->3) + (5->6->4) 12 | Output: 7->0->8 13 | Explanation: 342 + 465 = 807 14 | 15 | ### 解法1: 16 | 17 | ``` 18 | class Solution { 19 | public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 20 | ListNode dummyHead = new ListNode(0); 21 | ListNode p = l1, q = l2, curr = dummyHead; 22 | int carry = 0; 23 | while (p != null || q != null) { 24 | int x = (p != null) ? p.val : 0; 25 | int y = (q != null) ? q.val : 0; 26 | int sum = carry + x + y; 27 | carry = sum / 10; 28 | curr.next = new ListNode(sum % 10); 29 | curr = curr.next; 30 | if (p != null) p = p.next; 31 | if (q != null) q = q.next; 32 | } 33 | if (carry > 0) { 34 | curr.next = new ListNode(carry); 35 | } 36 | return dummyHead.next; 37 | } 38 | } 39 | ``` 40 | 41 | 时间复杂度:O(max(m,n)) 42 | 空间复杂度:O(max(m,n)) 43 | 44 | 45 | -------------------------------------------------------------------------------- /Algorithm/201903W1/201903W1-乌守元.md: -------------------------------------------------------------------------------- 1 | ADV-169. ⼠兵排队问题 2 | 有N个⼠兵(1≤N≤26),编号依次为A,B,C,…,队列训练时,指挥官要把⼀些⼠兵从⾼到矮⼀次排成⼀⾏,但现在指挥官不能直接获得每个⼈的身⾼信息,只能获得“P1⽐P2⾼”这样的⽐较结果(P1、P2∈A,B,C,…,Z,记为 P1>P2),如”A>B”表示A⽐B⾼。请编⼀程序,根据所得到的⽐较结果求出⼀种符合条件的排队⽅案。 3 | (注:⽐较结果中没有涉及的⼠兵不参加排队) 4 | 5 | 输⼊要求 6 | ⽐较结果从⽂本⽂件中读⼊(⽂件由键盘输⼊),每个⽐较结果在⽂本⽂件中占⼀⾏。 7 | 8 | 输出要求 9 | 若输⼊数据⽆解,打印“No Answer!”信息,否则从⾼到矮⼀次输出每⼀个⼠兵的编号,中间⽆分割 10 | 符,并把结果写⼊⽂本⽂件中,⽂件由键盘输⼊: 11 | 12 | 样例输⼊ 13 | A>B 14 | B>D 15 | F>D 16 | 17 | 样例输出 18 | AFBD 19 | 20 | 参考解答 21 | 22 | ```c++ 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | using namespace std; 29 | 30 | int main() { 31 | string s, str; 32 | int degree[30] = {0}; 33 | int mp[30][30] = {0}; 34 | int vis[30] = {0}; 35 | queue q; 36 | int cnt = 0, num = 0; 37 | while(cin >> s) { 38 | if(!mp[s[0]-'A'][s[2]-'A']) 39 | degree[s[2]-'A']++; 40 | mp[s[0]-'A'][s[2]-'A'] = 1; 41 | vis[s[0]-'A'] = 1; 42 | vis[s[2]-'A'] = 1; 43 | } 44 | for (int i = 0; i < 30; i++) { 45 | if (vis[i]) 46 | num++; 47 | if (vis[i]&&!degree[i]) 48 | q.push(i); 49 | } 50 | while (!q.empty()) { 51 | int top = q.front(); 52 | q.pop(); 53 | cnt++; 54 | str+=('A' + top); 55 | for (int i = 0; i < 30; i++) { 56 | if (mp[top][i]) { 57 | degree[i]--; 58 | if (degree[i] == 0) 59 | q.push(i); 60 | } 61 | } 62 | } 63 | if (cnt != num) 64 | cout << "No Answer!"; 65 | else 66 | cout << str; 67 | return 0; 68 | } 69 | ``` 70 | 71 | -------------------------------------------------------------------------------- /Algorithm/201903W2/201903W2-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 171 2 | 3 | #### [171. Excel表列序号](https://leetcode-cn.com/problems/excel-sheet-column-number/) 4 | 5 | 给定一个Excel表格中的列名称,返回其相应的列序号。 6 | 7 | 例如, 8 | 9 | ``` 10 | A -> 1 11 | B -> 2 12 | C -> 3 13 | ... 14 | Z -> 26 15 | AA -> 27 16 | AB -> 28 17 | ... 18 | ``` 19 | 20 | **示例 1:** 21 | 22 | ``` 23 | 输入: "A" 24 | 输出: 1 25 | ``` 26 | 27 | **示例 2:** 28 | 29 | ``` 30 | 输入: "AB" 31 | 输出: 28 32 | ``` 33 | 34 | **示例 3:** 35 | 36 | ``` 37 | 输入: "ZY" 38 | 输出: 701 39 | ``` 40 | 41 | ### 思路 42 | 43 | 这道题是上一道[168. Excel表列名称](https://leetcode-cn.com/problems/excel-sheet-column-title/)的变种,从字母转为数字,使用`ord('A')-64`即可, 进位成26即可 44 | 45 | ### 解题 46 | 47 | ```python 48 | class Solution: 49 | def title_to_number(self, s: str) -> int: 50 | ans = 0 51 | for value in s: 52 | ans = ans * 26 + ord(value) - 64 53 | return ans 54 | ``` 55 | 56 | -------------------------------------------------------------------------------- /Algorithm/201903W2/201903W2-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | ### 难度: 中度 4 | 5 | ### 描述: 6 | 7 | > 给定一个字符串,返回没有重复的最大长度的子串 8 | 9 | 10 | ### 解法1: 11 | 12 | ``` 13 | class Solution { 14 | public int lengthOfLongestSubstring(String s) { 15 | 16 | int n = s.length(); 17 | int ans = 0; 18 | for (int i = 0; i < n; i++) 19 | for (int j = i + 1; j <= n; j++) 20 | if (allUnique(s, i, j)) ans = Math.max(ans, j - i); 21 | return ans; 22 | } 23 | 24 | public boolean allUnique(String s, int start, int end) { 25 | 26 | Set set = new HashSet<>(); 27 | for (int i = start; i < end; i++) { 28 | Character ch = s.charAt(i); 29 | if (set.contains(ch)) return false; 30 | set.add(ch); 31 | } 32 | return true; 33 | } 34 | } 35 | ``` 36 | 37 | 时间复杂度:O(n^3) 38 | 空间复杂度:O(max(m,n)) 39 | 40 | 41 | -------------------------------------------------------------------------------- /Algorithm/201903W2/201903W2-moye.md: -------------------------------------------------------------------------------- 1 | # 84. Largest Rectangle in Histogram 2 | Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. 3 | 4 | ![](https://assets.leetcode.com/uploads/2018/10/12/histogram.png) 5 | 6 | Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. 7 | 8 | ![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/histogram_area.png) 9 | 10 | The largest rectangle is shown in the shaded area, which has area = 10 unit. 11 | 12 | Example: 13 | 14 | Input: [2,1,5,6,2,3] 15 | Output: 10 16 | 17 | 思路 18 | 19 | > 1. 可以使用暴力,但python会超市,时间复杂度为O(n^2) 20 | > 21 | > 2. 使用栈来完成O(n)的算法,当第 i 个长方形比第 i-1 个 低时,低 i-1 个长方形高出的部分无法进入计算,我们维护一个始终递增的栈来保证尽可能全面的截取长方形,在维护栈的时候获取弹出栈的长方形可截取的最大面积,最后弹出所有长方形,算得最大的面积。 22 | 23 | ```python 24 | class Solution(object): 25 | def largestRectangleArea(self, heights): 26 | """ 27 | :type heights: List[int] 28 | :rtype: int 29 | """ 30 | # 添加0是为了最后弹出sack中所有的值 31 | heights.append(0) 32 | # 保存索引值,维护长方形高度递增的一个栈 33 | stack = [-1] 34 | ans = 0 35 | for i in range(len(heights)): 36 | while heights[i] < heights[stack[-1]]: 37 | # 维护栈,算得弹出的长方形能截得的最大面积 38 | h = heights[stack.pop()] 39 | # 因为栈是递增的,我们算面积是获取的宽也是往后计算 40 | w = i - 1 - stack[-1] 41 | ans = max(ans, h * w) 42 | stack.append(i) 43 | heights.pop() 44 | return ans 45 | ``` -------------------------------------------------------------------------------- /Algorithm/201903W2/201903W2-启航.md: -------------------------------------------------------------------------------- 1 | ## leetcode160-相交链表 2 | 3 | 编写一个程序,找到两个单链表相交的起始节点。 4 | 5 | ``` 6 | 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 7 | 输出:Reference of the node with value = 8 8 | 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。 9 | ``` 10 | 11 | ``` 12 | 输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 13 | 输出:Reference of the node with value = 2 14 | 输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。 15 | ``` 16 | 17 | ``` 18 | 输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 19 | 输出:null 20 | 输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。 21 | 解释:这两个链表不相交,因此返回 null 22 | ``` 23 | 24 | 思路:这里的相交是地址相同(指针相逐) 25 | 26 | ```java 27 | /** 28 | * Definition for singly-linked list. 29 | * public class ListNode { 30 | * int val; 31 | * ListNode next; 32 | * ListNode(int x) { 33 | * val = x; 34 | * next = null; 35 | * } 36 | * } 37 | */ 38 | public class Solution { 39 | public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 40 | if (headA == null || headB == null) return null; 41 | ListNode a = headA, b = headB; 42 | while(a != b) { 43 | a = (a == null ? headB : a.next); 44 | b = (b == null ? headA : b.next); 45 | } 46 | return a; 47 | } 48 | } 49 | ``` 50 | 51 | -------------------------------------------------------------------------------- /Algorithm/201903W3/201903W3-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | ### 难度: 中度 4 | 5 | ### 描述: 6 | 7 | > 如何判断一个链表有环 8 | 9 | 10 | ### 解法1: 11 | 12 | ``` 13 | class Solution { 14 | public boolean hasCycle(ListNode head) { 15 | 16 | if (head == null || head.next == null) { 17 | return false; 18 | } 19 | ListNode slow = head; 20 | ListNode fast = head.next; 21 | while (slow != fast) { 22 | if (fast == null || fast.next == null) { 23 | return false; 24 | } 25 | slow = slow.next; 26 | fast = fast.next.next; 27 | } 28 | return true; 29 | } 30 | 31 | class ListNode { 32 | 33 | int val; 34 | ListNode next; 35 | 36 | ListNode(int x) { 37 | 38 | val = x; 39 | next = null; 40 | } 41 | } 42 | } 43 | ``` 44 | 45 | 时间复杂度:O(n) 46 | 空间复杂度:O(1) 47 | 48 | 49 | -------------------------------------------------------------------------------- /Algorithm/201903W4/201903W4-starichat.md: -------------------------------------------------------------------------------- 1 | 二叉树以及平衡二叉树,很难达到“平衡”的目的,经常出现左子树很矮,右子树很高,或者反过来,甚至极端情况下会退化到链表的情况。为了解决这样的情况,相应提升整棵树的插入,查找等操作的效率。对树进行一些新的操作,让二叉树能够近似平衡,这种新的数据结构称为红黑树。 2 | 3 | 红黑树: 4 | 具有以下兴致的二叉树: 5 | - 每个结点要么是红的要么是黑的。 6 | - 根结点是黑的。 7 | - 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 8 | - 如果一个结点是红的,那么它的两个儿子都是黑的。 9 | - 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。 10 | 11 | 如图: 12 | [![AYwlfe.md.png](https://s2.ax1x.com/2019/03/24/AYwlfe.md.png)](https://imgchr.com/i/AYwlfe) 13 | 14 | 学习红黑树的算法之前先了解两个概念: 15 | 左旋: 16 | 当在某个结点pivot上,做左旋操作时,我们假设它的右孩子y不是NIL[T],pivot可以为任何不是NIL[T]的左子结点。左旋以pivot到Y之间的链为“支轴”进行,它使Y成为该子树的新根,而Y的左孩子b则成为pivot的右孩子。 17 | ![AYw8ld.jpg](https://s2.ax1x.com/2019/03/24/AYw8ld.jpg) 18 | 19 | 右旋: 20 | 21 | ![AYwJOI.jpg](https://s2.ax1x.com/2019/03/24/AYwJOI.jpg) -------------------------------------------------------------------------------- /Algorithm/201904W1/201904W1-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | ### 难度: 中度 4 | 5 | ### 描述: 6 | 7 | > Leetcode19 8 | 9 | 10 | ### 解法1: 11 | 12 | ``` 13 | class Solution { 14 | public class ListNode { 15 | int val; 16 | ListNode next; 17 | ListNode(int x) { val = x; } 18 | } 19 | 20 | public ListNode removeNthFromEnd(ListNode head, int n) { 21 | ListNode dummy = new ListNode(0); 22 | dummy.next = head; 23 | int length = 0; 24 | ListNode first = head; 25 | while (first != null) { 26 | length++; 27 | first = first.next; 28 | } 29 | length -= n; 30 | first = dummy; 31 | while (length > 0) { 32 | length--; 33 | first = first.next; 34 | } 35 | first.next = first.next.next; 36 | return dummy.next; 37 | } 38 | } 39 | ``` 40 | 41 | 时间复杂度:O(L) 42 | 空间复杂度:O(1) 43 | 44 | 45 | -------------------------------------------------------------------------------- /Algorithm/201904W2/MiddleNode-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | ### 难度: 简单 4 | 5 | ### 描述: 返回一个list的中间节点,如果有两个中间结点,取第二个 6 | 7 | > Leetcode 876 8 | 9 | 10 | ### 解法1: 11 | 12 | ``` 13 | class Solution { 14 | public class ListNode { 15 | int val; 16 | ListNode next; 17 | ListNode(int x) { val = x; } 18 | } 19 | 20 | public ListNode middleNode(ListNode head) { 21 | ListNode slow = head,fast = head; 22 | while(fast !=null && fast.next !=null) { 23 | slow = slow.next; 24 | fast = fast.next.next; 25 | } 26 | return slow; 27 | } 28 | } 29 | ``` 30 | 31 | 时间复杂度:O(N) 32 | 空间复杂度:O(1) 33 | 34 | 35 | -------------------------------------------------------------------------------- /Algorithm/201904W3/201904W3-starichat.md: -------------------------------------------------------------------------------- 1 | # 算法 2 | # leetcode 3 | ## desc 4 | > 92.Reverse Linked List II 5 | Reverse a linked list from position m to n. Do it in one-pass. 6 | 7 | EXAMPLE: 8 | ``` 9 | Input: 1->2->3->4->5->NULL, m = 2, n = 4 10 | Output: 1->4->3->2->5->NULL 11 | ``` 12 | ## Solution: 13 | ``` 14 | class Solution { 15 | 16 | private boolean stop; 17 | private ListNode left; 18 | 19 | public void recurseAndReverse(ListNode right, int m, int n) { 20 | 21 | if (n == 1) { 22 | return; 23 | } 24 | 25 | 26 | right = right.next; 27 | 28 | 29 | if (m > 1) { 30 | this.left = this.left.next; 31 | } 32 | 33 | 34 | this.recurseAndReverse(right, m - 1, n - 1); 35 | 36 | if (this.left == right || right.next == this.left) { 37 | this.stop = true; 38 | } 39 | 40 | 41 | if (!this.stop) { 42 | int t = this.left.val; 43 | this.left.val = right.val; 44 | right.val = t; 45 | 46 | this.left = this.left.next; 47 | } 48 | } 49 | 50 | public ListNode reverseBetween(ListNode head, int m, int n) { 51 | this.left = head; 52 | this.stop = false; 53 | this.recurseAndReverse(head, m, n); 54 | return head; 55 | } 56 | } 57 | ``` 58 | -------------------------------------------------------------------------------- /Algorithm/201904W3/LeetCode7ReverseInteger-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | > Leetcode 7 4 | 5 | 6 | ### 解法1: 7 | 8 | ``` 9 | class Solution { 10 | public int reverse(int x) { 11 | 12 | int rev = 0; 13 | while (x != 0) { 14 | int pop = x % 10; 15 | x /= 10; 16 | if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0; 17 | if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0; 18 | rev = rev * 10 + pop; 19 | } 20 | return rev; 21 | } 22 | } 23 | ``` 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Algorithm/201904W3/mode_number-HardJ.md: -------------------------------------------------------------------------------- 1 | #### leetcode 2 | #### 169. 求众数 3 | 4 | > 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 5 | 6 | > 你可以假设数组是非空的,并且给定的数组总是存在众数。 7 | 8 | 9 | ``` 10 | 示例 1: 11 | 12 | 输入: [3,2,3] 13 | 输出: 3 14 | 15 | 示例 2: 16 | 17 | 输入: [2,2,1,1,1,2,2] 18 | 输出: 2 19 | 20 | 21 | java版 22 | 23 | ​ 24 | class Solution { 25 | public int majorityElement(int[] nums) { 26 | int count = 1; 27 | int major = nums[0]; 28 | for (int i = 1; i < nums.length; i++) { 29 | if(nums[i] == major) { 30 | count++; 31 | }else { 32 | count--; 33 | if(count == 0){ 34 | major = nums[i + 1]; 35 | } 36 | } 37 | } 38 | return major; 39 | } 40 | } 41 | ​``` -------------------------------------------------------------------------------- /Algorithm/201904W4/201904W4-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | > Leetcode 876 4 | 5 | 6 | ### 解法1: 7 | 8 | ``` 9 | class Solution { 10 | public ListNode middleNode(ListNode head) { 11 | ListNode slow = head,fast = head; 12 | while(fast !=null && fast.next !=null) { 13 | slow = slow.next; 14 | fast = fast.next.next; 15 | } 16 | return slow; 17 | } 18 | } 19 | 20 | public class ListNode { 21 | int val; 22 | ListNode next; 23 | ListNode(int x) { val = x; } 24 | } 25 | ``` 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Algorithm/201905W1/201905W1-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | > Leetcode 7 4 | 5 | 6 | ### 解法1: 7 | 8 | ``` 9 | class solution { 10 | public int reverse(int x) { 11 | 12 | int rev = 0; 13 | while (x != 0) { 14 | int pop = x % 10; 15 | x /= 10; 16 | if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0; 17 | if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0; 18 | rev = rev * 10 + pop; 19 | } 20 | return rev; 21 | } 22 | } 23 | ``` 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Algorithm/201905W1/201905W1-乌守元.md: -------------------------------------------------------------------------------- 1 | ## 找出单独出现的数字 2 | 3 | ### 描述 4 | 5 | 给出N个数字。其中仅有一个数字出现过一次,其他数字均出现过两次,找出这个出现且只出现过一次的数字。要求时间和空间复杂度最小。 6 | 7 | ### 输入 8 | 9 | 输入多个数字,每个数字以空格分开。数字数量 N < 20,输入数字的最大值小于 256. 10 | 11 | ### 输出 12 | 13 | 输出内容为只出现过唯一一次的数字 14 | 15 | ### 输入样例 16 | 17 | ``` 18 | 10 10 11 12 12 11 16 19 | ``` 20 | 21 | ### 输出样例 22 | 23 | ``` 24 | 16 25 | ``` 26 | 27 | ### 解答 28 | 29 | ```python 30 | import sys 31 | 32 | for line in sys.stdin: 33 | line = line.strip().split() 34 | res = 0 35 | for num in line: 36 | res = res ^ (int)num 37 | print(Res) 38 | ``` 39 | 40 | 参考链接: 41 | 42 | -------------------------------------------------------------------------------- /Algorithm/201905W1/环形链表-II-HardJ.md: -------------------------------------------------------------------------------- 1 | #### 142. 环形链表 II 2 | 3 | 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 `null`。 4 | 5 | 为了表示给定链表中的环,我们使用整数 `pos` 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 `pos` 是 `-1`,则在该链表中没有环。 6 | 7 | **示例 1** 8 | 9 | ``` 10 | 输入:head = [3,2,0,-4], pos = 1 11 | 输出:tail connects to node index 1 12 | 解释:链表中有一个环,其尾部连接到第二个节点。 13 | ``` 14 | 15 | ![]()(图片来自力扣) 16 | 17 | **示例 2** 18 | 19 | ``` 20 | 输入:head = [1,2], pos = 0 21 | 输出:tail connects to node index 0 22 | 解释:链表中有一个环,其尾部连接到第一个节点。 23 | ``` 24 | 25 | ![]()(图片来自力扣) 26 | 27 | **示例 3** 28 | 29 | ``` 30 | 输入:head = [1], pos = -1 31 | 输出:no cycle 32 | 解释:链表中没有环。 33 | ``` 34 | 35 | ![]() (图片来自力扣) 36 | 37 | #### Java版 38 | 39 | ```java 40 | public class Solution { 41 | public ListNode detectCycle(ListNode head) { 42 | ListNode slow = head; 43 | ListNode fast = head; 44 | 45 | while (fast!=null && fast.next!=null){ 46 | fast = fast.next.next; 47 | slow = slow.next; 48 | 49 | if (fast == slow){ 50 | ListNode slow2 = head; 51 | while (slow2 != slow){ 52 | slow = slow.next; 53 | slow2 = slow2.next; 54 | } 55 | return slow; 56 | } 57 | } 58 | return null; 59 | } 60 | } 61 | ``` 62 | 63 | -------------------------------------------------------------------------------- /Algorithm/201905W2/151-翻转字符串里的单词-HardJ.md: -------------------------------------------------------------------------------- 1 | #### 151. 翻转字符串里的单词 2 | 3 | 给定一个字符串,逐个翻转字符串中的每个单词。 4 | 5 | **示例 1:** 6 | 7 | ```java 8 | 输入: "the sky is blue" 9 | 输出: "blue is sky the" 10 | ``` 11 | 12 | **示例 2:** 13 | 14 | ```java 15 | 输入: " hello world! " 16 | 输出: "world! hello" 17 | 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 18 | ``` 19 | 20 | **示例 3:** 21 | 22 | ```java 23 | 输入: "a good example" 24 | 输出: "example good a" 25 | 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 26 | ``` 27 | 28 | **说明:** 29 | 30 | - 无空格字符构成一个单词。 31 | - 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 32 | - 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 33 | 34 | ```java 35 | class Solution { 36 | public String reverseWords(String s) { 37 | StringBuilder sb = new StringBuilder(); 38 | s = " " + s; 39 | int j = s.length(); 40 | for (int i = s.length() - 1; i >= 0 ; i--) { 41 | if(' ' == s.charAt(i)){ 42 | if(j - i > 1){ 43 | sb.append(s.substring(i, j)); 44 | } 45 | j = i; 46 | }else { 47 | continue; 48 | } 49 | } 50 | if(sb.length() > 0){ 51 | String temp = sb.toString(); 52 | return temp.substring(1, sb.length()); 53 | } 54 | return ""; 55 | } 56 | } 57 | ``` 58 | 59 | -------------------------------------------------------------------------------- /Algorithm/201905W2/201905W2-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | > Leetcode 27 4 | 5 | 6 | ### 解法1: 7 | 8 | ``` 9 | class Solution { 10 | public int removeElement(int[] nums, int val) { 11 | int i = 0; 12 | for (int j = 0; j < nums.length; j++) { 13 | if (nums[j] != val) { 14 | nums[i] = nums[j]; 15 | i++; 16 | } 17 | } 18 | return i; 19 | } 20 | } 21 | ``` 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Algorithm/201905W3/200-岛屿的个数-HardJ.md: -------------------------------------------------------------------------------- 1 | 200. #### 岛屿的个数 2 | 3 | 给定一个由 `'1'`(陆地)和 `'0'`(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 4 | 5 | **示例 1:** 6 | 7 | ```java 8 | 输入: 9 | 11110 10 | 11010 11 | 11000 12 | 00000 13 | 14 | 输出: 1 15 | ``` 16 | 17 | **示例 2:** 18 | 19 | ```java 20 | 输入: 21 | 11000 22 | 11000 23 | 00100 24 | 00011 25 | 26 | 输出: 3 27 | ``` 28 | 29 | **解:** 30 | 31 | ```java 32 | class Solution { 33 | public int numIslands(char[][] grid) { 34 | int result = 0; 35 | if(grid.length <= 0 || grid[0].length <= 0){ 36 | return result; 37 | } 38 | for (int i = 0; i < grid.length; i++) { 39 | for (int j = 0; j < grid[i].length; j++) { 40 | // 通过dfs将1周围数字都改为0 41 | if(grid[i][j] == '1'){ 42 | result ++; 43 | dfs(grid, i, j); 44 | } 45 | 46 | } 47 | } 48 | return result; 49 | } 50 | 51 | private void dfs(char[][] grid, int i, int j){ 52 | if(i >= grid.length || j >= grid[0].length || i < 0 || j < 0){ 53 | return; 54 | } 55 | if(grid[i][j] == '1'){ 56 | grid[i][j] = '0'; 57 | dfs(grid, i - 1, j); 58 | dfs(grid, i + 1, j ); 59 | dfs(grid, i, j -1); 60 | dfs(grid, i, j + 1); 61 | } 62 | } 63 | } 64 | ``` 65 | 66 | -------------------------------------------------------------------------------- /Algorithm/201906W1/201906W1-lingyunG.md: -------------------------------------------------------------------------------- 1 | ## Leetcode 2 | 3 | > Leetcode 4 | 5 | 6 | ### 解法1: 7 | 8 | ``` 9 | class Solution { 10 | public ListNode swapPairs(ListNode head) { 11 | 12 | if (head == null || head.next == null) return head; 13 | ListNode dummy = new ListNode(-1); 14 | dummy.next = head; 15 | ListNode odd = head, even = head.next, tmp = dummy; 16 | 17 | while (true) { 18 | ListNode sav = even.next; 19 | //twist two nodes 20 | tmp.next = even; 21 | even.next = odd; 22 | odd.next = sav; 23 | //set pointer in right position 24 | if (odd.next == null || even.next.next.next == null) break; 25 | odd = odd.next; 26 | even = even.next.next.next; 27 | tmp = tmp.next.next; 28 | } 29 | 30 | return dummy.next; 31 | } 32 | 33 | public class ListNode { 34 | 35 | int val; 36 | ListNode next; 37 | 38 | ListNode(int x) { 39 | 40 | val = x; 41 | } 42 | } 43 | } 44 | ``` 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Partners/EruDev.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@EruDev](https://github.com/EruDev) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/EruDev.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A: leetcode #1](https://github.com/EruDev/ARTS/blob/master/Algorithm/201901W4/201901W4-EruDev.md) 14 | 15 | - [R: 在 PyCharm 中设置 Flask 程序](https://github.com/EruDev/ARTS/blob/master/Review/201901W4/%E5%9C%A8PyCharm%E4%B8%AD%E8%AE%BE%E7%BD%AEFlask%E7%A8%8B%E5%BA%8F.md) 16 | 17 | - [T: 分享两个自己常用的工具(Everything、百度网盘客户端)]( 18 | https://github.com/EruDev/ARTS/blob/master/Tip/201901W4/%E5%88%86%E4%BA%AB%E4%B8%A4%E4%B8%AA%E8%87%AA%E5%B7%B1%E5%B8%B8%E7%94%A8%E7%9A%84%E5%B7%A5%E5%85%B7(Everything%E3%80%81%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E5%AE%A2%E6%88%B7%E7%AB%AF).md) 19 | 20 | - [S: 《Flask Web 开发实战》 之 Flask 的工作流程与机制-EruDev](https://github.com/EruDev/ARTS/blob/master/Share/201901W4/%E3%80%8AFlask%20Web%20%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E3%80%8B%20%E4%B9%8B%20Flask%20%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B%E4%B8%8E%E6%9C%BA%E5%88%B6-EruDev.md 21 | ) 22 | 23 | ### 201902W1: 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Partners/Leo.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@Leo](https://github.com/leozhiyu) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/Leo.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A: leetcode #20,#21,#26](../Algorithm/201901W4/201901W4-Leo.md) 14 | - [R: RabbitMQ-1](../Review/201901W4/RabbitMQ1-Leo.md) 15 | - [T: 如何用简单的方式生成带标签的pdf](../Tip/201901W4/如何用简单的方式生成带标签的pdf-Leo.md) 16 | - [S: 从实习中领悟的软技能](../Share/201901W4/从实习中领悟的软技能-Leo.md) 17 | 18 | ### 201902W1: 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Partners/YuanCome.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@YuanCome](https://github.com/THyyy) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/YuanCome.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A: leetcode #1](../Algorithm/201901W4/201901W4-YuanCome.md) 14 | 15 | - [R: 如何成为一名杰出的开发者](../Review/201901W4/如何成为一名杰出的开发者-YuanCome.md) 16 | 17 | - [T: 第一次尝试写Markdown文章](../Tip/201901W4/第一次尝试写Markdown文章-YuanCome.md) 18 | 19 | - [S: SpringBoot和Vue前后端分离开发与合并](../Share/201901W4/SpringBoot和Vue前后端分离开发与合并-YuanCome.md) 20 | 21 | ### 201902W1: -------------------------------------------------------------------------------- /Partners/ZmJ.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@ZmJ](https://github.com/zzzzzzmj) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/ZmJ.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A-leetcode-53](../Algorithm/201901W4/201901W4-ZmJ.md) 14 | - [R-Hello World的由来](../Review/201901W4/HelloWorld的来历-ZmJ.md) 15 | - [T-git hook自定义工作流](../Tip/201901W4/GitHook自定义工作流-ZmJ.md) 16 | - [S-Django查询优化之select_related、prefetch_related](../Share/201901W4/Django查询优化之select_related、prefetch_related-ZmJ.md) 17 | 18 | ### 201902W1: 19 | 20 | - [A-leetcode88](../Algorithm/201902W1/201902W1-ZmJ.md) 21 | - [S-浅谈Git拉取与合并](../Share/201902W1/浅谈Git之拉取与合并-ZmJ.md) 22 | 23 | ### 201902W2: 24 | 25 | - [A-leetcode118,119](../Algorithm/201902W2/201902W2-ZmJ.md) 26 | 27 | ### 201902W3: 28 | 29 | - [A-leetcode121,122](../Algorithm/201902W3/201902W3-ZmJ.md) 30 | 31 | - [R-软件工程与编程的不同](../Review/201902W3/软件工程与编程的不同-ZmJ.md) 32 | 33 | - [T-ARTS周报脚本](../Tip/201902W3/ARTS周报脚本-ZmJ.md) 34 | 35 | - [S-修改Git Commit Message](../Share/201902W3/修改git-commit-message-ZmJ.md) 36 | 37 | ### 201902W4: 38 | 39 | - [A-leetcode168](../Algorithm/201902W4/201902W4-ZmJ.md) 40 | 41 | - [R-Java-for-Python-Programmers](../Review/201902W4/Java-for-Python-Programmers-ZmJ.md) 42 | 43 | - [T-travis.ci持续集成工具](../Tip/201902W4/travis.ci持续集成工具-ZmJ.md) 44 | 45 | - [S-vim的一些插件和配置](../Share/201902W4/vim的一些插件和配置-ZmJ.md) 46 | 47 | ### 201902W5 48 | 49 | > 咕咕咕 50 | 51 | ### 201903W1 52 | 53 | - [A-leetcode 171](../Algorithm/201903W2/201903W2-ZmJ.md) 54 | 55 | - [R-A_Z of useful python tricks](../Review/201903W2/An_A-Z_of_useful_python_tricks-ZmJ.md) 56 | 57 | - [T-Basic Auth 鉴权](../Tip/201903W2/BasicAuth鉴权-ZmJ.md) 58 | 59 | - [S-windows下的linux子系统](../Share/201903W2/windows下的Linux环境-ZmJ.md) 60 | -------------------------------------------------------------------------------- /Partners/Zoctopus.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@Niannian Zhang](https://github.com/OctopusLian) 4 | 5 | ## 自我介绍 6 | 7 | [这里](../self-introduction/Zoctopus.md) 8 | 9 | ## 汇总 10 | 11 | ### 201902W3: 12 | 13 | - [S: Go语言中管道堵塞+互斥死锁分析]() 14 | 15 | - [S: dlv调试小结]() 16 | 17 | -------------------------------------------------------------------------------- /Partners/starichat.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@starichat](https://github.com/starichat) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/starichat.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201902W3: 12 | 13 | - [A: 字符串匹配算法](../Algorithm/201902W3/201902W3-starichat.md) 14 | - [R: 翻译:计算的未来是模拟](../Review/201902W3/计算的未来是模拟.md) 15 | - [T: vim的使用技巧](../Tip/201902W3/vim的使用技巧.md) 16 | - [S: 哈希算法的应用](../Share/201902W3/哈希算法的应用.md) 17 | 18 | 19 | 20 | ### 201903W4: 21 | 22 | - [A: 红黑树](../Algorithm/201903W4/201903W4-starichat.md) 23 | - [R: 读后感:黑客与画家](../Review/201903W4/《黑客与画家》读后感-starichat.md) 24 | - [T: Git新手使用技巧](../Tip/201903W4/Git新手技巧-starichat.md) 25 | - [S: 哈希算法的应用续](../Share/201903W4/哈希算法的应用续-starichat.md) 26 | 27 | ### 201904W3: 28 | 29 | - [A: Reverse LinkedList](../Algorithm/201904W3/201904W3-starichat.md) 30 | - [R: 线程的基础知识](../Review/201904W3/线程的基础知识-starichat.md) 31 | - [T: 懒加载方式的使用](../Tip/201904W3/懒加载方式的使用-starichat.md) 32 | - [S: Java对日期的操作](../Share/201904W3/Java对日期的操作-starichat.md) 33 | -------------------------------------------------------------------------------- /Partners/yanglei094121.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@yanglei094121](https://github.com/yanglei094121) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/yanglei094121.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A-数据结构之线性表](../Algorithm/201901W4/201901W4-yanglei094121.md) 14 | - [R-Light Field Rendering](../Review/201901W4/Light-Field-Rendering主要内容解析-yanglei094121.md) 15 | - [T-ImagePy简单介绍](../Tip/201901W4/ImagePy简单介绍-yanglei094121.md) 16 | - [S-光场计算成像空域](../Share/201901W4/光场计算成像空域-yanglei094121.md) 17 | 18 | ### 201902W1: 19 | 20 | - [A-迷宫问题](../Algorithm/201902W1/201902W1-yanglei094121.md) 21 | - [R-LFToolbox官方文档](../Review/201902W1/LFToolbox-yanglei094121.md) 22 | - [T-GitHub团队协作git流程](../Tip/201902W1/GitHub团队协作git流程-yanglei094121.md) 23 | - [S-使用matlab将灰度图转换为彩色图](../Share/201902W1/使用matlab将灰度图转换为彩色图-yanglei094121.md) 24 | 25 | ### 201902W2: 26 | 27 | - [A-栈的应用:实现递归](../Algorithm/201902W2/201902W2-yanglei094121.md) 28 | - [R-LFToolbox官方文档更新](../Review/201902W2/LFToolbox-yanglei094121.md) 29 | - [T-光场相机模拟程序解读](../Tip/201902W2/光场相机模拟程序解读-yanglei094121.md) 30 | - [S-粤语歌钟无艳学习](../Share/201902W2/粤语歌钟无艳学习-yanglei094121.md) 31 | 32 | ### 201902W3: 33 | 34 | - [A-栈的应用:括号匹配问题](../Algorithm/201902W3/201902W3-yanglei094121.md) 35 | - [R-light-field-rendering](../Review/201902W3/light-field-rendering-yanglei094121.md) 36 | - [T-update光场相机模拟程序解读](../Tip/201902W3/update光场相机模拟程序解读-yanglei094121.md) 37 | - [S-2019考研题解读](../Share/201902W3/2019考研题解读-yanglei094121.md) 38 | 39 | 40 | ### 201902W4: 41 | 42 | - [A-队列基础知识](../Algorithm/201902W4/201902W4-yanglei094121.md) 43 | - [R-light-field-rendering](../Review/201902W4/light-field-rendering-yanglei094121.md) 44 | - [T-常见latex编译问题](../Tip/201902W4/atex编译相关问题-yanglei094121.md) 45 | - [S-markdown插入数学公式](../Share/201902W4/markdown插入数学公式-yanglei094121.md) 46 | -------------------------------------------------------------------------------- /Partners/yu.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@yu](https://github.com/looker53) 4 | 5 | ## 自我介绍: 6 | 7 | [点击查看](../self-introduction/yu.md) 8 | 9 | -------------------------------------------------------------------------------- /Partners/乌守元.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@乌守元](https://github.com/ezioyuan) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/乌守元.md) 8 | 9 | ## 汇总: 10 | 11 | -------------------------------------------------------------------------------- /Partners/启航.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@启航](https://github.com/Sailzjw) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](https://github.com/byte-stream/ARTS/blob/master/self-introduction/%E5%90%AF%E8%88%AA.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A: 最大子序列的问题](https://github.com/Sailzjw/ARTS/blob/master/Algorithm/201901W4/20190121W4-%E5%90%AF%E8%88%AA.md) 14 | - [R: 中国餐饮业的发展趋势](https://github.com/Sailzjw/ARTS/blob/master/Review/201901W4/%E4%B8%AD%E5%9B%BD%E9%A4%90%E9%A5%AE%E4%B8%9A%E7%9A%84%E5%8F%91%E5%B1%95%E8%B6%8B%E5%8A%BF-%E5%90%AF%E8%88%AA.md) 15 | - [T:Windows下安装Linux虚拟机](https://github.com/Sailzjw/ARTS/blob/master/Tip/201901W4/windows%E4%B8%8B%E5%AE%89%E8%A3%85linux%E8%99%9A%E6%8B%9F%E6%9C%BA-%E5%90%AF%E8%88%AA.md) 16 | - [S: 设计模式之工厂模式](https://github.com/Sailzjw/ARTS/blob/master/Share/201901W4/%E3%80%8A%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8B-%E5%90%AF%E8%88%AA.md) 17 | 18 | ### 201902W1: 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Partners/寒食君.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@寒食君](https://github.com/CasualJi) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/寒食君.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A: leetcode #1,#2](https://github.com/byte-stream/ARTS/blob/master/1.%20Algorithm/201901W4-%E5%AF%92%E9%A3%9F%E5%90%9B.md) 14 | 15 | - [R: 一名软件工程师的机器学习初体验](https://github.com/byte-stream/ARTS/blob/master/2.%20Review/201901W4-%E5%AF%92%E9%A3%9F%E5%90%9B.md) 16 | 17 | - [T: 谈一谈ThreadLocal](https://github.com/byte-stream/ARTS/blob/master/3.%20Tip/201901W4-%E5%AF%92%E9%A3%9F%E5%90%9B.md) 18 | 19 | - [S: 既生Java,何生Groovy?](https://github.com/byte-stream/ARTS/blob/master/4.%20Share/201901W4-%E5%AF%92%E9%A3%9F%E5%90%9B.md) 20 | 21 | ### 201902W1: 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Partners/落英坠露.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@落英坠露](https://github.com/isuperqiang) 4 | 5 | ## 自我介绍: 6 | 7 | [这里](../self-introduction/落英坠露.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201902W1: 12 | 13 | - [T: Windows工具软件](../Tip/201902W1/Windows工具软件-落英坠露.md) 14 | 15 | - [S:《深入理解计算机系统》之存储器层次结构](../Share/201902W1/《深入理解计算机系统》之存储器层次结构-落英坠露.md) 16 | 17 | 18 | ### 201901W4: 19 | 20 | - [A: leetcode #26, #5](../Algorithm/201901W4/201901W4-落英坠露.md) 21 | 22 | - [S:《深入理解计算机系统》之操作系统管理硬件](../Share/201901W4/《深入理解计算机系统》之操作系统管理硬件-落英坠露.md) 23 | 24 | ### 201902W4: 25 | 26 | - [R: 写出好代码的12步](../Review/201902W4/写出好代码的12步-落英坠露.md) 27 | 28 | - [T: Android图像绘制与渲染](../Tip/201902W4/Android图像绘制与渲染-落英坠露.md) 29 | 30 | ### 201902W5: 31 | 32 | - [R: Android开发者指南之性能提示](../Review/201902W5/Android开发者指南之性能提示-落英坠露.md) 33 | 34 | - [S:《见识--商业的本质和人生的智慧》之商业的本质](../Share/201902W5/《见识--商业的本质和人生的智慧》之商业的本质-落英坠露.md) 35 | 36 | ### 201903W1 37 | 38 | - [A: leetcode #189, #7](../Algorithm/201903W1/201903W1-落英坠露.md) 39 | 40 | - [S: Java开发手册之命名规约](../Share/201903W1/Java开发手册之命名规约-落英坠露.md) -------------------------------------------------------------------------------- /Partners/陈小渣.md: -------------------------------------------------------------------------------- 1 | # Partner: 2 | 3 | [@陈小渣](https://github.com/Q1173419450) 4 | 5 | ## 自我介绍: 6 | 7 | [陈小渣的自我介绍](../self-introduction/陈小渣.md) 8 | 9 | ## 汇总: 10 | 11 | ### 201901W4: 12 | 13 | - [A: leetcode #1, #7, #13, #14](https://github.com/Q1173419450/ARTS/blob/master/Algorithm/201901W4/201901W4-%E9%99%88%E5%B0%8F%E6%B8%A3.md) 14 | 15 | - [R: 外卖员工资超过一些白领](https://github.com/Q1173419450/ARTS/blob/master/Review/201901W4/%E5%A4%96%E5%8D%96%E5%91%98%E5%B7%A5%E8%B5%84%E8%B6%85%E8%BF%87%E4%B8%80%E4%BA%9B%E7%99%BD%E9%A2%86-%E9%99%88%E5%B0%8F%E6%B8%A3.md) 16 | 17 | - [T: 为什么使用JSON作为函数参数-陈小渣](https://github.com/Q1173419450/ARTS/blob/master/Tip/201901W4/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8JSON%E4%BD%9C%E4%B8%BA%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0-%E9%99%88%E5%B0%8F%E6%B8%A3.md) 18 | 19 | - [S: 百度的一些随想](https://github.com/Q1173419450/ARTS/blob/master/Share/201901W4/%E4%B8%8E%E7%99%BE%E5%BA%A6%E6%9C%89%E5%85%B3%E7%9A%84%E9%9A%8F%E6%83%B3-%E9%99%88%E5%B0%8F%E6%B8%A3.md) 20 | 21 | ### 201902W1: -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://images.unsplash.com/photo-1547156979-b57c6439f9d6?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1050&q=80) 2 | 3 | [![Build Status](https://travis-ci.org/byte-stream/ARTS.svg?branch=master)](https://travis-ci.org/byte-stream/ARTS) 4 | 5 | # ARTS 6 | 7 | ARTS来自于左耳朵耗子(陈皓)提出的一个观点:每周通过这四个指标来训练自己: 8 | 9 | ## 解释 10 | 11 | Algorithm:解决一道算法题 12 | 13 | Review:点评一篇英文文章 14 | 15 | Tips:学习一项技术技巧 16 | 17 | Share:分享一个观点或思考 18 | 19 | ## 愿景 20 | 21 | 我认为作为学生或初学者或者刚刚接触工作的人,时间比较富余,同时技术基础仍然薄弱,世界观组成依然单薄,而大部分人的自我规划能力有些弱,我们可能需要一种量化的、互相监督的形式来稳固提升。 22 | 23 | 我觉得左耳朵耗子的这个提议非常不错,作为一周的目标,工作量适中,易于完成。当然,这并不是说这对提升益处寥寥,要知道,坚持与习惯的力量是强大的。 24 | 25 | 每个人的实际情况也有所不同,考虑到这点,ARTS其实也是弹性的。就拿Algorithm和Review来说,难易程度、篇幅长短可以自由选择。 26 | 27 | 相信一件事,然后做下去,一段时间回首这里,我觉得大家都能有所收获。 28 | 29 | ## 成员 30 | 31 | 我们现在已有*23*位[成员](/Partners),欢迎加入我们,可通过以下方式联系到我。 32 | 33 | ## 汇总 34 | 35 | [第1周](/Weekly/201901W4.md) 36 | [第2周](/Weekly/201902W1.md) 37 | [第3周](/Weekly/201902W2.md) 38 | [第4周](/Weekly/201902W3.md) 39 | [第5周](/Weekly/201902W4.md) 40 | [第6周](/Weekly/201902W5.md) 41 | [第7周](/Weekly/201903W1.md) 42 | [第8周](/Weekly/201903W2.md) 43 | [第9周](/Weekly/201903W3.md) 44 | [第10周](/Weekly/201903W4.md) 45 | [第11周](/Weekly/201904W1.md) 46 | [第12周](/Weekly/201904W2.md) 47 | [第13周](/Weekly/201904W3.md) 48 | [第14周](/Weekly/201904W4.md) 49 | 50 | 51 | ## 联系 52 | 53 | 如果你有一些建议和想法,可以通过下面的途径找到我们: 54 | 55 | - 我的个人微信: 56 | 57 | ![](https://upload-images.jianshu.io/upload_images/5889935-f792790ff956f288.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 58 | 59 | - 微信公众号: 60 | 61 | ![](https://upload-images.jianshu.io/upload_images/5889935-5eae6ff81535ddd3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 62 | -------------------------------------------------------------------------------- /Review/201901W4/Light-Field-Rendering主要内容解析-yanglei094121.md: -------------------------------------------------------------------------------- 1 | @[TOC](Light Field Rendering主要内容解析) 2 | 3 | # Representation 4 | 我们使用一个发光点+一个给定方向来定义光场。 5 | 在自由空间里,五维光场表示可能可以减少到四维。 6 | 7 | 四维光场可以被理解为由有向线段组成的空间。五维空间表示法冗余是不必要的,原因如下:第一,冗余增加了整体数据的尺寸;第二,冗余使由取样重建光线函数变得复杂。在维度上的减少(指四维光场)简化了由luminaires建立的光线表述。在这篇论文的剩余部分,我们只讨论4维光场。 8 | 9 | 虽然限制自由空间的表达的有效性像是在限制,但接下来两种普遍情况是适用这种表达的。第一,很多几何模型是有界限的。在这种情况下,自由空间就是这个物体的凸壳外面的边界,因此,一个物体凸包外的所有视图都可以由一个4D光场产生;第二,如果我们在移动一个建筑模型或一个室外场景,我们通常是在移动一个自由空间区域;因此,可以生成该区域内的任何视图,以及该区域外的对象。 10 | 11 | 4D光场表示的主要问题是如何对定向光线的空间进行参数化。 12 | 参数化的选择存在几个问题: 13 | 14 | 计算高效。根据参数计算直线的位置应该是快速的。更重要的是,为了计算新视图,在给定查看转换和像素位置的情况下,应该很容易计算行参数; 15 | 16 | 控制光线的集合。所有直线的空间都是无限的,但只需要直线空间的一个有限子集。举个例子,在观察物体的情况下,我们只需要观察物体的凸包上的光线。因此,三维空间中的实际线与线参数之间应该有一种直观的联系。 17 | 18 | 均匀取样。在光线参数空间中给定等间距的样本,三维空间中的直线图形也应该是均匀的。从这个意义上说,均匀采样模式是指采样之间的间隔线数是恒定的。 19 | 20 | 牙痛要无法思考,下期继续把。 21 | 22 | -------------------------------------------------------------------------------- /Review/201901W4/个性化推荐系统的概述与样例实现-huzujun.md: -------------------------------------------------------------------------------- 1 | # 个性化推荐系统的概述与样例实现 2 | 3 | https://github.com/PaddlePaddle/book/blob/develop/05.recommender_system/README.md 4 | 5 | 6 | 7 | 种类: 8 | 9 | 1. 协同过滤推荐(Collaborative Filtering Recommendation) 该方法是应用最广泛的技术之一,**通过收集和分析用户的历史行为、活动和偏好推荐**。该方法的一个关键优势是它不依赖于机器去分析物品的内容特征,因此它无需理解物品本身也能够准确地推荐诸如电影之类的复杂物品;缺点是对于没有任何行为的新用户存在冷启动的问题,同时也存在用户与商品之间的交互数据不够多造成的稀疏问题。 10 | 2. 基于内容过滤推荐(Content-based Filtering Recommendation):该方法**利用商品的内容描述,抽象出有意义的特征,通过计算用户的兴趣和商品描述之间的相似度,来给用户做推荐**。优点是简单直接,不需要依据其他用户对商品的评价,而是通过商品属性进行商品相似度度量,从而推荐给用户所感兴趣商品的相似商品;缺点是对于没有任何行为的新用户同样存在冷启动的问题。 11 | 3. 组合推荐(Hybrid Recommendation):多种方法结合 12 | 13 | #### 融合推荐模型概览 14 | 15 | 在融合推荐模型的电影个性化推荐系统中: 16 | 17 | 1. 首先,使用用户特征和电影特征作为神经网络的输入,其中: 18 | - 用户特征融合了四个属性信息,分别是用户ID、性别、职业和年龄。 19 | - 电影特征融合了三个属性信息,分别是电影ID、电影类型ID和电影名称。 20 | 2. 对用户特征,将用户ID映射为维度大小为256的向量表示,输入全连接层,并对其他三个属性也做类似的处理。然后将四个属性的特征表示分别全连接并相加。 21 | 3. 对电影特征,将电影ID以类似用户ID的方式进行处理,电影类型ID以向量的形式直接输入全连接层,电影名称用文本卷积神经网络得到其定长向量表示。然后将三个属性的特征表示分别全连接并相加。 22 | 4. 得到用户和电影的向量表示后,计算二者的余弦相似度作为个性化推荐系统的打分。最后,用该相似度打分和用户真实打分的差异的平方作为该回归模型的损失函数。 23 | 24 | [![img](https://github.com/PaddlePaddle/book/raw/develop/05.recommender_system/image/rec_regression_network.png?raw=true)](https://github.com/PaddlePaddle/book/blob/develop/05.recommender_system/image/rec_regression_network.png?raw=true) 25 | 26 | ## 后记 27 | 28 | 读这篇文章的目的性倒很强,将为大学生服务外包竞赛中的项目实现一个推荐系统,不过比电影推荐要复杂一些。 -------------------------------------------------------------------------------- /Review/201901W4/中国出台措施保护并修复长江生态-puck.md: -------------------------------------------------------------------------------- 1 | # 原文 2 | China unveils action plan to protect, restore Yangtze River 3 | 4 | China has unveiled an action plan to protect and restore the Yangtze River as the country pushes forward environmental protection. 5 | Water quality of more than 85 percent of Yangtze River segments should reach Level III standard or above by the end of 2020, according to the plan released jointly by the Ministry of Ecology and Environment and National Development and Reform Commission. 6 | It also said more than 90 percent of "black and odorous" water bodies in cities at or above prefecture level in the Yangtze River economic belt should be eliminated by the end of 2020. 7 | Regions along the river in 11 provinces and municipalities are set as key areas, the plan said. 8 | It also listed eight major tasks on Yangtze River protection including strengthening industrial, agricultural and shipping pollution treatment, ensuring safety of drinking water source quality and cracking down on ecological destruction. 9 | The protection and renovation of the Yangtze River, the country's longest waterway, should combine water pollution treatment, water ecology restoration and water resources protection, the MEE said. 10 | China classifies water quality in major rivers and lakes into six levels, ranging from Level I, which is good enough to be used as the source of drinking water, to Level VI which is too polluted to be used even for farm irrigation. 11 | 12 | # 译文 13 | 中国出台措施保护并修复长江生态 14 | 15 | 为推进环境保护,中国出台保护和恢复长江的行动计划。 16 | 根据生态环境部(???)和国家发展改革委员会联合发布的计划,2020年结束之前,长江中超过85%河段的水质应该达到或超过III级标准。 17 | 该计划同时要求长江经济带的城乡中90%以上的黑臭水体都应当被清除。 18 | 计划中,长江途经的11个省及直辖市被设置为关键区域。 19 | 生态环境部表示,长江是我国最长的水道,长江的保护与整治应将水污染治理、水生态修复和水资源保护结合起来。 20 | 我国将主要的江河湖泊的水质划分为六个等级,从Ⅰ级(水质好可以作为饮用水源)到Ⅳ级(污染太过严重甚至不能用于农业灌溉)。 21 | -------------------------------------------------------------------------------- /Review/201901W4/中国餐饮业的发展趋势-启航.md: -------------------------------------------------------------------------------- 1 | ## 中国餐饮业的发展趋势 2 | 3 | [原文地址](https://www.chinadaily.com.cn/a/201901/26/WS5c4c79d5a3106c65c34e6aa6.html) 4 | 5 | ​ 在1月26日的北京,中国餐饮行业营收以4.27万亿元创造了一个最高纪录(大约6280亿美元),这个趋势真是令人鼓舞。 6 | 7 | ​ 根据国家统计局的数据发现,这个数字(4.27万亿元)相比上一年增长了9.5%,占了国内消费品零售总额的11.2%。 8 | 9 | ​ 中国酒店协会的会长韩明表示,在消费升级的推动下,该行业正在进入"以供应方改革为主题的创新和高质量发展的新时代"。 10 | 11 | ##### 绿色餐饮 12 | 13 | ​ 在2018年,绿色环保餐饮是中国餐饮业的一大亮点。 14 | 15 | ​ 2018年6月,中国政府提出一个促进环保餐饮的指导方针:到2022年,争取开设5000家环保餐饮厅,这个政策将使得餐厅每万元收入中厨房垃圾和能源消耗减少20%。 16 | 17 | ​ 这个准则要求提高了行业的门槛,并且建立了产业的友好评估系统,并减少了塑料袋的使用。 18 | 19 | ​ 中国各省市积极配合指导方针,将政策落实。在1月15 日,位于中国东部的江苏省餐饮公布了一套详细的绿色餐饮标准,内容包括安全,减少废物产生以及环境保护等。中国中部的江西省省会南昌,也鼓励餐厅更多的使用可回收电器来响应号召。 20 | 21 | ##### 新零售业务 22 | 23 | ​ 根据中国酒店协会的报道,受到电子商务和冷链物流快速发展的刺激,中国餐厅也迅速走出电子商务领域,进行了业务的创新,将在线销售和实体业务结合在一起。 24 | 25 | ​ 中国最大的海鲜火锅连锁店海底捞今年退出了一系列的即时自热火锅,该系列产品没报大概30元,并在jd上获得了99%的称赞。 26 | 27 | ​ 同时,丰富客人的用餐体验也是另一个产业的趋势,餐饮协会会长韩说,餐厅正在探索社交媒体有好的室内装潢,美食设计以及互动节目来迎合年轻人。 28 | 29 | ##### 智能技术 30 | 31 | ​ 中国餐馆正变得越来越智能,能够根据大数据制作的饿消费者肖像进行有针对性的营销, 他们还通过大数据有效地为新店选择网站,更新菜肴,优化供应链和运营管理,提高业务效率。 32 | 33 | ​ 在大数据的分下帮助下,自助餐厅正在从商业概念转变为现实。 34 | 35 | ​ 为了更好地服务于今年春节前15天的旅游热潮,最新的中国智能餐厅将于周一再山东青岛或者北站开业。根据科技日报报道,这件餐厅被认为是中国铁路系统中的首家餐厅,可以在26s内为顾客提供全餐。乘客可以通过点击餐厅中八台机器的屏幕进行订购,并通过扫描二维码进行支付。用餐时通过微波炉加热,总时间不会超过一分钟。 36 | 37 | ​ 餐厅内的八台机器可存放2000多个真空包装,缺货时将由员工即时补充。同时餐厅还配备了智能管理系统,可根据乘客的喜好进行大数据分析,以更好地满足他们的口味。 38 | -------------------------------------------------------------------------------- /Review/201901W4/如何成为一名杰出的开发者-YuanCome.md: -------------------------------------------------------------------------------- 1 | > 原文链接:[How does one become a great coder/programmer?](https://qr.ae/TUv8zR) 2 | 3 | Quora被称为美国版的知乎,作为第一篇 Review,我觉得这个问题很适合我们这群 coder。 4 | 5 | 答主从他几位朋友的例子,让我们了解了他认为优秀的coder应该是怎样的:他们总是在造轮子,每天都在 coding。 6 | 7 | 我们常常能在一些书店上看到那些表明 《XX天学会Java》、《XX天快速上手C++》等等的书籍,但是当我们实际了解了一门编程语言的时候就知道,所谓的快速上手,很大程度上只是让我们了解怎么写一些简单的Demo而已。 8 | 9 | 程序员就像作家,只不过我们写的是代码,他们写的是文字。但是共同点都是需要不断地练习、不断修正代码/文章,日积月累才逐渐成长起来。 10 | 11 | 很多时候我们总喜欢找捷径,总想快速成功。有人归咎于社会的浮躁,但是我想社会是整体的,但我们每个人都是独特的,如果总是随大流,大概很难成为一名优秀的Coder吧,毕竟我们的前辈在没有轮子的时候都是自己不断爆肝,肝出来的轮子。 12 | 13 | 有时候捷径其实就是每天进步一点点,踏踏实实走出来的。就像我们现在参加ARTS一样,参加很容易,坚持很难。 -------------------------------------------------------------------------------- /Review/201901W4/科技改变生活-波胖子.md: -------------------------------------------------------------------------------- 1 | > 原文链接:https://www.shanbay.com/news/articles/bcfrss 2 | 3 | ​ 科技改变生活,社会的繁荣与互联网技术的发展相辅相成,科技改变生活,很多低技能的工作逐渐被替代、淘汰。 4 | 5 | ​ 如今互联网看似是热门行业,但是前几年互联网兴起的投资红利已经逐渐消失,资本们也没有盲目去投资,今年冬天的寒冬有点冷,不光是互联网行业的寒冬,很多行业也面临着寒冬。接近年底接连传来了很多互联网企业裁员的消息,特别是对于我们初级程序员,在公司业务中核心能力需要提升,才能不至于被轻易的淘汰。 6 | 7 | ​ 资本是一个冰冷的市场元素,它只服从于经济规律——就是要自身增殖的最大化。而这其中,互联网行业高薪资不过是它实现增殖的手段,在这一过程中,降低成本——也就是选择廉价劳动力,自然成为资本存在的题中之意。 -------------------------------------------------------------------------------- /Review/201901W4/鬼步舞-Iris.md: -------------------------------------------------------------------------------- 1 | **看了一篇校长带学生们跳鬼舞步的推文,沪江英语上的,感觉做法可取吧,毕竟跳广播体操的话,大家的热情都不高,起不到锻炼身体的效果,不如选一种大家都感兴趣的舞蹈去跳** 2 | -------------------------------------------------------------------------------- /Review/201902W1/LFToolbox-yanglei094121.md: -------------------------------------------------------------------------------- 1 | #第二周 review
2 | LFToolbox封装了光场编程相关的一些函数,对matlab光场成像方面编程很有帮助。
3 | 第二周我翻译了一下LFToolbox04版本说明文档。翻译文档如下:
4 | https://blog.csdn.net/weixin_40758748/article/details/86671794 5 | -------------------------------------------------------------------------------- /Review/201902W1/Zara换了个logo-torreyxian.md: -------------------------------------------------------------------------------- 1 | Zara has unveiled a new, curvier logo - but not everyone is a fan.The fast-fashion retailer recently revealed the updated logo, which replaced its former easily-recognised logo, on its website and social media accounts.Unfortunately, consumers are less-than-impressed with the new branding, designed by the Baron & amp; Baron agency - as the letters are quite cramped.In addition to overlapping all of the letters, a curve has been added to the bottom of the Z and the R, making for text slightly difficult to read.The style is also not unique - as HypeBeast pointed out it is the signature typography of artistic director and Baron & amp; Baron founder Fabien Baron. People mocked the brand's latest appearance - and questioned who approved the crowded design."Whoever is responsible for the new Zara logo, I just want to talk." one person wrote.Another said:" This new Zara logo is wrong in so many aspects that it's hard to synthesise in one tweet. Nonsense kerning, absurd letter spacing, lack of uniqueness." Designer Erik Spiekermann also expressed his distaste for the new logo."That is the worst piece of type I've seen in years," he tweeted. "Was this done by one of those new robots that will replace humans?" 2 | 3 | Zara 换了一个新的,有曲线的标志 - 但不是每个人都喜欢。这家快时尚零售商最近在其网站和社交媒体账户上发布了更新的标志,取代了之前易于识别的标志。不幸的是,消费者对 Baron& 设计的标志不是很满意-因为这些非常难辨。除了重叠所有字母外,还在 Z 和 R 的底部添加了一条曲线,让整个标志更看不清。新的风格也不独特 - HypeBeast 指出它是艺术总监及 Baron&Baron 创始人 Fabien Baron 的标志性排版。人们嘲笑该品牌的最新标志 - 并质疑谁批准了这种设计。有人说 "无论谁负责新的 Zara 标志,我只想和他谈谈。" 还有人说“这个新的 Zara 标志在很多方面都很怪,很难在一条推文中总结出来。无意义的字距,荒谬的字母间距,缺乏独特性。” 设计师 Erik Spiekermann 表示不是很喜欢这个新标志。 4 | -------------------------------------------------------------------------------- /Review/201902W1/不要现场编程-yu.md: -------------------------------------------------------------------------------- 1 | ## 不要现场编程 2 | 3 | > 这是一篇翻译文稿,[原文地址](https://inconshreveable.com/11-13-2015/your-live-coding-demo-is-boring/):https://inconshreveable.com/11-13-2015/your-live-coding-demo-is-boring/ 4 | 5 | **1**. 译文 6 | 7 | 在过去一年里我参加了各种各样的会议,从中得出一点看法:不要现场编程,那真的很无聊。 8 | 9 | 无论你编程多么厉害,现场编程真的不是一项观赏性运动。我思考的速度绝对比你打字的速度要快。一边写代码一边演讲并不能够相得益彰,你的代码很有可能会出现各种错误,语法、配置、命令行等等。你不得不停止演讲,花时间去调试你的代码,这会造成大量的停顿,观众只能去低头玩手机。现场编码经常状况百出,以至于当他们没有异常时我会感到很惊讶。 10 | 11 | 我并不是说永远不能在台上展示代码,你可以的。只不过无论如何,麻烦都事先把代码放到演示文档上,然后讲解它——不要现场临时编写。实时编码是一种偷懒行为,它是编写高质量演示材料的捷径。如果你把代码放在精心准备好的幻灯片上,你的代码可以被放大到我足以看清它们。你也可以将某一部分高亮,以便适当地引导我的注意力。 12 | 13 | 如果你想增加点互动性,可以使用视频的形式。你可以跟我解释视频中正在播放的内容来引导我发生兴趣。视频可以被剪辑、高亮、快进,你可以以任意方式让他它符合你的演讲风格,这绝对有效。 14 | 15 | 这同样适用于CLI工具的演示或者其他严重依赖于键盘输入的东西。为了更好的演示效果,尽量少使用现场编demo吧。 16 | 17 | (译文完) 18 | 19 | **2**. 感受 20 | 21 | 做任何事情之前一定要提前做好准备,不要太高看自己的临场发挥能力。将成果演示给别人看的时候,一定要注意效率,不能用一些重复和东拼西凑的内容,浪费别人的时间。 22 | 23 | 每个人都想珍惜自己的时间,尤其是当别人在浪费他们的时间的时候。本文只是从现场演示代码的层面来讲述,不要让过多现场错误,干扰观众的注意力。一定要事先开始准备,尽量少出现调试和错误。罗永浩开发布会的时候会经常出现这样的情况,可能是对自己的演讲水平很有信心吧。 24 | 25 | 不仅是公开演讲,给其他人看的任何信息都应该是流畅且有信息密度的,时刻有新的信息产生,时刻有有意思的内容来吸引别人的注意。自我陶醉和自我否定都是极大的陷阱。 26 | 27 | 作为观众,还是应该大度一点,尤其是别人免费提供演讲和服务的时候。 -------------------------------------------------------------------------------- /Review/201902W1/写给程序员读的童话书-寒食君.md: -------------------------------------------------------------------------------- 1 | 上周yu同学分享了一篇关于《什么是真正的程序员》的[读后感](https://github.com/byte-stream/ARTS/blob/master/Share/201901W4/%E3%80%8A%E4%BB%80%E4%B9%88%E6%98%AF%E7%9C%9F%E6%AD%A3%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98%E3%80%8B%E6%9C%89%E6%84%9F-yu.md),巧合的是,他读的那篇译文,正好是我最近认识的一位朋友在几年前翻译的。 2 | 3 | 看了yu的随笔,我对这篇文章产生了兴趣,于是找来原文和译文都读了一遍。 4 | 5 | 原文:https://ferd.ca/the-little-printf.html 6 | 7 | 作者模仿《小王子》的风格,叙述了小printf想学编程,在请教各种不同身份的开发者时的所见所闻,围绕“什么是真正的程序员”这个问题展开思考,富有深意。 8 | 9 | 本想全文重新翻译一遍,但由于时间关系,只翻译了第一章,后面部分沿用了削微寒的版本,并将标题拟为[《写给程序员的童话书》](https://mp.weixin.qq.com/s?__biz=MzUxNzE2NDg5Ng==&mid=2247484734&idx=1&sn=7f9c625e55ee6931096f3f0575ccc6c1&chksm=f99d1f31ceea9627479ffc4971ce80aecec47b37f761a330b8d3e830268e70ff33066c3a47ee&token=173415348&lang=zh_CN#rd) 10 | 11 | 下面我想从小printf遇到的不同角色,展开相应的思考。 12 | 13 | ### 骄傲的高级程序员 14 | 15 | 有这么一类高级程序员,他们自我感觉良好,自诩为领域专家。客观来讲,假如单兵作战,他们应该技术不错。但是由于傲慢和自我,在团队合作时,往往会过高地评定自身的价值,或者通过贬低合作者的技术方案来彰显自身的高度,维护优越感。 16 | 17 | 在现实生活中,其实也存在这样一类人,比如开口必谈分布式、高并发,而不考虑实际情况是否需要。在他们眼中,这不重要,只有为系统引入更多的复杂度,才能让小白或初学者看不懂,显示自己的水平。 18 | 19 | 面对小白的求助,也十分吝惜自己的时间,这点见仁见智,因为无条件地帮助别人有时确实只会损己利人。但是呢,如果能直接拒绝也就罢了,这些高级程序员既不想帮助你,也不想放弃这展示自己的机会。于是,充当起人生导师,给你灌输一些形而上的东西,犹如孔乙己在咸亨酒家柜台前满口“之乎者也”,叫人半懂不懂的。 20 | 21 | 22 | 23 | ### 闷骚的程序员 24 | 25 | 有些闷骚的程序员,你夸奖他技术高,他客套起来了,“哪里哪里,我还很垃圾。”事实上,他确实离专家还有一段距离。但是呢,相较于初学者,他的技术水平还是可圈可点的,于是他又想得到你的称赞。这就形成了一个闷骚的闭环。 26 | 27 | 这些处于中等水平的程序员,有一种自我矛盾的存在。有些喜欢轻易去评头论足他人的项目,但是还没有能力提出什么建设性的指导。在网络的伪装下,他们的精神段位达到了顶峰。孟子曰:人之忌,在好为人师。这种通病,除了在网络世界中屡试不爽,现实世界中也是有迹可循,甚至变本加厉。 28 | 29 | ### 忙碌的悲观主义者 30 | 31 | 32 | ### 新框架的盲目追求者 33 | 34 | 35 | ### 拒绝合作的人 36 | 37 | ### 迷信经验的人 38 | 39 | 40 | 41 | 写了一半,准备整理思绪,单独成文。 42 | 43 | -------------------------------------------------------------------------------- /Review/201902W2/LFToolbox官方文档-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第三周 Review 2 | **更新LFToolbox官方文档4-5节。**
3 | **见下面csdn博客:**
4 | https://blog.csdn.net/weixin_40758748/article/details/86671794 5 | -------------------------------------------------------------------------------- /Review/201902W3/light-field-rendering-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第四周 Review 2 | ## Light Field Rendering 自我理解 3 | 整理于CSDN,地址https://blog.csdn.net/weixin_40758748/article/details/86619279 -------------------------------------------------------------------------------- /Review/201902W3/教育部禁止教师用QQ或微信布置作业-陈小渣.md: -------------------------------------------------------------------------------- 1 | ### 1、第二篇翻译 2 | 3 | #### No more homework on smartphones: Ministry of Education(教育部将禁止教师通过微信或QQ布置作业) 4 | 5 | > 原文地址 6 | 7 | https://www.shanbay.com/news/articles/lydgx 8 | 9 | > 翻译 10 | 11 | **用时:** 12 | 13 | ``` 14 | 教育部明确提出小学老师不允许通过微信、QQ或其他即时通讯工具布置作业,媒体报道此消息引发热议。 15 | 16 | 在教育部网站上一名政党建议者,这样回复道,教育部反复强调教育和布置作业,不应该执行依靠电子设备。教师们不应该给只能由家长完成的家庭作业,也不应该要求家长给作业打分 17 | 18 | 教育部在回应中表示:“在将来,教育部将会明确规定小学老师不允许布置作业通过微信或者QQ...使父母负重的也是一样的。” 19 | 20 | 公告在2018的十月在教育部官网上贴出,但没有受到关注,直到在星期五的《中国青年日报》再次被提出。 21 | 22 | 这份报告很快在网民中引起了意见分歧。一些人对此表示欢迎,因为它减轻了来自父母的巨大压力,并保护了孩子的眼睛,因为父母希望限制孩子在电子设备上的时间。 23 | 24 | 在微博,一名叫做“baoxiopa”的网友说:“孩子应该将用更少的注意力和责任心因为他们不需要每天记下作业,他们可以在他们父母的手机中找到它。”。另一个网友为“东北小猪仔”抱怨道一些作业太难了还有明确提出需要他们父母帮忙完成。 25 | 26 | 网友AmoteTianxiaoguai说,孩子们的视力变得越来越差因为几乎她知道的每个孩子都是在手机上收到(做)他们的家庭作业。 27 | 28 | 但另一些人则反对这些规定,因为他们享受着科技带来的便利。“Ccmysunshine”说:“不要反应过激。不把作业交给父母是对的,但用科技简单地布置作业有什么错呢?” 29 | ``` -------------------------------------------------------------------------------- /Review/201902W3/软件工程与编程的不同-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## Software Engineering is different from Programming 2 | 3 | 原文地址: https://edgecoders.com/software-engineering-is-different-from-programming-b108c135af26 4 | 5 | 6 | 7 | 本文主要围绕一句话来讲 8 | 9 | > `All software engineers can program , but not all programmers can engineer software` 10 | 11 | 作者认为了解如何编程并不能成为真正的软件工程师,并使用了一些类比,比如在学校中学习写作或数字,并不能成为作家或者数学家。 12 | 13 | 并从几个方面来讲软件工程师与普通编程人员的不同 14 | 15 | - 解决问题的心态 16 | - 代码质量 17 | - 成本与效率 18 | - 软件的可靠性,安全性 19 | - 对工具的使用 20 | 21 | 最后渣翻一下最后一段 22 | 23 | ``` 24 | 没有人可以在两个月,六年甚至一年内学习软件工程。您不会在训练营中学习成为软件工程师。我已经学习了20多年,今天我还在学习。只有在经过大约十年的学习以及设计,构建和维护成千上万用户使用的应用程序之后,我才有足够的信心称自己为经验丰富的程序员。 25 | 26 | 软件工程并不适合每个人,但每个人都应该学会用计算机来解决自己的问题。如果你可以学习编写简单的程序,你应该。如果您可以学习如何使用通用软件服务。如果您可以学习使用开源软件,那么您将拥有很多能力。 27 | 28 | 问题在发展,软件工程也应如此。该专业的未来是使普通计算机用户能够使用他们的计算机而无需学习五年。通过使用简单的工具,用户可以自行解决简单的问题。然后,软件工程师将继续创建更好的工具,解决更大的已知问题,并尽最大努力防止未知问题。 29 | ``` 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Review/201902W4/2019年浏览器的现状-寒食君.md: -------------------------------------------------------------------------------- 1 | # 一名软件工程师的机器学习初体验 2 | 3 | 4 | **本文为翻译,暂时只翻译了第一部分** 5 | 6 | **原文地址: https://ferdychristant.com/the-state-of-web-browsers-88224d55b4e6 7 | 8 | ## 2019年的浏览器现状 9 | 10 | 两天前,一则关于微软将放弃自研的EdgeHTML引擎,而采用Chromium的新闻触动了我,我就[浏览器的现状](https://github.com/xitu/gold-miner/blob/master/TODO1/the-state-of-web-browsers.md)发表了一篇喜忧参半的文章。可以盖棺定论的是,将Chromium 结合Safari的 webkit作为浏览器引擎是十分高效的。对这种趋势的唯一阻力来自于Mozilla,但是却鲜有强有力的盟友来和它一起抵抗这种发展方向。 11 | 12 | 13 | 那篇文章引起了读者关注,也得到了大量的反馈。人们普遍认为文章阐述的是令人沮丧的事实。 14 | 15 | 评论认为文章的一些观点不假,但过于宽泛,缺乏细节和差别。我同意这些看法,一些观点可以措辞更加精准,但是这将使文章的篇幅扩大一倍,而且很多细节对我想要表达的最终结论无关紧要。举个例子,这篇文章被浏览了数十万次,其中只有四分之一的人真正用心阅读。这显然与长度有关,我猜测很多读者在读到一半时就已经不耐烦了,于是他们放弃了,既节省了自己的时间,又不至于被影响心情。 16 | 17 | 只有少数评论了这真实且残酷的交付方式,其中大多数似乎很赞同。而有一些则不那么认为,这将伴随而来有关商业势力的问题。我能说的就是我不会唱衰它,那天我心情真的很不错。我真诚地认为,科技主导着世界,我们不需要无脑批判,也不需要甜言蜜语般的建议。此外,我是荷兰人,这是我们一致的心声。 18 | 19 | 回过头来说,我为什么要写第二篇文章?我想谈谈之前那篇文章令人沮丧的部分。如果你有勇气读完它,你可能得到一个不如人意的结论。你可能会觉得网络是失败的,开放的网络处于极大的危险之中,我们又好像回到了使用IE的中世纪。如果你关心网络,需要带着最乐观的心去阅读,否则它会破坏你一天的心情。 20 | 21 | 我无法改变Chromium/Webkit垄断式的统治之路,这段令人怀疑的历史无法被抹除。我们可以将诉诸法律,但是那些浏览器已经真真切切地被安装且不会被卸载,这已是既成事实。 22 | 23 | 在本文中,我们将接受Chromium 支配网络的现状,然后展望未来。去探索Chromium 的垄断对用户、开发者和开放网络来说意味着什么。剧透一下,我们有足够的理由对当前情形保持乐观和兴奋,即使这种现状不是以公平的方式出现的。 -------------------------------------------------------------------------------- /Review/201902W4/Java-for-Python-Programmers-ZmJ.md: -------------------------------------------------------------------------------- 1 | ### Java for Python Programmers 2 | 3 | [原文地址](http://interactivepython.org/runestone/static/java4python/index.html) 4 | 5 | 这周同事推荐了这篇文章,因为是站在Python的角度看Java,大概就是讲了下Java 与 Python 中一些语法的不同实现,虽然是全英文的,但是大部分内容看代码就能理解意思。 6 | 7 | 看完这篇文章,大概了解一下Java 中一些基础语法的使用,通过与Python的语法做比较,可能会印象深刻写,也更好理解。不过如果要学习Java还需要系统的学习,这些文章讲的东西太基础。如果是英语不好的人,还是不要点开比较好,有点浪费时间了,能一句句看的懂的,感觉尝试看看还行,花一个小时过一遍Java最基础的语法。 8 | 9 | -------------------------------------------------------------------------------- /Review/201902W4/light-field-rendering-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第五周 Review 2 | ## Light Field Rendering 自我理解 3 | 更新于CSDN,地址https://blog.csdn.net/weixin_40758748/article/details/86619279 4 | 5 | -------------------------------------------------------------------------------- /Review/201902W5/AWS-IAM简易介绍-lingyunG.md: -------------------------------------------------------------------------------- 1 | ### AWS Identity and Access Management 简易介绍 2 | 3 | **原文地址:[AWS IAM doucument](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)** 4 | 5 | AWS 服务的文档都是比较长的,我先把简易操作写下来,记录下自己学习的过程。后续真的需要用到某个细节的时候还需要细细看一遍文档。 6 | 7 | ----- 8 | 9 | AWS Identity and Access Management(“IAM”), 在我看来就是类似于windows系统中用户管理权限,只是把这一套东西放到了云上,但是道理我其实觉得是相通的。 在刚开始学着用IAM的时候看文档觉得很痛苦,不知道该怎么去使用。不懂的东西多看几遍, 10 | 然后再跟着操作步骤去练习,慢慢地也学会使用了。接下来我就介绍一下IAM的涉及到的名字和使用场景。 11 | 12 | 13 | #### 1.IAM 使用到的名词 14 | 15 | 在IAM 服务中, 我们可以创建用户,组,角色,策略。 这里提到的策略就是权限管理,是一个json文件,在这个文件中可以定义这个用户可以访问什么服务,以及可以做什么操作(比如删除,读取文件等)。新建的用户默认是所有服务都无法访问,只有将策略赋到用户或者组之后,该用户和组才能被赋予访问某些资源的权限。 16 | 17 | #### 2. IAM 的使用场景 18 | 19 | IAM 一般会与其它AWS 服务一起使用。比如可以用于EC2,lambda之类的服务。 20 | 21 | #### 3. 动手实验 22 | 23 | 光看文档是很容易走神的,动手的时候会慢慢理解文档中讲到的原理。 AWS 也有免费套餐,我在复习的过程中碰到了一个很好的实验室,爱去蹭免费资源,如果你也恰好在学习AWS并想动手操作一下,可以去到[实验室](https://run.qwiklabs.com/),注册一下,在搜索框中输入你想要学习的服务即可,不过不是所以的实验都可以免费尝试的。 -------------------------------------------------------------------------------- /Review/201902W5/Information-flow-reveals-prediction-limits-in-online(2)-乌守元.md: -------------------------------------------------------------------------------- 1 | 该系列是阅读/翻译 nature 上的论文[《Information flow reveals prediction limits in online social activity》](https://doi.org/10.1038/s41562-018-0510-5)的记录,每周将不定量翻译,也欢迎大家提出建议。 2 | 3 | 今天分享的是该文正文第一段。 4 | 5 | The flow of information in online social platforms is now a significant factor in protest movements, national elections, and rumour and misinformation campaigns. The study of social contagion, for example, is predicated on the flow of information over social ties and has benefited greatly from the availability of massive online social data sets and platforms on which to perform observational and experimental studies. Data collected from online social platforms are a boon for researchers, but are also a source of concern for privacy, as the social flow of predictive information can reveal details on both users and non-users of the platform. Measuring information flow is challenging, in part because of the complexity of natural language and in part because of the difficulty in defining a quantitative and objective measure of information. Owing to these challenges, proxies are often studied instead: structural proxies focus on network characteristics, such as the movements of keywords or adoptions of behaviours. Temporal proxies attempt to quantify the information contained in the timings of user activity, as temporal relationships between user activity are known to reflect underlying coordination patterns. 6 | 7 | 在线社交平台上的信息流动目前在抗议运动、全国大选、谣言和误报运动中是非常重要的一个因素。例如,社会传染的研究是基于社会关系的信息流动,并且从大规模在线社会数据集和平台的可用性中获益,这些数据集和平台可用于进行观察和实验研究。从在线社交平台收集的数据对研究人员来说是一个福音,但也是隐私关注的来源,因为预测信息的社交流可以揭示平台的用户和非用户的详细信息。衡量信息流是具有挑战性的,部分原因是自然语言的复杂性,部分原因是难以确定定量和客观的信息衡量标准。为了应对这些挑战,作为替代通常会研究代理:结构代理关注网络特征,例如关键字的移动或行为的采用。 时间代理尝试量化用户活动时间中包含的信息,因为已知用户活动之间的时间关系反映了潜在的协调模式。 8 | 9 | 说明研究背景,数据的效度,研究难度等等。其实就是为了说明我这个实验很难的、很有意义的。 10 | 11 | -------------------------------------------------------------------------------- /Review/201902W5/《小偷家族》观后感-ZmJ.md: -------------------------------------------------------------------------------- 1 | 最近看了一部半年前上映的日本电影《小偷家族》,豆瓣评分8.7,之前大火的时候,在知乎上看过几篇文章,讲述了里面的人物关系,当时没看过影片的我,感觉很混乱,不过在我看完电影本身,再去看人物关系的时候,有种豁然开朗的感觉,一群没有血缘关系的人,却产生了比亲人更温暖的感情。影片中有好几个情节 ,'小店爷爷'的睁只眼闭只眼,'父亲'渴望做爸爸,'小女孩'在两个家庭前后的对比,'儿子'善意的谎言,'母亲'担下所有罪等,让人感到这个家庭的温馨而又为他们每个人感到悲哀。 2 | 3 | -------------------------------------------------------------------------------- /Review/201903W1/light-field-rendering-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第五周 Review 2 | ## Light Field Rendering 自我理解 3 | 更新完毕
4 | 1996年Levoy等人对全光函数进一步简化,提出了光场的双平面参数化表示用以描述静态和可见光谱的全光函数,并给出了光场渲染成像公式。
5 | 更新于CSDN,地址https://blog.csdn.net/weixin_40758748/article/details/86619279 6 | 7 | -------------------------------------------------------------------------------- /Review/201903W1/什么是敏捷开发-lingyunG.md: -------------------------------------------------------------------------------- 1 | ###前言 2 | 上周读了Robert C.Martin写的名字叫《敏捷软件开发原则、模式与实践》这本书的前五章,边看边想了一下自己平时在项目组的工作和书中所讲的敏捷开发的原则和价值观,发现自己很多不足的地方,我会在以后的工作中改进。这次写的tips我打算分享一下第一章和自己的思考。第一章主要是介绍了什么是敏捷实践,敏捷联盟宣言和敏捷实践的原则。 3 | 4 | ###敏捷联盟宣言 5 | ####宣言的内容 6 | >1.个体和交互胜过过程和工具 7 | 8 | >2.可以工作的软件胜过面面俱到的文件 9 | 10 | >3.客户合作胜过合同谈判 11 | 12 | >4.响应变化胜过遵循计划 13 | 14 | ####敏捷实践的原则 15 | >1.通过尽早的,持续的交付有价值的软件来是客户满意 16 | 17 | >2.即使到了开发后期,也欢迎改变需求 18 | 19 | >3.经常地交付可以工作的软件,时间间隔越短越好 20 | 21 | >4.项目开发期间,业务人员和开发人员必须紧密合作 22 | 23 | >5.围绕被激励起来的个人构建项目,给他们提供环境和支持,信任他们的工作 24 | 25 | >6.在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈 26 | 27 | >7.工作的软件是首要的进度度量标准 28 | 29 | >8.敏捷过程提倡可持续的开发速度,责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度 30 | 31 | >9.不断的关注优秀的技能和好的设计会增强敏捷能力 32 | 33 | >10.简单-使未完成的工作最大化的艺术-是根本的。 34 | 35 | >11.最好的架构、需求和设计出自于自组织的团队 36 | 37 | >12.每隔一定时间,团队会在如何才能有效地工作方面进行反省,然后相应的对自己的行为进行调整。 38 | 39 | ####对比上面的原则,团队和自身存在的问题 40 | 1. 团队开发人员不喜欢会议,也不喜欢在会议上发表自己的看法。我自己也是存在这样的问题,不爱在众人面前发言,从另外一个方面也反 41 | 出自己平时缺乏对自己工作和自己所在团队的思考,这方面是自己要改正的。 42 | 2. 团队里有些成员埋头于自己的任务中,不爱承担自己任务之外的一些责任。基于在与人交谈和最近对工作的一些感悟之上,我明白这是一个 43 | 很不好的习惯。无论是在什么场合,都得明白逐渐扩大自己影响力的重要性。多承担一些,让别人在第一时间能够想起自己对自己的职业生涯有 44 | 很大的益处。这意味着你的工作和能力逐渐得到别人的认可。 45 | 3. 现在团队因为缺人,没有QA,都是开发自己测,精力有点跟不上,每个人都觉得很累。这个还没有想到什么比较好的办法去改进。 46 | 47 | -------------------------------------------------------------------------------- /Review/201903W2/Information-flow-reveals-prediction-limits-in-online(4)-乌守元.md: -------------------------------------------------------------------------------- 1 | 该系列是阅读/翻译 nature 上的论文[《Information flow reveals prediction limits in online social activity》](https://doi.org/10.1038/s41562-018-0510-5)的记录,每周将不定量翻译,也欢迎大家提出建议。 2 | 3 | In this work, we applied information-theoretic estimators to study information and information flow in a collection of Twitter user activities. These estimators fully incorporate language data while also accounting for the temporal ordering of user activities. We found that meaningful predictive information about individuals is encoded in their social ties, allowing us to determine fundamental limits of social predictability, independent of actual predictive or machine learning methods. We explored the roles of information recency and social activity patterns, as well as structural network properties such as information homophily between individuals. 4 | 5 | 在这次工作中,我们应用信息理论估计来研究一组 Twitter 用户活动中的信息和信息流。这些估计完全包含语言数据,同时还考虑了用户活动的时间顺序。我们发现有关个人的有意义的预测信息被编码在他们的社会关系中,使我们能够确定社会可预测性的基本限制,而独立于实际的预测或机器学习方法。 我们探讨了信息新近度和社交活动模式的作用,以及结构网络属性,例如个体之间的信息同质性。 6 | 7 | We gathered a data set of n = 13,905 users, comprising egocentric networks from the Twitter social media platform, and a total of m = 30,852,700 public postings from these users. Each of the n = 927 ego-networks consisted of one user (the ego) and their 15 most frequently mentioned Twitter contacts (the alters), providing us with ego–alter pairs on which to measure information flow. See‘Data collection and filtering’ in the Methods section for full details on the data processing. 8 | 9 | 我们收集了 n = 13,905 个用户的数据集,包括来自 Twitter 社交媒体平台的自我中心网络,以及来自这些用户的总共 m = 30,852,700 个公开帖子。每个 n = 927 个自我网络由一个用户(自我)和他们最常提到的15个 Twitter联系人 (改变者)组成,为我们测量信息流提供自我-改变者对。 有关数据处理的完整详细信息,请参阅“方法”部分中的“数据收集和过滤”。 10 | 11 | -------------------------------------------------------------------------------- /Review/201903W2/Lytro-in-Matlab-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第八周 Review 2 | ## Lytro In Matlab 3 | 4 | 这篇文章告诉你如何使用Matlab的Lytro相机拍摄的图片。Lytro图像被称为“光场图像”或者动态图像,但不管它们告诉你什么;这只是一幅由数字传感器前的“微透镜阵列”拍摄的普通图像。听起来容易吗?它是很容易的。
5 | 6 | 更新于CSDN,地址https://blog.csdn.net/weixin_40758748/article/details/87915926 7 | 8 | -------------------------------------------------------------------------------- /Review/201903W2/敏捷设计&&SRP&&OCP原则-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 这周进行第七、八、九章的阅读,这几章介绍什么是敏捷设计,以及引起软件腐化的原因,随后介绍在开发过程中应该遵循的两个原则:单一职责原则(SRP),开放-封闭原则(OCP)。 3 | 4 | 敏捷设计 5 | 在软件设计初始阶段,系统设计总是很清晰,但随着需求不断改变,功能需要不断增加,系统会变得越来越复杂,这时设计就逐渐变得腐化,系统开始变得难以扩展,难以维护。软件开始散发出腐化的气味。 6 | 7 | 1 软件腐化的气味 8 | 1) 僵化性 : 指的是很难对系统进行改动,每个小改动都意味着要更改系统其它更多的地方。 9 | 10 | 2)脆弱性:指的是对系统的一个地方进行改动,引起了其它地方出现了错误。 11 | 12 | 3)牢固性:指的是设计中包含了对其他系统有用的部分,但是要把这些部分从系统中出来所需要的努力和风险是巨大的。 13 | 14 | 4)粘滞性:粘滞性分为两种表现形式,软件的粘滞性和环境的粘滞性。开发人员在面临一个改动的多种方案中,发现那些保持软件设计的改动方法比破坏设计的方法更难用,此时软件设计具有很高的粘滞性。当开发环境迟钝或者低效时候就会产生环境的粘滞性。 15 | 16 | 5)不必要的复杂性:设计中包含没有用的组成部分。 17 | 18 | 6)不必要的重复:系统中有很多重复的代码。 19 | 20 | 7)晦涩性:指软件模块难以理解。 21 | 22 | 随着时间的推移,软件会逐渐腐化,为了尽量保持好的设计,我们在开发过程中就需要遵循一些原则。 23 | 24 | 单一职责原则 25 | 对于一个类来说,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合到了一起,这样的设计会引起软件的僵化性和脆弱性。因此,我们在开发过程中,需要把相同职责的功能都写到同一个类里面。 26 | 27 | 开放—封闭原则 28 | 1 描述 29 | 1.1 “对于扩展是开放的”。这意味着模块的行为是可以扩展的,当应用的需求改变时候,我们可以对模块进行扩展,使其具有满足那些改变的新行为。 30 | 31 | 1.2 “对于更改是封闭的”。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。 32 | 33 | 2 关键是抽象 34 | 合适的抽象可以使软件设计满足这个原则。 35 | 36 | 总结 37 | 学习敏捷设计和敏捷设计该遵循的原则可以使我思考现有项目中存在的问题和应该采取什么样的措施去改进设计。 38 | 39 | -------------------------------------------------------------------------------- /Review/201903W3/敏捷设计LSP&&DIP&&ISP原则-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 上次阅读学习敏捷设计原则中的单一职责原则(SRP)和开放-封闭原则(OCP)原则,这周的阅读任务是学习 3 | 4 | Liskov 替换原则,依赖倒置原则,接口隔离原则。 5 | 6 | 一 Liskov替换原则 7 | 1 Liskov的解释 8 | 子类型必须能够替换掉它们的基类型。毫无疑问,在用子类传入到调用父类的方法时候,不能导致这个方法出现错误。如果出现错误,便需要检查子类和父类之间的设计是否合理,是否这两者之间需要存在继承的关系,是不是可以从两者之间提取公共部分作为这两者的共同父类。 9 | 10 | 二 依赖倒置原则 11 | 1 依赖倒置原则的解释 12 | a)高层模块不应该依赖于低层模块。二者都应该依赖于抽象。 13 | 14 | b)抽象不应该依赖于细节。细节应该依赖于抽象。 15 | 16 | 在层次化的设计架构中,高层模块调用低层模块,当底层模块发生改动,高层模块也得作相应的改变。解决办法是每个较高层次都为它所需要的服务声明一个抽象接口,较低的层次实现了这些抽象接口,每个高层类都通过该抽象接口使用下一层。 17 | 18 | 三 接口隔离原则 19 | 1 接口隔离原则的解释 20 | 不应该强迫客户依赖于它们不用的方法。当一个接口有两组方法被两个客户使用,而且客户之间使用的方法没有重叠,则需要把这个接口拆分,不应该合在一起。 21 | 22 | 四 小结 23 | 这三个原则在工作中一不小心就会违反了。仍然需要找一些例子来加深印象。 24 | 25 | -------------------------------------------------------------------------------- /Review/201903W4/《黑客与画家》读后感-starichat.md: -------------------------------------------------------------------------------- 1 | 2 | > 硅谷创业之父 Paul Graham 的文集,全书大致是围绕三个主题:黑客精神,创业,编程语言。这是一本为书呆子正名,为程序员正名的书。本书尝试解释计算机世界发生的实际情况。书中内容不够深奥,不仅仅是给程序员和创业者的,也是写给普通读者的。作者最大的目的就是,通过本书让普通读者理解我们所处的这个计算机世界。 3 | 4 | 全文可查看[荐书|《黑客与画家》](https://mp.weixin.qq.com/s?src=11×tamp=1554030739&ver=1518&signature=m6kh34EvpI9o66I6qAYzHY4TpGjp2*S9mJATFbPhtdAWVHShYfbRUPAoKT1qKxU9HJSA75RX0RvlCLd6ROBiGxnv2E2bNkxUFmIhxYOnntGLeHeZ0DVKy38b5mgvmpnQ&new=1) -------------------------------------------------------------------------------- /Review/201904W1/HowToScaleWebApp-lingyunG.md: -------------------------------------------------------------------------------- 1 | 这周阅读了一篇[文章](https://arcentry.com/blog/scaling-webapps-for-newbs-and-non-techies/),文章给非技术人员生动有趣地讲解了Web服务该如何随着用户量的不断增加而扩展系统,提到了许多平时听到过的名词但是没有在项目中用到的名词。比如“Reverse proxy”,"Load Balancer"等。 2 | 3 | Web服务发展可以分为以下几个步骤: 4 | 1 A single server + database 5 | 2 Adding a Reverse Proxy/Load Balancer 6 | 3 Growing you Database 7 | 4 使用微服务架构拆解系统 8 | 5 使用Caching && CDN 使系统更高效 9 | 7 采用Message Queues服务 10 | 8 分区,将不同来源的请求分发到不同的区域处理,每个区域里面的服务也都是完整的 11 | 9 引用DNS域名服务器 12 | 13 | 在讲完上述步骤之后,作者提到云服务是解决上述所有问题的方案,但是这也并不意味这云服务就一点问题都没有。 -------------------------------------------------------------------------------- /Review/201904W2/HowIcutMyAWSbillByGoingServerless-lingyunG.md: -------------------------------------------------------------------------------- 1 | 这周阅读了一篇[文章](https://medium.freecodecamp.org/how-i-cut-my-aws-bill-by-90-35c937596f0c/),文章作者将自己的服务从AWS EasticBeanstalk 移到AWS lambda上面,通过采用无服务的架构 2 | 使得费用减少了很多。 -------------------------------------------------------------------------------- /Review/201904W2/Java并发编程基础-HardJ.md: -------------------------------------------------------------------------------- 1 | ## 并发编程基础 2 | 3 | **原文地址:https://www.callicoder.com/java-concurrency-multithreading-basics/** 4 | 5 | **原文作者:Rajeev Kumar Singh ** 6 | 7 | 并发是指在同一时间做超过一件事情的能力。 8 | 9 | 早期,计算机只能执行一个程序每次。但是现在,现代计算机同时运行大量的任务。 10 | 11 | 例如 : 12 | 13 | - 你能同时在你的浏览器上浏览博客,在音乐播放器上听着歌。 14 | - 你能在文字处理器上编辑文档,同时从因特网上下载文件。 15 | 16 | 并发并不一定涉及到多个程序。一个正在执行的单体应用中的多个部分也称为并发。 17 | 18 | 例如: 19 | 20 | - 一个文字处理器在格式化文本的同时响应着键盘事件。 21 | - 一个音频流媒体应用从网络上下载文件的同时解析并及时展示到屏幕上。 22 | - 一个web服务器,本质上是跑在计算机上的一个程序但却同时处理着来自世界各地的请求。 23 | 24 | 25 | #### 并发相关原理 26 | 27 | 对于一次做超过多件事的软件称为并发软件。 28 | 29 | 如今,计算机已都是多核处理器。但是在早期单核处理器的计算机中依然拥有并发能力,因为同时在运行的程序数目远超过多核处理器的数目。 30 | 31 | 实际上,并发执行并不意味着在相同的物理机上同时执行。当我们说:"多个任务在同一时刻执行"意思是"多个任务在同一时间段内执行了"。 32 | 33 | 任务执行是一个交叉的方式。操作系统在频繁的切换任务使得出现在用户面前的是同一时刻执行多个任务。 34 | 35 | 因此,并发并非并行。真正的并发不会出现在单核的处理器上。 36 | 37 | #### 并发相关单位 38 | 39 | 并发是一个非常广泛的术语,常被用在不同的层面上。 40 | 41 | - 在多处理器中,并发的单位是CPU。 42 | - 在多个任务中,一个单核CPU并发运行着多个任务或进程。在这种情况下,操作系统任务切换速度非常快。并发的单位是一个进程。 43 | - 在多线程中,一个进程的多个部分同时运行。在这种情况下,我们进一步将同一个进行划分为多个线程。并发的单位是一个线程。 44 | 45 | #### 进程和线程 46 | 47 | ##### 进程 48 | 49 | ​ 一个进程相当于一个程序执行。它有自己的地址空间,调用堆栈,并可以链接任何资源,例如:打开一个文件。 50 | 51 | ​ 一个计算机系统通常会同时运行多个进程,操作系统通过共享CPU执行时间来促进它们执行。 52 | 53 | ##### 线程 54 | 55 | ​ 一个线程是进程里的一个执行路径。每一个进程至少都有一个主线程。主线程能够在这个进程内创建额外的线程。这些线程共享着同一进程资源,包括内存和文件描述符。每个线程有它自己的调用栈。由于一个进程内的所有线程共享着进程的地址空间,所以创建线程与线程之间的通信变得更加高效。 56 | 57 | #### 并发存在着哪些问题 58 | 59 | ​ 并发通过提升CPU的利用率来尽可能的提升计算机的吞吐量,但也带来了一些问题。 60 | 61 | ##### 竞态条件 62 | 63 | ​ 当多个线程尝试并发的读或写共享变量时,这些读和写操作可能重叠。在这种情况下,执行的最终结果是不可预测的,依赖于这些读和写操作的执行顺序。这类错误通常难以预测和修复。 64 | 65 | ​ 通过确保同一时刻仅有一个线程对共享变量进行操作可以避免这个错误。一般的做法是通过互斥锁来访问共享资源。 66 | 67 | ​ 而在每次访问共享变量前都获取一把互斥锁可能导致其他问题,如:死锁问题、饥饿问题。 68 | 69 | ##### 缓存一致性 70 | 71 | ​ 缓存一致性问题发生在,对于相同的共享变量,不同的线程拥有不同的缓存。当一个线程更新了共享变量的值后,没有及时通知另一个线程,导致其他线程仍然在使用之前读取到本地缓存中的值。 -------------------------------------------------------------------------------- /Review/201904W3/GoingAtomic-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 3 | 在并发的场景中,我们不可避免的要考虑线程安全,不然会读到脏数据,无法得到正确的结果。这周阅读的文章是关于保证线程安全的,为了保证 4 | 线程安全,我们常用的就是synchronized,而文章提到了用锁的缺点,以及我们可以CAS来保证线程安全。 5 | 6 | 文章链接是:https://www.ibm.com/developerworks/java/library/j-jtp11234/。 7 | 8 | 用锁虽然能保证线程安全,但是在多个线程等待同一个资源的情况下,JVM要处理不同线程之间的切换,这样会造成生产能力低下。因为这时候大 9 | 部分的时间都用来处理线程之间的切换,线程真正执行自己逻辑代码的时间并不多。因此我们可以采用CAS的方式来获得线程安全。 -------------------------------------------------------------------------------- /Review/201904W3/Raise-Great-Developer-Not-Hire-明昭.md: -------------------------------------------------------------------------------- 1 | # Raise Great Developer Not Hire 2 | 3 | [原文](https://sizovs.net/2019/04/10/the-best-developers-are-raised-not-hired/?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=website) [P.S. 由于我是在湾区日报上看到的,此处链接为分享链接,介意可以自己搜索] 4 | 5 | ## 文章内容 6 | 7 | 一句话:公司应该放弃对人才的争夺,创造人才培养的环境,根据态度来招人。 8 | 9 | 1. 人在没有经过实战之前,对自己的估计经常不准 10 | - Imposter Syndrome - 不会相信自己的能力(比如觉得是运气) 11 | 2. 公司会过滤掉”还不够优秀“的应聘者,而每个优秀的人都是慢慢成长起来的 12 | 1. 公司不想、或者不能培养一个人 13 | 2. 公司花重金希望求得人才,其实是竭泽而渔 14 | 3. 让一个高级工程师与给初级工程师当导师是值得的 15 | 1. 你指导的人会支持你,并且反过来也提升了你 16 | 2. 公司培养的人会对公司更忠心,更卖力 17 | 4. 公司怎么做 18 | 1. 教导高级工程师导师技巧 19 | 2. 调整面试筛选更愿意学习,进步的人 20 | 3. 放松硬性指标 21 | 22 | ## 个人体会 23 | 24 | 原文站在公司的角度,对公司的招聘提出了建议。反过来,作为一个个人,对自己的认识也要有成长性。在追求技术的绝对高度时,也应该学习如何从周围寻求帮助以更快的成长。 25 | 26 | 公司应该促进高级工程师的经验分享;那初级工程师也要能认清自己的不足,有针对性地向高级工程师寻求帮助。 -------------------------------------------------------------------------------- /Review/201904W3/why-were-bullish-on-crypto-collectibles-nfts-乌守元.md: -------------------------------------------------------------------------------- 1 | 本周参与校对 2 | 3 | -------------------------------------------------------------------------------- /Review/201904W3/每个开发者都该知道的SOLID原则-落英坠露.md: -------------------------------------------------------------------------------- 1 | [SOLID Principles every Developer Should Know]() 每个开发者都该知道的 SOLID 原则,深度好文,推荐阅读。 2 | 3 | 作者主要讲了面对对象编程的 5 个原则: 4 | 5 | - S:Single Responsibility Principle(单一职责原则) 6 | - O:Open-Closed Principle(开闭原则) 7 | - L:Liskov Substitution Principle(里氏替换原则) 8 | - I:Interface Segregation Principle(接口隔离原则) 9 | - D:Dependency Inversion Principle(依赖倒置原则) 10 | 11 | ##### 单一职责原则 12 | 13 | 当设计类的时候,我们应该把相关的功能放到一起,这样就算要修改也是因为相同的原因修改。同时,对于不同原因带来的改动要进行功能拆分。 14 | 15 | ##### 开闭原则 16 | 17 | 软件实体(类、模块、函数)应该对扩展开放,对修改关闭。比如,要添加功能时,在原来的基础上修改 if-else 实现,还是把共有的方法抽取出来通过继承来实现呢,显然要扩展而不是修改。 18 | 19 | ##### 里氏替换原则 20 | 21 | 子类可以替代它的父类。满足 LSP 的两个要求: 22 | 23 | - 如果父类有一个接收父类型参数的方法,那么它的子类应当接收父类型或者其子类型作为参数。 24 | - 如果父类方法的返回值是父类型,那么它的子类应当返回父类型或者其子类型。 25 | 26 | ##### 接口隔离原则 27 | 28 | 使用类不应该被强制要求实现它们不需要的接口。一个全能的接口,什么事都可以干,我们不需要它,我们只要专心做一件事的接口。 29 | 30 | ##### 依赖倒置原则 31 | 32 | 依赖倒置因该针对抽象而不是具体。 33 | 34 | - 高层模块不该依赖低层模块,它们都该依赖抽象类。 35 | - 抽象不该依赖具体,具体应当依赖抽象。 36 | 37 | 点评:文中举了几个例子,非常简洁易懂。为了写出可读可维护的代码,我们尽量还是要遵循SOLID 原则。 38 | -------------------------------------------------------------------------------- /Review/201904W4/NetFlix在AWS上的安全实现-lingyunG.md: -------------------------------------------------------------------------------- 1 | https://medium.com/netflix-techblog/netflix-cloud-security-detecting-credential-compromise-in-aws-9493d6fd373a -------------------------------------------------------------------------------- /Review/201904W4/how-to-simplify-your-design-乌守元.md: -------------------------------------------------------------------------------- 1 | 校对文章:[https://github.com/xitu/gold-miner/blob/master/TODO1/deep-learning-competence.md](https://github.com/xitu/gold-miner/blob/master/TODO1/deep-learning-competence.md) 2 | -------------------------------------------------------------------------------- /Review/201905W1/DataLakeDataWareHouseDataBase-lingyunG.md: -------------------------------------------------------------------------------- 1 | What's the Difference Between a DataLake,DataWarehouse and Database 2 | 3 | DataLake 4 | A data lake is a place to store your structured and unstructured data, as well as method for 5 | organizing large volumes of highly diverse data from diverse sources. It is more cost efficient 6 | than dataWare house and database. 7 | 8 | DataWarehouse 9 | A data warehouse collects date from various sources. The data is usually structured, often from 10 | database, but it can be unstructured too. It is designed to gather business insights. 11 | 12 | DataBase 13 | Databases are really set up to monitor and update real-time structured data, and they usually 14 | have only the most recent data available. -------------------------------------------------------------------------------- /Review/201905W1/deep-learning-competence-乌守元.md: -------------------------------------------------------------------------------- 1 | 参与校对 https://github.com/xitu/gold-miner/blob/master/TODO1/deep-learning-competence.md 2 | -------------------------------------------------------------------------------- /Review/201905W2/HowDataInspireBuildCloudInfrastructure-lingyunG.md: -------------------------------------------------------------------------------- 1 | 这周阅读到的文章是https://medium.com/netflix-techblog/how-data-inspires-building-a-scalable-resilient-and-secure-cloud-infrastructure-at-netflix-c14ea9f2d00c 2 | 文章提到NetFlix是如何监控系统的性能,安全隐患等方面。 -------------------------------------------------------------------------------- /Review/201906W1/InversionofControlforworkflows-lingyunG.md: -------------------------------------------------------------------------------- 1 | https://medium.com/netflix-techblog/netflix-conductor-inversion-of-control-for-workflows-c495621bc1c5 -------------------------------------------------------------------------------- /Review/201906W2/jdbc源码分析-lingyunG.md: -------------------------------------------------------------------------------- 1 | 在知识星球上看到一篇别人分享的后端进阶之路。每个人都得在自己不断探索去走出属于一条自己的路,选择一条适合自己的学习路线。 2 | https://objcoding.com/2018/02/07/javaweb-learning/ -------------------------------------------------------------------------------- /Review/201907W1/程序的机器级别表示-lingyunG.md: -------------------------------------------------------------------------------- 1 | https://www.jianshu.com/p/3afe184f68f0 -------------------------------------------------------------------------------- /Share/201901W4/SpringBoot和Vue前后端分离开发与合并-YuanCome.md: -------------------------------------------------------------------------------- 1 | ## SpringBoot 和 Vue 前后端分离开发与合并 2 | > 一开始不知道分享什么好,一直找不到好的分享点,恰好昨晚一位做前端的朋友问我SpringBoot + Vue 前后端分离开发完成后如何进行项目合并。我觉得这个可以作为分享点,给大家参考一下。 3 | 4 | 现在的项目开发大多数都是前后端分离,以便快速完成开发项目,现在SpringBoot 和 Vue结合,大致有两种方案: 5 | 1. 在html中直接使用script标签引入vue和一些常用的组件,这种方式和以前传统的开发是一样的,只是可以使用vue的双向数据绑定,适合于普通的全栈开发。 6 | 2. 使用vue官方的脚手架创建单独的前端工程项目,做到和后端完全独立开发和部署,后端单独部署一个纯restful的服务,而前端直接采用nginx来部署,这种称为完全的前后端分离架构开发模式,但是在分离中有很多api权限的问题需要解决,包括部署后的vue router路由需要在nginx中配置rewrite规则。 7 | 8 | 采用前后端开发后整合合并,在传统行业中比较常见,整合合并之后只需要打一个SpringBoot包。 9 | 10 | ### 下面讲讲如何整合合并: 11 | 12 | - #### 简单方法: 13 | 14 | 前端开发好后将build构建好的dist下static中的文件拷贝到springboot的resource的static下,index.html则直接拷贝到springboot的resource的static下。 15 | 16 | Vue代码目录结构: 17 | 18 | ![](https://wx4.sinaimg.cn/mw690/6dd2f9a2gy1fznk0xnz7rj20hs04gweg.jpg) 19 | 20 | [图片来源](https://blog.csdn.net/liyanlei5858/article/details/80771713) 21 | 22 | SpringBoot代码目录结构: 23 | 24 | ![](https://wx4.sinaimg.cn/mw690/6dd2f9a2gy1fznk0xn9fsj20hs0addfv.jpg) 25 | 26 | [图片来源](https://blog.csdn.net/liyanlei5858/article/details/80771713) 27 | 28 | 这种方式**不适合工程项目**,也没有做到真正的**前后端代码分离**。我们更应该使用构建工具进行项目整合的构建,在构建springboot时触发前端构建并编写自动化脚本将前端webpack构建好的资源拷贝到springboot下再进行jar的打包,最后就得到了一个完全包含前后端的springboot项目了。 29 | 30 | 合并的核心问题: 31 | 1. 无法正常访问静态资源。 32 | 2. vue router路由的路径无法正常解析。 33 | 34 | 关于问题1,只需要在SpringBoot代码中修改静态资源的路径即可。 35 | 36 | 参考例子: 37 | 38 | ![](https://wx4.sinaimg.cn/mw690/6dd2f9a2gy1fznk0xov6bj20hs04h3z5.jpg, "参考例子") 39 | 40 | 关于问题2:需要在 Vue 中修改路由的路径,然后交由 router 来处理,修改路由路径的时候可以使用同一的前缀或者后缀,然后 SpringBoot 添加相应的拦截器进行拦截。 41 | 42 | 关于 SpringBoot 和 Vue 的整合大题就是这些内容。 43 | 44 | **如果有足够的资源条件下,更推荐前后端独立开发部署**。 -------------------------------------------------------------------------------- /Share/201901W4/《什么是真正的程序员》有感-yu.md: -------------------------------------------------------------------------------- 1 | 前几天读了一篇[《什么是真正的程序员》](https://www.cnblogs.com/xueweihan/p/5220513.html?pageName=tab_recommend#undefined),以小王子中的口味讲述了 printf 遇到各种各样程序员的故事,引起了我一些思考,并不只是对程序员实用。 2 | 3 | **1**. 应不应该专注于一个领域? 4 | 5 | 我认为一个人在一个领域里要有所成就专注是必须的。专注并不是说重复做相同的事情,应该是持续不断的收集与整理,因为每次的变化如此微小以至于你完全感觉不到自己的进步,这会让人很沮丧,也是大多数人无法持续专注的原因。因为没有让自己耳目一新的观念和知识刺激自己,时间久了会相当疲惫。而且随着研究越来越深入,面临的问题会越来越抽象和枯燥,如果有一个新奇的世界摆在面前,只要稍加留意就会获得很大的满足,人怎么会去坚持研究抽象和枯燥的东西呢? 6 | 7 | 专注也不是故步自封,不去看其他领域的发展,计算机是很多科学的交叉学科,也应该关注其他领域的进步,计算机和科技只是实现需求和设计的手段,计算机专家专注的也不应该是技术点,而是创造软件的手艺。程序员则是手艺人,比产品经理更应该有工匠情怀。 8 | 9 | 难的地方在于权衡专注的领域和其他方面的精力分配。有的人不是没有其他爱好,只是没有办法,文学大家沈从文就是个典型的例子。沈从文后半生没有写出来令自己满意的文学作品,因为文学他被批斗得很惨,精疲力竭,后来花了几十年潜心研究漆器和古代服饰,又成这方面的考古专家。 10 | 11 | **2**. 应该维护人际关系吗? 12 | 13 | 我们看到很多伟大的人人际关系处理得并不怎么样,乔布斯恐怕就是一例,现在只听到说乔布斯很伟大的说法,没听到过说乔布斯人际关系处理得很好的。因为有这些成功人士在前,普通人容易产生只要我厉害,就不用担心为人处世的问题,程序员更加如此,因为天天都是和机器电脑打交道。 14 | 15 | 但正因为这样,才需要更加注重人际关系,和机器打交道的人更容易和人群脱节,忘记自己群居动物的身份。很多程序员不知道是电影看多了还是怎么,觉得电影里的黑客孤僻的样子很酷,生活中也以此为傲,反正也不被人关注,就这么着吧。程序是给人用的,如果对人这个群体都没有兴趣,怎么理解用户需求,写出好代码呢? 16 | 17 | 深圳螃蟹程序员事件余温未消,现在责任无法评判,外人看来还是从这件事中多吸取点教训吧。 18 | 19 | 处理好和同事的关系非常重要。现在的大多数工作都需要分工合作,团队氛围和谐更容易产生创造性。和同事关系不好不仅影响到心情从而影响工作效率,而且会造成沟通不畅,阻碍信息流通,影响项目进程。 20 | 21 | 机器运作需要比较精确的把控,而个人是很难照顾到各方面的问题的,这是人思维局限造成的,根本无法避免,良好的团队能有效弥补这方面的不足。 22 | 23 | **3**. 追求意义 24 | 25 | 现在的社会物质和精神都可以极大丰富,我们可以追求的东西很多。追求精美的 app, 追求设计简洁的电子器件,追求火热的技术,我们很少问为什么?追求这些的意义是什么? 26 | 27 | 我看到很多时尚博主经常拿雷军以前穿西装的照片来做反面教材,还有的博主喜欢提白袜子的梗,根本都不去想想雷军没有那个能力改变自己穿衣服的风格吗?自己没那个能力能不能请个明星的形象设计师?人家追求的东西不是这些啊! 28 | 29 | 下次再收集癖发作的时候,不妨冷静下,问问为什么?这么做的意义是什么?偶尔当回许三多。 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Share/201901W4/与百度有关的随想-陈小渣.md: -------------------------------------------------------------------------------- 1 | > 字数 817字 2 | > 3 | > 阅读时间:2分钟 4 | 5 | ![向上生长](https://upload-images.jianshu.io/upload_images/12905779-4ab5c3956dd34f11.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 6 | 7 | 最近网上一篇《搜索引擎百度已死》,火了一把。文章写到作者在百度搜索资料时,基本上全是百度自家的内容,例如:百度百科,百家号还有广告。让我觉得只要给百度钱,大概就可以像央视一样,做假广告了吧。 8 | 9 | 2018年的3月26号,在北京中国发展高层论坛上,百度董事长李彦宏表示中国用户在个人隐私方面更加开放,一定程度上愿用隐私换方便和效率,但百度也会遵守相应法规。让我不禁笑出声,原来你是这样使用我们的个人隐私,为我们“服务”的? 10 | 11 | 自从我出了学校以后,就没用百度了,一是觉得搜出来的东西布局太丑,最多看看百度百科。而且在搜索资料方面,从没有给其他平台让过资源,自己能解释,自己能写的,都包揽下来。后来我尝试用了下其他平台的搜索引擎,真的用了以后就基本不会用回百度了。搜索的质量根本不是一个等级,对于我这种经常要去搜资料的人来说,当然是希望准确且多样,而不是一些质量层次不齐的营销号。 12 | 13 | 2019年1月23日,百度回应,百家号内容全站占比小于10%,同时表示坚决打击内容作弊、低俗、违规做号等行为。 的确是小于百分之10%,但你如果都放在第一页,带来的价值比那些百分之90%放在后面几页,是不能比的。 14 | 15 | 有人打趣的说,如果没办法只能用百度的话,就请翻到第二页开始看把,毕竟第一页都被广告、百家号、百度产品占满了。在百度曝出这一消息后,bing搜索引擎挂了,这一波操作满分。 16 | 17 | 我同时也想到了,之前火即一时的《腾讯没梦想》,里面讲到腾讯打算收购一家以抄袭为生的公司,与腾讯之前的理念完全相悖,故写下腾讯没有梦想。当然马化腾在这个时候不是选择逃避,而是在思考后,停止了收购计划,并道歉,说会更加慎重的选择。我觉得这才是一家企业应该有的思考。 18 | 19 | 当然我上升到企业层次,显得自己逼格很高,貌似这些都和我们都没有什么关系。事实上,企业也像个人,他的一举一动,都是有灵魂的。若做的事情不是在为社会谋福利,而是想着赚钱他们身上的智商税的话,我想这是走不远的.. 20 | 21 | 其实也有点同情百度,毕竟企业到了这个时候,口碑却越来越差。 22 | 23 | 映射到我们,正值年轻,选择走什么样的路,选择做一个什么样的人,都蛮重要的。该得到的就尽力去争取,得不到的,也不用太过悲伤。走在自己的路上,偏了就改变方向,不要一直错下去。 24 | 25 | 有点胡说八道的感觉...不是很满意,自己不是很能驾驭这种题材...还是要多写,多输入。 26 | -------------------------------------------------------------------------------- /Share/201901W4/光场计算成像空域-yanglei094121.md: -------------------------------------------------------------------------------- 1 | > 很有趣的计算部分,这周是空域部分,下周挑战频域部分。此计算可实现光场相机获取图像全聚焦。 2 | 3 | [光场计算成像空域](https://mp.weixin.qq.com/s/s3lIO-ewBNaQkKzPD-cGTA) 4 | 5 | -------------------------------------------------------------------------------- /Share/201901W4/公众号文章有感-torreyxian.md: -------------------------------------------------------------------------------- 1 | ## 读公众号文章有感 2 | 3 | * 外在:处理事情先自己思考,思考的思路,分析-判断-处理,解决不了先在网上寻找答案,其次再询问别人,提问时候说出自己的思考,再抛出问题。 4 | 5 | * 内心:将关注点放在有价值的地方。 6 | 7 | * 注意:不要将眼光放到人身上。抱怨,人之本能,太过注意这个没什么实际作用。事,这才是最重要的。这个是最需要解决的。 8 | 9 | -------------------------------------------------------------------------------- /Share/201901W4/既生Java,何生Groovy?-寒食君.md: -------------------------------------------------------------------------------- 1 | # 既生Java,何生Groovy? 2 | 3 | 这周接手了组里一个旧项目,javadoc显示是从2017年开始编写的。@author显示是一位前端员工的名字,他在我入职前已离职,好像是去了腾讯。 4 | 5 | 我十分好奇,为什么前端人员的名字会出现在后台代码里?问了下X叔,告知可能是当时该同学正在转后端,然后人手不够,就由他来写了。 6 | 7 | 上面都是题外话。 8 | 9 | 项目是用groovy写的,我之前没有接触过groovy,但是作为和java一样运行在jvm上的语言,阅读二者代码不会有障碍。在格式方面groovy提供了更多的语法糖,让开发者能够更加愉悦地编写。 10 | 11 | 但是作为维护者,则恰恰相反。比如,groovy用到了动态类型,这对于维护者阅读理解和调试都增加了一定的难度。 12 | 13 | 下面我想从两方面谈起,一是既生java,何生groovy?二者有什么区别?二是在开发前,关于语言选型的问题。 14 | 15 | Java自1995年诞生以来,遇到过几次重大波折,但都一一化解,并且一路高歌猛进,成为当前具有不二地位的老大哥。那么既然老大哥有着众多拥趸,那么千秋万代,岂不美哉? 16 | 17 | 但是,有人的地方就有江湖,语言也是,尤其以PHP信徒最为猖獗,这是后话。 18 | 19 | groovy诞生于2004年,是一种JVM上的替代语言,这里的替代不能理解为取代,而是一种对原有语言的完善和补充。所以说,groovy的诞生不是为了革命,而是一种改良。 20 | 21 | groovy的语法与java很相似,基本上只要你会java,你就能读懂groovy。但是其理念是源于smalltalk和ruby,所以groovy更像是一门胶水语言。 22 | 23 | groovy最大的特点是支持动态类型,相较于java,它更简洁,表达能力也更强,具体特性可以搜索了解,这里暂不赘述。短期来看,它可以缩短你的开发周期,提升你的效率,但是长期来看,可能会导致一些问题,比如我现在维护就很吃力,一部分原因也是因为我菜。 24 | 25 | 那么大家可能会萌生这样一个问题:对于这二者,在开发时如何选用呢? 26 | 27 | 首先是技术选型,这是架构师的任务,学问比较高深。而我们作为个人开发者或者是初级工程师,没有达到这样的技术视野。所以在开发除工作以外的自己的小项目时,可以尽量去自我培养这一种能力。在语言选型上,有人说,超过200行代码的项目都不应该使用动态类型,虽然有一点夸张,但是有一些道理的,俗话说:“动态类型一时爽,代码重构火葬场”。 28 | 29 | 我认为,对于个人开发或者2-3人小团队合作,而且不用长期维护的项目,写法自由松散,追求速度是高效的。此时,Python、Ruby、Groovy这类的语言手到擒来,好不快活。但是对于中大型项目,时间跨度较长的,还是应该范式优先,即使Java有那么一点笨重。 30 | 31 | -------------------------------------------------------------------------------- /Share/201901W4/解决bug的偏方-Iris.md: -------------------------------------------------------------------------------- 1 | ### 建议遇到bug长时间没能解决的时候,先停下来,去吃饭或者干点别的事情,先错开一下思路,不是说错开思路之后就能解决,而是尽量让自己冷静下来,冷静下来后能看到更多之前自己因为太急躁而忽略的东西 2 | -------------------------------------------------------------------------------- /Share/201902W1/《操作系统之哲学原理》--系统调用-启航.md: -------------------------------------------------------------------------------- 1 | ## 《操作系统之哲学原理》--系统调用 2 | 3 | ​ 操作系统是一个系统程序,即为别的程序提供服务的程序。而操作系统的服务是通过**系统调用**来提供的。 4 | 5 | ​ 在c语言中可用如下进行读盘操作: 6 | 7 | `result= read(fd,buffer,nbytes);` 8 | 9 | ​ 系统调用按功能可划分为6大类: 10 | 11 | - 进程控制类 12 | 13 | - 文件管理类 14 | 15 | - 设备管理类 16 | 17 | - 内存管理类 18 | 19 | - 信息维护类 20 | 21 | - 通信类 22 | 23 | 系统调用的3个阶段: 24 | 25 | - 参数准备阶段 26 | 27 | - 系统调用识别阶段 28 | 29 | - 系统调用执行阶段 30 | 31 | ​ 32 | 33 | ​ 在参数准备阶段,需要使用系统服务的程序将系统调用所需要的参数(fd,buffer, nbytes)压入栈中,然后调用read函数库,read函数将read系统调用的代码放在一个约定好的寄存器里面,通过trap(一种中断方式)将控制交给操作系统。 34 | 35 | ​ 在系统获得控制权后,将系统调用代码从寄存器中取出,与操作系统维护的一张系统调用表进行比较,获得read系统调用的程序体所在的内存地址,之后跳到该地址。之后执行系统调用函数,系统调用执行完后返回到用户程序。 36 | 37 | **系统调用的参数传递** 38 | 39 | ​ read系统调用的参数被压入到栈中,即参数传递是通过栈来进行,但是这个效率并不是最高,效率最高的是将参数存放在指定的寄存器里面,由于寄存器的访问速度高于栈,所以这种方法参数传递的方法可以提高系统的执行效率,例如x64体系结构,前8个参数都是由寄存器传递,超过8个参数,后面的参数才通过栈传递。 -------------------------------------------------------------------------------- /Share/201902W1/《深入理解计算机系统》之存储器层次结构-落英坠露.md: -------------------------------------------------------------------------------- 1 | ### 《深入理解计算机系统》之存储器层次结构 2 | 3 | #### 1.5 高速缓存至关重要 4 | 5 | ![高速缓存](https://richie-storage.oss-cn-hangzhou.aliyuncs.com/img/Jietu20190115-075319.jpg) 6 | 7 | 根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备。 8 | 9 | 处理器和主存之间的速度差异非常大,寄存器的速度比主存快两个数量级,加快处理器的运行速度比提升主存的速度要容易和便宜得多。 10 | 11 | 针对处理器和主存之间的差异,设计了**高度缓存存储器**(cache memory),作为数据暂时的集结区域,存放处理器近期可能会需要的信息。 12 | 13 | 三级高速缓存:L1、L2、L3,用静态随机访问存储器(SRAM)实现。 14 | 15 | 高速缓存利用了**局部性原理**:程序具有访问局部区域里的数据和代码的趋势。 16 | 17 | #### 1.6 存储设备形成层次结构 18 | 19 | ![存储器层次结构](https://richie-storage.oss-cn-hangzhou.aliyuncs.com/img/Jietu20190115-075353.jpg) 20 | 21 | 从上到下,设备的访问速度越来越慢、容量越来越大,并且每字节的造价越来越便宜。 22 | 23 | 存储器层次结构的主要思想是**上层的存储器作为下层存储器的高速缓存**。寄存器文件就是 L1 的高速缓存,L1 就是 L2 的高速缓存...... 24 | 25 | ----- 26 | 27 | ##### 我的思考: 28 | 29 | 高速缓存的存在是为了解决处理器和主存之间速度差异大的问题,现在的设备把高速缓存分为三级。离处理器越近的存储器,访问速度越快。寄存器在处理器内部,所以它最快,主存离得比较远,速度就比寄存器慢。 30 | 31 | 善用缓存是提高程序性能的办法,比如把加载图片时做个内存磁盘双缓存,这在 Android 开发中是经常用到的。 -------------------------------------------------------------------------------- /Share/201902W1/何为贵人,以及圈子的重要性-张大Ant.md: -------------------------------------------------------------------------------- 1 | **你接近什么样的人就会走什么样的路**! 2 | 3 | * 穷人会教你如何节衣缩食; 4 | * 小人会教你如何坑蒙拐骗; 5 | * 牌友只会催你打牌; 6 | * 酒友只会催你干杯; 7 | 8 | 而成功的人只会教你如何取得成功,人生最大的运气,不是捡钱,也不是中奖,而是有人可以鼓励你,指引你,帮助你,发现更好的自己,走向更高的平台。 9 | 10 | 其实限制你发展的,往往不是智商和学历,而是你所处的生活圈及工作圈和身边的人很重要。 11 | 12 | 所谓的**贵人**,并不是直接给你带来利益的人,而是开拓你的眼界,纠正你的格局,给你正能量的人,并且你还要明白,所有浪费了的日子都是要还的。 13 | 14 | 谨以此纪念逝去的2018年。 15 | 16 | > 这篇内容来自一位朋友的公众号,不是鸡汤!我觉得很有启发意义,共享之。 -------------------------------------------------------------------------------- /Share/201902W1/你看到的AI与智能无关-寒食君.md: -------------------------------------------------------------------------------- 1 | 分享一篇长文:[人工智障 2 : 你看到的AI与智能无关](https://mp.weixin.qq.com/s/tFcVohNjdhvBE_INQk9muQ) 2 | 3 | 这篇文章起初我是在微信的“看一看”里看到大家推荐的,点赞的不乏颇有名望的人。第一印象,我觉得它应该不错。 4 | 5 | 草草地阅读了一遍,我发现这是一篇值得精读的文章。出于这几点原因: 6 | 7 | 1. 题材是我所感兴趣的 8 | 2. 作者的眼界和见识很高,远远在我之上 9 | 3. 作者思路流畅,行文自称风格。可见不仅有才,而且是花了时间和心血写的 10 | 11 | 最近又读了一遍,收获颇丰。因为我作为写代码的工程师(实习阶段),对搞人工智能,搞算法的同学真的了解的不多,而且甚至有点被媒体带偏了。 12 | 13 | 相信和我一样的人也比较多,本文推荐给没有阅读过,以及阅读过,但是没有仔细阅读的同学。 14 | 15 | 我自己的读后感在这就不赘述了,因为自己也还没有消化完全,说实话,除了文章关于AI的内容,作者的行文手法也是我需要学习的。 16 | 17 | 这篇文章,我会好好再花时间读一遍。 -------------------------------------------------------------------------------- /Share/201902W1/使用matlab将灰度图转换为彩色图-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第二周 Share 2 | ## 使用matlab将灰度图转换为彩色图 3 | #### 通常问题:将rgb图像转化为灰色图: 4 | 这是简单的,因为rgb图像有三个维度的信息,每种颜色相当于一个三维向量。表示时,相当于同一个向量在不同坐标轴下的表示。
5 | #### 反问题:灰度图转化为rgb图像 6 | 灰度图像只有一个维度的信息,那么rgb图像转为灰色图问题相当于将三维坐标投影为一维坐标。明显反过程(由灰色图像转换为彩色图)是不可能的,除非添加信息。即如果想完成反过程,就必须存储另外两个维度的信息,合在一起就是原来的三维向量,即rgb图像。
7 | #### matlab程序 8 | CSDN上有一个非常有趣的matlab function:gray2rgb,
地址:https://blog.csdn.net/u012150360/article/details/67656823
9 | 这个function需要输入两个参数,第一个为灰度图,第二个图为rgb图像,function将第一幅灰度图赋予第二张彩色图的颜色。看示例效果是非常好的,可是我自己上手的时候发现没有非常理想。可能是要找相似图像进行复制颜色?进一步实验再看看。一个非常明显的缺点,两个循环嵌套,运行非常非常的慢,一幅图大概需要半个小时。。。但是示例效果是非常非常好了。
10 | 11 | -------------------------------------------------------------------------------- /Share/201902W1/思考与反思-torreyxian.md: -------------------------------------------------------------------------------- 1 | 再过两天就是我们中国人最隆重的节日--春节。这篇也是对自己的一个小总结,反思下自己。 2 | 3 | 这半年来自己改变了之前的习惯,告别了之前的糊里糊涂。给自己制定了一系列计划,回想起来完成的还算不错。 4 | 5 | 1. 完成 JavaSE 的学习; 6 | 2. 对后台开发有了一定的了解和理解。 7 | 3. 慢慢地摸索出自己的一套学习方式(理论输入+行动输出+反思输出) 8 | 9 | 之前在学校按老师教的只是理论输入,没有合理的输出,自己也缺乏思考,还有一个最主要的缺点就是老想做不用动脑子的事。但时间久了,自己也烦躁。自己没用采用合理的办法来跳出这个不舒服的区域,现在回头看有点像是陷入了一个死循环。 10 | 11 | 自己在制定计划这块需要改变,我自己认为计划最重要的一点是具有完成性,其一是可以完成(适当的任务,不要妄想一口吃个大胖子),其次是根据情况要有适当的变化(因为自己当天的确是有别的事情耽搁导致计划未完成)。要是太在乎计划完成情况反而会极度的打击自己的积极性,次数稍多,导致计划完全失败。 12 | 13 | 产生这些变化最大的原因是对知识付费的接受。自己之前是能自己解决的事绝不会花费任何金钱,因此将大量时间花费在无意义的事情上。现在自己也在学习经济学相关的知识,对金钱观有了一定的理解,用钱来请专业的人做专业的事是没错的。 14 | 15 | 希望自己在新的一年能有一个更大的变化。加油,越努力越幸运。 16 | 17 | -------------------------------------------------------------------------------- /Share/201902W2/Hibernate操作Oracle时主键序列化问题-启航.md: -------------------------------------------------------------------------------- 1 | ## Hibernate操作Oracle时主键序列化问题 2 | 3 | Oracle数据库建表,主键自增,保存数据的时候,报could not get next sequence value 异常。 4 | 5 | **解决方法**: 6 | 7 | ``` 8 | CREATE SEQUENCE SEQ_BT_PASSWORD 9 | minvalue 1 10 | maxvalue 9999999999999999999999999999 11 | start with 1 12 | increment by 1 13 | cache 20; 14 | ``` 15 | 16 | **排查异常步骤**: 17 | 18 | 在数据库中运行如下语句,如果有value值,则说明sequence 没问题 19 | 20 | ` select SEQ_BT_PASSWORD.nextval from dual` 21 | 22 | 但是我现在遇到了另一个问题,步长设定为1 的情况下, 他自增是2 23 | 24 | 尝试过执行如下语句 25 | 26 | ` drop SEQUENCE SEQ_BT_PASSWORD` 27 | 28 | 并重新建立SEQUENCE 29 | 30 | 31 | 32 | 好像是缓存的问题,将cache 改成 nocache即可,暂时未出现问题。 33 | 34 | -------------------------------------------------------------------------------- /Share/201902W2/假期小感想-Leo.md: -------------------------------------------------------------------------------- 1 | 假期感觉过的太快,年前感觉还有很长时间,过完除夕和大年初一就发现假期马上结束了。 2 | 3 | 放假太过于放松会导致懒散,需要几天调整回去。确实假期没必要带啥书回来,好好玩,玩开心就是了,不然又想玩又担心有事情没做,顾虑太多让自己产生焦虑反而更不舒服,没有足够的放松。 4 | 5 | 整个假期其实就抽时间做了 ARTS 这一件事情,其他时间都在找同学玩,每次回来与朋友约一约还是感触挺大。 6 | 7 | 现在大家聚在一起讨论的话题都在变了,游戏不怎么讨论了,大多在讨论结婚和工作的事了,都在考虑今后的发展,也会发现有的同学和自己走的路隔得越来越远。 8 | 9 | 假期还有两三天,再好好玩几天就回去认真工作,调整状态,准备毕设,顺利毕业。 10 | 11 | 2019 让自己更优秀! 12 | 13 | -------------------------------------------------------------------------------- /Share/201902W2/粤语歌钟无艳学习-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第三周 Share 2 | ## 学唱粤语歌钟无艳 3 | #### 小姐姐非常温柔,一字一句学起来很好学,推荐,但我还没学会(学着学着困了。。。) 4 | 视频地址http://www.bilibili.com/video/av23748285?share_medium=android&share_source=copy_link&bbid=OwMxUjMDNVZkXDhaJlominfoc&ts=1549716582533 5 | 6 | 这周录了首歌,周蕙的我们还会相遇,推荐,考研每天必听歌曲,解压舒服~ 7 | https://changba.com/s/x__zQ8gpRUCe1eQqGBiCyQ?&code=RkvQSz26klrk01SJO6ziUOfxV8H9SanZIEiBscu1tPV1XzQTCIp9a-eAAibs-61r4otjYc4bdGF2eVozkvPeP9tfF-edadLvkQe9wmvPKi1PdGDeBBHjp0AoJJocjqjo -------------------------------------------------------------------------------- /Share/201902W3/2019考研题解读-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第四周 Share 2 | ## 做2019数分考研题 3 | 整理于https://blog.csdn.net/weixin_40758748/article/details/86762489 -------------------------------------------------------------------------------- /Share/201902W3/Go语言中管道堵塞+互斥死锁分析-Zoctopus.md: -------------------------------------------------------------------------------- 1 | # Go语言中管道堵塞+互斥死锁分析 2 | 3 | ## 管道中的`<-` 4 | 5 | 简单来说就是这样子的:接受者<-发送者。 6 | 7 | 然而中间会多个管道,所以我借用Go语言圣经中的三处例子做解释 8 | 9 | ```go 10 | ch <- x // x作为发送者发送给管道 11 | x = <-ch // 管道作为发送者发送数据给接受者x 12 | <-ch // 管道发送数据,没有接收者,丢弃,同时造成管道堵塞,等待接收者 13 | ``` 14 | 15 | 所以我们可以具体化刚才说的发送接收流程,它应该为:接收者 <- 管道 <- 发送者。如果缺了接收者或发送者,都会造成管道堵塞。 16 | 17 | ## 互斥锁 18 | 19 | 举个例子 20 | 21 | ```go 22 | import "sync" 23 | 24 | var ( 25 | mu sync.Mutex // guards balance 26 | balance int 27 | ) 28 | 29 | func Deposit(amount int) { 30 | mu.Lock() 31 | balance = balance + amount 32 | mu.Unlock() 33 | } 34 | 35 | func Balance() int { 36 | mu.Lock() 37 | b := balance 38 | mu.Unlock() 39 | return b 40 | } 41 | ``` 42 | 先Lock锁住,再使用Unlock解锁。 43 | 44 | 如果Lock中再套一个Lock,就会造成死锁,需要将前一个Lock解开才行。 45 | 46 | 笔记:在Lock和Unlock之间的代码段中的内容goroutine可以随便读取或者修改,这个代码段叫做临界区。goroutine在结束后释放锁是必要的,无论以哪条路径通过函数都需要释放,即使是在错误路径中,也要记得释放。 -------------------------------------------------------------------------------- /Share/201902W3/Ljava.lang.String异常-启航.md: -------------------------------------------------------------------------------- 1 | ## Ljava.lang.String异常 2 | 3 | ​ 最近遇到的一个问题,前端(Ext)提交表单对象,在Oracle保存的时候,报noSuchMethodException : btManager.SetId(), (Ljava.lang.String) 4 | 5 | ​ 当时第一反应是id没有加get,set方法,后来发现加了, 6 | 7 | 然后网上找了一些例子,看了下出现这个问题的原因,实体类中的id是long类型,我前端往后传的是类型Long的id(默认为null),我后台接收使用的是long接收,这是一个基本数据类型(默认值0L),我没给id赋值,则id在oracle中自增时出现了异常,后来将实体类中的id类型改为Long后正常。 8 | 9 | ​ 关键:基本数据类型和包装类的区别 10 | 11 | ​ 包装类默认值为null 12 | 13 | | 基本数据类型 | 默认值 | 14 | | ------- | -------------- | 15 | | char | '/uoooo'(null) | 16 | | byte | (byte)0 | 17 | | short | (short)0 | 18 | | int | 0 | 19 | | long | 0L | 20 | | float | 0.0f | 21 | | double | 0.0d | 22 | | boolean | false | -------------------------------------------------------------------------------- /Share/201902W3/dlv调试小结-Zoctopus.md: -------------------------------------------------------------------------------- 1 | # dlv调试 2 | 3 | dlv整体调试Go语言的流程如下 4 | 5 | ``` 6 | 1,./dlv debug xxxx(程序名) ##启动dlv调试 7 | 8 | 2,r(restart) 9 | 10 | 3,c(continue) 11 | 12 | 4,b(break) ##打断点,可以打函数名,也可以打文件下对应的行号 13 | 14 | 5,n(next)或s(step) ##n按一次单步执行,后面只需一直按回车;遇到需要深究的函数按s进去查看 15 | 16 | ##如果碰到多线程,建议在线程内打个断点 17 | 18 | 6,bt(stack) ##查看堆栈 19 | 20 | 7,frame ##查看指定堆栈的内容 21 | 22 | 8,q(exit) ##退出调试 23 | ``` 24 | -------------------------------------------------------------------------------- /Share/201902W3/《富爸爸穷爸爸》部分引言-Leo.md: -------------------------------------------------------------------------------- 1 | - 贫穷和破产的区别是:破产是暂时的,而贫穷是永久的。 2 | 3 | - 穷人和中产阶级为钱而工作。富人让钱为他工作。 4 | 5 | - 你做出决定的速度越快,抓住机会的可能性就越大 - 当然是在别人做决定之前。 6 | 7 | - 生活中的很多事情是我们无法控制的。我学会了专注于我所能控制的:我自己。如果事情必须改变,首先要改变的就是我自己。 8 | 9 | - 改变自己比改变他人更容易。 10 | 11 | - 人们的生活永远被这两种感觉所控制:恐惧和贪婪。 12 | 13 | - 很多人说“我对钱没兴趣”,可他们却每天工作 8 小时。 14 | - 我经常努力控制我的思想和情感。在我的生活中再三遇见这样的事情:当情感占据上风时,理智就会下降。 15 | - 有想象力的人蒸蒸日上,而缺乏想象力的人仍然在寻找工作,这份工作又可能很快被机器人和技术所取代。 -------------------------------------------------------------------------------- /Share/201902W3/修改git-commit-message-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## 修改Git Commit Message 2 | 3 | 最近遇到手误写错`commit message`的情况,这里记下如何修改`commit message` 4 | 5 | ### git commit --amend 6 | 7 | amend 是在上一次提交的基础上修改内容,包括 `commit message` 8 | 9 | 如果新增文件修改,需要先执行 10 | 11 | ```bash 12 | git add 13 | ``` 14 | 15 | 如果是想要修改上一次提交的`commit message`,我们只需要执行 16 | 17 | ```bash 18 | git commit --amend 19 | ``` 20 | 21 | 在跳出的页面中修改即可。 22 | 23 | 不过修改后,需要使用force,才能提交至远端库。 24 | 25 | ```bash 26 | git push -f 27 | ``` 28 | 29 | ### git rebase -i 30 | 31 | 这里我建了一个demo, `git logg` 查看一下历史commit,如图 32 | 33 | > git logg='logg = log --graph --decorate --oneline --abbrev-commit --all' 可在.gitconfig文件中添加此alias 34 | 35 | ![修改前的commit message](http://picture.wzmmmmj.com/rebase_1.png) 36 | 37 | **例:这里我想修改中间两个commti message** 38 | 39 | 只需要找到对应commit 的前一个hash值`3fdcc3e`,执行 40 | 41 | ```bash 42 | git rebase -i 3fdcc3e 43 | ``` 44 | 45 | ![rebase](http://picture.wzmmmmj.com/rebase_2.png) 46 | 47 | > git rebase -i 的功能很强大, 这里讲下`reword`,具体使用可以google 48 | 49 | 这里我们选择reword,就像注释所说`use commit ,but edit the commit message`,这是专门来修改`commit message`的,将需要更改的commit 前缀改为`r 或 reword` 50 | 51 | ![rebase](http://picture.wzmmmmj.com/rebase_3.png) 52 | 53 | `:wq`后,弹出修改页面,修改相应的`commit message`即可 54 | 55 | ![rebase](http://picture.wzmmmmj.com/rebase_4.png) 56 | 57 | 再次查看`git logg`,可以发现`commit message`已经被修改了,不过还可以发现rebase过的commit hash也变了,~~`rebase -i`是重新生成了一个commit~~,具体需要google 58 | 59 | ![修改后的commit message](http://picture.wzmmmmj.com/rebase_5.png) -------------------------------------------------------------------------------- /Share/201902W4/markdown插入数学公式-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第五周 Share 2 | ## markdown插入数学公式(行间行内) 3 | 整理于https://blog.csdn.net/weixin_40758748/article/details/87779181 -------------------------------------------------------------------------------- /Share/201902W4/不要急,慢慢来-YuanCome.md: -------------------------------------------------------------------------------- 1 | > 不要急,慢慢来。 ——毛主席 2 | 3 | 作为一名大四学生,还有大学的最后一个学期。看着为工作奔波的同学和自己,总有有点迷茫。 4 | 5 | 在互联网时代下的我们,通过互联网我们能接触到很多比我们优秀的人。看着他们和自己的差距,总会有种感慨:为什么人和人之间的距离这么大。 6 | 7 | 春节回家,和以前的小伙伴们聊天,我们之间的话题不再是游戏,而是工作、未来,渐渐地我们也成了被催拖、催婚的对象。XXX毕业 2 年已经买房、买车了...这类的话题,也成为了我们的焦点。 8 | 9 | 在这样的环境下,人的焦虑也就更加凸显。所以自己也能体会到为什么现在社会的氛围如此浮躁。大家都往着赚钱快的方向走。但是成功并不是偶然,很多我们现在看起来成功的人背后的付出是我们无法想象的。 10 | 11 | 最近看到一则新闻,深圳一商务公寓楼盘开盘,8000万一套的公寓被秒光。8000万是很多人哪怕穷极一生都未必能赚到的钱,但是那只是别人买房子的钱。虽然这类的新闻在当前环境下有贩卖焦虑的嫌疑,但是也能让我们认识到,每个人之间的路是不一样的,没有必要去因为别人的生活,而让自己的生活变得焦虑。 12 | 13 | 慢慢来,该有的总会有的。 -------------------------------------------------------------------------------- /Share/201902W4/主动一点,你的世界会更大-乌守元.md: -------------------------------------------------------------------------------- 1 | 不知道大家有没有试着把 TIM 的左侧聊天框全部清空试试,会弹出以下的默认界面。 2 | 3 | ![img01](https://s2.ax1x.com/2019/02/24/k4Ip9A.png) 4 | 5 | 是的,是这句话“主动一点,你的世界会更大”。其实在昨天(2019年2月23日)delphi 刘老师也提到了[这个问题](https://mp.weixin.qq.com/s/53ImvpArGl9Z8UHxAne9EQ)。他说他在十年工作生涯中最大的遗憾之一就是太过于封闭自己,以至没有认识更多的人,接触更多的事。 6 | 7 | 而在当下的信息时代,我们想要联系一个人其实远比以前容易。如 nature、science等期刊论文的作者都留下了自己的联系邮箱,再比如 github 的联系方式,更不用提微信公众号的留言方式或者某些大佬们资源留下私人联系方式。这些是在网络上,再比如现实生活中,总听见有人自怨自艾,抱怨同学、抱怨老师、抱怨同事。那么,你有没有和你兴趣相投的人建立联系呢?一味地散发负能量的你,又有多少人愿意主动接近? 8 | 9 | 所以,无论身处何种地位,都应高举改革开放伟大旗帜,不应过于封闭自己。 -------------------------------------------------------------------------------- /Share/201902W4/关于H5活动的想法-寒食君.md: -------------------------------------------------------------------------------- 1 | 先来说说什么是H5活动,在这里的同学大部分应该都接触过,有的是开发过,有的是作为用户体验过。 2 | 3 | 避免有个别同学从未听说过,我简短介绍一下: 4 | H5活动主要是使用HTML5编写的,在微信等移动端上进行传播,借以推广品牌,产品,为了导流的一种形式。 5 | 6 | 如果让你回忆一下,朋友圈哪家厂商在这方面做得最出色,网易算得上其中的佼佼者了。网易有个沸点工作室,策划、开发H5真是一绝。如果你从未听说过他们,可以点击:httpd.news.163.com。 7 | 8 | 我们组里去年也在尝试策划一些这样的活动,最早的中秋节活动,后来感恩节,国风美少年,元旦,春节等,大大小小也做了好几个,我也参与了几次,为他们开发了一些很简单的后台。 9 | 10 | 这几次活动的数据都不怎么好看,其中最高的达到了日均几十万UV。毕竟这是一开始的尝试,所以产品她们也有思考过这些H5活动到底该怎么去做。 11 | 12 | ## 为什么要做? 13 | 组织一次H5活动,需要消耗多少人力物力? 14 | 15 | 先粗略算笔账,假设需要1周时间,后端1人、前端1人、产品1人、UI 1-2人,假设他们都是P5-6等级的员工,所有这一切已经按照最低配置来计算(暂不考虑实习生),那么人力需要花费3万左右,加上一些部门间的协作损耗、资源消费,就算最低5万吧。 16 | 17 | 那么它可以带来什么?假设一个普普通通的H5总UV达到20万,假如以导流为目的,转化达到10%,获客成本2.5元人,这已经算很低了。 18 | 19 | ## H5的发展 20 | 2014年,开始出现一些纯静态的,类似于PPT一样的,类似网页贺卡等开始传播。 21 | 22 | 2015年,开始成长,答题、视频互动、场景模拟、虚拟场馆、P图等形式出现。 23 | 24 | 2016年,繁荣期,最早好像是微信的《我和微信的故事》开启了这种盘点类型的H5,随后一发不可收拾。 25 | 26 | 2017、18,各种极富创意、小而美的H5出现,其中很多开始关注个体,围绕“我”展开,引导用户走心、产生共鸣。 27 | 28 | 之前很火的有过这种: 29 | ![](httpsupload-images.jianshu.ioupload_images5889935-6e9841537d84733c.pngimageMogr2auto-orientstrip%7CimageView22w1240) 30 | ![](httpsupload-images.jianshu.ioupload_images5889935-42305b832198a5f6.pngimageMogr2auto-orientstrip%7CimageView22w1240) 31 | 32 | ## 什么样的H5易于传播? 33 | 34 | 1. 首先,不需要多复杂,交互一定要简单,顺畅。毕竟这是一项面向大众且无状态的产品。一旦遇到一点点阻碍,用户很可能直接退出。同时,H5想要表达的意思一定要直白准确地传达到用户眼前 35 | 36 | 2. 整个H5的节奏不能断,不能风格切换迥异,必须让人感觉是完整,而且让人有继续滑下去的欲望,符合心流。 37 | 38 | 3. 让用户产生共鸣,或者让用户觉得分享它到朋友圈很有意义,能够加强自身人设(比如“我是个幽默的人”、“我是个关心世界局势的人”、“我是个关心弱势群体的人”、“我热爱体育”等等) 这些正向的东西,加强了用户分享意愿,同时也能增强品牌效果。 39 | 40 | 41 | 本文首发于我的知识星球:编程侦探事务所 42 | ![](httpsupload-images.jianshu.ioupload_images5889935-fac11d8397309ebe.jpgimageMogr2auto-orientstrip%7CimageView22w1240) 43 | -------------------------------------------------------------------------------- /Share/201902W4/前端前端传数据时小问题-启航.md: -------------------------------------------------------------------------------- 1 | ## 前端传数组时的问题 2 | 3 | ​ 前端 ajax 请求:传了一个数组,在调试的时候,发现格式是id[]的形式, 但是在后台接收的时候出现了问题,一直为null,一开始以为是接收的数据类型有问题,或者是接收参数的格式问题,然后后端各种改,尝试了方法各种之后都不生效的时候,转向了前端,开始以为是ajax中data的问题,打印的时候 也都正常,之后在网上找到,在传数组的时候,在ajax中少写了一个属性tradtional。 4 | 5 | ​ 这个属性默认为false,jquery会深度序列化这个对象,所以可以添加traditonal :true 来防止深度序列化。 6 | -------------------------------------------------------------------------------- /Share/201902W4/毛泽东:有理,有利,有节-张大Ant.md: -------------------------------------------------------------------------------- 1 | “有理、有利、有节”是毛泽东在《目前抗日统一战线中的策略问题》中提出的对敌战争“三原则”。 2 | 3 | 今天,重提这“三原则”仍不为过。无论为人,还是处事;无论工作,还是生活,均有现实指导意义。 4 | 5 | * 有理,即自卫原则:人不犯我,我不犯人,人若犯我,我必犯人。 6 | 7 | * 有利,即胜利原则:不斗则已,斗则必胜,不搞无把握的斗争。 8 | 9 | * 有节,即休战原则:决不无止境地斗下去,要有节制,有利再战。 10 | 11 | “有理、有利、有节”是一种大气的处事之道,不拘小节,方可张驰有度;是一种理性思维,头脑清醒,方能步步为营;是一种感性情绪,拥有斗志,方显满怀激情;是一种战术,讲究策略,方行胜利之途;是一种为人气质,不盲进,亦不无原则退缩;不剑拨弩张,亦不停止不前。 12 | 13 | 分析三词,各自蕴含着深刻道理。 14 | 15 | **有理**。“中庸之道”是中国人惯常的处事哲学。**在团队里,“有理”的先决条件是“和平共处”,不搞小团体,不咄咄逼人**,这样的人才有亲和力,才会为自己形成一个气场。红楼梦中的林黛玉,虽说性情,但是过于尖刻,不饶人,所以,在大观园内,其人际关系远不如宝姐姐处得和谐。但是,“温良贤恭”也要有底线。当你的谦和,换来的是别人的得寸进尺、利益侵占时,就要竖起身上的刺,发起反击。用言行告诉他:不要以为我不说话,就是好说话。一个人不懂得如何保护自己,就如同树没有根基。所以,**做人要温而有度,硬而有方**。 16 | 17 | **有利**。成大事者,多为善思善谋之人。**若想成事,一是要做,二是要做好**。具体而言,要有斗志,该争取时亦争取,该努力时亦努力,不要无谓的松懈,为自己找足放松的理由、不思进取的借口。但是,前进不是冒进。**做任何一件事都要有目标,有规划,不仅做正确的事,还要正确做事**。草率行事,盲目工作的结果,不是事倍功半,就是以失败告终。以品牌培育为例,长青业绩,需要百年品牌。缺乏统筹规划,盲目前进的结果,将是错失商机,满盘皆输。 18 | 19 | **有节**。要学会总结。企业规划、人生规划,都是预期的、未来的,具有不确定性。因此,**做事,要善于适时修整、总结,找不足,寻差距,想对策,拉近与成功的距离;做人,要懂得时常停下脚步,不断地自我警醒,不停地自我评价,给自己一个冷静思考、校枉过正的机会,让人格更加完善**。 20 | 21 | 一个“有理、有利、有节”的人,是一个理性中含着感性,执重里充满张力的人;是**一个低调做人,潜心做事的人**。生活中,不乏这样两种人:一种是雷声大雨点小,先声夺人。从事一项工作,开始时豪情满怀,渐渐地疲于应付,到最后不了了之。对此类人而言,“执之以恒”是一剂治疗良方。一种是不懂得“停顿”,一直“拉满弓”。 22 | 23 | 激烈的社会竞争压力下,让多数人处在极度紧张的生活状态之中。精神焦虑、抑郁,甚至“过劳死”等一些病症成为职业白领的精神杀手。如今,社会流行一种“慢生活”,讲究的就是“有节”,不是不工作,而是换种状态,更好地去工作。 24 | 25 | 工作也好,生活也罢。**做到“有理、有利、有节”,就掌握了“化有形为无形”的生存秘籍,就会拥有良好的人际关系、舒心的工作状态、愉悦的生活氛围**。 -------------------------------------------------------------------------------- /Share/201902W5/如何生成Gitbook-ZmJ.md: -------------------------------------------------------------------------------- 1 | 为了能更方便的浏览各位大佬每周写的文章,又因为我们的项目构成都是md格式文件,所以就有了这个[ARTS-GitBook页面](www.wzmmmmj.com/ARTS) 2 | 3 | 这里介绍下我们`ARTS-Gitbook`是如何生成的 4 | 5 | ### 1. gitbook install 6 | 7 | 因为gitbook需要使用npm进行安装,所以需要本地先装有node.js,然后 8 | 9 | ```bash 10 | npm install -g gitbook-cli 11 | ``` 12 | 13 | 可通过 `gitbook --verison`查看是否安装成功 14 | 15 | ### 2. gitbook init 16 | 17 | 通过`gitbook init`可以初始化项目,生成`README.md` 和 `SUMMARY.md`两个必须的文件 18 | 19 | README.md 是对书籍的简单介绍, 而SUMMARY.md就是gitbook的关键文件,在页面是显示的目录结构就是由这个文件中的结构生成的。结构大致如下。 20 | 21 | ```markdown 22 | * [Chapter1](chapter1/README.md) 23 | * [Section1.1](chapter1/section1.1.md) 24 | * [Section1.2](chapter1/section1.2.md) 25 | * [Chapter2](chapter2/README.md) 26 | ``` 27 | 28 | 因为显示的效果是根据SUMMARY.md 生成的,所以这个文件十分关键 29 | 30 | ### 3. gitbook serve 31 | 32 | 写好SUMMARY.md后,我们可以通过`gitbook serve`本地起服务查看,页面效果,如果效果有问题,说明我们的`SUMMARY.md`文件有些问题。 33 | 34 | 35 | 36 | ### 4. 渲染静态页面 37 | 38 | > 这里贪图方便, 我使用github来渲染静态页面,不过gitbook的样式比较好看。 39 | 40 | 首先在我们项目下新建分支 `gh-pages`,不过前提是github上有项目名为`.github.io`的项目,没有则新建一个,因为最终我们需要使用github提供的静态页面渲染 41 | 42 | 在`gh-pages`分支上进行`gitbook build`,根据`SUMMARY.md`文件生成静态文件, 或者`gitbook serve`看看效果。 43 | 44 | 如果效果满意,我们将分支推到自己仓库即可。最后我们通过路径`.github.io/ARTS`查看生成的gitbook页面 -------------------------------------------------------------------------------- /Share/201902W5/测试工作的一些感想-Leo.md: -------------------------------------------------------------------------------- 1 | 这两周做了挺多测试工作,因为项目 beta 版本发布,加班赶任务,调用组内资源进行测试,以下仅仅是从我的感受出发,比较片面。 2 | 3 | 之前听说测试要求没那么高,其实做了一周多下来,我觉得也需要很多技巧,只是重复性的工作多一些,并且我觉得测试比开发还累。 4 | 5 | 技巧在于如果利用好工具,提高测试的效率,并且要学会如何管理及思考测试用例,对于数量较少的用例比较好管理,但是数量多起来,如何才能有效利用测试用例给出结果。 6 | 7 | 如何构造各种用例的场景,覆盖所有用例? 8 | 9 | 如何在一种场景下,覆盖多个用例? 10 | 11 | 如何避免开发版本不稳定,减少 block 测试的情况? 12 | 13 | 如何利用身边的开发资源,以及自己的开发能力,进行自动化测试? 14 | 15 | 在项目紧的情况下,测试会受限于开发,必须等开发将任务完成,才能进行测试,大多数情况下通过加班来完成任务,否则就会 delay。 16 | 17 | 还得学会如何减少做重复性的工作,锻炼耐心。 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Share/201902W5/连岳文章《我们要成为特别优秀的人吗?》有感-lingyunG.md: -------------------------------------------------------------------------------- 1 | 今早阅读了连岳的文章,感触很深。 这是文章的链接:https://mp.weixin.qq.com/s/9XcusxV1WjaWwi67q1TeHw。 2 | 3 | 其实每个人都想成为最好的那一个,但是有时候因为某些客观或者主观的原因,我没办法做到一定以后就是巴菲特或者比尔盖茨之类的人物。 我有时候要做的是,越早认识到自己是普通人,只有老老实实的努力才会越过越好。早点明白这个道理,早点静下心来,认真学习。多交流,不要封闭自己。 4 | -------------------------------------------------------------------------------- /Share/201903W1/Java开发手册之命名规约-落英坠露.md: -------------------------------------------------------------------------------- 1 | 摘自《码出高效:Java开发手册》,非常好的一本书,推荐阅读。 2 | 3 | ### 命名规约 4 | 5 | 为了统一代码风格,元素的命名要遵守以下约定: 6 | 7 | 1. 命名符合本语言特性 8 | 2. 命名体现代码元素特征 9 | 3. 命名最好望文知义 10 | 11 | 具体的规范: 12 | 13 | - 类名采用大驼峰形式,一般为名词,如 StringBuffer;方法名采用小驼峰形式,一般为动词,与参数组成动宾结构,如 append(String)。 14 | - 变量包括参数、成员变量、局部变量等,也采用小驼峰形式,如 name;常量的字母全部大写,单词之间用下划线连接,如 MAX_COUNT。 15 | - 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英文单词。 16 | - 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以 Test 结尾。 17 | - 类型与中括号紧挨相连来定义数组,如 int[] array。 18 | - 枚举类名带上 Enum 后缀,枚举成员名称需要全部大写,单词间用下划线隔开。 19 | 20 | #### 常量 21 | 22 | 常量是在作用域内保持不变的值,一般用 final 关键字进行修饰。全局常量是指类的公开静态属性,使用 public static final 修饰;类内常量是私有静态属性,使用 private static final 修饰,局部常量分为方法常量和参数常量,前者是在方法或代码块内定义的常量,后者是在定义形式参数时,增加 final 标识,表示此参数值不能被修改。全局常量和类内常量是最主要的常量表现形式,它们的命名方式比较特殊,采用字母全部大写、单词之间加下画线的方式。而局部常量采用小驼峰形式即可。 23 | 24 | 魔法值即「共识层面 」上的常量,直接以具体的数值或者字符出现在代码中。这些不知所云的魔法值极大地影响了代码的可读性和可维护性。 25 | 26 | 即使类内常量和局部常量当前只使用一次,也需要赋予一个有意义的名称,目的有两个: 第一、望文知义,方便理解;第二、后期多次使用时能够保证值出同源。因此,无论如何都不允许任何魔法值直接出现在代码中,避免魔法值随意使用导致取值不一致,特别是对于字符串常量来说,应避免没有预先定义,就直接使用魔法值。 27 | 28 | #### 变量 29 | 30 | 从广义来说,在程序中变量是一切通过分配内存并赋值的量,分为不可变量「常量」和可变变量。从狭义来说,变量仅指在程序运行过程中可以改变其值的量,包括成员变量和局部可变变量等。 31 | 32 | 一般情况下,变量的命名需要满足小驼峰格式,命名体现业务含义即可。存在一种特殊情况,在定义类成员变量时,特别是在 POJO 类中,针对布尔类型的变量,命名不要加 is 前缀,否则部分框架解析会引起序列化错误。 -------------------------------------------------------------------------------- /Share/201903W1/分享一些自己喜欢的公众号-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 3 | 在这个网络发达的时代,从不匮乏获取信息的渠道. 信息来源的渠道多种多样,任何你想学的知识,想知道的事情,只要去搜索一下便能查找出来。不过当选择很多的时候,反而很难做选择。对于我来说,信息渠道太多容易引起我的焦虑,我仍然觉得自己还是要静下心来,朝着自己的目标逐渐地前进。这里,我并不是说两耳不闻窗外事,也不是不和人交流,而是不要让海量的信息阻碍你的判断,别让他们贩卖的焦虑打乱自己前进的步伐。我想记录一下我喜欢的公众号,出来工作5年了,有些事情也是近两年才明白过来。 有些是自己经历的,也有一些是优秀的公众号告诉我的。不管怎么样,我只有珍惜当下,好好打造未来才会让自己过得越来越好,把过去的不完美当成是自己的机遇。 4 | 5 | 公众号:连岳 6 | 这是我很喜欢的一个公众号。我从连岳老师的公号学到了很多,人生,感情,也许也是因为那时候正好是在经历的过程中,所以才会特别感同身受。努力认真的过每一天,不要让真正爱自己的人失望,要活出自己的精彩。 7 | 8 | 公众号:会读书的人 9 | 这是一个推荐书的公众号。公众号推书人饭饭写的文章风趣幽默,我从她那里知道了很多很好的书以及作者。有理财类的书,比如《小狗钱钱》,《经济学的思维》,有关于人生态度的书吴军老师的《见识》,书的种类很多,身为上班族的我都看不过来。其实推荐书的公众号很多,挑一个合适自己的就好了。 10 | 11 | 公众号:深蓝保 12 | 有一段时间,我很想学习保险知识,一个保险行业的朋友给我推荐了这个公众号。公众号的作者原来是在腾讯工作,后面因为看好保险行业,并出来自己创业从事保险行业。从他和连岳的文章中,我知道写作其实是一件很累的事情,但是他们都热爱自己的工作,认可自己的工作,所以他们甘之如饴。昨天深蓝保君还写到: 13 | > 一个人是努力的工作,还是努力地应付,其他人是可以很容易感受到的。这个世界变化很快,无论是企业还是个人,都需要不断的迭代和提高,才不会被时代所抛弃。如果无精打采的应付这个时间,也许世界也会这样应付我们。 14 | 15 | 工作和职业相关的公众号:Aws云计算,Java知音,大飞码字,码农翻身,字节流 16 | 这些公众号都是有相见恨晚的感觉,要是早点知道,那我在职业发展上的思考会更早做打算。所以多和比自己优秀的人交流是一件特别好的事情,自己从来没注意过的点在和他们聊天的过程中或者是参与到他们举办的活动中,都在不经意间被他们点醒。所以我不能只是满足于埋头工作,不要封闭自己,从无到有逐渐扩宽自己的圈子和影响力。 17 | -------------------------------------------------------------------------------- /Share/201903W1/闭包-漠野.md: -------------------------------------------------------------------------------- 1 | # 闭包—访问函数内部 2 | 3 | ## 什么是闭包 4 | 5 | ​ 专业文献对闭包的定义十分的抽象,在应用时的理解来说,闭包是能读取其他函数内部变量的函数。不同的编程语言(Java,Python,Golang,JavaScript,Ruby,PHP等)对闭包有着不同程度的支持。 6 | 7 | ## 闭包的主要作用 8 | 9 | * 访问其他函数内部 10 | * 是函数中的变量保持在内存中 11 | 12 | ## 闭包的简单实现 13 | 14 | ```go 15 | // 定义计时数器函数 16 | func timer() func() int { 17 | times := 0 18 | return func () int { 19 | times += 1 20 | return times 21 | } 22 | } 23 | 24 | func main(){ 25 | // _timer 实际是一个可以访问timer内部的函数,可以操作其作用域内的变量 26 | _timer := timer() 27 | for i:=0; i<10; i++ { 28 | // 每次使timer内的变量自增1 29 | println(_timer()) 30 | } 31 | } 32 | ``` 33 | 34 | ## 闭包与普通函数的对比 35 | 36 | ​ 普通函数执行完后,系统自动回收函数执行所占用的空间,函数作用域内的变量无法长久停留在内存当中,使用闭包可以完成这一需求,但是由于函数长期位于内存中,注意不能滥用闭包,会占用过多的内存导致程序性能下降。 37 | 38 | ## 使用闭包需要注意的问题 39 | 40 | ​ 如上例,我们取得`_timer`时,并不会立即执行函数,而是使用`_timer()`时才执行。另一点,返回的函数中所引用的值,会返回其最终状态,当使用闭包数组时需注意变量的引用。 41 | 42 | ## 闭包练习 43 | 44 | 使用闭包打印斐波那契数列 45 | 46 | ```go 47 | func process() func() int { 48 | num1, num2 := 0, 1 49 | return func() int { 50 | tmp := num1 51 | num1, num2 = num2, num1 + num2 52 | return tmp 53 | } 54 | } 55 | 56 | func main() { 57 | _process := process() 58 | for i := 0; i < 10; i++ { 59 | print(_process(), " ") 60 | } 61 | } 62 | ``` 63 | 64 | -------------------------------------------------------------------------------- /Share/201903W2/windows下的Linux环境-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## Windows下的Linux子系统 2 | 3 | 最近折腾了一下家里闲置的windows笔记本,对于一般编程人员来说,windows机器显然不够友好。 4 | 5 | 不过好在某一系统版本后的windows,有了Linux子系统,可以打开一个原生的Linux terminal,而不是像`gitbash`,这种类*nix环境。 6 | 7 | > 具体方法查看链接,如果升级系统版本失败,可以使用windows易升 8 | 9 | https://blog.csdn.net/zhouzme/article/details/78780479 10 | 11 | 最后再介绍一个好看的终端 **[Hyper](https://hyper.is/)**,~~虽然没有iTerm好用~~,可通过更改配置,安装插件提升美观。 12 | 13 | -------------------------------------------------------------------------------- /Share/201903W2/亏格理解-yanglei094121.md: -------------------------------------------------------------------------------- 1 | # 第八周 Share 2 | ## 亏格理解 3 | 亏格是代数几何与代数拓扑中的一些概念,由于实习使用到了相关知识,所以在这里做一个总结;
4 | 整理于https://blog.csdn.net/weixin_40758748/article/details/88417455 -------------------------------------------------------------------------------- /Share/201903W2/公务员招聘要求-YuanCome.md: -------------------------------------------------------------------------------- 1 | > 一位准备考公务员的发小在我们的小群里发了2019年招录公务员职位表,虽然自己没有考公务员的打算但是作为参考。 2 | 3 | #### 整体要求提高 4 | 我记得从去年开始,国考的岗位一直在减少,直接导致了很多岗位报录比达到上千:1,最高甚至达到了4040:1的程度。据我了解,4040:1的岗位其实也未必是我们想象中的福利岗位,只是相对于当地来说是个比较舒适、轻松的岗位。 5 | 6 | 在看看职位表中一些职位的要求,大专水平的岗位很少,即使有,大多都要求要在所在乡镇工作5年以上。而一些本科以上的岗位却很少有这种要求,间接反映了公务员招聘要求开始逐渐提高。 7 | 8 | #### 抢人政策愈发激烈 9 | 就我家的政策而言,研究生落户工作,享有很多福利,买房X折,住房补贴等等,博士落户工作,甚至直接送房。虽然在小乡镇里,房价不比大城市高,但是在这几年房地产快速发展的今天,小乡镇的房价也不是当地普通人能够接受的。由此看出,在三四线城市,优秀人才极其紧缺。 10 | 11 | #### 个人感觉 12 | 如果没有太高的能力,即使是在我们看起来的铁饭碗行业也是难以舒适。当你的能力达到一定程度,在大城市却显得普普通通时,适当考虑三四线城市,也未必不是个好选择。 -------------------------------------------------------------------------------- /Share/201903W2/深入理解java虚拟机-lingyunG.md: -------------------------------------------------------------------------------- 1 | 最近在阅读《深入理解java虚拟机:jvm高级特性与最佳实践》,担心有些地方自己记不住,所以做一些读书笔记以供自己日后查阅。 2 | 3 | Java 虚拟机运行时数据区 4 | 5 | 1 程序计数器 6 | 7 | 1)记录当前所执行的字节码的行号指示器 8 | 9 | 2)唯一一个在java虚拟机中没有规定OutOfMemoryError情况的区域 10 | 11 | 2 Java虚拟机栈 12 | 13 | 1)这部分存储和程序计数器一样是线程私有 14 | 15 | 2)用于存储局部变量,操作数栈,动态链接,方法出口等信息 16 | 17 | 3)会抛出StackOverFlowError 和 OutOfMemoryError异常信息 18 | 19 | 3 本地方法栈 20 | 21 | 1)与虚拟机栈一样,只不过它调用的是本地native方法 22 | 23 | 2)会抛出StackOverFlowError 和 OutOfMemoryError异常信息 24 | 25 | 4 Java堆 26 | 27 | 1)Java虚拟机所管理的内存中最大的一块 28 | 29 | 2)垃圾收集器管理的主要区域 30 | 31 | 3)各个线程共享的内存区域 32 | 33 | 5 方法区 34 | 35 | 1)运行时常量池是方法区的一部分 36 | 37 | 2)各个线程共享的区域 38 | 39 | 3)会抛出OutOfMemory异常 -------------------------------------------------------------------------------- /Share/201903W3/《智能时代》书摘-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 3 | 最近在阅读吴军老师的《智能时代》,这一书讲述大数据和人工智能如何定义未来。我在阅读到思维的革命这一章时候觉得很有必要给自己写一个读书笔记,吴军老师在很多他自己的书中都强调了思维的重要性,比如《见识》,《我的大学之路》。思维和观念落后的人总是无法在命运的长跑中取胜。 4 | 5 | 这是吴军老师在书中谈到对这两种思维的看法: 6 | 很多时候,落后与先进的差距,不是购买些机器或者引进一些技术就能够弥补的,落后最可怕的地方就是思维方式的落后。西方在近代走在了世界前列,很大程度上靠的是思维方式全面领先。 7 | 8 | 机械思维曾经是改变了人类工作方式的革命性的方法论,并且在工业革命和后来在全球工业化的过程中起到了决定性的作用,今天它在很多地方依然能指导我们的行动。如果我们能够找到确定性(或者可预测性)和因果关系,这依然是最好的结果。但是,我们今天面临的复杂情况,已经不是机械时代用几个定律就能讲清楚的了,不确定性,或者说难以找到确定性,是今天社会的常态。在无法确定因果关系时,数据为我们提供了解决问题的新方法,数据中所包含的信息可以帮助我们消除不确定性,而数据之间的相关性,在某种程度上可以取代原来的因果关系,帮助我们得到我们想知道的答案,这便是大数据思维的核心。大数据思维和原有机械思维并非完全对立,它更多的是对后者的补充。在新的时代,一定需要新的方法论,也一定会产生新的方法论。 -------------------------------------------------------------------------------- /Share/201903W4/哈希算法的应用续-starichat.md: -------------------------------------------------------------------------------- 1 | 如今分布式技术发展的很成熟,应用也很广泛。web方面的岗位也基本都会问到分布式的问题。那么今天的哈希算法也正好就是用来解决分布式问题。 2 | 3 | ## 1.负载均衡 4 | 什么是负载均衡,这里有一篇很详细的介绍文章。[什么是负载均衡](https://zhuanlan.zhihu.com/p/32841479) 5 | 6 | 负载均衡的实现方式有很多种: 7 | 1.重定向:将请求全部发送到前置机,由前置机通过算法得到要分配给那台应用服务器,然后响应给客户端,由客户端重定向到应用服务器的一种方式。 8 | 2.反向代理:通过在前置机,使用反向代理的方式,将请求分发到应用服务器,客户端无需再请求一次,实现方式通常有两种,一种是用交换机实现,还有一种是用ngnix实现。 9 | 3.数据链路返回 10 | 这种方式,通过给应用服务器设置虚拟ip,然后通过修改mac地址的方式,将请求分发出去,而应用服务器收到请求后,可以直接响应给客户端,而不需要经过前置机。 11 | 12 | 负载均衡的算法有很多,有轮询,随机,加权轮询等。如何才能实现一个会话粘滞的负载均衡的算法?也就是说,在同一个客户端上,在一次会话中的所有请求都路由到服务器上。 13 | 14 | 最直接的方法就是,维护一张映射关系表,这张表的内容是客户端IP地址或者会话ID与服务器编号的映射关系。客户端发出的每次请求,都要现在映射表中查找对应路由到服务器编号,然后再请求编号对应的服务器。这种方法简单直观,但也有好多弊端。 15 | 16 | - 如果客户端很多,映射表可能会很大,比较浪费内存空间。 17 | - 客户端下线,上线,服务器扩容,缩容都会导致映射失效,这样维护映射表的成本就会很大 18 | 19 | 如果借助哈希算法,这些问题可以被解决。通过哈西算法,对客户端ip地址或者会话id计算哈希值,将取得哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到服务器编号。 20 | 21 | ## 2.数据分片 22 | 哈希算法可以用于数据分片。 23 | 1.如何统计“搜索关键词”出现的次数? 24 | 假如我们有很大的日志文件,这里面记录了用户的搜索关键词,我们想要快速统计出每个关键词被搜索的次数,该怎么做呢? 25 | 26 | 主要有两个难点: 27 | - 搜索日志很大,没法放到一台机器的内存中 28 | - 如果只用一台机器看来处理这么巨大的数据,处理时间会很长。 29 | 30 | 针对以上难点,我们对数据进行分片,然后采用多台机器处理的方法,来提高处理速度。具体的思路是这样的:为了提高处理的速度,我们用n台机器并行处理。我们从搜索记录的日志文件中,依次读出每个搜索关键词,并且通过哈希函数计算哈希值,然后再根 n 取模,最终得到的值,就是应该被分配到的机器编号。 31 | 32 | 这样,哈希值相同的搜索关键词就被分配到了同一个机器上。每个机器会分别计算关键词出现的次数,最后合并起来就是最终的结果。 33 | 34 | ### 如何快速判断图片是否在图库中。 35 | 如何快速判断图片是否在图库中?上一节我们讲过这个例子,不知道你还记得吗?当时我介绍了一种方法,即给每个图片取唯一标识,然后构建散列表。 36 | 37 | 假设现在我们图库中有一亿张图片,很显然,在单台机器的内存有限,而一亿张图片构建散列表显然远远超过了单台机器的内存上线。 38 | 39 | 解决方案:我们对数据进行分片,然后采用多机处理,让每台机器只维护一部分图片对应的散列表。我们每次从图库中读取一张图片计算唯一标识,然后与机器数求余取模,得到的值就是要分配的机器编号。然后将这个图片的唯一标识和图片路径发往对应的机器构建散列表。 40 | 41 | 42 | -------------------------------------------------------------------------------- /Share/201904W1/从女码农到女leader的忐忑之路-lingyunG.md: -------------------------------------------------------------------------------- 1 | 很开心读到了一篇关于女码农升级打怪的[文章](https://mp.weixin.qq.com/s/9M0BEp6kCBYXQ2cu5ynGrQ), 第一次读到了女技术leader写的关于程序员成长的文章,处于迷茫期的我收益良多。也许是因为经历很多事情,别人才会更清楚自己想要什么,该怎么做规划。文章中有两点我印象深刻,一是她刚开始工作时在团队中不断成长的历程,二是她提到未来需要的人才是复合型人才,而不仅仅是在技术上面很强大的人。 2 | 3 | 团队中不断成长的经历 4 | 初入职场的女码农用踏实认真赢得认可,在工作中遇到听不懂的名词都会记录下来,不懂的问题自己先自己解决。解决不了的问题也要出自己的一个方案,不要一股脑直接去问别人这个该怎么做。其次也要不断地思考自己对团队的价值,哪怕是团队里的CFO都是在体现你的价值。她在文中也提到,在对项目熟悉之后,对于一直做“杂活”,心中也是会有不少怨念,这时候要思考自己该做点什么去改进自己现在手头上的工作有什么可以改进的地方,这个改进的地方对于整个大的工作流程可以有什么帮助。慢慢团队成员才会认可你的价值。 5 | 6 | 做了码农,发现自己做不了技术大牛怎么办? 7 | 工作中慢慢发现自己对技术并没那么狂热而且不管怎么努力都没办法成为技术大神,这时候不要怕,因为技术并不是码农的全部。码农在工作中除了有技术思维,还需要有工程思维,业务思维,产品思维。码农的价值不再是死磕某个技术难点,而是使用技术手段去解决业务痛点。 8 | 9 | 总结 10 | 1 不要为一时的得失计较,填坑是一种重要的能力 11 | 2 绝大多数人一开始都没想清楚自己要去哪里,都是一边做,一边看到自己更多的可能 12 | 3 成功才是成功之母,职场中永远想清楚自己的优势,成长就是将自己的优势最大化的过程 13 | 4 你的价值由别人决定,看你能给别人带来什么 14 | 5 码农并不是男性专场,更不是技术大咖专场。每个队技术敬畏,对互联网热爱的人,都会有自己的舞台 -------------------------------------------------------------------------------- /Share/201904W2/左耳听风的专栏有感-lingyunG.md: -------------------------------------------------------------------------------- 1 | 因为面试的原因知识付费买了陈皓的专栏,感觉很后悔没有早点遇上专栏,也后悔自己没有早点下定决心要做一个很好的程序员。我应该想清楚自己的状况, 2 | 不要到处摇摆,总是担心这担心那,实际上我没有很多选择可以选。总要在程序员这条路上死磕到一定阶段我才有希望。 3 | 4 | 皓子叔一再强调基础知识的重要性,技术更新变化太快,只有洞悉原理,理解技术的本质才能上手快。所以他建议程序员重视基础的学习,把基础搞明白,扩 5 | 宽自己的视野,提高自己的本事才会越来越好。以下是他给出的建议: 6 | 1 基础知识:计算机系统,操作系统,网络协议,数据结构和算法,编程范式, 7 | 2 提高沟通能力 8 | 3 坚持ARTS 9 | 10 | 前方的道路还很长,有些知识是需要用一生去理解的,不同的阶段对知识的理解不一样。这注定不是一条容易走的路,所以要特别努力才可以。不要偷懒,不 11 | 要放弃。 -------------------------------------------------------------------------------- /Share/201904W3/懒加载方式的使用-starichat.md: -------------------------------------------------------------------------------- 1 | # 懒加载 2 | 网页开发时,因为服务器加载的数据可能过大,但是用户界面只能显示那么多,所以没必要等待全部加载完才开始显示,这样会显示速度变卡。 3 | 4 | 懒加载:延迟加载,对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的内容而不是一次性加载所有内容,当需要显示的时候再发送请求,避免打开网页时加载过多资源。 5 | 6 | 实现方式 7 | 方式一 : 使用scrollTop/innerHeight/offsetTop 8 | window.innerHeight:浏览器可视区域高度 9 | document.body.scrollTop || document.documentElement.scrollTop:浏览器滚动条滚过高度 10 | img.offsetTop:元素距文档顶部的高度 11 | 12 | 加载条件: 13 | img.offsetTop 14 | 15 | 方法二:使用IntersectionObserver方法 16 | 基本知识: 17 | var io = new IntersectionObserver(callback, option); 18 | 19 | //开始观察 20 | io.observe(document.getElementById('example')); 21 | 22 | //停止观察 23 | io.unobserve(element); 24 | 25 | // 关闭观察器 26 | io.disconnect(); 27 | 28 | 其中,callback是可见性变化时的回调函数,option是配置对象。这个构造函数的返回值是一个观察器实例。构造函数的返回值是一个观察器实例,实例的observe方法可以指定观察哪个DOM节点。 29 | 30 | observer的参数是一个DOM节点对象。如果要观察多个节点,就要多次调用这个方法。 31 | callback函数的参数是一个数组,每个成员都是一个IntersectionObserverEntry对象。 -------------------------------------------------------------------------------- /Share/201904W3/耗子叔对996的看法-落英坠露.md: -------------------------------------------------------------------------------- 1 | 读完 [左耳朵耗子:996不是福气,努力也未必成功](https://coolshell.cn/articles/19271.html) 深有感触。最近工作上遇到类似的事,产品经理不懂得优化,一直让开发做些低级重复性的本该由其他人做的事,还是用手动像机械一样操作。程序员本该用代码解脱双手,最后搞得这么低效。 2 | 3 | 再次重复一次耗子叔的金句: 4 | 5 | **我们学计算机当程序员最大的福气不是可以到大公司里加班和996,而是我们生活在了第三次工业革命的信息化时代,这才是最大的福气,所以,我们应该努力地提升自己,而不是把自己当劳动力一样的卖了!在这样的一个时代,你要做的不是通过加班和拼命来跪着挣钱,而是通过技能来躺着挣钱……** -------------------------------------------------------------------------------- /Share/201904W3/职场上你的态度真的摆正了吗-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 3 | 我常喜欢听别人讲述TA的经历以及感悟,这样我会反思我自己。在待人处事方面漏了什么,在对待工作的态度上是不是有哪些方面不对, 4 | 与自己的目标比,缺失了些什么。反省自己的过程不是很舒服,自我否定比较严重的话会丧失信心,所以我得明确一个目的,反思是为了 5 | 更好的前进,而不是把自己批得一无是处,最后丧失了前进的信心。昨天阅读了公众号“中年码农那些事”里的几篇文章,有几个观点想记 6 | 录下来,以便提醒自己。 7 | 8 | 你的价值由别人决定 9 | 10 | 在职场上不要太把自己当回事,不要自认为自己很重要。评判自己是否重要,价值是否足够高是在于你对他人的帮助和他们对你的认可, 11 | 只有在团队中成为他人心中可以解决问题的人才是真正有价值。这个价值不在于你技术多厉害,而在于你可以为团队做多少事。你的重要 12 | 性并不在于你觉得,而是在于他人觉得。所以要摆正自己的心态,努力获得团队的认可。 13 | 14 | 技术不是码农的全部 15 | 16 | 我现在想清楚自己并不是一个技术狂人,不是那种造轮子的人。我的目标是用好这些技术,理解其使用的业务场景,将其用于工作中,我不 17 | 会因为学习技术而忽略其它技能的学习。 18 | 19 | 你能依靠的只有你自己 20 | 21 | 其实每个人最终能依靠的只有自己,不要总是祈求获得别人的爱,爱自己,在自己孤独脆弱的时候用自己强大的内心去温暖自己。 22 | 23 | 职场人最重要的一个能力-close一件事的能力 24 | 25 | 有时候查bug时,总是急于证明这不是由自己造成的,然后就不再管它。真正正确的做法是,在你这里把它解决掉,不要让它再出现。只有 26 | 坚持这样做了才会成为别人认为可以依靠的对象。 27 | 28 | -------------------------------------------------------------------------------- /Share/201904W4/单例模式-HardJ.md: -------------------------------------------------------------------------------- 1 | ## 单例模式 2 | 3 | ​ 单例模式又称为单件模式,确保一个类只有一个实例,提供全局访问点。是Java中比较常用的一种模式。写起来也比较容易。 4 | 5 | ​ 以下是几种Java实现的单例模式 6 | 7 | 1. 懒汉模式 8 | 9 | ```java 10 | private volatile static Singleton singleton; 11 | 12 | private Singleton(){} 13 | 14 | public static Singleton getSingleton() { 15 | if(singleton == null) { 16 | synchronized (Singleton.class) { 17 | if(singleton == null){ 18 | singleton = new Singleton(); 19 | } 20 | } 21 | } 22 | return singleton; 23 | } 24 | ``` 25 | 26 | 2. 饿汉模式 27 | ```java 28 | private static Singleton singleton = new Singleton(); 29 | 30 | private Singleton(){} 31 | 32 | public static Singleton getSingleton() { 33 | return singleton; 34 | } 35 | ``` 36 | 37 | 3. 饿汉模式 38 | 39 | ```java 40 | private Singleton(){} 41 | 42 | private static class Instance{ 43 | private static final Singleton SINGLETON = new Singleton(); 44 | } 45 | 46 | public static Singleton getSingleton() { 47 | return Instance.SINGLETON; 48 | } 49 | ``` 50 | 51 | 4. 枚举 52 | ```java 53 | public enum SingletonEnum { 54 | INSTANCE; 55 | } 56 | ``` 57 | 58 | 5. CAS(引用:) 59 | ```java 60 | private static final AtomicReference INSTANCE = new AtomicReference<>(); 61 | 62 | private Singleton(){} 63 | 64 | public static Singleton getSingleton() { 65 | while (true) { 66 | Singleton singleton = INSTANCE.get(); 67 | 68 | if(singleton != null) { 69 | return singleton; 70 | } 71 | 72 | singleton = new Singleton(); 73 | if(INSTANCE.compareAndSet(null, singleton)) { 74 | return INSTANCE.get(); 75 | } 76 | 77 | } 78 | } 79 | ``` -------------------------------------------------------------------------------- /Share/201904W4/向前一步-lingyunG.md: -------------------------------------------------------------------------------- 1 | 前言 2 | 这几天在阅读谢丽尔的《向前一步》,这是一本讲女性在职业发展上会出现的一些问题,现在刚读完一半,却觉得受益良多。 3 | 谢丽尔在书中提到了女性愿意上升到公司搞成的愿望没有男性的多,这很多时候在于女性对自己不够自信,总是想着等自己 4 | 所有的一切都准备好了才考虑去争取一个机会。书读到此,让我记忆深刻的有两点。一是大胆尝试现今自己觉得不能胜任的 5 | 岗位,二是要脱颖而出,这样才会遇到好的导师。 6 | 7 | 一 大胆尝试现今自己不能胜任的岗位 8 | 许多人都觉得要自己能力100%准备好了才能去申请职别更高的岗位和尝试一个有挑战性的工作,但其实我们真正要做的是如 9 | 何做到快速学习做好一件事的能力,而不是默默地一直准备到自己能力ok了才去尝试,这种时间机会往往不会到自己身上。 10 | 11 | 二 脱颖而出,遇到好的导师 12 | 在人生的道路上,遇到好的导师是一件非常幸运的事情。但谢丽尔指出,不要总想着找一个导师让你人生从此越走越顺,而是 13 | 努力脱颖而出,让好的导师看到你,这样才有机会。 14 | 15 | 总结 16 | 人生道路上,只有自己才能真正帮到自己,不要总是祈求别人帮你度过难关,只有自己度过难关之后,才会脱颖而出,让别人看 17 | 到自己的潜力。 18 | 19 | 20 | -------------------------------------------------------------------------------- /Share/201905W1/Java程序员都该知道的5个SpringBoot特性-lingyunG.md: -------------------------------------------------------------------------------- 1 | 最近在学习SpringBoot,学了是要会用,不会用的话其实是白学了。现在的学习怎么都会带有些功利性,学了没用的话 2 | 就无法坚持下去。在学习的过程中,零零散散的做一些笔记,记录下来,等学完之后再复盘整理。 3 | 4 | 先把SpringBoot的5个特性记录下来: 5 | 1 AutoConfiguration 6 | 2 Starter POMS 7 | 3 Spring Boot CLI 8 | 4 Actuator 9 | 5 Spring Boot Initializer -------------------------------------------------------------------------------- /Share/201905W2/面试有感-lingyunG.md: -------------------------------------------------------------------------------- 1 | 昨天想出门去参加一个行业会议,可是没有找到路,瞎走了半天把脚磨出了一个水泡。最后还得坐一趟公交车去到地铁站坐地铁去公司加班。 2 | 在去公司的路上想了很多。 3 | 4 | 觉得自己好渺小,力量好弱。许多事情由不得自己把握,我的性格注定要吃很多亏。原来以为有一份工作,每天都努力认真工作工资也会慢慢 5 | 提高,也可以慢慢到达职业上想要的高度。现在才明白,其实不是这样的,快乐轻松的工作氛围下其实也有竞争。只是我一直不明白,还以为 6 | 随着时间的推移我也可以。突然就清醒过来了。 7 | 8 | 出去面试的时候也发现了自己的不足,每个人的悟性真是不一样。有些人三年就能成长很多,想不明白自己为什么总是懵懵懂懂。难道是因为 9 | 前期太顺的原因吗?无论是进银行还是换了工作来深圳也是这样,总觉得自己很优秀,别人能做到的事情自己也能做到。结果被现实打脸,也好 10 | 清醒总比糊涂好。 11 | 12 | 只能以后加油。 -------------------------------------------------------------------------------- /Share/201906W1/计算机网络第二章-lingyunG.md: -------------------------------------------------------------------------------- 1 | https://www.jianshu.com/writer#/notebooks/37360338/notes/47962187 -------------------------------------------------------------------------------- /Share/201906W2/计算机网络第三章运输层协议-lingyunG.md: -------------------------------------------------------------------------------- 1 | https://www.jianshu.com/p/115b70040f64 -------------------------------------------------------------------------------- /Share/201907W1/MySQL安装和使用-lingyunG.md: -------------------------------------------------------------------------------- 1 | https://www.jianshu.com/p/5090de80e043 -------------------------------------------------------------------------------- /Tip/201901W4/CSS文章排版小技巧-yu.md: -------------------------------------------------------------------------------- 1 | ## CSS 文章排版小技巧 2 | 3 | 之前写的文章排版都是 Markdown 写完直接丢出来,比较随意,最近特意学了一下 CSS 的一些常见操作,把自己的文章排版设计了一个简单的模板,后面再细细优化。记录一些值得注意的地方。 4 | 5 | ### a 标签 6 | 7 | 不显示 line: 8 | 9 | ```css 10 | text-decoration: none; 11 | ``` 12 | 13 | 悬浮显示 line: 14 | 15 | ```css 16 | a:hover, a:focus { 17 | text-decoration: underline; 18 | } 19 | ``` 20 | 21 | 调节 line 距离和动态显示: 22 | 23 | ```css 24 | a:hover, a:focus { 25 | text-decoration: none; 26 | padding: 2px; 27 | border-bottom-style: solid; 28 | border-bottom-width: 1px; 29 | } 30 | ``` 31 | 32 | ![click.gif](https://i.loli.net/2019/01/19/5c42e67f1da86.gif) 33 | 34 |
悬浮效果
35 | 36 | ### 字体 37 | 38 | 字体粗细可以用 font-weight 属性来调节: 39 | 40 | ```css 41 | font-weight: bold 42 | font-weight: bolder 43 | font-weight: 600 44 | ``` 45 | 46 | ### img 47 | 48 | 图片缩进和阴影: 49 | 50 | ```css 51 | img { 52 | border: 0; 53 | width: 90%; 54 | height: auto; 55 | box-shadow: #080808 0px 0px 10px; 56 | } 57 | ``` 58 | 59 | 可以添加图片的注释信息,使用 center 标签居中: 60 | 61 | ```css 62 | center { 63 | font-size: 12px; 64 | color: #777777; 65 | } 66 | ``` 67 | 68 | 图片示例如下: 69 | 70 | ![demo.jpg](https://i.loli.net/2019/01/19/5c42e67f7be09.jpg) 71 | 72 |
旅行照片
73 | 74 | ### 动态居中 75 | 76 | 如果需要把 H2 标签居中,根据内容长度来显示 border 的长度: 77 | 78 | ```css 79 | h2 { 80 | /* padding-bottom: .3em; */ 81 | font-size: 1.5em; 82 | line-height: 1.225; 83 | border-bottom: 1px solid rgb(185, 185, 185); 84 | display: table; 85 | margin: 0 auto; 86 | padding: 5px; 87 | } 88 | ``` 89 | 90 | 效果图如下: 91 | 92 | ![css_center.png](https://i.loli.net/2019/01/19/5c42e67f3da10.png) 93 | 94 | 95 | 96 | 通过简单的排版布局,不得不感叹 CSS 真的难学啊,调来调去的比较耗耐心,以后还是少搞这些外表功夫了,太费脑子。 -------------------------------------------------------------------------------- /Tip/201901W4/Git-Hook自定义工作流-ZmJ.md: -------------------------------------------------------------------------------- 1 | ## Git Hook 自定义工作流 2 | 3 | Git 中提供了一些钩子,可以在特定事件发生时,触发运行准备好的钩子脚本(语言不限),钩子文件在初始化仓库时,就存在于`.git/hooks`路径下,只不过被标上`.simple`而不会执行,每个钩子根据命名都有不用的使用场景。 4 | 5 | 如果想使用钩子,只需要简单的几步即可,重要的还是脚本的准备,这里以`pre-commit`为例。 6 | 7 | 移动到项目下 8 | ```bash 9 | cd 10 | ``` 11 | 12 | 将准备好的脚本放入hooks中,当然也可以直接`vim pre-commit` 13 | 14 | ```bash 15 | cp