国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

記錄leetcode上的一些題

shixinzhang / 2464人閱讀

摘要:此篇文章最先發布在我的博客上記錄上的一些題,基本上是上的題,其他的我會標注出來,用的語言目前是寫的代碼很庸俗,請大神不要見笑題目羅馬數字的規則如下羅馬數字共有個,即和。在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。

此篇文章最先發布在我的博客mbinary上
? ?
記錄OJ上的一些題,基本上是leetcode上的題,其他的我會標注出來,用的語言目前是python,寫的代碼很庸俗,請大神不要見笑(>_<)

# 2017-8-20

Integer to Roman

??題目

Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
羅馬數字的規則如下:

羅馬數字共有7個,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、?(50)、?(100)、?(500)和?(1000)。按照下述的規則可以表示任意正整數。需要注意的是羅馬數字中沒有“0”,與進位制無關。一般認為羅馬數字只用來記數,而不作演算。

重復數次:一個羅馬數字重復幾次,就表示這個數的幾倍。

右加左減

在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。

在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。

左減的數字有限制,僅限于I、X、C。比如45不可以寫成VL,只能是XLV

左減時不可跨越一個位值。比如,99不可以用IC( 100-1)表示,而是用XCIX([100-10]+[10-1])表示。(等同于阿拉伯數字每位數字分別表示。)

左減數字必須為一位,比如8寫成VIII,而非IIX。

右加數字不可連續超過三位,比如14寫成XIV,而非XIIII。(見下方“數碼限制”一項。)

加線乘千
在羅馬數字的上方加上一條橫線或者加上下標的?,表示將這個數乘以1000,即是原數的1000倍。同理,如果上方有兩條橫線,即是原數的1000000( {displaystyle 1000^{2}} 1000^{{2}})倍。

數碼限制
同一數碼最多只能連續出現三次,如40不可表示為XXXX,而要表示為XL。例外:由于IV是古羅馬神話主神朱庇特(即IVPITER,古羅馬字母里沒有J和U)的首字,因此有時用IIII代替IV。

?? ??思路
這道題還是蠻有意思的,同樣用遞歸的方法,在了解拼寫規則后,要從數值范圍來判斷羅馬數字的結構,即取哪個字母?哪種組合?左或是右?
孿生題是Roman to Interger比較簡單
??代碼

#python
class Solution(object):
    def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """
        dic = {0:"",1:"I",5:"V",10:"X",50:"L",100:"C",500:"D",1000:"M"}
        ks = [1,5,10,50,100,500,1000]
        
        def convert(num):
            if num in dic.keys():
                return dic[num]
            if num > 1000:
                n = int(num/1000)
                num -= n * 1000
                return  "M"*n + convert(num)
            n = 1000
            for i in ks:
                if i > num :
                    n = i
                    break
            exp = 1
            flag = False
            while exp <= n:   # judge if n is 10 exp k
                if exp == n:
                    flag = True
                    break
                exp *= 10
            if flag:
                small = n / 10
                if num >= 9 * small:
                    return dic[small] + dic[n] + convert(small -(n-num)) 
                else:
                    return dic[n/2] + convert(num - n/2)
            else:
                small = n / 5
                if n - small <= num :
                    return dic[small] + dic[n] + convert(small - (n-num))
                else:
                    n2 = int(num / small)
                    num -= n2 * small
                    return dic[small] * n2 + convert(num)
        return convert(num)             

word search

??題目

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given board =
[
  ["A","B","C","E"],
  ["S","F","C","S"],
  ["A","D","E","E"]
]
word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.

? ???思路
這道題可以用遞歸函數來解決,注意到,eg從“a” 中判斷是否有“aa” ,如果直接遞歸是返回true的,這不對,要就是說在一次判斷中,已判斷過的字母不能再判斷,所以參數應該還有一個board,記錄當前的字母狀態,考慮到python是用的引用,傳遞參數時沒有復制,我又不想額外再去復制board,就在函數中記下當前位置的字母,在函數調用結束再改回來的。哈哈!
??代碼

#python
class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        row = len(board)
        col = len(board[0])
        num = len(word)
        def find(r,c,n):
            if n == num-1 and board[r][c] == word[n]:
                return True
            if board[r][c] != word[n] or n == num-1:
                return  False
            tmp = board[r][c]    #save  the  val
            board[r][c] = 0
            if r < row-1 and find(r+1,c,n+1):
                return True
            if r > 0 and find(r-1,c,n+1):
                return True
            if c  0 and find(r,c-1,n+1):
                return True
            board[r][c] = tmp
            return False
        for i in range(row):
            for j in range(col):
                if find(i,j,0):
                    return True
        return False

# 2017-8-19

3 sum

??題目

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

????思路
最開始我想的就直接3重循環,再加判重的循環,暴力求解,當然超時了,要高于O(n3)。后來想到可以將正負數,0,分成三組來組合,然而最后兩個數據過不了,在網上搜了一下,可以固定一個數,頭尾雙指針來移動,這是O(n2)。哎,折騰了一晚上,我好菜啊。 這是前幾次的結果[站外圖片上傳中……(1)]

? ???代碼 (分成正負0三組,寫了很多判斷語句,唉,庸俗的代碼。 )

#python

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        
        rst = []
        zero = []   #zeros
        neg = []    #negative
        pos = []    #positive
        for i in (nums):
            if i < 0:
                neg.append(i)
            elif i > 0:
                pos.append(i)
            else:
                zero.append(i)
        if len(zero) > 2:
            rst.append([0,0,0])
        if neg == []  or  pos == []:
            return rst
        if zero != []:
            if len(neg) > len(pos):
                for i in pos:
                    if -i in neg:
                        rst.append([-i,0,i])
            else:
                for i in neg:
                    if -i in pos:
                        rst.append([i,0,-i])
        pos.sort()
        neg.sort()
        if len(pos) == 1 and len(neg) == 1:
            return rst
        elif len(pos) == 1 :
            tmp = len(neg) - 1
            while tmp > 0:
                sum = neg[tmp] + neg[tmp-1]
                if sum == - pos[0]:
                    rst.append([neg[tmp-1],neg[tmp],pos[0]])
                    break
                elif sum < - pos[0]:
                    break
                tmp -= 1
        elif len(neg) == 1:
            tmp = 0
            while tmp < len(pos) - 1 :
                sum = pos[tmp] + pos[tmp+1]
                if sum == - neg[0]:
                    rst.append([neg[0],pos[tmp],pos[tmp+1]])
                    break
                elif sum > - neg[0]:
                    break
                tmp -= 1
        sameI = []     #avoid test several same num
        for i in range(len(pos)-1):
            if i in sameI:
                continue
            sameI.append(i)
            sameJ=[]
            for j in range(i+1,len(pos)):
                if j in sameJ:
                    continue
                sameJ.append(j)
                sum = pos[i] + pos[j]
                for k in neg:
                    if   sum > -k:
                        break
                    elif sum == -k:
                        rst.append([k,pos[i],pos[j]])
        sameI = []
        for i in range(len(neg)-1):
            if i in sameI:
                continue
            sameI.append(i)
            sameJ=[]
            for j in range(i+1,len(neg)):
                if j in sameJ:
                    continue
                sameJ.append(j)
                sum = neg[i] + neg[j]
                for k in pos:
                    if   sum > -k:
                        break
                    elif sum == -k:
                        rst.append([neg[i],neg[j],k])
        fnl = []   
        for i in rst:
            if i not in fnl:
                fnl.append(i)
        return fnl 

? ? 代碼 (頭尾雙指針,過了,注意判重的方法,前一個用的if,后面在找到答案時用while)

#python
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        rst=[]
        nums.sort()
        for i in range(len(nums)-2):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            head = i+1
            tail = len(nums) - 1
            while head < tail:
                if nums[i] + nums[head] + nums[tail]  == 0:
                    rst.append([nums[i],nums[head],nums[tail]])
                    head += 1
                    tail -= 1
                    while head< tail and nums[head] == nums[head -1]:
            head = i+1
            tail = len(nums) - 1
            while head < tail:
                if nums[i] + nums[head] + nums[tail]  == 0:
                    rst.append([nums[i],nums[head],nums[tail]])
                    head += 1
                    tail -= 1
                    while head< tail and nums[head] == nums[head -1]:
                        head += 1
                    while head
2017-8-17

jump game

??題目

Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.

For example:

A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.

????思路
由于只有非負數,不能成功的點一定是當前位置為0,所以可以將列表中所以的0找出來,并記下位置(下標),然后從這個位置開始往前搜索,若存在能跳過此位置的點,則能跳過,去除這個0,一直跳過所有0

????代碼

#python
    class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """

        if len(nums) == 1:
            return True
        zeros = []
        for i,j in enumerate(nums):
            if j == 0:
                zeros.append(i)
        while zeros != []:
            i = zeros[0]
            tmp = i - 1
            flag = 0
            while tmp >= 0:
                if nums[tmp] > i-tmp  or nums[tmp]+tmp+1 >=len(nums):
                    flag = 1
                    break
                tmp -= 1
            if flag == 0 :
                return False
            del zeros[0]
            
        return True

super pow

??題目

Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.

Example1:
a = 2

b = [3]
Result: 8

Example2:

a = 2
b = [1,0]
Result: 1024

??思路
這道題顯然不能直接計算,可以用歐拉定理
對任意正整數a,正整數m,(a,m) = 1,?(m) 為比m小的與m互質的(注意不一定是質數)正整數的個數,
則 a?(m) ≡ 1 (mod m) 。
再利用性質: a ≡ b (mod m) ,c ≡ d (mod m) ,則ac ≡ bd (mod m)
證明就不寫了,打數學符號太累了(T^T),給個傳送門吧--> 歐拉定理)

??代碼

    #python
    class Solution(object):
    def superPow(self, a, b):
        """
        :type a: int
        :type b: List[int]
        :rtype: int
        """
        m = 1337
        if a % m == 0:
            return 0
        sum = 0
        for i in b:
            sum = 10 * sum + i    
        phi = 0
        for i in range(1,m):
            if (i % 7 != 0) and (i % 191 != 0):
                phi += 1
        sum = sum % phi
        return (a**sum) % 1337
        # if m a prime num ,use the small law of Fermat
        # else use the law of Euler
    

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40754.html

相關文章

  • LeetCode 攻略 - 2019 年 8 月上半月匯總(109 攻略)

    摘要:每天會折騰一道及以上題目,并將其解題思路記錄成文章,發布到和微信公眾號上。三匯總返回目錄在月日月日這半個月中,做了匯總了數組知識點。或者拉到本文最下面,添加的微信等會根據題解以及留言內容,進行補充,并添加上提供題解的小伙伴的昵稱和地址。 LeetCode 匯總 - 2019/08/15 Create by jsliang on 2019-08-12 19:39:34 Recently...

    tracy 評論0 收藏0
  • LeetCode 攻略 - 2019 年 7 月上半月匯總(55 攻略)

    摘要:微信公眾號記錄截圖記錄截圖目前關于這塊算法與數據結構的安排前。已攻略返回目錄目前已攻略篇文章。會根據題解以及留言內容,進行補充,并添加上提供題解的小伙伴的昵稱和地址。本許可協議授權之外的使用權限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...

    warmcheng 評論0 收藏0
  • LeetCode 攻略 - 2019 年 7 月下半月匯總(100 攻略)

    摘要:月下半旬攻略道題,目前已攻略題。目前簡單難度攻略已經到題,所以后面會調整自己,在刷算法與數據結構的同時,攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚有什么區別...

    tain335 評論0 收藏0
  • 回溯算法講解--適用于leetcode絕大多數回溯

    摘要:什么是回溯算法回溯法是一種系統搜索問題解空間的方法。解空間定義為與數字長度相同。最后,為什么要掌握回溯法因為懂了回溯法之后筆試里的很多題就算不了,起碼成功運行到之間是沒問題的。 什么是回溯算法?回溯法是一種系統搜索問題解空間的方法。為了實現回溯,需要給問題定義一個解空間。說到底它是一種搜索算法。只是這里的搜索是在一個叫做解空間的地方搜索。而往往所謂的dfs,bfs都是在圖或者樹這種數據...

    saucxs 評論0 收藏0
  • LeetCode 之 JavaScript 解答第104 —— 二叉樹的最大深度

    摘要:小鹿題目二叉樹的最大深度給定一個二叉樹,找出其最大深度。二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。求二叉樹的深度,必然要用到遞歸來解決。分別遞歸左右子樹。 Time:2019/4/22Title: Maximum Depth of Binary TreeDifficulty: MediumAuthor:小鹿 題目:Maximum Depth of Binary Tre...

    boredream 評論0 收藏0

發表評論

0條評論

shixinzhang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<