https://leetcode.com/contest/leetcode-weekly-contest-48/problems/maximum-swap/
Way 1:
#include <iostream>
#include <list>
using namespace std;
class Solution {
public:
int maximumSwap(int num) {
list<int> *buckets = new list<int>[10];
int digit = 0;
int temp = num;
while (temp != 0) {
buckets[temp % 10].push_front(digit++);
temp /= 10;
}
for (int i = 9; i >= 0; i--) {
while (!buckets[i].empty()) {
if (buckets[i].front() != (--digit)) {
int target = buckets[i].back();
int plus = numberFromDigit(num, target);
int minus = numberFromDigit(num, digit);
num += numberWithDigit((plus - minus), digit);
num -= numberWithDigit((plus - minus), target);
return num;
}
buckets[i].pop_front();
}
}
return num;
}
int numberWithDigit(int num, int digit) {
if (num == 0)
return 0;
int base = 1;
while ((digit--) > 0) {
base *= 10;
}
return (num * base);
}
int numberFromDigit(int num, int digit) {
while ((digit--) > 0) {
num /= 10;
if (num == 0)
return 0;
}
return ((num % 10));
}
};
int main()
{
Solution solution;
int test = 10909091;
int r = solution.maximumSwap(test);
cout << r << " end\n";
return 1;
}
Way 2: a little better
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
int maximumSwap(int num) {
int last[10];
int count[10] = {0};
for (int i = 0; i < 10; i++) {
last[i] = -1;
count[i] = 0;
}
int digit = 0;
int temp = num;
while (temp != 0) {
int now = temp % 10;
count[now]++;
if (last[now] == -1) {
last[now] = (digit);
}
digit++;
temp /= 10;
}
digit--;
string s = to_string(num);
int length = s.length();
for (int i = 9; i >= 0; i--) {
if (last[i] != -1) {
if ((digit - count[i] + 1) != last[i]) {
for (int j = 0; j < count[i]; j++) {
if (i != s.at(length - 1 - (digit - j)) - '0') {
swap(s[length - 1 - (digit - j)], s[length - 1 - last[i]]);
return stoi(s);
}
}
}
digit -= count[i];
}
}
return num;
}
};
int main()
{
Solution solution;
int test = 98368;
int r = solution.maximumSwap(test);
cout << r << " end\n";
return 1;
}
作者已經移除這則留言。
回覆刪除