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;
}