给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
1 <= prices.length <= 1050 <= prices[i] <= 104
先找一个变量存最小值,遍历数组所有元素记录最大值。要注意prices.size==1的情况。
class Solution {
public:
int maxProfit(vector& prices) {
if(prices.size()==1) return 0;
int pre_min = min(prices[0],prices[1]);
int max_cha = max(prices[1]-prices[0],0);
for(int i = 2 ; i < prices.size() ; i++){
pre_min = min(pre_min,prices[i]);
max_cha = max(prices[i]-pre_min,max_cha);
}
return max_cha;
}
};
java学习:
jvm:
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
classpath和jar
classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class。
所以,classpath就是一组目录的集合,它设置的搜索路径与操作系统相关。
jar包 如果有很多.class文件,散落在各层目录中,肯定不便于管理。如果能把目录打一个包,变成一个文件,就方便多了。创建jar包:因为jar包就是zip包,所以,直接在资源管理器中,找到正确的目录,点击右键,在弹出的快捷菜单中选择“发送到”,“压缩(zipped)文件夹”,就制作了一个zip文件。然后,把后缀从.zip改为.jar,一个jar包就创建成功。
模块
jar只是用于存放class的容器,它并不关心class之间的依赖。
从Java 9开始引入的模块,主要是为了解决“依赖”这个问题。如果a.jar必须依赖另一个b.jar才能运行,那我们应该给a.jar加点说明啥的,让程序在编译和运行的时候能自动定位到b.jar,这种自带“依赖关系”的class容器就是模块。
字符编码为了统一全球所有语言的编码,全球统一码联盟发布了Unicode编码,它把世界上主要语言都纳入同一个编码,这样,中文、日文、韩文和其他语言就不会冲突。
字符串的比较:必须要使用equals:s1.equals(s2)
string:
去除首位的空白:
.trim();
提取子串:
"Hello".substring(2, 4); "ll"
替换子串:
s.replace('l', 'w');
StringBuilder
为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象。
stringBuilder的使用
string buffer
Java早期的一个StringBuilder的线程安全版本,它通过同步来保证多个线程操作StringBuffer也是安全的,但是同步会带来执行速度的下降。
区别:
在速度上string是拉胯的,string str = "abc",a+="de",输出的结果是abcde看似是将de简单的放在了str的后面,实际上是首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。
而stringBuilder与string buffer的区别
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
运行速度: StringBuilder > StringBuffer > String
stringjoiner
stringjoiner可以完成一些分隔符添加的操作,这些用stringbuilder其实也可以实现,不过有了这个专门的类实现这个功能似乎让代码更加简洁了。
包装:
java中整型这些基本类型怎么转换为对象(引用类型)?
Interger这个类它只包含一个实例字段int,这样,Integer类就可以视为int的包装类(Wrapper Class)
直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。
自动装箱和自动拆箱只发生在编译阶段,目的是为了少写代码。
装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。并且,自动拆箱执行时可能会报NullPointerException
下面是一些当时看代码概念模糊的知识点(来源百度)
final
final修饰类: 类不能被继承
final修饰对象: 对象的引用地址不能改变,对象属性可以修改
final修饰方法: 方法不能被重写
final修饰变量: 变量会变成常量,值不能被改变
静态工厂相比于构造器的优势?
静态工厂方法与构造器不同的第一大优势在于,它们有名称。
*静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象。
静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。
静态工厂方法的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁。
缺点:
静态工厂方法的主要缺点在于,类如果不含公有的或受保护的构造器,就不能被子类化
静态工厂方法的第二个缺点在于,它们与其他的静态方法实际上没有任何区别。
枚举类:



