一、每日一题
121. 买卖股票的最佳时机 - 力扣(LeetCode) (leetcode-cn.com)
思路:
首先,暴力超时。
然后就是动态规划,代码里面有详细的注释。算出当天的交易的最大利润,以及前面的天数里面交易的最大的利润,两者进行比较,取较大的值。
代码实现:
class Solution {
public int maxProfit(int[] prices) {
int Max=0,Min=prices[0];
for(int i=1;i<prices.length;i++)//动态规划
{
Min=Math.min(Min,prices[i]);//找该天的前面的价格最小值
Max=Math.max(Max,prices[i]-Min);//比较前面算过的最大利润与今天的最大利润进行比较,更新最大值
}
/*for(int i=0;i<prices.length;i++)//暴力,超时
{
for(int j=i+1;j<prices.length;j++)
{
if(prices[j]-prices[i]>Max)
{
Max=prices[j]-prices[i];
}
}
}*/
return Max;
}
}
过题记录:
二、Java学习
1.外部类和内部类
外部类:这个类的外面没有其他的类了,也就相当于最普通的类
public class Student {
private String name;
private int age;
}
内部类:包含在外部类里面的就是内部类,内部类分为静态内部类和非静态内部类。
非静态内部类:没有用static修饰且定义在定义在外部类类体中。
静态内部类:与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。静态内部类与静态内部方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量,与实例方法,只有通过对象引用才能访问。
静态内部类与非静态内部类的区别和联系:静态内部类是属于外部类的类成员,非静态内部类是属于内部类的实例对象的一个实例成员。内部类可以访问外部类所有的方法和属性,如果内部类和外部类有相同的成员方法和成员属性,内部类的成员方法调用要优先于外部类即内部类的优先级比较高(只限于类内部,在主方法内,内部类对象不能访问外部类的成员方法和成员属性),外部类只能访问内部类的静态常量或者通过创建内部类来访问内部类的成员属性和方法。
public class School {
private static School instance = null;
static class Teacher {}//定义静态内部类
}
public class School {
private String name;
class Teacher {}//定义非静态内部类
}
2.访问控制符
用来控制一个类的成员能否被其他类访问。
局部变量所作用的范围就是它所在的方法内,不可能被其他类访问,所以不用访问控制符修饰。
外部类只能使用public和default,因为外部类没有在任何类的内部,也就是没有其所在类的内部和所在类的子类这两个范围,因此private和protected对外部类没有意义。
对于良好的封装的实践
public class Person {
private String name;//用private修饰成员变量,将这些成员变量隐藏该类里
private int age;
public void setName(String name){
if(name.length()<2||name.length()>15)
{
System.out.println("您设置的昵称不符合要求");
return;
}
else
{
this.name=name;
}
}
public String getName(){
return this.name;
}
public void setAge(int age){
if(age<0&&age>150)
{
System.out.println("您输入的年龄不符合要求");
return;
}
else
{
this.age=age;
}
}
public int getAge()
{
return this.age;
}
public static void main(String[] args)
{
Person pp=new Person();
pp.setName("lsisthebest");
pp.setAge(17);
System.out.println("输入的昵称为:"+pp.getName()+"\n输入的年龄为:"+pp.getAge());
}
}
setter方法和getter方法
例如某个类里面包含了名为abc的变量,setAbc()则为它的setter方法,getAbc()则为它的getter方法。
3.包(package)
提供类的多层命名空间,解决类名冲突、类名管理问题等。
如果要将某个类放到指定的包结构下,就要第一个非注释行输入
package packageName
同一个包的类可以不位于相同的目录下。
如果父包中的类需要使用子包中的类,则必须使用子包中的全名,而不能省略父包。
4.import关键字
可以向某个Java文件中导入指定的包层次下的某个类或全部类。
出现位置:package语句之后(如果有),类定义之前。
.*代表某包下是所有类或者接口,如java.util.*;import java.util.*;
如果只是导入了父包的所有类,那子包的类不会被导入。例如使用import lee.*语句导入lee包内所有子类,那么它的子类lee.sub.apple中的类不会被导入,要想导入子包lee.sub.apple中的所有类,则需要用到import lee.sub.*语句。