LeetCode刷題總結

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 階 + 1 階
  2. 2 階
    示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。

  1. 1 階 + 1 階 + 1 階
  2. 1 階 + 2 階
  3. 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 行。

img

在楊輝三角中,每個數是它左上方和右上方的數的和。

示例:

輸入: 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 行。

img

在楊輝三角中,每個數是它左上方和右上方的數的和。

示例:

輸入: 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
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容

  • 隊列:先進先出 棧:先進后出 堆(優先隊列 ): 邏輯結構上是完全二叉樹結構,其中每個字數的最大值(最小值)節點是...
    DopaM1ne閱讀 431評論 0 0
  • 350. 兩個數組的交集 II 思路 兩個map分別統計在兩個數組中一個元素的出現次數 把其中一個數組排序去重,然...
    Jingtianer閱讀 414評論 0 0
  • ?一顆斯特拉【注】1..參考書:①C++譚浩強②C++數據結構與算法 (第4版) 66. 加一(4月24日) 01...
    三金姐姐閱讀 1,111評論 0 1
  • 1.兩數之和 AC代碼 思路 剛開始就是用雙層for循環寫,然后秉承著謙虛的態度看了題解,發現真的有O(N)的算法...
    Jingtianer閱讀 845評論 0 2
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學已經沒多少時間了。班主任說已經安排了三個家長分享經驗。 放學鈴聲...
    飄雪兒5閱讀 7,538評論 16 22