打卡Day02-------------2022/6/25
Leetcode每日一题:
题目: 在每个树行中找最大值
思路: 本题其实就是一道层序遍历的题目,只是加了一点小变型。解题方法还是有俩种:递归和迭代。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//方法一:迭代方法
public List<Integer> largestValues(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> path = new LinkedList<>();
path.offer(root);
while(!path.isEmpty()){
int size = path.size();
int max = Integer.MIN_VALUE;
while(size>0){
TreeNode node = path.poll();
max=Math.max(node.val,max);
if(node.left!=null) path.offer(node.left);
if(node.right!=null) path.offer(node.right);
size--;
}
res.add(max);
}
return res;
}
//方法二:递归方法
public List<Integer> largestValues(TreeNode root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> res = new ArrayList<Integer>();
dfs(res, root, 0);
return res;
}
public void dfs(List<Integer> res, TreeNode root, int curHeight) {
if (curHeight == res.size()) {
res.add(root.val);
} else {
res.set(curHeight, Math.max(res.get(curHeight), root.val));
}
if (root.left != null) {
dfs(res, root.left, curHeight + 1);
}
if (root.right != null) {
dfs(res, root.right, curHeight + 1);
}
}
}
题目一: 面向对象的特征
解答:
1,封装: 将客观的事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2,继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确的表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的的特性,新类称为原始类的派生类,而原始类称为新类的基类。派生类可以从它的基类那里继承方法和实例变量,并且派生类可以修改或者增加新方法使之更合适特殊的需要。
3,多态: 多态是指允许不同类对象对同一消息作出响应。多态包含参数化多态和包含多态。多态语言具有灵活,抽象,行为共享,代码共享等优势,很好的解决了应用程序函数同名等问题。
4,抽象: 抽象就是忽略一个主题中与目前当前目标无关的那些方面,以便充分的注意和当前目标有关的方面。抽象并不打算了解所有问题,而是选择其中一部分,暂时不用部分细节。抽象包括两方面:过程抽象、数据抽象。
题目二: String,Stringbuffer,StringBuilder的区别
解答:
String: 该类是一个不可变的类,一旦创建就不可以修改。String 是 final 类,不能被继承.String 实现了 equals()方法和 hashCode()方法
StringBuffer: 继承自 AbstractStringBuilder,是可变类。StringBuffer 是线程安全的。可以通过 append 方法动态构造数据。
StringBuilder: 继承自 AbstractStringBuilder,是可变类。StringBuilder 是非线性安全的。执行效率比 StringBuffer 高。
题目三: 重载和重写的区别
解答:
- 重写必须继承,重载不用。
- 重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)
- 重写表示子类中的方法与父类中的某个方法的名称和参数完全相同啦,通过子类实 例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这是面向对象编程的多态性的一种表现。
- 重写的方法修饰符大于等于父类的方法,即访问权限只能比父类的更大,不能更小, 而重载和修饰符无关
- 重写覆盖的方法中,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常。
以上就是今天打卡学习的全部内容,希望大家和我一起努力,offer拿到手软。