LeetCode 2442:统计反转后的不同整数数量

目录

核心思想:数字的“拆分”与“重组”

分步拆解(以输入 123 为例)

关键操作详解

为什么能处理中间或末尾的0?

数学本质

总结

题目描述

解题思路

代码实现

代码解析

复杂度分析

示例演示

总结


核心思想:数字的“拆分”与“重组”

假设原数字是 123,它的每一位可以表示为:

123 = 1×100 + 2×10 + 3×1

反转后的数字是 321,即:

321 = 3×100 + 2×10 + 1×1

函数通过循环逐步“拆解”原数字的每一位,再“重组”到结果中。


分步拆解(以输入 123 为例)

循环次数numnum%10(取末位)res = res*10 + 末位num = parseInt(num/10)
初始值123-0-
第一次循环12330×10 + 3 = 3123→12
第二次循环1223×10 + 2 = 3212→1
第三次循环1132×10 + 1 = 3211→0

循环结束,返回 res=321


关键操作详解

  1. 取末位(num % 10
    % 是取余操作,比如 123%10=312%10=21%10=1
    这相当于每次取出 num 的最后一位数字。

  2. 重组(res = res*10 + 末位

    • res*10:将当前结果左移一位(腾出个位)。

    • + 末位:将新提取的末位填入个位。
      比如:

    • 初始 res=0 → 填入3 → res=3

    • 下次循环 res=3×10=30 → 填入2 → res=32

    • 最后 res=32×10=320 → 填入1 → res=321

  3. 去掉末位(num = parseInt(num/10)
    除以10后取整,相当于去掉最后一位。
    例如:123→1212→11→0(循环终止)。


为什么能处理中间或末尾的0?

  • 末尾的0(如输入 1200
    第一次循环提取末位0 → res=0×10+0=0num=120
    第二次循环提取末位0 → res=0×10+0=0num=12
    第三次循环提取2 → res=0×10+2=2num=1
    第四次循环提取1 → res=2×10+1=21num=0
    最终结果是 21,末尾的0被自动“舍弃”。

  • 中间的0(如输入 10203
    反转后为 30201,中间的0会被保留,因为每次循环都会严格按顺序提取数字。


数学本质

原数字可以表示为:

num = a×10ⁿ + b×10ⁿ⁻¹ + ... + z×10⁰

反转后的数字则是:

res = z×10ⁿ + ... + b×10¹ + a×10⁰

函数通过循环逐步剥离原数字的每一位(从低位到高位),再按反方向重组。


总结

这个算法的精妙之处在于:

  1. 逐位处理:每次只操作一位数字。

  2. 数学重组:通过 res*10 + 末位 直接构建反转后的数字。

  3. 无需字符串转换:效率高,且适用于大数字(但需注意JavaScript的数值范围限制)。

通过这种“拆解-重组”的数学方法,可以高效地完成整数反转。

题目描述

给定一个整数数组 nums,要求将每个元素反转后添加到原数组中,最终统计所有不同整数的数量。
示例
输入:nums = [123, 456]
输出:4
解释:原数组为 [123, 456],反转后得到 [321, 654],合并后的数组为 [123, 456, 321, 654],共有 4 个不同整数。

解题思路
  1. 核心目标

    • 对每个元素执行反转操作,生成新数字。

    • 合并原数组和反转后的所有数字,统计不重复的整数数量。

  2. 关键操作

    • 反转数字:将数字逐位拆解,按反方向重组(如 123 → 321)。

    • 去重统计:利用集合(Set)自动去重的特性,存储所有数字。

  3. 算法步骤

    • 初始化一个集合,存储原数组的所有元素。

    • 遍历数组,对每个元素进行反转,并将结果加入集合。

    • 最终返回集合的大小。


代码实现
var countDistinctIntegers = function (nums) {const set = new Set(nums); // 初始化集合,存储原数组元素for (let i = 0; i < nums.length; i++) {set.add(resver(nums[i])); // 将反转后的数字加入集合}return set.size; // 返回集合大小(即不同整数数量)
};// 反转数字函数
const resver = (num) => {let res = 0;while (num > 0) {res = res * 10 + (num % 10); // 提取末位并重组num = parseInt(num / 10); // 去掉末位}return res;
};
代码解析
  1. 集合去重(Set

    • new Set(nums) 直接将原数组元素存入集合,自动去重。

    • 遍历时,通过 set.add() 将反转后的数字加入集合,避免重复存储。

  2. 反转函数 resver

    • 逐位提取num % 10 获取末位数字(如 123 % 10 = 3)。

    • 重组数字res = res * 10 + 末位 将新数字左移后填入末位(如 0 → 3 → 32 → 321)。

    • 去掉末位parseInt(num / 10) 去掉已处理的末位(如 123 → 12)。

  3. 边界处理

    • 数字0:若 num = 0,循环直接结束,返回 res = 0,确保反转结果正确。

    • 末尾0:如 120 反转后为 21,自动忽略前导零。


复杂度分析
  • 时间复杂度

    • 反转单个数字的时间为 O(d)d 为数字的位数)。

    • 遍历数组的时间为 O(n),总时间复杂度为 O(n·d)

  • 空间复杂度

    • 集合存储最多 2n 个元素(原数组和反转结果),空间复杂度为 O(n)


示例演示

以输入 nums = [123, 121] 为例:

  1. 原数组元素存入集合:Set {123, 121}

  2. 反转 123 得到 321,集合变为 {123, 121, 321}

  3. 反转 121 得到 121(与原数字相同),集合保持 {123, 121, 321}

  4. 最终结果:3 个不同整数。


总结
  • 集合去重:利用 Set 特性高效去重,避免手动判断重复。

  • 逐位反转:通过数学运算逐位拆解和重组,无需字符串转换,时间复杂度低。

  • 适用性:该方法适用于大整数场景(需注意 JavaScript 的数值范围限制)。

通过结合集合的自动去重和数学反转方法,代码简洁高效地解决了问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫第3节-会话、Cookies及代理的基本原理

目录 一、会话和Cookies 1.1 静态网页和动态网页 1.2 无状态HTTP 1.3 常见误区 二、代理的基本原理 2.1 基本原理 2.2 代理的作用 2.3 爬虫代理 2.4 代理分类 2.5 常见代理设置 一、会话和Cookies 大家在浏览网站过程中&#xff0c;肯定经常遇到需要登录的场景。有些…

Flutter项目之登录注册功能实现

目录&#xff1a; 1、页面效果2、登录两种状态界面3、中间按钮部分4、广告区域5、最新资讯6、登录注册页联调6.1、网络请求工具类6.2、注册页联调6.3、登录问题分析6.4、本地缓存6.5、共享token6.6、登录页联调6.7、退出登录 1、页面效果 import package:flutter/material.dart…

木马学习记录

一句话木马是什么 一句话木马就是仅需要一行代码的木马&#xff0c;很简短且简单&#xff0c;木马的函数将会执行我们发送的命令 如何发送命令&#xff06;发送的命令如何执行? 有三种方式&#xff1a;GET&#xff0c;POST&#xff0c;COOKIE&#xff0c;一句话木马中用$_G…

(C语言)单链表(1.0)(单链表教程)(数据结构,指针)

目录 1. 什么是单链表&#xff1f; 2. 单链表的代码表示 3. 单链表的基本操作 3.1 初始化链表 3.2 插入结点&#xff08;头插法&#xff09; 3.3 插入结点&#xff08;尾插法&#xff09; 3.4 遍历链表 4. 单链表的优缺点 代码&#xff1a;*L(LinkList)malloc(sizeof(…

Sentinel-自定义资源实现流控和异常处理

目录 使用SphU的API实现自定义资源 BlockException 使用SentinelResource注解定义资源 SentinelResourceAspect 使用Sentinel实现限流降级等效果通常需要先把需要保护的资源定义好&#xff0c;之后再基于定义好的资源为其配置限流降级等规则。 Sentinel对于主流框架&#…

Linux信号处理解析:从入门到实战

Linux信号处理全解析&#xff1a;从入门到实战 一、初识Linux信号&#xff1a;系统级的"紧急电话" 信号是什么&#xff1f; 信号是Linux系统中进程间通信的"紧急通知"&#xff0c;如同现实中的交通信号灯。当用户按下CtrlC&#xff08;产生SIGINT信号&…

Java的Selenium的特殊元素操作与定位之select下拉框

如果页面元素是一个下拉框&#xff0c;我们可以将此web元素封装为Select对象 Select selectnew Select(WebElement element); Select对象常用api select.getOptions();//获取所有选项select.selectBylndex(index);//根据索引选中对应的元素select.selectByValue(value);//选…

蓝桥云客 刷题统计

刷题统计 问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题&#xff1f; 输入格式 输入一行包含三个整数 a, b 和 …

三防笔记本有什么用 | 三防笔记本有什么特别

在现代社会&#xff0c;随着科技的不断进步&#xff0c;笔记本电脑已经成为人们工作和生活的重要工具。然而&#xff0c;在一些特殊的工作环境和极端条件下&#xff0c;普通笔记本电脑往往难以满足需求。这时&#xff0c;三防笔记本以其独特的设计和卓越的性能&#xff0c;成为…

智能体和RPA都需要程序思维,如何使用影刀的变量?

欢迎来到涛涛聊AI&#xff0c; 不管AI还是RPA&#xff0c;都需要用到编程思想才能完成批量工作。今天研究了下影刀的变量。 变量类型 根据变量值选择相应的类型&#xff0c;可选择任意一种影刀所支持的数据类型 变量值 指定变量中保存的值&#xff0c;会根据不同的类型设置…

【蓝桥杯】算法笔记3

1. 最长上升子序列(LIS) 1.1. 题目 想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6 你要从中挑出一些数字,这些数字要满足两个条件: 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序) 你挑的数字要一个比一个大(严格递增) 问:最多能挑出多少个这样的数字? …

性能测试之jmeter的基本使用

简介 Jmeter是Apache的开源项目&#xff0c;基于Java开发&#xff0c;主要用于进行压力测试。 优点&#xff1a;开源免费、支持多协议、轻量级、功能强大 官网&#xff1a;https://jmeter.apache.org/index.html 安装 安装步骤&#xff1a; 下载&#xff1a;进入jmeter的…

【NLP 面经 7、常见transformer面试题】

目录 1. 为何使用多头注意力机制&#xff1f; 2. Q和K使用不同权重矩阵的原因 3. 选择点乘而非加法的原因 4. Attention进行scaled的原因 5. 对padding做mask操作 6. 多头注意力降维原因 7. Transformer Encoder模块简介 8. 乘以embedding size的开方的意义 9. 位置编码 10. 其…

【深度学习】CNN简述

文章目录 一、卷积神经网络&#xff08;CNN&#xff09;二、CNN结构特性1. CNN 典型结构2. 局部连接3. 权重共享4.空间或时间上的次采样 三、理解层面 一、卷积神经网络&#xff08;CNN&#xff09; 卷积神经网络(Convolutional Neural Network&#xff0c;CNN)是一种用于处理…

理解OSPF 特殊区域NSSA和各类LSA特点

本文基于上文 理解OSPF Stub区域和各类LSA特点 在理解了Stub区域之后&#xff0c;我们再来理解一下NSSA区域&#xff0c;NSSA区域用于需要引入少量外部路由&#xff0c;同时又需要保持Stub区域特性的情况 一、 网络总拓扑图 我们在R1上配置黑洞路由&#xff0c;来模拟NSSA区域…

论文阅读笔记:Denoising Diffusion Implicit Models (5)

0、快速访问 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08…

蓝桥杯2024年第十五届省赛真题-R 格式

题目链接&#xff1a; 思路&#xff1a; 通过数组模拟d的每一位&#xff0c;逐位进行计算&#xff0c;从而实现对d的精确处理。 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 2020;int n; string s; vector<i…

深入探索 Linux Top 命令:15 个实用示例

在 Linux 系统管理中&#xff0c;top 命令是系统性能监控不可或缺的工具。它能够实时显示系统的 CPU、内存、进程等资源的使用情况&#xff0c;帮助您快速识别性能瓶颈和异常进程。本文将详细介绍 15 个实用的 top 命令使用示例&#xff0c;旨在帮助您更高效地进行系统管理与优…

15.1linux设备树下的platform驱动编写(知识)_csdn

上一章我们详细的讲解了 Linux 下的驱动分离与分层&#xff0c;以及总线、设备和驱动这样的驱动框架。基于总线、设备和驱动这样的驱动框架&#xff0c; Linux 内核提出来 platform 这个虚拟总线&#xff0c;相应的也有 platform 设备和 platform 驱动。 上一章我们讲解了传统的…

Eclipse 视图(View)

Eclipse 视图(View) Eclipse 视图(View)是 Eclipse 界面的重要组成部分,它提供了用户交互的平台,使得用户可以通过图形界面来编辑、调试、分析代码等。在本文中,我们将深入探讨 Eclipse 视图的功能、使用方法以及它们在软件开发中的作用。 1. 视图的功能 Eclipse 视图具…