回文數[簡單]

優質博文:IT-BLOG-CN
在這里插入圖片描述

一、題目

給你一個整數x,如果x是一個回文整數,返回true;否則返回false。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。例如,121是回文,而123不是。

示例 1:
輸入:x = 121
輸出:true

示例 2:
輸入:x = -121
輸出:false
解釋:從左向右讀, 為-121。 從右向左讀, 為121-。因此它不是一個回文數。

示例 3:
輸入:x = 10
輸出:false
解釋:從右向左讀, 為01。因此它不是一個回文數。

-2^31 <= x <= 2^31 - 1

進階: 你能不將整數轉為字符串來解決這個問題嗎?

二、代碼

思路: 第一個想法是將數字轉換為字符串,并檢查字符串是否為回文。但是,這需要額外的非常量空間來創建問題描述中所不允許的字符串。第二個想法是將數字本身反轉,然后將反轉后的數字與原始數字進行比較,如果它們是相同的,那么這個數字就是回文。 但是,如果反轉后的數字大于int.MAX,我們將遇到整數溢出問題。

按照第二個想法,為了避免數字反轉可能導致的溢出問題,為什么不考慮只反轉int數字的一半?畢竟,如果該數字是回文,其后半部分反轉后應該與原始數字的前半部分相同。例如,輸入1221,我們可以將數字1221的后半部分從21反轉為12,并將其與前半部分12進行比較,因為二者相同,我們得知數字1221是回文。

首先,我們應該處理一些臨界情況。所有負數都不可能是回文,例如:-123不是回文,因為-不等于3。所以我們可以對所有負數返回false。除了0以外,所有個位是0的數字不可能是回文,因為最高位不等于0。所以我們可以對所有大于0且個位是0的數字返回false

現在,讓我們來考慮如何反轉后半部分的數字。對于數字1221,如果執行1221 % 10,我們將得到最后一位數字1,要得到倒數第二位數字,我們可以先通過除以10把最后一位數字從1221中移除,1221 / 10 = 122,再求出上一步結果除以10的余數,122 % 10 = 2,就可以得到倒數第二位數字。如果我們把最后一位數字乘以10,再加上倒數第二位數字,1 * 10 + 2 = 12,就得到了我們想要的反轉后的數字。如果繼續這個過程,我們將得到更多位數的反轉數字。

現在的問題是,我們如何知道反轉數字的位數已經達到原始數字位數的一半?由于整個過程我們不斷將原始數字除以10,然后給反轉后的數字乘上10,所以,當原始數字小于或等于反轉后的數字時,就意味著我們已經處理了

class Solution {public boolean isPalindrome(int x) {// 思路:因為不能使用字符串和反轉整個整數,因為反轉后數int溢出,所以只能創建一個變量保存一般的數據,利于/和%// 第一步:先排除特殊的場景,但是0是符合的if (x < 0 ||  (x > 0 && x % 10 == 0)) {return false;}// 第二步:創建一個變量保存 % 后的數據,并對當前x進行/操作int temp = 0;while (x > temp) {// 退出條件:x不斷減小, temp不斷變大,最終就會退出,先讓原有的數進一為給尾數留個坑位temp = temp * 10 + x % 10;x = x / 10;}// 第三步,判斷x與temp是否相同,特殊場景判斷:當x為奇數時 temp 會比 x多以為,比如 12321 進行上面的拆分后 x = 12 temp = 123,所以需要對 temp進行 /return temp == x || temp /10  == x;}
}

時間復雜度: O(log?n)對于每次迭代,我們會將輸入除以10,因此時間復雜度為O(log?n)
空間復雜度: O(1)我們只需要常數空間存放若干變量。

思路
標簽:數學
如果是負數則一定不是回文數,直接返回false
如果是正數,則將其倒序數值計算出來,然后比較和原數值是否相等
如果是回文數則相等返回true,如果不是則不相等false
比如123的倒序321,不相等;121的倒序121,相等

class Solution {public boolean isPalindrome(int x) {if(x < 0)return false;int cur = 0;int num = x;while(num != 0) {cur = cur * 10 + num % 10;num /= 10;}return cur == x;}
}

普通解法: 最好理解的一種解法就是先將 整數轉為字符串 ,然后將字符串分割為數組,只需要循環數組的一半長度進行判斷對應元素是否相等即可。

///簡單粗暴,看看就行
class Solution {public boolean isPalindrome(int x) {String reversedStr = (new StringBuilder(x + "")).reverse().toString();return (x + "").equals(reversedStr);}
}

進階解法—數學解法
通過取整和取余操作獲取整數中對應的數字進行比較。

舉個例子:1221 這個數字。

通過計算 1221 / 1000, 得首位1
通過計算 1221 % 10, 可得末位 1
進行比較
再將 22 取出來繼續比較

class Solution {public boolean isPalindrome(int x) {//邊界判斷if (x < 0) return false;int div = 1;//while (x / div >= 10) div *= 10;while (x > 0) {int left = x / div;int right = x % 10;if (left != right) return false;x = (x % div) / 10;div /= 100;}return true;}
}

進階解法—巧妙解法
直觀上來看待回文數的話,就感覺像是將數字進行對折后看能否一一對應。

所以這個解法的操作就是 取出后半段數字進行翻轉。

這里需要注意的一個點就是由于回文數的位數可奇可偶,所以當它的長度是偶數時,它對折過來應該是相等的;當它的長度是奇數時,那么它對折過來后,有一個的長度需要去掉一位數(除以 10 并取整)。

具體做法如下:

每次進行取余操作 ( %10),取出最低的數字:y = x % 10
將最低的數字加到取出數的末尾:revertNum = revertNum * 10 + y
每取一個最低位數字,x 都要自除以 10
判斷 x 是不是小于 revertNum ,當它小于的時候,說明數字已經對半或者過半了
最后,判斷奇偶數情況:如果是偶數的話,revertNum 和 x 相等;如果是奇數的話,最中間的數字就在revertNum 的最低位上,將它除以 10 以后應該和 x 相等。

class Solution {public boolean isPalindrome(int x) {//思考:這里大家可以思考一下,為什么末尾為 0 就可以直接返回 falseif (x < 0 || (x % 10 == 0 && x != 0)) return false;int revertedNumber = 0;while (x > revertedNumber) {revertedNumber = revertedNumber * 10 + x % 10;x /= 10;}return x == revertedNumber || x == revertedNumber / 10;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12991.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時間字符串處理 moment.js

文章來自我的blog moment.js 簡介 Moment.js 是一個開源的JavaScript庫&#xff0c;專為簡化日期和時間的處理而設計。它提供了一套豐富的API&#xff0c;允許開發者輕松地解析、驗證、操作、格式化日期和時間。自從2011年發布以來&#xff0c;Moment.js 因其易用性、靈活性和…

@Transactional(rollbackFor = Exception.class)注解放到private修飾的類上報錯

背景 有兩個方法中&#xff0c;更新數部分是相同的&#xff0c;打算把這一部分那重來&#xff0c;做一個公用的私有方法。 考慮數據一致性&#xff0c;原本每個方法都使用了Transactional(rollbackFor Exception.class)注解&#xff0c;保證失敗回滾&#xff0c;創建私有方法…

vj題單 激光炸彈 二維前綴和

題目鏈接&#xff1a;P2280 [HNOI2003] 激光炸彈 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 筆者答案&#xff1a; #include<stdio.h> int s[5005][5005]; int main () {int n,m;scanf("%d %d",&n,&m);int i,j;int x,y,v;int max;for(i 1;i &l…

洛谷P1364 醫院設置

P1364 醫院設置 題目描述 設有一棵二叉樹&#xff0c;如圖&#xff1a; 其中&#xff0c;圈中的數字表示結點中居民的人口。圈邊上數字表示結點編號&#xff0c;現在要求在某個結點上建立一個醫院&#xff0c;使所有居民所走的路程之和為最小&#xff0c;同時約定&#xff0c…

單元測試—BMI腳本設計

BMI例題如下&#xff1a; BMI中國計算標準&#xff1a;體質指數&#xff08;BMI&#xff09;體重&#xff08;kg&#xff09;身高^2&#xff08;m&#xff09; 例如&#xff1a;一個人的身高為1.75米,體重為68千克&#xff0c;他的BMI68/(1.75^2)22.2&#xff08;千克/米^2&a…

每日5題Day3 - LeetCode 11 - 15

每一步向前都是向自己的夢想更近一步&#xff0c;堅持不懈&#xff0c;勇往直前&#xff01; 第一題&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//這道題比較特殊&#xff0c;因為兩邊是任意…

04、SpringBoot 源碼分析 - SpringApplication啟動流程四

SpringBoot 源碼分析 - SpringApplication啟動流程四 初始化基本流程SimpleApplicationEventMulticaster的multicastEvent廣播事件resolveDefaultEventType獲取ResolvableType實例ResolvableType的forInstance創建ResolvableType實例 開始廣播AbstractApplicationEventMulticas…

脈沖水路清洗機,全自動脈沖技術清除管道堵塞

邦注脈沖水路清洗機是一種高效的清洗設備&#xff0c;它利用全自動脈沖技術來清除管道內的堵塞和污垢。以下是對該設備的一些詳細描述&#xff1a; 全自動脈沖技術&#xff1a;脈沖水路清洗機采用了全自動脈沖技術&#xff0c;這是一種先進的清洗方法。該技術通過產生高強度的…

window10下安裝ubuntu系統以及docker使用

window10下安裝ubuntu系統以及docker使用 1. 啟用適用于Linux的Windwos子系統2.下載Linux內核更新包3.將 WSL 2 設置為默認版本4.安裝Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu進行安裝。5.可能出現的問題1.win10啟動ubuntu報錯 參考的對象類型不支持嘗試的操…

Linux|基礎環境開發工具使用(1)

目錄 Linux 軟件包管理器 yum 什么是軟件包 關于 rzsz 注意事項 查看軟件包 如何安裝軟件 如何卸載軟件 Linux編輯器-vim介紹 vi與vim的相同點 vi與vim區別 Linux 軟件包管理器 yum 什么是軟件包 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯…

【WebGPU】WebGPU 中的反應擴散計算著色器

在本教程中&#xff0c;我們將使用 WebGPU 技術中的計算著色器實現圖像效果。更多精彩內容盡在數字孿生平臺。 程序結構 主要構建兩個 WebGPU 管道&#xff1a; 運行反應擴散算法多次迭代的計算管道&#xff08;js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

react 渲染引擎經歷了那些迭代

React 渲染引擎經歷了多個迭代&#xff0c;主要集中在改進 Virtual DOM 的實現和優化渲染性能方面。以下是一些 React 渲染引擎的主要迭代&#xff1a; React Fiber 架構&#xff1a;React 16 引入了 Fiber 架構&#xff0c;這是一個重新實現的渲染引夠更好地支持異步渲染。 S…

script標簽以及defer和async屬性

1. <script>標簽 將JavaScript代碼嵌入到HTML中主要方式是使用<script>元素。 使用<script>的方式有兩種&#xff1a; &#xff08;1&#xff09;直接在網頁中嵌入JavaScript代碼&#xff1a; <script>function sayHi() {console.log("Hi"…

Leetcode—2244. 完成所有任務需要的最少輪數【中等】

2024每日刷題&#xff08;136&#xff09; Leetcode—2244. 完成所有任務需要的最少輪數 實現代碼 class Solution { public:int minimumRounds(vector<int>& tasks) {unordered_map<int, int> map;for(int task: tasks) {map[task];}int ans 0;// freq 1 …

【前端】CSS基礎(3)

文章目錄 前言1. CSS常用元素屬性1.1 字體屬性1.1.1 字體1.1.2 字體大小1.1.3 字體顏色1.1.4 字體粗細1.1.5 文字樣式 前言 這篇博客僅僅是對CSS的基本結構進行了一些說明&#xff0c;關于CSS的更多講解以及HTML、Javascript部分的講解可以關注一下下面的專欄&#xff0c;會持續…

c++父類指針指向子類

有一個常見的c題&#xff0c;就是父類和子類的構造函數和析構函數分別調用順序&#xff1a; 父類構造函數子類構造函數子類析構函數父類析構函數 以及父類中的函數在子類中重新實現后&#xff0c;父類指針指向子類后&#xff0c;該指針調用的函數是父類中的還是子類中的&…

震撼發布!GPT-4o 上線!

5 月 14日凌晨一點&#xff0c;OpenAI 發布了 GPT-4o&#xff01; 新模型的功能簡單概括就是&#xff1a;更快、更智能、更像人類。 秉承著持續更新的態度&#xff0c;Hulu AI 快速接入 GPT-4o 啦&#xff01; 繼 5 月份上線 Suno 之后&#xff0c;這次是 Hulu AI 的又一重大…

vue3專欄項目 -- 六、上傳組件(上)

1、上傳組件需求分析 我們還需要新建和展示文章&#xff0c;新建文章自然是發送post請求&#xff0c;同時在post中自帶對應的數據&#xff0c;展示文章就是根據id取出已有的數據并且展示出來。 這里有一個難點就是上傳組件&#xff0c;上傳文件是App應用中最基本的需求&#…

Socks5:網絡世界的隱形斗篷

在數字化時代&#xff0c;網絡隱私和安全已成為人們日益關注的話題。Socks5&#xff0c;作為一種代理協議&#xff0c;為用戶在網絡世界中的匿名性提供了強有力的支持。本文將從Socks5的多個方面&#xff0c;深入探討這一技術如何成為網絡世界的“隱形斗篷”。 一、Socks5的基本…

linux基礎指令講解(ls、pwd、cd、touch、mkdir)

&#x1fa90;&#x1fa90;&#x1fa90;歡迎來到程序員餐廳&#x1f4ab;&#x1f4ab;&#x1f4ab; 主廚&#xff1a;邪王真眼 主廚的主頁&#xff1a;Chef‘s blog 所屬專欄&#xff1a;c大冒險 總有光環在隕落&#xff0c;總有新星在閃爍 這個是我們今天要用到的初始…