Python面试一百题——算法(2)

目录

  1. 删除链表中重复的节点
  2. 二叉搜索树的第k个节点
  3. 字符串循环左移k位
  4. 整数区间中1出现的次数
  5. 二叉树中和为某一值的路径
  6. 青蛙跳台阶(斐波那契)
  7. 用递归的方法绘制带绿叶的小树
  8. 绘制谢尔宾斯基三角形

0.1删除链表中重复的节点

在这里插入图片描述

class LinkedNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def delete(pHead):
    nodeValue = {}
    newHead = LinkedNode(pHead.val)
    nodeValue[pHead.val] = pHead.val

    curNode = newHead
    while pHead.next:
        pHead = pHead.next
        if nodeValue.get(pHead.val) == None:
            curNode.next = LinkedNode(pHead.val)
            curNode = curNode.next
            nodeValue[pHead.val] = pHead.val
    return newHead

header = LinkedNode(5)
node1 = LinkedNode(5)
header.next = node1
node2 = LinkedNode(10)
node1.next = node2
node3 = LinkedNode(3)
node2.next = node3

def printLinked(header):
    p = header
    while p:
        print(p.val, end=' ')
        p = p.next

header1 = delete(header)
printLinked(header1)	# 5 10 3

0.2二叉搜索树的第k个节点

在这里插入图片描述

中序遍历

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class KNode:
    def KthNode(self, pRoot, k):
        global result
        result = []
        middle = self.midorder(pRoot)
        if k <= 0 or len(middle) < k:
            return None
        else:
            return middle[k - 1]

    def midorder(self, pRoot):
        if not pRoot:
            return []
        self.midorder(pRoot.left)
        result.append(pRoot)
        self.midorder(pRoot.right)
        return result

root = TreeNode(10)
left = TreeNode(6)
right = TreeNode(15)
root.left = left
root.right = right

left1 = TreeNode(11)
right1 = TreeNode(20)
right.left = left1
right.right = right1

print(KNode().KthNode(root, 4).val)
15

0.3字符串循环左移k位

在这里插入图片描述

def leftmove(s, k):
    return s[k:] + s[:k]

def rightmove(s, k):
    return s[len(s) - k:] + s[:len(s) - k]
print(leftmove('abcXYZopq', 3))		# XYZopqabc
print(rightmove('abcXYZopq', 3))	# opqabcXYZ

0.4整数区间中1出现的次数

在这里插入图片描述

def findone(n):
    count = 0
    for i in range(1, n+1):
        for i in str(i):
            if i == '1':
                count +=1
    return count

print(findone(200))
140

0.5二叉树中和为某一值的路径

在这里插入图片描述

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def findpath(root, n):
    if not root:
        return []
    result = []
    def findpath2(root, path, curNum):
        curNum += root.val
        path.append(root)
        # 判断root是否为叶子节点
        flag = root.left == None and root.right == None

        if curNum == n and flag:
            onepath = []
            for node in path:
                onepath.append(node.val)
            result.append(onepath)
        if curNum < n:
            if root.left:
                findpath2(root.left, path, curNum)
            if root.right:
                findpath2(root.right, path, curNum)
        path.pop()
    findpath2(root, [], 0)
    return result

root = TreeNode(10)
left = TreeNode(6)
right = TreeNode(15)
root.left = left
root.right = right

left1 = TreeNode(11)
right1 = TreeNode(20)
right.left = left1
right.right = right1

print(findpath(root, 16))
[[10, 6]]

0.6青蛙跳台阶(斐波那契数列)

在这里插入图片描述

'''
总共 n 级台阶,剩下 f(n) 级
1.第一次跳 1 级,剩下 f(n-1) 级
2.第一次跳 2 级,剩下 f(n-2) 级
第一次跳就这两个方法,总共 f(n-1) + f(n-2) 种方法
f(1) = 1
f(2) = 2
斐波那契数列
'''
def jumpfloor(n):
    res = [1, 2]
    while len(res) <= n:
        res.append(res[-1] + res[-2])
    if n == 1:
        return 1
    else:
        return res[n - 1]

print(jumpfloor(20))
10946

0.7用递归的方法绘制带绿叶的小树

在这里插入图片描述

import turtle

def tree(branch_len, t):
    if branch_len > 5:
        # 绘制树干
        t.forward(branch_len)
        if (branch_len - 15) <= 5:
            t.pencolor('green')
        else:
            t.pencolor('black')
        # 改变树干粗细
        new_width = branch_len // 5
        if new_width > 0:
            t.pensize(new_width)

        # 向右旋转20度
        t.right(20)
        tree(branch_len - 15, t)   # 每绘制一次树干长度减小15
        if new_width > 0:
            t.pensize(new_width)
        # 绘制左侧
        t.left(40)
        tree(branch_len - 15, t)
        t.right(20)
        t.backward(branch_len)

t = turtle.Turtle()
win = turtle.Screen()
t.left(90)  # 从下到上画
t.pencolor('black')
t.pensize(15)
tree(70, t)
win.exitonclick()

0.8绘制谢尔宾斯基三角形

在这里插入图片描述

import turtle

# 绘制三角形
# points [[x1, y1], [x2, y2], [x3, y3]]
def draw_triangle(points, color, t):
    t.fillcolor(color)
    t.up()
    # 将画笔移动到第一个点
    t.goto(points[0][0], points[0][1])
    t.down()
    t.begin_fill()
    t.goto(points[1][0], points[1][1])
    t.goto(points[2][0], points[2][1])
    t.goto(points[0][0], points[0][1])
    t.end_fill()

# 计算中间点
def mid_point(p1, p2):
    return ((p1[0] + p2[0])/2, (p1[1] + p2[1])/2)

def sterpin(points, degree, t):
    color = ['blue', 'green', 'red', 'yellow', 'orange', 'violet']
    # 绘制大的三角形
    draw_triangle(points, color[degree], t)
    if degree >= 0:
        # 绘制左下角三角形
        sterpin([points[0], mid_point(points[0], points[1]), mid_point(points[0], points[2])], degree - 1, t)
        # 绘制上方三角形
        sterpin([points[1], mid_point(points[0], points[1]), mid_point(points[1], points[2])], degree - 1, t)
        # 绘制右下角三角形
        sterpin([points[2], mid_point(points[2], points[1]), mid_point(points[0], points[2])], degree - 1, t)

t = turtle.Turtle()
win = turtle.Screen()
points = [[-200, -100], [0, 200], [200, -100]]
sterpin(points, 4, t)
win.exitonclick()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通用算法工程师面试通常涉及以下几个方面: 1. 数据结构和算法面试官通常会要求候选人展示对常见数据结构(如数组、链表、栈、队列、树、图等)的理解以及常见算法(如排序、查找、动态规划等)的实现和优化。 2. 复杂度分析:候选人需要能够分析算法的时间复杂度和空间复杂度,并且能够根据具体情况选择合适的算法。 3. 编程能力:面试官可能会要求候选人在白板上实现一些常见算法或解决一些编程问,以评估其编程能力和解决问的能力。 4. 系统设计:面试官可能会要求候选人设计一个具有一定规模和用户量的系统,考察其系统设计能力和架构思维。 5. 算法优化和性能调优:面试官可能会给候选人一些具体的场景或问,要求候选人能够思考并提出相应的算法优化方案,并分析其优缺点。 6. 数学基础:候选人需要具备一定的数学基础,如概率统计、线性代数等,以应对一些与算法相关的数学问。 7. 面试实现和解答:面试官可能会提供一些具体的面试,要求候选人进行实现或解答,以考察其对算法的理解和应用能力。 通过准备和学习相关的算法和数据结构知识,进行刷练习,并思考和总结常见的算法思想和优化方法,候选人可以提高自己的通用算法工程师面试能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [百度地图开发java源码-OfferTerminator-Documents:偏向于软件工程师的面试资料整理](https://download.csdn.net/download/weixin_38599518/19411826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [算法工程师面经 —— python 面试常问问](https://blog.csdn.net/qq_46450354/article/details/125585771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值