LeetCodeアルゴリズム、1日1つの質問、Alibabaに影響、7日目

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.ネザコミュニティ

ネザカップオープンソースSPLクイズコンテスト


为什么80%的码农做不了架构师?>>>

Java列ディレクトリ|ここをクリック

公開番号に注意してください:Nezhaプログラミング

Nezhaプログラミングは毎週高品質の記事を更新しています。注意を払った後、[CSDN]に返信して、Javaマインドマップ、Java学習資料、および大規模なインタビュー資料を受け取ります。

 

私にWeChatを追加してください:18525351592

あなたを技術交換グループに引き込みます。グループには多くの技術的な大物があり、技術を一緒に交換し、一緒に前進し、一緒に大きな工場に入り、技術書を無料で購入します~~

おすすめ

転載: blog.csdn.net/guorui_java/article/details/124335094