二維數組中的查找
題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
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前移
}
}
};