1. 程式人生 > >貌似沒人用java做ACM題 用C的居多 談談java

貌似沒人用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();
   }          
 }
總的來講,做ACM題,最重要的是要對語言的語法特性及細節問題多測試,試了才知道效果。要想在比賽中取得好成績 還是得多做題! 再次膜拜唯斌大神。。。