關於數據結構之數組--數組與指針的區別

來自 劍指offer  名企面試官精講典型編程題


數組可以說是最簡單的一種數據結構,他佔據着連續的一塊內存並按照順序存儲數據。

數組的空間效率不是很好,經常會有空閒的區域沒有得到充分的利用。


根據數組時間效率高的優點,用數組來實現簡單的哈希表:用數組的下標設爲哈希表的鍵值,而把數組中的每一個數字設爲哈希表的值,這樣每一個下標及數組中該下標對應的數字就組成了一個鍵值-值得配對。有了這樣的哈希表就可以再O(1)實現查找。


同時C++的STL中的vector是另一種動態數組。需要了解。


C++中數組與指針的區別

運行下面的代碼,請問輸出時什麼?

#include <iostream>
using namespace std;

int GetSize(int data[])
{
	return sizeof(data);
}

int main()
{
	int data1[] = {1,2,3,4,5};
	int size1 = sizeof(data1);

	int* data2 = data1;
	int size2 = sizeof(data2);

	int size3 = GetSize(data1);

	cout << size1 << size2 << size3 <<endl;

	return 0;
}

答案是20 ,4 ,4 。

sizeof是求數組的大小。這個數組包含5個整數,每個佔4字節,因此總共是20字節。

data2聲明爲指針,儘管它指向數組的第一個數字,但他的本質仍然是一個指針。而32位機器整整佔4個字節


在C、C++中,當數組作爲函數的參數進行傳遞時,數組就自動退化爲同類型的指針。所以結果也爲4.




2. 二維數組中的查找:

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


3. 字符串:

當幾個指針賦值給相同的常量字符串時,他們實際上會指向相同的內存地址。

但用常量內存初始化數組時,情況就有所不同:

運行下面代碼, 結果是:notequal equal

int main(int argc,char* argv[])
{
	char str1[] = "hello world";
	char str2[] = "hello world";

	char* str3 = "hello world";
	char* str4 = "hello world";

	if(str1 == str2)
		cout << "equal" << endl;
	else
		cout << "not equal" << endl;

	if(str3 == str4)
		cout << "equal" << endl;
	else
		cout << "not equal" << endl;
	
	return 0;
}
我們會分配2個長度爲12字節的空間給str1,str2 並把“hello word”的內容複製到數組中去。

這是2個初始地址不同的數組,所以str1與str2的值不同。



在C#中,封裝字符串的類型System.String有一個非常特殊的性質:String的內容是不能改變的。一旦試圖改變String的內容,就會產生一個新的實例。

String str = "hello";
str.ToUpper();
str.Insert(0,"WORLD");

雖然對str做了ToUpper和Insert操作,但操作的結果都是生成一個新的String實例返回,str本身的內容不會改變(hello)。

用String作連續多次修改,每次都會產生一個臨時對象,這樣開銷太大會影響效率。此時用StringBuilder更好。它能夠容納修改後的結果。



4. 替換空格

題目:請實現一個函數,把字符串中的每個空格替換成“%20”。例如輸入“We are happy。“則輸出”We%20are%20happy。“。

在網絡編程中,如果URL參數中含有特殊字符,如空格 '#'等,可能導致服務器端無法獲得正確的參數值。我們需要將這些特殊符號轉換爲服務器可以識別的字符。轉換的規劃是在%後面跟上ASCII碼的2爲16進制的表示。如空格的ASCII碼爲32,即16進制的0x20,因此空格被替換爲%20.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章