PTA L1-027 出租(详解)

前言:本期是关于出租的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你c了吗?

 题目:

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

代码实现: 

#include<stdio.h>
int bubble_sort_and_del(int number[], int sz)
{
	//排序
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (number[j] < number[j + 1])
			{
				int tmp = number[j];
				number[j] = number[j + 1];
				number[j + 1] = tmp;
			}
		}
	}
	//删除重复数字
	int m = 1;
	int n = 1;
	for (m = 1; m < sz; m++)
	{
		if (number[m] != number[m - 1])
		{
			number[n] = number[m];
			n++;
		}
	}
	return n;
}

int index_find(int key, int number[], int len)
{
	int i = 0;
	for (i = 0; i < len; i++)
	{
		if (key == number[i])
		{
			return i;
		}
	}
}

int main()
{
	char num[12] = { 0 };
	gets(num);
	int number[11] = { 0 };
	int number2[11] = { 0 };
	int i = 0;
	for (i = 0; i < 11; i++)
	{
		number[i] = num[i] - '0';
		number2[i] = num[i] - '0';
	}

	int len = bubble_sort_and_del(number, 11);
	printf("int[] arr = new int[]{");
	for (i = 0; i < len; i++)
	{
		printf("%d", number[i]);
		if (i != len - 1)
		{
			printf(",");
		}
	}
	printf("};\n");

	printf("int[] index = new int[]{");
	for (i = 0; i < 11; i++)
	{
		int index = index_find(number2[i], number, len);
		printf("%d", index);
		if (i != 10)
		{
			printf(",");
		}
	}
	printf("};");
}

大致思路: 

预备了解:

bubble_sort_and_del函数:将无序数组变成降序数组并删除重复数字

index_find函数:寻找匹配的下标

num数组:存储字符串形式的号码

number数组与number2数组:存储由字符串转变而来的号码

len:删除重复数字后的数组中的数字个数

下标m:遍历降序后的数组

下标n:记录要被存储非重复数字的空间位置

key:存储号码的一个数字

1. 将电话号码这一串数字一个个正序存入整型数组中,我们采用以下方法:

    a. 将号码看成字符串,存入字符数组中,再将字符数组中的每一个数字字符转成字符

    数字字符-'0'=数字

   b. 将一个个数字字符转化而来的数字存入整型数组number中

        考虑到number数组会进行降序排列并删除重复数字,使得电话号码发生改变

         故而我们另外定义number2数组存储一份原原本本的电话号码,用以后面的下标与值匹配

2. 将number数组中的电话号码进行降序排列,并删除重复数字

    我们交由自己编写的 bubble_sort_and_del函数实现

3. 按要求打印

    需要在降序后且删除重复数字的number数组中,匹配电话号码一个一个数字的下标

    交由 index_find函数实现

代码解读:

函数部分:

part 1:bubble_sort_and_del函数:返回降序排列并删除重复数字的数组中数字个数

int bubble_sort_and_del(int number[], int sz)
{
	//排序
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (number[j] < number[j + 1])
			{
				int tmp = number[j];
				number[j] = number[j + 1];
				number[j + 1] = tmp;
			}
		}
	}
	//删除重复数字
	int m = 1;
	int n = 1;
	for (m = 1; m < sz; m++)
	{
		if (number[m] != number[m - 1])
		{
			number[n] = number[m];
			n++;
		}
	}
	return n;
}

这里使用:

冒泡排序 (详解在我的另一篇博客,点击即跳转)

删除重复数字的双指针法:(详解在我的另一篇博客,点击即跳转,这里做粗略讲解)

删除重复数字,我们使用双指针法,即同时定义两个下标,指向同一个数组

way:a.使用双指针法删除重复数字的前提是数组有序(降序or有序)

             我们已经在冒泡排序函数内部将数组排好序了

          b. 排序后的number数组第一个元素一定不是重复数字,因为它是第一个出现的数字

              故而我们要排查的范围和要被存储非重复数字的空间范围从第二个元素开始

              下标m:遍历降序后(未删除任何一个元素)的number数组中的每一个数字

               下标n:记录要被存储非重复数字的空间位置

               m和n都最开始指向第二个元素,即m和n都初始化为1

           c. 拿m指向的元素和它前一个的元素进行比较:

              若是二者值相同

               则m此时指向的元素是重复数字,无需存入n指向的空间

               然后m++,走向下一个元素进行下一轮判断,n不动因为此时n指向的空间尚未存入数字

               若是二者值不同

                则m此时指向的元素不是重复数字,需要存入n指向的空间,存入数字后,n要指向下一个需要被存入非重复数字的空间,m++,走向下一个要是否为重复数字的元素,代码如下:

       if (number[m] != number[m - 1])
		{
			number[n] = number[m];
			n++;
		}

           d.  当m遍历数组结束后,n指向的每一个空间已经存入了非重复的数字,

               此时n的值就是number数组删除重复数字后的数字个数

                返回n

part 2:index_find函数:匹配号码的每一个数字在处理后number数组中对应的下标

int index_find(int key, int number[], int len)
{
	int i = 0;
	for (i = 0; i < len; i++)
	{
		if (key == number[i])
		{
			return i;
		}
	}
}

电话号码的每一个数字都要在经过降序删除重复数字处理后的number数组中去匹配对应的下标

主体部分:

part 1:将电话号码存入整型数组中


	char num[12] = { 0 };
	gets(num);
	int number[11] = { 0 };
	int number2[11] = { 0 };
	int i = 0;
	for (i = 0; i < 11; i++)
	{
		number[i] = num[i] - '0';
		number2[i] = num[i] - '0';
	}

先将电话号码以字符串的形式读取到字符数组num中,在将字符数组中的每一个数字字符转成数字并存入整型数组中

可能会有人问:为什么不直接让号码存入整型数组,而要经过字符转化成数字的形式?

答:这样做的优势是可以将电话号码正序存入整型数组中

part 2:打印第一行的输出

    int len = bubble_sort_and_del(number, 11);
	printf("int[] arr = new int[]{");
	for (i = 0; i < len; i++)
	{
		printf("%d", number[i]);
		if (i != len - 1)
		{
			printf(",");
		}
	}
	printf("};\n");

len:接收处理后的number数组中的数字个数

如:原本存入number数组中的电话号码 18013820100
       处理后变成: 8 3 2 1 0

part 3:打印第二行的输出


	printf("int[] index = new int[]{");
	for (i = 0; i < 11; i++)
	{
		int index = index_find(number2[i], number, len);
		printf("%d", index);
		if (i != 10)
		{
			printf(",");
		}
	}
	printf("};");

index:接收与电话号码的每一个数字匹配的下标 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,管理房屋出租信息可以使用多种方式,包括构建简单的数据库应用程序、使用web框架创建租房网站或API,或者使用现成的房产管理软件。Python因其丰富的库(如Django、Flask、SQLAlchemy等)和易读性,非常适合这类任务。以下是一个简化的概述: 1. **数据库管理**: - 使用Python的sqlite3模块,你可以创建一个SQLite数据库存储房源信息,包括房东信息、房屋详情和租赁条款。 - 如果需要更复杂的数据结构,可以使用ORM(如SQLAlchemy或Peewee)来操作关系型数据库。 2. **Web应用**: - Django是一个强大的Python web框架,可以用来开发功能完备的租房平台,包括用户注册、房源发布和查看、租约管理等。 - Flask则适合轻量级的应用,适合快速原型开发或小型项目。 3. **API**: - 利用FastAPI或Flask-RESTful创建RESTful API,让开发者可以轻松地通过HTTP请求获取或修改房源数据。 4. **Python库**: - 使用如Tenanty、Rentomatic等开源库简化租房管理流程,它们通常包含预定义的功能和界面。 5. **自动化任务**: - Python的定时任务库如APScheduler可以用于自动化租期提醒、租金收取等任务。 相关问题: 1. 如何在Python中实现数据库与租房信息的交互? 2. 利用哪个Python框架可以快速搭建一个租房信息发布系统? 3. 如何使用Python编写RESTful API来管理房屋出租数据? 4. 有没有适合Python的租房管理软件库推荐? 5. 如何确保租房信息的安全性和数据一致性?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值