当前位置: 首页 > article >正文

第七讲(二):双指针,指针运用

前言:前面讲的指针函数的内容有问题,现在已经改正。

1 指针运用:

例题1-1(字符串逆序)

(多组输入)写一个函数,可以逆序一个字符串的内容。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Reverse_char(char* p, int end)
{
	char* right = p+end-1;
	char* left = p;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
Print_char(char arr[], int num)
{
	printf("%s", arr);
}
int main()
{
	char arr[100] = { 0 };
	while (gets(arr) != EOF)
	{
		size_t num = strlen(arr);
		Reverse_char(arr,num);
		Print_char(arr, num);
	}
	return 0;
}

例题1-2:字符串左旋

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

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

方法1:一个一个旋

void Rotate_char(char* p, int len,int n)//核心函数代码
{
	n = n % len;
	for (int i = 0; i < n; i++)
	{
		int j = 0;
		char tmp = p[0];
		for (j = 0; j < len - 1; j++)
		{
			p[j] = p[j + 1];
		}
		p[j] = tmp;
	}
}
void Print_char(char* p)
{
	printf("%s\n",p);
}
int main()
{
	char arr[100] = { 0 };
	printf("输入字符串:");
	while (gets(arr) != EOF)
	{
		int n = 0;
		printf("输入左旋次数:");
		scanf("%d", &n);
		int len = strlen(arr);
		Rotate_char(arr,len,n);
		Print_char(arr);
	}
	return 0;
}

方法2:先逆置的前面的左旋次数的字符,然后再逆置后面,最后逆置整个字符串。

为什么要这样呢?

先举个例子:ABCDEFG假设左旋3个字符得到DEFGABC

我们的思路就是A和E换了,B和F换了,C和G换了。

那么我们怎么做呢?

我们想到的方法是逆置字符串

首先我们肯定要把前面3个字符逆置了,才能把C的位置换到首位

然后A的位置换到C的位置,接着肯定是要逆置后面4个字符的,(为了把D和A换了,E和B换了,A和F换了)逆置后面四个得到了

CBAGFED,你再逆置整个字符串是不是得到GDEFGABC。

代码如下:

void Reverse_char(char* p, int time)
{
	char* right = p+time-1;
	char* left = p;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void Print_char(char* p)
{
	printf("%s\n",p);
}
int main()
{
	//ABCDEFG->左旋3个  ->逆置前面3个 CBA DEFG
	//->CBA GFDE
	char arr[50] = { 0 };
	while (gets(arr)!=EOF)
	{
		int len = strlen(arr);
		int n = 0;
		printf("输入左旋次数:");
		scanf("%d", &n);
		Reverse_char(&arr[0], n);
		Reverse_char(&arr[n], len-n);
		Reverse_char(&arr[0], len);
		Print_char(arr);
	}
	return 0;
}

2 双指针的运用(相当于最左边一个指针,最右边一个指针进行类似窗口滑动的操作)

题目:

输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,

所有偶数位于数组的后半部分

void Sort_odd_ou(int arr[], int n)
{
	int left = 0;
	int right = n-1;
	while (left < right)
	{
		while (arr[left] % 2 == 1 && left < right)
		{
			left++;
		}
		while (arr[right] % 2 == 0 && left < right)
		{
			right--;
		}
		if (left < right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}
void Print_arr(int arr[], int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
}
void Scanf_arr(int arr[],int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d",&arr[i]);
	}
}
int main()
{
	int n = 0;
	int arr[100] = { 0 };
	printf("请输入数组的元素个数:");
	scanf("%d", &n);
	Scanf_arr(arr, n);
	Sort_odd_ou(arr,n);
	Print_arr(arr, n);
	return 0;
}


http://www.kler.cn/a/137302.html

相关文章:

  • 深度学习推理速度优化指南
  • 单元测试使用记录
  • python学opencv|读取图像(十七)认识alpha通道
  • 如何利用Python爬虫获得Lazada商品评论列表
  • 音频开发中常见的知识体系
  • 【Apache Paimon】-- 10 -- Paimon 0.9.0 集成 Hive 3.1.3
  • Ubuntu20.04 安装微信 【wine方式安装】推荐
  • HTML5学习系列之响应式图像
  • python电影数据可视化分析系统的设计与实现【附源码】
  • JAVA小游戏 “拼图”
  • 开源集群管理系统对比分析:Kubernetes 与 Apache Mesos
  • Run Legends将健身运动游戏化,使用户保持健康并了解Web3游戏
  • 【Java系列】SpringBoot 集成MongoDB 详细介绍
  • OpenCV 卷积运算和卷积核
  • 参与活动如何进行地区的限制
  • 力扣刷题第二十七天--二叉树
  • 安卓老项目改造为AndroidX
  • php字符串处理函数的使用
  • CMake 判断操作系统类型
  • git基本操作(配图超详细讲解)
  • 交叉编译tcpdump
  • 游戏中的资源动态加载
  • 重磅解读 | 阿里云 云网络领域关键技术创新
  • 入行IC | 从小白助理级,到总监专家级,到底要经历怎样的成长阶段呢?
  • go map字典操作
  • 卷积神经网络(VGG-19)灵笼人物识别