1. 程式人生 > >從藍橋杯題目看Java輸入問題

從藍橋杯題目看Java輸入問題

就我目前有限的藍橋杯做題經驗來看,C/C++和Java的第一個區別就是輸入。Java的輸入相對比較困難,雖然Scanner已經提供了很多便利,能夠接受多種型別的輸入,但是在多行輸入,尤其是包含空格,長度未知的輸入情況下十分痛苦。。。
以今天做到的一個問題為例:
*問題描述
某涉密單位下發了某種票據,並要在年終全部收回。
每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。
因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。
你的任務是通過程式設計,找出斷號的ID和重號的ID。
假設斷號不可能發生在最大和最小號。
輸入格式
要求程式首先輸入一個整數N(N<100)表示後面資料行數。
接著讀入N行資料。
每行資料長度不等,是用空格分開的若干個(不大於100個)正整數(不大於100000),請注意行內和行末可能有多餘的空格,你的程式需要能處理這些空格。
每個整數代表一個ID號。
輸出格式
要求程式輸出1行,含兩個整數m n,用空格分隔。
其中,m表示斷號ID,n表示重號ID
樣例輸入1
2
5 6 8 11 9
10 12 9
樣例輸出1
7 9
樣例輸入2
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
樣例輸出2
105 120*
這個問題對資料輸入處理的要求比較高(對java而言,C/C++的話直接一句gets()就能解決問題),之前想用for()迴圈套while(s.hasNext()){},然而while()一入深似海,再也出不來了。百度一下發現是.hasNext()對控制檯的輸入阻塞(就是說會停在這一步,直到輸入EOF/Ctrl+Z結束這一步)的緣故。當然也可以用next()結束它,但是就這道題的要求而言似乎不可行。
最後在網上看到一個帖子提供了思路,原文見:

以下是對本題思路和注意點的總結:
1.輸入:因為不管是一個一個數字.nextInt()讀入還是一整行讀入轉為陣列都很麻煩(反正我是想不出該怎麼實現T^T),所以在整行讀入String後再單獨對這個String做處理。

            for(...){
            String ss=s.nextLine();
            Scanner line=new Scanner(ss);
            //因為是從字串裡讀,所以不存在控制檯讀入碰到的結束符問題
            while(line.hasNext()){...}
        }

接受來源是String的直接好處就是沒有控制檯那個無法結束迴圈的問題~
(這裡發現自己知識的小漏洞,竟然不知道Scanner還可以有String這個引數,還是要熟悉API啊!)
另外,nextInt()這類不帶Line的函式,用時要格外小心,讀完自成一行的一個數字要讀下一行資料時一定要加.nextLine()把回車換行搞掉,否則會出錯。

2.演算法:第一反應當然是要把資料放到數組裡排序然後遍歷啦。然而看了那篇帖子發現這個想法好蠢的說QAQ 。
我們的最終目的不是想動資料,而是知道資料出現的次數。所以只要能達到統計每個數出現的次數就大功告成啦~這個思路其實是比較重要的,這個思想跟雜湊有什麼關係我也不太清楚(對一些術語傻傻分不清楚,還求大神指教哇~)


        //存對所有資料的個數統計,數字大小不超過10000,故陣列大小為10001
        int[] ary=new int[10001];
        ...
        int d=line.nextInt();
        ...
        ary[d]++;
        //在最小到最大之間遍歷統計次數的陣列,2次則重複,0次則缺失
            for(int j=min;j<=max;j++){
                if(ary[j]==0)
                    System.out.print(j+" ");
                if(ary[j]==2)
                    System.out.print(j+" ");
            }

歡迎指正,歡迎補充~

相關推薦

藍橋題目Java輸入問題

就我目前有限的藍橋杯做題經驗來看,C/C++和Java的第一個區別就是輸入。Java的輸入相對比較困難,雖然Scanner已經提供了很多便利,能夠接受多種型別的輸入,但是在多行輸入,尤其是包含空格,長度未知的輸入情況下十分痛苦。。。 以今天做到的一個問題

第六屆藍橋題目java)-奇妙的數字

【題目描述】 《奇妙的數字》小明發現了一個奇妙的數字。它的平方和立方正好把0~9的10個數字每個用且只用了一次。你能猜出這個數字是多少嗎? 請填寫該數字,不要填寫任何多餘的內容。 【題目分析】 1)利用Java 的set集合,集合中的數字不可以重複; 2)在while迴圈中

藍橋題目 輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。

問題描述   輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 演算法描述   由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。

藍橋題目 輸入一個正整數n,輸出n!的值。

問題描述   輸入一個正整數n,輸出n!的值。   其中n!=1*2*3*…*n。 演算法描述   n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個

2013 藍橋校內選拔賽 java本科B組(題目+答案)

一、標題:正則表示     正則表示式表示了串的某種規則或規律。恰當地使用正則表示式,可以使得程式碼簡潔、事半功倍。java的很多API都支援正則表示式作為引數。其中的String.split就是這樣。     看下面的程式碼,其意圖為把一個或多個空格或逗號、句號分開的單詞

藍橋節點選擇(java)第一道樹形dp分析

藍橋杯 節點選擇 問題描述     有一棵 n 個節點的樹,樹上每個節點都有一個正整數權值。如果一個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少? 輸入格式 第一行包含一個整數 n 。 接下來的一行包含 n 個正整

藍橋最短路(java過)&&spfa單源最短路演算法

百度百科上spfa的思路為:動態逼近法:設立一個先進先出的佇列用來儲存待優化的結點,優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛

第八屆藍橋國賽Java b組 填字母遊戲

小明經常玩 LOL 遊戲上癮,一次他想挑戰K大師,不料K大師說: “我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩LOL了”。 K大師在紙上畫了一行n個格子,要小明和他交替往其中填入字母。 並且: 1. 輪到某人填的時候,只能在某個空格中填入L或O 2. 誰先讓字母組成了“LOL”的字樣,誰

第七屆藍橋省賽 Java 平方怪圈

平方怪圈 如果把一個正整數的每一位都平方後再求和,得到一個新的正整數。 對新產生的正整數再做同樣的處理。 如此一來,你會發現,不管開始取的是什麼數字, 最終如果不是落入1,就是落入同一個迴圈圈。 請寫出這個迴圈圈中最大的那個數字。 請填寫該最大數字。 注意:你提

第九屆藍橋省賽JAVA語言 C組題解_1哪天返回

JAVA語言 C組題解_題1 哪天返回題目解題思路 題目 小明被不明勢力劫持。後被扔到x星站再無問津。小明得知每天都有飛船飛往地球,但需要108元的船票,而他卻身無分文。 他決定在x星戰打工。好心的老闆答應包食宿,第1天給他1元錢。 並且,以後的每一天都比前一天

ConcurrentHashMap的演進Java多執行緒核心技術

執行緒不安全的HashMap 眾所周知,HashMap是非執行緒安全的。而HashMap的執行緒不安全主要體現在resize時的死迴圈及使用迭代器時的fast-fail上。 注:本章的程式碼均基於JDK 1.7.0_67 HashMap工作原理 HashMap資料結構

兩道藍橋題目

       今天練了兩道藍橋杯的題目,感覺題目也不怎麼難,打算以後每天都做一兩題來練練手。 例題1: 網友年齡某君新認識一網友。 當問及年齡時,他的網友說: “我的年齡是個2位數,我比兒子大27歲,

第九屆藍橋省賽JAVA語言 C組題解_題10 耐摔指數

JAVA語言 C組題解_題10 耐摔指數 題目 解題思路 題目 標題:耐摔指數 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。 各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經

第九屆藍橋省賽JAVA語言 C組題解_題7 縮位求和

JAVA語言 C組題解_題7 縮位求和 題目 解題思路 題目 標題:縮位求和 在電子計算機普及以前,人們經常用一個粗略的方法來驗算四則運算是否正確。 比如:248 * 15 = 3720 把乘數和被乘數分別逐位求和,如

第九屆藍橋省賽JAVA語言 C組題解_題6 列印大X

JAVA語言 C組題解_題6 列印大X 題目 解題思路 題目 標題:列印大X 如下的程式目的是在控制檯列印輸出大X。 可以控制兩個引數:圖形的高度,以及筆寬。 用程式中的測試資料輸出效果: (如果顯示有問題,可以參

第九屆藍橋省賽JAVA語言 C組題解_題5 書號驗證

JAVA語言 C組題解_題5 書號驗證 題目 解題思路 題目 標題:書號驗證 2004年起,國際ISBN中心出版了《13位國際標準書號指南》。 原有10位書號前加978作為商品分類標識;校驗規則也改變。 校驗位的加權演

第九屆藍橋省賽JAVA語言 C組題解_題4 第幾個幸運數

JAVA語言 C組題解_題4 第幾個幸運數 題目 解題思路 題目 標題:第幾個幸運數 到x星球旅行的遊客都被髮給一個整數,作為遊客編號。 x星的國王有個怪癖,他只喜歡數字3,5和7。 國王規定,遊客的編號如果只含有因子

第九屆藍橋省賽JAVA語言 C組題解_題9 小朋友崇拜圈)

JAVA語言 C組題解_題9 小朋友崇拜圈 題目 解題思路 題目 班裡N個小朋友,每個人都有自己最崇拜的一個小朋友(也可以是自己)。 在一個遊戲中,需要小朋友坐一個圈, 每個小朋友都有自己最崇拜的小朋友在他的右手邊。 求滿

第九屆藍橋省賽JAVA語言 C組題解_題8 等腰三角形

JAVA語言 C組題解_題8 等腰三角形 題目 解題思路 題目 本題目要求你在控制檯輸出一個由數字組成的等腰三角形。 具體的步驟是: 先用1,2,3,…的自然數拼一個足夠長的串 用這個串填充三角形的三條邊

第九屆藍橋省賽JAVA語言 C組題解_題3 字母陣列

JAVA語言 C組題解_題3 字母陣列 題目 解題思路 題目 仔細尋找,會發現:在下面的8x8的方陣中,隱藏著字母序列:“LANQIAO”。 SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLAN