题目地址:
https://www.lintcode.com/problem/maximum-possible-value/description
给定一个整数 N N N,要求在其中任意位置插入一个 5 5 5,要求返回能得到的最大整数。
如果 N = 0 N=0 N=0,那么答案是 50 50 50。否则要分类讨论,如果是正数的话,那要返回能得到的最大数,如果是负数,那要返回去掉负号后能得到的最小数前面再把负号加回来。譬如给定一个正数,那么要将其变的尽可能大,就从高位开始找第一个小于 5 5 5的位置,将 5 5 5插入即可;如果给的是一个负数,就要将负号后面的数变得尽可能小,就从高位开始找第一个大于 5 5 5的位置,将 5 5 5插入即可。注意一点,如果中途没有插入过 5 5 5,最后记得插到末尾即可。代码如下:
public class Solution {
/**
* @param N: an integer
* @return: returns the maximum possible value obtained by inserting one '5' digit
*/
public int MaximumPossibleValue(int N) {
// write your code here
if (N == 0) {
return 50;
}
StringBuilder sb = new StringBuilder();
String num = String.valueOf(N);
// 标记5是否被插入过
boolean inserted = false;
if (num.charAt(0) != '-') {
for (int i = 0; i < num.length(); i++) {
char ch = num.charAt(i);
if (ch < '5' && !inserted) {
sb.append(5);
// 标记已经插入
inserted = true;
}
sb.append(ch);
}
// 没插入就插在末尾
if (!inserted) {
sb.append(5);
}
} else {
num = num.substring(1);
for (int i = 0; i < num.length(); i++) {
char ch = num.charAt(i);
if (ch > '5' && !inserted) {
sb.append(5);
inserted = true;
}
sb.append(ch);
}
if (!inserted) {
sb.append(5);
}
sb.insert(0, '-');
}
return Integer.parseInt(sb.toString());
}
}
时空复杂度 O ( l N ) O(l_N) O(lN), l N l_N lN为 N N N的位数(也就是 O ( log N ) O(\log N) O(logN))。