指针与字符串相关练习题

举报
lovevivi 发表于 2022/08/12 12:39:28 2022/08/12
【摘要】 一.杨氏矩阵我们要考虑时间复杂度问题小于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)//...

一.杨氏矩阵

在这里插入图片描述
我们要考虑时间复杂度问题
小于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循环判断就会结束
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。