目录
热身小题
名称:杨氏矩阵
内容:有一个数字矩阵,矩阵的每行从左到右递增,请编写程序在这样的矩阵中查找某个数字
要求:时间复杂度小于O(N)
#include <stdio.h>
int FindNum(int arr[3][3], int k, int row, int col)
{
int x = 0;
int y = col - 1;
while(x<=row-1 && y>=0)
if (arr[x][y] > k)
{
y--;
}
else if (arr[x][y] < k)
{
x++;
}
else
{
return 1;
printf("%d %d\n", x, y);
}
return 0;
}
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int k = 7;
int ret = FindNum(arr, k, 3, 3);
if (ret == 1)
{
printf("找到了\n");
}
else
{
printf("没找到\n");
}
return 0;
}
以下是该代码的优化:
下面浅谈以下stract,strncat这个函数
#include <string.h>
int is_left_move(char *str1,char *str2)
{
int len=strlen(str1);
int len2=strlen(str2);
if(len1!=len2)
return 0;
//在字符串中追加一个str1字符串
strncat(str1,str1,6);
//判断str2指向的字符串是否是str1指向的字符串的子串
char *ret=strstr(str1,str2);
}
int mian()
{
char arr[30]="abcdef";
char arr2[]="cdefab";
int ret=is_left_move(arr1,arr2);
if(ret==1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
if(ret==NULL)
{
return 0;
}
else
{
return 1;
}
注意:自己与自己追加不能用strcat函数
函数介绍
strlen
size_t (unsigned int) strlen(const char *string)
-
字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
-
参数指向的字符串必须以'\0'结束
-
注意函数的返回值为size_t,是无符号的
用计数器的方法实现strlen
#include<assert.h>
int my_strlen(const char* str)
{
int main()
{
int count=0;
assert(str!=NULL);
while(*str!=NULL)
{
count++;
str++;
}
return count;
}
int main()
{
int len=my_strlen("abcdef");
printf("%d\n",len);
return 0;
}
if(strlen("abc")-strlen("abcdef")>0)
{
printf("Y\n");
} 此段代码输出的是Y
因为strlen返回的是无符号整型
else
{
printf("N\n");
}
return 0;
}
strcpy
char *strcpy (char *destination,const char *source)
- 源字符串必须以'\0'结束
- 会将源字符串中的'\0'拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
下面来实现strcpy函数
char* my_strlen(char* dest,char* src)
{
assert(dest!=NULL);
assert(src!=NULL);
char *ret=dest;
while(*dest++=*src++)
{
;//拷贝src指向的字符串到dest指向的空间,包含'\0'
}
return ret;
//返回目的空间的起始地址
}
int main()
{
char arr1[]="abcdefghi";
char arr2[]="bit";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
或者可以这样拷贝
while(*src!='\0')
{
*dest=*src;
dest++;
src++;
}
strcat
char* strcat(char* destination,const char* source)
- 源字符串必须以'\0'结束
- 目标空间必须有足够的大,能容纳下源字符串的内容
- 目标空间必须可修改
- 字符串不可自己给自己追加
my_strlen(char* dest,const char*src)
{
char *ret=dest;
assert(dest!=NULL);
assert(src);
//assert(dest&&src);
//找到目的字符串的'\0'
while(*dest!='\0')
{
dest++;
}
//追加
while(*dest++=*src++);
return ret;
}
长度不受限制的字符串函数
strcpy,stract,strcmp
strcmp
标准规定
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 地一个字符串等于第二个字符串,则返回等于0的数字
- 第一个字符串小于第二个字符串,则返回小于0的数字
函数的使用:
int strcmp(const char* str1,const char* str2)
char* p1="qbc";
char* p2="abc";
if(strcmp(p1,p2)>0)
{
printf("p1>p2\n");
}
else if(strcmp(p1,p2)==0)
{
printf("p1==p2\n");
}
else if(strcmp(p1,p2)<0)
{
printf("p1<p2\n");
}
return 0;
函数的实现:
int my_strcmp(const char*str1,const char* str2)
{
assert(str1&&str2);
while(*str1==*str2)
{
if(*str1=='\0')
{
return 0;
}
str1++;
str2++;
}
if(*str1>*str2)
return 1; ----- return (*str1-*str2)
else
return -1;
}
int main()
{
char*p1="abcdef";
char*p2="abcefd";
int ret=my_strcmp(p1,p2);
printf("ret=%d\n",ret);
return 0;
}
strncpy
char *strncpy(char* destination,const char*source,size_t num)
- 拷贝num个字符从源字符串到目标空间
- 如果源字符串的长度<num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
strncat
char*strncat(char*destination,const char*source,size_t num)
把src所指的字符的前n个字符添加到dest结尾处(覆盖原dest结尾处的'\0'),并添加新的'\0'
NULL——空指针 Null/NUL——'\0\
常量字符串不能被修改
strncmp
int strncmp(const char*string1,const char*string2,size_t count)
strstr
int main()
{
char *p1="abcdefabcdef";
char *p2="def";
char *ret=strstr(p1,p2);
if(ret==NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n",ret);
}
return 0;
}
实现strstr函数
char *my_strlen(const char*p1,const char*p2)
{
assert(p1!=NULL);
assert(p2!=NULL);
char *s1=p1;
char *s2=p2;
char *cur=(char*)p1;
if(*p2=='\0')
{
return p1;
}
while(*cur)
{
s1=cur;
s2=(char *)p2;
while((*s1!='\0')&&(*s2!=0)&&(*s1==*s2))
{
s1++;
s2++;
}
if(*s2=='\0')
{
return cur;
}
if(*s1=='\0')
{
return NULL;
}
cur++;
}
return NULL;
}
int mian()
{
char*p1="abbbcdef";
char*p2="bbc";
char*ret=my_strstr(p1,p2);
if(ret==NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n",ret);
}
return 0;
也可用KMP算法实现以上代码