小哼買書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.pswp.cn/news/537925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537925.shtml
英文地址,請注明出處:http://en.pswp.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中實現一個抽象方法…