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??1 + ... + z×10?

反轉后的數字則是:

res = z×10? + ... + b×101 + 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.pswp.cn/web/74761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74761.shtml
英文地址,請注明出處:http://en.pswp.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 視圖具…