Niuke.com - 質問のブラッシング

ced485cbb11e458d81a746890b32cf3f.gif

作者:流川メイプルノックコード

ブログホームページ:流川楓のブログ

コラム:私と一緒にJavaを学ぼう

引用:ハングリーでいて、愚かでいて

良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com

クリックして無料で登録し、私と一緒に質問をブラッシングしてください    

記事ディレクトリ

バージョン番号を比較する

 二分木の順序通りの走査

配列内で 1 回だけ出現する 2 つの数値

マージ間隔


バージョン番号を比較する

説明

Niuke プロジェクトがプロジェクト バージョンをリリースすると、1.02.11、2.14.4 などのバージョン番号が表示されます。

version1 と version2 の 2 つのバージョン番号が表示されます。サイズを比較してください。

バージョン番号は、リビジョン番号とリビジョン番号の間を「.」でつないだリビジョン番号で構成されます。リビジョン番号は複数の数字で構成される場合があり、リビジョン番号には先頭に 0 が含まれる場合があり、有効です。たとえば、1.02.11、0.1、0.2 はすべて有効なバージョン番号です

各バージョン番号には、少なくとも 1 つのリビジョン番号が含まれています。

リビジョン番号は左から右に番号が付けられ、下付き文字は 0 から始まり、一番左のリビジョン番号には下付き文字 0、次のリビジョン番号には下付き文字が 1 というように付けられます。

比較規則:

1. バージョン番号を比較するときは、左から順にリビジョン番号を比較します。リビジョン番号を比較するときは、先頭のゼロを無視して整数値を比較してください。たとえば、「0.1」と「0.01」のバージョン番号は同じです

2. バージョン番号が添え字にリビジョン番号を指定しない場合、リビジョン番号は 0 と見なされます。たとえば、「1.1」のバージョン番号は「1.1.1」よりも小さいです。「1.1」のバージョン番号は「1.1.0」に相当するため、3 番目のリビジョン番号の添え字は 1 より小さい 0 です。

3. version1 > version2 は、version1 < version2 の場合は 1 を返し、それ以外の場合は 0 を返します。

データ範囲:

1 <= version1.length、version2.length <= 10001<=version1.length、version2.length<=1000


version1と version2 のリビジョン番号は、int の表現範囲、つまり 32 ビット整数の範囲を超えることはありません。

 

知識ポイント: 文字列、ダブルポインター

答え:

import java.util.*;

public class Solution {
    
    public int compare (String version1, String version2) {
        // write code here
        String[] numsOfV1 = version1.split("\\."); // 记得这里分割的时候需要加两个斜杠
        String[] numsOfV2 = version2.split("\\.");
        
        int index = 0;
        
        while (index < numsOfV1.length && index < numsOfV2.length) {
            int num1 = Integer.parseInt(numsOfV1[index]);
            int num2 = Integer.parseInt(numsOfV2[index]);
            if (num1 > num2) {
                return 1;
            } else if (num1 < num2) {
                return -1;
            }
            index ++;
        }
        
        while (index < numsOfV1.length) {
            int num1 = Integer.parseInt(numsOfV1[index]);
            if (num1 > 0) {
                return 1;
            }
            index ++;
        }
        
        while (index < numsOfV2.length) {
            int num2 = Integer.parseInt(numsOfV2[index]);
            if (num2 > 0) {
                return -1;
            }
            index ++;
        }
        
        return 0;
    }
}

 二分木の順序通りの走査

説明

バイナリ ツリーのルート ノード ルートを指定して、その順序通りのトラバーサル結果を返します。

データ範囲: ツリーのノード数が 0 \le n \le 10000≤n≤1000 を満たし、ツリーの各ノードの値が 0 \le val \le 10000≤val≤1000 を満たします。
詳細: 空間の複雑度 O( n)O (n)、時間複雑度 O(n)O(n)

 

知識のポイント: 木、再帰、幅優先探索 (BFS)

 答え:

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] inorderTraversal (TreeNode root) {
        // write code here
        if(root == null)return new int[0];
        ArrayList<Integer> ans = new ArrayList<>();
        inOrder(root, ans);
        int[] res = new int[ans.size()];
        int i=0;
        for(int n: ans){
            res[i++] = n;
        }
        return res;
    }
    public void inOrder(TreeNode node, ArrayList<Integer> ans){
        if(node == null)return;
        inOrder(node.left, ans);
        ans.add(node.val);
        inOrder(node.right, ans);
    }
}

配列内で 1 回だけ出現する 2 つの数値

説明

整数配列では、1 回だけ出現する 2 つの数値を除いて、他のすべての数値は 2 回出現します。この 2 つの数字が 1 回しか現れないことを見つけるプログラムを作成してください。

データ範囲: 配列の長さ 2\le n \le 10002≤n≤1000、配列内の各数値のサイズ 0 < val \le 10000000<val≤1000000
要件: 空間複雑度 O(1)O(1)、時間複雑度O(n)O(n)

ヒント: 出力は降順ではありません。

 

知識のポイント: ビット操作、ハッシング

 答え:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    public int[] FindNumsAppearOnce (int[] array) {
        // write code here
        int tmp = 0, n = array.length;
        for(int i=0; i<n; i++){
            tmp ^= array[i];
        }
        int div = 1;
        while(tmp != 0){
            if((tmp & 1) == 1) div <<= 1;
            tmp >>= 1;
        }
        int a = 0, b = 0;
        for(int i=0; i<n; i++){
            if((array[i] & div) != 0) a ^= array[i];
            else b ^= array[i];
        }
        return new int[]{b, a};
    }
}

マージ間隔

説明

間隔のセットを指定して、重複するすべての間隔をマージします。

マージされた間隔が、間隔の開始点から昇順に配置されていることを確認してください。

データ範囲: 間隔グループ番号 0 \le n \le 2 \times 10^50≤n≤2×105、間隔内の値は 0 \le val \le 2 \times 10^50≤val≤2× を満たす105

要件: 空間複雑度 O(n)O(n)、時間複雑度 O(nlogn)O(nlogn)

高度: 空間の複雑さ O(val)O(val)、時間の複雑さ O(val)O(val)

知識ポイント: 並べ替え、配列

答え:

import java.util.*;
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        if (intervals.size() == 0) {
            return new ArrayList<>();
        }
        Collections.sort(intervals, new Comparator<Interval>() {
            public int compare(Interval o1, Interval o2) {
                if (o1.start != o2.start) {
                    return o1.start - o2.start;
                } else {
                    return o1.end - o2.end;
                }
            }
        });
        
        ArrayList<Interval> result = new ArrayList<>();
        result.add(intervals.get(0));
        int count = 0;
        for (int i = 1; i < intervals.size(); i++) {
            Interval o1 = intervals.get(i);
            Interval origin = result.get(count);
            if (o1.start > origin.end) {
                result.add(o1);
                count++;
            } else {
                result.remove(count);
                Interval s = new Interval(origin.start, o1.end);
                if (o1.end < origin.end) {
                    s.end = origin.end;
                }
                result.add(s);
            }
        }
        return result;
        
    }
}

「この問題の共有はこちらです。ブロガーに 3 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!

ced485cbb11e458d81a746890b32cf3f.gif

おすすめ

転載: blog.csdn.net/chenchenchencl/article/details/126611559