题目:给定一个整数,给出消除重复数字以后最大的整数。
输入描述: 正整数,注意考虑长整数
输出描述: 消除重复数字后的最大整数
示例:
输入 423234
输出 432
思路:使用栈作为辅助工具,将长整数放入一个数组中,然后从前往后遍历数组:
栈为空就压入栈;
栈非空,判断当前数组元素是否大于栈顶元素;如果大于,则 判断栈顶元素是否在后面的数组中存在,如果存在就弹出栈顶元素。
接着判断栈中是否已经存在当前数组元素,否,将当前数组元素压入栈。
核心代码如下:
#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;
int main()
{
long long int test;
cin >> test;
vector<int> s;
while(test > 0){
s.push_back(test % 10);
test /= 10;
}
reverse(s.begin(), s.end());
stack<int> ss;
stack<int> dd;
int temp;
for(int i = 0; i < s.size(); i++){
int flag = 0;
if(ss.empty()) //栈为空时,当前元素直接进栈
ss.push(s[i]);
else{//栈非空时,需要进行比较
if(s[i] > ss.top()){ //栈非空,判断当前数组元素是否大于栈顶元素
for(int j = i + 1; j < s.size(); j++){ //判断栈顶元素是否在后面的数组中存在,如果存在就弹出栈顶元素
if(s[j] == ss.top()){
ss.pop();
break; //弹出栈顶元素后一定要终止循环!!避免继续比较下去,一次弹出多个栈顶元素
}
}
}
//接下来判断栈中是否已经存在当前数组元素s[i]
while(!ss.empty()){
temp = ss.top();
if(temp == s[i])
flag = 1;
dd.push(temp);
ss.pop();
}
while(!dd.empty()){
temp = dd.top();
ss.push(temp);
dd.pop();
}
if(flag != 1) //不存在相同元素,将当前数组元素压入栈
ss.push(s[i]);
}
}
//输出结果部分
while(!ss.empty()){
temp = ss.top();
dd.push(temp);
ss.pop();
}
while(!dd.empty()){
temp = dd.top();
cout << temp;
dd.pop();
}
cout << endl;
return 0;
}
我真的好菜阿,这道题写了一上午才写出来