您的位置:首页 > 编程语言 > C语言/C++

[LeetCode]Delete Digits

2016-06-28 21:47 399 查看

题目

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,

Example

Given an integer A = “178542”, k = 4

return a string “12”

解题思路

贪心的思想,从左到右扫描字符串,如果A[i] > A[i+1]则删除A[i],直至删除了k个数字为止。这样就能使得越小的数字排在最左边,从而使得删除了k个数字后的数最小。

⚠注意两个特殊情况:

如果扫描了一遍以后,已经删除了的数字(deleted_num)小于k个,甚至是A中所有数字升序排列,没有A[i] > A[i+1]的情况(此时deleted_num = 0),则要删除末尾的(k - deleted_num)个字符。

eg. 测试样例: A = “12345”, k = 2

执行了上述算法后,还需进行后处理,删除首位的零。

eg. 测试样例: A = “90249”, k = 2

输出应该是“24”,而不是“024”

代码如下:

#include <string>
#include <iostream>

using namespace std;

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 deleted_num = 0;
int n = A.size();
if(!A.empty() && n <= 240 && k < n){
for(auto i = A.begin(); i != A.end() - 1;){
if(*i > *(i + 1)){
A.erase(i);
deleted_num++;
if(i != A.begin())
i--;
if(deleted_num == k)
break;
}
else
i++;
}
//⚠1
if(deleted_num < k){
A.erase(A.end() - (k - deleted_num), A.end());
}
//⚠2
auto i = A.begin();
while(*i == '0')
A.erase(i);
}

return A;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息