算法入門級題目

0. 算法是什么

算法是針對具體的問題設(shè)計解決問題的具體流程畅厢,并且有評價該處理流程的可量化的指標(biāo)饭寺。


1. 算法分類

算法也有很多的分類傅事,簡單來說的話,可以分為明確具體的流程宪郊,和明確嘗試的具體的流程兩類掂恕。

  • 明確具體的流程(a+b)
  • 明確嘗試的具體流程(a的所有的素數(shù))

2. 入門級別的算法題目

題目一:1!+2!+3!+...+n! 的結(jié)果

  • 算法思路:
    1! = 1
    2! = 1 \times 2
    3! = 1 \times 2 \times 3
    ......
    n! = 1 \times 2 \times 3 ... \times n
    所以拖陆,1!+2!+3!+...+n! = 1 + 1 \times 2 + 1 \times 2 \times 3 + ... + 1 \times 2 \times 3 ... \times n
    此時,我們假設(shè)每一個數(shù)字是 i, 一共有n個數(shù)懊亡,我們分別求得i的階乘依啰,然后想加起來。循環(huán)n遍即可得店枣。
    代碼如下:
  public static void factorial1(int n){
        int sum = 0;
//從1~n個數(shù)
        for(int i = 1; i <= n; i++){
            int curSum = 1;
//對每個i的數(shù)字求其階乘速警,1 * 2  * ...i 
            for(int j = 1; j <= i; j++){
                curSum *= j;
            }
            sum += curSum;
        }
        System.out.println(sum);
    }

這個算法思路解決了我們的問題,那我們看一下這個代碼鸯两,有兩個for循環(huán)闷旧,復(fù)雜度偏高,有沒有再優(yōu)化一下的思路呢钧唐。我們觀察忙灼,后一個的階乘是建立在前一個階乘的結(jié)果之上的。

  • 優(yōu)化思路:
    2! = 1! \times 2
    3! = 2! \times 3
    ...
    n! = (n-1)! \times n
    那么我們就不必重復(fù)去求得前一個數(shù)的階乘了钝侠,保存下來即可缀棍。
    優(yōu)化代碼:
public static void factorial(int n){
        int sum = 0;
        int facNum = 1;
        for (int i = 1; i <= n; i++){
            facNum *= i;
            sum += facNum;
        }
        System.out.println(sum);
    }

這個代碼可以清楚地看到我們少了一個for循環(huán),復(fù)雜度大大下降机错。
至此,求階乘的問題已經(jīng)解決了父腕,很多時候弱匪,我們拿到問題時,都不能一下子想到那個最優(yōu)解璧亮,沒關(guān)系萧诫,我們可以慢慢來,一步步分析枝嘶,先做到有那個最不優(yōu)的算法帘饶,然后再觀察,看是否可以進(jìn)一步優(yōu)化即可群扶。

題目二:選擇排序

算法思路:
在0~n-1位置找最小值及刻,交換放在0號位置;
在1~n-1位置找最小值竞阐,交換放在1號位置缴饭;
...
在n-2~n-1位置找最小值,交換放在n-2位置骆莹;
每輪都選出最小值颗搂,然后放在相應(yīng)的位置。


image.png

image.png

最終幕垦,這個數(shù)組就會被每輪選擇最小值然后交換丢氢,成為從小到大的有序數(shù)組傅联。

代碼如下:

   public static void selectSort(int[] arr){

        if(null == arr || arr.length < 2){
            return;
        }

        for(int i = 0; i < arr.length -1 ; i++){
            int minValueIndex = i;
            for(int j = i + 1; j < arr.length; j++){
                minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;
            }
            swap(arr, i, minValueIndex);
        }
    }

題目三:冒泡排序

算法思路:兩兩比較,較大的數(shù)向右移疚察。
在0~n-1 邊比較邊右移蒸走,將大的數(shù)向右沉;(最大的數(shù)在n-1位置)
在0~n-2 邊比較邊右移... (第二大的數(shù)在n-2位置)
...


image.png

image.png

一輪輪的比較交換比較交換后稍浆,數(shù)組就會成為從小到大的有序數(shù)組载碌。
代碼如下:

  public static void bubbleSort(int[] arr){
        if(null == arr || arr.length <2){
            return;
        }

        for(int end = arr.length-1; end >= 0; end --){
            for(int start = 0; start < end; start ++){
                if(arr[start] > arr[start+1]){
                    swap(arr, start, start+1);
                }
            }
        }
    }

題目四:插入排序

算法思路:局部形成有序,來一個數(shù)衅枫,進(jìn)行從右向左的比較嫁艇,將它插入在合適的位置。
在0位置有序弦撩;
在0~1位置有序步咪;
在0~2位置有序;
...


image.png

代碼如下:

public static void insertSort(int[] arr){
        if(null == arr || arr.length < 2){
            return;
        }

        for(int i = 1; i < arr.length; i++){
            for(int j = i-1; j >= 0 && arr[j] > arr[j+1]; j--){
                swap(arr, j, j+1);
            }
        }
    }

3. 總結(jié)

算法就是解決問題的處理流程益楼。
我們可以看到選擇排序猾漫,冒泡排序,插入排序都是復(fù)雜度為o(n^2),且頻繁交換或者頻繁比較感凤,說明這三個排序并不算是性能最好的排序悯周,但是它們易于理解和代碼編寫,算是新手入門的最佳例題陪竿。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末禽翼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子族跛,更是在濱河造成了極大的恐慌闰挡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礁哄,死亡現(xiàn)場離奇詭異长酗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桐绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門夺脾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茉继,你說我怎么就攤上這事劳翰。” “怎么了馒疹?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵佳簸,是天一觀的道長。 經(jīng)常有香客問我,道長生均,這世上最難降的妖魔是什么听想? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮马胧,結(jié)果婚禮上汉买,老公的妹妹穿的比我還像新娘。我一直安慰自己佩脊,他們只是感情好蛙粘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著威彰,像睡著了一般出牧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歇盼,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天舔痕,我揣著相機(jī)與錄音,去河邊找鬼豹缀。 笑死伯复,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邢笙。 我是一名探鬼主播啸如,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氮惯!你這毒婦竟也來了组底?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筐骇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后江滨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铛纬,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年唬滑,在試婚紗的時候發(fā)現(xiàn)自己被綠了告唆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晶密,死狀恐怖擒悬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稻艰,我是刑警寧澤懂牧,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響僧凤,放射性物質(zhì)發(fā)生泄漏畜侦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一躯保、第九天 我趴在偏房一處隱蔽的房頂上張望旋膳。 院中可真熱鬧,春花似錦途事、人聲如沸验懊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽义图。三九已至,卻和暖如春振惰,著一層夾襖步出監(jiān)牢的瞬間歌溉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工骑晶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痛垛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓桶蛔,卻偏偏與公主長得像匙头,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仔雷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容