java 劍指offer 第二題:請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。

這道題我用了三種解法,都可以在牛客網上通過。

第一種方法比較直觀,但是比較麻煩;第二種方法是在第一種方法的基礎上改的,也比較直觀;第三種方法是我參考網上寫的,跟前面兩種比較不同

public class Solution {
    public String replaceSpace(StringBuffer str) {
        
        //第一種,這種解法比較直觀但也比較麻煩,思路是從前往後看,遇到空格就保存空格後面的字符,然後替換掉空格,最後將連接空格後面的字符
    	/*String st = str.toString();//將StringBuffer轉爲String
        char[] tct = st.toCharArray();//將String轉爲char數組,並存在char數組中
        char[] ct = new char[100];
        System.arraycopy(tct,0,ct,0,tct.length);//將tct數組的值賦給ct數組
        int n = tct.length;//獲取tct數組的長度,也就是輸入的字符串中有幾個字符
        
        char[] tst = new char[100];//新建一箇中間數組,存放空格後面的字符
        for(int i = 0;i < n;){
            int nn = 0;//nn記錄空格後有幾個字符
            if(ct[i] == ' '){//當檢測到空格時
                for(int j = i + 1,ii = 0;j < n;j++,ii++){
                    //將空格後面的字符存在tst字符數組中
                   tst[ii] = ct[j];
                    nn++;
                }
                
                //賦值
                ct[i] = '%';
                ct[i + 1] = '2';
                ct[i + 2] = '0';
                
                //將tst字符數組中的字符賦給ct字符數組
                for(int j = i + 3,ii = 0;ii <= nn;j++,ii++){
                   ct[j] = tst[ii];
                }
                
                n += 2;//ct字符數組長度加2
                i += 2;//由於賦值後的20明顯不是空格,所以就跳過他們
                continue;
            }
            i++;//繼續下一個字符
        }
        
        StringBuffer stringBuffer = new StringBuffer(String.valueOf(ct));//將String類型轉爲StringBuffer類型
        stringBuffer.setLength(n);//設置StringBuffer類型的stringBuffer長度爲加入新字符後的長度n
        return stringBuffer.toString();//將stringBuffer轉爲String類型後返回*/
        
        //第二種,跟第一種方法相似,新建一個字符數組,邊判斷邊賦值,最後返回這個新建的數組
        /*String st = str.toString();//將StringBuffer轉爲String
        char[] ct = st.toCharArray();//將String轉爲char數組,並存在char數組中
        char[] tct = new char[100];//新數組
        int n = ct.length;//原字符串的長度
        int index = 0;
        for(int i = 0;i < n;){
            if(ct[i] == ' '){
            	//賦值
                tct[index] = '%';
                tct[index + 1] = '2';
                tct[index + 2] = '0';
                index += 3;//新數組往後三個
                i++;
            }
            else{
            //不是空格就把原來的值賦給新數組
                tct[index] = ct[i];
                i++;
                index++;
            }
        }
        StringBuffer stringBuffer = new StringBuffer(String.valueOf(tct));//將String類型轉爲StringBuffer類型
        stringBuffer.setLength(index);//設置StringBuffer類型的stringBuffer長度爲加入新字符後的長度n
        return stringBuffer.toString();//將stringBuffer轉爲String類型後返回*/
        
        /*第三種,跟前兩種不同,這種解法是將字符串從後向前找的,這種解法是我參考網上其他人寫的,
        而且這種解法的好處是它先計算了新建數組的長度,然後再進行賦值。而前面兩種解法把字符的個數寫死了,
        只能是轉換後有100個字符,如果超過100個,則報錯*/
        int n = str.length();//字符串的長度
        int ii = 0;//空格的個數ii
        for(int i = 0;i < n;i++){
            //檢測空格
            if(str.charAt(i)==' '){
                ii++;
            }
        }
        
        int nn = 2 * ii + n;//根據空格的個數,得到新數組的長度
        int index = nn -1;
        char[] ct = new char[nn];//新建數組
        while(n > 0){
            if(str.charAt(n - 1) != ' '){
                //如果不是空格
                ct[index--] = str.charAt(n-1);
            }
            else{
                //如果是空格
                ct[index--] = '0';
                ct[index--] = '2';
                ct[index--] = '%';
            }
            //取下一個字符
            n--;
        }
        return String.valueOf(ct);//將字符數組轉爲String類型後返回
    }
}

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