日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法题目:小于n的最大数

發布時間:2023/12/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法题目:小于n的最大数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法題目:小于n的最大數
問題描述:給一個數組nums=[5,4,8,2],給一個n=5416, 讓你從nums中選出一些元素,使得組成的數字是小于n的最大數,比如這個例子應該返回5288
思想:貪心+二分

package 補充題目;import java.util.Arrays;/*** description:code** @author xiaozhenzhen001* @date 2022/6/13*/ 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);//查找目標最大值為 num-1 or 減一位后的最小值,String maxStr = getFindMaxNum(num, arr[0]);char[] res = new char[maxStr.length() - 1];// 當前位真實數據與【maxStr當前位】比較,影響下一位數據的選擇boolean preIndexLess = false;// key 貪心算法for (int i = 0; i < maxStr.length() - 1; i++) {// 要arr中的哪個位置數據,如果前一位比預期值小,則當前位可以取arr中最大值,否則二分查找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));}/*** 獲取要查找元素的最大值* minValue是數組中的最小值*/public static String getFindMaxNum(int num, int minValue) {/*** 正常目標要找的最大值應是 num-1* 特殊:但有種情況不滿足。這種情況拼不出來當前長度的數字,只能(長度-1)后的最大數* 如arr=[5, 4](最小值是4),num= 4413(最小值1) 。拼不出來(num-1),因為 4 < 1,所以查找的最大值應是 999 (num長度減一位后的最大值)*/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);}/*** key 二分查找*/public static int search(String str, int i, int[] arr) {// 1.確定當前位置的數據,選擇的數與下一個數字有關(如,下一位數字比arr的最小值還小,說明只能當前位減一)int currentMaxNum = str.charAt(i) - '0';int arrMinNum = arr[0];int findNum = (str.charAt(i + 1) - '0') >= arrMinNum ? currentMaxNum : currentMaxNum - 1;// 2.使用二分法進行查找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;}}// 3.找到就返回middle,否則返回right(arr[right]是比findNum小的最大值)// -1 表示表示arr中沒有比findNum小的值return (index == (left + ((right - left) >> 1))) ? index : right;} }

總結

以上是生活随笔為你收集整理的算法题目:小于n的最大数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。