python面试 --代码题

1. 字符串逆序

str = "abcdegfgijlk" 
# 1. 切片
str[::-1]
# 2. 反转函数
''.join(reversed(str))  

2. 求从10到100中能被3或5整除的数的和

l = []  
for i in range(10, 101):  
    if i % 3 == 0 or i % 5 == 0:  
        l.append(i)  
print(l, sum(l))  

3. 变量交换

a,b = b, a  

4. 按升序合并两个list, 并去除重复的元素

s = sorted(set(list1 + list2)) 

5. 字典推导式


randomdict = {i : random.randint(10, 100) for i in range(1, 5)}

name = ["张三", "李四", "王五", "李六"]  # 保存名字列表
sign = ["白羊座", "双鱼座", "狮子座", "处女座"]  #保存星座列表
dict1 = {i : j for i, j in zip(name, sign)}    # 字典推导式
print(dict1)
# {'张三': '白羊座', '李四': '双鱼座', '王五': '狮子座', '李六': '处女座'}

6. 对列表 lst = [1, -2, 10, -12, -4, -5, 9, 2] 实现排序,按照正的放前面,负的放后面,并且分别按绝对值从小到大

lst.sort(key=lambda x: (x < 0, abs(x)))
# 输出
# [1, 2, 9, 10, -2, -4, -5, -12]

7. 列表生成式并打乱顺序

from random import shuffle

alist = [i for i in range(10)]
alist2 = list(range(10))
# 打乱顺序
shuffle(alist)

8. 列表中字典元素排序

# 按alist中元素的 age 由大到小排序

alist = [{'name': 'a', 'age': 20}, {'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}]  
alist.sort(key=lambda x: -x["age"])  
print(alist)  

9. 简单实现一个 stack

class Stack:  
    def __init__(self):  
        self.values = []  
    def push(self, o):  
        self.values.append(o)  
    def pop(self):  
        return self.values.pop()  
s = Stack()  
s.push(1)  
s.push(2)  
assert s.pop() == 2  
assert s.pop() == 1  
s.push(3)  
s.push(4)  
assert s.pop() == 4  
assert s.pop() == 3  

10. 输入某年某月某日,判断这一天是这一年的第几天?

from datetime import datetime

def day_of_year(year, month, day):
	return (datetime(year, month, day) - datetime(year, 1, 1)).days + 1

assert day_of_year(2021, 1, 10) == 10

11. 台阶问题/斐波那契

# 1. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
# 2. 一句代码写斐波那契数列
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)  

12. 变态台阶问题

# 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级
# 求该青蛙跳上一个n级的台阶总共有多少种跳法
fib = lambda n: n if n < 2 else 2 * fib(n - 1) 

13. 特殊字符串处理

# 将字符串:"k:1|k1:2|k2:3|k3:4",
# 处理成python字典:{k:1, k1:2, ... }

def string_to_dict(string):  
    d = {}  
    for kv in string.split("|"):  
        k, v = kv.split(":")  
        if v.isdigit():  
            v = int(v)  
        d[k] = v  
    return d  
    
string = "k:1|k1:2|k2:3|k3:4"  
print(string_to_dict(string))  
string2 = "k:1"  
print(string_to_dict(string2))  

14. 找零算法(动态规划)

def coinChange(values, money, coinsUsed):
    # values    T[1:n]数组
    # valuesCounts   钱币对应的种类数
    # money  找出来的总钱数
    # coinsUsed   对应于目前钱币总数i所使用的硬币数目
    for cents in range(1, money + 1):
        minCoins = cents  # 从第一个开始到money的所有情况初始
        for value in values:
            if value <= cents:
                # minCoins = min(coinsUsed[cents - value] + 1, minCoins)
                temp = coinsUsed[cents - value] + 1
                if temp < minCoins:
                    minCoins = temp
        coinsUsed[cents] = minCoins
        print('面值为:{0} 的最小硬币数目为:{1} '.format(cents, coinsUsed[cents]))
    print(coinsUsed)


if __name__ == '__main__':
    values = [25, 21, 10, 5, 1]  # 钱币的面值
    money = 63  # 需找零的总钱数
    coinsUsed = {i: 0 for i in range(money + 1)}
    print(coinsUsed)
    coinChange(values, money, coinsUsed)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值