消除重复数字(13)

1 题目

(题来源牛客网华为2019秋招笔试题)

1.1 问题描述

给定一个正整数,给出消除重复数字以后最大的整数。

1.2 输入示例

423234

1.3 输出示例

432

2 问题分析

这道题想了很久,没有想出来,采用牛客上提供的方法。

此题相当于一个字符串查重调整问题,需要两重循环,(相当于冒泡排序需要两层循环)。

用两指针i,j开始指向字符串的首地址,然后开始遍历,j作为查重指针(查找[0,i]之间的字符串)。

如果出现了重复数字,则str[i] == str[j],此时要考虑删掉str[i]还是str[j]的问题,比如有这样一个子串4232,i指向第4个,j指向第2个,如果删str[i]结果为423,如果删str[j]则结果为432,显然要删掉str[j],寻找一个参考标准,j后面的数字是3,3比2大,如果删除2,则会导致3向前移,则最终结果就会变大,所以判断标准str[j+1]>str[j]时,则删掉str[j],否则删掉str[i]。

3 代码编写

#include <iostream>
#include <string>
#include <vector>

//采用了牛客上提供的解决方法
using namespace std;

void test() {
	string s;
	while (cin >> s) {
		string res;
		res = s[0];
		for (int i = 1; i < s.size(); i++) {        //外层循环
			if (res.find(s[i]) == string::npos)		//res中没有找到s[i]
				res += s[i];
			else {									//res中找到了s[i]
				int j = res.find(s[i]);
				if ((j + 1) < res.size()) {
					if (res[j] < res[j + 1]) {
						res.erase(j, 1);			 //移走并调整,从j位置开始,删除1个字符
						res += s[i];				 //满足res[j]<res[j+1]则把s[i]添加进去,否则不添加
					}
				}
			}
		}
		cout << res << endl;
	}
}

int main()
{
	test();
	return 0;
}

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值