生活随笔
收集整理的這篇文章主要介紹了
算法题目:小于n的最大数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法題目:小于n的最大數
問題描述:給一個數組nums=[5,4,8,2],給一個n=5416, 讓你從nums中選出一些元素,使得組成的數字是小于n的最大數,比如這個例子應該返回5288
思想:貪心+二分
package 補充題目
;import java.util.Arrays;
public class 小于n的最大數
{public static void main(String[] args
) {int[] nums
= new int[]{4, 5};System.out
.println(build(4413, nums
));}public static int build(int num
, int[] arr
) {Arrays.sort(arr
);String maxStr
= getFindMaxNum(num
, arr
[0]);char[] res
= new char[maxStr
.length() - 1];boolean preIndexLess
= false;for (int i
= 0; i
< maxStr
.length() - 1; i
++) {int index
= preIndexLess
? arr
.length
- 1 : search(maxStr
, i
, arr
);res
[i
] = (char) (arr
[index
] + '0');if (res
[i
] < maxStr
.charAt(i
)) {preIndexLess
= true;}}return Integer.parseInt(new String(res
));}public static String getFindMaxNum(int num
, int minValue
) {boolean flag
= false;String numStr
= String.valueOf(num
);for (int i
= 0; i
< numStr
.length(); i
++) {if (minValue
> (numStr
.charAt(i
) - '0')) {flag
= true;break;}}int maxNum
= flag
? (int) (Math.pow(10, (numStr
.length() - 1)) - 1) : (num
- 1);String maxStr
= String.valueOf(maxNum
);return maxStr
+ maxStr
.charAt(maxStr
.length() - 1);}public static int search(String str
, int i
, int[] arr
) {int currentMaxNum
= str
.charAt(i
) - '0';int arrMinNum
= arr
[0];int findNum
= (str
.charAt(i
+ 1) - '0') >= arrMinNum
? currentMaxNum
: currentMaxNum
- 1;int left
= 0, right
= arr
.length
- 1;int index
= -1;while (left
<= right
) {int middle
= left
+ ((right
- left
) >> 1);if (arr
[middle
] == findNum
) {index
= middle
;break;} else if (arr
[middle
] < findNum
) {left
= middle
+ 1;} else {right
= middle
- 1;}}return (index
== (left
+ ((right
- left
) >> 1))) ? index
: right
;}
}
總結
以上是生活随笔為你收集整理的算法题目:小于n的最大数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。