c语言作业2

文章展示了如何在杨氏矩阵中查找特定数值并返回其下标,以及两种不同的方法实现字符串左旋,包括直接循环和三步翻转法。同时讨论了判断两个字符串是否为旋转结果的两种算法,一种是穷举旋转,另一种利用库函数检查子集关系。
摘要由CSDN通过智能技术生成

本文章写于2023.2.11

1杨氏矩阵

int find_num(int arr[][3], int row, int col, int k)
{
	int x = 0;
	int y = col - 1;
	while (x<row && y>=0)	// 防止越界
	{
		if (arr[x][y] < k)
			x++;
		else if (arr[x][y] > k)
			y--;
		else
			return 1;
	}
	return 0;		//没找到返回0
}
int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 7;
	int ret = find_num(arr, 3, 3, k);
	if (ret == 1)
		printf("找到了!");
	else
		printf("没找到..");
	return 0;
}
现在要求返回下标,可以这样写
int find_num(int arr[][3], int* row, int* col, int k)
{
	int x = 0;
	int y = *col - 1;
	while (x<row && y>=0)	// 防止越界
	{
		if (arr[x][y] < k)
			x++;
		else if (arr[x][y] > k)
			y--;
		else
		{
			*row = x;
			*col = y;
			return 1;
		}
	}
	return 0;		//没找到返回0
}
int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = find_num(arr, &x, &y, k);
	if (ret == 1)
	{
		printf("找到了!\n");
		printf("下标是:%d %d\n", x, y);
	}
	else
		printf("没找到..");
	return 0;
}

字符串左旋

方法1,直接循环

void left_move(char arr[], int k)
{
	int n = strlen(arr);
	for (int i = 0; i < k; i++)
	{
		char tmp = *arr;	//先把首字母存起来
		// 接着让后面n-1挪到前面来
		for (int j = 0; j < n - 1; j++)
		{
			*(arr + j) = *(arr + j + 1);
		}
	// 最后把存起来的tmp放到最后
		*(arr + n - 1) = tmp;;
	}
}

int main()
{
	char arr[] = "ABCDEF";
	int k = 2;
	left_move(arr, k);
	printf("%s\n", arr);
}

方法2,三步翻转法

void reverse(char* left,char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "ABCDEF";
	int k = 2;
	int n = strlen(arr);
	reverse(arr, arr + k - 1);	// 左
	reverse(arr + k, arr + n - 1);	//右
	reverse(arr, arr + n - 1);	// 整体翻转
	printf("%s\n", arr);
}

字符串旋转结果

方法1,直接穷举

int is_rotate(char* arr1, char* arr2)
{
	int n = strlen(arr1);
	for (int i = 0; i < n; i++)
	{
		char tmp = *arr1;	//先把首字母存起来
		// 接着让后面n-1挪到前面来
		for (int j = 0; j < n - 1; j++)
		{
			*(arr1 + j) = *(arr1 + j + 1);
		}
		// 最后把存起来的tmp放到最后
		*(arr1 + n - 1) = tmp;
		if (strcmp(arr1, arr2) == 0)
			return 1;
	}
	return 0;
}
int main()
{
	char arr1[] = "AABCD";
	char arr2[] = "BCDAA";
	int n = strlen(arr1);
	int ret = is_rotate(arr1, arr2);
	if (ret == 1)
		printf("yes!\n");
	else
		printf("no...\n");
}

方法二,用库函数

int is_left_rotate(char* arr1, char* arr2)
{
	if (strlen(arr1) != strlen(arr2))	// 如果两个字符串大小不同,必然不会是另一个字符串翻转过来的
		return 0;
	// 先在arr1[]后复制一份自己
	int len = strlen(arr1);
	arr1 = strncat(arr1, arr1, len);
	// 接着看arr2是否是arr1的子集
	char* pret = strstr(arr1, arr2);
	return pret != NULL;	// 如果pret是NULL,则返回假0;
}
int main()
{
	char arr1[20] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = is_left_rotate(arr1, arr2);
	if (ret == 0)
		printf("no...\n");
	else
		printf("yes!\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值