(文章目录)

一.杨氏矩阵

在这里插入图片描述 我们要考虑时间复杂度问题 小于o(N)说明循环次数不能为双for

#include<stdio.h>
int search(int arr[3][3], int *px, int *py, int k)
{
	int x = 0;
	int y = *py - 1;//最后一列的坐标
	while (x <= *px - 1 && y >= 0)
	{
		if (arr[x][y] <k)//如果第N行最后一个列的元素值比K还小 说明K值必在下面
		{
			x++;
		}
		else if(arr[x][y]>k)//如果第N+1行最后一列的元素比K值大 说明K值有可能在它左边
		{
			y--;
		}
		else
		{
			*px = x;//将坐标传递回去
			*py = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int k = 8;
	int x = 3;
	int y = 3;
	int ret=search(arr, &x, &y,k);//将行x 列y分别进行传址调用 在函数中对应坐标位置可以传回来
	if (ret == 1)
	{
		printf("找到了\n%d %d",x,y);
	}
	else
	{
		printf("没找到\n");
	}
	return 0;
}

二.字符串左旋

在这里插入图片描述 1.

#include<stdio.h>
#include<string.h>
void rotate(char* str, int k)
{
	int i = 0;
	int j = 0;
	char tmp = 0;
	int len = strlen(str);
	for (i = 0; i < k; i++)//根据要左旋次数确定循环次数
	{
		tmp = *str;//将第一个字符赋给tmp
		for (j = 0; j < len - 1; j++)//将后面的字符依次向前赋值
		{
			*(str+j)= *(str + j+1);
		}
		str[len - 1] = tmp;//最后一位字符被tmp赋值
	}
}
int main()
{
	char arr[] = "ABCD";
	int k = 1;
	rotate(arr,k);
	printf("%s\n", arr);
	return 0;
}

2.三步翻转法


#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)//两者交换
{
	while (left < right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "ABCD";
	int k = 2;
	int len = strlen(arr);
	reverse(arr, arr + k - 1);//将要翻转的字符逆序
	reverse(arr + k, arr + len - 1);//剩余的字符逆序
	reverse(arr, arr + len - 1);//整体逆序
	printf("%s\n", arr);
	return 0;
}

三.字符串旋转结果

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int  rotate(char* str, char*str2)
{
	int i = 0;
	int j = 0;
	char tmp = 0;
	int len = strlen(str);
	for (i = 0; i < len; i++)//根据要左旋次数确定循环次数
	{
		tmp = *str;//将第一个字符赋给tmp
		for (j = 0; j < len - 1; j++)//将后面的字符依次向前赋值
		{
			*(str + j) = *(str + j + 1);
		}
		str[len - 1] = tmp;//最后一位字符被tmp赋值
		if (strcmp(str, str2) == 0)//如果两个字符串相等
		{
			return 1;
		}
	}
	return 0;
}
int main()
{
	char arr1[] = "AABCD";
	char arr2[] = "BCDAA";
	int ret=rotate(arr1, arr2);//左旋即可判断所有情况
	if (ret == 1)
	{
		printf("是\n");
	}
	else
	{
		printf("否\n");
	}
	return 0;
}



四.颠倒字符串

#include<stdio.h>// i love you.-----.uoy evol i----- you love i
#include<string.h>
void swap(char* left, char* right)//两者交换
{
	while (left < right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()        
{
	char arr[] = "i love you.";
	int len = strlen(arr);
	swap(arr, arr + len - 1);
	char* dest = arr;
	char* src = arr;
	while (*src!='\0')
	{
		while (*src != ' '&&*src!='\0')
		{
			src++;
		}
		char* prev = src - 1;
		swap(dest, prev);
		if (*src != '\0')
		{
			src++;
		}
		dest = src;
	}
	printf("%s\n", arr);
	return 0;
}

主要应用三步翻转法 i love you. 首先 将整体翻转 .uoy evol i 再将每个进行翻转 : .uoy----you. evol----love i-----i 再开始的时候定义两个指针 dest src 想使用 dest 指向每个小整体字符的第一个 src指向每个小整体字符的最后一个 在循环中触发为 src指向 ' '或者 '\0' prev是为了找到它的前一个 即每个小整体字符的最后一个 src++后 指向新的小整体字符的第一个再次循环即可

          src++时我们可以发现若最后'\0'进来不++
          在while循环判断就会结束