第一次做topcoder,有一些不同的感受。
以前讀書的時候沒怎麼聽說,現在工作一段時間後,發現知識結構不是很完整,特別想補充下演算法部分的知識。
所以有時間就做一下Topcoder,一個是換一個寫代碼的環境,畢竟contest的時間要求緊迫些。 另一個方面對自己不熟悉的演算法,可以
激勵我們去讀書和尋找。
於是這個周末線上做網易有道難題的第二輪的挑戰賽(第一輪可以得到一個T-SHirt,還不錯,穿著挺舒服D:),三個題目分值分別為350,500,1000分,第一道題理解並寫出來,但被別人cha掉;
第二題理解題意,演算法模模糊糊,不知道怎麼寫。最後時間來不及寫完。 第三題沒來得及看。
現在看來,時間把握很重要,要求儘快地理解問題並提出解決方案。
第一題被cha的機率很高,說明大家對演算法都存在同樣的問題,看著差不多,其實有很多邏輯的混亂。至少我的第一題後來發現的確存在思路上的問題。 教訓:寫代碼之前演算法一定要想清楚,邏輯完備很重要。
看了AcRush的演算法,不得不佩服。另一個感受就是:當資料或者資料量發生質變時,特別注意一下兩個問題:
1、暴力還能否解決問題
2、很多時候都有更好的演算法來解決。
下面是350分的題目和根據AcRush的代碼改寫的Java版。
網易有道難題TopCoder
線上挑戰賽 350
分題
Problem Statement
如果一個數字十進位表達時,不存在連續兩位相同,則稱之為“不重複數”。例如,105
、1234
和12121
都是“不重複數”,而11
、100
和1225
不是。
給定一個long
類型數字A
,返回大於A
的最小“不重複數”。
Definition
Class:UnrepeatingNumbers
Method:getNext
Parameters: long
Returns:long
Method signature: long getNext(long A)
(be sure your method is public)
Constraints-
A
取值範圍是[0, 10^17]
,注意是閉區間。
Examples
0)
54
Returns: 56
大於54
的最小數字是55
,但55
不是“不重複數”。下一個數字是56
,它滿足條件。
1)
10
Returns: 12
2)
9
Returns: 10
3)
98
Returns: 101
99
和100
都不是“不重複數”,但101
是。
4)
21099
Returns: 21201
This problem statement is the exclusive and proprietary
property of TopCoder, Inc. Any unauthorized use or reproduction of this
information without the prior written consent of TopCoder, Inc. is strictly
prohibited. (c)2003, TopCoder, Inc. All rights reserved.
Java代碼:
public class UnrepeatingNumbers {</p><p>public static void main(String[] args) {</p><p>UnrepeatingNumbers un=new UnrepeatingNumbers();<br />Scanner cin=new Scanner(System.in);<br />while(true)<br />{<br /> System.out.println(un.getNext(cin.nextLong()));<br />}<br />}<br />public long checkAndIterate (long n)<br />{<br />StringBuffer s=new StringBuffer(String.valueOf(n));<br />for(int i=0; i+1<s.length();i++)<br />{<br />if(s.charAt(i)==s.charAt(i+1))<br />{<br /> long p10=1;<br /> for(int j=i+2; j<s.length(); j++)<br /> {<br /> s.setCharAt(j,'0');<br /> p10*=10;<br /> }<br /> n=Long.parseLong(s.toString())+p10;<br /> return n;<br />}<br />}<br /> return -1;<br />}<br />long getNext(long A)<br />{<br />A++;<br />long temp=1;<br />while(temp>0)<br />{<br />temp=checkAndIterate(A);<br />if(temp>0) A=temp;<br />}<br />return A;<br />}<br />}
希望對大家有協助。演算法的本質在於效率。