剑指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)。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值