自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 收藏
  • 关注

原创 《软件工程--实践者的研究方法》--读书笔记

第二章 过程综述2.1软件工程:一种层次化技术1、软件工程是将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件。2、软件工程包括过程、方法和工具,根基在于质量关注点,基础是过程层2.2过程框架1、五个最基本的工程框架活动是:沟通、策划、建模、构建、部署。2、普适性活动贯穿整个软件过程,主要关注于项目管理、跟踪和控制。3、对软件过程

2017-12-21 15:37:53 4614

原创 大数相乘算法(相加,相减)

所谓大数相乘,就是指数字比较大,相乘的结果超出了基本类型的表示范围,所以这样的数不能够直接做乘法运算。假设有A和B两个大数,位数分别为a和b。根据我们平常手动计算乘法的方式可以看出,最终的结果的位数c一定小于等于a+b。由于数字无法用一个整形变量存储,很自然的想到用字符串来表示一串数字。然后按照乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将所有中间结果按正确位置相加得到最终结

2017-08-06 13:21:27 1614

原创 计算机网络面试题

1、集线器工作在 OSI 模型的物理层,网卡工作在 OSI 模型的物理层,交换机工作在数据链路层,路由器工作在网络层。 2 、机器 A 的 IP 地址为 202.96.128.130 ,子网掩码为 255.255.255.128 ,则该 IP 地址的网络号为 202.96.128( 利用 IP地址和子网掩码求与运算 ) ,主机号为 130 。3、 TCP 和 UDP 的区别?答: 

2017-08-01 16:30:09 716

原创 汉诺塔问题

当只有一个盘子时,将盘子直接从A移到C即可。当有两个盘子时,先将A中上面的盘子移到B中,再将A中下面的盘子移到C中,再将B中的盘子移动到C中当有三个盘子时,先将A上面的两个编号1到2的盘子借助C移到B中,然后将A中的3号盘子移到C中,再借助A将B中的两个盘子移到C当A中有n个盘子时,先将A中1至n-1编号的盘子借助C移到B中,然后将A中的n号盘子移到C中,再借助A将B中的1至n-1编号

2017-07-29 20:42:49 290

原创 动态规划----0-1背包问题

一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。思路:建立(n+1)(w+1)二维数组dp,其中dp[i][j]表示放入i个物品时,在总量不超过j时的最大总

2017-07-29 19:21:50 282

原创 动态规划----求最长上升子序列

这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。建立一个长度为n的序列dp,dp[i]表示以A[i]这个数结尾的子序中,以A[0,....i]中的最大递增子序列的长度。从左往右遍历序列A,并且记录以每个单词结尾的子序中,最长上升子序列的长度,然后找出最大

2017-07-29 18:54:20 530

原创 动态规划-----矩阵最小路径和

有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.思路:建立一个n*m的矩阵dp,其中dp[i][j]表示从位置(0,0)到达(i,j)的最小路径,对于dp的第一行即dp

2017-07-29 11:20:50 1371

原创 计算两个字符串的最大公共字串的长度,字符不区分大小写(要求计算连续最长字串的长度)

思路:利用动态规划的思想计算。首先假设str1的长度为n,str2的长度为m,建立一个n*m的二维数组dp,dp[i][j]表示str1[0...i]和str2[0...j]中连续相等最大字串的长度,并用n记录,当str1[i]!=str2[j],令dp[i][j]==0;对于数字的第一行和第一列,由于最长的公共字符串长度为1,所以只要出现字符相等,就令n=1。由于是求最大连续字串,所

2017-07-28 21:14:21 4347

原创 比较两个字符串的最长公共子序列的长度,字符不区分大小写

本题利用动态规划的思想。假设str1的长度为M,str2的长度为N,生成长度为M*N的矩阵dp,dp[i][j]表示str1[0,.....i]和str2[0.....j]的最长公共子序列的长度。对于矩阵第一列,即dp[i][0],由于str2[0]为一个字母,所以dp[i][0]的值最大为1,且当str1[i]=str2[0]时,dp[i+1][0]之后的值都为1。同理,对于矩阵第一

2017-07-28 20:45:29 593

转载 继承和组合的区别

首先它们都是实现系统功能重用,代码复用的最常用的有效的设计技巧,都是在设计模式中的基础结构。相信大家已了解的,类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用。对象持有(其实就是组合)要求建立一个号的接口,但是整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可见的,故成为黑盒复用。     继承是在编译时刻静态

2017-07-26 09:48:13 499

转载 STL中的map容器的一点总结

一、关于map的介绍map是STL的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是

2017-07-12 10:57:56 224

原创 《剑指offer》--二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。利用中序遍历+递归的思想实现struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(N

2017-07-06 11:39:44 203

原创 二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路:由于要求的是直到叶节点的一条路径,所以要到最后一个节点才算是找到了这条路径。遍历二叉树,采用递归的方法,将满足条件的路径压入一维数组当中,注意当找到满足条件的路径时,先将数组压入二维数组,然后将一维数组中的每个元数弹出,以存放新的路径。vec

2017-06-04 16:54:43 458 1

原创 智力题--跳格子

int checkWin(int n) { if ((n-1)%4==0) return 0; else return 1; }你和你的朋友正在玩棋子跳格子的游戏,而棋盘是一个由n个格子组成的长条,你们两人轮流移动一颗棋子,每次可以选择让棋子跳1-3格,先将棋子移出棋盘的人获得胜利。我们知道你们两人都会采取最优策略,现

2017-06-03 15:13:44 3276

原创 智力题--赛马问题

int winMost(vector oppo, vector horses, int n) { sort(oppo.begin(),oppo.end());//升序排序 sort(horses.begin(),horses.end()); int i=0,j=0; while(i<n) { i

2017-06-03 15:06:57 1065

原创 智力题--涂色练习

你要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?给定格子图的长n和宽m。请返回最多能涂的格子数目。 int getMost(int n, int m) { if(n*m%2==0)

2017-06-03 14:51:57 1242

原创 刷题--顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:打印一圈分为四步:第一步从左往右打印一行,第二步从上往下打印一列,第三步从右到左打印一行,第四部从下到上打印一列。最后一

2017-06-02 21:06:22 289

原创 刷题--二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像。思路:先前序遍历这棵树的结点,如果遍历到结点有子节点,则交换着两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像。void Mirror(TreeNode *pRoot) { if (pRoot == NULL) return; if (pRoot->left == NULL&&pRoot->right == NULL)

2017-06-02 19:10:51 290

原创 刷题--树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};bool doest

2017-06-02 17:38:29 250

原创 刷题--调整数组顺序使奇数位于偶数前

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 void reOrderArray(vector &array) { vector odds;//存放所有基数的数组,可以保证相对位置不变 vector even; for (int i = 0; i < arr

2017-06-02 15:51:15 246

原创 动态规划--最优编辑

int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) { int **dp = new int *[n + 1]; for (int i = 0; i < n + 1; i++) { dp[i] = new int[m + 1]; } //初始化矩阵 dp[0]

2017-06-02 11:28:28 691

原创 动态规划--0-1背包问题

int maxValue(vector w, vector v, int n, int cap) { //构造dp二维函数 int **dp = new int *[n+1]; for (int i = 0; i < n+1; i++) { dp[i] = new int [cap+1]; } //初始化矩阵 for (int i = 0; i <

2017-06-02 11:27:03 225

原创 动态规划--LCS计算

int findLCS(string A, int n, string B, int m) { //生成二维矩阵 int **dp = new int*[n+1]; for (int i = 0; i < n+1; i++) dp[i] = new int[m+1];//由于这边是定义了[n+1][m+1],所以对于A,B的值序号都要减1 //dp的第一列

2017-06-02 11:25:55 319

原创 动态规划--LIS练习

int getLIS(vector A, int n) { int * dp=new int[n]; for (int i = 0; i < n; i++) { dp[i] = 1; } for (int i = 1; i < n; i++) { int max = 0; for (int j = 0; j < i; j++)

2017-06-02 11:20:37 269

原创 动态规划--矩阵最小路径和

int min(int a, int b) { if (a < b) return a; else return b; } int getMin(vector > map, int n, int m) { vector > dp; dp.resize(n);//重新定义矩阵dp的大小 for (int i = 0; i < n; i++

2017-06-02 11:17:51 1672

原创 动态规划--台阶问题

int countWays(int n) { int hash[100001];//因为最大值为100000 hash[0] = 0; hash[1] =1; hash[2] =2; for (int i = 3; i <=n; i++) { hash[i] =(hash[i - 1] + hash[i - 2])%1000000007; }

2017-06-02 11:16:23 389

原创 动态规划--零钱问题

int countWays(vector penny, int n, int aim) { int m = aim + 1; int **dp = new int*[n]; for (int i = 0; i < n; i++) dp[i] = new int[m]; if (penny.empty()|| n == 0 || aim < 0) { return 0; }

2017-06-02 11:15:02 410

原创 动态规划(1)

给定数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。思路:本题可以体现暴力搜索方法,记忆搜索方法,动态规划方法,状态继续化简后的动态规划方法,(1)暴力搜索方法:arr={5、10、25、1},aim=10001、用0张5元的货币,让[10,25,1]组成剩

2017-05-31 10:04:04 837

原创 爬虫-爬取网站上的图片

思路:先访问网页,获得html,然后将网页中符合图片的地址的正则表达式的图片的下载下来代码:import urllib.requestimport redef open_url(url): req=urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1

2017-05-31 09:19:43 675

原创 爬虫-爬取代理ip网页里的ip

思想:先打开url,获取其html然后下载出网页中符合正则表达式的ipimport urllib.requestimport redef open_url(url): req=urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) Ap

2017-05-31 09:18:20 1135

转载 虚拟内存的作用

虚拟内存是计算机系统内存管理的一种技术。别称虚拟存储器(Virtual Memory)。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。电脑中所运行的程序均需经由内存执行,若执行的程序很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存技术,

2017-05-30 17:40:37 4208

转载 HTTPS原理

谣言粉碎机前些日子发布的《用公共WiFi上网会危害银行账户安全吗?》,文中介绍了在使用HTTPS进行网络加密传输的一些情况,从回复来看,争议还是有的。随着网络越来越普及,应用越来越广泛,一些网络安全问题也会越来越引起网民的关注,在这里和大家一起聊聊TLS/SSL也就是我们常说的HTTPS,从原理到实际应用看清它到底是怎么一回事,以及在使用HTTPS要注意哪些问题以及相关的安全技巧。网络安全是一

2017-05-30 17:37:48 197

转载 TCP为什么需要三次握手,又为什么需要4次挥手?

1.TCP为什么需要三次握手?答:建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。(1)TCP的三次握手过程:主机A向B发送连接请求;主机B对收到的主机A的报文段进行确认;主机A再次对主机B的确认进行确认。(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到

2017-05-30 16:50:25 221

原创 数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:最优的做法,利用移位,当用户为偶次幂时,只要计算出exponent/2的结果,然后将两数相乘就可以了,当用户为奇数次幂时,将相乘的结果再乘以一次底数base就可以了。C++:double Power(double base, int exponent) {

2017-05-27 16:50:04 301

原创 二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:把一个整数减去1,再和原证书做与运算,会把该整数最右边一个1变成0,则整数的二进制有几个1就会进行几次操作,记录下操作数目即可。C++: int NumberOf1(int n) { int count=0; while(n) { c

2017-05-27 16:08:02 166

原创 矩形覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:用第一个1*2小矩形去覆盖大矩形的最左边时有两个选择,竖着放或者横着放,当竖着放的时候,右边还剩下2*(n-1)的区域,这种情形下的覆盖方法为f(n-1),当第一次为横着放时,左下角必须横放,而右边剩下2*(n-2)的区域,此时覆盖方法为f(n-2),所以f(n

2017-05-27 15:58:35 270

原创 变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:跳上n级台阶的做法有f(n)=2^(n-1)C++:int jumpFloorII(int number) { return pow(2,number-1); }python:def jumpFloorII(self, nu

2017-05-27 15:50:58 157

原创 跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:当台阶数为1时,只有一种跳法,台阶数为2时,有2种跳法,当台阶数n>2时,第一次跳时就有两种不同的选择,一是第一次跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳发数目,即为f(n-1),当第一次跳2级时,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2),因此n级台阶的不同跳

2017-05-27 15:35:00 224

原创 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:根据先序遍历中第一个数字是树的根节点,中序遍历根节点在序列的中间,而且根节点前的数为左子树结点的值,后面的数为右子树结点的值,不断递归即可完成重建二叉树

2017-05-27 11:11:21 219

原创 栈的压入和弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:建立一个辅助栈help,当栈为空时,将压入序列中的元素压入一个进去,如果弹出序列popV中数

2017-05-27 09:36:41 400

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除