貌似沒人用java做ACM題 用C的居多 談談java
對於任何一個程式設計的人來講,選擇一門適合自己的語言都可以用一句話來形容----工欲善其事必先利其器,選擇了一門適當的語言還得要深刻理解並靈活運用它的特點
我班同學參加比賽一般都用的是C語言 以唯斌大神為首. C語言大家都知道,它更接近於機器語言,程式執行起來更快一些,而Java的程式設計與實現更簡單,對於很多問題都有現成的資料結構和演算法。
由於我自己對JAVA稍微熟悉一些,正在補java 就談談ACM中JAVA的使用吧。對於其它的語言在這裡就不多說了。
正如前面所說的,許多問題JAVA中都已經有了現成的資料結構和演算法。首先看看大數運算方面的問題,JAVA中有兩個類,BigInteger 和BigDecimal,兩個用字串實現的大整數和大十進位制類,它們可以處理任意長度和精度的整數與十進位制數,其中的有許多方法高效實現了大整數與大十進位制數的各種運算,對於BigDecimal 還可以設定精度。對於一些大數運算問題就可以直接使用,非常實用。
接下來就是要靈活運用的就是Java自身的資料結構類了,包括collection接口裡的實現類和子類,另外還有Map對映抽象類及子類等。在ACM中TreeSet和TreeMap是兩個最常用的資料結構類,TreeSet 和TreeMap都能夠實現其內容自然排序,Set不允許其中的元素重複,Map能實現鍵到值的對映。這兩個類配合泛型的使用,使用起來將十分方便和有用。 Arrays是JAVA中的陣列排序類,可以實現到Object類陣列的快速排序,並且還可以進行二分查詢,當然在使用二分查詢的時候肯定是要先排序的啦。
JAVA中實現資料的輸入也非常方便,一般有兩種方式,檔案輸入和標準控制檯輸入;輸出同樣有兩種,檔案輸出和標準控制檯輸出。我們參加的這次比賽就是檔案輸入和標準控制檯輸出。對於Java5 和JDK1.4的輸入也有少許差別,Java5有一個簡單的Scanner類,對於少量的資料輸入建議使用Scanner類,而對於大量資料輸入的話還是建議採用BufferedReader類,對於JDK1.4就只有全部使用BufferedReader了。輸出的話,一定要把File ,FilerWrite,PrintWrite三個類的細節搞清楚。這裡也不多講,列出這幾個輸放輸出的具體使用例項吧:
輸入:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
BufferedReader input = new BufferedReader(new FileReader(“1.txt”));
Scanner input = new Scanner(System.in) ;
輸出:
System.out.println();
System.out.printf();
System.out.print()
PrintWrite output = new PrintWrite(new FileWrite(“1.txt”));
在處理輸入與輸出的時候也常常很講究技巧性,尤其是在ACM這樣很講究程式設計技巧性的程式設計比賽中顯得更為突出。
ACM中還會經常遇到字串的處理方面的問題:StringBuffer 和StringBuilder這兩個類有很多用用的方法可供使用,然後大家還可以注意一下String 類和StringBuffer類的區別和特點,對於要進行大量變化的字串處理建議使用StringBuffer類,而不是經常變化的字串建議使用String類,它們特點取決於Java中對String 和StringBuffer的記憶體分配不相同的原因了。大家可以編寫一些測試程式來測試一下它們的特點和區別。另外字串處理中經常可能要用到的是另外一個知識了,那就是正則表示式了,如果能夠很好的撐握正則表示式的用法,那麼字串處理可以說你已經完成一半的任務了。如果正則表示式沒有完全撐握,StringBuilder就是它的一個替代品。另外StringTokenizer也是一個很有用的工具,在這裡就不多談了,大家可以編幾個測試類多試試。
格式化處理,一方面Java5之後就已經有了一個printf()方法,它跟C語言裡的格式化輸出有相同的功能和用法。另外java.text.Format類及其子類有更豐富的方法與功能,大家可以檢視一下它的API文件。
下面是我們寫的一些測試程式,大家可以參考一下
//StringBuffer方法測試 import java.lang.StringBuffer; public class StringBufferTest { public static void main(String[] args) { StringBuffer str = new StringBuffer("abc"); StringBuffer str2 = str; str = str2.append(str.reverse()); System.out.println(str); //cbacba str.insert(1, "aaaaaa"); System.out.println(str); //caaaaaabacba System.out.println(str.charAt(1)); //a System.out.println(str.lastIndexOf("ba"));//10 } } //BufferedReader方法測試 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class BufferedReaderTest { public static void main(String[] args) { BufferedReader buff = new BufferedReader(new InputStreamReader(System.in)); String test; StringBuffer stringBuff = new StringBuffer(); try { while(!(test = buff.readLine()).equals("")){ stringBuff.append(test); } } catch (IOException e) { e.printStackTrace(); } System.out.println(stringBuff); } } //Map TreeMap方法測試 import java.util.*; public class TreeMapTest { public static void main(String[] args){ TreeMap< String, Integer> map = new TreeMap< String, Integer>(); map.put("1L", 20); map.put("2LR", 30); map.put("1R",100); map.put("3LLL", 20); map.put("3LLR",20); map.put("2LL", 22); map.put("2LL", 20); System.out.println("Key的長度:" +map.size()); System.out.println("Key的長度:" +map.keySet().size()); System.out.println("map.get():"+map.get("1L")); Map newMap = map.tailMap("2LL"); System.out.println(newMap.toString()); System.out.println(map.toString()); System.out.println(map.subMap("1L", "2RR").toString()); //{1L=20, 1R=100, 2LL=20, 2LR=30} while(!map.isEmpty()) System.out.println(map.remove(map.firstKey())); } } //printf()測試 public class Test4 { public static void main(String[] args){ int[][] a={{1,2},{2,2,2,3},{3}}; Object[] arg = new Object[]{"Hello","world"}; Object[] c = new Object[]{3,2,1}; int[] d={1,1,1}; // System.out.printf("%d %d %d\n",(Object)d); System.out.printf("{%s %s %s}\n",1,2,3); System.out.printf("%d %d %d\n",c); System.out.printf("%s\n", "Hello","world"); System.out.printf("%s %s\n", arg); System.out.printf("%s\n",new Object[]{arg}); System.out.printf("%s\n",(Object)arg); assert false:1; } } //檔案讀寫,在一個"CRC校驗"題中用到的 import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Number6 { public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader(new FileReader("in2_6.txt")); PrintWriter output = new PrintWriter(new FileWriter("out2_6.txt",true)); String s = input.readLine(),rs; while(!(s==null || s.equals("#"))){ int t = 0,crc = 0; for(int i=0;i< s.length();i++){ t = (t*256+s.charAt(i))%34943; } crc = (34943-(t << 16)%34943)%34943; rs = Integer.toHexString(crc).toUpperCase(); while(rs.length()< 4) rs = 0+rs; output.println(rs); s = input.readLine(); } output.close(); } }