算法题目:小于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的最大数相关推荐

  1. 字节跳动经典算法题:给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数

    字节跳动经典算法题(提问次数最多) 题目描述:给定一个数n如23121:给定一组数字a,如[2 4 9]:求由a中元素组成的小于n的最大数. 思路分析:暴力分析手法 1. 判断该位的数值是否在数字a中 ...

  2. java 完美洗牌,(2)数组相关算法题目

    数组是最简单的数据结构,占据连续内存并且按顺序存储. 以下是与数组有关的算法题目. (1)查询数组中重复数字 算法思路:(1)利用hash表,没有便放进去,有就返回(Java中HashMap存数字都是 ...

  3. 数据结构与算法题目集PTA

    数据结构与算法题目集PTA 6-1 单链表逆转 6-2 顺序表操作集 6-3 求链式表的表长 6-4 链式表的按序号查找 6-5 链式表操作集 6-6 带头结点的链式表操作集 6-7 在一个数组中实现 ...

  4. PTA数据结构与算法题目集6-4 6-3 6-8

    PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...

  5. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

  6. leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!

    " 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...

  7. 微软面试中简单的算法题目(转)

    微软面试中简单的算法题目(转) (说明:这些题就不是什么花样了,考的是你的基础知识怎么样.再聪明而没有实学的人都将会被这些题所淘汰.)  1.链表和数组的区别在哪里? ANSWER 主要在基本概念上的 ...

  8. 算法题目中经典问题(易错点)

    算法题目中经典问题.易错点 (一).二维数组的传参问题 1.方法一:形参为二维数组并给定第二维长度 2.方法二:形参为指向数组的指针并给出数组长度 3.二维数组定义为全局变量 (二).多组测试控制台数 ...

  9. PTA 数据结构与算法题目集(中文)

    一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...

  10. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

最新文章

  1. 现代内存编号解读(转)
  2. android混淆多个a b c,混淆A,B,C网络类
  3. Android Application中的Context和Activity中的Context的异同
  4. php怎么生成前端网页,PHP自动生成前端的表单框架
  5. 2021年互联网企业软件测试面试题(超实用)
  6. 帆软报表和jeecg的进一步整合--ajax给后台传递map类型的参数
  7. 论文浅尝 | LightRNN:存储和计算高效的 RNN
  8. Intel超线程技术 Hyper-Threading Technology (2) - 早期实现 - 概述
  9. Pessimistic and Optimistic locking
  10. 很好用的软件 RouterPassView
  11. HTTP响应状态代码----客户端错误(400–499)
  12. 高频量化交之李庆:在华尔街狼共舞的岁
  13. 一文曝光字节跳动薪资职级,资深开发的收入你意想不到~
  14. 今天上班穿了一只拖鞋和一只凉鞋
  15. C语言基础概述(一)
  16. 计算机中大量文件需要管理怎么办,怎么处理目标文件系统文件过大
  17. DCC尺寸链计算与公差仿真分析软件 软件应用案例以及授权文件
  18. E. Divide Points(想法 黑白染色 坐标转换)
  19. excel图表坐标轴怎么加上标?
  20. areas表-省市区

热门文章

  1. Python替换月份为英文缩写
  2. 解决checkbox复选框未选中时不传值的问题 / 判读复选框是否选中
  3. 多媒体音箱选购指南--理论篇
  4. kuangbin专题十二 HDU1069 Monkey and Banana
  5. 市场调研—2021-2027全球与中国肌酸激酶试剂市场现状及未来发展趋势
  6. 服务器防火墙firewalld,指定端口开放
  7. 苹果用计算机密码,苹果mac修改用户名与密码的方法 苹果电脑如何修改开机密码...
  8. 北京春运更智能:自助验票、微信查询
  9. Mac版OneNote同步报错E000006B ctctv
  10. Python 自动发送邮件