556.下一个更大元素 III
给你一个正整数 n
,请你找出符合条件的最小整数,其由重新排列 n
中存在的每位数字组成,并且其值大于 n
。如果不存在这样的正整数,则返回 -1
。
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1
。
1 2 3 4
| 输入:n = 12; 输出:21; 输入:n = 123; 输出:132;
|
思路:从后向前搜索,第一次发现左侧元素小于右侧元素时,交换,并对交换后的元素之后的元素进行反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public int nextGreaterElement(int n) { char[] nums = Integer.toString(n).toCharArray(); for(int i = nums.length-2;i>=0;i--){ for(int j=nums.length-1;j>i;j--){ if(nums[j]>nums[i]) { swap(nums,i,j); reverse(nums,i+1,nums.length-1); long res = Long.parseLong(new String(nums)); return res>Integer.MAX_VALUE?-1:(int)res; } } } return -1; } void reverse(char[] nums,int start,int end){ int left = start; int right = end; while(left<=right){ swap(nums,left++,right--); } } void swap(char[] nums,int i,int j){ char c = nums[i]; nums[i]=nums[j]; nums[j]=c; } }
|
算法技巧,字符串与数字的转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| char[] nums = Integer.toString(n).toCharArray();
String s = new String(nums);
int n = Integer.parseInt(new String(nums));
ArrayList<> list = new ArrayList<>(); Object[] o = list.toArray(); char[] c = new char[o.length]; for (int i = 0; i < o.length; i++) { c[i] = o[i].toString().charAt(0); } String s = new String(c);
|