小Q最近遇到了一個難題:把一個字符串的大寫字母放到字符串的後面,各個字符的相對位置不變,且不能申請額外的空間。 你能幫幫小Q嗎?

這是一道2017騰訊暑假實習生的編程題

這道題的簡單版本

劍指offer 21
劍指offer的第21道題,並沒有要求相對順序保持不變,所以解法很簡單
在這裏插入圖片描述

代碼實現

    public int[] exchange(int[] nums) {
         int i = 0;
        int j = nums.length-1;
        int temp;
        while (i<j){
            while(i < j && (nums[i] & 1) == 1) i++;
            while(i < j && (nums[j] & 1) == 0) j--;
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
        return nums;
    }

騰訊升級版

小Q最近遇到了一個難題:把一個字符串的大寫字母放到字符串的後面,各個字符的相對位置不變,且不能申請額外的空間。 你能幫幫小Q嗎?
而這道題,保持相對順序不變,嗯這個簡單,用多個數組保存一下就ok了,但是題目要求不能申請額外的空間,那我們應該從哪裏下手呢?
我們可以這樣,我們用一個big指針來指向大寫字母,index指針來遍歷,當index指針遇到小寫字母時,有如下幾種情況

  1. 大寫字母還沒出現呢,我們直接跳過
  2. 前面有大寫字母出現了 :這時分兩種情況
    a .big在index前面,這種情況好說,我們直接交換就完事
    b. big不在index前面,說明big和index之前有好幾個大寫字母呢,如果直接交換,必然不滿足題目要求,那這種場景,會不會讓你想到這種東西–插入排序。

沒錯,我們可以用插入排序的思想,先保存原先index指向的值value,然後讓big~(index-1)之間整體往後移動一個位置,然後把value插入到big的位置,就搞定了!

代碼實現

	public  String getResult(String str){
        char[] c = str.toCharArray();
        int index = 0;
        int big = 0;
        while (big<c.length&&index<c.length){
            if (isSmall(c[index])){        //說明碰到小寫字母了
                if(big<index){  //說明之前有big出現
                    if (index-big==1){ //big的下一個是小寫字母 那麼我們可以直接交換
                        char temp = c[big];
                        c[big] = c[index];
                        c[index] = temp;
                        big = index;
                    }else {     //big的下一個還是big 如果貿然交換 相對順序就變了 所以我們要插入排序
                        char value = c[index];
                        while (index>big){
                            c[index] = c[index-1];
                            index--;
                        }
                        c[index] = value;
                        big = big+1;
                    }
                }else { //這種情況說明之前還沒有big出現
                    big++;
                }
            }
            index++;
        }
        return String.valueOf(c);
    }

    public boolean isSmall(char c){
        if (c-'A'<26){
            return false;
        }else
            return true;
    }

如果這篇文章有幫到你 麻煩點個贊 讓我收到你的支持 這是我分享知識的動力 謝謝你!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章