OJ刷题—移掉 K 位数字
一、题目
给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
输入:一串整数 和 一个整数k ,一串整数和一个整数k用空格隔开
输出:一串字符串
例如:
输入:
1432219 3
输出:
1219
二、方法一-----------代码
#include<iostream>
using namespace std;
class Solution {
public:
string remove(string num, int k)
{
int n = num.size();
if (n <= k)
{
return "0";
}
string res;
int i = 0;
int remain = n - k;
while (i < n)
{
while (k > 0 && !res.empty() && res.back() > num[i])
{
res.pop_back();
k--;
}
res.push_back(num[i]);
i++;
}
while (k > 0)
{
res.pop_back();
k--;
}
i = 0;
while (i < res.size())
{
if (res[i] != '0')
{
break;
}
i++;
}
if (i == res.size())
{
return "0";
}
res = res.substr(i);
return res;
}
};
int main()
{
Solution sol;
string num;
cin >> num;
int k;
cin >> k;
cout << sol.remove(num,k) << endl;
}
方法一-----参考博客
三、方法二
**主要思路:**由最高位开始,比较低一位数字,如高位大,移除,若高位小,则向右移一位继续比较两个数字,直到高位大于低位则移除,循环k次。
方法二-----代码
#include<iostream>
using namespace std;
class Solution {
public:
string removeKdigits(string num, int k) {
string res;
for (int i = 0; i < num.size(); ++i) {
while (!res.empty() && num[i] < res.back() && k != 0) {//注意这儿是while循环
res.pop_back();
--k;
}
if (res.empty() && num[i] == '0') continue;//跳过前导0
res += num[i];
}
while (k > 0 && !res.empty()) {
res.pop_back();
--k;
}
return res == "" ? "0" : res;
}
};
int main()
{
Solution sol;
string num;
cin >> num;
int k;
cin >> k;
cout << sol.removeKdigits(num, k) << endl;
return 0;
}
方法二-------参考链接