September 18, 2016 - algorithm

402. Remove K Digits

Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

Note:

Example 1:

Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2:

Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

Example 3:

Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.

1. Analyse

Let’s see some example. If given 4321,

4321	k=1 -->	321
4321	k=2 --> 21
4321	k=3 --> 1

If given 2341,

2341	k=1 --> 231
2341	k=2 --> 21
2341	k=3 --> 1

From the previous examples, if the number is decreasing, we remove the first one; if the number is increasing, we remove the last one.

2. AC Code

(25 Lines)

class Solution {
public:
    string removeKdigits(string num, int k) {
		num += '0';
		if( k >= num.size()-1 )	return string("0");        
		vector<char> vec; 
		for( int i=0; i<num.size(); i++ ){
			if( vec.empty() || num[i] >= vec.back() )
				vec.push_back( num[i] );
			else{
				while( !vec.empty() && num[i] < vec.back() && k ){
					k--;
					vec.pop_back();
				}
				vec.push_back( num[i] );
			}
		}
		string ans;
		for( int i=0; i<vec.size()-1; i++ ){
			if( !ans.empty() || vec[i]!='0' )
				ans += vec[i];
		}
		return ans.empty() ? "0" : ans;
    }
};

3. Concise AC Solution

(22 Lines)

class Solution {
public:
    string removeKdigits(string num, int k) {
		if( k >= num.size() )	return string("0");        

		num += '0';
		vector<char> vec; 
		for( int i=0; i<num.size(); i++ ){
			while( !vec.empty() && num[i] < vec.back() && k ){
				k--;
				vec.pop_back();
			}
			vec.push_back( num[i] );
		}
		string ans;
		for( int i=0; i<vec.size()-1; i++ ){
			if( !ans.empty() || vec[i]!='0' )
				ans += vec[i];
		}
		return ans.empty() ? "0" : ans;
    }
};