《软件工程--实践者的研究方法》--读书笔记 第二章 过程综述2.1软件工程:一种层次化技术1、软件工程是将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件。2、软件工程包括过程、方法和工具,根基在于质量关注点,基础是过程层2.2过程框架1、五个最基本的工程框架活动是:沟通、策划、建模、构建、部署。2、普适性活动贯穿整个软件过程,主要关注于项目管理、跟踪和控制。3、对软件过程
大数相乘算法(相加,相减) 所谓大数相乘,就是指数字比较大,相乘的结果超出了基本类型的表示范围,所以这样的数不能够直接做乘法运算。假设有A和B两个大数,位数分别为a和b。根据我们平常手动计算乘法的方式可以看出,最终的结果的位数c一定小于等于a+b。由于数字无法用一个整形变量存储,很自然的想到用字符串来表示一串数字。然后按照乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将所有中间结果按正确位置相加得到最终结
计算机网络面试题 1、集线器工作在 OSI 模型的物理层,网卡工作在 OSI 模型的物理层,交换机工作在数据链路层,路由器工作在网络层。 2 、机器 A 的 IP 地址为 202.96.128.130 ,子网掩码为 255.255.255.128 ,则该 IP 地址的网络号为 202.96.128( 利用 IP地址和子网掩码求与运算 ) ,主机号为 130 。3、 TCP 和 UDP 的区别?答:
汉诺塔问题 当只有一个盘子时,将盘子直接从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编号
动态规划----0-1背包问题 一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。思路:建立(n+1)(w+1)二维数组dp,其中dp[i][j]表示放入i个物品时,在总量不超过j时的最大总
动态规划----求最长上升子序列 这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。建立一个长度为n的序列dp,dp[i]表示以A[i]这个数结尾的子序中,以A[0,....i]中的最大递增子序列的长度。从左往右遍历序列A,并且记录以每个单词结尾的子序中,最长上升子序列的长度,然后找出最大
动态规划-----矩阵最小路径和 有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.思路:建立一个n*m的矩阵dp,其中dp[i][j]表示从位置(0,0)到达(i,j)的最小路径,对于dp的第一行即dp
计算两个字符串的最大公共字串的长度,字符不区分大小写(要求计算连续最长字串的长度) 思路:利用动态规划的思想计算。首先假设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。由于是求最大连续字串,所
比较两个字符串的最长公共子序列的长度,字符不区分大小写 本题利用动态规划的思想。假设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。同理,对于矩阵第一
继承和组合的区别 首先它们都是实现系统功能重用,代码复用的最常用的有效的设计技巧,都是在设计模式中的基础结构。相信大家已了解的,类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用。对象持有(其实就是组合)要求建立一个号的接口,但是整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可见的,故成为黑盒复用。 继承是在编译时刻静态
STL中的map容器的一点总结 一、关于map的介绍map是STL的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是
《剑指offer》--二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。利用中序遍历+递归的思想实现struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(N
二叉树中和为某一值的路径 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路:由于要求的是直到叶节点的一条路径,所以要到最后一个节点才算是找到了这条路径。遍历二叉树,采用递归的方法,将满足条件的路径压入一维数组当中,注意当找到满足条件的路径时,先将数组压入二维数组,然后将一维数组中的每个元数弹出,以存放新的路径。vec
智力题--跳格子 int checkWin(int n) { if ((n-1)%4==0) return 0; else return 1; }你和你的朋友正在玩棋子跳格子的游戏,而棋盘是一个由n个格子组成的长条,你们两人轮流移动一颗棋子,每次可以选择让棋子跳1-3格,先将棋子移出棋盘的人获得胜利。我们知道你们两人都会采取最优策略,现
智力题--赛马问题 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
智力题--涂色练习 你要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?给定格子图的长n和宽m。请返回最多能涂的格子数目。 int getMost(int n, int m) { if(n*m%2==0)
刷题--顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路:打印一圈分为四步:第一步从左往右打印一行,第二步从上往下打印一列,第三步从右到左打印一行,第四部从下到上打印一列。最后一
刷题--二叉树的镜像 操作给定的二叉树,将其变换为源二叉树的镜像。思路:先前序遍历这棵树的结点,如果遍历到结点有子节点,则交换着两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像。void Mirror(TreeNode *pRoot) { if (pRoot == NULL) return; if (pRoot->left == NULL&&pRoot->right == NULL)
刷题--树的子结构 输入两棵二叉树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
刷题--调整数组顺序使奇数位于偶数前 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 void reOrderArray(vector &array) { vector odds;//存放所有基数的数组,可以保证相对位置不变 vector even; for (int i = 0; i < arr