摘要:1. 变化是复用的天敌,面向对象设计最大的优势在于:抵御变化。 2. 重新认识面向对象 (1)理解隔离变化 从宏观层面看,面向对象的构建方式能适应软件的变化,能将变化所带来的影响减为最小。 (2)各司其职 从微观的层面来看,面向对象的方式更强调各个类的“责任”。 由于需求变化导致的新增类型不应该影响
阅读全文
摘要:1. 课程目标 (1)理解松耦合设计思想 (2)掌握面向对象设计原则 (3)掌握重构技法改善设计 (4)掌握GOF核心设计模式 2. 《设计模式:可复用面向对象软件的基础》 可复用是设计模式的目标,面向对象是方法。通常说的设计模式默认为面向对象的设计模式,但这并不意味着设计模式就等于面向对象的设计模
阅读全文
摘要:/* * 实现函数double Power(double base, int exponent),求base的exponent次方。 * 不得使用库函数,同时不需要考虑大数问题。 */ /* * 考虑不够全面的解法,没有考虑到输入的指数小于0的情况 */ double Power(double ba
阅读全文
摘要:/* * 整数向右移1位和/2之间的区别:除了这个整数是-1之外其余结果都相同。 */ #include<iostream> using namespace std; int main() { int value = -1; int result1 = value / 2; value = valu
阅读全文
摘要:/* * 动态规划和贪婪算法 */ /* * 给你长度为n的绳子,请把绳子剪成m段(m, n都是整数,n>1并且m>1),截取的绳子长度也为整数。 * 每段绳子的长度记为k[0],k[1],...,k[m-1]。请问k[0]*k[1]*...*k[m-1] * 的最大乘积是多少。 * 例如:当绳子的
阅读全文
摘要:/* * 回溯法的典型问题 */ /* * 题目:设计一个函数,用来判断在一个矩形中是否存在一条包含 * 某字符串所有字符的路径。路径可以从矩阵中任意一格开始, * 每一步可以在矩阵中向左右上下移动一格。一个格子不能经过 * 多次。 */ #include<cstring> bool hasPath
阅读全文
摘要:本随笔记录来自《剑指offer》第二版 /* * 把一个数组最开始的若干个元素搬到数组的尾部,我们称之为 * 数组的旋转。输入一个递增排序的数组的旋转,输入旋转数组的 * 最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的 * 一个旋转,该数组的最小值为1. */ /* * 暴力搜
阅读全文
摘要:本随笔来源于《剑指offer》第二版 面试官:请实现一个排序算法,要求时间效率为O(n)。 应聘者:对什么数字进行排序,有多少个数字? 面试官:我们相对公司的所有员工的年龄排序。我们公司一共有几万名员工。 应聘者:也就是说数字的大小在一个较小的范围内,对吧? 面试官:嗯,是的。 应聘者:可以使用辅助
阅读全文
摘要:/* * 如果待排序的表中,存在多个关键字相同的元素,经过排序后 * 这些具有相同关键字的元素之间的相对次序保持不变,则称这种 * 排序方法是稳定的。反之,如果具有相同关键字的元素之间的相 * 对次序发生变化,则称这种排序方法是不稳定的。 */ /* * 1.插入排序:假设待排序的元素存放在R[0,
阅读全文
摘要:/*斐波那契数列*/ /* * 解法1:递归解法 */ long long Fibonacci(unsigned int n) { if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci(n - 1) + Fibonacci(n -
阅读全文
摘要:/* *用两个栈来来实现一个队列。队列的声明如下,请实现它的两个函数appenTail和 * deleteHead,分别完成在队列尾部插入节点和队列头部删除节点的功能。 */ #include<iostream> #include<stack> using namespace std; templa
阅读全文
摘要:/* * 给定一棵二叉树和其中一个节点,如何找出中序遍历 * 序列的下一个节点?树中的节点除了有两个指向左、右 * 子节点的指针,还有一个指向父节点的指针。 */ /* * 如果一个节点有右子树,那么他的下一个节点就是右子树中的最左节点。 * 如果节点没有右子树,如果节点是父节点的左子节点,那么下一
阅读全文
摘要:/* * 二叉树的遍历方式: * 前序遍历:先访问根节点,再访问左子节点,最后访问右子节点。 * 中序遍历:先访问左子节点,再访问根节点,最后访问右子节点。 * 后序遍历:先访问左子节点,再访问右子节点,最后访问根节点。 */ /* * 输入二叉树的前序遍历和中序遍历的结果,请重新构建该二叉树。 *
阅读全文
摘要:/* * 输入一个链表的头节点,从尾到头反过来打印每个节点的值。 * 且不允许修改输入链表的结构。 */ #include<iostream> #include<stack> using namespace std; struct ListNode { int m_nKey; ListNode* m
阅读全文
摘要:/* * 往链表的末尾插入一个节点和在链表中查找某个节点并删除 */ #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNext; }; //往一个链表的尾部添加一个节点 void
阅读全文
摘要:/*请实现一个函数,把字符串中的空格替换成%20。例如,输入 “we are happy.”,输出“we%20are%20happy.”。 不可以申请新的空间,原来字符串有足够多的空间进行移动。 */ /* * 解法1:从前向后遍历,碰到空格就将空格之后的字符全部向后平移2,然后插入%20. * 这
阅读全文
摘要:#include<iostream> using namespace std; int main() { char str1[] = "hello world!"; //字符串数组,数据存放在栈中 char str2[] = "hello world!"; //字符串数组,数据存放在栈中 const
阅读全文
摘要:/* * 在一个二维数组中,每一行都是按照从左到右 * 递增的顺序排序,每一列都是按照从上到下递增 * 的顺序排序。请完成一个函数,输入这样的一个 二位数组和一个整数,判断数组中是否含有该整数。 */ /* * 解法1:暴力搜索法,时间复杂度为O(n^2) */ #include<iostream>
阅读全文
摘要:/* * 在一个长度为n+1的数组里的所有的数字都在1~n的范围内,所以数组中 * 至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改 * 输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的 * 输出是重复的数字2或者3. */ /* 解法1:利用
阅读全文
摘要://(1)补充一些知识点 //(1.1)虚假唤醒 // wait(), notify_one(), notify_all() 使用非常频繁的接口 // 虚假唤醒是指没有满足条件的时候被唤醒了。 //(1.2)atomic #include<iostream> #include<thread> #in
阅读全文
摘要://(1)windows临界区 #include<iostream> #include<thread> #include<vector> #include<list> #include<mutex> #include<windows.h> #define _WINDOWS //定义一个开关 usin
阅读全文