4.30打卡:劍指 offer兩題:二維數組中的查找/替換空格

二維數組中的查找

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        //雙指針解法
        int i = array.size() - 1, j = 0;
        while(i >= 0 && j < array[0].size()){
            if (target == array[i][j]) return true;
            else if (target > array[i][j]) j ++;
            else if (target < array[i][j]) i --;
        }
        return false;
    }
};

替換空格

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

思路:開始理解錯了以爲是字符串替換,找到空格直接s[i] = "%20"不就完事了,但是請仔細看題意,定義的事字符串數組存每一個字符串,空格只佔用一個位置,但是%20需要佔用三個位置所以插入的時候,後面的數得後移。

暴力做法(o(n^2)):從頭到尾掃描字符串,每一次碰到空格字符的時候做替換。由於是把1個字符替換成3個字符,我們必須要把空格後面所有的字符都後移兩個字節,否則就有兩個字符被覆蓋了。

優化做法(n):

Step1.先遍歷一次字符串,這樣就能統計出字符串中空格的總數,並可以由此計算出替換之後的字符串的總長度。以前面的字符串"We arehappy."爲例,"We are happy."這個字符串的長度是14(包括結尾符號'\0'),裏面有兩個空格,因此替換之後字符串的長度是18。

Step2.從字符串的後面開始複製和替換。

class Solution {
public:
	void replaceSpace(char *str,int length) {


        //遍歷一邊字符串找出空格的數量
        if(str==NULL||length<0)
            return ;
        int i=0;
        int oldnumber=0;//記錄以前的長度
        int replacenumber=0;//記錄空格的數量
        while(str[i]!='\0')
            {
               oldnumber++;
               if(str[i]==' ')
                   {
                     replacenumber++;
                   }
                  i++; 
            }
        int newlength=oldnumber+replacenumber*2;//插入後的長度
        if(newlength>length)//如果計算後的長度大於總長度就無法插入
            return ;
        int pOldlength=oldnumber; //注意不要減一因爲隱藏個‘\0’也要算裏
        int pNewlength=newlength;
        while(pOldlength>=0&&pNewlength>pOldlength)//放字符
            {
              if(str[pOldlength]==' ') //碰到空格就替換
                  {
                     str[pNewlength--]='0';
                     str[pNewlength--]='2';
                     str[pNewlength--]='%';
                     
                  }
               else //不是空格就把pOldlength指向的字符裝入pNewlength指向的位置
               {
                    str[pNewlength--]=str[pOldlength];
                   
               }
             pOldlength--; //不管是if還是elsr都要把pOldlength前移
             
           }
        
	}
};

 

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