資料結構 演算法與程式設計(1)

2021-08-08 04:29:13 字數 3110 閱讀 4201

這部分不會有很系統的講解,只是列舉一些題目,分享一下我和別人的思路。

1.1 陣列的查詢

陣列,可以說是最簡單的資料型別,它占用一塊連續的記憶體並按照順序儲存資料。與vector不同,建立陣列時,需要指定陣列的大小,而且不允許動態增加陣列元素。

陣列中的記憶體是連續的,而且可以根據下標讀寫元素,時間效率高,正是這一點,我們可以使用它來實現簡單的雜湊表。

在c/c++中,陣列和指標是互相關聯,而又有區別的兩個概念。當我們宣告乙個陣列時,陣列名同時也是乙個指標,我們可以用指標訪問陣列。而兩者的區別,我們可以使用sizeof()看出來:

#include 

using

namespace

std;

int getsize(int data)

int main()

; int size1 = sizeof(data1);

int *data2 = data1;

int size2 = sizeof(data2);

int size3 = getsize(data1);

cout

<< size1 << " "

<< size2 << " "

<< size3;

}

執行結果:

sizeof(data1) - 求的是整個陣列的大小;

sizeof(data2) - 求的是指標的大小,32位系統中為4;

getsize(data3) - 函式呼叫用時,陣列會自動退化為同型別的指標。

進入正題:二維陣列中的查詢

題目:(摘抄自劍指offer)

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

思路:不要使用逐個遍歷,因為這個陣列是有特點的,要利用陣列本身的特點,進行計算。

舉個例項:

如果尋找數字」1」,則返回true;如果尋找數字11,則返回false。

那麼如何查詢呢?

我們可以先查詢最後的一列的第一行的元素,此處是4;如果target是小於該元素,則可略過該列,直接尋找它的前一列;如果target是大於該元素,則可以略過該行,直接尋找它的下一行。

程式實現:

class solution 

if(target > array[i][j]) // 如果target較大,則查詢下一行

}return

false;}};

同樣用示例的陣列作為實參,target設為1和11,執行得到結果:

執行成功,結果正確!

1.2 字串的空格替換

在c/c++中,字串都是以』\0』結尾的,這樣我們很容易得到它的長度,當然,由於這個特性,我們在定義和使用字串時,需要注意,不要造成字串越界。

下面例項說明這一點

exp:

#include 

using

namespace

std;

int main(int argv, char** argc)

執行結果:

s1和s2是兩個字串陣列,在c/c++中,它們各自存放在不同的記憶體區域中,因此,輸出的結果顯示兩者不同;

而p和q是兩個指標,c/c++中無須為它們分配記憶體以及儲存字串的內容,而只需要把它們指向」hello world」在記憶體中的位址即可。而」hello world」是常量字串,它在記憶體中只有乙個拷貝,因此p和q指向的是同乙個位址。所以,p和q得到的結果相同的。

替換空格

分析:

與實際結合,在網路程式設計中,當url引數中含有特殊字元,如空格、#號等,可能導致伺服器無法獲取正確的引數值。我們需要將這些特殊字元轉換成伺服器能識別的字元。

就本題而言,通過直接遍歷,複製乙個新的陣列,這個是從前到後改變陣列的值,可以實現該題功能,但是這樣實現很複雜。

新思路:從後改變陣列的值。先遍歷求出陣列的實際長度,並且求出新陣列的實際長度,然後,使用下標從後給新陣列賦值。如下圖所示:

這樣,就不需要兩次遍歷整個陣列。

**實現:

#include

class

solution

// 求出新陣列的長度

// 並使用下表從尾到頭進行賦值

int oldindex = oldlength;

int newindex = oldlength + 2*blanknum;

while(oldindex <= newindex && oldindex>=0)

else

--oldindex;}}

};int main()

printf("\n\n");

solution s1;

s1.replacespace(str11,50);

char *p = str11;

printf("after solution: \n");

while(*p != '\0')

printf("\n");

return

0;}

執行結果:

執行成功!

資料結構與演算法(1)

演算法 資料結構 一 演算法 1.演算法的幾個特徵是什麼。2.演算法複雜性的定義。大o 小o分別表示的含義。3.遞迴演算法的定義 遞迴演算法的兩要素。4.分治演算法的思想,經典的分治演算法 全排列 二分搜尋 歸併排序 快速排序 線性時間選擇 最接近點對問題 5.動態規劃演算法解題框架,動態規劃演算法...

資料結構與演算法(1)

1 線性表 2 棧 3 佇列 4 字串 補充 遞迴 1 樹與二叉樹 2 圖 1 查詢 2 排序 編寫相關演算法 資料結構 入門問題 1.為什麼學習資料結構?1 高階程式設計的理論指導 2 提公升編碼能力 3 面試中經常被問及,看發展潛力 2.有哪些資料結構?2.11線性結構 線性表 棧 佇列 陣列 ...

資料結構與演算法 1

cpu 處理器central process unit gpu 圖形處理器graphics processing unit,又稱顯示核心 視覺處理器 顯示晶元或繪圖晶元,是一種專門在個人電腦 工作站 遊戲機和一些移動裝置 如平板電腦 智慧型手機等 上執行繪圖運算工作的微處理器。其用途是將計算機系統所...