Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly the same digits existing in the integer n and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.html
Example 1:java
Input: 12 Output: 21
Example 2:git
Input: 21 Output: -1
這道題給了咱們一個數字,讓咱們對各個位數從新排序,求出恰好比給定數字大的一種排序,若是不存在就返回-1。這道題給的例子的數字都比較簡單,咱們來看一個複雜的,好比12443322,這個數字的重排序結果應該爲13222344,若是咱們仔細觀察的話會發現數字變大的緣由是左數第二位的2變成了3,細心的童鞋會更進一步的發現後面的數字由降序變爲了升序,這也不難理解,由於咱們要求恰好比給定數字大的排序方式。那麼咱們再觀察下原數字,看看2是怎麼肯定的,咱們發現,若是從後往前看的話,2是第一個小於其右邊位數的數字,由於若是是個純降序排列的數字,作任何改變都不會使數字變大,直接返回-1。知道了找出轉折點的方法,再來看如何肯定2和誰交換,這裏2並無跟4換位,而是跟3換了,那麼如何肯定的3?其實也是從後往前遍歷,找到第一個大於2的數字交換,而後把轉折點以後的數字按升序排列就是最終的結果了。最後記得爲防止越界要轉爲長整數型,而後根據結果判斷是否要返回-1便可,參見代碼以下:函數
解法一:post
class Solution { public: int nextGreaterElement(int n) { string str = to_string(n); int len = str.size(), i = len - 1; for (; i > 0; --i) { if (str[i] > str[i - 1]) break; } if (i == 0) return -1; for (int j = len - 1; j >= i; --j) { if (str[j] > str[i - 1]) { swap(str[j], str[i - 1]); break; } } sort(str.begin() + i, str.end()); long long res = stoll(str); return res > INT_MAX ? -1 : res; } };
下面這種解法博主感受有些耍賴了,用到了STL的內置函數next_permutation,該數字實現的就是這樣一個功能,找下一個全排序,恰好比當前的值大,貼上來權當好玩:url
解法二:spa
class Solution { public: int nextGreaterElement(int n) { string str = to_string(n); next_permutation(str.begin(), str.end()); long long res = stoll(str); return (res > INT_MAX || res <= n) ? -1 : res; } };
相似題目:code
參考資料:
https://discuss.leetcode.com/topic/85740/c-4-lines-next_permutation
https://discuss.leetcode.com/topic/86049/simple-java-solution-4ms-with-explanation