NC219. 移掉 K 位数字
描述
示例1
输入:
"1432219",3
输出:
"1219"
说明:
移除 4 3 2 后剩下 1219示例2
输入:
"10",1
输出:
"0"
示例3
输入:
"100999",3
输出:
"9"
C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-27
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string num, int k) { string res = "0"; for(auto s : num) { while(k && res.back() > s) { res.pop_back(); k--; } res += s; } while(k--) res.pop_back(); int i = 0; while(i < res.size() && res[i] == '0') i++; if(i == res.size()) return "0"; return res.substr(i); } };
C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-20
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string num, int k) { std::stack<char> stk; int i = 0; for (;i < num.size(); i++) { while (!stk.empty() && stk.top() >= num[i] && k) { if(stk.top() != '0') k--; stk.pop(); } if(k == 0) break; stk.push(num[i]); } std::string ret = ""; while (!stk.empty()) { ret =stk.top()+ret; stk.pop(); } ret+= num.substr(i); int j = 0; while (j < ret.size()-1) { if (ret[j] == '0') { j++; } else break; } return ret.substr(j); } };
C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-05-14
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string num, int k) { // write code here vector<char> s; s.push_back(num[0]); int i = 0; for(int i=1; i < num.size(); i++){ while(!s.empty() && s.back() >= num[i] && k > 0) { s.pop_back(); k--; } if(s.empty() && num[i]=='0') continue; s.push_back(num[i]); } string sr; for(auto a:s){ sr+=a; } return (sr.empty() ? "0" : sr); } };
C 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-06-09
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 * * C语言声明定义全局变量请加上static,防止重复定义 */ char* removeKnums(char* num, int k ) { int numLen = strlen(num); if (k >= numLen) { char *result = (char *)malloc(sizeof(char) * (2)); result[0] = '0'; result[1] = '\0'; return result; } char *stack = (char *)malloc(sizeof(char) * numLen); int sTop = 0, delCount = 0; for (int i = 0; i < numLen; i++) { while (sTop > 0 && delCount < k && stack[sTop-1] > num[i]) { sTop--; delCount++; } stack[sTop++] = num[i]; } while (delCount < k && sTop > 0) { sTop--; delCount++; } char *result = (char *)malloc(sizeof(char) * (sTop + 2)); int rIndex = 0; for (int i = 0; i < sTop; i++) { if (rIndex == 0 && stack[i] == '0') { continue; } else { result[rIndex++] = stack[i]; } } if (rIndex == 0) { result[rIndex++] = '0'; } result[rIndex++] = '\0'; free(stack); return result; }
C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-03-11
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string num, int k) { // write code here string res = ""; int r = 0; while(r<num.size()){ if(!res.empty()&&res[0]=='0'){ res = res.substr(1,res.size()-1); } if(res.empty()||res.back()<num[r]){ res+=num[r]; r++; }else if(k>0){ res.pop_back(); k--; }else{ res+=num[r]; r++; } } while(k>0){ res.pop_back(); k--; } return res.size()==0?"0":res; } };