您的位置:首页 > 其它

Delete Digits

2015-09-07 20:20 344 查看
Given string A representative a positive integer which has N digits, remove any k digits of the number, the remaining digits are arranged according to the original order to become a new positive integer.

Find the smallest integer after remove k digits.

N <= 240 and k <= N,

xample

Given an integer A = 
"178542"
,
k = 
4

return a string 
"12"


首先要理解题目的意思,题目是说在原整数的顺序基础上删除,删除之后要保留之前的顺序。那如何才能确定某个数该删除,假如有个整数453,现在要删除一个元素,如何选择删除一个元素使得数最小,我们人工会选择删除5,得到43;那为什么这样删除可以保证得到满足题意的结果,假如现在在位置4处,如果删除4会使得到53,如果不删除4,删除5,会得到43,也就是说对于i位置的数a[i] <= a[i + 1], 那么不应该删除i处的数,因为删除i处的数比删除i+1处的数更大,所以不能删除第i处的数;反之则应该删除;这样就有了如何确定某个数是否应该删除的数学依据。在实现的时候,很多细节需要考虑。

class Solution {
public:
/**
*@param A: A positive integer which has N digits, A is a string.
*@param k: Remove k digits.
*@return: A string
*/

string DeleteDigits(string A, int k) {
// wirte your code here
int lenA = A.size();
if(lenA < k || lenA == k)
return "";
if(k <= 0)
return A;
string ans = "";
int index = 0;
while(index < lenA){
if(index < (lenA - 1)){
if(A[index] <= A[index + 1])
{
if(ans.size() > 0 || A[index] != '0')
ans.push_back(A[index]);
}
else if(A[index] > A[index + 1] && k > 0){
--k;
<span style="white-space:pre">		</span>    //对于之前没有删除的数,需要检查是否也要删除
while(ans.size() && k > 0 && ans[ans.size() - 1] > A[index + 1]){
--k;
ans.pop_back();
}
}
else
ans.push_back(A[index]);
}
else
ans.push_back(A[index]);
++index;
}

//如果出现了ans为递增序列,而且删除数不够,则直接从ans后面删除较大的数
while(k > 0){
ans.pop_back();
--k;
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Delete Digits