给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。找到删除 k 个数字之后的最小正整数。
N <= 240, k <= N
您在真实的面试中是否遇到过这个题?
Yes
样例
给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4
返回一个字符串 "12"
标签 Expand
相关题目 Expand
解题思路:
先用一个ArraryList将字符串的所有字符放入。
需要删除k个字符,每次去删除时删除这样一个元素,该元素满足:
找到第一个元素该元素的值大于下一个位置的元素。在这之前需要对List的切零处理。若没有找到这样一个元素,说明元素都是递增的,只需要删除最后一个元素即可。
比如A= 1078542 ,k=3
List={1,0,7,8,5,4,2} 找到第一个元素,满足 该元素的值大于下一个元素。既是1>0,去掉1。
List={0,7,8,5,4,2},,此时再去寻找这么一个元素,找到是8>5,去掉8.
List ={0,7,5,4,2},先切零处理.List={0,7,5,4,2},此时再去寻找这么一个元素,找到是5>4,去掉4.
最终剩下了List={0,7,4,2}进行切0处理 返回742.
public class Solution {
/**
*@param A: A positive integer which has N digits, A is a string.
*@param k: Remove k digits.
*@return: A string
*/
public String DeleteDigits(String A, int k) {
// write your code here
if (null == A || 0 == A.length())
return "";
ArrayList<Character> charList = new ArrayList<>();
for (int i = 0; i < A.length(); i++) {
charList.add(A.charAt(i));
}
for (int i = 0; i < k; i++) {
delDig(charList);
}
String res = "";
cutZero(charList);
for (int i = 0; i < charList.size(); i++) {
res += charList.get(i);
}
return res;
}
public void delDig(ArrayList<Character> charList) {
// 每次找出第一个i,使得charList[i]>charList[i+1]删除,若没找到,删除最后一个元素
int lastPos = charList.size() - 1;
int maxPos = lastPos;
for (int i = 0; i < charList.size() - 1; i++) {
if (charList.get(i) > charList.get(i + 1)) {
maxPos = i;
charList.remove(i);
break;
}
}
if (maxPos == lastPos) {
charList.remove(charList.size() - 1);
}
}
public void cutZero(ArrayList<Character> charList) {
// 若最开始的的charList中有0,比如0000021,剔除0
int k = charList.size() - 1;
while (k-- > 0) {
int i = 0;
if (charList.get(i) == '0') {
charList.remove(i);
} else {
break;
}
}
}
}
感觉代码比较的繁琐和累赘,分析和上面一样。直接用一个tmp字符串去保存每次删除后的字符串,优化如下:
public class Solution {
/**
*@param A: A positive integer which has N digits, A is a string.
*@param k: Remove k digits.
*@return: A string
*/
public String DeleteDigits(String A, int k) {
// write your code here
if(null==A||0==A.length()) return "";
String tmp = A;
while(k>0){
int i=0;
while(i<tmp.length()-1&&(tmp.charAt(i)<=tmp.charAt(i+1))){
i++;
}
tmp = tmp.substring(0,i)+tmp.substring(i+1,tmp.length());
k--;
}
int i=0;
while(i<tmp.length()-1&&tmp.charAt(i)=='0'){
i++;
}
tmp = tmp.substring(i);
return tmp;
}
}