面试coding基础

快速排序

# 时间复杂度O(nlogn) 最差O(n^2)
def partition(arr, low, high):
    i = low - 1
    pivot = arr[high]

    for j in range(low, high):
        if arr[j] <= pivot:
            i = i + 1
            arr[i], arr[j] = arr[j], arr[i]

    arr[i+1], arr[high] = arr[high], arr[i+1]
    return i+1


def quickSort(arr, low, high):
    if low < high:
        pi = partition(arr, low, high)
        quickSort(arr, low, pi-1)
        quickSort(arr, pi+1, high)


arr = [10, 7, 8, 5, 6, 20]
quickSort(arr, 0, len(arr)-1)
print(arr)

堆排序

# 时间复杂度O(nlogn) 最差O(nlogn)
# 建堆O(n) 每个调整O(logn)
def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2

    if l < n and arr[largest] < arr[l]:
        largest = l
    if r < n and arr[largest] < arr[r]:
        largest = r

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)


def heapSort(arr):
    n = len(arr)

    # 建大顶堆
    for i in range(n-1, -1, -1):
        heapify(arr, n, i)

    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)


arr = [10, 7, 8, 5, 6, 20]
heapSort(arr)
print(arr)

归并排序

# 时间复杂度O(nlogn) 最差O(nlogn)
def merge(arr, l, m, r):
    n1, n2 = m-l+1, r-m
    L, R = arr[l: m+1], arr[m+1: r+1]  # 临时数组

    i, j, k = 0, 0, l
    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            i += 1
        else:
            arr[k] = R[j]
            j += 1
        k += 1

    while i < n1:
        arr[k] = L[i]
        i += 1
        k += 1
    while j < n2:
        arr[k] = R[j]
        j += 1
        k += 1


def mergeSort(arr, l, r):
    if l < r:
        m = (l+r) // 2
        mergeSort(arr, l, m)
        mergeSort(arr, m+1, r)
        merge(arr, l, m, r)

arr = [10, 7, 8, 5, 6, 20]
mergeSort(arr, 0, len(arr)-1)
print(arr)

前中后序遍历(递归法)

class Solution:
	def Traversal(self, root: TreeNode) -> List[int]:
		if not root:
			return []
		# 前序
		return [root.val] + self.Traversal(root.left) + self.Traversal(root.right)

		# 中序
		# return self.Traversal(root.left) + [root.val] + self.Traversal(root.right)

		# 后序
		# return self.Traversal(root.left) + self.Traversal(root.right) + [root.val]
class Solution:
	def Traversal(self, root: TreeNode) -> List[int]:
		def dfs(cur):
			if not cur:
				return
			# 前序
			res.append(cur.val)
			dfs(cur.left)
			dfs(cur.right)
			
			# 中序
			# dfs(cur.left)
			# res.append(cur.val)
			# dfs(cur.right)

			# 后序
			# dfs(cur.left)
			# dfs(cur.right)
			# res.append(cur.val)
		
		res = []
		dfs(root)
		return res

前中后序遍历(迭代法)

# 前序遍历-迭代-LC144_二叉树的前序遍历
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        # 根结点为空则返回空列表
        if not root:
            return []
        stack = [root]
        result = []
        while stack:
            node = stack.pop()
            # 中结点先处理
            result.append(node.val)
            # 右孩子先入栈
            if node.right:
                stack.append(node.right)
            # 左孩子后入栈
            if node.left:
                stack.append(node.left)
        return result
        
# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack = []  # 不能提前将root结点加入stack中
        result = []
        cur = root
        while cur or stack:
            # 先迭代访问最底层的左子树结点
            if cur:     
                stack.append(cur)
                cur = cur.left		
            # 到达最左结点后处理栈顶结点    
            else:		
                cur = stack.pop()
                result.append(cur.val)
                # 取栈顶元素右结点
                cur = cur.right	
        return result
        
# 后序遍历-迭代-LC145_二叉树的后序遍历
class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack = [root]
        result = []
        while stack:
            node = stack.pop()
            # 中结点先处理
            result.append(node.val)
            # 左孩子先入栈
            if node.left:
                stack.append(node.left)
            # 右孩子后入栈
            if node.right:
                stack.append(node.right)
        # 将最终的数组翻转
        return result[::-1]

并查集

class UnionFind:
    def __init__(self, n):
        # 下标是子节点, 值是父节点
        self.parent = list(range(n))

    def union(self, index1, index2):
        # index1 和 index2 子节点 所在树相连
        self.parent[self.find(index2)] = self.find(index1)

    def find(self, index):
        # index的父节点
        if self.parent[index] != index:
            self.parent[index] = self.find(self.parent[index])
        return self.parent[index]

二分查找

# 二分查找
def binary_search(nums, target):
    left, right = 0, len(nums)-1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid - 1
        else:
            return mid
    return None


# 二分查找左边界
def left_bound(nums, target):
    left, right = 0, len(nums)-1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid - 1
        else:
            right = mid - 1  # 锁定左边界
    # 检查左边界越界情况
    if left >= len(nums) or nums[left] != target:
        return None
    return left


# 二分查找右边界
def right_bound(nums, target):
    left, right = 0, len(nums)-1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid - 1
        else:
            left = mid + 1  # 锁定右边界
    # 检查右边界越界情况
    if right < 0 or nums[right] != target:
        return None
    return right

Kmean

import random

class K_means():
    def __init__(self,datas,n_cluster):
        self.datas = datas
        self.n_cluster = n_cluster
        self.clusers_have = {}
        self.datas_belong = [0 for _ in range(len(datas))]
        self.cluser_points = []  # 聚类中心
        for i in range(self.n_cluster):
            self.cluser_points.append([random.uniform(0, 5), random.uniform(0, 5)])
            self.clusers_have[i] = []

    def l2_distance(self,x,y):
        return (x[0]-y[0])*(x[0]-y[0]) + (x[1]-y[1])*(x[1]-y[1])

    def fit(self,iter_num=100):
        for _ in range(iter_num):
            for cluser_idx in self.clusers_have.keys():
                self.clusers_have[cluser_idx] = []
            for i, data in enumerate(self.datas):
                for j, cluster_point in enumerate(self.cluser_points):
                    if j == 0:
                        min_distance = self.l2_distance(data, cluster_point)
                        nearest_cluster = j
                    else:
                        distance = self.l2_distance(data, cluster_point)
                        if distance < min_distance:
                            min_distance = distance
                            nearest_cluster = j
                self.datas_belong[i] = nearest_cluster
                self.clusers_have[nearest_cluster].append(i)
            for j, cluster_point in enumerate(self.cluser_points):
                new_point = [0, 0]
                for i in self.clusers_have[j]:
                    new_point[0] += datas[i][0]
                    new_point[1] += datas[i][1]
                new_point[0] /= len(self.clusers_have[j])
                new_point[1] /= len(self.clusers_have[j])
                self.cluser_points[j] = new_point
            print(self.cluser_points)

    def predict(self,new_point):
        for j,cluser_point in enumerate(self.cluser_points):
            if j == 0 :
                min_distance = self.l2_distance(new_point,cluser_point)
                nearest = j
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt面试中,coding环节通常是测试应聘者Qt编程技能和经验的重要部分。对于Qt面试coding部分,可能会涉及以下几个方面: 1. Qt基础知识:应聘者需要掌握Qt的基本概念和常用类,了解Qt的对象模型和信号槽机制。可能会出现一些关于Qt类的使用和常见操作的问题。 2. UI设计与开发:这部分可能会要求应聘者根据一些需求或UI设计稿实现一个界面。应聘者需要使用Qt的UI设计工具,例如Qt Designer,完成界面的设计和布局,并用C++代码实现界面的功能。 3. 数据处理与算法:有时候面试官会出一些与数据处理或算法有关的问题,以考察应聘者对Qt的灵活运用能力。例如,要求实现一个基于Qt的文本编辑器,或者对一组数据进行排序等。 4. 多线程编程:对于需要处理并发或耗时操作的问题,可能会考察应聘者的多线程编程能力。这包括使用Qt提供的多线程类或库函数,以及保证线程安全性和避免资源竞争的经验。 5. 调试与问题解决能力:面试过程中可能会有意设置一些错误或问题,观察应聘者的调试和解决问题的能力。应聘者需要能够熟练使用Qt的调试工具,查找和修复代码中的问题和错误。 在Qt面试coding环节中,关键是熟练掌握Qt的基本特性和常用类,以及对数据处理、UI设计、多线程和问题解决的经验和能力。同时,良好的编码风格和规范也是考察的一项重点。通过练习和实际项目的积累,不断提升自己的Qt编程技能,才能在Qt面试中有较好的表现。 ### 回答2: QT面试coding主要是针对QT编程技能的考察。在QT面试coding过程中,通常会给出一些编程问题或者需要完成一些编程任务。 首先,面试官可能会问一些基础的QT问题,例如QT的信号与槽机制、布局管理器、窗口部件等等。回答这些问题需要我们对QT的相关概念有一定的了解和掌握。 其次,面试官可能会给出一些具体的编程问题,要求我们使用QT进行解答。这些问题可能涉及到QT的各种功能和模块,例如窗口的绘制、界面的响应事件、文件的读写等。在解答这些问题时,我们需要灵活运用QT的相关函数和类进行编程实现。 最后,面试官可能会要求我们完成一些编程任务,例如实现一个简单的QT应用程序、设计一个界面等等。在这些任务中,我们需要运用QT的各种功能和UI设计技巧来完成。 总的来说,QT面试coding主要考察我们对QT编程的熟练程度和实际应用能力。我们需要熟悉QT的相关知识,并能够灵活运用QT进行编程。通过在面试中展示我们的编程能力,我们能够更好地展现自己的优势,提高获得工作机会的几率。 ### 回答3: 在qt面试coding环节中,通常会要求应聘者完成一个具体的编程任务来评估其在qt开发方面的能力。 首先,面试官可能会询问应聘者是否有qt编程经验以及相关项目经验。这些问题旨在了解应聘者是否熟悉qt框架,是否能够独立开发qt应用程序,并根据具体需求进行调试和优化。 接下来,面试官可能会给应聘者一个具体的编程问题,要求应聘者使用qt编写代码解决该问题。这个问题可能涉及到窗口和控件的创建、布局、信号与槽的连接、界面交互等方面。 在解决问题的过程中,应聘者需要熟悉qt的基本概念和常用的类,比如QWidget、QBoxLayout、QPushButton、QLineEdit等。同时,还需要掌握qt的常用功能,比如事件处理、界面设计和绘图等。 应聘者需要根据问题的要求编写代码,并确保代码的可读性、可维护性和效率。在编程过程中,应聘者需要熟练运用qt的API,同时遵循良好的编码规范,确保代码的质量。 此外,应聘者还可以采取一些额外的措施来提高代码的质量和可扩展性,比如使用设计模式、封装可复用的代码、添加注释和文档等。 最后,面试官可能会与应聘者讨论和评价其代码的质量和实现细节。这个过程中,应聘者需要清楚地解释和展示自己的代码实现,并回答面试官的问题和疑问。 在qt面试coding环节中,关键是理解问题、熟练使用qt的API和功能,并能够用清晰、简洁、高效的代码解决问题。同时,代码的可读性和可维护性也是重要的考察因素。通过合理的思考和实现,展示自己在qt开发方面的能力和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值