
看書,就是要從書中學(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)
#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
#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));
}