#P3740. 第1题-正整数替换一个数字后的最大差值
-
ID: 3083
Tried: 94
Accepted: 25
Difficulty: 2
所属公司 :
新凯来
时间 :2025年9月20日-算法岗
-
算法标签>模拟
第1题-正整数替换一个数字后的最大差值
思路
核心是分别构造最大数 A 与最小数 B,答案为 A−B。
-
构造 A:从高位到低位找到第一个不为 9 的数字 d,把所有的 d 改为 9。若所有位都是 9,则 A=num。 直觉:越高位变大收益越大;把该位及其同值位都改到上限 9 最优。
-
构造 B(允许前导零):找到 num 中最小的非零数字 m,把所有 m 改为 0。若 num 只含 0,则 B=num。 直觉:越高位变小收益越大;把最小的非零数降到下限 0,能尽早在高位出现 0 并且还能多处同时变小。
C++
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
long long maxDiff(long long num) {
string s = to_string(num);
string a = s;
char pick_max = 0;
for (char ch : a) {
if (ch != '9') { pick_max = ch; break; }
}
if (pick_max) {
for (char &ch : a) if (ch == pick_max) ch = '9';
}
long long A = stoll(a);
string b = s;
char pick_min = 0;
for (char ch : b) {
if (ch != '0') { pick_min = ch; break; }
}
if (pick_min) {
for (char &ch : b) if (ch == pick_min) ch = '0';
}
long long B = stoll(b); // "02" -> 2
return A - B;
}
};
int main() {
long long num;
if (cin >> num) {
Solution sol;
cout << sol.maxDiff(num) << '\n';
}
return 0;
}
Python
class Solution:
def maxDiff(self, num: int) -> int:
s = list(str(num))
# 构造最大值A:把最左边第一个非9的数字全改为9
a = s[:]
pick_max = None
for ch in a:
if ch != '9':
pick_max = ch
break
if pick_max is not None:
a = ['9' if ch == pick_max else ch for ch in a]
A = int(''.join(a))
# 构造最小值B(允许前导0):把最左边第一个非0的数字全改为0
b = s[:]
pick_min = None
for ch in b:
if ch != '0':
pick_min = ch
break
if pick_min is not None:
b = ['0' if ch == pick_min else ch for ch in b]
B = int(''.join(b))
return A - B
if __name__ == "__main__":
n = int(input().strip())
print(Solution().maxDiff(n))
Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static class Solution {
public long maxDiff(long num) {
String s = String.valueOf(num);
char[] a = s.toCharArray();
Character pickMax = null;
for (char c : a) {
if (c != '9') { pickMax = c; break; }
}
if (pickMax != null) {
for (int i = 0; i < a.length; i++) if (a[i] == pickMax) a[i] = '9';
}
long A = Long.parseLong(new String(a));
char[] b = s.toCharArray();
Character pickMin = null;
for (char c : b) {
if (c != '0') { pickMin = c; break; }
}
if (pickMin != null) {
for (int i = 0; i < b.length; i++) if (b[i] == pickMin) b[i] = '0';
}
long B = Long.parseLong(new String(b)); // "02" -> 2
return A - B;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
if (line != null && !line.trim().isEmpty()) {
long num = Long.parseLong(line.trim());
Solution sol = new Solution();
System.out.println(sol.maxDiff(num));
}
}
}
题目内容
给你一个整数num,将其中的一个数字(0-9)全部替换为另一个数字,然后将替换后的两个值作差,返回最大的差值。
输入描述
输入一个整数
输出描述
输出替换后的最大差值
样例1
输入
11891
输出
99009
说明
为了得到最大值,我们好数字1替换成数字9,得到99899。
为了得到最小值,我们将数字1替换成数字0,得到890,两个数字的差值为99000