国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

十道簡(jiǎn)單算法題二【Java實(shí)現(xiàn)】

Pluser / 523人閱讀

摘要:前言清明不小心就拖了兩天沒更了這是十道算法題的第二篇了上一篇回顧十道簡(jiǎn)單算法題最近在回顧以前使用寫過的數(shù)據(jù)結(jié)構(gòu)和算法的東西,發(fā)現(xiàn)自己的算法和數(shù)據(jù)結(jié)構(gòu)是真的薄弱,現(xiàn)在用改寫一下,重溫一下。

前言

清明不小心就拖了兩天沒更了~~

這是十道算法題的第二篇了~上一篇回顧:十道簡(jiǎn)單算法題

最近在回顧以前使用C寫過的數(shù)據(jù)結(jié)構(gòu)和算法的東西,發(fā)現(xiàn)自己的算法和數(shù)據(jù)結(jié)構(gòu)是真的薄弱,現(xiàn)在用Java改寫一下,重溫一下。

只能說慢慢積累吧~下面的題目難度都是簡(jiǎn)單的,算法的大佬可直接忽略這篇文章了~入門或者算法薄弱的同學(xué)可參考一下~

很多與排序相關(guān)的小算法(合并數(shù)組、獲取數(shù)字每位值的和),我都沒有寫下來了,因?yàn)橹灰獣?huì)了歸并排序(合并數(shù)組),會(huì)了桶排序(獲取數(shù)字每位的值),這些都不成問題了。如果還不太熟悉八大基礎(chǔ)排序的同學(xué)可看:【八大基礎(chǔ)排序總結(jié)】

由于篇幅問題,每篇寫十道吧~

如果有錯(cuò)的地方,或者有更好的實(shí)現(xiàn),更恰當(dāng)?shù)睦斫夥绞较M蠹也涣咴谠u(píng)論區(qū)留言哦~大家多多交流

十道簡(jiǎn)單算法題 題目的總覽

刪除下標(biāo)為k的元素

找出常用的數(shù)字

丟失的數(shù)字

將0放在數(shù)組最后

找出數(shù)組的單個(gè)數(shù)字

畫三角形星星

羅馬數(shù)字倒轉(zhuǎn)成阿拉伯?dāng)?shù)字

啤酒與飲料

簡(jiǎn)單凱撒密碼

求最大公約數(shù)

一、刪除下標(biāo)為k的元素
刪除下標(biāo)為k的元素

思路:數(shù)組后一位往前覆蓋即可~


    /**
     * 刪除下標(biāo)為k的元素
     */
    public static void deleteK() {


        //固定的常量(比數(shù)組元素的個(gè)數(shù)要大)
        int N = 10;

        int[] arrays = new int[N];

        //對(duì)數(shù)組進(jìn)行初始化
        for (int i = 0; i < 8; i++) {
            arrays[i] = i;
        }


        //要?jiǎng)h除下標(biāo)
        int k = 7;

        for (int i = k; i < N - 1; i++) {
            arrays[i] = arrays[i + 1];
        }


        System.out.println("公眾號(hào):Java3y" + arrays);


    }
二、找出常用的數(shù)字
給你一個(gè)長(zhǎng)度為n的數(shù)組,其中有一個(gè)數(shù)字出現(xiàn)的次數(shù)至少為n/2,找出這個(gè)數(shù)字

這道題可以用棧的思想來做:

如果棧是空的,那么先把數(shù)據(jù)存進(jìn)去

然后繼續(xù)遍歷其他的數(shù)據(jù),只要發(fā)現(xiàn)棧中的數(shù)據(jù)和遍歷中的數(shù)據(jù)不一樣,那么就出棧

如果是相同的,那么就入棧

其實(shí)就是捉住數(shù)字出現(xiàn)的次數(shù)多于數(shù)組一半的長(zhǎng)度這里入手。如果這個(gè)數(shù)出現(xiàn)的次數(shù)是大于這個(gè)數(shù)組長(zhǎng)度的2/1,那么最后留下的肯定是這個(gè)數(shù)

    /**
     * 找出常用的數(shù)字:
     * 給你一個(gè)長(zhǎng)度為n的數(shù)組,其中有一個(gè)數(shù)字出現(xiàn)的次數(shù)至少為n/2,找出這個(gè)數(shù)字
     */

    public static void findMajorityElement(int[] arrays) {


        //構(gòu)建一個(gè)靜態(tài)棧
        int[] stack = new int[arrays.length];

        // 棧的front指針
        int front = -1;


        // 遍歷給出的數(shù)組
        for (int i = 0; i < arrays.length; i++) {


            // 判斷該棧為空,那么直接將元素入棧
            if (front == -1) {
                stack[++front] = arrays[i];
            } else if (stack[front] == arrays[i]) { // 該元素是否與棧的元素一致-->繼續(xù)入棧

                stack[++front] = arrays[i];
            } else {
                // 只要不一致,就出棧
                front--;

            }
        }

        // 只要該數(shù)字出現(xiàn)次數(shù)大于數(shù)組長(zhǎng)度的2/1,那么留下來的數(shù)字肯定在棧頂中
        System.out.println("關(guān)注公眾號(hào):Java3y--->" + stack[0]);
    }

優(yōu)化:

其實(shí)沒必要用整個(gè)棧來裝載數(shù)組,因?yàn)槲覀兙?strong>使用棧頂元素(出現(xiàn)次數(shù)最多的那個(gè)),而棧的大小也可以通過一個(gè)變量就可以來確定了

只要元素相同->入棧(長(zhǎng)度+1)。元素不相同-->出棧(長(zhǎng)度-1)

最終留下來的肯定是出現(xiàn)最頻繁的那個(gè)數(shù)字!


    public static void findMajorityElement2(int[] arrays) {

        // 裝載棧的元素
        int candidate = -1;

        // 棧的大小(長(zhǎng)度)
        int count = 0;


        // 遍歷給出的數(shù)組
        for (int i = 0; i < arrays.length; i++) {


            // 判斷該棧為空,那么直接將元素入棧
            if (count == 0) {

                candidate = arrays[i];
                count++;

            } else if (candidate == arrays[i]) { // 該元素是否與棧的元素一致-->入棧(棧多一個(gè)元素)
                count++;
            } else {
                // 只要不一致-->出棧(棧少一個(gè)元素)
                count--;

            }
        }

        // 只要該數(shù)字出現(xiàn)次數(shù)大于數(shù)組長(zhǎng)度的2/1,那么留下來的數(shù)字肯定在棧頂中
        System.out.println("關(guān)注公眾號(hào):Java3y--->" + candidate);

    }
三、丟失的數(shù)字
給你一個(gè)數(shù)組{0,1,2,3,....n},其中有一個(gè)數(shù)字缺失,請(qǐng)把缺失的數(shù)字找出來

思路:

創(chuàng)建一個(gè)數(shù)組(題目數(shù)組的長(zhǎng)度+1,因?yàn)轭}目的數(shù)組缺失了一個(gè))

創(chuàng)建的數(shù)組元素用特殊的符號(hào)(數(shù)字)來進(jìn)行填滿

將題目給出的數(shù)組遍歷并填充到創(chuàng)建的數(shù)組上,用index(0,1,2,3..)替代

最后遍歷創(chuàng)建的數(shù)組,哪個(gè)還是特殊的符號(hào)就是缺失的數(shù)字,返回index(缺失的數(shù)字)即可

    /**
     * 找到缺失的數(shù)字
     *
     * @param arrays
     */
    public static void missingNumber(int[] arrays) {


        // 定義要填充到新數(shù)組的數(shù)字(隨意)
        int randomNumber = 89898980;


        // 創(chuàng)建一個(gè)新的數(shù)組(比已缺失的數(shù)組多一個(gè)長(zhǎng)度)
        int[] newArrays = new int[arrays.length + 1];

        // 填充特殊的數(shù)字進(jìn)新數(shù)組中
        for (int i = 0; i < newArrays.length; i++) {

            // 隨意填充數(shù)組到新數(shù)組中
            newArrays[i] = randomNumber;
        }

        // 遍歷題目的數(shù)組并使用index替代掉新數(shù)組的元素
        for (int i = 0; i < arrays.length; i++) {

            // 題目數(shù)組的值[0,1,2,3,4,...n]其中有一個(gè)缺失
            int index = arrays[i];

            // 重新填充到新數(shù)組上,index對(duì)應(yīng)著題目數(shù)組的值
            newArrays[index] = 3333333;
            
        }

        // 遍歷新數(shù)組,只要還有值為89898980,那么那個(gè)就是缺失的數(shù)字
        for (int i = 0; i < newArrays.length; i++) {


            if (newArrays[i] == randomNumber) {

                System.out.println("關(guān)注公眾號(hào):Java3y---->缺失的數(shù)字是:" + i);

            }


        }


    }

結(jié)果:

優(yōu)化:

題目給出的數(shù)組{0,1,2,3,4,5,....n}其中缺失一個(gè)數(shù)字,要把缺失的數(shù)字找出來...我們可以回顧一下高中學(xué)過的等差求和公式:Sn=(a1+an)n/2

假設(shè)我們沒有缺失數(shù)字,等差求和公式可以快速得出答案。比如:{0,1,2,3}--->(0+3)*4/2--->6,如果此時(shí)缺失的是2呢,就是說題目的給出的數(shù)組是:{0,1,3},我們利用等差公式求和之后減去數(shù)組每個(gè)元素,最后剩下的數(shù)就是缺失的數(shù)字!6-1-3-0--->2

所以,我們可以寫出這樣的代碼:

    /**
     * 利用等差公式找到缺失的數(shù)字
     *
     * @param arrays
     */
    public static void missingNumber2(int[] arrays) {

        // 套用等差求和公式
        int sum = (arrays[0] + arrays[arrays.length - 1]) * (arrays.length + 1) / 2;


        // 遍歷數(shù)組,得出的sum減去數(shù)組每一位元素,最后即是缺失的數(shù)字

        for (int value : arrays) {
            sum = sum - value;
        }


        System.out.println("關(guān)注公眾號(hào):Java3y---->缺失的數(shù)字是:" + sum);


    }

結(jié)果:

四、將0放在數(shù)組最后
將一個(gè)數(shù)組的元素,其中是0的,放在數(shù)組的最后

思路:

使用一個(gè)變量zero來記住該數(shù)組有多少個(gè)0

遍歷這個(gè)數(shù)組,如果發(fā)現(xiàn)不是0的,就往數(shù)組前面移動(dòng),如果發(fā)現(xiàn)是0就zero++

數(shù)組移動(dòng)的位置剛好是arr[i-zero]

代碼實(shí)現(xiàn):

    /**
     * 移動(dòng)元素0到數(shù)組最后
     *
     * @param arrays
     */
    public static void moveZero(int[] arrays) {

        // 記錄該數(shù)組有多少個(gè)0元素
        int zero = 0;


        for (int i = 0; i < arrays.length; i++) {

            // 只要元素不為0,那么就往前面移動(dòng)
            if (arrays[i] != 0) {
                arrays[i - zero] = arrays[i];
            } else {
                // 如果為0,那么zero ++
                zero++;
            }
        }


        // 1. 前面已經(jīng)將非0的元素移動(dòng)到數(shù)組的前面了
        // 2. 將為0的元素填滿數(shù)組,填充的位置就從length - zero開始


        int j = arrays.length - zero;
        while (j < arrays.length) {
            arrays[j] = 0;
            j++;
        }

        System.out.println("關(guān)注公眾號(hào):Java3y---->" + arrays);


    }

結(jié)果:

還可以換種思路(差別不大):將數(shù)組分成幾個(gè)部分:在j之前的沒有0,j到i全是0,i后面還沒有遍歷

如果遍歷到的數(shù)字不是0,那么跟j進(jìn)行交換,j++(保證j前面沒有0和j到i全是0)

直至i遍歷完畢后,j前面都不是0,j-i都是0(這就完成我們的任務(wù)了)

代碼實(shí)現(xiàn):

    /**
     * 移動(dòng)元素0到數(shù)組最后
     *
     * @param arrays
     */
    public static void moveZero2(int[] arrays) {


        // 在j前面的元素都不是0
        int j = 0;


        for (int i = 0; i < arrays.length; i++) {

            if (arrays[i] != 0) {

                // 跟j進(jìn)行交換,保證j的前面都不是0
                int temp = arrays[i];
                arrays[i] = arrays[j];
                arrays[j]  = temp;

                j++;
            }
        }

        // 直至i遍歷完畢后,j前面都不是0,j-i都是0(這就完成我們的任務(wù)了)


        System.out.println("關(guān)注公眾號(hào):Java3y---->" + arrays);



    }

結(jié)果還是一樣的:

五、找出數(shù)組的單個(gè)數(shù)字
給你一個(gè)數(shù)組,除了一個(gè)數(shù)字外,其他的數(shù)字都出現(xiàn)了兩次,請(qǐng)把這個(gè)只出現(xiàn)一次的數(shù)字找出來。

思路:

將該數(shù)組遍歷一次,記錄每個(gè)數(shù)字出現(xiàn)的次數(shù)

如果該數(shù)字出現(xiàn)的次數(shù)只有1,那么該數(shù)字就是單個(gè)數(shù)字~





    /**
     * 找出數(shù)組的單個(gè)數(shù)字
     * @param nums
     * @return
     */
    public static void singleNumber(int[] nums) {

        for (int i = 0; i < nums.length; i++) {

            int count = countNumber(nums, nums[i]);


            // 如果該元素只出現(xiàn)一次,那么就是它了!
            if (count == 1) {
                System.out.println("關(guān)注公眾號(hào):Java3y--->單一的元素是:" + nums[i]);

                return ;


            }


        }
    }

    /**
     * 找出每個(gè)元素出現(xiàn)的次數(shù)
     * @param nums 數(shù)組
     * @param value 想知道出現(xiàn)次數(shù)的元素
     */

    public static int countNumber(int[] nums,int value) {


        int count = 0;

        for (int i = 0; i < nums.length; i++) {
            if (value == nums[i]) {
                count++;
            }
        }
        // 返回該元素出現(xiàn)的次數(shù)
        return count;
    }


結(jié)果:

優(yōu)化:

這個(gè)問題最佳的解法是用到了位運(yùn)算的異或操作

如果5^5=0

如果5^7^5 = 7

如果5^6^6^5^7^8^7 = 8

從上面的例子可以看出:一堆數(shù)字做異或運(yùn)算^,倆倆相同數(shù)字就會(huì)被抵消掉~,所以這個(gè)特性對(duì)于這個(gè)題目而言就再適合不過的了:

    /**
     * 找出數(shù)組的單個(gè)數(shù)字
     * @param nums
     * @param numsSize
     * @return
     */
    public static int singleNumber(int[] nums, int numsSize) {

        // 第一個(gè)數(shù)和數(shù)組后面的數(shù)做^運(yùn)算,留下的必然是單個(gè)數(shù)字
        int k = nums[0];
        for (int i = 1; i < numsSize; i++) {
            k = (k ^ nums[i]);
        }
        return k;
    }
六、畫三角形星星
畫三角形星星

就是要畫上面那種三角形星星,那怎么畫呢??

思路:

首先,我們可以發(fā)現(xiàn):每行星星的個(gè)數(shù)是(2*行數(shù)-1),每行的空格數(shù)就是最大行數(shù)減去第n行(最大4行,第4行沒有空格,最大4行,第三行1個(gè)空格)

有了上面的規(guī)律,套個(gè)for循環(huán)即可生成三角形星星~

實(shí)現(xiàn)代碼:


    /**
     * 畫星星
     */
    public static void drawStar() {

        // 我要畫5行的星星
        int row = 5;


        for (int i = 1; i <= 5; i++) {

            // 空格數(shù)等于最大行數(shù) - 當(dāng)前行數(shù)
            for (int j = 1; j <= row - i; j++) {
                System.out.print(" ");
            }

            // 星星數(shù)等于(當(dāng)前行數(shù)*2-1)
            for (int j = 1; j <= i * 2 - 1; j++) {

                System.out.print("*");

            }

            // 每畫一行就換一次行
            System.out.println();
        }
    }

結(jié)果:

七、羅馬數(shù)字倒轉(zhuǎn)成阿拉伯?dāng)?shù)字
羅馬數(shù)字倒轉(zhuǎn)成阿拉伯?dāng)?shù)字

羅馬數(shù)字我們可能在英語的題目中看得是比較多的,一般常用的我們是阿拉伯?dāng)?shù)字,那怎么轉(zhuǎn)成阿拉伯?dāng)?shù)字呢??我們先來了解一下羅馬數(shù)字:

ps:來源360百科

規(guī)則在圖上已經(jīng)說得挺明白的了,我舉幾個(gè)例子:

左邊的數(shù)比右邊小,則是用右邊的數(shù)減去左邊的

左邊的數(shù)比右邊大,則是用右邊的數(shù)加上左邊的

看了上面的例子估計(jì)我們會(huì)手算將羅馬數(shù)字轉(zhuǎn)成阿拉伯?dāng)?shù)字了,那么用程序怎么寫呢???

思路是這樣的:

先找到羅馬數(shù)字最大的那個(gè)數(shù)字

要是左邊的數(shù)比右邊小,則是用右邊的數(shù)減去左邊的

左邊的數(shù)比右邊大,則是用右邊的數(shù)加上左邊的

.....如此循環(huán)則最后獲取阿拉伯?dāng)?shù)字

首先,我們先定義羅馬數(shù)字和對(duì)應(yīng)的阿拉伯?dāng)?shù)字(相當(dāng)于查表)

    // 定義羅馬數(shù)字
    char digits[] = {"I", "V", "X", "L", "C", "D", "M"};

    // 羅馬數(shù)字對(duì)應(yīng)的阿拉伯?dāng)?shù)字
    int  values[] = { 1,  5, 10, 50, 100, 500, 1000};

隨后,我們得找到羅馬數(shù)字當(dāng)前的最大值,找到最大值之前就先得把羅馬數(shù)字轉(zhuǎn)成是阿拉伯?dāng)?shù)字

    /**
     * 將羅馬數(shù)字轉(zhuǎn)成阿拉伯?dāng)?shù)字,實(shí)際上就是一個(gè)查表的過程
     *
     * @param roman
     * @return
     */
    public static int digitsToValues(char roman) {

        // 定義羅馬數(shù)字
        char digits[] = {"I", "V", "X", "L", "C", "D", "M"};

        // 羅馬數(shù)字對(duì)應(yīng)的阿拉伯?dāng)?shù)字
        int values[] = {1, 5, 10, 50, 100, 500, 1000};


        for (int i = 0; i < digits.length; i++) {

            if (digits[i] == roman) {
                return values[i];
            }
        }

        return 0;

    }

上面的方法已經(jīng)可以將羅馬數(shù)字轉(zhuǎn)成阿拉伯?dāng)?shù)字了,接下來我們要查找出最大值了

    /**
     * 找到當(dāng)前羅馬數(shù)字最大值的角標(biāo)
     *
     * @param digits
     * @return
     */
    public static int findMaxIndex(String digits, int L, int R) {

        // 假設(shè)第一個(gè)是最大的
        int max = digitsToValues(digits.charAt(L));
        int maxIndex = L;

        for (int i = L; i < R; i++) {
            // 將羅馬數(shù)字轉(zhuǎn)成是阿拉伯?dāng)?shù)字
            int num = digitsToValues(digits.charAt(i));
            if (max < num) {
                max = num;
                maxIndex = i;
            }
        }

        return maxIndex;
    }

找到了當(dāng)前羅馬數(shù)字的最大值那要怎么做???

左邊的比右邊的要小,則右邊的減去左邊的值

左邊的比右邊的要大,則右邊的加上左邊的值

....///實(shí)際上是一個(gè)遞歸的過程

于是乎,我們可以寫出下面的代碼:


    /**
     * 將羅馬數(shù)字轉(zhuǎn)成阿拉伯?dāng)?shù)字
     *
     * @param romanNumber
     * @param L
     * @param R
     */
    public static int romanToNumber(String romanNumber, int L, int R) {

        // 如果只有一個(gè)羅馬數(shù)字,那么可以直接返回了(遞歸出口)
        if (L == R) {
            return digitsToValues(romanNumber.charAt(L));
        } else if (L > R) { // 如果L和R已經(jīng)越界了,那么說明沒有值了
            return 0;
        } else {

            // 找到當(dāng)前羅馬數(shù)字最大值的角標(biāo)
            int maxIndex = findMaxIndex(romanNumber, L, R);

            // 得到最大值
            int max = digitsToValues(romanNumber.charAt(maxIndex));

            // 在最大值左邊的,則用最大值減去左邊的
            int left = romanToNumber(romanNumber, L, maxIndex - 1);

            // 在最大值右邊的,則用最大值加上右邊的
            int right = romanToNumber(romanNumber, maxIndex + 1, R);

            return max - left  + right;
        }
    }

測(cè)試一下:

八、啤酒與飲料
啤酒每罐2.3元,飲料每罐1.9元。小明買了若干啤酒和飲料,一共花了82.3元。我們還知道他買的啤酒比飲料的數(shù)量少,請(qǐng)你計(jì)算他買了幾罐啤酒。

這是藍(lán)橋杯的一道題,我們可以使用暴力搜索即可解出:

如果82.3全買啤酒最多能買82.3/2.3=35瓶

如果82.3全買飲料最多能買82.3/1.9=43瓶

以此作為控制條件

    /**
     * 啤酒與飲料題目
     */
    public static void beerAndDrink() {
        
        // 啤酒
        for (int i = 0; i < 36; i++) {
            
            // 飲料
            for (int j = 0; j < 44; j++) {
                
                // 錢剛好花光了,并且啤酒比飲料少
                if (2.3 * i + j * 1.9 == 82.3 && i < j) {
                    System.out.println("關(guān)注公眾號(hào):Java3y--------------->啤酒買了" + i);
                }
            }
        }
    }

測(cè)試:

九、簡(jiǎn)單凱撒密碼
簡(jiǎn)單凱撒密碼

凱撒密碼是啥?簡(jiǎn)單來說:就是通過移位來進(jìn)行加密

比如,A-->B,B-->C,C-->D.......

上面就是最簡(jiǎn)單的凱撒密碼,將所有的字母進(jìn)行移一位,實(shí)現(xiàn)加密

下面我們也來玩一下吧~

左移動(dòng)和右移動(dòng):

    /**
     * 右移
     */
    public static int rotateRight(int ch) {
        if (ch >= "A" && ch <= "Y") {
            return ch + 1;
        } else if (ch >= "a" && ch <= "y") {
            return ch + 1;
        } else if (ch == "Z") {
            return "A";
        } else if (ch == "z") {
            return "a";
        } else {
            return ch;
        }
    }

    /**
     * 左移
     */
    public static int rotateLeft(int ch) {
        if (ch >= "B" && ch <= "Z") {
            return ch - 1;
        } else if (ch >= "b" && ch <= "z") {
            return ch - 1;
        } else if (ch == "A") {
            return "Z";
        } else if (ch == "a") {
            return "z";
        } else {
            return ch;
        }
    }

加密:

    /**
     * 加密
     * @param ch
     * @param shift
     * @return
     */
    public static int encode(int ch, int shift) {

        // 如果沒有移動(dòng),則直接返回
        if (shift == 0) {
            return ch;
        } else if (shift > 0) {

            // 如果shift移動(dòng)的是正數(shù),那么就向右移動(dòng)
            for (int i = 0; i < shift; i++) {
                ch = rotateRight(ch);
            }
            return ch;
        } else {

            // 如果shift移動(dòng)的是負(fù)數(shù),那么就向左移動(dòng)
            for (int i = 0; i < -shift; i++) {
                ch = rotateLeft(ch);
            }
            return ch;
        }
    }

測(cè)試:

        String s = "HELLO WORLD";
        char[] ch = new char[s.length()];

        for (int i = 0; i < s.length(); i++) {
           ch[i] = (char) encode(s.charAt(i), 3);
        }

        System.out.println("關(guān)注公眾號(hào):Java3y" + ch);

結(jié)果:

十、求最大公約數(shù)
求一個(gè)數(shù)的最大公約數(shù)

算法:是兩個(gè)數(shù)相余,直到余數(shù)為0,如果余數(shù)不為0,就用除數(shù)和余數(shù)求余

若發(fā)現(xiàn)余數(shù)為0,那么當(dāng)前的除數(shù)就是最大公約數(shù)

    /**
     * 求最大公約數(shù)
     *
     * @param num1
     * @param num2
     */
    public static int gcd(int num1, int num2) {


        // 求余數(shù)
        int r = num1 % num2;

        // 如果余數(shù)為0,那么除數(shù)就是最大公約數(shù)
        if (r == 0) {
            return num2;
        } else {

            // 否則,則用除數(shù)和余數(shù)來進(jìn)行運(yùn)算
            return gcd(num2, r);
        }

    }

結(jié)果:

總結(jié)

沒錯(cuò),你沒看錯(cuò),簡(jiǎn)單的小算法也要總結(jié)!

其實(shí)我覺得這些比較簡(jiǎn)單的算法是有"套路"可言的,你如果知道它的套路,你就很容易想得出來,如果你不知道它的套路,那么很可能就不會(huì)做了(沒思路)。

積累了一定的"套路"以后,我們就可以根據(jù)經(jīng)驗(yàn)來推斷,揣摩算法題怎么做了。

舉個(gè)很簡(jiǎn)單的例子:

乘法是在加法的基礎(chǔ)之上的,那乘法我們是怎么學(xué)的?背(積累)出來的,9*9乘法表誰沒背過?比如看到2+2+2+2+2,會(huì)了乘法(套路)以后,誰還會(huì)慢慢加上去。看見了5個(gè)2,就直接得出2*5

刪除下標(biāo)為k的元素

后一位往前一位覆蓋即可

找出常用的數(shù)字

利用棧的思想,只要該數(shù)組出現(xiàn)的次數(shù)大于2分之1,那么他肯定是在棧里面

丟失的數(shù)字

實(shí)現(xiàn)1:兩個(gè)數(shù)組進(jìn)行遍歷,如果某一個(gè)不存在,利用數(shù)組的角標(biāo)就可以找到~

實(shí)現(xiàn)2:使用等差求和公式,缺失的數(shù)字可以減出來!

將0放在數(shù)組最后

實(shí)現(xiàn)1:使用變量zero來記住有多少個(gè)0,只要不是0就往前面移動(dòng),最后將zero補(bǔ)全!

實(shí)現(xiàn)2:將數(shù)組分成3個(gè)部分;在j之前的沒有0,j到i全是0,i后面還沒有遍歷,直至i遍歷完畢后,j前面都不是0,j-i都是0(這就完成我們的任務(wù)了)

找出數(shù)組的單個(gè)數(shù)字

實(shí)現(xiàn)1:遍歷數(shù)組計(jì)算某個(gè)元素出現(xiàn)的次數(shù),外層再遍歷數(shù)組,只要該元素出現(xiàn)的次數(shù)是1,那么它就是單個(gè)的!

實(shí)現(xiàn)2:位運(yùn)算的異或操作,相同的兩個(gè)數(shù)字會(huì)抵消掉!

畫三角形星星

找到畫星星和空格的規(guī)律!星星和空格都與行數(shù)有關(guān)聯(lián)!

羅馬數(shù)字倒轉(zhuǎn)成阿拉伯?dāng)?shù)字

將羅馬數(shù)組和阿拉伯?dāng)?shù)字對(duì)應(yīng)起來,“查表”進(jìn)行轉(zhuǎn)換!找到最大的值,左邊比右邊要小,則右減左。反之右加左!

啤酒與飲料

使用暴力查詢的方式來將具體的值搜索出來!

簡(jiǎn)單凱撒密碼

char本質(zhì)上就是int,移動(dòng)時(shí)要主要Z,A這些字符~

求最大公約數(shù)

如果余數(shù)為0,那么除數(shù)就是最大公約數(shù),否則就是除數(shù)和余數(shù)再繼續(xù)運(yùn)算!

文章的目錄導(dǎo)航:https://zhongfucheng.bitcron.com/post/shou-ji/gong-zhong-hao-wen-zhang-zheng-li

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68987.html

相關(guān)文章

  • 十道簡(jiǎn)單算法

    摘要:前言最近在回顧以前使用寫過的數(shù)據(jù)結(jié)構(gòu)和算法的東西,發(fā)現(xiàn)自己的算法和數(shù)據(jù)結(jié)構(gòu)是真的薄弱,現(xiàn)在用改寫一下,重溫一下。 前言 最近在回顧以前使用C寫過的數(shù)據(jù)結(jié)構(gòu)和算法的東西,發(fā)現(xiàn)自己的算法和數(shù)據(jù)結(jié)構(gòu)是真的薄弱,現(xiàn)在用Java改寫一下,重溫一下。 只能說慢慢積累吧~下面的題目難度都是簡(jiǎn)單的,算法的大佬可直接忽略這篇文章了~入門或者算法薄弱的同學(xué)可參考一下~ 很多與排序相關(guān)的小算法(合并數(shù)組、獲...

    sunsmell 評(píng)論0 收藏0
  • 面試題二

    摘要:浮動(dòng)框不屬于文檔流中的普通流,當(dāng)元素浮動(dòng)之后,不會(huì)影響塊級(jí)元素的布局,只會(huì)影響內(nèi)聯(lián)元素布局。此時(shí)文檔流中的普通流就會(huì)表現(xiàn)得該浮動(dòng)框不存在一樣的布局模式。當(dāng)包含框的高度小于浮動(dòng)框的時(shí)候,此時(shí)就會(huì)出現(xiàn)高度塌陷。 1、Pwa 是什么? Progressive Web App, 簡(jiǎn)稱 PWA,是提升 Web App 的體驗(yàn)的一種新方法,能給用戶原生應(yīng)用的體驗(yàn)。PWA 能做到原生應(yīng)用的體驗(yàn)不是靠...

    LucasTwilight 評(píng)論0 收藏0
  • 面試題二

    摘要:浮動(dòng)框不屬于文檔流中的普通流,當(dāng)元素浮動(dòng)之后,不會(huì)影響塊級(jí)元素的布局,只會(huì)影響內(nèi)聯(lián)元素布局。此時(shí)文檔流中的普通流就會(huì)表現(xiàn)得該浮動(dòng)框不存在一樣的布局模式。當(dāng)包含框的高度小于浮動(dòng)框的時(shí)候,此時(shí)就會(huì)出現(xiàn)高度塌陷。 1、Pwa 是什么? Progressive Web App, 簡(jiǎn)稱 PWA,是提升 Web App 的體驗(yàn)的一種新方法,能給用戶原生應(yīng)用的體驗(yàn)。PWA 能做到原生應(yīng)用的體驗(yàn)不是靠...

    Jinkey 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫連接池...

    KevinYan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<