面試題14:調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面

題目:

輸入一個(gè)整數(shù)數(shù)組聂受,實(shí)現(xiàn)一個(gè)函數(shù)來(lái)調(diào)整該數(shù)組中數(shù)字的順序杂伟,使得所有的奇數(shù)位于數(shù)組的前半部分剃毒,所有的偶數(shù)位于數(shù)組的后半部分

思路:

(摘抄劍指offer)維護(hù)兩個(gè)指針:pBegin斩芭、pEnd典勇。pBegin初始化時(shí)指向數(shù)組的第一個(gè)數(shù)字桅锄,它只向后移動(dòng)琉雳;pEnd初始化時(shí)指向數(shù)組最后一個(gè)數(shù)字,它只能向前移動(dòng)友瘤。
在兩個(gè)指針相遇之前翠肘,第一個(gè)指針總是位于第二個(gè)指針的前面。
如果第一個(gè)指針指向的數(shù)字是偶數(shù)辫秧,并且第二個(gè)指針指向的數(shù)字是奇數(shù)束倍,就交換這兩個(gè)數(shù)字。

解答:

import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        //正常數(shù)組
        int[] arrays = new int[]{1, 2, 3, 4, 5, 6, 7};
        solution.reOrderArray(arrays);
        Arrays.stream(arrays).forEach(i -> System.out.print(i + "  "));
        System.out.println();

        //數(shù)組為空
       int[] arrays2 = null;
        solution.reOrderArray(arrays2);
        System.out.println();

        //數(shù)組只有一個(gè)數(shù)
        int[] arrays3 = new int[]{3};
        solution.reOrderArray(arrays3);
        Arrays.stream(arrays3).forEach(i->System.out.print(i + "  "));
        System.out.println();

    }
    /**
     * 重排數(shù)組
     * @param array
     */
    public void reOrderArray(int[] array) {
        if (array == null || array.length <= 0) {
            return;
        }
        //定義兩個(gè)指針
        int pBegin = 0;
        int pEnd = array.length - 1;

        //當(dāng)前指針與后指針沒(méi)有相交
        while (pBegin < pEnd) {
            //當(dāng)前指針遇到偶數(shù)停止
            while (pBegin < pEnd && !isEven(array[pBegin])) {
                pBegin++;
            }
            //當(dāng)后指針遇到奇數(shù)停止
            while (pBegin < pEnd && isEven(array[pEnd])) {
                pEnd--;
            }
            //交換
            if (pBegin < pEnd) {
                swap(array, pBegin, pEnd);
            }

        }

    }

    /**
     * 兩數(shù)交換
     *
     * @param array
     * @param pBegin
     * @param pEnd
     */
    private void swap(int[] array, int pBegin, int pEnd) {
        int temp = array[pBegin];
        array[pBegin] = array[pEnd];
        array[pEnd] = temp;
    }

    /**
     * 是否為偶數(shù)
     *
     * @param num
     * @return
     */
    private boolean isEven(int num) {
        return (num & 0x1) == 0;
    }
}

擴(kuò)展

琶讼罚客上該題目有額外要求:并保證奇數(shù)和奇數(shù)绪妹,偶數(shù)和偶數(shù)之間的相對(duì)位置不變。
上面的解法就不再可行柿究。所以只能采用前后值對(duì)比的形式邮旷。
定義兩個(gè)指針(下標(biāo)):pBegin、pEnd蝇摸。
外層遍歷數(shù)組廊移,當(dāng)遇到偶數(shù)時(shí),pBegin記錄當(dāng)前偶數(shù)下標(biāo)探入,此時(shí)繼續(xù)遍歷數(shù)組直到遇到奇數(shù)pEnd狡孔。
那么[pBegin,pEnd)之間下標(biāo)對(duì)應(yīng)值都是偶數(shù)。此時(shí)將[pBegin,pEnd)對(duì)應(yīng)值往后移動(dòng)一位,p[pBegin]=array[pEnd]蜂嗽。這樣就實(shí)現(xiàn)了奇數(shù)移到了偶數(shù)的前面苗膝。

解法:

package com.qingcong.system.codeGenerator;


import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        //正常數(shù)組
        int[] arrays = new int[]{1, 2, 3, 4, 5, 6, 7};
        solution.reOrderArray2(arrays);
        Arrays.stream(arrays).forEach(i -> System.out.print(i + "  "));
        System.out.println();

        //數(shù)組為空
       /* int[] arrays2 = null;
        solution.reOrderArray(arrays2);
        System.out.println();

        //數(shù)組只有一個(gè)數(shù)
        int[] arrays3 = new int[]{3};
        solution.reOrderArray(arrays3);
        Arrays.stream(arrays3).forEach(i->System.out.print(i + "  "));
        System.out.println();*/

    }

    /**
     * 重排數(shù)組
     * @param array
     */
    public void reOrderArray2(int[] array) {
        if (array == null || array.length <= 0) {
            return;
        }
        //指向第一個(gè)偶數(shù)
        int pBegin = 0;
        //指向第一個(gè)奇數(shù)
        int pEnd = 0;
        for (int i = 0; i < array.length; i++) {

            if (isEven(array[i])) {
                pBegin = i;
                pEnd = pBegin + 1;

                while (pEnd < array.length) {
                    if (!isEven(array[pEnd])) {
                        break;

                    }
                    pEnd++;
                }
                 //將array[pEnd]移到最前面,所有的偶數(shù)往后移
                if (pBegin != pEnd && pEnd < array.length) {
                    int temp = array[pEnd];
                    while (pEnd > pBegin) {
                        array[pEnd]  = array[--pEnd];
                    }
                    array[pBegin] = temp;
                }

            }
        }
    }

    /**
     * 是否為偶數(shù)
     *
     * @param num
     * @return
     */
    private boolean isEven(int num) {
        return (num & 0x1) == 0;
    }
}

擴(kuò)展性

為什么需要單獨(dú)實(shí)現(xiàn)個(gè)isEven方法植旧?
如果題目要求的是能被3整除的移到前面辱揭,不能被整除的移到后面〔「剑或者是負(fù)數(shù)都要求在非負(fù)數(shù)前面问窃。我們可以用一個(gè)函數(shù)來(lái)判斷數(shù)字是否符合標(biāo)準(zhǔn),在reOrderArray中被調(diào)用完沪,而不再需要重寫(xiě)類(lèi)似的reOrderArray函數(shù)域庇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嵌戈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子听皿,更是在濱河造成了極大的恐慌熟呛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尉姨,死亡現(xiàn)場(chǎng)離奇詭異庵朝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)又厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)九府,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人覆致,你說(shuō)我怎么就攤上這事稠氮∮铀ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)队寇。 經(jīng)常有香客問(wèn)我霉猛,道長(zhǎng)出嘹,這世上最難降的妖魔是什么舰蟆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮腮猖,結(jié)果婚禮上鉴扫,老公的妹妹穿的比我還像新娘。我一直安慰自己澈缺,他們只是感情好坪创,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著姐赡,像睡著了一般莱预。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上项滑,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天依沮,我揣著相機(jī)與錄音,去河邊找鬼枪狂。 笑死危喉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的州疾。 我是一名探鬼主播辜限,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼严蓖!你這毒婦竟也來(lái)了薄嫡?” 一聲冷哼從身側(cè)響起氧急,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岂座,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體杭措,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡费什,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了手素。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸳址。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泉懦,靈堂內(nèi)的尸體忽然破棺而出稿黍,到底是詐尸還是另有隱情,我是刑警寧澤崩哩,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布巡球,位于F島的核電站,受9級(jí)特大地震影響邓嘹,放射性物質(zhì)發(fā)生泄漏酣栈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一汹押、第九天 我趴在偏房一處隱蔽的房頂上張望矿筝。 院中可真熱鬧,春花似錦棚贾、人聲如沸窖维。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铸史。三九已至,卻和暖如春怯伊,著一層夾襖步出監(jiān)牢的瞬間沛贪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工震贵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留利赋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓猩系,卻偏偏與公主長(zhǎng)得像媚送,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寇甸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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