Jianzhiオファーのいくつかの質問タイプを記録して確認してください〜
記事ディレクトリ
バイナリツリーを再構築する
タイトルの説明
二分木の前順トラバーサルと中次トラバーサルの結果を入力し、二分木を再構築してください。プレオーダートラバーサルとミドルオーダートラバーサルの入力結果に重複した数値が含まれていないと仮定します。たとえば、前順のトラバーサルシーケンス{1,2,4,7,3,5,6,8}と中順のトラバーサルシーケンス{4,7,2,1,5,3,8,6}を入力し、バイナリツリーを再構築して、戻ります。
私たちに与えられた最初の条件は、プレオーダトラバーサル配列とインオーダトラバーサル配列です。のためにことに留意すべきである配列に横断中間順序の最初の値が事前注文トラバーサルがある中間値の中央順序トラバーサル。そのため、中間次のトラバーサルを事前次のトラバーサルの順序で小さな範囲に分割し、再帰を検索できます。
栗取る {1,2,4,7,3,5,6,8}の最初の値:前順走査:1中位(に、トラバースを4,7,2,1,5,3 、8,6)は正確な中間値であるため、順序トラバーサルは2つの配列{4,7,2}と{5,3,8,6}に分割できます。{4,7,2}配列は1ノードの左側、{5,3,8,6}配列は1ノードの右側であり、配列の前順走査のみを通過する必要があり、最初の値に走査します中次トラバーサルの範囲に入れます。これは本当に配列をカットしたいということではなく、カットされた配列の添え字を記録するだけです。
もちろんもっと速くする方法はたくさんあります...詳細はコードを見てください〜
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
//int [] pre 前序数组
//int [] in 中序数组
//获得前序比那里第一个元素
TreeNode treeNode = new TreeNode(pre[0]);
//设置下标为 0
int index = 0;
//遍历中序数组
for (int i = 0; i < in.length; i++) {
//找到对应的数字后退出 index记录下标
if (pre[0] == in[i]){
index = i;
break;
}
}
//调用方法,表示第一个元素的左子树在这个方法中返回
treeNode.left = ConstructProcess(pre, in, 0, index);
treeNode.right = ConstructProcess(pre, in, index + 1, pre.length);
//返回头结点
return treeNode;
}
public static TreeNode ConstructProcess(int[] pre, int[]in, int begin, int end){
//当输入的开始下标小于结束下标时继续
if (begin < end){
int index = 0;
//设置外围循环的名字为outer
outer:
//遍历前序遍历数组
for(int i:pre){
//设置一个j下标作为是否在限定范围里的判断
for (int j = 0; j < pre.length; j++) {
//如果j在范围里并且i的值正好能在中序数组中找到
if (j>= begin && j <end && i == in[j]){
、
//设置下标为j
index = j;
//退出外循环
break outer;
}
}
}
//设置当前节点为中序遍历找到的节点
TreeNode treeNode= new TreeNode(in[index]);
//递归获取左子树和右子树
treeNode.left = ConstructProcess(pre, in, begin, index);
treeNode.right = ConstructProcess(pre, in, index + 1, end);
//返回当前节点
return treeNode;
}
//不然返回null
return null;
}
}
2つのスタックでキューを実装する
タイトルの説明
2つのスタックを使用してキューを実装し、キューのプッシュおよびポップ操作を完了します。キューの要素はint型です。
2つのスタックを使用して、キューの追加およびポップ操作を実装します。次に、スタック1をプッシュ要素のスタックとして、スタック2をポップ要素のスタックとして、2つのスタックを作成できます。スタック2が空の場合、スタック1の要素をスタック2にポップします。
知識の補足:2つのスタックでキューを実装する方法?最初のスタックに渡す必要のある要素を追加し、最初のスタックからポップし、次に2番目のスタックに追加するだけで、2番目のスタックからポップされた要素はキューの形式になります。これに基づいてこの質問をしてください。
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
//第一个栈中添加元素
stack1.add(node);
}
public int pop() {
//当第二个栈为空时
if (stack2.size() == 0){
while (stack1.size() != 0){
//只要第一个栈不为空,就将剩余元素都放到二号栈中
stack2.push(stack1.pop());
}
}
//进行二号栈的pop()
return stack2.pop();
}
}
配列の最小数を回転させる
タイトルの説明
配列の最初の要素を配列の最後に移動することを、配列の回転と呼びます。
減少しないソートされた配列の回転を入力し、回転された配列の最小要素を出力します。
たとえば、配列{3,4,5,1,2}は{1,2,3,4,5}のローテーションであり、配列の最小値は1です。
注:指定されたすべての要素は0より大きいです。配列サイズが0の場合、0を返します。
…そのトピックは非常に複雑なようですが、しばらく考えてみました。本来の目的は、順序付けられた配列を提供し、次のn個の数値を前に置き換えて、最小値を出力することです。最初の値の最大値を記録することを考えた後、トラバースして最大値より小さい最初の値を見つけることが答えです。
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
//当数组为0,则返回
if(array.length == 0) return 0;
//设置第一个值为max
int max = array[0];
//从第二个值开始遍历
for(int i=1;i<array.length;i++){
//当max大于这个值时,说明这个值就是最小值,因为这是有序数组
if(max > array[i]){
return array[i];
}
}
return max;
}
}