在PowerShell中使用代理
首先以管理员模式打开PowerShell
输入code $PROFILE。
在打开的文本编辑器中创建下列函数:
1234567891011121314function proxy { param( [string]$proxyAddress = "http://localhost:10809" ) $env:http_proxy = $proxyAddress $env:https_proxy = $proxyAddress Write-Host "Proxy set to $proxyAddress"}function unproxy { Remove-Item Env:http_proxy Remove-Item Env:https_proxy Write-Host "Proxy settings cleared."}
其中proxyAddress指向的IP和端口为运行代理软件的设备IP和软件开放的代理端口
保存并关 ...
建造者模式
定义建造者模式(Builder Pattern)是一种创建型模式,使用多个简单的对象一步步的构建成一个复杂的对象。它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
相同的方法,不同的执行顺序会产生不同的事件结果时。
多个部件或零件都可以装配到一个对象中,但是产生的运行结果不相同时。
产品类非常复杂,或者产品中的调用顺序不同产生了不同的效能。
优点
分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
可以更好地控制构建过程,隐藏具体构建细节。
代码复用性高,可以在不同的构建过程中重复使用相同的建造者。
缺点
如果产品的属性较少,建造者模式可能会导致代码冗余。
建造者模式增加了系统的类和对象数量
Hint相较于工厂模式,建造者模式更加关注各零件装配的顺序
实现
单例模式
定义单例模式(Singleton Pattern)是一种创建型设计模式,它保证一个类只有一个实例,并提供一个公开节点以实现对唯一实例的访问。
使用场景该模式主要解决一个全局类频繁使用导致的创建与销毁,应用该模式可以有效的控制实例数目,节省系统资源开销。
优点
在内存里只存在一个实例,减小了内存的开销(尤其是在需要频繁创建与销毁的场景下)
避免对资源的多重占用(例如执行IO操作时相关系统资源的占用)
缺点没有接口,不能继承。与单一职责原则冲突:一个类应该只关心内部逻辑,而不关心外部如何进行实例化。
实现懒汉式懒加载:是
12345678910public class Singleton { private static Singleton instance; private Singleton() {} //私有构造方法,防止外部访问 public static synchronized Singleton getInstance() { // 提供外部访问节点 if (instance == null) ...
面向对象设计原则
开放关闭原则(OCP,Open Closed Principle)
对扩展开放—类的行为可以被扩展从而满足新的需求
对修改关闭—不允许修改类的源代码
开放封闭原则是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的.
里氏替换原则(LSP,Liskov Subsitution Principle)任何基类可以出现的地方,子类一定可以出现。面向对象设计的基本原则之一。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正的被复用,而衍生类也能够在基类的基础上增加新的行为。里氏替换原则是对开放关闭原则的补充
单一职责原则(SRP,Single Responsibility Principle)亦称单一功能原则,它规定一个类应该只有一个发生变化的原因。如果有多个原因去改变一个类,那么应该把这些引起变化的原因分离,将该类分割为多个类,每个类只负责处理一种改变。
依赖倒置原则(DIP,Dependence Inversion Principl ...
歐幾里得算法
欧几里得算法(辗转相除法)设gcd(a,b)是计算自然数a和b的最大公约数的函数,a除b得到的商和余数分别为p和q,因为a=b×p+q,所以gcd(b,q)既整除a又整除b,也就是整除gcd(a,b)。反之,因为q=a-b×p,同理可证gcd(a,b)整除gcd(b,q)。因此可以知道gcd(a,b)=gcd(b,a%b)。不断这样操作下去,由于gcd的第二个参数总是不断减小的,最终会得到gcd(a,b)=gcd(c,0)。0和c的最大公约数是c,这样便计算出了a,b的最大公约数为c。
12345int gcd(int a, int b){ if(b == 0) return a; return gcd(b, a%b);}
时间复杂度
O(log max(a,b))之内
扩展欧几里得算法贝祖定理:
对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍
根据欧几里得算法,当到达递归边界的时候,a_i== gcd(a_0,b_0) , b_i == 0,可以得到一个较为明显的解: a ...
素數檢測
素数是指恰好有两个约数的整数(1和其本身)。
简单素性测试因为n的约数都不超过n,所以只需检查2n-1的所偶整数是否整除n就能判定n是否为素数。进而,如果d是n的约数,那么n/d也是n的约数。由n=d×n/d可知min(d,n/d)≤sqrt(n),所以只要检查 **2sqrt(n)** 得到所有整数就可以了。由此可知,整数分解和约数枚举都可以在 O(sqrt(n)) 时间内完成。
埃氏筛法要枚举n以内的素数,可以用埃氏筛法。
首先,将2到n范围内的所有整数写下来。
其中最小的数字2是素数。将表中所有2的倍数都划去,
表中剩余的最小数字是3,他不能被更小的数长出,所以是素数。在将表中所有3的倍数都划去。
以此类推,如果表中剩余的最小数字是m时,m就是素数。然后将表中所有m的倍数划去。像这样反复操作,就能一次枚举n以内的素数。
12345678910111213141516171819int prime[MAX_N];//第i个素数bool is_prime[MAX_N+1]//is_prime[i]为true表示i时素数//返 ...
快速冪運算
普通的幂运算是将底数乘以底数指数次,需要**O(n)**的时间复杂度。
通过将a的n次幂不断转换为a2的n/2次幂,可以将时间复杂度缩减至O(logn)
123456789101112typedef long long ll;int fastpow(int base, int exp){ int sum = 1; while(exp > 0){ if((exp & 1))//如果指数为奇数,将结果乘以底数 sum *= base; exp = exp >> 1;//指数除以2 base *= base;//底数平方 } return sum;}
快速计算二进制数中1的个数
12345678int count1inBin(int binary){ int count = 0; while(binary>0){ binary &= (binary-1); ++count; } return count;}
核心在于binary &= (binary-1);
假设binary=X1 X2 …… Xn-1 Xn,其中 Xi(1≤i≤n)为1或0
不妨设Xi是最右边的1,那么binary就可以写成如下的形式
binary=X1 X2……Xi-1 Xi 0……0,其中(1≤i≤n),Xi 后面有n-i个0
因为 Xi =1,所以binary=X1 X2 …… Xi-1 1 0……0,其中(1≤i≤n),1后面有n-i个0
则binary-1=X1 X2 ……Xi-1 0 1……1,其中(1≤i≤n),0后面有n-i个1
则binary & (binary-1)= X1 X1 …… Xi-1 0 0 ……0,其中( ...
動態規劃概述
动态规划(Dynamic Programming)
将一个问题拆成几个子问题,分别求解这些子问题,即可推断出大问题的解。
如何判断一个问题能否使用DP解决呢?能将大问题拆成几个小问题,且满足无后效性、最优子结构性质。
即是确定 DP状态
最优子结构:
将原有问题化分为一个个子问题,即为子结构。而对于每一个子问题,其最优值均由「更小规模的子问题的最优值」推导而来,即为最优子结构。
因此「DP 状态」设置之前,需要将原有问题划分为一个个子问题,且需要确保子问题的最优值由「更小规模子问题的最优值」推出,此时子问题的最优值即为「DP 状态」的定义。
无后效性:
一旦f(n)确定,“我们如何凑出f(n)”就再也用不着了。
要求出f(15),只需要知道f(14),f(10),f(4)的值,而f(14),f(10),f(4)是如何算出来的,对之后的问题没有影响。
“未来与过去无关”,这就是无后效性。
(严格定义:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响。)
步骤划分
刻画一个最优解的结构特征
递归地定义最优解的值
计算最优解的值,通常采用自底 ...
摩爾衆數投票算法
Moore majority vote 算法摩尔投票法基于这样一个事实:
当一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数。
我们采用一个虚拟数组(在实现中可以使用两个变量代替,一个代表当前数组内元素的个数,另一个储存当前的候选数)来储存候选的众数。当遇到相同的数的时候向虚拟数组中加入当前的候选数,遇到不同的数的时候从虚拟数组中删除一个候选数。如果虚拟数组大小为0,向虚拟数组中加入当前位置的数作为候选数。遍历完成后数组中剩余的元素就是众数。
因为众数大于数组的一半,哪怕最极端的其它数全都相同,众数也能在数组中剩余不少于2m-n(其中m为众数的数量,n为数组大小)。
1234567891011121314int majorityElement(vector<int>& nums) { int res=0,cnt=0; for(int i=0;i<nums.size();i++){ if(cnt==0) { res ...