สมมติว่าเรามีจำนวนเต็ม num ทำการดังนี้ 2 ครั้ง: เลือกตัวเลข x (0-9), เลือก y (0-9), แทนที่ x ทุกตัวใน num ด้วย y (ห้าม leading zero, ห้ามเป็น 0) ให้ a, b เป็นผลลัพธ์ครั้งที่ 1,2 หาความต่างสูงสุด |a-b|
ตัวอย่าง: 555 → ครั้งแรก 5→9 ได้ 999, ครั้งที่สอง 5→1 ได้ 111 ความต่าง = 888
วิธีแก้ปัญหา
- getMax: หาตัวเลขแรกจากซ้ายที่ไม่ใช่ 9 แทนที่ตัวนั้นทุกตัวเป็น 9
- getMin:
- ถ้าตัวแรก ≠ 1: แทนที่ตัวแรกทุกตัวเป็น 1
- ถ้าตัวแรก = 1: หาตัวแรกจากซ้ายที่ >1 แทนที่เป็น 0 (เริ่มจาก index 1)
- คืนค่า |getMax - getMin|
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int getMax(int x){
string s = to_string(x);
char a = '9';
int i = 0;
while (i < s.size() && s[i] == '9') i++;
if (i < s.size()) a = s[i];
for (int i = 0; i < s.size(); i++)
if (s[i] == a) s[i] = '9';
return stoi(s);
}
int getMin(int x){
string s = to_string(x);
char a;
if (s[0] != '1') {
a = s[0];
for (int i = 0; i < s.size(); i++)
if (s[i] == a) s[i] = '1';
} else {
if (s.size() == 1) return 1;
int i = 0;
a = '1';
while (i < s.size() && s[i] <= '1') i++;
if (i < s.size()) a = s[i];
for (int i = 1; i < s.size(); i++)
if (s[i] == a) s[i] = '0';
}
return stoi(s);
}
int maxDiff(int num) {
int a = getMax(num);
int b = getMin(num);
return abs(a - b);
}
};
int main(){
Solution ob;
cout << (ob.maxDiff(666));
}ข้อมูลนำเข้า
666
ผลลัพธ์
888