数据结构与算法之链表: LeetCode 141. 环形链表 (Ts, Py, Go版)

数据结构和算法TS:以TypeScript(完整)实现的数据结构和算法 TypeScript中的数据结构和算法 主题概述 算法复杂度分析 大O符号 时间复杂度 空间复杂度 数据结构 数组 哈希表 堆栈 s列 链表 树木 图表 演算法 递归 动态编程 比较排序 合并排序 快速排序 正在搜寻 线性搜寻 二元搜寻 BFS和DFS 环境 迪诺1.2.1 V8 8.5.216 打字稿3.9.2 资源资源 策划文章 立即下载

环形链表

  • https://leetcode.cn/problems/linked-list-cycle/

描述

  • 给你一个链表的头节点 head ,判断链表中是否有环。

  • 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

  • 如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示

  • 链表中节点的数目范围是 [0, 10410^4104]
  • -10510^5105 <= Node.val <= 10510^5105
  • pos 为 -1 或者链表中的一个 有效索引

Typescript 版算法实现

1 )方案 1

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function hasCycle(head: ListNode | null): boolean {
    let p1 = head; // 单位1的速度指针
    let p2 = head; // 单位2的速度指针
    // while循环如果是环,则条件会一直为真,最终一定会相逢,即走到if中
    // while循环中如果走到了尽头,则会跳过while, 直接 return false
    while(p1 && p2?.next) {
        p1 = p1.next;
        p2 = p2.next.next;
        // 指针重逢意味着相逢,相逢意味着闭环
        if(p1 === p2) {
            return true;
        }
    }
    return false;
};
  • 这里需要注意的是,题目示例中给定 pos, 但并不是作为算法的输入参数
  • 这一点是比较迷惑的一点,如果示例中没有相关参数,则不能参与运算
  • 解题思路
    • 两个人在圆形操场上的起点同时起跑,速度快的人一定会超过速度慢的人一圈或多圈
    • 用一快一慢两个指针遍历链表,如果指针能够相逢,那么链表就有环
    • 慢指针,一次走一步;快指针,每次走两步
  • 解题步骤
    • 用一快一慢两个指针遍历链表,如果指针能够相逢,就返回true
    • 遍历结束后,还没有相逢就返回false

2 )方案2

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function hasCycle(head: ListNode | null): boolean {
  // 慢指针
  let slow = head
  // 快指针
  let fast = head?.next
  while (true) {
    // 边界判断
    if (!fast || !fast.next) {
      return false
    }
    // 快慢走到一起,或者快的变成慢的前驱
    if (fast === slow || fast.next === slow) {
      return true
    }
    // 正常走
    slow = slow.next
    fast = fast.next.next
  }};
  • 方案1的形式可以更快一些,因为快指针比慢指针多走一步, 设计的时候就是一步之差
  • 也就是说如果有环的话,那么快指针可能会变成慢指针的前驱,这样可以提前结束
  • 方案2是方案1写法上的优化, 增加了一些情况判断,减少了一些循环操作

3 )方案 3

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function hasCycle(head: ListNode | null): boolean {
    while (head?.next) {
        const node = head.next // 临时存储当前节点的下一个节点
        if (node === head) return true // 当前节点的下一个节点是自己,检测到闭环
        head.next = head // 将当前节点赋值给当前节点的下一个节点
        head = node // 将当前节点的下一个节点赋值给当前节点
    }
    return false
};
  • 上述是官方示例,思路是基于一个点的移动,来判断是否可以找到自己
  • 找到自己,则闭环,找不到或者没有后继,则不是闭环

4 )方案 4

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function hasCycle(head: ListNode | null): boolean {
    let cursor = head // 初始化游标,赋值为头部节点
    const map = new Map() // 初始化Map存储结构
    while (cursor) {
        if (map.has(cursor)) return true // 检测到游标已经存在,则闭环
        map.set(cursor, true) // 存储更新游标
        cursor = cursor.next // 移动游标
    }
    return false
};
  • 以上也是官方提供的示例程序
  • 利用map存储的唯一性,来检测是否是闭环
  • 这个方法效率非常好

Python3 版算法实现

1 ) 方案1

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        if not head or not head.next:  
            return False  
        
        p1 = head  # 单位1的速度指针  
        p2 = head  # 单位2的速度指针  
        
        # while循环如果是环,则条件会一直为真,最终一定会相逢,即走到if中  
        # while循环中如果走到了尽头,则会跳过while, 直接 return False  
        while p1 and p2:  # 先检查 p2 是否为 None  
            p1 = p1.next  
            if p2.next:  # 确保 p2 不是 None 后才访问 p2.next  
                p2 = p2.next.next  
            else:  
                break  # 如果 p2 是 None,则跳出循环  
            
            # 指针重逢意味着闭环  
            if p1 == p2:  
                return True  
        
        return False 

2 ) 方案2

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        # 慢指针  
        slow = head  
        # 快指针  
        fast = head.next if head else None
        while fast and fast.next:  
            # 边界判断  
            if fast == slow or fast.next == slow:  
                return True  
            # 正常走  
            slow = slow.next  
            fast = fast.next.next  
        
        # 如果没有相遇,则不存在环  
        return False  

3 ) 方案3

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        if not head or not head.next:  
            return False  
        
        while head.next:  
            node = head.next  # 临时存储当前节点的下一个节点  
            if node == head:  # 当前节点的下一个节点是自己,检测到闭环  
                return True  
            head.next = head  # 将当前节点的下一个节点指向自己  
            head = node  # 移动到下一个节点  
        
        return False  

4 ) 方案4

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        cursor = head  # 初始化游标,赋值为头部节点  
        node_map = set()  # 使用集合替代 Map,因为只需要检查元素是否存在  
        
        while cursor:  
            if cursor in node_map:  
                return True  # 检测到游标已经存在,则闭环  
            node_map.add(cursor)  # 存储更新游标  
            cursor = cursor.next  # 移动游标  
        
        return False  

Golang 版算法实现

1 ) 方案1

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool { 
	if head == nil || head.Next == nil {  
		return false  
	}  
  
	p1 := head  
	p2 := head  
  
	for p1 != nil && p2 != nil && p2.Next != nil {  
		p1 = p1.Next  
		p2 = p2.Next.Next  
  
		if p1 == p2 {  
			return true  
		}  
	}  
  
	return false  
} 

2 ) 方案2

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func hasCycle(head *ListNode) bool {  
	// 慢指针  
	slow := head  
	// 快指针  
	fast := head  
  
	// 初始时快指针先走一步  
	if fast != nil {  
		fast = fast.Next  
	}  
  
	// 当快指针为空或快指针的下一个节点为空时,说明链表没有环  
	for fast != nil && fast.Next != nil {  
		// 快慢指针相遇,说明有环  
		if slow == fast || slow == fast.Next {  
			return true  
		}  
		// 快慢指针各自移动  
		slow = slow.Next  
		fast = fast.Next.Next  
	}  
  
	// 遍历完链表都没有相遇,说明没有环  
	return false  
} 

3 ) 方案3

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func hasCycle(head *ListNode) bool {  
	for head != nil && head.Next != nil {  
		node := head.Next // 临时存储当前节点的下一个节点  
		if node == head {  
			return true // 当前节点的下一个节点是自己,检测到闭环  
		}  
		head.Next = head // 将当前节点赋值给当前节点的下一个节点  
		head = node      // 将当前节点的下一个节点赋值给当前节点  
	}  
	return false  
} 

4 ) 方案4

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func hasCycle(head *ListNode) bool {  
	cursor := head        // 初始化游标,赋值为头部节点  
	nodeMap := make(map[*ListNode]bool) // 初始化map存储结构  
  
	for cursor != nil {  
		if _, exists := nodeMap[cursor]; exists {  
			return true // 检测到游标已经存在,则闭环  
		}  
		nodeMap[cursor] = true // 存储更新游标  
		cursor = cursor.Next // 移动游标  
	}  
  
	return false  
}
linked-list-ts:打字稿链表实现 立即下载

相关推荐

Augustus手动安装教程

本文记载了如何结合conda手动安装Augustus

m0_65437087的博客 1259

链表:自引用结构

链表: 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。 例: #include typedef struct student {

和光official的博客 1297

Microsoft Speech SDK 使用过程中女声改为男声遇到的问题

问题将女生改为系统自带男声(Kangkang)根据上面的步骤我的播放声音是改变了,但是还是女生,是yaoyao的女生。是因为下面注册表路径中VoicePath这个配置的路径指向了yaoyao的文件。 如何使用Microsoft Speech SDK,请参考https://blog.csdn.net/daoming1112/article/details/77542562 使用系统自带男声语音,不需...

u012161365的博客 7540

TS:链表

class Node { constructor(data){ this.data = data; this.next = null; } } class LinkedList { constructor(head){ if(typeof head === 'undefined'){ this.length = 0; this.head = null; }else{ this.length = 1; this.head = new Node(head); }

大空翼 つばさ 1029

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 515

如何使用Calibre PERC抽出 点到点/p2p 电阻

@[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS

kobayashiyou的博客 1万+

typescript常见数据结构与算法

吸取了之前刷题的教训,近期系统的学习了下数据结构,并理解性的对常用的数据结构进行封装,颇有收获。

一缕阳光@的博客 1510

ZYNQ USB按键读写操作详解:从裸机到Linux系统的完整实现

USB接口在现代嵌入式系统中扮演着至关重要的角色,而按键作为最基础的人机交互设备,其与USB的结合能够实现丰富的应用场景。这种实现不仅适用于简单的键盘应用,还可以扩展为游戏控制器、专业输入设备或工业控制面板,展现了ZYNQ在嵌入式USB应用中的强大灵活性。:USB控制器需要准确的时钟源,通常使用外部33MHz晶振,并在Vivado中正确配置。结合ZYNQ的PL(可编程逻辑)和PS(处理系统)优势,可以创建创新的USB按键应用。本文详细介绍了在ZYNQ平台上实现USB按键读写的完整方案,涵盖了从。

QQ_778132974的博客 379

LeetCode题解链表篇(TS版)

时间复杂度:初始化O(1),get消耗O(index),addAtHead消耗O(1),addAtTail消耗O(1),addAtIndex消耗O(index)。空间复杂度:所有函数单词调用的空间复杂度均为O(1),总体空间复杂度O(n),其中n为addAtHead,addAtTail和addAtIndex的调用次数之和。示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

Leon_Chenl的博客 925

1、电路分析知识全解析:从基础到实践应用

本博客全面解析电路分析知识体系,涵盖从基础的电压、电流、电阻概念到复杂的交流电路、瞬态分析和高级应用如滤波器与变压器等内容。适合电子技术专业学生和技术爱好者学习,提供详细的知识结构、学习路径、实践示例以及丰富的学习资源,包括计算机模拟工具Multisim和PSpice的使用指导。通过理论与实践结合,帮助学习者掌握电路分析的核心技能,为电子工程和电力系统等相关领域打下坚实基础。

iii12的专栏 159

SIWAVE+ADS提取PCB走线寄生参数

本文将介绍一种很适合PCB走线提取寄生电感等参数的方法,即是通过SIWAVE将PCB走线的S参数提取出来,再通过ADS将S参数转换成电感、电容值。

sinat_15150363的博客 1766

doocs/leetcode 中 LeetCode 141 环形链表:哈希表判环与 Floyd 快慢指针双解法

本篇基于 [LeetCode 题解仓库](https://link.gitcode.com/i/07033f12df10e3afb0127ef364663c77) 中 141. Linked List Cycle 的完整题解,系统讲解“链表是否有环”这一经典判环问题:先给出基于哈希表记录的直观解法(时间、空间均为 O(n)),再深入剖析仓库中给出的 Floyd 快慢指针解法(时间 O(n)、空间

gitblog_00694的博客 920

2xmax96717+max96724+agx orin驱动代码

说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出

mantouyouyou的博客 115

告别手动重启:Pitchfork自动重启与故障恢复机制完整教程

还在为服务崩溃后手动敲 `restart` 命令而烦恼?[Pitchfork](https://link.gitcode.com/i/4c3c92e4532842f6e5604aa81fb1be44) 是一款主打 "Daemons with DX" 的守护进程管理工具,它内置**自动重启**与**故障恢复**机制:进程崩溃后按策略自动拉起、健康检查失败自动重启、重试次数耗尽自动告警。本文用最少配置

gitblog_00382的博客 208

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode 142 环形链表 II 题解:Floyd 判圈算法如何 O(1) 空间定位环的入口节点

本文基于 doocs/leetcode 仓库中 [142. 环形链表 II](https://link.gitcode.com/i/9aa3fa873016c83d18c15dffb447e2c6) 的完整题解展开,系统讲解如何利用快慢指针(Floyd 判圈算法)在 `O(n)` 时间、`O(1)` 空间内找到链表开始入环的第一个节点,并完整给出该算法背后的数学推导过程与 Python、Java、

gitblog_01009的博客 458

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LeetCode 142 环形链表 II:Floyd 快慢指针定位环入口的数学推导与多语言实现(doocs/leetcode 题解详解)

本篇围绕 LeetCode 142「环形链表 II(Linked List Cycle II)」展开,讲解如何在判断链表有环的基础上,进一步返回**环的入口节点**。文章以 doocs/leetcode 仓库中 [0142.Linked List Cycle II](https://link.gitcode.com/i/b89b6f76a5be759ba02a7b5a37fec1f0) 的官方题解

gitblog_00285的博客 216

计算机控制技术及应用

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

剑指 Offer II 022 链表中环的入口节点:快慢指针与 Floyd 判圈算法深度解析(doocs/leetcode)

本文围绕 doocs/leetcode 仓库中《剑指 Offer(第 2 版)》的 [lcof2/剑指 Offer II 022. 链表中环的入口节点](https://link.gitcode.com/i/84aab194df181d2be42672aaeae09ba2) 展开,系统讲解如何在只遍历链表、不修改链表的前提下,用 O(1) 空间定位环的入口节点。读完本文,你将掌握 Floyd 判圈

gitblog_00869的博客 191

(爆)重写目前做过的81道LeetCode题目

从6月份我的Leetcode计划两个月以来,明显的感觉到了Python熟练度有所提升,这两个月的时间,断断续续做了大概100道题,在博客上目前记录的有82道,有些数据结构和算法的题目,包括一些技巧其实还不是很熟练。对于应届生来说,算法基础还是最重要的一部分。 同时我不太满足于仅有的Python水平的提升,并不是贪多,而是觉得语言是相通的,Python仍是我接触很多语言以来最喜欢的语言,我也想...

eswang的优快云博客 597

downkyi B站视频下载工具:8K原画质批量保存全搞定,但已于2026年7月永久关停

"稍后再看"越堆越长,想离线保存的 B站视频又没法留在手机里。**downkyi**(哔哩下载姬)就是为这个场景做的免费开源 **B站视频下载** 工具。但先说在前面:这个项目 2026 年 7 月已停止维护、永久关停。下面是它曾经能做什么,以及它为什么没了。 ## 第一次打开它:贩卖机与在线解析 🎰 它一开始是纯开源的,装起来一条命令。 ```bash git clone https:/

gitblog_00835的博客 754

快乐数判定算法全解:哈希表模拟与 Floyd 判圈双方案剖析(doocs/leetcode 题解 202)

本篇技术指南以 doocs/leetcode 仓库中 [202. Happy Number 英文题解](https://link.gitcode.com/i/2c7e5f9b2cad9898dc56e30a4483a0f3)(及对应[中文题解](https://link.gitcode.com/i/475e745b67a2d2c960e5552fb90dd6f6))为主体,系统剖析"快乐数"判定的

gitblog_00086的博客 89

BambuStudio 完全指南:从安装到批量打印的3D打印切片教程

BambuStudio 是一款开源3D打印切片软件,为 Bambu Lab 打印机专门优化,同时也兼容其他主流品牌。它负责"模型文件"到"G-code"之间的全部环节:切片、参数调校、打印任务管理。本文按安装、参数手册、排障、批量工作流的顺序讲完,新手可以照着做出第一件合格打印。 ## 🧭 选型:项目定位与适用场景 BambuStudio 的切片核心与 PrusaSlicer 同源(Prus

gitblog_00101的博客 572

剑指 Offer II 023 两个链表的第一个重合节点:双指针 O(1) 空间求解链表相交问题

本文围绕 doocs/leetcode 仓库中《剑指 Offer(专项突破版)》第 023 题「两个链表的第一个重合节点」展开,系统讲解链表相交问题的判定方法、双指针解法原理及其与 LeetCode 160 题的对应关系。读完本文,你将掌握在不破坏链表原始结构、仅用 O(1) 额外空间的前提下,用双指针在 O(m+n) 时间内定位两个链表第一个公共节点的完整方案,并能直接复用仓库中 Python

gitblog_01094的博客 222

常见数据结构和算法(Typescript)

线性结构由n个元素组成的。常用的线性结构有:线性表,栈,队列,双队列,数组。数组的内存是连续的,因此在知道下标的情况下,访问效率是很高的。(早起JavaScript的数组内存实现并不是连续的。

m0_62475892的博客 743

用TS写链表

链表的基本操作

qq_44692902的博客 564

12、链表—Typescript

在Ts中,关于链表的一些基本操作,同C++类似。让我们来看看在Typescript中,我们改如何对链表进行操作。

m0_74768094的博客 241

【Hello 算法】链表

内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势就体现出来了。「链表 linked list」是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。链表的设计使得各个节点可以分散存储在内存各处,它们的内存地址无须连续。

执土的博客 1100
上一篇: 数据结构与算法之链表: LeetCode 83. 删除排序链表中的重复元素 (Ts, Py, Go版)
下一篇: Vue3源码梳理:watch监听函数的核心实现
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值