序文
パンチ日
2019.10 0.26パンチ
アルゴリズム、方法、すなわち、問題を解決するために。同じ結果を得るが、それは時間がかかり、リソースが異なっているが、異なるアルゴリズムを使用して同じ質問、。これは、私たちは優れているアルゴリズムを見つけるために、学習アルゴリズムが必要です。
我々は、すべてのアルゴリズムがインタビュー巨大なリングに不可欠であることを知っています。あなたはメーカーが自分自身を向上させるために働く入力する予定ので、もし仕事で普通のプログラマたちの最も少ない接触アルゴリズムとして、彼らはプログラミングのスキルを向上させるアルゴリズムとデータ構造を習得するための練習を審議しなければなりません。
「グッド」の標準的なアルゴリズム
問題のアルゴリズムは、(精度と呼ばれる)は、この問題を解決することができなければならないすべての最初の、アルゴリズムと呼ばれています。第二に、このプログラムのアルゴリズム記述された要求を介していずれの場合にも(ロバスト性と呼ばれる)崩壊することができません。プログラミングアルゴリズム、操作の方法を効率化することによって:精度と堅牢性が満たされた場合には、我々は最も重要な点を考慮する必要があります。
動作効率は二つの側面に反映しました。
- アルゴリズムの実行時間。(「時間計算」と呼ばれます)
- アルゴリズムのメモリ空間を実行するために必要。(「宇宙の複雑さ」ともいいます)
グッド標準アルゴリズムはこれです:アルゴリズム自体の要件への準拠に基づいて、あなたはこのアルゴリズムはある呼び出すことができます短い、少ない実行中のプロセスのメモリ空間占有されている時間を実行しているアルゴリズム書かれたプログラムを使用して「良いアルゴリズム。」
タイトル
。Leetcode136は一日一回のみデジタル表示される
アレイ:カテゴリー
、トピックのリンク:https://leetcode-cn.com/problems/single-number/
タイトル説明
整数の非空の配列を考えると、要素に加えて、一度だけ表示され、各要素の残りの部分は二回表示されます。要素のみに一度表示されていることを知るために。
説明:
あなたのアルゴリズムは線形時間複雑性を持っている必要があります。あなたはそれを達成するために余分なスペースを使用することはできませんか?
実施例1:
入力:[2,2,1]
出力:1
(実施例2):
入力:[4,1,2,1,2]
出力:4
問題の解決策
それを自分で行います
- 考え
追加のHashMapのは、配列の各要素を格納し、最終的に1である番号を削除するには(それは、このアプローチは非常に低い動作効率の良いアイデアでなければならないものではありません、タイトルを参照してください)
- コードの実装
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> temp = new HashMap<>();
for (int i : nums) {
temp.put(i, temp.get(i) == null ? 1 : temp.get(i) + 1);
}
for (int i : nums) {
if (temp.get(i) == 1) {
return i;
}
}
return 0;
}
}
- 複雑性分析
- 時間計算量:O(N + N)= O(N)。
for
サイクルタイムの複雑さはO(N)です。 - 複雑スペース:O(n)を。HashMapのスペース必要NUMSは、要素の数に等しいです。
- 結果
最適な解決策:ビットオペレーティング
- 考え
- それ自体のために0または排他任意の数:0 ^ N => N
- XORの同じ番号は0であり、N ^ N => 0
- XOR(排他的OR)可換と連想:^ B ^ A =(A ^ A)^ B = 0 ^ B = B
だから我々はそれだけで一意の番号を取得するには、すべての数字のXOR演算を実行する必要があります。
- コードの実装
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i : nums) {
result^=i;
}
return result;
}
}
- 複雑性分析
- 時間の複雑さ:O(n)を。NUMSのみ再度要素を横断する必要があるので、時間計算量はNUMS内の要素の数です。
- 複雑スペース:O(1)。
結果
結論
あなたは、少なくとも2回以上行っていることを示唆している、あなたは、いくつかの新しい技術や方法を見つけるかもしれません。運動中、故意にこの質問への答えを戻っていない、これは、自分の思考スキルとプログラミングのスキルを向上させるために、自分の問題を解決するために、その答えを参照しないように最初の恒久的な解決策ではありません。
今日はパンチカードの最初の日で、この開発と動作するように、アルゴリズムの重要性を理解し、我々はこの知識の一部を拾うために時間を取る必要があります。それが最初のパンチであるため、おそらく、今日は完全な2時間を過ごしました。
友達と進捗状況をパンチしたい、私は公共の数に焦点を歓迎:ノックコードと恋に落ちるが、定期的に乾燥し、技術的な水泳を聞かせて、仕事にJava技術を共有します!