(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;
}
}