经典编程题

1. 0-1背包问题
有N件物品和一个容量为V的背包。
第i件物品的体积是vi,价值是wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包流量,且总价值最大。

f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少
不选第i个物品:f[i][j]=f[i-1][j]
选第i个物品:f[i][j]=f[i-1][j-v[i]]+w[i]
取两者的最大值

python解法

n, v = map(int, input().split())
goods = []
for i in range(n):
    goods.append([int(i) for i in input().split()])

# 初始化,先全部赋值为0,这样至少体积为0或者不选任何物品的时候是满足要求  
dp = [[0 for i in range(v+1)] for j in range(n+1)]

for i in range(1, n+1):
    for j in range(1,v+1):
        dp[i][j] = dp[i-1][j]  # 第i个物品不选
        if j>=goods[i-1][0]:# 判断背包容量是不是大于第i件物品的体积
            # 在选和不选的情况中选出最大值
            dp[i][j] = max(dp[i][j], dp[i-1][j-goods[i-1][0]]+goods[i-1][1])

print(dp[-1][-1])

2.最长公共子序列

3.回文子串的个数
Input : str = "abcd"
Output : 4
Explanation :- palindromic subsequence are : "a" ,"b", "c" ,"d"

Input : str = "aab"
Output : 4
Explanation :- palindromic subsequence are :"a", "a", "b", "aa"

与leetcode 647相似

def countPS(str): 

    N = len(str) 

    # Create a 2D array to store the count of palindromic subsequence 
    cps = [[0 for i in range(N + 2)]for j in range(N + 2)] 

    # palindromic subsequence of length 1 
    for i in range(N): 
        cps[i][i] = 1

    # check subsequence of length L   
    # is palindrome or not 
    for L in range(2, N + 1): 

        for i in range(N): 
            k = L + i - 1
            if (k < N): 
                if (str[i] == str[k]): 
                    cps[i][k] = (cps[i][k - 1] +
                                cps[i + 1][k] + 1) 
                else: 
                    cps[i][k] = (cps[i][k - 1] +
                                cps[i + 1][k] -
                                cps[i + 1][k - 1]) 

    # return total palindromic subsequence 
    return cps[0][N - 1] 

# Driver program 
str = "abcb"
print("Total palindromic subsequence are : ", countPS(str))

4.计算器
给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。

示例 1:
输入: "3+2*2"
输出: 7

from collections import deque
class Solution:
    def calculate(self, s: str) -> int:
        n = len(s)
        s = deque(s)
        num = 0
        sign = "+"
        res = []
        for i in range(n):
            char = s.popleft()
            if char.isdigit():
                num = num * 10 + int(char)
            if char == "(":
                num = self.calculate(s)
            if (not char.isdigit() and char != " ") or not s:
                if sign == "+":
                    res.append(num)
                if sign == "-":
                    res.append(-num)
                if sign == "*":
                    res.append(res.pop() * num)
                if sign == "/":
                    res.append(int(res.pop() / num))
                num = 0
                sign = char
            if char == ")":
                break
        return sum(res)

5. 二进制求和
可以转换为其他进制的求和

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        r, p = '', 0
        d = len(b) - len(a)
        # 默认是b大于a,补充使两者一样长
        a = '0' * d + a  
        b = '0' * -d + b
        # a,b逆序
        for i, j in zip(a[::-1], b[::-1]):
            s = int(i) + int(j) + p
            r = str(s % 2) + r
            p = s // 2
        return '1' + r if p else r

6. 丑数
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, N):
        # write code here
        if N <= 0:
            return 0
        index2,index3,index5=0
        res=[1]
        for i in range(1,N):
            u2=res[index2]*2
            u3=res[index3]*3
            u5=res[index5]*5
            res.append(min(min(u2,u3),u5))
            # res中的数是2,3,5的倍数
            if res[i]/2==res[index2]:
                index2+=1
            if res[i]/3==res[index3]:
                index3+=1
            if res[i]/5==res[index5]:
                index5+=1
        return res.pop()

6.1 京东8.27笔试第一题
2,3,5组成的所有数的第n个数
解法一:使用队列deque

from collections import deque
def find_num(self,n):
    if n<=0:
        return None
    res=[2,3,5]
    res=deque(res)
    k=0
    while res:
        temp=res.popleft()
        k+=1
        if k==n:
            return temp
        res.append(temp*10+2)
        res.append(temp*10+3)
        res.append(temp*10+5)

解法二:转换为3进制

7. 买卖股票的最佳时期
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

解法一:两个变量,minPrice存储最小价格,maxProfit存储最大收益,遍历整个数组

def maxProfit(self,prices):
    if len(prices)==0:
        return 0
    # 正无穷
    minPrice=float("inf")
    maxProfit=0
    for i in prices:
        if i<minPrice:
            minPrice=i
        if i-minPrice>maxProfit:
            maxProfit=i-minPrice
    return maxProfit

解法二:动态规划
图片说明

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if len(prices) == 0:
            return 0
        n = len(prices)
        dp = [[0 for i in range(2)] for i in range(n)]
        dp[0][0] = 0
        dp[0][1] = -prices[0]
        for i in range(1,n):
            dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i])
            dp[i][1] = max(dp[i-1][1],-prices[i])
        return dp[n-1][0]
全部评论

相关推荐

年少的我,一直都很期待别人告诉我的“去大城市见世面”,高考没能考出河南省,甚至上的大学离市区很远,公交地铁两个小时起步。当时我眼中的“去大城市见世面”,就是去大城市工作,看高楼大厦、看车水马龙、游览各种景点、赚很多很多钱、去酒吧去好吃的餐厅、做着高大上的工作、见牛B的人。大一时,我偶然知道了字节的稀土开发者大会,看到了很多大厂背景的人,又因为对大城市的向往,家庭经济很一般甚至有点拮据的我,跟朋友借了几十块钱,买了从郑州到北京的硬座,一晚上6小时到了北京。我确实见到了北京火车站干净的厕所、朝阳区有序的交通、骑着车路过了天安门,那场开发者大会,我也确实见到了学习视频里的人,但是由于自身知识储备的不...
我推的MK:我刚来到大城市的时候就是完全祛媚的,狭小出租屋,天价的房租和恐怖的晚高峰,但是大城市依旧给我带来了很多不一样的东西,比如实习机会,比如逛不尽的商场,比如最前沿的艺术展,比如演唱会和比赛,每当我想要遇见新事物的时候都能够很轻易地在大城市里找到,每当我想要打卡的时候发现坐一个小时地铁都不算多远……大城市就像一片广阔的海洋,我们待在水洼里并不觉得怎样,但当你无论如何眺望都看不到广袤的边界时,你会骤然意识到大城市的意义。
点赞 评论 收藏
分享
大厂实习简历初筛都过不了,不知道是哪里的问题,如果是学历的问题,那估计没救了
AAA不喝拿铁:比赛获奖就一条完全没必要单独开一栏写呀
投递牛客等公司6个岗位 > 我的简历长这样
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务