练习--指针进阶算法题

1、杨氏矩阵

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于O(N);

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

#define ROW 3
#define COL 3

//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
//要求:时间复杂度小于O(N);

int SearchNum(int p[ROW][COL], int key)
{
	int i = 0;
	int j = 0;
	while (i < ROW)
	{
		if (key > p[i][COL-1])
		{
			i++;
		}
		else
		{
			while (j < COL)
			{
				if (p[i][j] == key)
				{
					return j + i*ROW;
				}
				j++;
			}
		}
	}
	return 0;
}

int main()
{
	int key = 0;
	int arr[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	printf("请输入要找的数:");
	scanf_s("%d", &key);
	int a = SearchNum(arr, key);
	printf("行:%d\n列:%d\n", (a / ROW) + 1, (a%COL) + 1);
}

2、字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>

//实现一个函数,可以左旋字符串中的k个字符。
//例如:
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB

char* LeftRotation(char* str,int k)
{
	int len = strlen(str);
	char* run = str;
	while (k)
	{
		char tmp = *str;
		for (int i = 1; i < len; i++)
		{
			*run = *(run + 1);
			run++;
		}
		*run = tmp;
		run = str;
		k--;
	}
	return str;
}

int main()
{
	char str[] = "hello";
	char* a = LeftRotation(str, 2);
	printf("%s", a);
	return 0;
}

3、字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>


//写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
//例如:给定s1 = AABCD和s2 = BCDAA,返回1
//给定s1 = abcd和s2 = ACBD,返回0.
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//AABCD右旋一个字符得到DAABC


char* LeftRotation(char* str,int k)
{
	int len = strlen(str);
	assert(len >= k);
	char* run = str;
	while (k)
	{
		char tmp = *str;
		for (int i = 1; i < len; i++)
		{
			*run = *(run + 1);
			run++;
		}
		*run = tmp;
		run = str;
		k--;
	}
	return str;
}


char* RightRotation(char* str, int k)
{
	int len = strlen(str);
	assert(len >= k);
	char* run = str + len - 1;
	while (k)
	{
		char tmp = *(str + len - 1);
		for (int i = 1; i < len; i++)
		{
			*run = *(run - 1);
			run--;
		}
		*run = tmp;
		run = str + len - 1;
		k--;
	}
	return str;
}


int JudgingRotation(char*str1, char*str2)
{
	int len1 = strlen(str1);
	char* str = 0;
	//左旋转判断
	for (int k = 1; k < len1; k++)
	{
		str = LeftRotation(str1, k);
		if (*str == *str2)
		{
			return 1;
		}
		str = RightRotation(str1, k);
	}
	//右旋转判断
	for (int k = 1; k < len1; k++)
	{
		str = RightRotation(str1, k);
		if (*str == *str2)
		{
			return 1;
		}
		str = LeftRotation(str1, k);
	}
	return 0;
}


int main()
{
	char str1[] = "mingtiannihao";
	char str2[] = "haomingtianni";
	int a = JudgingRotation(str1, str2);
	printf("%d\n", a);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值