在leetcode 60Permutation Sequence
最開始使用DFS庞溜,超時(shí),后來找規(guī)律:
1)第k個排列的第一個元素在0-n中的位置為(k-1)/(n-1)碑定!
2)在剩下的元素中繼續(xù)找第一個流码;
3)依此類推;
如果僅僅使用String肯定會超時(shí)延刘,因?yàn)镾tring每次發(fā)生增刪改動的時(shí)候都對新生成一個對象漫试。
改用StringBuffer之后,發(fā)現(xiàn)如果在初始化的時(shí)候碘赖,使用 :
StringBuffer str = new StringBuffer(); //
仍會超時(shí)驾荣!
后來改用
StringBuffer str = new StringBuffer(""); // str指向一個長度為零的字符串
才AC
不能理解為何
StringBuffer, StringBuilder, String三者的區(qū)別:
- String 最慢,不過String線程安全普泡,而且如果不需要修改的話播掷,用* * String可以節(jié)省內(nèi)存空間,提高效率撼班。
- String有compareto的方法歧匈,而StringBuffer沒有這個方法,如果要比較兩個字符串大小的話砰嘁,用String
- StringBuffer 快件炉,線程安全
- StringBuffer和String屬于不同的類型,也不能直接進(jìn)行強(qiáng)制類型轉(zhuǎn)換
- StringBuilder矮湘,比StringBuilfer還快斟冕,線程不安全。
StringBuffer
- 初始化 StringBuffer sb = new StringBuffer(""); // 使用String初始化
// 默認(rèn)capacity是16缅阳,超過16翻倍擴(kuò)容宫静。 - append
- deleteCharAt(int index)
- setCharAt(int index, char c)
- insert(int index, char c)
- reverse()
- trimToSize() 把初始化默認(rèn)的16裁剪成和size一樣大的空間
- 轉(zhuǎn)成String: toString()
- 比較, 和String繼承的父類不同,StringBuffer的比較必須轉(zhuǎn)成String
"" 和 null
空字符串“”
1孤里、類型:“”是一個空字符串(String)伏伯,長度為0,占內(nèi)存捌袜,在內(nèi)存中分配一個空間说搅,可以使用Object對象中的方法。(例如:“”.toString()等)
2虏等、內(nèi)存分配:表示聲明一個字符串類型的引用弄唧,其值為“”空字符串,這個引用指向str1的內(nèi)存空間霍衫。
null
1候引、類型:null是空引用,表示一個對象的值敦跌,沒有分配內(nèi)存澄干,調(diào)用null的字符串的方法會拋出空指針異常。
2柠傍、內(nèi)存分配:表示聲明一個字符串對象的引用麸俘,但指向null,也就是說沒有指向任何內(nèi)存空間惧笛。
例: String str1 = ""; //str1對應(yīng)一個空串从媚,聲明對象的引用String str2 = null; //str2引用為空
String str3 = new String(); //str3將指向具體的String實(shí)例,默認(rèn)值為“”
注意:str1和str3被實(shí)例化患整,而str2沒有實(shí)例化拜效,但str1和str3所指的地址不同,但值一樣各谚,都為空拂檩。
null不是對象(空引用),“”是對象嘲碧,
故比較的時(shí)候應(yīng)該是if(str1.equals(""))和if(str2 == null),
也即對象用equals()比較父阻,null用等號比較愈涩。
正確的寫法是先判斷是不是對象,如果是加矛,再判斷是不是空字符串履婉。**
補(bǔ)充說明:
1、Java中類的對象都是用句柄來訪問的斟览, 類似于C中的指針毁腿。
2、Java中有兩個判斷相等的方法:“==”和equals()方法,前者是根據(jù)地址來比較已烤,只有地址和值都相等鸠窗,這兩個變量(引用類型)才相等;后者比較的是變量的值胯究,只要值相等稍计,兩者就相等。
3裕循、在Java中變量和引用變量是存在棧中(stack)臣嚣,而對象(new出來的)都是存放在堆中(heap)。