📘 題目敘述
給定一個整數 n。
定義它的 mirror distance 為:
abs(n - reverse(n))
其中 reverse(n) 表示把 n 的十進位數字反轉後所形成的整數。
請回傳 n 的 mirror distance。
條件限制
1 <= n <= 10^9
🧠 解題思路
我這題的想法很直接,就是先把整數的數字反轉,得到 reverse(n),然後再算它和原本 n 的絕對差。
反轉數字的方法也很標準:
- 每次取出目前最後一位
now % 10 - 接到新數字
rev的後面 - 再把
now除以10,繼續處理下一位
最後把反轉後的數字和原本的 n 做差,取絕對值就是答案。
所有變數
rev:反轉後得到的整數now:目前還沒處理完的數字
🪜 主要流程步驟
1. 先準備反轉數字要用的變數
我先開兩個 long long 變數:
rev:用來慢慢組出反轉後的數字now:一開始存原本的n,之後每輪把最後一位去掉
這裡把 n 轉成 long long,是想讓後面做數字操作時更安全。
2. 每次取出最後一位,加到 rev 後面
接著我用一個 while (now > 0) 迴圈,反覆處理目前數字的最後一位。
核心這行是:
rev = rev * 10 + now % 10;
意思是:
- 先把原本的
rev往左移一位,也就是乘上10 - 再把
now的最後一位接上去
這樣就能一位一位把反轉數字組起來。
3. 把 now 最後一位去掉,繼續下一輪
每次拿完最後一位之後,我再做:
now /= 10;
這樣 now 的最後一位就被去掉了。
接著下一輪就能繼續處理新的最後一位,直到整個數字都處理完為止。
4. 最後回傳反轉數字和原數字的絕對差
當迴圈結束後,rev 就是反轉後的整數。
所以最後直接回傳:
return abs(rev - n);
也就是 mirror distance 的定義。
⏱️ 複雜度
設 d 為 n 的位數。
- 時間複雜度:
O(d)
每次迴圈處理一位數字。 - 空間複雜度:
O(1)
只用了固定數量的變數。
💻 程式碼實作
class Solution {
public:
int mirrorDistance(int n) {
long long rev;
long long now = 1LL * n;
while (now > 0) {
rev = rev * 10 + now % 10;
now /= 10;
}
return abs(rev - n);
}
};
🔗 題目連結
https://leetcode.com/problems/mirror-distance-of-an-integer/