二維數(shù)組中的查找&替換空格

1.在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)。

【整體思路】

? ? 例如下面的二維數(shù)組就是每行、每列都遞增排序。如果在這個(gè)數(shù)組中查找7,則返回true;如果查找5,由于數(shù)組不含有該數(shù)字,則返回false。

1 ? 2 ? 8 ? 9

2 ? 4 ? 9 ?12

4 ? 7 ?10 ?13

6 ? 8 ?11 ?15

? ? 首先,我們選取右上角的數(shù)字9,由于9大于7,并且9還是第四列的第一個(gè)(也是最小的)數(shù)字,因此7不可能出現(xiàn)在9所在的列。于是我們把這一列從需要考慮的區(qū)域內(nèi)剔除,之后只需要分析剩下的三列(如圖a)。

????在剩下的矩陣中,位于右上角的數(shù)字是8。同樣8大于7,因此8所在的列我們也可以剔除,接下來(lái)只分析剩下的兩列即可(如圖b所示)。

????在由剩余的兩列組成的數(shù)組中,數(shù)字2位于數(shù)組的右上角,2小于7,所以要查找的7可能在2的右邊,也有可能在2的下邊。因?yàn)橹耙呀?jīng)將2右邊的列都剔除了,也就是說(shuō)7不可能出現(xiàn)在2的右邊,因此7只有可能出現(xiàn)在2的下邊。于是把2所在的行剔除,只分析剩下的三行兩列數(shù)字(如圖c所示)。

? ? 在剩下的數(shù)字中,數(shù)字4位于右上角,和前面一樣,我們把數(shù)字4所在的行也剔除,最后剩下兩行兩列數(shù)字(如圖d所示)

? ? 在剩下的兩行兩列數(shù)字中,位于右上角的剛好就是我們要查找的數(shù)字7,于是查找結(jié)束。

? ? 總結(jié):

????從二維數(shù)組的右上角開始,將數(shù)組元素和target值進(jìn)行比較,有三種情況:①若數(shù)組元素>target值,把數(shù)組的最右邊一列去掉,因?yàn)橛捎谒o數(shù)組的特性target不可能出現(xiàn)在右列;②若數(shù)組元素<target值,把數(shù)組的最上邊一行去掉,因?yàn)橛捎谒^數(shù)組的特性target值不可能出現(xiàn)在上方。③若數(shù)組元素=target值,返回true。

? ??判斷的前提是:row < rows && col >= 0。

? ??所以需要幾個(gè)變量進(jìn)行存儲(chǔ):①二維數(shù)組的行數(shù):int rows = array.length;②二維數(shù)組的列數(shù):int cols = array[0].length;;③當(dāng)前元素所在行int row = 0;④當(dāng)前元素所在列:int col = cols-1;

【代碼】

public class Solution {

????public boolean Find(int target, int [][] array) {

????????int rows = array.length; ? //表示行數(shù)

?????????int cols = array[0].length; ? //表示列數(shù)

?????????int row = 0;?

?????????int col = cols-1;?

?????????while(row=0){

? ? ? ? ? ? if(array[row][col] > target){

? ? ? ? ? ? ? ? col --;

? ? ? ? ? ? }else if(array[row][col] < target){

? ? ? ? ? ? ? ? //else if中的判斷別忘掉寫

? ? ? ? ? ? ? ? row ++;

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? ?}

????????}

? ? ? ? ?return false;

????}

}

2. 請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),將一個(gè)字符串中的空格替換成“%20”。例如,當(dāng)字符串為We Are Happy.則經(jīng)過(guò)替換之后的字符串為We%20Are%20Happy。

【整體思路】

①定義一個(gè)長(zhǎng)度可變的StringBuffer用于存儲(chǔ)新串

②遍歷原字符串。若空格, StringBuffer中增加"%20",否則,StringBuffer增加原字符串中的第[i]個(gè)字符。

③將StringBuffer轉(zhuǎn)換成字符串,返回。

【代碼】

import java.util.*;

public class Solution {

? ? public String replaceSpace(StringBuffer str) {

? ? StringBuffer newstr = new StringBuffer();

? ? ? ? for(int i=0;i<str.length();i++){

? ? ? ? ? ? if(str.charAt(i)==' '){

? ? ? ? ? ? ? ? newstr.append("%20");

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? newstr.append(str.charAt(i));

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return newstr.toString();

? ? }

}

優(yōu):時(shí)間復(fù)雜度O(n),且不用考慮內(nèi)存覆蓋

缺:這種方法空間復(fù)雜度不好,因?yàn)槎x了新的內(nèi)存區(qū)域

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容