小哼买书JAVA编写,04_小哼买书

现在来看一个具体的例子“小哼买书”(根据全国青少年信息学奥林匹克联赛 NOIP2006 普及组第一题改编),来实践一下 章所学的三种排序算法。

e586b57a1453

Paste_Image.png

小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的 ISBN 号(你知道吗?每 书都有唯一的 ISBN 号,不信的话你去找 书翻到背面看看)。当然有一些好书会有很多同学都喜欢,这样就会收集到很多重复的ISBN号。小哼需要去掉其中重复的ISBN号,即每个ISBN号只保留一个,也就说同样的书只买一 (学校真是够抠门的)。然后再把这些 ISBN 号从小到大排序,小哼将按照排序好的 ISBN 号去书店买书。请你协助小哼完成“去重”与“排序”的工作。

输入有 2 行,第 1 行为一个正整数,表示有 n 个同学参与调查(n≤100)。第 2 行有 n个用空格隔开的正整数,为每 图书的 ISBN 号(假设图书的 ISBN 号在 1~1000 之间)。

输出也是 2 行,第 1 行为一个正整数 k,表示需要买多少 书。第 2 行为 k 个用空格隔开的正整数,为从小到大已排好序的需要购买的图书的 ISBN 号。

例如输入:

10

20 40 32 67 40 20 89 300 400 15

则输出:

8

15 20 32 40 67 89 300 400

最后,程序运行的时间限制为 1 秒。

解决这个问题的方法大致有两种。第一种方法:先将这 n 个图书的 ISBN 号去重,再进行从小到大排序并输出;第二种方法:先从小到大排序,输出的时候再去重。这两种方法都可以。

先来看第一种方法。通过第一节的学习我们发现,桶排序稍加改动正好可以起到去重的效果,因此我们可以使用桶排序的方法来解决此问题。

#include

int main(){

int a[1001],n,i,t;

for(i=1;i<=1000;i++)

a[i]=0; //初始化

scanf("%d",&n); //读入n

for(i=1;i<=n;i++) //循环读入n个图书的ISBN号

{

scanf("%d",&t); //把每一个ISBN号读到变量t中

a[t]=1; //标记出现过的ISBN号

}

for(i=1;i<=1000;i++) //依次判断1~1000这个1000个桶

{

if(a[i]==1)//如果这个ISBN号出现过则打印出来

printf("%d ",i);

}

getchar();getchar();

return 0;

}

这种方法的时间复杂度就是桶排序的时间复杂度,为 O(N+M)。

第二种方法我们需要先排序再去重。排序我们可以用冒泡排序或者快速排序。

20 40 32 67 40 20 89 300 400 15

将这 10 个数从小到大排序之后为

15 20 20 32 40 40 67 89 300 400。

接下来,要在输出的时候去掉重复的。因为我们已经排好序,所以相同的数都会紧挨在一起。只要在输出的时候,预先判断一下当前这个数 a[i]与前面一个数 a[i 1]是否相同。如果相同则表示这个数之前已经输出过了,不用再次输出;不同则表示这个数是第一次出现,需要输出这个数。

#include

int main(){

int a[101],n,i,j,t;

scanf("%d",&n); //读入n

for(i=1;i<=n;i++) //循环读入n个图书ISBN号

{

scanf("%d",&a[i]);

}

//开始冒泡排序

for(i=1;i<=n-1;i++)

{

for(j=1;j<=n-i;j++)

{

if(a[j]>a[j+1])

{

t=a[j]; a[j]=a[j+1]; a[j+1]=t;

}

}

}

printf("%d ",a[1]); //输出第1个数

for(i=2;i<=n;i++) //从2循环到n

{

if( a[i] != a[i-1] ) //如果当前这个数是第一次出现则输出

printf("%d ",a[i]);

}

getchar();getchar();

return 0;

}

这种方法的时间复杂度由两部分组成,一部分是冒泡排序的时间复杂度,是 N (N2),另一部分是读入和输出,都是 O(N),因此整个算法的时间复杂度是 O(2N+N 2)。相对于 N2 来说,2N 可以忽略(我们通常忽略低阶),最终该方法的时间复杂度是 O(N2)。

接下来我们还需要看下数据范围。每个图书 ISBN 号都是 1~1000 之间的整数,并且参加调查的同学人数不超过 100,即 n≤100。之前已经说过,在粗略计算时间复杂度的时候,我们通常认为计算机每秒钟大约运行 10 亿次(当然实际情况要更快)。因此以上两种方法都可以在 1 秒钟内计算出解。如果题目中图书的 ISBN 号范围不是在 1~1000 之间,而是 2147483648~2147483647 之间的话,那么第一种方法就不可行了,因为你无法申请出这么大的数组来标记每一个 ISBN 号是否出现过。另外如果 n 的范围不是小于等于 100,而是小于等于 10 万,那么第二种方法的排序部分也不能使用冒泡排序。因为题目要求的时间限制是 1 秒,使用冒泡排序对 10 万个数进行排序,计算机要运行 100 亿次,需要 10 秒钟,因此要替换为快速排序,快速排序只需要 100000×log2100000≈100000×17≈170 万次,这还不到0.0017 秒。是不是很神奇?同样的问题使用不同的算法竟然有如此之大的时间差距,这就是算法的魅力!

我们来回顾一下 章三种排序算法的时间复杂度。桶排序是最快的,它的时间复杂度是O(N+M);冒泡排序是 O(N 2);快速排序是 O(NlogN)。

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

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

相关文章

[Err] 22007 - [SQL Server]从 nvarchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。

报错语句&#xff1a; cast(Replace(Replace(P.DeliverDate,.,-),/,-) as datetime)改为 cast(Replace(Replace(P.DeliverDate,.,-),/,-) as datetime2)使用 datetime2 代替 datetime

linux Postfix + dovecot + extmail + extman + mysql

配置环境&#xff1a;RHEL5.5 i386DNS MX[rootstation40 ~]# host -t MX tianyun.comtianyun.com mail is handled by 10 mail.tianyun.com.[rootstation40 ~]# [rootstation40 ~]# ping mail.tianyun.comPING mail.tianyun.com (192.168.0.2) 56(84) bytes of data.64 bytes f…

php 接口安全解决方案,php接口数据安全解决方案(一)

前言目的&#xff1a;1.实现前后端代码分离&#xff0c;分布式部署2.利用token替代session实现状态保持&#xff0c;token是有时效性的满足退出登录&#xff0c;token存入redis可以解决不同服务器之间session不同步的问题&#xff0c;满足分布式部署3.利用sign&#xff0c;前端…

Teamview连接Windows server问题

场景&#xff1a; 服务器在集团总部杭州&#xff0c;网管在集团宁波分公司&#xff0c;连接服务器通过内网远程桌面。过程&#xff1a; 网管给了tv的账号&#xff0c;密码。连接的时候一直连不上去。卡在“正在初始化连接参数”。后来网管不信&#xff0c;远程桌面了下&#xf…

nginx An attempt was made to access a socket in a way forbidden by its access permissions

在安装了 sqlserver2008 的win7 与 win2008 上启动 nginx&#xff0c;绑定80端口&#xff0c;报错&#xff1a; nginx An attempt was made to access a socket in a way forbidden by its access permissions查了百度&#xff0c;说修改注册表&#xff0c;但我的电脑上找不到文…

php codesniffer 代码规范,规范三:PHP_CodeSniffer 辅佐代码规范

>也可以参考此文&#xff1a;https://www.cnblogs.com/huangbx/p/php_codesniffer.html[TOC]我用的是wamp&#xff0c;环境是php7.0.23# (一)下载 pear打开http://pear.php.net/go-pear.phar&#xff0c;会显示代码&#xff0c;不用管他&#xff0c;直接copys复制到本地&…

php的cms是什么意思,phpcms是什么系统

什么是phpcms&#xff1f;Phpcms 是国内领先的网站内容管理系统&#xff0c;同时也是一个开源的PHP开发框架。Phpcms由内容模型、会员、问吧、专题、财务、订单、广告、邮件订阅、 短消息、自定义表单、全站搜索等20多个功能模块组成&#xff0c;内置新闻、图片、下载、信息、产…

【python】 time模块和datetime模块详解 【转】

一、time模块 time模块中时间表现的格式主要有三种&#xff1a; a、timestamp时间戳&#xff0c;时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b、struct_time时间元组&#xff0c;共有九个元素组。 c、format time 格式化时间&#xff0c;已格式化的结构使时间更…

spring boot Exception in Thread “main” java.lang.classNoFoundException

在客户测试环境部署&#xff0c;通过打包成jar&#xff0c;使用命令 nohup java -jar /usr/local/tomcat/shirencai/ct-peixun-provider.jar –spring.profiles.activestage > /usr/local/tomcat/shirencai/ct-peixun-provider-temp.txt & 报错后来排查以为是内存不够。…

php源码自动识别文本中的链接,自动加载识别文件Auto.php

用于本应用的控制器自动加载类设置&#xff0c;用法如同\CodeIgniter\Config\AutoloadConfig自动加载识别文件:dayrui/App/应用目录/Config/Auto.php语法格式&#xff1a;<?php // 自动加载识别文件return [/*** 命名空间映射关系*/psr4 > [],/*** 类名映射关系*/classm…

如何识别“答非所问”?使用gensim进行文本相似度计算

在文本处理中&#xff0c;比如商品评论挖掘&#xff0c;有时需要了解每个评论分别和商品的描述之间的相似度&#xff0c;以此衡量评论的客观性。 评论和商品描述的相似度越高&#xff0c;说明评论的用语比较官方&#xff0c;不带太多感情色彩&#xff0c;比较注重描述商品的属性…

防抓包重放php,超简单最基本的WEB抓包改包重放的方法

【注意&#xff1a;此文章为博主原创文章&#xff01;转载需注意&#xff0c;请带原文链接&#xff0c;至少也要是txt格式&#xff01;】很多很多刚刚接触的同事问我如何抓包&#xff0c;如果讲用工具可能还涉及什么装证书&#xff0c;熟悉使用工具等等&#xff0c;特别繁琐&am…

mysql查询很慢优化方法1

解决方法&#xff1a; 关联的字段建索引。 具体分析如下&#xff1a;举例&#xff1a; 表格&#xff1a;培训学生表&#xff0c;班级报名表 需求&#xff1a;查询出学生报了哪些班级 两表有个关联字段“CD”&#xff08;学生学号&#xff09;。 视图sql&#xff1a; SELECTt_px…

ubuntu进行apt-get时候出现Package ssh is not available, but is referred to by another package 错误...

今天在ubuntu进行ssh安装的时候&#xff0c;出现如下错误。Reading package lists... Done Building dependency tree... Done Package ssh is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is …

php找出函数定义位置,WordPress如何快速定位PHP函数所在文件位置及代码行号?

有时候我们需要修改别人源码里的代码&#xff0c;却找不到对应的函数放在了哪儿&#xff0c;就可以用使用本文介绍的办法&#xff0c;帮你快速定位函数位置。特别是某些写法不规范的WordPress主题&#xff0c;各种模块&#xff0c;函数到处放&#xff0c;找半天的那种。那么Wor…

微信公众号每次调用接口正确或错误的返回码

原文连接&#xff1a;https://blog.csdn.net/pansanday/article/details/65448868 ----------------------------------------- 公众号每次调用接口时&#xff0c;可能获得正确或错误的返回码&#xff0c;开发者可以根据返回码信息调试接口&#xff0c;排查错误。 全局返回码…

Phoenix:全局索引设计实践

概述 全局索引是Phoenix的重要特性&#xff0c;合理的使用二级索引能降低查询延时&#xff0c;让集群资源得以充分利用。 本文将讲述如何高效的设计和使用索引。 全局索引说明 全局索引的根本是通过单独的HBase表来存储数据表的索引数据。我们通过如下示例看索引数据和主表数据…

php 美颜,怀念以前无滤镜美颜的影视剧

滤镜是为了照片质量更高一些&#xff0c;色彩更真实突出的一种补助工具。自从有了美颜和滤镜后&#xff0c;大家的生活都变成了彩色。开了滤镜美颜&#xff0c;小伙伴们有木有感觉生活水平变高了&#xff1f;但影视剧&#xff0c;好像变成了单色&#xff1f;&#xff01;(注意&…

select2控件动态更新option

原文连接&#xff1a;https://blog.csdn.net/u010784959/article/details/77893674 ----------------------------------------------------------------------------- 根据输入框中内容&#xff0c;动态更新select2组件中option内容 监听输入框内容变化事件&#xff0c;先销…

在Python中定义和使用抽象类的方法

https://www.jb51.net/article/87710.htm 像java一样python也可以定义一个抽象类。 在讲抽象类之前&#xff0c;先说下抽象方法的实现。 抽象方法是基类中定义的方法&#xff0c;但却没有任何实现。在java中&#xff0c;可以把方法申明成一个接口。而在python中实现一个抽象方法…