Posts

Showing posts with the label JAVA

關於 java Integer 的 minimum 跟 maximum 的表示方式

要顯示 java  Integer type 的 minimum and maximum 的方式 Integer.MAX_VALUE (2147483647)  及 Integer.MIN_VALUE (-2147483648) 若不用內建涵式, 直覺會用: 1<<31 -1<<31 可結果卻都是 -2147483648 這是由於 1<<31 已發生 overflowed, 在java中下一個位數則是 -1<<31 要得到正確的 MAX_VALUE 可用 (1<<31)-1 其實這是我在作 leetcode (Reverse Integer) 的考題遇到的問題. 該題目回傳值跟輸入值是 int, 但側資的輸出有可能是 overflowed 的情形! 真是太狡猾了。 http://goo.gl/7el8Kf

[leetcode] #55 Jump Game & #120 Triangle

Title - #55 Jump Game Level - Medium Description - 題目主要是給一個字串 S = [1,2,3],每個數字代表可行的距離,求能否到達最後一個字原。 (補充) Greedy 很明顯,也沒有什麼難度... 大概就是給個超級長的字串,但是若得到足夠的數字就可以直接結束程式,屬於O(n)。 作法 iteration (略) Title - #120 Triangle Level - Medium Description - 題目主要是給一個nested List = [[1],[2,3],[4,5,6]],呈現triangle狀,每個數字代表cost。題目要求traverse從第一個List走到最後一個List,只能走adjacent elements,相是   1  2 3 4 5 6 只能走1-2-5 而非 1-2-6。 (補充) DP問題,主要是記住上次的COST,而且每次的選擇C(i)僅會參照先前min(prevC(i), prevC(i-1))加上C(i)得到total cost at i-th node。不過題目希望僅用一個O(N)的空間複雜度完成,所以多了兩個變數使用,加上須小心處理每個List的1st & last node即可。 作法 iteration 1: for (int i=0;i<S.size();i++) { 2: row <- S[i]; 3: for (int j=0;j<row.size();j++) { 4: if (j=0) c0=0; 5: else c0=c1; 6: if (j<i) c1 = last[j]; 7: if (j=0) min = c1; 8: else min = minimum(c0,c1); 9: last[j] = min + row[j]; 10: } 11: } Java 問題: 1. 在 java 除local variable似乎不需要初始化,所有物件的宣告的元素初始值為0。 From s...

[leetcode] #34 Search for a range

Title - #34 Search for a range Level - Medium Description - 題目主要是給一個字串 S = [1,2,3],一個目標數字,列出該數字所在的位置。 (補充) 解法很簡單,雖然要求O(logN)但其實用二分法就可以解決,然後記得一開始找數字時同時更新 left_search跟right_search的boundary。不過我在邊界值處理上花了不少時間... Orz 作法 iteration 1: //empty list 2: if (S.length = 0) 3: return new int[]{-1,-1}; 4: lbp = bp = 0, rep = ep = S.length; // bp = begin point, ep=end point 5: min = 0; 6: while (1){ 7: mid = (bp+ep)/2; 8: if (bp==mid) break; 9: if (S[mid] == target) 10: break; 11: else if (S[mid] < target) 12: lbp = bp = mid; 13: else 14: rep = ep = mid; 15: } 16: // target number is not existed. 17: if (S[mid] != target) 18: return new int[]{-1,-1}; 19: // update search boundary 20: rbp = lep = mid; 21: // left search 22: while (1){ 23: tmid = (lbp+lep)/2; 24: if (lbp==tmid) break; 25: if (S[tmid] < target) 26: lbp = tmid; 27: else 28: lep = tmid; 29...

[leetcode] #39 Combination Sum

Title - #39 Combination Sum Level - Medium Description - 題目主要是給一個字串 S = [1,2,3],一個數字target,要列出所有字串相加等於target的子集合,字串可重複出現,集合為嚴格遞增。 (補充) 這裡又發生兩次WA。一次是若找不到時回傳[]而非[[]];原先算法找無 [1,2], Target =4中 [2,2]的組合,原因是在backtracking時,s i < max(subset) 時我直接break 導致 '=’ 的條件無法觸發。但是為啥 [1,1,2] OK [2,2]卻不行?不是不行而是當 (si=1)<(max=2)時就直接中斷了。 另外,若S裡頭發生重複的字串的情況下可能需要移除,只是拿到RA就不打算處理了。 這題跟昨天subset 的做法很像。 作法 (iteration) 1: Heapify(S, i, len) { 2: left = i*2, right = left+1; 3: max = i; 4: if (leftlen and S[max] < S[left]) max=left; 5: if (rightlen and S[max] < S[right]) max=right; 6: if (i<max) { 7: Swap(A, i, max); 8: Heapify(A, max, len); 9: } 10: } 11: HeapSort(S) { 12: for (int i=S.length/2;i>=0; i--) { 13: Heapify(S, i, S.length); 14: } 15: for (int i=S.length;i>=1;i--) { 16: Swap(S, 0, i-1); 17: Heapify(S, 0, i-1); 18: } 19: } 20: //step-1, O(n) 21: isAscending = True; 22: for (int i =1...

[leetnode] #78 SubSets

Title - #78 SubSets Level - Medium Description - 題目主要是給一個字串 S = [1,2,3],列出所有非遞減的子集合。 (補充) 這裡犯了兩個錯誤:它指的 non-decreasing 是嚴格遞增的意思。例如 [1,3,2,4] 不是嚴格遞增。 第二,若要列出僅"非遞減"的所有數列不太可能,因為所有組合是2 N 個。 作法(一) 遞迴 1: Play(nil, S, ret); 2: Play(set, subset, ret) { 3: if (subset == nil) { 4: ret.add([]); 5: return; 6: } 7: for ( s in subset ){ 8: if (set==nil || s>max(set)) { 9: ret.add({set+s}); 10: Play({set + s}, {subset-s}, ret); 11: } 12: } 作法(二) iteration 1: subset<-nil; 2: for (s in S) { 3: s.add({s}); 4: } 5: while (1) { 6: if (subset == nil) { 7: ret.add([]); 8: break; 9: } 10: ss <- subset.pop(0); 11: ret.add(ss); 12: for (s in {S-ss}) { 13: if (s > max(ss)) 14: subset.add({ss, s}); 15: } 16: } time complexity: O(n 2 ) 另外,由於我是使用 java, 遇到了兩個問題 網,路上暫時沒有較generic的作法。 (1) int[] 轉 List 的問題。 tmp = new A...

[JAVA] Maven 馬份

Maven是一個基於POM的JAVA project automation/management tool. 透過POM可以針對JAVA Project進行build、log跟site(就是建立說明文件), 相當方便的一個玩意. (1)建立新的project     "mvn archetype:generate"     => 會以prompt方式要求輸入              archetype(採用哪個project template, 預設99),              version,               groupId(這個project是由哪個組織或公司建立, ex. arc.com.gg),              artifactId(即Project name),              package(就是Java package).      * 下command方式可以用 "mvn archetype:create -DgroupId=apache.org.gg -DartifactId=MyProject -DpackageName=apache.org.package" (2) mvn 定義了build project的整個lifecycle, 每個stage of lifecycle都稱為一個 build phase (ex. validate, compile, package, instal...

[JAVA] maven, bnd note

1. maven 作出 executable jar. 參考 CLASSPATH設定 2. ONE-JAR 的文章參考: 網址1

[JAVA] SecurityManager

SecurityManager   # import java.lang.SecurityManager; SecurityManger允許app實做各自的security policy, 用來做access control check. 當然JVM本身也有實做自己的SecurityManger, 在執行前調用checkPermission()確認是否有執行請求的操作權限(ex. File, Socket, Net, Runtime, Property, AWT, Reflect跟Serializable), 不過一般都不會invoke它. invoke JVM SM的方式有兩種:    (1)在CLI下加上  "-Djava.security.manager", 安裝built-in default SM.            ex. java -Djava.security.manager Myapp    (2)在app中加入setSecurityManager() 來安裝SM (註)可以使用 "-Djava.security.policy"來指定不同的policy file路徑, 要注意的是 '='表示除了security porperties 指定的policies外, 也會load所指定的policy file; '=='則表示只load 所指定的policy file, 其他的都會被忽略. 在實作方面, SecurityManager事實上只是個control point, 真正的實作則是在AccessController裡頭: public class SecurityManager{     ...     public SecurityManager{         SecurityManager sm = System.getSecurityManager();       ...

[JAVA] Reflect 練習

查詢JVM的class支援哪些Methods的方法 import java.lang.reflect.Method; public class ClassCase {  public void testClass(String name){   try{    Method[] ms = Class.forName(name).getDeclaredMethods();        for(Method m:ms){     System.out.println("Method:... " +m.getName());    }   }   catch (Exception ex){    ex.printStackTrace();   }  }    public static void main(String[] args){   //(Class.forName("ClassCase").newInstance()).testClass();   if (args.length == 1){    new ClassCase().testClass(args[0]);   }else   {    System.out.println("Usage: JVM -jar ClassCase.jar CLASS_NAME");    System.exit(0);   }  } }

[JAVA] ECJ

Eclipse ecj (主要針對3.2 3.3 兩個版本) - eclipse compiler for java 這是一個Eclipse內置的java compiler, 屬於JDT(Java Development tools) Core pure Batch compiler, 可以單獨下載使用. How to use: Version Check gg@debian$  export JAVAC= /path/to/javavm -jar /path/to/ecj.jar gg@debian$ $JAVAC -version Eclipse Java Compiler 0.671, 3.2.0 release, Copyright IBM Corp 2000, 2006. All rights reserved. Compile gg@debian$ $JAVAC HelloWorld.java gg@debian$ $JAVA HelloWorld Hello, World 主要是在編GnuClasspath跟Jamvm時一直遇到的問題, 今天算是特底解決了, GCJ對于兩者真是不親和阿... lol