作者:流川メイプルノックコード
ブログホームページ:流川楓のブログ
コラム:私と一緒にJavaを学ぼう
引用:ハングリーでいて、愚かでいて
良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com
記事ディレクトリ
バージョン番号を比較する
説明
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 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!