删除数字 Lintcode 182
已知:
给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。
(找到删除 k 个数字之后的最小正整数, 并且 N <= 240, k <= N)
示例:
给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4
返回一个字符串 "12"
思路:
复杂的思路 ( 以A = "178542", k = 4为例 ):
①首先,将K转化为剩余几个数字要取( 在这里取2 ),便于理解和函数迭代
②178542需要取 ( A.length - K = ) 两位数字,所以第一位是原字符串除最后一位外的非0最小数 ( 也就是说在17854中取十位)
③函数迭代,A从当前取得最小值的位置开始迭代,要取的位数也减1
④当要取的位数为0时 ( 终止条件), 返回空字符串
我起初的代码是:
public class Solution {
public String DeleteDigits(String A, int l) {
return calculate(A, A.length() - l, 0);
}
//remainLength指的是还要取几位数字
private String calculate(String A, int remainLength, int flag) {
if (remainLength == 0) {
return "";
}
char[] cs = A.substring(0, A.length() - remainLength + 1).toCharArray();
//index还特意分了能不能取0
int index = findMinIndex(cs, flag);
if (index == cs.length - 1) {
return A.substring(index);
} else {
return A.substring(index, index + 1)
+ calculate(A.substring(index + 1), remainLength - 1, 1);
}
}
private int findMinIndex(char[] cs, int flag) {
int minIndex = 0;
char minValue = cs[0];
for (int i = 1; i < cs.length; i++) {
if (cs[i] < minValue) {
if (flag == 0 && cs[i] == '0') {
continue;
}
minIndex = i;
minValue = cs[i];
}
}
return minIndex;
}
}
然而!!然而题目的意思是即使你取的字符串以0开头也是可以的,结果里去除开头所有0就可以了!!非常无奈,测试的时候才发现题意比我想的简单多了,修改代码如下:
public class Solution {
public String DeleteDigits(String A, int l) {
return calculate(A, A.length() - l);
}
private String calculate(String A, int remainLength) {
if (remainLength == 0) {
return "";
}
char[] cs = A.substring(0, A.length() - remainLength + 1).toCharArray();
int index = findMinIndex(cs);
if (index == cs.length - 1) {
return deleteFrontZero(A.substring(index));
} else {
String temp = A.substring(index, index + 1);
if ("0".equals(temp))
return calculate(A.substring(index + 1), remainLength - 1);
return temp + calculate(A.substring(index + 1), remainLength - 1);
}
}
private String deleteFrontZero(String substring) {
char[] cs = substring.toCharArray();
int flag = -1;
for (int i = 0; i < substring.length() - 1; i++) {
if (cs[i] != '0') {
flag = i;
break;
}
}
if (flag == -1)
return substring.substring(substring.length() - 1);
return substring.substring(flag);
}
private int findMinIndex(char[] cs) {
int minIndex = 0;
char minValue = cs[0];
for (int i = 1; i < cs.length; i++) {
if (cs[i] < minValue) {
minIndex = i;
minValue = cs[i];
}
}
return minIndex;
}
}
诶,题意不清多花了好些时间,不过希望对您有所帮助,(;′⌒`)