【C语言刷题合集】(一)——数组部分

                

🌟菜鸟主页:@晨非辰的主页

👀学习专栏:《C语言刷题合集》

💪学习阶段:C语言方向初学者

名言欣赏:"编译器不会骗人,骗人的永远是你写的逻辑。"


前言:刷题博客主要记录在学习编程语言时,练习的一系列题目,比较适合C语言的初学者用来巩固提高编程能力,其余可见专栏。


 1. 数组练习——多个字符从两端移动,向中间汇聚

解题思路——


--核心逻辑 

  • 目标:
  1. ​​​实现:将初始数组1内容全为“*”逐步换成数组2“welcome to bit!!!!!!
  2. 替换形式:要求从左侧和右侧同时替换,一回算一次;
  3. 输出展示:每替换一次,在屏幕上打印;

--​​​​​​​​​​​​​​​​​​​​​定义变量与初始化

  • ​​​​​​​定义数组:
    初始数组:char arr1[] = {"********..."};
    最终数组:char arr2[] = {"welcome ..."};
  • 确定范围:

​​​​​​​--定义出左右两个变量,将二者置于最大范围,即左为0、右为数组最右侧下标;​​​​​​​

--对于数组长度的计算——可以选择sizeof/strlen;


--循环实现:

while循环,循环条件----当左值小于等于右值;将两个数组内容进行对应赋值。 


-- 优化调整:

为了更清楚看到代码的变化,使用睡眠函数--Sleep(包含头文件 windows.h)延长代码出现时间。

//想达到动画效果(每次清屏),使用指令----system(cls)


#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
	char arr1[] = "********************";//初始数组
	char arr2[] = "welcome to bit!!!!!!";//最终目标数组

	//求数组长度,利用下标进行替换

	int left = 0;//定义左右变量,用来当下标
	int right = strlen(arr1) - 1;//求数组长度,要使用下标,结果-1/也可以用sizeof;

	//实现左侧和右侧同时替换,利用循环进行
	while (left <= right)//循环条件,当l>r代表全部替换完成
	{
		arr1[left] = arr2[left];
		arr1[right] = arr2[right];

		left++;
		right--;

		printf("%s\n", arr1);//最后打印

		//实现打印速度降低,使用睡眠函数
		Sleep(500);//单位ms

		//实现只留下一部的操作,使用清屏的函数/指令
		system("cls");//cls——clean screen

	}
	printf("%s\n", arr1);
	return 0;
}

🍀注意:对于求数组长度strlen还是sizeof的使用,会在后续文章出现。

2. 数组练习——二分查找

解题思路——


--核心逻辑

  • 目标:在升序数组中查找数值num,找到则返回下标,否则提示未找到;
  • 核心思路:

--确定边界——l、r(数组长度,使用下标);

--计算中间值——mid;比较arr[mid]与num,对边界进行调整;


--定义变量与初始化

升序数组:arr[] = {...};
边界:int left = 0; int right = sizeof(arr) / sizeof(arr[0]) -1//下标
中间值:int mid = (left + right)/2
数值:num 自行输入

--语句实现 

while循环条件——left<=right。

折半过程中,范围缩小,if else语句 讨论中间值与num大小确定左变还是右变。


 --优化与调整

数组不是升序数组/长度为0,直接返回没找到。


int main()
{
	int arr[] = {1,2,3,4,4,7,6,5,8,9};
	// int arr[] = { 1,2,3,4,5,6,7,8,9 };//定义简单的升序数组;包括非严格升序:有相等数值;
	
	//折半查找数字n,要确定中间值、要确定范围;与num进行比较。用到下标
	int num = 10;
	//scanf("%d", &num);//数值n由输入确定

	int left = 0;//下标0开始
	int right = sizeof(arr) / sizeof(arr[0]) - 1;//将最右下标确定为数组最右数值

	bool found = false;//布尔类型,定义初始没找到

	int i = 0;

	if ((right == -1) || (arr[i] > arr[i++]))//数组长度为0,直接输出:没找到!||非升序数组直接返回没找到
	{
		printf("没找到!\n");
	}

	//循环实现num与mid比较
	while (left <= right)
	{
		int mid = (left + right) / 2;//中间值
		if (arr[mid] < num)
		{
			left = mid + 1;//r不变
		}
		else if (arr[mid] > num)
		{

			right = mid - 1;//l不变
		}
		else
		{
			printf("找到了!下标是: %d\n", mid);
			found = true;
			break;//找到,跳出循环
		}
	}
	if (found == false)//bool不变,输出没找到
	{
		printf("没找到!\n");
	}
	return 0;
}

结语:本章主要是对数组部分习题的练习,后续还会有其他练习;如果对你有帮助,那就一起来刷题吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值