Java面試編程題

1. 有一個數(shù)組,按偶奇降序排序后武花,按照偶奇的形式交替輸出圆凰,例如{2, 4, 3, 6, 1, 5, 7, 8, 9},則輸出結(jié)果為{8, 9, 7, 4, 5, 2, 3, 1}
解題思路:

先按照最簡單的辦法:先把數(shù)組分成奇偶兩個數(shù)組体箕,再對這兩個數(shù)組進行降序排序专钉,最后再交替輸出。

代碼:
public class Test1 {

    public static void main(String[] args) {

        int[] arr = { 2, 4, 6, 1, 5, 7, 8, 9 };
        System.out.println(evenOddSort(arr));
    }

    public static String evenOddSort(int[] nums) {

        int length = nums.length;

        List<Integer> evenList = new ArrayList<Integer>();
        List<Integer> oddList = new ArrayList<Integer>();

        for (int i = 0; i < length; i++) {
            int num = nums[i];
            if (num % 2 == 0) {
                evenList.add(num);
            } else {
                oddList.add(num);
            }
        }
        
        // 降序排序
        sortDesc(evenList);
        sortDesc(oddList);
        
        // 公共的次數(shù)
        int time = evenList.size() > oddList.size() ? evenList.size() : oddList.size();
        List<Integer> list = new ArrayList<Integer>();
        
        for (int i = 0; i < time; i++) {
            list.add(evenList.get(i));
            list.add(oddList.get(i));
        }
        
        // 剩余的次數(shù)
        if (evenList.size() > oddList.size()) {
            for (int i = time; i < evenList.size(); i++) {
                list.add(evenList.get(i));
            }
        }else {
            for (int i = time; i < oddList.size(); i++) {
                list.add(oddList.get(i));
            }
        }
        
        return list.toString();
    }

    public static void sortDesc(List<Integer> list) {

        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size() - i - 1; j++) {
                int current = list.get(j);
                int next = list.get(j + 1);
                if (current < next) {
                    list.set(j + 1, current);
                    list.set(j, next);
                }
            }
        }
        System.out.println(list);
    }
}

雖然解決了這個問題累铅,但是代碼很復(fù)雜跃须,在室友的啟發(fā)下,有了一種新的思路:先把列表進行降序排序娃兽,然后再用兩個索引(或者叫指針)菇民,分別代表下一個偶數(shù)位置和奇數(shù)位置,使用List<Integer>來存儲要輸出的數(shù)組,這樣在每次遍歷只需要分別放入一個偶數(shù)和奇數(shù)即可玉雾。

代碼:
public class Test1pro {

    public static void main(String[] args) {

        int[] arr = { 2, 4, 6, 1, 5, 7, 8, 9 };
        System.out.println(evenOddSort(arr));
    }

    public static String evenOddSort(int[] nums) {

        int length = nums.length;

        // 降序排序
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length - i - 1; j++) {
                if (nums[j] < nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }
        
        System.out.println(Arrays.toString(nums));
        
        int even = 0, odd = 0;
        List<Integer> list = new ArrayList<Integer>();
        
        for (int i = 0; i < length; i++) {
            
            // 用兩個索引表示偶奇數(shù)的位置
            // 下一個偶數(shù)
            while (even < length && nums[even] % 2 != 0) {
                even ++;
            }
            if (even < length) {
                list.add(nums[even]);
                even ++;
            }
            
            // 下一個奇數(shù)
            while (odd < length && nums[odd] % 2 == 0) {
                odd ++;
            }
            if (odd < length) {
                list.add(nums[odd]);
                odd ++;
            }
        }
        return list.toString();
    }
}

2. 有一個數(shù)組翔试,求輸出能夠組成的最大數(shù),例如{20, 13, 9, 6}复旬,則輸出結(jié)果為962013
解題思路:

針對給出的示例數(shù)組垦缅,按照正常的思維,那么只需要取出每個首位比較大小即可驹碍。但是如果存在首位相同的情況壁涎,那么就需要繼續(xù)判斷;例如{20, 211}志秃,解決辦法就是設(shè)較小數(shù)的長度為x怔球,那么只需要取兩個數(shù)的前x位比較大小即可;但是如果兩個數(shù)的前x位大小也一樣呢浮还?比如{20, 201}竟坛,那么我們還要把較大數(shù)截掉前x位后剩下的數(shù)的首位和前x位的數(shù)的首位進行比較【啵可能聽起來很拗口担汤,我舉個例子:
例如數(shù)組{20, 201},較小數(shù)為20洼冻,長度為2崭歧,這兩個數(shù)的前2位都是20,則較大數(shù)201截掉前前2位后還剩下一個1撞牢,那么這個12小率碾,所以組成的數(shù)是20201,但是如果是{20, 205}屋彪,那么剩下的5就要比2大所宰,則組成的數(shù)應(yīng)該是20520

代碼:
public class Test2 {

    public static void main(String[] args) {
        
        // [13, 6, 9]
        // [21, 2, 1]
        // [20, 1, 205]
        // [9, 7, 979, 997, 799]  9 997 979 799 7
        int[] nums = {9, 7, 979, 997, 799};
        System.out.println(maxNum(nums));
    }
    
    public static String maxNum(int[] nums) {
        
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                compare(i, j, nums);
            }
        }
        
        StringBuffer buffer = new StringBuffer();
        for (int num : nums) {
            buffer.append(num);
        }
        return buffer.toString();
    }
    
    public static void compare(int i, int j, int[] nums) {
                
        int current = nums[i];
        int next = nums[j];
        System.out.println(current + " " + next + "數(shù)組:" + Arrays.toString(nums));
        int clength = String.valueOf(current).length();
        int nlength = String.valueOf(next).length();
        
        if (clength != nlength) {
            // 最短長度
            int min = clength < nlength ? clength : nlength;
            // 把兩個數(shù)轉(zhuǎn)成字符串
            String cstr = String.valueOf(current);
            String nstr = String.valueOf(next);
            
            // 按照最短長度進行裁剪
            // 并轉(zhuǎn)化為整型進行大小比較
            int minCurrent = Integer.parseInt(cstr.substring(0, min));
            int minNext = Integer.parseInt(nstr.substring(0, min));
            if (minCurrent == minNext) {
                // 代表前面公共部分是相同的
                // 但是并不代表數(shù)長的肯定比數(shù)短的小
                // 還需要進一步判斷
                // 比如【21, 2】和【20畜挥, 205】
                
                // 取出相同部分的首位
                int first = Integer.parseInt(cstr.substring(0, 1));
                if (clength > nlength) {
                    // 剩余的部分的首位
                    int last = Integer.parseInt(cstr.substring(min, min + 1));
                    // 如果剩余的部分的首位比相同部分的首位小
                    // 則需要對調(diào)兩個數(shù)
                    if (last < first) {
                        nums[i] = next;
                        nums[j] = current;
                    }
                } else {
                    // 多余的部分
                    int last = Integer.parseInt(nstr.substring(min, min + 1));
                    // 如果剩余的部分的首位比相同部分的首位大
                    // 則需要對調(diào)兩個數(shù)
                    if (last > first) {
                        nums[i] = next;
                        nums[j] = current;
                    }
                }
            } else {
                // 雖然長度不一樣
                // 但是只需要比較相同的長度的數(shù)的大小即可
                if (minCurrent < minNext) {
                    nums[i] = next;
                    nums[j] = current;
                }
            }
        } else {
            // 代表兩個數(shù)長度一樣
            // 那么只需要比較兩個數(shù)的大小即可
            if (current < next) {
                nums[i] = next;
                nums[j] = current;
            }
        }
    }

}

后續(xù)可能還會更新~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歧匈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砰嘁,更是在濱河造成了極大的恐慌件炉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矮湘,死亡現(xiàn)場離奇詭異斟冕,居然都是意外死亡,警方通過查閱死者的電腦和手機缅阳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門磕蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來景描,“玉大人,你說我怎么就攤上這事秀撇〕祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵呵燕,是天一觀的道長棠绘。 經(jīng)常有香客問我,道長再扭,這世上最難降的妖魔是什么氧苍? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮泛范,結(jié)果婚禮上让虐,老公的妹妹穿的比我還像新娘。我一直安慰自己罢荡,他們只是感情好赡突,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著区赵,像睡著了一般麸俘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惧笛,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音逞泄,去河邊找鬼患整。 笑死,一個胖子當著我的面吹牛喷众,可吹牛的內(nèi)容都是我干的各谚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼到千,長吁一口氣:“原來是場噩夢啊……” “哼昌渤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憔四,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膀息,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后了赵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潜支,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年柿汛,在試婚紗的時候發(fā)現(xiàn)自己被綠了冗酿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖裁替,靈堂內(nèi)的尸體忽然破棺而出项玛,到底是詐尸還是另有隱情,我是刑警寧澤弱判,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布襟沮,位于F島的核電站,受9級特大地震影響裕循,放射性物質(zhì)發(fā)生泄漏臣嚣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一剥哑、第九天 我趴在偏房一處隱蔽的房頂上張望硅则。 院中可真熱鬧,春花似錦株婴、人聲如沸怎虫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽大审。三九已至,卻和暖如春座哩,著一層夾襖步出監(jiān)牢的瞬間徒扶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工根穷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姜骡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓屿良,卻偏偏與公主長得像圈澈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尘惧,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355