编程语言
Beb1997
程序猿?程序猿!
展开
-
【Python】直接使用Python查阅文档
文章目录初衷查找所有函数和类查找某个函数和类的用法初衷本篇博文写给Python小白用户,主要关于直接使用Python内置函数查阅API文档的方法。有时候我们需要用到某一个具体的类或者函数,这个时候“打开浏览器、输入网址(或搜索关键词)、进入官方在线文档(可能还有筛选网站)、再查阅”其实是一个相当漫长的过程。如果我们在编程时,只是需要了解少数几个类或者函数的用法,我们可以直接使用Python内...原创 2018-12-11 14:44:46 · 1541 阅读 · 1 评论 -
【算法和数据结构】分治思想之二分查找(C++实现)
分治思想举例:二分搜索 在上一篇文章中简单地分享了分治 的思想方法,并用快速排序和归并排序做了简单的示例。下面我们以一个更加简单直接的例子来简单的介绍下分治思想的方法–二分查找。 现在我们考虑这样一个问题:给定一个数组array[n],现在我们要从数组里面找到值value=v的位置,即返回其所在下标。 一个简单的方法是从头到尾的遍历数组,挨个查找。但是实际问题中这个原创 2017-01-11 23:56:43 · 2651 阅读 · 0 评论 -
【算法和数据结构】排序(四)归并排序和快速排序(C++实现)
归并排序和快速排序前言: 前面三篇文章分别介绍了三种排序算法:冒泡排序、插入排序和选择排序。它们的实现思想都是基于排序问题本身产生的,时间复杂度都是θ(n^2)。 而现在介绍的两种排序算法:归并排序和快速排序,它们的思想除了对于排序本身外,还可以进一步抽象为:分治思想一、分治思想 分治思想,顾名思义就是将一个大而复杂的问题分解为若干个性质相同且原创 2017-01-04 14:13:17 · 1485 阅读 · 0 评论 -
【算法和数据结构】排序(三)插入排序(C++实现)
【算法和数据结构】1.2.3–排序算法之插入排序(C++实现)总述:插入排序(Insertion Sort)作为一种简单的排序算法,应用非常广泛。下面就以从小到大排序某序列为例,介绍其基本原理:1.原理概述:插入排序,顾明思议就是将某个记录插入到某一序列的某个位置中,从而得到一个有序的序列。其基本思想是:每步将一个待排序的纪录,按其码值的大小插入前面已经排序的序列中适当位置上,直到全部插入原创 2016-12-13 23:34:18 · 1092 阅读 · 0 评论 -
【算法和数据结构】排序(二)选择排序(C++实现)
总述:选择排序(Selection Sort)作为一种简单的排序算法,应用非常广泛。下面就以从小到大排序某序列为例,介绍其基本原理:1. 原理概述:选择排序会反复的扫描待排序的序列,每一次从待排序的数据元素中选出最小(这里以从小到大排序为例)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。2. 具体操作: (1)假设待排序序列已经存放在数组array[n]原创 2016-12-13 23:13:22 · 1165 阅读 · 0 评论 -
【算法和数据结构】排序(一)冒泡排序(C++实现)
【算法和数据结构】1.2.1–排序算法之冒泡排序(C++实现)冒泡排序(Bubble Sort)作为一种简单的排序算法,应用非常广泛。下面就以从小到大排序某序列为例,介绍其基本原理:概述:冒泡排序会重复的扫描待排序的序列,如果某两个元素位置错误(这里的位置错误指:元素的实际大小顺序不符合期望),则将他们交换。重复此步骤,直到没有需要交换的元素为止。具体操作: (1)假设待排序序列原创 2016-12-13 19:27:19 · 1184 阅读 · 0 评论 -
【算法和数据结构】线性表(一)线性表(C++实现)
线性表(List)作为一种简单的数据结构而被广泛使用。首先我们给出线性表的通俗定义:线性表是一个有限、有序的数据序列,其中的数据被称为元素(A list is a finite, ordered sequence of data items called elements.)。一个线性表可以记为:(a0,a1……an)。下面是一个线性表的实际例子: ...原创 2016-11-16 23:34:52 · 1677 阅读 · 0 评论 -
【Java多线程】浅谈多线程机制(一)之初识多线程
说起Java的多线程机制,可能很多程序猿和笔者一样,对其是又爱又恨的矛盾心理。一方面,多线程的强大功能可以简化编程模型,很方便的达到我们的目的;另一方面,也正是由于多线程的强大功能,我们很容易在编程过程中考虑不周,从而出现一些难以发现的bug。要写好Java多线程,笔者以为需要的是长期不断的练习和实践,而今天和大家分享的便是笔者在学习Java多线程中的一些感想和心得,也希望广大读者朋友批评指正。一、原创 2017-03-12 14:57:59 · 1240 阅读 · 0 评论 -
【Java多线程】浅谈多线程机制(二)之正确停止线程
在上一篇文章中,笔者分享并用“学生上课回答问题”的情景解释了Java线程的几个常用方法以及它们的作用。那么,很自然地,我们就会想到线程启动并执行之后,什么时候才能停止或者什么时候让它停止呢?这就是笔者想在这篇文章中和大家分享的主题。 Java多线程中有一个已经封装好的方法—–stop()方法。这个方法是在早期版本的Java中就封装好的,但是随着Java的逐步普及,人们发现这种方法存在在相原创 2017-03-15 14:18:01 · 1017 阅读 · 0 评论 -
【算法和数据结构】线性表(二)队列的定义和封装
在前面一篇文章中,和大家分享了一种简单的数据结构—–列表。今天和大家分享的是另外一种类似但本质又不尽相同的一种数据结构—–队列。 我们用这样一个现实生活中的例子来引出队列,以及其和列表的区别: 现实生活中,我们以排队买票为例,假设把买票时人们排的队伍想象成一个容器,那么我们可以得到这样的结论:先排队的人总是先买到票。抽象出来,就可以得到队列的基本思想:FIFO即 F原创 2017-01-12 13:30:43 · 1186 阅读 · 0 评论 -
【算法和数据结构】线性表(三)栈的定义和封装
在前面和大家分享了两种线性表(List)结构:链表和队列。今天和大家分享List的最后一种结构—栈(stack)。 首先,给出栈的一个通常定义:一个运算受限的线性表(A restricted form of list): Insert and remove only at front of list. 其具有重要特征:LIFO,Last in,first out. 我原创 2017-01-25 17:11:56 · 1149 阅读 · 0 评论 -
【算法和数据结构】大顶堆定义和封装,堆排序(C++实现)
在前面的几篇文章中,介绍了线性表的三种数据结构:链表、队列和栈。他们因为各自的特性,都可以方便的支持某一种运算。比如链表相比于数组,其插入和删除的时间代价更为优化。 除了这些数据结构之外,今天和大家分享需要支持如下两种运算的数据结构:插入元素和寻找最大元素。这两种运算的数据 结构称为优先队列,其有效实现便是通过堆。下面给出大顶堆的定义: 一个(二叉)堆是一棵几乎完全的原创 2017-02-22 15:50:04 · 2062 阅读 · 0 评论 -
【Linux】sudo pip 找不到命令
Step 1:编辑/etc/sudoers:sudo vim /etc/sudoers将Defaults env_reset修改为Defaults !env_resetStep 2:编辑配置文件~/.bashrc:sudo vim ~/.bashrc添加:alias sudo='sudo env PATH=$PATH'使修改生效:source ~/.bashrcStep 3:...原创 2018-12-03 00:27:01 · 11781 阅读 · 9 评论 -
【Python】浅谈Python虚拟环境virtualenv
目录虚拟环境简介虚拟环境的安装和使用安装创建虚拟环境指定解释器启用虚拟环境停用虚拟环境删除虚拟环境virtualenvwrapper安装简单使用虚拟环境简介虚拟环境提供一个独立于全局python环境(库library和解释器interpreter)的程序运行空间。这样一来,可以有效避免python程序之间的相互影响。比如:程序 A 需要使用某个包的 1.0 版本,而程序 B 需要使用这个包的...原创 2018-12-02 13:46:00 · 1222 阅读 · 0 评论 -
【Python】数据分析之numpy包
numpy使用示例前言示例代码参考资料前言numpy,全称numeric python,是一个由多维数组对象和用于处理数组的例程集合组成的库,是python数据分析中最基础的工具。利用numpy,可以轻松地使用python达到matlab中的矩阵、线性代数等等运算。下面给出一些示例的使用方法,作为入门。完整的API文档可以参考文末给出的参考资料。示例代码# coding=utf-8# ...原创 2018-10-23 00:10:36 · 1252 阅读 · 0 评论 -
【Python】Scrapy初探
【Python】Scrapy初探架构概览概述组件Scrapy Engine调度器(Scheduler)下载器(Downloader)SpidersItem Pipeline下载中间件(Download Middlewares)Spider中间件数据流(Data Flow)豆瓣实战环境准备新建项目明确目标编写爬虫数据存储数据导出存储到MongoDB伪装设置代理ip随机user-agentscrapy...原创 2018-10-11 16:29:28 · 1256 阅读 · 0 评论 -
【解题】按层从上到下,从左到右遍历二叉树(C++实现)
题目描述 给定二叉树,从上到下打印每个节点的值,同一层的节点按照从左到右的顺序打印。如下图二叉树,则打印结果顺序为:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15。代码实现 需要使用一个队列做辅助数据结构:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLe...原创 2018-08-08 20:09:55 · 3664 阅读 · 0 评论 -
【解题】二叉搜索树的后续遍历序列(C++实现)
题目描述 输入一个序列,判断是否存在一个二叉搜索树,使得输入序列为其后续遍历序列。假设输入序列不存在相同数字。代码实现bool isPostorderOfBST(int sequence[], int length){ //边界条件 if (sequence == NULL || length <= 0) { return ...原创 2018-08-12 17:12:08 · 1205 阅读 · 0 评论 -
【算法和数据结构】图(一)图的定义和封装(C++实现)
图,一种复杂的数据结构,在实际生活中起着举足轻重的作用。如路网(线路规划),社交网络描述等等。现在我们就以下面这个简单无向图(图1)为例,来说明使用邻接矩阵 实现图在计算机中的存储和操作的方法。 图1 不同于树,我们在习惯上称呼如图中数字编号的店为顶点而非节点。在树的概念中,存在一个特殊的节点称之为根,其起着好似渔网的主绳的作用,缺之不可。而在图这原创 2017-02-27 22:32:19 · 2286 阅读 · 0 评论 -
【算法和数据结构】二叉树的定义和封装(C++实现)
首先给出个人对于二叉树的理解:一个有限的节点集合,集合可以为空,或者仅含有根节点,又或者由一个根节点r和称为左右子树的两个不想交的二叉树构成。在这里,对于二叉树的理解用了递归的方法。 在上面的基础上,就很容易理解什么叫做完全二叉树了:如果二叉树中每个内部节点均有两个左右子节点,且所有叶子具有同样的深度,那么这棵二叉树可以称之为完全二叉树。 和前面所分享的大顶堆一样,原创 2017-02-23 14:29:53 · 1970 阅读 · 2 评论 -
【Java多线程】浅谈多线程机制(三)之互斥与同步
一、概述 在说明线程的互斥和同步之前,先看一个叫做竞争条件的名词。和操作系统中进程间的通信一样,竞争条件是指:两个或者两个以上线程同时读写某些共享数据时,最后的执行结果取决于线程运行的精确时序的情况。 竞争条件的出现可能导致共享数据被破坏,即可能出现数据不一致性的情况。 一个基本事实:在任意时刻,CPU上最多只能运行一个线程(进程)实例。有了这样一个基本事实,可以举这样一个小原创 2017-03-15 21:42:25 · 1084 阅读 · 0 评论 -
【Java设计模式】浅谈设计模式(一)之工厂模式
一、设计模式概述 设计模式既不是Java代码,也不是API,而是一套被反复使用的,多数人知道的,经过分类编目的,抽象出来的代码设计经验总结。去掉这个句子的众多修饰词,即可得:设计模式是经验总结。 就像我们中学阶段做数学题目一样,老师总会强调的一点就是:不要光顾着刷题啊,要注意从相似的题目中总结出相同的方法和思想。设计模式便是如此,它是优秀的使用案例,使用它可提高代码的重用性,原创 2017-03-18 13:11:27 · 1084 阅读 · 0 评论 -
【Java设计模式】浅谈设计模式(二)之单例模式
一、单例模式概述 单例模式,笔者的理解就是单实例模式。怎么来说呢?打个比方,我们都知道一山不容二虎,一个山头出现了两只老虎那么必然会出现一些争斗,一些伤亡。那么在程序中会出现什么样的“虎”呢?比如:配置文件、工具类、线程池、缓存、日志对象等。如果创建了多个,那么就可能出现占用过多资源,数据读取不一致等等不是期望中的结果。 那么保证程序中上述性质实例有且只有一个呢?这就要依靠单原创 2017-03-24 15:38:22 · 1034 阅读 · 0 评论 -
【解题】旋转数组的最小数字的高效解法(C++实现)
一、题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。输入一个非降序排序数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的一个旋转,该数组的最小值为1。二、思路分析 当然,在这里我们放弃遍历数组的方法,看能否利用旋转数组的特点找到一个时间效率更优的算法。 可以注意到旋转之后的数组实质上可以划分为两原创 2017-03-29 13:59:10 · 1241 阅读 · 0 评论 -
【解题】数值的整数次方——关于代码完整性及错误处理方式的探讨(C++实现)
一、题目描述 题目:实现函数double Power(double base, int exponent),求base的exponent次方。不适用库函数,不考虑大数问题。二、常见的错误解法 由于不考虑大数问题,可能相当的读者会很快给出如下实现方式:double Power(double base, int exponent){ double result = 1.0; fo原创 2017-04-01 13:33:32 · 1269 阅读 · 0 评论 -
【解题】求单向链表的倒数第k个节点——关于代码鲁棒性的探讨(C++实现)
一、题目描述 输入一个单向链表,输出该链表中倒数第k个节点。从1开始计数而不是0。比如倒数第一个节点即链表的尾节点。二、思路分析 首先,题目明确说明输入的是一个单向链表,那么先走到链表的末尾,再回溯(k-1)步这种思路是行不通的。 然后,很自然的可以想到先遍历链表,统计链表节点个数n。那么倒数第k个节点就是从头节点开始的第(n-k+1)个节点。当然,这样的做法是原创 2017-04-18 10:43:13 · 432 阅读 · 0 评论 -
【解题】二进制中1的个数——三种解法的探讨(C++实现)
一、题目描述 题目:输入一个十进制整数,输出该整数二进制表示中1的个数。如9的二进制表示为1001,有2个1,那么输入9,则输出2。二、解法1:可能引起死循环的解法1.1算法描述:先判断整数最右边一位是不是1,接着把输入的整数右移一位,再判断是不是1。这样每次移动一位加以判断直至整个整数变为0为止。如何判断某一位是否为1呢?可以通过与1做位与运算来判断。1.2代码实现:int numberOf原创 2017-03-29 16:28:59 · 2758 阅读 · 0 评论 -
【解题】空格替换的O(n)解法——高效解法(C++实现)
问题描述:输入一行字符串,末尾以换行结束,将其中的空格替换成“%20”,输出替换后的字符串。问题分析:读完题目,首先可以想到的两点就是:原来的一个空格字符将变成‘%’、‘2’、‘0’三个字符,替换后字符串长度将增加。有两种处理方式:一种是另外开辟空间,一种是原来有足够的空余空间而在原字符上操作。 对于第一种方式,只需要重新开辟一段合适的空间,并定义两个指针,一个指向原字符,一个指向原创 2017-03-16 13:03:31 · 1310 阅读 · 0 评论 -
【解题】打印1到最大的n位数——关于大数问题的探讨(C++实现)
一、题目描述 输入数字n,按顺序打印从1到最大的n位数。比如输入3,则依次打印1、2、3一直到最大的3位数999.原创 2017-04-06 10:45:08 · 2173 阅读 · 0 评论 -
【解题】反转链表(C++实现)
一、题目表述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后的链表头节点。链表节点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; };二、代码实现ListNode* ReverseList(ListNode* pHead){ ListNode* pReverseHead=N原创 2017-04-23 12:28:07 · 1325 阅读 · 0 评论 -
【解题】合并两个排序链表(C++实现)
一、题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。二、代码实现 很容易想到,只需要定义两个指针分别指向两个链表头节点,依次往后扫描并比较,将较小的一个添加至新链表即可。值得注意的是,算法设计大量的指针操作,需要保证新链表没有断裂以及保证代码的鲁棒性。struct ListNode{ int *m_nValue;原创 2017-04-26 11:38:14 · 1433 阅读 · 0 评论 -
【解题】二维数组中的查找(C++实现)
题目描述:在一个二维数组中,每一行按照从左至右递增的顺序排列,每一列按照从上至下递增的顺序排列。输入一个数字,判断数组中是否存在该数字。一、分析 对于这个问题,一种很简单粗暴的方法就是全部循环一遍,就能判断给定数字是否在二维数组中。但是这样的话,给定的每行、每列按序递增的条件岂不是多余了吗?而且,当二维数组相当庞大并且需要查找的数字要刚好比较靠后的时候,全部循环的时间代价是很高的。原创 2017-03-21 17:53:47 · 3419 阅读 · 0 评论 -
【解题】重建二叉树(C++实现)
题目描述:输入二叉树的前序遍历和中序遍历结果 ,请重建出该二叉树,返回其头节点并给出后序遍历序列。假设输入的遍历序列不包含重复数字。题目分析: 根据前序遍历和中序遍历的特征,我们知道在前序遍历序列中,第一个数字总是树的根节点;而在中序遍历中根节点的值在序列中间,左子树的节点值一定位于根节点左边,右子树的节点值一定位于根节点右边。这样我们结合前序遍历和中序遍历序列,就可以确定出树的根节原创 2017-03-17 17:30:46 · 2781 阅读 · 0 评论 -
【解题】输出给定二叉树的镜像(C++实现)
题目描述 完成一个函数,输入一个二叉树,输出这个二叉树的镜像。二叉树的节点如下定义:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}实现算法描述 前序遍历树的节点,如果遍历到的节点有子节点,则交换它的两个子节点。当交...原创 2018-07-18 20:42:56 · 1391 阅读 · 0 评论 -
【Java设计模式】浅谈设计模式(三)之策略模式
一、策略模式概述 首先给出一个听起来官方的定义:策略模式将可变的部分从程序中抽象分离成算法接口,在该算法接口下分别封装一系列算法实现。 举一个实际的例子来说明:我们在网上购物支付的时候,会发现电商平台一般会提供各种各样的支付方式选择,用户只需要选择其中之一便可进行支付操作。 可以发现,上述例子中的支付算法便是抽象出来的算法接口,在这个接口里面封装了各种支付算法的实原创 2017-04-06 14:47:34 · 1194 阅读 · 0 评论 -
【Java应用】二维码的生成和读取
一、简述 我们知道二维码包含很多种类型,比如Data Matrix,Vericode,QR Code等等,而我们日常生活中所见到的最多的应该是QR Code。 下面就用Java来生成QR Code和读取QR Code做一个简要介绍。二、生成包含指定内容的QR Code 在这里我们要借用Google公司名叫zxing的jar包。它是一个开放源码的,用Java实现的多种格式原创 2017-04-16 14:30:59 · 1510 阅读 · 0 评论 -
【Java应用】JavaMail接口应用举例
一、概述(一)应用场景 用JavaMail实现用户注册邮箱的验证以及激活。具体来说,就是当用户注册账号时,系统自动向用户账户(用户邮箱)发送一封激活或者确认邮件,包含某个链接,用户点击这个链接就可以激活或者成功注册这个账号了。(二)JavaMail接口 Sun公司发布的处理email的相关Java API,提供给开发者处理电子邮件相关的编程接口,它可以方便地执行原创 2017-04-21 16:09:27 · 1071 阅读 · 0 评论 -
【Java Web】MVC(一)初识SpringMVC
- 视图层View:为用户提供UI,重点关注数据的呈现 - 模型层Model:业务数据的信息表示,关注支撑某项业务的信息构成。比如一个Java类抽象了一类实例的信息,是一个数据结构 - 控制层Controller:业务逻辑产生Model,传递至视图层用于呈现原创 2017-11-13 11:19:53 · 975 阅读 · 0 评论 -
【算法和数据结构】图(二)最小生成树之Prim算法(C++实现)
给定一个图的数据结构G=(V,E)是一个具有含权边的连通无向图,它的一棵生成树(V,T)是G最为树的子图。若(V,T)满足T的所有边权值相加为最小值,那么这样的生成树称为最小(耗费)生成树。 计算一个给定加权连通图最小生成树的一个可行方法叫做Prim算法,它是从一个任一顶点开始生长生成树。其基本步骤如下:设G=(V,E),为了方便起见,V取整数集合{1,2,3,……,n}。原创 2017-03-05 16:39:51 · 1778 阅读 · 0 评论 -
【算法和数据结构】图(三)最小生成树之Kruskal算法(C++实现)
在前面两节图和图的最小生成树之Prim算法的基础上,这里给出另外一种求解MST(最小生成树)的算法—–Kruskal算法。 Kruskal算法可以概括为:取出连通无向图G的所有边。从第一步形成的边集合中选取权值最小的边,加入最小生成树边集合T中。求出第二步中选出边的两端顶点,判断他们所在顶点集的关系以确认是否存在回路。若不存在回路,则确认将此最小边加入T中,若存在回路,则原创 2017-03-05 20:19:43 · 2485 阅读 · 0 评论