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

留言

張貼留言

這個網誌中的熱門文章

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/longest-univalue-path/

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/maximum-sum-of-3-non-overlapping-subarrays/