if (len(lis) == 1){ print lis return lis }哪里错了

时间: 2024-09-12 16:03:58 浏览: 52

您提供的代码片段存在一些不明确的地方,我将尽力进行解释。首先,这段代码看起来像是Python语言编写的,但是缺少了上下文,无法判断len(lis)是否能正确执行,因为lis是否为一个列表(list)类型并没有明确说明。如果lis是一个列表,那么使用len(lis)来获取列表长度是正确的。

然而,还有其他几点需要注意:

  1. print lis在Python 3中应该是print(lis),因为Python 3要求print语句必须使用括号。
  2. return lis语句的缩进没有显示出来,按照Python的语法,缩进必须正确以保持代码块的一致性。
  3. 这段代码似乎是在一个函数中执行的,但是没有提供函数的定义和结束部分。
  4. 如果lis是一个列表并且只包含一个元素,那么printreturn语句将会打印并返回这个列表。如果lis不为空但是包含多于一个元素,那么print语句会执行,但是return语句不会执行。

基于以上分析,如果这段代码在一个Python函数中,并且lis是一个列表,那么一个正确缩进和格式化的版本可能是这样的:

def some_function(lis):
    if len(lis) == 1:
        print(lis)
        return lis
    # 其他代码
相关问题

改正问题def repeat2(lis): if len(set(lis))<len(lis): return True b = input('请输入一个列表:') p = list(b) print(repeat2(p)) print('原来输入的列表{}'.format(p))

可以对代码进行如下修改来解决问题:

  1. 修改函数名为has_duplicate,更符合Python的命名规范。
  2. 修改input函数为eval(input()),这样可以将输入的字符串自动转换为列表,无需再手动转换。
  3. 修改输出语句,将原来输入的列表单独输出一行。

修改后的代码如下:

def has_duplicate(lst):
    if len(set(lst)) < len(lst):
        return True

lst = eval(input('请输入一个列表:'))
print(has_duplicate(lst))
print('原来输入的列表:{}'.format(lst))

这样改正后,用户可以输入任意类型的列表,而不仅仅是数字字符。同时,修改后的函数名更符合Python的命名规范,更易读易懂。

books = [[int(j) for j in i.split(',')] for i in input()[2:-2].split('],[')] books.sort(key = lambda x:(x[0],-x[1])) widths = [book[1] for book in books] def bs(tails,num): l,r = 0,len(tails) while left<right: mid = (left+right)//2 if tails[mid]<num: left = mid+1 else: right = mid return left def lis(arr): if not arr: tails = [] for num in arr: pos = bs(tails,num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails) print(lis(widths))分析代码

好的,我现在需要分析用户提供的这段Python代码。首先,我会通读整个代码,理解每个部分的功能,然后逐步解释代码的作用和执行流程。

首先,用户给了一段代码,主要是处理输入的书籍数据,然后进行排序,并计算最长递增子序列的长度。让我先拆解每一部分。

代码的第一行是: books = [[int(j) for j in i.split(',')] for i in input()[2:-2].split('],[')] 这里看起来是在处理输入。输入的格式应该是一个类似二维数组的字符串,例如"[[1,2],[3,4]]"。用户使用input()[2:-2]来去掉最外层的两个方括号和两个引号?或者可能输入是类似这样的结构,例如输入的内容被包裹在[ [...] ]中,所以[2:-2]是去掉前两个字符和后两个字符。例如,假设输入是"[[a],[b]]",那么取[2:-2]的话,得到的是"a],[b",然后用split('],[')来分割,得到['a', 'b']。这一步可能是在解析输入的每个子列表。

然后每个i.split(',')会被转换成整数,所以books变量应该是一个二维列表,每个元素是包含两个整数的列表,比如[[x1,y1], [x2,y2], ...]。

接下来是排序: books.sort(key=lambda x: (x[0], -x[1])) 这里按照每个子列表的第一个元素升序排列,如果第一个元素相同,则按第二个元素降序排列。这样排序后的结果,相同x[0]的书籍会按照x[1]从大到小排列。这可能为后续处理做准备,比如在最长递增子序列的问题中,当处理到第二个维度时,按x[0]排序后,可以避免干扰,因为相同x[0]的情况下较大的x[1]排在前面,这样在寻找递增序列时,后面的较小的数不会形成更长的序列,从而减少干扰。这可能类似于处理类似俄罗斯套娃的问题,先按一个维度排序,另一个维度处理的方式。

接下来提取widths: widths = [book[1] for book in books] 这里将每个书籍的第二个元素取出,形成一个列表widths。接下来要处理这个列表的最长递增子序列的长度。

然后定义了一个bs函数,看起来是二分查找: def bs(tails, num): l, r = 0, len(tails) while left < right: # 这里变量名可能写错了,应该是l和r而不是left和right? mid = (left + right) // 2 # 同样的问题,变量名是否应为l和r? if tails[mid] < num: left = mid + 1 else: right = mid return left 这里可能存在变量名错误,函数参数是l和r,但循环中使用了left和right。这会导致NameError,因为left和right并没有被定义。这里应该是一个笔误,正确的变量名应该是l和r。例如,正确的代码应该是: def bs(tails, num): l, r = 0, len(tails) while l < r: mid = (l + r) // 2 if tails[mid] < num: l = mid + 1 else: r = mid return l 否则,原代码中的left和right未定义,会导致错误。这可能是一个用户代码中的bug,需要注意。

接下来是lis函数的定义: def lis(arr): if not arr: tails = [] for num in arr: pos = bs(tails, num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails) 这里有一个逻辑错误,因为if not arr: 判断如果arr为空,则执行后面的代码。但是,如果arr为空,后面的for循环不会执行,tails保持为空列表,最终返回0。但是当arr不为空时,这个if块不会执行,所以函数会直接返回0,因为默认返回值是None吗?或者可能用户在这里写错了条件。例如,正确的写法应该是:

def lis(arr): if not arr: return 0 tails = [] for num in arr: pos = bs(tails, num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails)

因为原来的代码中,当arr不为空时,if not arr条件不满足,所以函数会执行到后面的代码块,但此时在函数内部没有定义tails,导致错误。或者可能用户写错了缩进,导致for循环和tails的初始化在if not arr的块内。这样,当arr非空时,lis函数中的代码块不会执行,因此tails不会被处理,函数直接返回len(tails),但此时tails未定义,会抛出错误。所以这个lis函数存在严重的逻辑错误,会导致当输入非空数组时无法正确计算,甚至报错。

例如,当调用lis([1,2,3])时,因为arr不为空,所以跳过if块,函数继续执行,但此时tails没有被初始化,后面的for循环也没有执行,直接return len(tails),而tails未被定义,导致NameError。

因此,这个lis函数是错误的,需要修正条件判断的结构。正确的逻辑应该是:如果数组为空,返回0;否则,进行正常的处理。所以正确的代码应该是:

def lis(arr): if not arr: return 0 tails = [] for num in arr: pos = bs(tails, num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails)

这样当arr非空时,初始化tails,并进行处理。原代码中的if not arr:后面的代码块中的内容只有在arr为空时执行,而当arr不为空时,这些代码不会执行,导致tails没有被处理,函数返回的len(tails)可能未被定义,从而出错。

所以用户提供的代码中存在两个错误:bs函数中的变量名错误(left和right应为l和r),以及lis函数中的条件判断错误,导致非空数组无法正确处理。

最后,代码执行print(lis(widths)),即输出widths数组的最长递增子序列的长度。但根据上面的分析,代码存在错误,需要修正后才能正确运行。

现在,整个代码的意图可能是这样的:给定一组书籍,每个书籍有两个属性,可能是宽度和高度。先将书籍按照第一个属性升序排序,第一个属性相同的按第二个属性降序排序。然后提取第二个属性组成数组,求该数组的最长递增子序列的长度。这可能是在解决类似LeetCode上的“俄罗斯套娃信封问题”或者类似的问题,其中排序后的第二个数组的最长递增子序列长度即为所求的解。

举个例子,假设输入是[[3,4], [3,5], [3,2]],排序后按第一个元素升序,第二个降序,得到[[3,5],[3,4],[3,2]],提取第二个元素得到[5,4,2],其最长递增子序列的长度为1。但正确的处理方式可能是在排序后,第二个元素的数组的最长递增子序列对应原问题中的某个维度,例如当宽度递增时,高度也递增的情况。但因为排序后的宽度已经非递减,所以高度的最长递增子序列即为所求的解。

总结代码的正确逻辑应该是:

  1. 解析输入,得到二维数组books。
  2. 对books进行排序,首先按第一个元素升序,其次按第二个元素降序。
  3. 提取排序后的每个元素的第二个元素,组成widths数组。
  4. 计算widths数组的最长递增子序列的长度,并输出。

但由于代码中存在上述错误,导致无法正确运行。需要修正bs函数中的变量名错误和lis函数的逻辑错误。

现在,用户希望我们分析这段代码。所以需要指出这些错误,并解释正确的逻辑。让我们逐步分析这段代码的功能及存在的问题:

代码功能解析

  1. 输入处理books = [[int(j) for j in i.split(',')] for i in input()[2:-2].split('],[')]

    • 输入格式应为嵌套列表字符串,例如:"[[1,2],[3,4]]"
    • 去掉首尾的[[]]后,按],[分割成子列表,最终转换为二维整数列表
  2. 排序逻辑books.sort(key=lambda x: (x[0], -x[1]))

    • 按第一个元素升序,第二个元素降序排列
    • 目的:固定第一个维度后,第二个维度的最长递增子序列即为最终解(类似俄罗斯套娃问题)
  3. 提取宽度widths = [book[1] for book in books]

    • 提取排序后的第二个元素组成新列表
  4. **最长递增子序列(LIS)**:

    def bs(tails, num):
        l, r = 0, len(tails)
        while l < r:  # 原代码此处变量名错误
            mid = (l + r) // 2
            if tails[mid] < num:
                l = mid + 1
            else:
                r = mid
        return l
    
    def lis(arr):
        if not arr: return 0  # 原代码此处逻辑错误
        tails = []
        for num in arr:
            pos = bs(tails, num)
            if pos == len(tails):
                tails.append(num)
            else:
                tails[pos] = num
        return len(tails)
    
    • 通过二分查找优化LIS算法,时间复杂度O(nlogn)
  5. 最终输出print(lis(widths))

存在的错误

  1. 变量名拼写错误

    # 原代码
    while left < right:  # ❌ 未定义的变量 left/right
    # 应改为
    while l < r:         # ✅
    
  2. 逻辑判断错误

    # 原代码
    if not arr:          # ❌ 当 arr 非空时跳过处理
        tails = []
        for num in arr:  # 此处循环永远不会执行
    # 应改为
    if not arr: return 0 # ✅
    tails = []
    

修正后的代码

# 输入解析
books = [[int(j) for j in i.split(',')] for i in input()[2:-2].split('],[')]

# 排序逻辑
books.sort(key=lambda x: (x[0], -x[1]))

# 提取第二维度
widths = [book[1] for book in books]

# 二分查找工具函数
def bs(tails, num):
    l, r = 0, len(tails)
    while l < r:
        mid = (l + r) // 2
        if tails[mid] < num:
            l = mid + 1
        else:
            r = mid
    return l

# LIS计算
def lis(arr):
    if not arr:
        return 0
    tails = []
    for num in arr:
        pos = bs(tails, num)
        if pos == len(tails):
            tails.append(num)
        else:
            tails[pos] = num
    return len(tails)

# 输出结果
print(lis(widths))

执行示例

输入:[[1,2],[3,4],[5,6]]

  1. 解析后得到 books = [[1,2], [3,4], [5,6]]
  2. 排序保持不变
  3. 提取 widths = [2, 4, 6]
  4. LIS长度为3 → 输出 3

算法意义

这种排序+LIS的组合是解决二维偏序问题的经典方法,时间复杂度为$O(n\log n)$,适用于类似「俄罗斯套娃信封问题」的场景。

向AI提问 loading 发送消息图标

相关推荐

import requests import parsel import re import csv import time import random # 创建CSV文件 f = open('data.csv', mode='w', encoding='utf8', newline='') csv_writer = csv.DictWriter(f, fieldnames=[ '标题', '售价', '单价', '小区', '区域', '户型', '面积', '朝向', '装修', '楼层高度', '楼层数', '建筑结构', '年份', '详情页' ]) csv_writer.writeheader() # 随机User-Agent列表 headers_list = [ { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}, { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15'} ] for page in range(1, 101): try: print(f'========正在采集第{page}页的内容=========') url = f'https://tj.lianjia.com/ershoufang/pg{page}/' # 随机请求头 + 延迟 headers = random.choice(headers_list) time.sleep(random.uniform(1, 3)) # 发送请求 response = requests.get(url=url, headers=headers) response.encoding = 'utf-8' # 强制编码 html = response.text # 解析数据 selector = parsel.Selector(html) lis = selector.css('.sellListContent li') # 修正选择器 for li in lis: try: title = li.css('.title a::text').get() href = li.css('.title a::attr(href)').get() totalPrice = li.css('.totalPrice span::text').get() unitPrice = li.css('.unitPrice::attr(data-price)').get() # 处理小区和区域 positionInfo = li.css('.positionInfo a::text').getall() community = positionInfo[0] if len(positionInfo) > 0 else '未知' area = positionInfo[1] if len(positionInfo) > 1 else '未知' # 处理房屋信息 houseInfo_raw = li.css('.houseInfo::text').get() if houseInfo_raw: houseInfo = houseInfo_raw.split('|') houseType = houseInfo[0].strip() if len(houseInfo) > 0 else '未知' 帮我

最新推荐

recommend-type

如何通过python实现全排列

if len(lis) &lt;= 1: return [lis] result = [] for i in range(len(lis)): s = lis[:i] + lis[i + 1:] sub_permutations = perm(s) for sub_permutation in sub_permutations: result.append([lis[i]] + sub...
recommend-type

2023-04-06-项目笔记 - 第四百四十六阶段 - 4.4.2.444全局变量的作用域-444 -2025.03.23

2023-04-06-项目笔记-第四百四十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.444局变量的作用域_444- 2025-03-23
recommend-type

第三章 Matlab基本语法练习题.docx

第三章 Matlab基本语法练习题.docx
recommend-type

医学图像分割数据集:4种显微镜下的细胞目标图像语义分割数据集(约1000张数据和标签)

医学图像分割数据集:4种显微镜下的细胞目标图像语义分割数据集(约1000张数据和标签) 【5类别的分割】:背景:0 上皮细胞:1 淋巴细胞:2 中性粒细胞:3 巨噬细胞:4(具体参考classes文件 ) 数据集介绍:【已经划分好】 训练集:images图片目录+masks模板目录,737张左右图片和对应的mask图片 验证集:images图片目录+masks模板目录,315张左右图片和对应的mask图片 除此之外,包含一个图像分割的可视化脚本,随机提取一张图片,将其原始图片、GT图像、GT在原图蒙板的图像展示,并保存在当前目录下 医学图像分割网络介绍:https://blog.csdn.net/qq_44886601/category_12102735.html 更多图像分割网络unet、swinUnet、trasnUnet改进,参考改进专栏:https://blog.csdn.net/qq_44886601/category_12803200.html
recommend-type

深入解析网络原理RFC文档全集

网络原理RFC文档详解的知识点可以分为以下几部分: ### 1. 网络协议基础 网络协议是计算机网络中进行数据交换而建立的规则、标准或约定。在网络原理的学习中,协议是非常重要的部分。RFC文档(Request For Comments,请求评论)是由互联网工程任务组(IETF)发布的一系列备忘录,记录了各种互联网协议的设计、行为、研究和创新。了解RFC文档可以帮助我们更深入地理解网络原理,比如IP、TCP、UDP等常见协议的工作机制。 ### 2. RFC文档的结构和内容 RFC文档通常包括标题、状态(标准、草案等)、日期、作者、摘要、目录、正文和参考文献等部分。文档详细解释了协议的各个方面,包括协议的设计目标、数据格式、状态机、操作过程、安全性考虑等。对于网络工程师和开发者而言,RFC文档是学习和开发网络应用的重要参考资料。 ### 3. 网络协议族和RFC 网络协议按照功能和层次可以分为不同的协议族,例如TCP/IP协议族。RFC文档涵盖了这一协议族中几乎所有的协议,包括但不限于以下内容: #### 3.1 网络层协议 - **IP协议(RFC 791)**:定义了互联网中数据包的格式和路由方式。 - **ICMP协议(RFC 792)**:用于在IP主机、路由器之间传递控制消息。 - **ARP协议(RFC 826)**:地址解析协议,将网络层地址解析成链路层地址。 #### 3.2 传输层协议 - **TCP协议(RFC 793)**:传输控制协议,提供面向连接的、可靠的数据传输服务。 - **UDP协议(RFC 768)**:用户数据报协议,提供无连接的、不可靠的传输服务。 #### 3.3 应用层协议 - **HTTP协议(RFC 2616等)**:超文本传输协议,用于万维网数据传输。 - **FTP协议(RFC 959)**:文件传输协议,用于文件的上传和下载。 - **SMTP协议(RFC 5321)**:简单邮件传输协议,用于邮件发送。 - **DNS协议(RFC 1035)**:域名系统,用于将域名转换成IP地址。 ### 4. RFC文档的应用和实践 网络工程师、开发人员、系统管理员和其他IT专业人员通常需要阅读RFC文档来了解特定技术的具体实现细节。例如,设计一个网络服务时,需要参考相关协议的标准RFC来确保服务的兼容性和可靠性。在遇到网络问题时,RFC文档也可以提供权威的故障排除信息。 ### 5. 如何获取和理解RFC文档 RFC文档是公开的,并且可以从互联网工程任务组(IETF)的官方网站免费获取。对于非专业人员来说,直接阅读RFC文档可能会有一定难度,因为它们通常包含大量的技术术语和细节描述。为了更好地理解和应用RFC文档,可以通过网络课程、专业书籍和实践操作相结合的方式来学习。 ### 6. RFC文档对网络研究的影响 RFC文档是网络技术研究的基础,它们不仅提供了网络协议的详细规范,而且还有助于新的网络技术和应用的发现。学术研究者和工程师通过分析和改进现有的RFC标准,能够推动网络技术的进步。 通过以上对网络原理RFC文档的详细介绍,我们可以看出,RFC文档不仅为网络行业提供了一个开放、共享和权威的知识库,而且它也是网络技术不断进步和发展的基石。掌握RFC文档的知识,对于从事网络相关工作的专业人士来说,无疑是一种重要的技能和财富。
recommend-type

【PLC流水灯设计全面攻略】:从理论到实践,专家带你实现零故障控制系统

# 摘要 本文系统介绍了PLC(可编程逻辑控制器)流水灯的设计、硬件接线技术、编程实现及深入应用。首先,概述了流水灯设计的理论基础和PLC硬件的基本组成、工作原理以及硬件选型与配置。接着,重点探讨了PLC编程基础、控制逻辑的设计、编程语言的选择与使用,以及流水灯控制程序的编写与调试。此外,文章还分析了特殊流水灯效果的实现、流水灯在自动化生产线的应用案例,以及故障诊断与维护。最后,针对当前技术趋势和挑战,展望了PLC流水灯设计的创新方向,包括智能控制系统的融合与面向未来的系统设计展望。 # 关键字 PLC;流水灯设计;硬件接线;编程实现;故障诊断;自动化生产线 参考资源链接:[基于PLC的流
recommend-type

针对你range 代码生成效果图

在Python中,`range()` 函数用于生成一系列数字,常与其他循环结构一起使用来完成迭代操作。虽然 `range()` 本身并不直接生成“效果图”,但我们可以将它和数据可视化库(如 Matplotlib 或 Seaborn)结合起来,创建基于范围值的数据分布图表。 下面是一个简单的例子,展示如何通过 Python 的 `matplotlib.pyplot` 模块配合 `range()` 来绘制一条直线并标记点的位置: ```python import matplotlib.pyplot as plt # 使用 range() 创建 x 轴数值序列 x_values = list(
recommend-type

自定义圆角ListView布局及点击效果解析

标题“CornerListviewDemo”指的是一个Demo程序,这个Demo展示了一种对ListView组件进行定制的实现,旨在根据ListView中项的多少以及布局,动态改变列表项的角的形状。这个Demo的开发和实现涉及到Android开发中的UI定制、布局文件编写以及可能的Java或Kotlin编程。 在描述中提到的行为是,ListView在不同数据量下展现不同的视觉效果。具体来说,当ListView只有一个列表项时,它会表现为四个角都是圆角的卡片式布局。当有两条列表项时,第一条列表项的上边角会是圆角,而第二条列表项的下边角会是圆角。最后,当列表中有多条记录时,除了第一条和最后一条列表项的首尾是圆角,中间的列表项将不再具有圆角,呈现出常规的矩形形状。这种设计可以为用户提供清晰的视觉层次感,使得界面看起来更为美观。 从标签“圆角 Listview 自定义 点击效果 布局”中,可以提取出以下关键知识点: 1. 圆角效果的实现:在Android中实现圆角效果,通常可以通过XML中的shape资源来定义。例如,可以在drawble资源文件中定义一个矩形形状,并通过设置其corners属性来赋予圆角。开发者还可以通过编程方式在代码中动态地绘制圆角,例如使用canvas类的drawRoundRect方法。 2. ListView的自定义:ListView是Android中用于展示滚动列表的基本组件。开发者可以通过自定义Adapter来改变ListView的每项布局。在本Demo中,需要根据列表项的数量来改变ListView中每个项的圆角属性,这通常意味着需要在Adapter的getView()方法中实现逻辑,来根据条件判断并设置相应的布局属性。 3. 点击效果:ListView中的每个列表项除了展示数据外,还可以响应用户的点击事件。在Android中,为ListView设置点击效果,通常需要为ListView设置一个OnItemClickListener。点击效果可以通过设置背景资源(比如按压状态的背景)或者通过定义动画资源来实现。 4. 布局的理解和使用:在Android开发中,布局文件负责定义界面的结构。XML布局文件通过使用各种布局容器(如LinearLayout, RelativeLayout, ConstraintLayout等)来组织界面元素。自定义ListView的布局可能需要对布局结构有深入的了解,以便根据需要调整布局的属性,实现期望的视觉效果。 结合压缩包子文件名称列表中的“CornerListviewDemo”,不难推断出该文件包含了上述Demo程序的源代码或者是相关的项目文件。在该文件中,开发者可以通过查看源代码来学习和理解如何实现自定义的ListView,特别是涉及到圆角、布局定制以及点击响应等方面。 总体来说,该Demo项目对于Android开发人员来说是一个很好的学习资源,可以从中学习如何进行UI组件的定制、布局优化以及交互效果的增强。对于希望通过代码优化提升用户体验的开发者而言,该项目具有一定的参考价值。
recommend-type

【图像处理新境界】:形态学滤波与tc itk的结合使用指南

# 摘要 本文系统阐述了形态学滤波技术的理论基础、应用实践以及ITK库和tcITK框架的概述与优化。首先介绍了形态学滤波的基本操作及其高级技术,接着详细说明了如何在ITK库中集成和应用形态学滤波器,并讨论了在图像处理中的具体案例。文章还介绍了tcITK框架,它为ITK提供了扩展和性能优化,以及在特
recommend-type

watch -n 0.5 nvidia-smi

### 如何使用 `watch` 命令配合 `nvidia-smi` 实现实时监控 通过组合命令工具可以实现对 NVIDIA GPU 的实时状态监控。具体来说,`watch` 是 Linux 系统中的一个实用程序,用于定期执行指定的命令并显示其输出。当将其与 `nvidia-smi` 结合使用时,可以通过设置刷新间隔来实现实时更新。 以下是具体的实现方法: #### 使用 `watch` 和 `-n` 参数 为了使 GPU 状态每 0.5 秒刷新一次,可以运行以下命令: ```bash watch -n 0.5 nvidia-smi ``` 上述命令中,`-n 0.5` 表示每隔 0.5
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部