劍指Offer——二維數(shù)組中的查找與空格替換

th.jpeg

看書,就是要從書中學(xué)到自己欠缺的東西,提升自己。

對于一本書來說,不排除有其客觀的質(zhì)量,但是帶給一個人的收獲和提升不單單與此相關(guān),更加重要的是,你如何去讀這本書,你以一個什么樣的心態(tài)去讀這本書,這就如同你準(zhǔn)備一門考試是以要考滿分的標(biāo)準(zhǔn)去準(zhǔn)備,還是僅僅要求自己及格,兩種心態(tài)得到的結(jié)果必然大不相同。
何老師這本書吸引我的地方就是代碼中確實見到很深厚的各種功底,各種規(guī)范,而且以一個在公司中有著比較多的經(jīng)驗的開發(fā)人員的視角來分析,來作答,讓我感觸很大。

網(wǎng)上的很多示例代碼只是照著文檔進行摘抄,不可運行,根本就不是看書的態(tài)度,本文對相關(guān)的代碼進行勘誤,添加測試代碼等,希望可以幫助你的理解。

二維數(shù)組中的查找

題目:

  • 在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
  • 請完成一個函數(shù),輸入這樣的一個二維數(shù)組和一個整數(shù),判斷數(shù)組中是否含有該整數(shù)。
    *1?。病。浮 。?br> *2?。础。埂 。保?br> *4?。贰。保啊。保?br> *6?。浮。保薄。保?/li>
  • 首先選取數(shù)組中右上角的數(shù)字。如果該數(shù)字等于要查找的數(shù)字,查找過程結(jié)束;如果該數(shù)字大于要查找的數(shù)組,
  • 剔除這個數(shù)字所在的列;如果該數(shù)字小于要查找的數(shù)字,剔除這個數(shù)字所在的行。也就是說如果要查找的數(shù)字不在數(shù)組的右上角,
  • 則每一次都在數(shù)組的查找范圍中剔除一行或者一列,這樣每一步都可以縮小查找的范圍,直到找到要查找的數(shù)字,或者查找范圍為空。
  • 運行時間:1 test from find (0 ms total)

二維數(shù)組中的查找github地址

#include <vector>
#include <iostream>
#include <gtest/gtest.h>
using namespace std;

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {

        int rows = array.size();
        int columns = array[0].size();
        if (!array.empty() && rows > 0 && columns > 0) {
            int row = 0;
            int col = columns - 1;
            while (row < rows && col >= 0) {
                if (array[row][col] == target) {
                    return true;
                } else if (array[row][col] > target) {
                    col--;
                } else {
                    row++;
                }

            }
            return false;

        } else {
            return false;
        }
    }

};

TEST(find,c2){
    int target = 13;//13,99分別測試
    vector<vector<int> >num =
            {{1,5,10,12,15},{2,8,12,15,17},{4,9,13,16,21},{9,14,18,20,24},{10,18,25,23,30} };

    EXPECT_TRUE((new Solution)->Find(target,num));
}

空格替換

題目:

請實現(xiàn)一個函數(shù),將一個字符串中的空格替換成“%20”。

例如,當(dāng)字符串為We Are Happy.則經(jīng)過替換之后的字符串為We%20Are%20Happy。

問題1:替換字符串,是在原來的字符串上做替換,還是新開辟一個字符串做替換!

問題2:在當(dāng)前字符串替換,怎么替換才更有效率。

從前往后替換,后面的字符要不斷往后移動,要多次移動,所以效率低下

從后往前,先計算需要多少空間,然后從后往前移動,則每個字符只為移動一次,這樣效率更高一點。

實現(xiàn)

思路:從前向后記錄‘ ’數(shù)目,從后向前替換‘ ’。 重點:從后向前替換的時候的技巧 例如:“we are lucky”

0 1 2 3 4 5 6 7 8 9 10 11

w e a r e l u c k y

可以得知count=2;//空格的個數(shù)。 所以在替換的時候7~11的字母要向后移動count×2個位置,

3~5字母要向后移動(count-1)×2個位置。 所以得到 :

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

w e a r e l u c k y

w e a r a r e u c k l u c k y
在替換的時候直接在空格處寫入%20了

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

w e a r e l u c k y

w e % 2 0 a r e % 2 0 l u c k y

空格替換github地址

#include <gtest/gtest.h>

using namespace std;

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

        int spaceNum = 0;
        for (int i = 0; i < length; i++) {
            if (str[i] == ' ') {
                spaceNum++;
            }
        }
        for (int j = length - 1; j >= 0; j--) {
            if (str[j] != ' ') {
                str[j + 2 * spaceNum] = str[j];
            } else {
                spaceNum--;//此處先減除,否則結(jié)果錯誤
                str[j + 2 * spaceNum] = '%';
                str[j + 2 * spaceNum + 1] = '2';
                str[j + 2 * spaceNum + 2] = '0';

            }
        }
        cout << "repalced str is :" << str << endl;
        return spaceNum;
    }
};

TEST(repalce, a1) {
    //本題目前提是預(yù)先分配了足夠的長度,并且支持space進行擴容,否則程序不會運行成功。
    char buf[30] = {'w', 'e', ' ', 'a', 'r', 'e', ' ', 'l', 'u', 'c', 'k', 'y', '\0'};
    //看打印結(jié)果即可
    EXPECT_EQ(2, (new Solution)->replaceSpace(buf, 30));

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

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

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