チェックイン Day02---------------2022/6/25
Leecode の毎日の質問:
アイデア:この質問は実際にはレイヤー順序のトラバーサルの問題ですが、少し変更されています。問題を解決するには、再帰と反復の 2 つの方法がまだあります。
コード:
/**
* 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:オブジェクト指向の機能
答え:
1. カプセル化:目的のものをクラスに抽象化し、各クラスが独自のデータとメソッドを保護します。クラスは、信頼できるクラスまたはオブジェクトのみが独自のデータおよびメソッドで動作できるようにし、信頼できないクラスまたはオブジェクトからは情報を隠します。
2. 継承:継承はクラスをリンクする階層モデルであり、クラスの再利用を許可および促進し、共通性を表現する明確な方法を提供します。オブジェクトの新しいクラスは既存のクラスから派生できます。これはクラス継承と呼ばれるプロセスです。新しいクラスは元のクラスの特性を継承し、新しいクラスは元のクラスの派生クラスと呼ばれ、元のクラスは新しいクラスの基本クラスと呼ばれます。派生クラスは基本クラスからメソッドとインスタンス変数を継承でき、派生クラスは特別なニーズにより適したものにするために新しいメソッドを変更または追加できます。
3. ポリモーフィズム:ポリモーフィズムとは、異なるタイプのオブジェクトが同じメッセージに応答できるようにすることを指します。ポリモーフィズムには、パラメトリック ポリモーフィズムとコンテインメント ポリモーフィズムが含まれます。ポリモーフィック言語には、柔軟性、抽象化、動作共有、コード共有などの利点があり、アプリケーション関数の同名問題を解決します。
4. 抽象化:抽象化とは、現在の目標に関連する側面に十分な注意を払うために、現在の目標に無関係なトピックの側面を無視することです。抽象化はすべての問題を理解することを目的としたものではなく、問題の一部を選択し、当面は詳細を残しておきます。抽象化には、プロセスの抽象化とデータの抽象化という 2 つの側面が含まれます。
トピック 2: String、Stringbuffer、および StringBuilder の違い
答え:
文字列:このクラスは不変クラスであり、作成後に変更することはできません。String は最終クラスであり、継承することはできません。String は、equals() メソッドと hashCode() メソッドを実装します。
StringBuffer: AbstractStringBuilder から継承された変数クラスです。StringBuffer はスレッドセーフです。データは、append メソッドを通じて動的に構築できます。
StringBuilder: AbstractStringBuilder から継承された変数クラスです。StringBuilder は非線形安全です。StringBufferよりも実行効率が高いです。
トピック 3:オーバーロードとリライトの違い
答え:
- 書き換えは継承する必要がありますが、オーバーロードは継承しません。
- オーバーロードとは、同じクラス内に同じ名前の複数のメソッドが存在できるが、これらのメソッドのパラメーター リストが異なる (つまり、パラメーターの数または型が異なる) ことを意味します。
- 書き換えとは、サブクラスのメソッドが親クラスのメソッドとまったく同じ名前とパラメータを持つことを意味します。このメソッドがサブクラスのインスタンス オブジェクトを通じて呼び出されるとき、サブクラスで定義されたメソッドが呼び出されます。これは次と同等です。親クラスのメソッドの呼び出し。定義されたメソッドとまったく同じものが対象となります。これは、オブジェクト指向プログラミングにおけるポリモーフィズムの現れです。
- オーバーライドされたメソッド修飾子は親クラスのメソッド以上です。つまり、アクセス許可は親クラスのアクセス許可より大きくすることのみ可能であり、それより小さくすることはできません。また、オーバーロードは修飾子とは関係がありません。
- オーバーライドされたメソッドでは、親クラスよりも少ない例外のみをスローするか、親クラスによってスローされた例外のサブ例外をスローできます。
以上が今日のチェックイン勉強の内容ですが、皆さんも一緒に頑張って内定を柔らかく取っていただければ幸いです。