PTA L1-027 出租(详解)

news2025/1/10 23:30:08

前言:本期是关于出租的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你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:接收与电话号码的每一个数字匹配的下标 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python学习笔记】:数据科学库操作(三)

接上一篇&#xff1a; 14、Pandas Pandas 是一个快速、强大、灵活且易于使用的开源数据分析和操作工具&#xff0c; Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据&#xff0c;可以对各种数据进行运算操作&#xff0c;比如归并、再成形、选择&#…

SockJS-client简介

概述 SockJS是一个浏览器JavaScript库&#xff0c;提供了一个类似websocket的对象。SockJS为您提供了一个连贯的&#xff0c;跨浏览器的Javascript API&#xff0c;它在浏览器和web服务器之间创建了一个低延迟&#xff0c;全双工&#xff0c;跨域通信通道。 实际上&#xff0…

计算机网络入门(网络协议篇)

计算机网络分类虽然网络类型的划分标准各种各样&#xff0c;但是从地理范围划分是一种大家都认可的通用网络划分标准。按这种标准可以把各种网络类型划分为局域网、城域网、广域网三种。局域网一般来说只能是一个较小区域内&#xff0c;城域网是不同地区的网络互联&#xff0c;…

什么是进取心?如何提高进取心?

1、什么是进取心&#xff1f;进取心是一种心理状态&#xff0c;说的是积极上进&#xff0c;不断对自己提高要求&#xff0c;促使自己持续发展的心态。不论是学习还是工作&#xff0c;进取心都是我们获取成就的必备。从人的一生来说&#xff0c;进取心是我们探索人生最宝贵的修养…

ADB 开启 USB调试后,无法自动弹出调试授权窗口的解决方法

之前介绍了 Android Device Unauthorized 的解决方案&#xff0c;这次将分享 开启 USB调试后&#xff0c;无法自动弹出调试授权窗口的解决方法。即使选择在 “仅充电” 的情况下去调试&#xff0c;结果都一样。 在我自己的工程机 (荣耀系列的) 连上电脑后&#xff0c;USB 连接方…

《深入浅出计算机组成原理》学习笔记 Day18

冒险和预测&#xff08;二&#xff09;1. NOP 操作和指令对齐2. 操作数前推参考1. NOP 操作和指令对齐 MIPS 体系结构下的 R、I、J 三类指令&#xff1a; 五级流水线“取指令&#xff08;IF&#xff09;— 指令译码&#xff08;ID&#xff09;— 指令执行&#xff08;EX&…

linux_进程间通信 IPC

文章目录1、管道1.1、匿名管道1.2、有名管道2、信号3、共享内存3.1、共享内存接口3.1.1、生成 key 值3.1.2、创建共享内存3.1.3、创建共享内存映射3.1.4、解除共享内存映射3.1.5、修改共享内存属性3.2、例&#xff1a;共享内存4、信号量4.1、信号量的接口4.1.1、创建信号量4.1.…

第二章 RISC-V 指令集架构

前言 提醒&#xff1a;全文10千字&#xff0c;预计阅读时长15分钟&#xff1b;读者&#xff1a;对 RISC-V 架构感兴趣的小伙伴&#xff1b;目的&#xff1a;读者利用15~30 分钟对本文沉浸式阅读理解&#xff0c;能够掌握 RISC-V 架构 80% 的要点&#xff1b;关键词 &#xff1a…

Mysql 高级学习笔记

Mysql 高级学习笔记 文章目录Mysql 高级学习笔记一、Mysql 基础1. 聚合函数2. having3. sql 的执行顺序4. 约束5. 试图二、Mysql 高级1. MySQL中的SQL的执行流程2. 存储引擎介绍2. 索引3. 性能分析工具的使用4. 索引优化与查询优化5、关联查询优化6、事务及日志6、MVCC一、Mysq…

【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用容器(deque容器)

文章目录一、deque容器基本概念二、deque构造函数三、deque赋值操作四、deque 大小操作五、deque 插入和删除六、deque 数据存取七、deque 排序一、deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vec…

【Python】在代码中执行终端命令并获取输出和运行状态

文章目录0 前言1 os库1.1 os.system1.2 os.popen2 subprocess库2.1 subprocess.run2.2 subprocess.Popen3 参考链接0 前言 在Python编程过程中&#xff0c;我们可能会遇到需要在终端命令行执行某个命令并获取其输出的操作&#xff0c;我们首先想到可能就是C语言中的system(&quo…

字节青训营——分布式学习笔记

1. 分布式事务 满足ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;的一组操作&#xff0c;可以被称为一个事务。 同样的&#xff0c;分布式事务也部分遵循 ACID 规范&#xff1a; 原子性&#xff1a;严格遵循一致性&#xff1a;事务完成后的一致性严格遵循&am…

超详细域名备案+阿里云服务器配置+小程序开发(简略)+前后端分离(简略)

文章目录前言一、试水环节&#xff08;配置阿里云服务器环境&#xff09;二、购买域名及备案1.购买域名2.域名备案3.域名解析4.白嫖SSL证书5.在网站上链接备案号三、设置微信小程序开发的权限四、安装微信小程序开发的工具五、前后端分离&#xff08;简略&#xff09;总结前言 …

RPA自动化办公06——Uibot中的UB编程语言基础

参考&#xff1a;UB语言参考_UiBot开发者指南 虽然Uibot用命令就行&#xff0c;但是编程习惯会让程序员们更喜欢看源代码&#xff0c;有时候写源代码会更加方便&#xff0c;所有要学习UB的语言基础。 它很简单&#xff0c;和Python很像&#xff0c;下面简单了解一个各种基础语…

美团:前景乐观但风险巨大

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 增长势头强劲&#xff0c;已经扭亏为盈 过去几年&#xff0c;美团&#xff08;03690&#xff09;的收入一直在以两位数的速度在增长。 这一增长势头&#xff0c;到了2022年还在延续&#xff08;美团的收入在2022年仍保持…

kob配置git环境与项目创建

配置git环境 1.安装Git Bash 如果是使用Linux和mac可以跳过第一步操作&#xff0c;如果使用windows需要安装Git Bash:Git Bash传送门安装过程中所有配置按照默认即可&#xff1b; 2.配置Git环境 2.0 创建秘钥&#xff1a;使用命令&#xff1a;“ssh-keygen”生成秘钥&#…

【Java基础】多线程学习

1.多进程和多线程 多进程&#xff1a; 是指操作系统能同时运行多个任务&#xff08;程序&#xff09;。 多线程&#xff1a; 是指在同一程序中有多个顺序流在执行。 实现&#xff1a; 在java中要想实现多线程&#xff0c;有两种手段&#xff0c;一种是继承Thread类&#xff…

1、环境安装

目录一、vscode插件二、设置代理GOPROXY三、gopls1 - vscode弹出插件支持安装2 - LSP3 - gopls四、vscode设置一、vscode插件 vscode插件商店 Go Team at Google&#xff1a;让vscode关联上go语言的开发环境 Outline Map&#xff1a;更好的代码大纲 二、设置代理GOPROXY…

操作系统进程同步

文章目录操作系统进程同步一.进程同步的基本概念1.两种形式的制约关系2.临界资源&#xff08;critical resource&#xff09;3.临界区&#xff08;critical section&#xff09;4.同步进制遵循的原则二.硬件同步机制1.关中断2.Test-and-Set 指令3.Swap指令实现进程互斥三.信号量…

mysql-视图的定义和简单使用

mysql-视图视图1. 视图的定义2.视图的创建规则和使用限制小结视图 1. 视图的定义 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。 视图的一些常见应用&#xff1a; 重用SQL语句。 简化复杂的SQL操作。在编写查询后&#xff0c;可以…