1.LeetCode257.バイナリツリーのすべてのパス
トピック
二分木が与えられた場合、ルートノードからリーフノードへのすべてのパスを返します。
説明:リーフ・ノードは、子ノードを持たないノードです。
アイデアとアルゴリズム
最も直感的な方法は、深さ優先探索を使用することです。深さ優先探索で二分木をトラバースするときは、現在のノードとその子を考慮する必要があります。
現在のノードがリーフノードでない場合は、現在のパスの最後にノードを追加し、ノードの各子ノードを再帰的にトラバースし続けます。
現在のノードがリーフノードの場合、現在のパスの最後にノードを追加した後、ルートノードからリーフノードへのパスを取得します。これを回答に追加できます。
このようにして、完全な二分木をトラバースした後、ルートノードからリーフノードへのすべてのパスを取得します。
Xiaobianクッキングソリューション
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
constructPaths(root, "", list);
return list;
}
private void constructPaths(TreeNode root, String path, List<String> pathList){
if (root != null){
StringBuilder builder = new StringBuilder(path);
builder.append(Integer.toString(root.val));
if (root.left == null && root.right == null){
//当前节点是叶子节点
pathList.add(builder.toString()); //把路径加入到答案中
}else {
builder.append("->");//当前结点不是叶子结点,继续递归遍历
constructPaths(root.left, builder.toString(),pathList);
constructPaths(root.right, builder.toString(),pathList);
}
}
}
2.LeetCode258.全員を合計します
トピック
負でない整数numを指定すると、結果が1桁になるまで、各ビットの桁を繰り返し加算します。
Xiaobian問題解決のアイデア
各ビットを追加し、再帰を使用します。出口は1に等しい結果の長さです
Xiaobianクッキングソリューション
public static int addDigits(int num) {
recursion(num);
return re;
}
static int re = 0;
private static void recursion(int num){
String str = String.valueOf(num);
int ret = 0;
for (int i = 0; i < str.length(); i++) {
ret += Integer.parseInt(String.valueOf(str.charAt(i)));
}
if(String.valueOf(ret).length() > 1){
recursion(ret);
}else{
re = ret;
}
}
charをintに変換するより良い方法があることに注意してください。
Character.getNumericValue(str.charAt(i));
アイデアとアルゴリズム
O(1)O(1)の時間計算量を使用したソリューション:
1桁を除いて、各桁の値は(9 + 1)キャリーのプロセスを通じて取得されます。ダイヤルそろばんキャリーを考えて
、整数nを処理します。もともと10個詰めていたn種類のアイテムとして、この10個から1個を1個に取り出し、9個を1個に詰めるようになりました。
このように、2つの部分があります。
元の10個のアイテムが1個の9個のアイテムになり、パッケージ化されたアイテムです。これらは
、散在するアイテムを気にする必要はありません。次
のように分割することもできます。元のパッケージ、それらの合計="元のパッケージ数="小数の回数="小数では、1桁を除く他の桁の値の合計に
10 1の部分がパックされ、散在するアイテムは次のようになります。入力不可=》 10進
数の数値上記の散在する項目の総数は、numを初めて処理した後に得られた累積値です。
累積値が9より大きい場合は、各桁の値を加算する必要があります。結果が出るまでもう一度。1桁に。これは、上記のプロセスを繰り返す必要があることを意味します。
そして、上記の考え方によれば、最終的な値はn%9で得られるように見えます
が、重要な問題があります。numが9の倍数である場合、上記のロジックは適用されません。もともと、n個の合計を101部に詰めて+散らばった101部の数を入力できないようにしたかったのです。共有数を計算する方法として、9でモジュロを取ることにより、割り切れない1を取得しますが、9で割り切れる場合、その1を取得できず、数を取得できません。自分の代わりに。
したがって、何か特別なことをする必要があります(num-1)%9 + 1
その理由:9個に完全に分割できるアイテムがn個あります。意図的に1つを削除してから、上記のロジックに戻って、10個にパッケージ化するn個のアイテムを取得できます。数+合計10のアリコートに収まらない散在する数の。そして、この1を引いたものは、10個の1個をパッケージ化したときの散らばったピースの数から借りることに相当します。元の10個の1個のパッケージの数には影響しません。最初に取り出してから元に戻します。数にのみ影響します。散乱の、それは問題ではありません。
国を指す大ボス
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
3、LeetCode 263.丑数
トピック
整数nが与えられた場合、nが醜い数であるかどうかを判断してください。そうである場合はtrueを返し、そうでない場合はfalseを返します。
醜い数は、素因数2、3、および/または5のみを含む正の整数です。
Xiaobianクッキングソリューション
public static boolean isUgly(int n) {
if (n<=0){
return false;
}
int[] nums = {
2,3,5};
for (int x : nums){
if (n%x == 0){
n /= x;
}
}
return n == 1;
}
4.ネザコミュニティ
为什么80%的码农做不了架构师?>>>
Java列ディレクトリ|ここをクリック
公開番号に注意してください:Nezhaプログラミング
Nezhaプログラミングは毎週高品質の記事を更新しています。注意を払った後、[CSDN]に返信して、Javaマインドマップ、Java学習資料、および大規模なインタビュー資料を受け取ります。
私にWeChatを追加してください:18525351592
あなたを技術交換グループに引き込みます。グループには多くの技術的な大物があり、技術を一緒に交換し、一緒に前進し、一緒に大きな工場に入り、技術書を無料で購入します~~