Leetcode171 190刷題筆記(非困難題)

2021-10-12 10:10:26 字數 3550 閱讀 9400

該題目就有點類似於乙個進製為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...