面试(五)(编程题)

(1)在一个数组每一行从左往右递增,每一列从上往下递增。完成一个函数,输入一个数组,和一个整数,判断数组中是否含有该整数
思路:
举例:在下面的矩阵中找数字7
在这里插入图片描述
先找到右上的第一个数字9,大于7,且9是这一列最小的数字,因此可以剔除该列
在这里插入图片描述
在剩下的矩阵中,右上的数字是8,大于7,且8是也这一列最小的数字,因此也可以剔除该列
在这里插入图片描述
在剩余的两列数组中,右上的数字2小于7,此时7只能在2的下边,所以可以把该行也剔除
同理第二行也可以剔除
在这里插入图片描述
右上角刚好为需要找的数字,查找结束

结论:一直取右上角的数字,于需要的数字对比,大于查找的数字剔除列,小于所查数字剔除行。每一次查找剔除一行或一列,一直缩小范围,直到找到数字,或范围空了

代码:

bool find(int* a,int row,int col,int number)
{
	bool found=false;
	if(a !=nullptr && row>0 && col>0)
	{
		int x=0;
		int y=col-1;
		while(x<row && y>=0)
		{
			if(a[x*col+y]==number)
			{
				found=true;
				break;
			}
			else if(a[x*col+y]>number
			{
				--y;
			}
			else{
				++x;
			}
		}
	}
}

(2)char str1[]=“hello world”
char str2[]=“hello world”
char
str3=“hello world”
char
str4=“hello world”
是否满足str1 == str2,str3 ==str4?

解答:str1和str2是两个字符串数组,会把它们分配到两个长度为12字节的空间,并把"hello world"的内容分别复制到数组中,这是两个初始地址不同的数组,所以str1和str2的值也不同。
str3和str4是两个指针,无需为它们分配内存存储字符串内容,只要指向"hello world"的内存中的地址就可以了。"hello world"是常量字符串,它的内存只有一个拷贝,因此str3和str4指向同一个地址。str3和str4结果相同。

(3)替换字符串”we are happy.“里的空格变成%20
思路:准备两个指针,”we are happy“的长度14,两个空格替换后长度为18
在这里插入图片描述
两个指针一个指向字符串末尾,另一个指向替换后字符串末尾
在这里插入图片描述
依次移动两个指针,把第一个指针指的内容复制到后一个指针指向的位置,直到第一个指针直到空格
在这里插入图片描述
把第一个指针向前移一格,第二个指针向前移三格,空格替换成%20
在这里插入图片描述
继续依次前移,把第一个指针指的内容复制到后一个指针指向的位置,直到第一个指针再次指到空格
在这里插入图片描述
把第一个指针向前移一格,第二个指针向前移三格,空格替换成%20
代码:

//length是字符数组,string为总容量
void replace(char string[],int length)
{
	if(string==nullptr || length<=0){
		return;
	}
	//olength为字符串实际长度
	int olength=0;
	int number=0;
	int i=0;
	while(string[i]!='\0')
	{
		++olength;
		if(string[i]==' '){
			++number;
		}
		++i;
	}
	//nlength为替换后的长度
	int nlength=olength+number*2;
	if(nlength>length){
		return;
	}
	int index=olength;
	int nindex=nlength;
	while(index>=0 && nindex>index)
	{
		if(string[index]==' ' ){
			string[nindex--]='0';
			string[nindex--]='2';
			string[nindex--]='%';
		}
		else{
			string[nindex--]=string[index];
		}
		--index;
	}
}

猜你喜欢

转载自blog.csdn.net/m0_64596200/article/details/126821945