一维数组的练习

Hello everybody!今天我们不讲新的语法,来讲两道数组的练习,巩固一下上节课学习的数组的语法知识。好了,让我们开始吧。

多个字符从两端移动,向中间汇聚

分析: 首先我们先要创建两个整数来记录左右两端的下标,接着通过这两个整数来交换两个字符数组中的内容,接着我们需要调整这两个整数来重复上述工作。所以这题我们需要一个循环来解决,那么循环的结束条件是什么呢?应该是左边的整数要小于右端。这里我再来介绍三个新的知识,

  • strlen函数可以求字符串的长度

  • Sleep函数可以让当前的线程暂停一段时间,它的单位是毫秒。

  • system(“cls”): system函数是库函数,cls是控制台屏幕清空指令。

分析完毕,让我们来实践吧。

#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
	char arr1[] = "hello world!";
	char arr2[] = "????????????";
	//定义两个整数进行记录
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left <= right)
	{
		Sleep(1000);
		//两个数组中的内容进行交换
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		//整数的调整
		left++;
		right--;
		printf("%s\n", arr2);
		Sleep(1000);
		system("cls");
	}
	printf("%s\n", arr2);
	return 0;
}

二分查找

题目描述:在一个升序的数组中查找指定的数字n。

分析: 首先我们和上个题目一样先要创建两个整数来记录左右两端的下标,接着我们要创建一个整数来记录中间位置元素的下标。接着根据中间元素和指定的数组进行比较,根据不同的结果调整左右两端。然后我们再来定义一个变量来记录是否找到了,找到的话就修改变量的值,然后根据这个变量的值来校验是否成功找到了指定的数字。显然这题的循环的结束条件还是左边的整数要小于右端。分析完毕,我们直接来实践一下。

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int key = 2;//目标数字
	//定义两个整数记录左右两端的下标
	int left = 0;
	int len = sizeof(arr) / sizeof(arr[0]);
	int right = len - 1;
	int find = 0;//如果找到了我们就修改变量的值为1
	while (left < right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] > key)
		{
			left = mid + 1;
		}
		else
		{
			//修改变量的值并跳出循环
			find = 1;
			break;
		}
	}
	if (find == 1) 
	{
		printf("找到了!\n");
	}
	else
	{
		printf("没找到!\n");
	}
	return 0;
}

最后,这里还有一个小细节,如果left和right比较大的时候mid可能存在问题,所以我们可以采用这种方式:

int mid = left + (right - left)/2;

好了,这节课我们就上到这里,下节课不见不散。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值