前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i

2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i

作者头像
福大大架构师每日一题
发布于 2025-04-01 02:11:55
发布于 2025-04-01 02:11:55
7100
代码可运行
举报
运行总次数:0
代码可运行

2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i 和 j(i < j)中,若能通过至多一次的操作使得 nums[i] 与 nums[j] 相等,我们称这对数是近似相等的。这个操作包括选择其中一个数,并交换它的两个数字位。请计算并返回这样的近似相等数对的数量。

注意:进行操作后,数字可能出现前导零。

2 <= nums.length <= 100。

1 <= nums[i] <= 1000000。

输入:nums = [3,12,30,17,21]。

输出:2。

解释:

近似相等数对包括:

3 和 30 。交换 30 中的数位 3 和 0 ,得到 3 。

12 和 21 。交换12 中的数位 1 和 2 ,得到 21 。

题目来自leetcode3265。

大体步骤如下:

  1. 1. 初始化数据结构:
    • • 创建一个计数器 cnt,用于记录每个数字在遍历过程中的出现次数。
    • • 初始化结果变量 ans 用于存储最终的近似相等对的数量。
  2. 2. 对数组进行排序:
    • • 将输入的数组 nums 进行升序排序。这将使得相等的数字在排序过程中相邻,减少后续比较的复杂性。
  3. 3. 遍历数组:
    • • 对排序后的数组 nums 进行迭代,逐一考虑每个数字 x
    • • 为当前数字 x 创建一个集合 set,用于存储在本次迭代中,原始数字和通过交换得到的数字。
  4. 4. 生成近似数:
    • • 将当前数字 x 转换为字符串,以便进行位交换。
    • • 使用嵌套循环遍历字符串的每一对不同位,执行交换操作:
      • • 交换数字中的两个字符(位)。
      • • 在交换后,将新的数字转换回整数并加入集合 set
      • • 交换回去,以恢复原始数字的状态,继续进行下一个交换操作。
  5. 5. 统计相似对:
    • • 对当前的 set 中的每一个数字,如果该数字在计数器 cnt 中存在,说明之前有这样的数字出现过,则将重复的次数累加到 ans 中。
  6. 6. 更新计数器:
    • • 在处理完每个数字后,将当前数字 x 的计数在 cnt 中加一。
  7. 7. 返回结果:
    • • 遍历完成后,返回记录的总数 ans,即找出的近似相等数对的数量。

复杂度分析

  • 时间复杂度:
    • • 假设输入数组的长度为 n,对数组进行排序的时间复杂度为 O(n log n)。
    • • 外层遍历数组的时间复杂度为 O(n)。
    • • 对于每个数字,内层的双重循环生成近似数的复杂度为 O(m^2),其中 m 为该数字的位数,最大为 7(因为1 <= nums[i] <= 1000000)。
    • • 因此,时间复杂度可大致估算为 O(n * m^2),在最坏情况下,m 最大为 7,整体时间复杂度可以简化为 O(n)。
  • 空间复杂度:
    • • 使用了一个哈希表 cnt 来存放数字的计数,最坏情况下其大小为 O(n)。
    • • 另一个集合 set 用于存储通过交换生成的数字,最坏情况下也为 O(n)。
    • • 所以总的额外空间复杂度为 O(n)。

总结:

  • • 总的时间复杂度:O(n)
  • • 总的额外空间复杂度:O(n)

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "slices"
    "strconv"
)

func countPairs(nums []int) (ans int) {
    slices.Sort(nums)
    cnt := map[int]int{}
    for _, x := range nums {
        set := map[int]struct{}{x: {}} // 不交换
        s := []byte(strconv.Itoa(x))
        m := len(s)
        for i := range s {
            for j := i + 1; j < m; j++ {
                s[i], s[j] = s[j], s[i]
                set[atoi(s)] = struct{}{} // 交换一次
                s[i], s[j] = s[j], s[i]
            }
        }
        for x := range set {
            ans += cnt[x]
        }
        cnt[x]++
    }
    return
}

// 手动转 int 快一些
func atoi(s []byte) (res int) {
    for _, b := range s {
        res = res*10 + int(b&15)
    }
    return
}


func main() {
    nums := []int{3,12,30,17,21}
    result := countPairs(nums)
    fmt.Println(result)
}

Python完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*-coding:utf-8-*-

defcount_pairs(nums):
    nums.sort()
    cnt = {}
    ans = 0

    for x in nums:
        set_x = {x}  # 不交换
        s = list(str(x))

        m = len(s)
        for i inrange(m):
            for j inrange(i + 1, m):
                # 交换两个数字位
                s[i], s[j] = s[j], s[i]
                set_x.add(atoi(s))  # 交换一次
                # 交换回去
                s[i], s[j] = s[j], s[i]

        for x in set_x:
            ans += cnt.get(x, 0)
        
        # 更新计数
        cnt[x] = cnt.get(x, 0) + 1

    return ans


defatoi(s):
    res = 0
    for b in s:
        res = res * 10 + int(b)
    return res


if __name__ == "__main__":
    nums = [3, 12, 30, 17, 21]
    result = count_pairs(nums)
    print(result)

我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Express 使用详情
Express 是一款基于 Node.js 的 Web 开发框架,它提供了简洁的 API,使得 Web 应用开发变得更加高效和方便。本文将详细介绍 Express 的使用方法,包括安装、基本概念、路由、中间件、模板引擎等,并给出相应的代码示例。
世间万物皆对象
2024/03/20
2290
Express框架
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。我们可以使用 npm install express 命令进行下载。
星辰_大海
2020/11/10
1.9K0
Express框架
Express框架
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。我们可以使用 npm install express 命令进行下载。
梨涡浅笑
2020/11/11
1.9K0
Express框架
Express框架快速入门
官网对这个框架的解释是:基于 Node.js 平台,快速、开放、极简的 Web 开发框架。Express的官网地址是https://www.expressjs.com.cn 。
害恶细君
2022/11/22
5.3K0
Express框架快速入门
基于Node.js的Express框架
package.json文件中的start任务 下面即表示任务运行成功
_kyle
2020/08/24
5.7K0
基于Node.js的Express框架
2024 版:Node.js+Express+Koa2+Nest.js 开发服务端(高の青)
在现代的 web 开发中,Node.js 是一种非常流行的服务器端 JavaScript 环境。我们来编写一个大致的框架和一些关键代码片段,以帮助你了解如何使用 Node.js、Express、Koa2 和 Nest.js 开发服务端应用。
百课优用户
2024/07/29
3680
08_Express框架
使用Node.js进行服务器开发,开发效率比较低,例如在实现路由功能和静态源访问功能时,代码写起来很烦琐 为了提高Node.js服务器的开发效率,人们开发了Express框架,它可以帮助开发人员快速创建网站应用程序。
张哥编程
2024/12/13
1660
08_Express框架
nodeJS之Express框架---中间件
Express框架中一个非常重要的概念——中间件。在Express框架中,允许通过中间件的使用来调用各种第三方类库,这让我们的开发工作变得更为方便,也使得我们可以开发出各种更为强大的应用程序。
IT工作者
2022/05/13
2.6K0
Node JS 中间件如何工作?
你需要安装一些东西来创建、使用和测试 Express 中间件。首先需要 Node 和 NPM。为确保已经安装,可以运行:
疯狂的技术宅
2020/02/18
3.3K0
如何在Node.js和Express中上传文件
大量的移动应用程序和网站允许用户上传个人资料图片和其他文件。 因此,在使用Node.js和Express构建REST API时,通常需要处理文件上传。
ccf19881030
2020/10/26
6.8K0
如何在Node.js和Express中上传文件
前端Express框架必学之:Node.js项目搭建与接口开发实战
Express是一个基于Node.js平台的轻量级Web应用框架,它提供了简洁的API和丰富的功能,使得开发者能够快速地构建Web服务器和API。本文将带领大家从零开始,使用Express框架搭建一个简单的Web应用。
肥晨
2024/04/24
2.3K0
前端Express框架必学之:Node.js项目搭建与接口开发实战
Express中间件,看这篇文章就够了(#^.^#)
okaychen
2018/01/05
2.1K0
Express中间件,看这篇文章就够了(#^.^#)
Express,Sequelize和MySQL的Node.js Rest API示例
本文翻译自Node.js Rest APIs example with Express, Sequelize & MySQL
ccf19881030
2020/11/10
12.9K0
Express,Sequelize和MySQL的Node.js Rest API示例
如何使用Node.js和Express实现Web应用程序中的文件上传
处理文件上传:使用Node.js和Express构建Web应用程序时,文件上传是一个常见的需求。在本教程中,您将学习如何使用Node.js和Express处理上传的文件。
zayyo
2024/02/09
5920
express新手入门指南
Node.js 已经成为 Web 后台开发圈一股不容忽视的力量,凭借其良好的异步性能、丰富的 npm 库以及 JavaScript 语言方面的优势,已经成为了很多大公司开发其后台架构的重要技术之一,而 Express 框架则是其中知名度最高、也是最受欢迎的后端开发框架。在这篇教程中,你将了解 Express 在 Node 内置 http 模块的基础上做了怎样的封装,并掌握路由和中间件这两个关键概念,学习和使用模板引擎、静态文件服务、错误处理和 JSON API,最终开发出一个简单的个人简历网站。
前端迷
2020/03/26
3.3K0
express新手入门指南
node.js:试试express
Express 框架是一个快速、开放、极简的 web 应用开发框架,用于构建灵活和强大的 web 应用和 API。它是 Node.js 平台上最流行的框架之一,因为它提供了一套丰富的功能来简化和加速 web 开发过程。
姓王者
2024/12/20
920
Nodejs之express框架的基本使用
此文是个人学习归纳的记录,腾讯云首发,未经允许,严禁转载,如有不对, 还望斧正, 感谢!
言志志
2024/04/30
2030
使用nodejs和express搭建http web服务
nodejs作为一个优秀的异步IO框架,其本身就是用来作为http web服务器使用的,nodejs中的http模块,提供了很多非常有用的http相关的功能。
程序那些事
2021/01/13
2K0
Express新手入坑笔记之动态渲染HTML
这里的public不会显示在url中, 为了方便判别静态文件的url请求, 我们在public内新建一个static文件夹, 这样所有请求静态文件的url,都会以static开头(这里借鉴了django处理静态文件的方法)
zhaoolee
2018/12/26
3.8K0
Express(一) ——简单入门
背景:参加的青训营项目,使用 Express 来实现后端,个人被分配到后端去。于是,简单速通了下 Express。项目结束,回头写下笔记,沉淀一下。
赤蓝紫
2023/01/02
3.6K0
Express(一) ——简单入门
相关推荐
Express 使用详情
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档