笔试题3——消除重复数字

题目:给定一个整数,给出消除重复数字以后最大的整数。
输入描述: 正整数,注意考虑长整数
输出描述: 消除重复数字后的最大整数
示例:
输入 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; 
}

我真的好菜阿,这道题写了一上午才写出来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值