該題目就有點類似於乙個進製為26的乙個進製轉換的題目。
public
inttitletonumber
(string s)
return ans;
}
該題目暴力法可以解決,但是題目要求我們使用logn查詢,那說明一定是存在一些情況我們可以進行一些省略。
就比如說我們需要找到階乘計算後零的個數,我們可以通過換個思考方式。
什麼樣的情況會出現零?
那就是類似於 2 * 5 / 4 * 10 這樣的情況,我們也可以發現最基礎的情況就是 2 * 5,那麼我們可以尋找兩個數中一共有多少對 2 * 5,換句話說也就是找兩個數的因子了。
2的因子很好找,因為階乘是 1 * 2 * …n,所以每乙個偶數就可以作為因子,而5呢也就是10個裡面有兩個,所以我們可以發現其實5的個數源遠少於2的個數,所以我們其實只需要統計在這個階乘計算中,一共可以分離出多少個5就行了。
知道上面那個思想直接寫**。
//階乘有多少個 0
public
inttrailingzeroes
(int n)
}return ans;
}
題目要求我們的空間複雜度為o(h),h為樹的高度。
這個空間複雜度的限制,讓我們覺得可能需要使用乙個棧,並且棧內最多存放的就是一條數到葉子結點的路徑。
這個思路讓我們想到了之前的二叉樹的中序遍歷的迭代版本。使用的是乙個模擬的思想。
我們先將所有左子樹入棧(二叉搜尋樹,左子樹一定小於父節點),出棧的時候我們通過判斷結點是否擁有右子樹,如果存在右子樹,則下乙個最小值一定存在於右子樹中(二叉搜尋樹性質,右子樹的結點一定大於父節點,但是一定小於父節點的父節點),所以我們則將右子樹部分按照之前的方法入棧(即入棧左子樹部分)。
//二叉搜尋樹迭代器
class
bstiterator
}//返回下一位的最小的數
public
intnext()
}return pop.val;
}public
boolean
hasnext()
}
該題目就是乙個比較兩個數誰應該放在前面的題目。
例如 [5,34],自然是534>345,所以我們可以發現排序方式是字典序排序,但是也有特殊情況。
例如[10,2],雖然是210>102,但是2的字典序 > 10的字典序,所以說不能用簡單的字典序排序。
我們這裡使用的是將兩中組合情況列舉出來進行排序,使用比較器compator。
需要注意的是,如果第一位為0,那麼說明整個陣列都為0,因為任意非0的數和0組合0一定在後面的,比如[0,1],一定是10>01。
public string largestnumber
(int
nums)
collections.
sort
(list,
newcomparator
()})
; stringbuilder stringbuilder =
newstringbuilder()
;//如果此時第一位還是0,說明全部都是0
//因為任意非0數和0組合,0一定在最後面。
if(list.
get(0)
.equals
("0"))
for(string s : list)
return stringbuilder.
tostring()
;}
題目要求是乙個長度為10的dn**段,並且出現次數 > 1。
所以通過這句話我們可以直接發現這是乙個滑動視窗的問題,並且明確告訴了視窗長度為10。
則我們通過set集合,判斷是否出現重複即可,重複則放入我們需要的ans中,需要注意的是結果集最好使用set,因為可能出現多次dn**段,但我們只需要新增一次即可。
//重複的dna
public list
findrepeateddnasequences
(string s)
else
}return
newarraylist
<
>
(ans)
;}
該題目我們可以選擇暴力法解決,就是每次旋轉一次都將最後一位儲存,並且將第一位騰空,在賦值過去,時間複雜度 o(n * k)
有一種比較巧的辦法就是通過三次陣列反轉的方式完成的。
[1,2,3,4,5,6,7] k = 3
1.反轉整個陣列。[7,6,5,4,3,2,1]
2.反轉前k-1個陣列。[5,6,74,3,2,1]
3.反轉剩餘陣列。[5,6,7,1,2,3,4]
但是需要注意的是:
1、如果陣列長度為 1 ,那麼反轉就無意義。
2、如果反轉次數 > 陣列長度。說明有冗餘次數,沒旋轉乙個陣列長度後陣列和原陣列無差別(乙個週期),所以為了避免我們選擇將k與陣列長度取餘。
//旋轉陣列,順時針,k為旋轉次數
public
void
rotate
(int
nums,
int k)
//反轉陣列長度為乙個週期, 多個週期也無意義
k %= nums.length;
//整體反轉
reverse
(nums,
0,nums.length-1)
;//反轉前k個
reverse
(nums,
0,k-1)
;//反轉剩餘部分
reverse
(nums,k,nums.length-1)
;}public
void
reverse
(int
nums,
int left,
int right)
}
有點類似於陣列的反轉,只不過這裡是二進位制的反轉。
這裡使用的是位操作,通過每次獲取n的最低位的情況(是 0/1,通過 n & 1獲得),加上對應的位數結果,達到反轉的效果,需要記得將結果左移,將n右移。
//顛倒二進位制,類似於二進位制的反轉
public
intreversebits
(int n)
return ans;
}
是位運算章節的題目,我們需要對二進位制中的 1 進行計數,可以通過使用乙個mask用於和二進位制中最右邊的未檢測的位進行與運算(如果二進位制中為0則與的結果為0,否則為1即將計數器++),之後再講mask左移一位,使其能和下一位進行與運算判斷。
//二進位制中 1 的個數
public
inthammingweight
(int n)
mask <<=1;
}return ans;
}
開始刷題LeetCode
今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...
leetcode刷題歷程
難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...
LeetCode刷題總結
123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...