これを最初に書いた理由について話しましょう。インタビューに行ったとき、私はインタビューの前日にアリババの指定インタビューシティに行きました。さらに、1時ごろに滞在しました、翌日、インタビューの結果に直接つながった(仕事を探している大きなエビのために、エビへの悲劇を言うべきではない1時間(インタビューから戻ったとき、私は歩いたとき、私はほとんど眠っていました、悲しい!!)インタビューが終わったとき、インタビュアーはフィボナッチのシーケンスについて質問しました、私の心は完全に混乱していましたそして、私は3つの変数を設定しなければならないことを知っていました終わり、私はインタビュアーの段階的な誘導の下でのみ、アリババはすべてを加えています改革と金の採掘のための黄金時代(能力があればすぐに行くことができます)。ガベージを使用すると、Alibabaは、マスターした多様なユーザーの詳細データを分析し、ユーザーの好みとニーズをより適切に配置し、正確なプッシュと正確な広告プッシュを提供できます。テンセントの将来の夢がユーザーの生活の中で水、電気、ガスになることである場合、アリババの将来の夢は、ユーザーの食べ物、衣類、住宅と輸送、水、電気とガスの収集などです。 o〜トピックに目を向けましょう。
優れたアルゴリズムデザイナーの場合、プログラム関数本文の実装に基づいて関心があるのは2つしかありません。1つは設計アルゴリズムの時間の複雑さであり、もう1つは空間の複雑さです(率直に言って、プログラムを実行するために使用される時間とメモリは、さまざまなアプリケーションシナリオに基づいています。要件は、一般に時間のスペースリソースを交換します。または、一般的に使用されるオブジェクトは、通常、応答時間を改善するためにメモリに存在します(キャッシュテクノロジーと、比較的価値のあるメモリリソースを備えた埋め込みシステムの場合、最も人気のあるNOSQLデータベースが使用されます。埋め込まれたシステムの場合。
Febonasiシリーズの3つの実装について話しましょう。
まず、Febonasiシーケンスについて話しましょう。
テキストの観点から、フィボナッチシーケンスは0と1で始まり、その後のフィボナッチ係数は前の2つの数値によって追加され、シーケンス形式は次のとおりです。
0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、…………………
数学では、再帰的な方法で定義されています。
f_0 = 0
f_1 = 1
f_n = f_ {n-1}+ f_ {n-2}
要件を実装します:シリアル番号nを入力して、対応するFebonacci番号を取得するために戻ります
プログラムの実装1-機能の自己評価
コードコピーは次のとおりです。
/**
*機能の自己評価
* @title:fntype1
* @description:todo
* @param @param n
* @param @return
* @return int
* @Throws例外
*/
public int fntype1(int n)スロー例外{
if(n == 0){
0を返します。
} else if(n == 1 || n == 2){
返品1;
} else if(n> 2){
int temp = fntype1(n-1)+fntype1(n-2);
if(temp <0){
新しい例外をスローします( "intタイプの無効な値、大きすぎる");
}それ以外{
return temp;
}
}それ以外{
新しい例外をスローします( "nの違法な値、n> = 0を入力してください);
}
}
この方法の欠点:多数の反復がスタックスペースを継続的に消費します(Web開発、デバッグ、メンテナンスに従事する人はサーバースタックリソースの価値を知っている必要があります。長い間、Webサーバーがクラッシュします)。この方法では、これを使用することは一般に、デバッグが困難です。
プログラムの実装2-スペースへの時間
コードコピーは次のとおりです。
/**
*スペースを変更する時間
* @title:fntype2
* @description:todo
* @param @param n
* @param @return
* @return int(n <0 return -1、max int size return -2を超えて)
* @Throws
*/
public int fntype2(int n){
int result = -1;
int temp1 = 0;
int temp2 = 1;
for(int index = 0; index <= n; index ++){
if(index == 0){
result = temp1;
} else if(index == 1){
result = temp2;
}それ以外{
result = temp1+temp2;
if(result <0){
結果= -2;
壊す;
}
temp1 = temp2;
temp2 = result;
}
}
返品結果;
}
この方法は、主に以下で使用されます。シナリオ1:オブジェクトまたは変数が頻繁に使用され、1回使用した後に再度使用されないシナリオの場合。 。
プログラムの実装3-時間の空間
コードコピーは次のとおりです。
private static list <integer> fndata = new ArrayList <Integer>();
Private static final int maxsize = 50000;
/**
*イニシャルイザー
* @title:setfndata
* @description:todo
* @param
* @return void
* @Throws
*/
private static void setfndata(){
int result = -1;
int temp1 = 0;
int temp2 = 1;
for(int index = 0; index <= maxsize; index ++){
if(index == 0){
result = temp1;
} else if(index == 1){
result = temp2;
}それ以外{
result = temp1+temp2;
if(result <0){
結果= -2;
壊す;
}
temp1 = temp2;
temp2 = result;
}
fndata.add(result);
}
}
/**
*外部インターフェイス
* @title:getfndata
* @description:todo
* @param @param n
* @param @return
* @return int <span style = "font-family:sans-serif;">(n beyond fndata.size()およびn <0 return -1)</span>
* @Throws
*/
public int getfndata(int n){
if(fndata.size()== 0){
setfndata();
}
if(fndata.size()> n && n> = 0){
fndata.get(n)を返します。
}それ以外{
return -1;
}
}
この方法は、一般に、外部WebServiceインターフェイス、抽象化永続性レイヤー、一般的に使用される構成ファイルパラメーターの読み込みなど、プログラムのライフサイクル全体でオブジェクトまたは変数が存在するシナリオで使用されるか、頻繁に呼び出されます。
テストケース:
コードコピーは次のとおりです。
パッケージcom.dbc.yangg.swing.test;
java.util.arraylistをインポートします。
java.util.listをインポートします。
/**
*シーケンス番号nを入力して、対応するFebonacci番号を取得するために戻ります
* @classname:init
* @description:todo
* @author [email protected]
* @date 2014年1月10日午後7時52分13分
*
*/
パブリッククラスinit {
/**
*機能の自己評価
* @title:fntype1
* @description:todo
* @param @param n
* @param @return
* @return int
* @Throws例外
*/
public int fntype1(int n)スロー例外{
if(n == 0){
0を返します。
} else if(n == 1 || n == 2){
返品1;
} else if(n> 2){
int temp = fntype1(n-1)+fntype1(n-2);
if(temp <0){
新しい例外をスローします( "intタイプの無効な値、大きすぎる");
}それ以外{
return temp;
}
}それ以外{
新しい例外をスローします( "nの違法な値、n> = 0を入力してください);
}
}
/**
*スペースを変更する時間
* @title:fntype2
* @description:todo
* @param @param n
* @param @return
* @return int(n <0 return -1、max int size return -2を超えて)
* @Throws
*/
public int fntype2(int n){
int result = -1;
int temp1 = 0;
int temp2 = 1;
for(int index = 0; index <= n; index ++){
if(index == 0){
result = temp1;
} else if(index == 1){
result = temp2;
}それ以外{
result = temp1+temp2;
if(result <0){
結果= -2;
壊す;
}
temp1 = temp2;
temp2 = result;
}
}
返品結果;
}
private static list <integer> fndata = new ArrayList <Integer>();
Private static final int maxsize = 50000;
/**
*時間を変更するスペース
* @title:setfndata
* @description:todo
* @param
* @return void
* @Throws
*/
private static void setfndata(){
int result = -1;
int temp1 = 0;
int temp2 = 1;
for(int index = 0; index <= maxsize; index ++){
if(index == 0){
result = temp1;
} else if(index == 1){
result = temp2;
}それ以外{
result = temp1+temp2;
if(result <0){
結果= -2;
壊す;
}
temp1 = temp2;
temp2 = result;
}
fndata.add(result);
}
}
/**
*
* @title:getfndata
* @description:todo
* @param @param n
* @param @return
* @return int(n beyond fndata.size()およびn <0 return -1)
* @Throws
*/
public int getfndata(int n){
if(fndata.size()== 0){
setfndata();
}
if(fndata.size()> n && n> = 0){
fndata.get(n)を返します。
}それ以外{
return -1;
}
}
/**
*
* @title:メイン
* @description:todo
* @param @param argv
* @return void
* @Throws
*/
public static void main(string [] argv){
init init = new init();
int n = 46;
試す {
System.out.println( "type1 ="+init.fntype1(n));
} catch(例外e){
// TODO自動生成キャッチブロック
System.out.println(e.getMessage());
}
System.out.println( "type2 ="+init.fntype2(n));
System.out.println( "type3 ="+init.getfndata(n));
}
}
出力結果:
コードコピーは次のとおりです。
Type1 = 1836311903
Type2 = 1836311903
Type3 = 1836311903
アルゴリズムを設計する場合、概念は盲目的に死んでいます(この時代には、特定のアプリケーションシナリオを組み合わせることによって、アイデアを持つことができます。
文句を言ってみましょう:優れたデータ構造設計により、アルゴリズムの設計の複雑さを簡素化し、コードの読みやすさ、プログラムのスケーラビリティ、実行効率を改善できると個人的に信じています。
もう一度文句を言ってみましょう:需要分析を行うときは、ユーザーの視点と考え方からの分析を行う必要があります。プログラム開発の原則は次のとおりです。自分の好みを積極的に改善し、ユーザーの使用の観点と使用のシナリオからの機能を分析します。ユーザーが次の状況で呼び出されます。パラメーターを渡すことによって、どのような例外が発生する可能性がありますか、インターフェイスの実装とキャプチャの例外、クリアな出力、良好な機能自閉症。次に、ビジネスの実装を確保することに基づいて、ユーザーの使用習慣やその他の側面の観点からUIをユーザーとして設計する必要があります。非常に興味深いですよね?