- 博客(71)
- 资源 (3)
- 收藏
- 关注
原创 网络爬虫之批量图片下载
最近在开源社区时不时看到有人上传爬虫软件,用于下载姐脱吧图片等,可谓屌丝神器。不过基本上都是python写的,我就跟风编了个初级的java版爬虫工具,用于下载百度贴吧的图片。功能介绍:通过广度遍历方法搜索贴吧网页,这边本来想把搜索结果存入数据库的,因为想着先简单搞搞,就用ArrayList和HashSet存入内存了,只是用于小规模的爬取。最终将爬取到的图片存入工程目录下的downloadIma
2013-11-03 10:58:13
2773
2
原创 第15章 面向对象编程
15.1、面向对象编程:概述 在C++中,多态性仅用于通过继承而相关联的类型的引用或指针,通过基类的引用(或指针)调用虚函数时,发生动态绑定。15.2、定义基类和派生类15.2.3、派生类 如class A :public C{}; 用作基类的类必须是已定义的(只是声明不行)。15.2.4、virtual与其他成员函数
2013-10-08 21:43:27
793
原创 第14章 重载操作符与转换
14.1、重载操作符的定义 不能重载的操作符:“::”、“.*”、“.”、“?:”。 重载操作符必须具有至少一个类类型或枚举类型的操作数(强制重载操作符不能重新定义用于内置类型对象的操作符的含义)。 对于重载操作符,优先级和结合性还是固定的,并且对于&&、||这些不再具备短路求值特性。 作为成员函数的操作符有一个隐含的
2013-09-25 14:37:45
644
原创 第13章 复制控制
复制构造函数、赋值操作符和析构函数总称为复制控制(copy control)。13.1、复制构造函数 复制构造函数可用于:(1)根据另一个同类型的对象显式或隐式初始化一个对象;(2)复制一个对象,将它作为实参传给一个函数;(3)从函数返回时复制一个对象;(4)初始化顺序容器中的元素,如vector sev(5),分别用了默认构造函数和复制构造函数,先使用string默认构造
2013-09-19 15:48:30
627
原创 第12章 类
在C++中用类来定义自己的抽象数据类型。12.1、类的定义和声明12.1.1、类定义:扼要重述 每个类可以没有成员,也可以定义多个成员,成员可以是数据、函数或类型别名(typedef,不过这个跟前面两个属于同一档次?是指在类里能定义类型别名这个意思?) 构造函数初始化列表由成员名和带括号的初始值组成,跟在构造函数的形参表之后,并以冒号开头,如,Sal
2013-09-05 15:49:57
749
原创 自控力之“那又如何”:情绪低落为何会使人屈服于诱惑?
当我们毫无压力时,我们知道做某事(如食物,玩游戏)并不能让自己快乐,但当我们处在巨大的压力下,压力把我们引向了错误的方向,让我们失去了理性,被本能去支配,更喜欢吃或者玩游戏、看电影来放松。这就好比在期末,越是紧张有压力,越是要去看电影。 最有效的解压方法(针对自己):参加体育活动(足球、网球)、阅读、冥想、听音乐、与家人相处,散散步,还可以试试骑车逛逛校园。(还可以记录加压后的
2013-08-21 17:26:49
1048
原创 第11章 泛型算法
11.1、概述 如标准库提供的find运算即基于迭代器的,可以find各种类型,list、数组(因为指针的行为与作用在内置数组上的迭代器一样)等。 如果需要传递一个子区间,则传递指向这个子区间的第一个元素以及最后一个元素的下一位置的迭代器(或指针)。(符合前闭后开的原则) 泛型算法用迭代器来解决的要求有:(1)遍历容器,能够从一个元素移到下一个元素;
2013-08-20 14:56:35
691
原创 电话号码对应英语单词
电话号码盘一般可以用于输入字母,如2可以输入A、B、C,等等。要求设计号码所对应的所有组合。如5969872可以对应:JTMWTPA、JTMWTPB等。 这就相当于排列数,如5对应J、K、L,以J、K、L各自引出9对应的W、X、Y、Z这些数字的组合就构成一棵树。 我们可以构建一个二维数组charc[10][10]={“”,“”,“ABC”···}并将各个数字所能代表的字符总数记
2013-08-19 16:33:33
1021
原创 程序理解和时间分析
这个数i不能被2-31这30个数中的两个相邻的数整除,但能被其它28个数整除。所以,这个i肯定是其它28个数的最小公倍数的整数倍。然而i不能被两个相邻的数整除,所以必然是分解质因子后要么i的质因子中不包括这两个数的质因子,要么是i的质因子的次数小于这两个数中相同质因子的次数。只需要给2-31这30个数分解质因数,找一下是否有这样的相邻的两个数,要么它们的质因子中有其它数没有的质因子,要么对于相同的
2013-08-19 16:33:04
674
原创 区间重合判断
给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1][x2,y2][x3,y3]…[xn,yn],判断源区间[x,y]是不是在目标区间内? 方法:对N个无序区间按x进行快排成从小到大的序列(记得y也要对应),时间复杂度为(O(N*log2N)),再对这些区间进行合并,时间复杂度为O(N),最后进行查找(可用二分查找)课判定[x,y]是否被合并后的这些互不相交的
2013-08-19 16:32:19
664
原创 数组分割
有一个没有排序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近?(变相的背包问题,01背包问题(非完全背包问题),还是有点出入,这边要求个数是n) 2n个正整数数组好比财宝,数组和的一半表示背包容量,为如何才能使背包尽可能装满,并且财宝个数为n。核心代码如下:定义:isOK[i][v]表示是否可以找到i个数,使得它们之和等
2013-08-19 16:31:58
625
原创 第10章 关联容器
关联容器支持通过键来高效地查找和读取元素。基本关联容器:map和set。set仅包含一个键。multimap和multiset支持同一个键多次出现在容器中。10.1、引言:pair类型 pair类型,定义在utility头文件中。创建和初始化如:pair p1(v1,v2);或make_pair(v1,v2)赋给pair类型的变量。 对于pair类型,也可考虑t
2013-08-19 16:29:45
670
原创 数组循环移位
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 K可能大于N,但对K%N就可。代码如下:reverse(int* arr,int b,int e){ for(;b int temp= arr[e]; arr[e] =arr[b]; arr[b] =temp;
2013-08-18 16:35:13
709
原创 求数组中最长递增子序列
例如在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6。解法一:假设在目标数组array[]的前i个元素中,最长递增子序列的长度为LIS[i]。那么,LIS[i+1]=max{1,LIS[k]+1},array[i+1]>array[k],forany kLIS[i]是指:假设在数组的前i个元素中,以array[i]为最大元素的最长递增子序列的长度)。思想:
2013-08-18 16:34:50
751
原创 第 9 章 顺序容器
标准库定义了三种顺序容器类型:vector、list和deque(双端队列“double-ended queue”),还提供了三种容器适配器(非迭代器,之前一眼以为是迭代器):stack、queue和priority_queue。9.1、顺序容器的定义 为了使程序更清晰、简短,容器类型最常用的构造函数是默认构造函数。 容器构造函数:(1)C c;默认构造函数;(
2013-08-17 19:39:33
764
原创 大脑的弥天大谎:为什么我们误把渴望当幸福
如:为什么我们买彩票(幻想中奖)会觉得是幸福的?如奥尔兹和米尔纳的小白鼠一样,以为让自己触下电就有吃的,就一直在电线上跑来跑去直到爪子被烫焦···。 大量的多巴胺并不能产生快乐的感觉,那种感觉更像是一种激励。我们会觉得警醒、清醒、着迷。我们发现了如何才能得到快乐,而且愿意为了获得这种感觉付出努力。 多巴胺有它的好处,它可以让我们去工作、去获取。然而现代科技“
2013-08-16 16:16:36
1875
1
转载 把时间当朋友 - 笔记
要管理的不是时间,而是自己。人生的幸运在于能够“用正确的方式做正确的事情”。教是最好的学习方法。我的发现是,所有的学生提问都是源自于所有人共有的弱点:懒惰。很多学生“既勤奋又懒惰”的怪异现象来自于他们的“时间压力”感受。“没有时间了”,或者“时间不够了”的感受和恐惧,使得他们超乎寻常地勤奋,哪怕是虚假的“勤奋”。我去学习什么的动力竟然与那些人拒绝学习的理由是一模一样
2013-08-16 16:10:03
661
原创 第8章 标准IO库
8.1、面向对象的标准库 iostream继承层次:istream和ostream是最上层,istream派生出ifstream和istringstream,ostream派生出ofstream和ostringstream。他们两者共同派生出iostream。iostream派生出stringstream和fstream。 标准库类型不允许做复制或赋值操作。导致的现
2013-08-15 23:04:21
645
原创 第9章 异常
57、只针对异常的情况才使用异常 其他情况用异常不正确的原因:(1)异常机制的设计初衷是用于不正常的情形,很少会有JVM试图对它进行优化;(2)把代码放在try-catch块中反而阻止了现代JVM实现本来可能要执行的 特定优化;(说到底就是异常阻止了JVM的优化···) 设计良好的API不应该强迫它的客户端为了正常的控制流而使用异常。 总之,异常是为
2013-08-14 12:16:16
681
原创 第7章 函数
7.1、函数的定义 函数形参为函数提供了已命名的局部存储空间。 实参则是一个表达式,它可以是变量或字面值常量,甚至是包含一个或几个操作符的表达式。实参必须具有与形参类型相同、或能隐式转换为形参类型的数据类型。7.1.1、函数返回类型 函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针。 函
2013-08-14 12:15:15
750
原创 子数组之和的最大值(二维)
二维情况下,定义“部分和”PS[i][j]等于以(1,1),(i,1),(1,j),(i,j)为顶点的矩形区域的元素之和。则以(i_min,j_min),(i_min,j_max),(i_max,j_min),(i_max,j_max)为顶点的矩形区域的元素之和,等于PS[i_max][j_max]-PS[i_min-1][j_max]-PS[i_max][j_min-1]+PS[i_min-1]
2013-08-12 15:01:54
645
原创 求数组的子数组之和的最大值
思想二:用分治的思想,如果将所给数组(A[0],…,A[n-1])分为长度相等的两段数组(A[0],…,A[n/2-1])和(A[n/2],…,A[n-1]),分别求出两个数组各自的最大子段和,则原数组最大子段和为以下三种情况的最大值:(1)最大子段和为(A[0],…,A[n/2-1])的最大子段和;(2)最大子段和为(A[n/2],…,A[n-1])的最大子段和;(3)最大子段和跨过其中间两个元
2013-08-12 15:01:29
628
原创 第6章 语句
6.1、简单语句 使用空语句应该加上注释。6.5、if语句 多个if语句,但后面跟的else比if少,导致匹配存在歧义,这就是悬垂else(dangling-else)问题。6.6、switch语句 例如:switch(ch){ case ‘a’: 语句;break; ··· default:语
2013-08-12 15:00:30
677
原创 子数组的最大乘积
给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。(注意,因为数组中数可正可负,通过排序去除最小的显然不能满足要求,如乘积为负,你去除最小的负值显然不对,应该去除最大的负数值) 解法一:可以通过“空间换时间”策略。从数组两边计算乘积,设array[]为初始数组,s[i]表示数组前i个元素的乘积,s[i]=s[i-
2013-08-11 18:45:40
607
原创 快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字? 解法一:穷举,从数组中任取两个数字,计算两者之和是否为给定的数字。时间复杂度为(n*(n-1)=O(n2))。 解法二:对数组中每个数a,都判断sum-a是否在数组中。用排序+折半查找,时间复杂度为O(Nlog2N+N*log2N)=O(Nlog2N)。或用hash表,额外增加O(N)的hash表存储空
2013-08-11 18:44:58
638
原创 第5章 表达式
表达式由一个或多个操作数通过操作符组合而成。最简单的表达式仅包含一个字面值常量或变量。5.1、算术操作符 求模操作符(%)操作数只能为整型,包括bool、char、short、int和long类型,以及对应unsigned类型。如果两个操作数为正,求模的结果也是正或零;如果两个操作数都是负数,则求模操作的结果为负数或零;如果只有一个值为负,求模结果取决于机器。VS上a%b,求模
2013-08-11 18:43:26
796
原创 寻找最近点对
一维的数很简单,先排序,再扫描已排好的数,相邻两个进行比较即可,时间复杂度为O(N*log2N+N)= O(N*log2N)。两维的话:把平面上N个点分成两部分left和right。假设分别求出left和right两部分最短距离mindistleft和mindistright,还有一种情况就是点对中一个点来自于left部分,另一个点来自于right部分,设min=min(mindistleft
2013-08-10 12:31:12
823
原创 寻找数组中的最大值和最小值
我能想到的是:扫描一遍,用max和min存储扫描过程中的最大值和最小值,数组中两个数据比较后,拿大的跟max比较,拿小的跟min比较,总的时间复杂度是1.5N。另一种方法可以用分治的思想:在N个数中求最小值min和最大值max,我们只需分别求出前后N/2个数的min和max,然后取较小的min,较大的max即可。分治法的时间复杂度计算可以借鉴下:f(2)=1(两个的话只需要比较一次),f(N)
2013-08-10 12:30:39
737
原创 第4章 数组和指针
4.1、数组 数组是由类型名、标识符和维数组成的复杂数据类型。4.1.1、数组的定义和初始化 数组的维数必须用大于等于1的常量表达式定义。该表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型const对象(即必须编译时就可以知道的值,对于函数返回的值赋给const则不可以,因为是运行才知道。int a=1;int b[a];也是不可以)。 显示初始
2013-08-10 12:26:03
834
原创 自控力之容忍罪恶:为何善行之后会有恶行
大部分人在觉得自己品德高尚时,都不会质疑自己的冲动。只要我们的思想中存在正反两方,好的行为就总是允许我们做一点坏事。补偿的渴望常常使我们堕落,因为我们很容易认为,纵容自己就是对美德最好的奖励,我们忘记了自己真正的目标,向诱惑屈服了。 如果你自控的唯一动力就是成为一个足够好的人,那么每当你自我感觉良好的时候,你就会放弃自控。注意观察你是否认为某些积极的行为值得称赞,就忘了自己实际
2013-08-09 15:05:49
1098
原创 斐波那契数列
对于数列a[n],递推公式为a[n+1]=pa[n]+qa[n-1],其特征方程为x^2=px+q (一个数列:X(n+2)=C1X(n+1)+C2X(n);设r,s使X(n+2)-rX(n+1)=s[X(n+1)-rXn];所以X(n+2)=(s+r)X(n+1)-srXn;C1=s+r并且C2=-sr;消去s就导出特征方程式r^2-C1*r-C2=0),即x^2-px-q=0,(1)若方程有两
2013-08-09 14:59:41
729
原创 找符合条件的整数
任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。 第一想法:从小到大枚举M的取值,然后再计算N*M,最后判断它们的乘积是否只含有1和0。该方法时间复杂度太高。 第二想法:因为问题要求N*M的十进制表示形式里只含有1和0,尝试去搜索N*M,需要搜索的空间要小很多。 终极思路:(避免多于的除法验证余数)如1%3=1;1
2013-08-09 14:59:06
655
原创 第8章 通用程序设计
45、将局部变量的作用域最小化 要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。(因为较早的程序设计语言(如C语言)要求局部变量必须在一个代码块的开头处进行声明,导致现在习惯性这么做···。java允许在任何可以出现语句的地方声明变量)。 声明一般应该包含初始化表达式。但也有例外,如果表达式为函数,且该函数有异常,则声明在外,初始化用try-c
2013-08-09 14:57:03
685
原创 第3章 标准库类型
3.1、命名空间的using声明 在头文件中必须总是使用完全限定的标准库名字(即如std:cin)。因为如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明,不论该程序是否需要using声明。头文件中应该只定义确实必要的东西。3.2、标准库string类型3.2.1、string对象的定义和初始化四种初始化方式:(1)strings1
2013-08-09 14:54:34
474
原创 自控力之累到无力抵抗:为什么自控力和肌肉一样有极限?
如果你觉得自己没有时间和精力去处理“我想要”做的事,那就把它安排在你意志力最强的时候做(一般自控力从早上到晚上会逐渐减弱,可以尝试发现自己在什么时候意志力最强)。 血糖降低会使得意志力降低。最好的方法是保证你的身体有足够的食物供应,这能给你更持久的能量。推荐低血糖饮食,能让你血糖稳定。如瘦肉蛋白、坚果、豆类、粗纤维谷类、麦片,大多数水果、蔬菜等自然状态的食物。
2013-08-08 13:35:34
872
原创 第7章 方法
38、检查参数的有效性 非公有方法应该使用断言(assertion)来检查它们的参数。如在方法里assert a!=null; 但并不是说对参数的任何限制都是好事。有效性检查工作非常昂贵,而且有的有效性检查已经隐含在计算过程中。假如方法对于它所能接受的所有参数值都能够完成合理的工作,那么对参数的限制应该是越少越好。每当编写方法和构造器的时候,应该考虑它的参数有哪些限
2013-08-08 13:31:08
581
原创 java程序员面试宝典(3)
1. Runnable接口与Thread类的区别之一:实现Runnable接口的线程类的多个线程,可以方便地访问同一变量,而Thread类则需要内部类进行替代。2. 线程池最重要的特征也就是最大程度利用线程,其次java线程池的编程模型相对于原有的多线程编程模式来说,一大改进就是线程代码和业务代码分离。3. 反射机制4. 反射的出发点就在于J
2013-08-08 13:29:33
872
原创 程序员自我修养第二章编译和链接
编译系统的组成:预处理器、编译器、汇编器和链接器。程序编译运行过程:预处理(prepressing)、预编译(Compilation)、汇编(Assembly)、链接(Linking)。 预编译过程主要处理那些源代码文件中的以“#”开始的预编译指令(还包括删除所有注释,展开所有宏定义)。 编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优
2013-08-08 13:27:27
653
原创 最大公约数问题
解法一:欧几里得的辗转相除法。f(x,y)=f(y,x%y),f(a,b)表示a,b最大公约数。int gcd(int x,int y){ return (!y)?x:gcd(y,x%y);}解法二:对于大数而言,取模运算(其中用到除法)是非常昂贵的开销。用辗转减法:f(x,y)=f(x-y,y),这边需要注意的是要维持左边的数大于右边的数。解法三:(1)对于y和x来说
2013-08-08 13:25:25
558
原创 精确表达浮点数
用分数形式表示小数。有限小数或者无限小数都可以转化为分数。方法:对于有限小数X=0.a1a2a3···an,X=(a1a2a3···an)/10^n。对于无限循环小数X=0.a1a2a3···an(b1b2···bm),X=( a1a2a3···an+0.(b1b2···bm))/10^n。再对付小数部分,Y=0.b1b2···bm(b1b2···bm),则(10^m)*Y= b1b2···b
2013-08-08 13:24:36
476
hadoop权威指南
2013-08-09
ejb3.0帮助文档
2012-11-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人