三七互娱后端工程师笔试记录

1, drop  delete truncate 

   drop 删除表结构以及内容,释放表所占空间

   delete 执行一次操作从表中删除一行数据,删除操作记录在事务日志中,后期可以回滚操作

   truncate 一次性删除所有数据,其操作不被记录,数据不可恢复

2, 私有ip地址

  A类私有ip地址:10.0.0.0 —10.255.255.255

  B类私有ip地址:172.16.0.0 — 172.31.255.255

  C类私有ip地址: 192.168.0.0 — 192.168.255.255

3, 查看Linux系统版本

  uname -a  显示系统名、节点名称、操作系统的发行版号、操作系统版本、运行系统的机器 ID 号。

  uname -r 显示当前系统发行版号

编程题:

1)给定股票价格数组,允许一次交易(先买进,再卖出),求最大利润

例如 :输入【7,1,5,3,6,4】  输出 5;  【7,6,4,3,1】 输出 0 (不参与交易)

思路:两个变量一个记录当前最小股票价格,一个记录当前最大股票利润

def maxProfit(arr):
    minIndex = 0
    maxPro = 0
    i = 1
    while i < len(arr):
        curProfit = arr[i] - arr[minIndex]
        if maxPro < curProfit:
            maxPro = curProfit
        if arr[i] < arr[minIndex]:
            minIndex = i
        i += 1
    return maxPro

2) 给定股票价格数组,不限制交易次数,求最大利润

例如:输入【7,1,5,3,6,4】  输出 8

分析:序列情况分三种 

          a>b>c  这种情况下不进行交易,利润为0

          a

          ac 这种情况下最大利润为b-a

总结:最大利润由相邻元素的差值累加

def maxProfit(arr):
    maxPro = 0
    for i in range(len(arr)-1):
        if arr[i] < arr[i+1]:
            maxPro += arr[i+1]-arr[i]
    return maxPro

或者

def maxProfit(arr):
    length = len(arr)
    valley = arr[0]
    maxPro = 0
    if length < 2:
        return maxPro
    for i in range(1, length):
        if valley > arr[i]:
            valley = arr[i]
        elif arr[i] > valley:
            maxPro += arr[i]-valley
            valley = arr[i]
    return maxPro

3) 给定股票价格数组,不限制交易次数,但每次交易有手续费用fee,求最大利润

例如 输入:prices = [1, 3, 2, 8, 4, 9], fee = 2  输出 8

valley = arr[i]-fee的原因说明:

假设交易1为 B - A -fee,下一次交易为D - B -fee,如果说一次交易的利润小于两次交易的话才会进行两次交易,则需要满足 [D - A -fee] < [(B-A-fee)+(D-C-fee)],化简后可知B - fee > C,即下一次交易的买进额度要小于上一次的卖出额度减去fee

def maxProfit(arr, fee):
    length = len(arr)
    valley = arr[0]
    maxPro = 0
    if length < 2:
        return maxPro
    for i in range(1, length):
        if valley > arr[i]:
            valley = arr[i]
        elif arr[i]-valley > fee:
            maxPro += arr[i]-valley-fee
            valley = arr[i]-fee
    return maxPro

 

4)Python LeetCode(463.岛屿的周长)
     给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

例如:输入
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]

输出: 16
思路1:遍历二维数组,如当前节点等于1,则查看它上下左右节点是否等于0或者不存在,若满足则周长加1

思路2:直接遍历二维数组,当前元素为1时,结果加4,判断该元素的上方和左方有无相邻元素,若有则减去相邻的两边,即减2,最后返回结果即可

def landPerimeter(grid):
    if not grid:
        return 0
    result = 0
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == 1:
                result += 4
                if i > 0 and grid[i - 1][j] == 1:
                    result -= 2
                if j > 0 and grid[i][j - 1] == 1:
                    result -= 2
    return result

 

你可能感兴趣的:(三七互娱后端工程师笔试记录)