劍指offer(二)

1.在32位系統中,輸出結果:
#include <iostream>
using namespace std;
int getsize(int a[])
{
	return sizeof(a);

}
int main()
{
	int a[]={1,2,3,4,5};
	int t1=sizeof(a);//20
	int *b=a;
	int t2=sizeof(b);//4
	int t3=getsize(a);//4
	cout<<t1<<t2<<t3;
	return 0;
}

在函數傳遞時,利用數組名進行傳遞的過程就是在用指針進行傳遞,根本無法知道數組的長度,所以一般在子函數中用數組的長度時,是需要傳遞過去的,不然,數組長度都不確定。

2.二維數組的查找

在一個二維數組中,每一行都是按照從左到右依次遞增,每一列是從上到下依次遞增,查找相應的值,並分析時間複雜度和空間複雜度。

#include <iostream>
using namespace std;
//選取右上角依次排除行和列
bool find_num(int a[][4],int width ,int height,int key)
{
	if(a!=NULL&&width>0&&height>0) 
	{
		int i=0,j=width-1;
		while (i<height&&j>=0)
		{
			if (a[i][j]==key) return true;
			else if (a[i][j]>key) j--;
			else i++;
		}
		return false;
	}
	return false;
}
int main()
{
	int a[4][4]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
	bool b=find_num(a,4 ,4,3);
	return 0;
}
這裏寫的時候,突然發現二維數組的傳參數的問題,就是定義一個二維指針 int**a,想直接傳參數a[ ][ ]是不行的,這裏會出現問題,其實想想也是,一個二維指針至少也得告訴編譯器你是怎樣構成的吧,所以改用int a[ ][4],這樣不會出問題了。

這個程序的空間複雜度就是o(1),時間複雜度o(n),最差情況爲o(2n),最好情況爲o(1)。

3.字符串的問題:因爲字符串的尾端是含有‘\0’這個字符的,所以寫程序的時候切記的要留意。

還有一點就是字符數組和字符指針我們先申明一個函數看下結果如何:

#include <iostream>
using namespace std;
int main()
{
	int t1=0,t2=0;
	char a[]={"hello"},b[]={"hello"};
	char *c={"hello"},*d={"hello"};
	if(a==b) t1=1;
	if(c==d) t2=1;
	return 0;
}
執行結束髮現:t1還是0,t2就是1。問題就出來了,a,b的地址不同,c,d的地址相同,c、c++爲了省內存,就在如果指針相同的值的字符串常量指向同一個地址。

4.空格替換,題目輸入字符串(將輸入的字符串中的空格替換爲%20)

#include <iostream>
#include <string>
using namespace std;
void convert_str(string &s)
{
	int k=0,len=s.size();
	for (int i=0;i<len;i++) 
		if(s[i]==' ')
			k++;
	int len1=len+2*k;
	s.resize(len1);
	for (int i=len-1,j=len1-1;i>=0,j>=0;j--,i--)
	{
		if(s[i]!=' ')
			s[j]=s[i];
		else 
		{
			s[j]='0';
			j--;
			s[j]='2';
			j--;
			s[j]='%';
		}
		
	}
	
	
	
}
int main()
{
	string s1="we are family.";
	convert_str(s1);

	return 0;
}
這個算法的核心是從後面往前開始 替換,時間複雜度o(n),空間複雜度o(1)。





發佈了67 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章