LeetCode刷題總結1
1.數字題
1.1 第一類
1.1.1 整數反轉
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
代碼:
func reverse(x int)int{
var result int64
for x!=0{
result=result*10+int64(x%10)
x=x/10
}
if result>math.MaxInt32||result<math.MinInt32{
return 0
}
return int(result)
}
1.1.2 回文數
判斷一個整數是否是回文數?;匚臄凳侵刚颍◤淖笙蛴遥┖偷剐颍◤挠蚁蜃螅┳x都是一樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個回文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個回文數。
代碼:
func isPalindrome(x int)bool{
if x<0||(x%10==0&&x!=0){
return false
}
var result int
for x>result{
result=result*10+x%10
x=x/10
}
result (x==result)||(x==result/10)
}
1.1.3 x的平方根
實現 int sqrt(int x) 函數。
計算并返回 x 的平方根,其中 x 是非負整數。
由于返回類型是整數,結果只保留整數的部分,小數部分將被舍去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,
由于返回類型是整數,小數部分將被舍去。
代碼:
func sqrt(x int)int{
if x==0{
return 0
}
n:=x
for n*n>x{
n=(n+x/n)/2
}
return n
}
1.1.4 Execl表列名稱
給定一個正整數,返回它在 Excel 表中相對應的列名稱。
例如,
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB
...
示例 1:
輸入: 1
輸出: "A"
示例 2:
輸入: 28
輸出: "AB"
示例 3:
輸入: 701
輸出: "ZY"
代碼:
func convertToTitle(n int)string{
hash:=[26]string{}
for i:=0;i<26;i++{
hash[i]=string('A'+i)
}
ans:=""
for n!=0{
t:=(n-1)%26
ans=hash[t]+ans
n=(n-1)/26
}
return ans
}
1.1.5 Excel表列序號
給定一個Excel表格中的列名稱,返回其相應的列序號。
例如,
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例 1:
輸入: "A"
輸出: 1
示例 2:
輸入: "AB"
輸出: 28
示例 3:
輸入: "ZY"
輸出: 701
代碼:
func titleToNumber(s string)int{
ans:=0
for _,x:=range s{
t:=int(x-'A')+1
ans=ans*26+t
}
return ans
}
1.1.6 各位相加
給定一個非負整數 num,反復將各個位上的數字相加,直到結果為一位數。
示例:
輸入: 38
輸出: 2
解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位數,所以返回 2。
代碼:
func addDigits(num int)int{
for num>9{
sum:=0
for num!=0{
sum+=num%10
num/=10
}
num=sum
}
return num
}
1.1.7 丑數
編寫一個程序判斷給定的數是否為丑數。
丑數就是只包含質因數 2, 3, 5 的正整數。
示例 1:
輸入: 6
輸出: true
解釋: 6 = 2 × 3
示例 2:
輸入: 8
輸出: true
解釋: 8 = 2 × 2 × 2
示例 3:
輸入: 14
輸出: false
解釋: 14 不是丑數,因為它包含了另外一個質因數 7。
代碼:
func isUgly(num int)bool{
if num==0{
return false
}
for num!=1{
if num%2==0{
num/=2
}else if num%3==0{
num/=3
}else if num%5==0{
num/=5
}else{
return false
}
}
return true
}
1.1.8 有效的完全平方數
給定一個正整數 num,編寫一個函數,如果 num 是一個完全平方數,則返回 True,否則返回 False。
說明:不要使用任何內置的庫函數,如 sqrt。
示例 1:
輸入:16
輸出:True
示例 2:
輸入:14
輸出:False
代碼:
func isPerfectSquare(num int)bool{
r:=num
for r*r>num{
r=(r+num/r)/2
}
if r*r==num{
return true
}
return false
}
1.2第二類
1.2.1 兩數之和
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
代碼:
func towSum(nums []int,target int)[]int{
if len(nums)<2{
return nil
}
for i:=0;i<len(nums)-1;i++{
for j:=i+1;j<len(nums);j++{
if nums[i]+nums[j]==target{
return []int{i,j}
}
}
}
return nil
}
1.2.2 最大子序和
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6。
代碼:
func maxSubArray(nums []int)int{
sum:=nums[0]
ans:=sum
for i:=1;i<len(nums);i++{
if sum<0{
sum=nums[i]
}else{
sum+=nums[i]
}
ans=max(ans,sum)
}
return ans
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
1.2.3 加一
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素只存儲一個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
示例 2:
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。
代碼:
func PlusOne(nums []int)[]int{
for i:=len(nums)-1;i>=0;i--{
if nums[i]!=9{
nums[i]++
break
}else{
nums[i]=0
}
}
if nums[0]==0{
newans:=make([]int,len(nums)+1)
newans[0]=1
return newans
}
return nums
}
1.2.4 x的平方根
實現 int sqrt(int x) 函數。
計算并返回 x 的平方根,其中 x 是非負整數。
由于返回類型是整數,結果只保留整數的部分,小數部分將被舍去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,
由于返回類型是整數,小數部分將被舍去。
代碼:
func sqrt(x int)int{
if x==0{
return 0
}
n:=x
for n*n>x{
n=(n+x/n)/2
}
return n
}
1.2.5 爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
- 1 階 + 1 階
- 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
- 1 階 + 1 階 + 1 階
- 1 階 + 2 階
- 2 階 + 1 階
代碼:
func climbStairs(n int)int{
switch n{
case 1:
return 1
case 2:
return 2
default:
dp1,dp2:=1,2
for i:=2;i<n;i++{
dp1,dp2=dp2,dp1+dp2
}
}
return dp2
}
1.2.6 楊輝三角
給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。
在楊輝三角中,每個數是它左上方和右上方的數的和。
示例:
輸入: 5
輸出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
代碼:
func generget(numRows int)[][]int{
if numRows==0{
return nil
}
a:=make([][]int,0)
a=append(a,[]int{1})
for i:=1;i<numRows;i++{
temp:=[]int{1}
for j:=1;j<i-1;j++{
temp=append(temp,a[i-1][j-1]+a[i-1][j])
}
temp=append(temp,1)
a=append(a,temp)
}
return a
}
1.2.7 楊輝三角2
給定一個非負索引 k,其中 k ≤ 33,返回楊輝三角的第 k 行。
在楊輝三角中,每個數是它左上方和右上方的數的和。
示例:
輸入: 3
輸出: [1,3,3,1]
代碼:
func getRow(rowIndex int)[]int{
a:=[]int{1}
for i:=1;i<=rowIndex;i++{
for j:=0;j<i-1;j++{
a[j]=a[j]+a[j+1]
}
temp:=[]int{1}
a=append(temp,a...)
}
return a
}
1.2.8 買賣股票的最佳時機
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。
注意你不能在買入股票前賣出股票。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格。
示例 2:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。
代碼:
func maxProfit(prices []int)int{
Max:=0
for i:=0;i<len(prices)-1;i++{
for j:=i+1;j<len(prices);j++{
delta:=prices[j]-prices[i]
if delta>Max{
Max=delta
}
}
}
return Max
}
1.2.9 買賣股票的最佳時機2
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。
示例 2:
輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接連購買股票,之后再將它們賣出。
因為這樣屬于同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。
示例 3:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。
代碼:
func maxProfit(prices []int)int{
var num=0
for i:=0;i<len(prices);i++{
if prices[i]<prices[i+1]{
num+=prices[i+1]-prices[i]
}
}
return num
}
1.2.10 只出現一次的數字
給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
func singleNumber(nums []int)int{
ret:=0
for _,num:=range nums{
ret=ret^num
}
return ret
}
1.2.11 兩數之和2--給定有序數組
給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目標數。
函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小于 index2。
說明:
返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重復使用相同的元素。
示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等于目標數 9 。因此 index1 = 1, index2 = 2 。
代碼:
func twoSum(numbers []int,target int)[]int{
if len(numbers)<2{
return nil
}
for i:=0;i<len(numbers);i++{
for j:=i+1;j<len(numbers);j++{
if numbers[i]+numbers[j]==target&&i<j{
return []int{i+1,j+1}
}
}
}
return nil
}
1.2.12 存在重復元素
給定一個整數數組,判斷是否存在重復元素。
如果任何值在數組中出現至少兩次,函數返回 true。如果數組中每個元素都不相同,則返回 false。
示例 1:
輸入: [1,2,3,1]
輸出: true
示例 2:
輸入: [1,2,3,4]
輸出: false
示例 3:
輸入: [1,1,1,3,3,4,3,2,4,2]
輸出: true
代碼:
func containsDuplicate(nums []int)bool{
if len(nums)==0{
return false
}
for i:=0;i<len(nums)-1;i++{
for j:=i+1;j<len(nums);j++{
if nums[i]==nums[j]{
return true
}
}
}
return false
}
1.2.13 存在重復元素2
給定一個整數數組和一個整數 k,判斷數組中是否存在兩個不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的絕對值最大為 k。
示例 1:
輸入: nums = [1,2,3,1], k = 3
輸出: true
示例 2:
輸入: nums = [1,0,1,1], k = 1
輸出: true
示例 3:
輸入: nums = [1,2,3,1,2,3], k = 2
輸出: false
代碼:
func containsNearbyDuplicate(nums []int, k int) bool {
hash := make(map[int]int) // hash 表記錄出現過的元素
for i,x := range nums {
if j,ok := hash[x]; ok && i-j<=k { // 如果之前出現過,判斷下標之差是否不超過 k
return true
}
hash[x] = i
}
return false
}
1.2.14 缺失數字
給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。
示例 1:
輸入: [3,0,1]
輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8
代碼:
func missingNumber(nums []int)int{
length:=len(nums)
sum1,sum2:=length,0
for i:=0;i<lenght;i++{
sum1+=i
sum2+=nums[i]
}
return sum1-sum2
}
1.2.15 Nim游戲
你和你的朋友,兩個人一起玩 Nim 游戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最后一塊石頭的人就是獲勝者。你作為先手。
你們是聰明人,每一步都是最優解。 編寫一個函數,來判斷你是否可以在給定石頭數量的情況下贏得游戲。
示例:
輸入: 4
輸出: false
解釋: 如果堆中有 4 塊石頭,那么你永遠不會贏得比賽;
因為無論你拿走 1 塊、2 塊 還是 3 塊石頭,最后一塊石頭總是會被你的朋友拿走。
代碼:
func canWinNim(n int)bool{
if n%4!=0{
return true
}
return false
}
1.2.16 3的冪
給定一個整數,寫一個函數來判斷它是否是 3 的冪次方。
示例 1:
輸入: 27
輸出: true
示例 2:
輸入: 0
輸出: false
示例 3:
輸入: 9
輸出: true
示例 4:
輸入: 45
輸出: false
代碼:
func isPowerOfThree(n int)bool{
i:=1
for ;i<n;i*=3{
}
if i==n{
return true
}
return false
}
1.2.17 4的冪
給定一個整數 (32 位有符號整數),請編寫一個函數來判斷它是否是 4 的冪次方。
示例 1:
輸入: 16
輸出: true
示例 2:
輸入: 5
輸出: false
代碼:
func isPowerOfFour(num int)bool{
i:=1
for ;i<num;i*=4{
}
if i==num{
return true
}
return false
}
1.2.18 兩整數之和
不使用運算符 + 和 - ,計算兩整數 a 、b 之和。
示例 1:
輸入: a = 1, b = 2
輸出: 3
示例 2:
輸入: a = -2, b = 3
輸出: 1
代碼:
func getSum(a int, b int) int {
for a & b != 0{
a, b = a^b, (a&b) << 1
}
return a | b
}