面试常考算法

Java面试-常考算法 常考算法排序插入希尔直插交换冒泡快排选择简单选择堆归并基数常用算法思路分治动态规划贪心回溯分支界定复杂度时间复杂度空间复杂度查找二分查找二叉排序树B树HashBloomFilter字符串匹配BF算法BM算法Sunday算法KMP算法Tire算法 排序 插入 希尔 直插 交换 冒泡 快排 选择 简单选择 堆 归并 基数 常用算法思路 分治 动态规划 贪心 回溯 分支界定 复杂度 时间复杂度 空间复杂... 阅读详情

背景

一般一些大厂面试都会以一个算法题结尾 那么笔者总结了下哪些类型的算法会比较常考

排序算法

排序算法是最常考的了    简单描述下八大排序算法的规则

希尔排序 

希尔排序就是为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序。
采⽤插入排序的⽅法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的⼤大⼩小可以是 h = n / 2,接着让 h = n / 4,让 h ⼀一直缩⼩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序, 此时数组就是有序的了

不稳定排序 时间复杂度n的1.3次方

func shellSort(nums []int){
	n := len(nums)
	//做出间隔
	for gap := n / 2; gap > 0; gap /= 2 {
		for i := 0; i < gap; i++{
			//插入算法
			for k := gap; k < n; k += gap{
				for j := k - gap; j >= 0; j -= gap{
					if(nums[j + 1] < nums[j]){
						nums[j], nums[j + 1] = nums[j + 1], nums[j]
					}else{
						break
					}
				}
			}
		}
	}
}

插入排序 

具体来说,我们在未排序区间选择一个基准元素,将该元素与其左侧已排序区间的元素逐一比较大小,并将该元素插入到正确的位置

稳定排序 时间复杂度n的平方

func insertSort(nums []int){
	n := len(nums)
	for i := 1; i < n; i++{
		for k := i - 1; k >= 0; k--{
			if(nums[k + 1] < nums[k]){
				nums[k], nums[k + 1] = nums[k + 1], nums[k]
			}else{
				break
			}
		}
	}
}

冒泡排序   

每次把最大的数移到最后

稳定排序 时间复杂度n的平方

func bubbleSort(nums []int) {
	n := len(nums)
	for i := 1; i < n; i++{
		for k := 0; k < n - i; k++{
			if(nums[k] > nums[k + 1]){
				nums[k], nums[k + 1] = nums[k + 1], nums[k]
			}
		}
	}
}

选择排序   

每次选择最小的数放在前面

不稳定排序 时间复杂度n的平方

func selectSort(nums []int){
	n := len(nums)
	for i := 0; i < n - 1; i++{
		minIndex := i
		for k := i + 1; k < n; k++{
			if(nums[k] < nums[minIndex]){
				minIndex = k
			}
		}
		nums[minIndex], nums[i] = nums[i], nums[minIndex]

	}
}

堆排序 

堆排序的思想就是先将待排序的序列建成大根堆,使得每个父节点的元素大于等于它的子节点。此时整个序列最大值即为堆顶元素,我们将其与末尾元素交换,使末尾元素为最大值,然后再调整堆顶元素使得剩下的 n−1 个元素仍为大根堆,再重复执行以上操作我们即能得到一个有序的序列

不稳定排序  时间复杂度nlogn

func bigHeapSort(nums []int){
	n := len(nums) - 1
	//建立大顶堆
	for i := n / 2; i >= 0; i--{
		bigHeapSortDown(nums, i, n)
	}

	for i := n; i > 0; i--{
		nums[i], nums[0] = nums[0], nums[i]
		bigHeapSortDown(nums, 0, i - 1)
	}
}

func bigHeapSortDown(nums []int, num int, n int){
	if(2 * num + 1 > n){
		return
	}

	if nums[2 * num + 1] > nums[num] {
		if (2 * num + 2 <= n) && nums[2 * num + 2] > nums[2 * num + 1] {
			nums[num], nums[2 * num + 2] = nums[2 * num + 2], nums[num]
			bigHeapSortDown(nums, 2 * num + 2, n)
		}else{
			nums[num], nums[2 * num + 1] = nums[2 * num + 1], nums[num]
			bigHeapSortDown(nums, 2 * num + 1, n)
		}
	}else if (2 * num + 2 <= n) && nums[2 * num + 2] > nums[num] {
		nums[num], nums[2 * num + 2] = nums[2 * num + 2], nums[num]
		bigHeapSortDown(nums, 2 * num + 2, n)
	}

}

归并排序 

归并排序利用了分治的思想来对序列进行排序。对一个长为 n 的待排序的序列,我们将其分解成两个长度为 n/2的子序列。每次先递归调用函数使两个子序列有序,然后我们再线性合并两个有序的子序列使整个序列有序。有点后序排序的思路

求mid,递归排左边、右边,合并

稳定排序 时间复杂度nlogn

func mergeSort(nums []int, left, mid, right int){
	if(left >= right){
		return
	}

	if(mid > left){
		mergeSort(nums, left, (left + mid) / 2, mid)
	}
	if(right > mid + 1){
		mergeSort(nums, mid + 1, (right + mid + 1) / 2 ,right)
	}

	temp := make([]int, right - left + 1)
	i, j, k := left, mid + 1, 0
	
	for i <= mid&& j <= right{
		if(nums[i] <= nums[j]){
			temp[k] = nums[i]
			i++
		}else{
			temp[k] = nums[j]
			j++
		}
		k++
	}
	for i <= mid{
		temp[k] = nums[i]
		i++
		k++
	}
	for j <= right{
		temp[k] = nums[j]
		j++
		k++
	}
	copy(nums[left:], temp)

}

快速排序   

快速排序的核心操作是“哨兵划分”,其目标是:选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧

不稳定排序 时间复杂度nlogn

func quickSort(nums []int, left, right int) {
	if left >= right {
		return
	}
	num := nums[left]
	i, k := left, right
	for i < k {
		for i < k && nums[k] >= num {
			k--
		}
		nums[i] = nums[k]
		for i < k && nums[i] <= num {
			i++
		}
		nums[k] = nums[i]
	}
	nums[i] = num
	quickSort(nums, left, i-1)
	quickSort(nums, i+1, right)
}

计数排序

通过统计元素数量来实现排序,通常应用于整数数组

稳定算法 时间复杂度n

func countSort(nums []int){
	maxNum := 0
	for _, value := range nums{
		if(value > maxNum){
			maxNum = value
		}
	}

	countList := make([]int, maxNum + 1)
	for _, value := range nums{
		countList[value]++
	}
	first := 0
	for index, value := range countList{

		for i := 0; i < value; i++{
			nums[first] = index
			first++
		}
	}
}

桶排序

将数据分到有限数量的桶里,每个桶再分别排序

稳定排序 时间复杂度n+k

func bucketSort(nums []int){
	//得到最大最小值
	minNum := nums[0]
	maxNum := nums[0]
	for _, value := range nums{
		if(value < minNum){
			minNum = value
		}
		if(value > maxNum){
			maxNum = value
		}
	}

	//分为5个桶
	bucketNum := 5
	bucketLen := (maxNum - minNum) / bucketNum
	bucket := make([][]int, bucketNum)
	//插入到桶中
	for _, value := range nums{
		index := (value - minNum) / bucketLen
		if(value == maxNum){
			index--
		}
		bucket[index] = append(bucket[index], value)
	}

	//桶内排序
	for _, bucketNums := range bucket{
		bubbleSort(bucketNums)
	}

	i := 0
	for _, bucketNums := range bucket{
		for _, num := range bucketNums{
			nums[i] = num
			i++
		}
	}
}

基数排序

与计数排序一致,也通过统计个数来实现排序。在此基础上,基数排序利用数字各位之间的递进关系,依次对每一位进行排序,从而得到最终的排序结果

稳定排序 时间复杂度n+k

字符串处理

链表

反转链表

type ListNode struct {
     Val int
     Next *ListNode
 }

func reverseList(head *ListNode) *ListNode {
    if(head == nil || head.Next == nil){
        return head
    }
    newHead := doReverse(head, head.Next)
    head.Next = nil
    return newHead
}

func doReverse(lastNode, node *ListNode) *ListNode{
    if(node.Next == nil){
        node.Next = lastNode
        return node
    }
    nextNode := node.Next
    node.Next = lastNode
    return doReverse(node, nextNode)
}

数据结构

前中后序遍历

type TreeNode struct {
      Val int
      Left *TreeNode
      Right *TreeNode
 }


func preorderTraversal(root *TreeNode) []int {
    var back []int
    doTraversal(root, &back)
    return back
}

//前序

func doTraversal(node *TreeNode, back *[]int){
    if(node == nil){
        return
    }
    *back = append(*back, node.Val)
    if(node.Left != nil){
        doTraversal(node.Left, back)
    }
    if(node.Right != nil){
        doTraversal(node.Right, back)
    }
    
}

//中序
func doTraversal(node *TreeNode, back *[]int){
    if(node == nil){
        return
    }
    
    if(node.Left != nil){
        doTraversal(node.Left, back)
    }
    *back = append(*back, node.Val)
    if(node.Right != nil){
        doTraversal(node.Right, back)
    }
    
}


//后序
func doTraversal(node *TreeNode, back *[]int){
    if(node == nil){
        return
    }
    
    if(node.Left != nil){
        doTraversal(node.Left, back)
    }
    if(node.Right != nil){
        doTraversal(node.Right, back)
    }
    *back = append(*back, node.Val)
    
}

一般都是考树结构 比如红黑树

贪心算法

回溯算法

动态规划

深度优先搜索

分治算法

LRU

topN的排序

func topN(nums []int, n int) {
	for i := 0; i < len(nums); i++ {
		if i < n {
			for k := i; k > 0; k-- {
				if nums[k] <= nums[k-1] {
					break
				}
				nums[k-1] = nums[k]
			}
		} else if nums[i] > nums[n-1] {
			nums[n-1] = nums[i]
			for k := n - 1; k > 0; k-- {
				if nums[k-1] >= nums[k] {
					break
				}
				nums[k], nums[k-1] = nums[k-1], nums[k]
			}

		}
	}
}

双指针

接雨水

func trap(height []int) (ans int) {
    n := len(height)
    if n == 0 {
        return
    }

    leftMax := make([]int, n)
    leftMax[0] = height[0]
    for i := 1; i < n; i++ {
        leftMax[i] = max(leftMax[i-1], height[i])
    }

    rightMax := make([]int, n)
    rightMax[n-1] = height[n-1]
    for i := n - 2; i >= 0; i-- {
        rightMax[i] = max(rightMax[i+1], height[i])
    }

    for i, h := range height {
        ans += min(leftMax[i], rightMax[i]) - h
    }
    return
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

还会考一些智力题

笔者就不多描述了

面试智力题精选-优快云博客

对于有一个生成1-5随机数的接口 要你实现1-7随机数的接口的问题

就是说每个值出现的概率要一样

那么就是 5 * (rand5 - 1) + rand5 这样1-25每个值出现的概率都是25分之一 

然后value % 7 

c/c++ 面试常考算法 二分查找算法int bfind(int *a,int len,int val) { int m=len/2; int l=0; int r=len; while(l!=m&&r!=m) { if(a[m]>val) { r=m; m=(l+m)/2; } if(a[m]2.在母串中查找子串出现到次数int fi 阅读详情

相关推荐

【面试常考算法】排序算法汇总~

原理性内容可参见: https://blog.youkuaiyun.com/weixin_41571493/article/details/81875088 1. 冒泡排序 相邻两个值比较,每次确定一个最值放在数据尾部 对n个值进行操作,重复n-1趟 时间复杂度O(n^2) def BubbleSort(arr): n=len(arr) if n<=1:return for i in range(n-1): for j in range(n-i-1): if arr[j]>arr[j+1]

mango_12345的博客 276

总结----20个最常见的算法面试问题

在互联网面试的过程中,有一个环节是逃不掉的,就是算法面试。一般,面试官出的面试题都是从题库里抽出来的,很少有自己出新题的(当然,算法笔试过程除外)。所以,只要我们刷题刷的足够多,就总有概率遇到原题。当然,我们也可以押题,毕竟,一些高频率的题目总是有代表性的。 本文列举了20个在计算机面试过程中经常被问到的算法题,排名不分前后,这些题目也只是代表我自己在面试过程中的体会,所以有些好题目没有加入进来也请轻喷,仅供参考。 方法 前缀和 双指针法 滑动窗口 广度、深度优先搜索 回溯法 二分法 动态规划 20个常

Gassuih的博客 3万+

面试常见基础算法题总结

面试算法题总结

算法面试题汇总

大家好,我是哪吒,一个热爱编码的Java工程师,本着“欲速则不达,欲达则欲速”的学习态度,在程序猿这条不归路上不断成长,所谓成长,不过是用时间慢慢擦亮你的眼睛,少时看重的,年长后却视若鸿毛,少时看轻的,年长后却视若泰山,成长之路,亦是渐渐放下执念,内心归于平静的旅程。 也许,我们永远都不会知道自己能走到何方,遇见何人,最后会变成什么样的人,但一定要记住,能让自己登高的,永远不是别人的肩膀,而是挑灯夜战的自己,人生的道路刚刚启程,当你累了倦了也不要迷茫,回头看一看,你早已不再是那个年少轻狂的少年。 .

学Java,找哪吒 1万+

从T型结到Wilkinson:5分钟搞懂功分器选型指南(附最新射频测试数据对比)

本文通过对比T型结、电阻型和Wilkinson三种功分器的核心原理与实测数据,提供了清晰的射频功分器选型指南。文章结合最新的2.4GHz ISM频段测试数据,分析了插入损耗、回波损耗和端口隔离度等关键指标,并针对窄带物联网、射频测试及合成系统等不同应用场景,给出了具体的选型建议和实战提醒,帮助工程师根据系统需求做出最优决策。

bush的博客 305

YOLOv8使用设备摄像头实时监测

YOLOv8使用设备摄像头实时监测

Joining667的博客 4187

面试常用算法归纳

注意:这里需要使用一个pair记录前一个dp[i]的最长子串的始末位置,在判断s[i]与s[i-1]不等时,需要继续往前判断s[i]是否包含在前一个dp[i-1]的子串中,如果在,则当前的dp[i]需要减去dp[i-1]子串的前一部分。对于二维dp的状态转移方程,大致都会是要从左、上及左上三个方向来推导,即:dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])。对于dp[i]的定义为:以s[i]为结尾的【无重复字符的最长子串】的长度。

上官宏竹的专栏 4167

基于STM32的可穿戴式多生理参数实时监测与预警系统

针对传统可穿戴健康设备存在的生理参数监测种类单一、数据处理依赖云端导致响应滞后、续航能力弱等问题,设计一种基于STM32的可穿戴式多生理参数实时监测与预警系统。系统以STM32L476RG低功耗微控制器为核心,集成心率血氧传感器、体温传感器、血压传感器,实现人体心率、血氧饱和度、体温、收缩压/舒张压的同步采集;通过边缘端轻量化数据处理算法完成参数异常判定,结合低功耗硬件设计与软件休眠策略,在保证监测精度的同时延长续航。测试结果表明,系统心率监测误差≤2次/分钟,血氧饱和度误差≤2%,体温误差≤±0.2℃,血

m0_74026776的博客 2039

图解《程序员面试常见的十大算法》及代码实现

拓扑排序是一种把有向无环图转换成线性序列的排序算法,算法的输入是一个有向无环图,经过算法分析吧图中的所有节点按照先后顺序进行拆解,最后得到一个有顺序的队列,在前的节点靠前,越靠后的节点或有多个节点指向该节点,那这个节点再队列中的位置就越靠后。注意,这里没有包含任何特征缩放或标准化的步骤,也没有实现完整的训练和分类过程,仅提供了一个可能的框架。-------------------------------------正文----------------------------------------

借雨醉东风的博客 2673

新手必看!用FFmpeg一键合并ts文件的5种方法(含Windows/Mac终端命令)

本文详细介绍了使用FFmpeg合并TS视频文件的5种实用方法,涵盖Windows和Mac终端命令操作。从基础安装到进阶技巧,包括处理音频不同步、批量处理多个视频等场景,帮助用户轻松将m3u8分片视频合并为完整mp4文件,提升视频处理效率。

weixin_29065959的博客 555

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 392

【分类整理】面试最常考的 100 道 LeetCode 算法题

100道面试常考的力扣算法题,经过众多面试者投票选出来的,快来领取!

负雪明烛 3万+

CD-HIT的使用

继续我的生信笔记系列。从某网站的附带文献中读到该工具,搜索了一下,发现网上的大佬们都在讲如何用它去冗余,相对官方页面的介绍而言很是片面,于是刚好有聚类的需求的我准备对其全体功能做做实验,学习一下由李伟忠博士在伯纳姆研究所(现为桑福德伯纳姆医学研究所)亚当·戈兹克博士的实验室开发的牛工具。 首先是官方介绍: CD-HIT是一个非常广泛使用的程序,用于蛋白质或核苷酸序列的聚类和比较。最初由李伟忠博士在伯纳姆研究所(现为桑福德伯纳姆医学研究所)亚当·戈兹克博士的实验室开发,CD-HIT速度非常快,可以处理非常

一名学术waste的note pro 1万+

前端面试常考算法题总结

前端面试常考的js算法题总结前端面试常考的js算法题总结前端面试常考的js算法题总结前端面试常考的js算法题总结

qq_48896417的博客 1658

微信小程序 - 获取当前日期时间(函数封装)

效果图 前言 摘自微信小程序demo程序中utils.js方法。 普通newDate()出来的日期时间,并不是我们想要的格式,所以要进行格式整理。 解决方案 打开utils.js文件(随意),复制以下代码: /** *获取当前时间 *@description自定义日期分钟秒数 *@param{Object}date-newData()对象 *@returnString */ functionformatTime(date){ //年月日

🏆 前端领域优质创作者 2843

CoppeliaSim和Python进行无人机联合仿真

CopeeliaSim和Python进行无人机轨迹跟踪联合仿真。首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。

加斯顿工程师的博客 986

算法工程师面试常考手撕题

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。。更多实战和面试交流,文末加入我们。

2401_84033492的博客 2207

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

面试常考排序算法超详细总结

算法基本知识铺垫 有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下: 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。 2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储 空间进行比较和交换的数据排序。 4、非原地排序:需要利用额外的数组来辅助排序。 5

m0_48643365的博客 1040

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

面试常考算法题

点击打开链接

Sailor Moon的博客 443

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

常考面试算法题类型总结(来自知乎)

作者:牛客网链接:https://www.zhihu.com/question/24964987/answer/200681301来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。常考面试算法题类型总结结合2017春招和秋招真题,以下几类算法题最常考,汇总了一下:一、暴力枚举好多鱼!DNA合成连续整数序列和01翻转最长公共连续子串组装三角形最小的矩形字符串分类优美的回文...

notOnlyRush的博客 9934

算法面试常考【手撕MHA】

MHA 是 Transformer 中最关键的一层,它的思想是:“将输入映射到多个不同的子空间(多个 Head),分别做 Attention,再拼接在一起。它的核心组件是多个 Head 并行处理。

yxx122345的博客 1091

前端面试 常考算法题合集(持续更新)

前端面试前必看,前端算法题练习,适合复习,面试前速记

cici_1_的博客 447

cpp c++面试常考算法题汇总

4.进去星球了,后续如果有什么其他活动,服务,不收费不收费(可以合理赚钱就收取下星球费用,但是不割韭菜,保持初心)希望看到的人,能够对他的学习、工作有帮助,同时也希望有能力的人可以一起来完善此文档,让它可以发挥出更大的价值。实际的 std::unique_ptr 还包括更多的功能,例如自定义删除器、数组支持等。2.大家如果需要简历指导,心里迷茫需要疏导都可以进行预约周六一对一辅导。定义基类的成员是函数指针,用于实现多态。手写c++的unique_ptr。手写c++的shared_ptr。

weixin_52259848的博客 530

4-2 Python面试常考算法

一、算法常考点 排序+查找,重中之重 1.常考排序算法:冒泡排序、快速排序、归并排序、堆排序 2.线性查找、二分查找等 3.能独立实现代码(手写),能够分析时间空间复杂度 二、常用排序算法时空复杂度 排序算法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n^2) O(n^2) 稳定 O(1) 选择排序 O(n^2) O(n^2) 不稳定 `O(1) 插入排序 O(n^2) O(n^2) 稳定 `O(1) 快速排序 O(n^2) O(n*log2n) 不稳定 O

元文的博客 5159

算法面试常考知识点

1、动态规划介绍 2、红黑树 3、哈希函数设计?哈希冲突的处理方法? 4、常见排序算法?时间复杂度?基本原理?手撕快排? 5、最短路算法介绍?如何优化 6、10亿行32位无符号整数,找出第7亿大的数是多少?只给300M内存 7、扫雷写一个随机埋n个雷的算法(洗牌算法原理) 8、链表反转?第m到第n个?每隔k个 9、一个n位数,现在可以删除其中任意k位,使得剩下的数最小(前导零忽略)? 10、有符号大数链表加法,靠近头结点为高位? 11、二叉树中序便利后继结点? 12、无向图的联通块? 13、手撕并查集? 1

Ternence_zq的博客 1849
上一篇: 常用中间件合集
下一篇: 容器化技术
卜睵·-嗳
博客等级 码龄5年 76粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值