這是一道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指針遇到小寫字母時,有如下幾種情況
- 大寫字母還沒出現呢,我們直接跳過
- 前面有大寫字母出現了 :這時分兩種情況
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;
}
如果這篇文章有幫到你 麻煩點個贊 讓我收到你的支持 這是我分享知識的動力 謝謝你!