求第K个幸运数字(只由4、7或者他们的组合构成的数称为幸运数字)
记录一道没见过的题【幸运数字】
1. 题目描述
如题,只由4
和7
或者他们的组合构成的数字称为幸运数字,这个列表按照从小到达排序。
求第K
个数是多少。
示例1:
输入:k = 5
输出:74
说明K
很大,0<K<10180 <K<10^{18}0<K<1018。
2. 解答
不妨先将之写出来:
4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744, 747, 774, 777...
可以构建这么一颗二叉树:
private int Main(int K){//1. 求解高度: 向下取整再加1int h = (int) Math.floor(Math.log(K + 1)/Math.log(2)) + 1;//2. 求解上层到跟节点的节点总数(包括虚拟节点)int num = (int) (Math.pow(2, h - 1) - 1);//3. 求解元素所在当前层的下标位置idxint idx = (K + 1) - num - 1; // 总元素个数 - 上层到根元素个数 - 1 表示下标//4. 求解映射关系StringBuilder sb = new StringBuilder();for (int i = 0; i < h - 1; i++) {if((idx & 1) == 0)sb.append("4");else sb.append("7");idx = idx >> 1;}return Integer.parseInt(sb.reverse().toString());
}
注释:
logab=log2blog2alog_a^b = \frac{log_2^b}{log_2^a} logab=log2alog2b
因为Java中只提供了log10,故而需要使用下面的计算法方式:
Math.log(K + 1)/Math.log(2)
求第K个幸运数字(只由4、7或者他们的组合构成的数称为幸运数字)相关推荐
- 周杰伦官宣数智人“周同学”,数智人与数字人,不止一字之差
数据智能产业创新服务媒体 --聚焦数智 · 改变商业 5月8日,周杰伦亮相中国移动元宇宙总部,与中国移动达成元宇宙领域系列合作,共同推出了数智人"周同学". 周杰伦从 2003 ...
- 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字
去年写了一篇对快排进行改进的算法,可以在时间复杂度 O(n)O(n)O(n)的情况下,找到第kkk小的数字. 那时候,我还不知道这个算法叫BFPRT算法--现在知道了,还知道它又被称为中位数的中位数算 ...
- BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)
我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . 去年写了一篇<分治算法 求第kkk小元素 O(n)O(n)O(n) & O( ...
- 两个有序数组合起来求第k小的数+左老师专访ACM大神(笔记)8月5日斗鱼直播实录
1.长度相等的两个有序数组寻找上中位数 注:上中位数1 2 3 4 5 6为3(偶数两个中位数为前面那个) 思路:去掉不可能为上中位数的,剩下的简化组合求上中位数. 1.1 奇数序列 位置 位置 位置 ...
- [leetcode]堆排序 求前k大的数
前一篇博客中写到了排序算法,其中包含一个堆排序,因此本篇博客讲解堆这个数据结构及其应用. 关于最大堆最小堆以及初始建堆和整理堆在上篇博客中有提及,此处不再赘述.下面讲解一个堆的重要应用,求n个数中前k ...
- 堆实战(动态数据流求top k大元素,动态数据流求中位数)
动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...
- A*算法的认识与求第K短路模板
现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...
- 选择问题(求第k个最小元素)
什么是选择问题 划分的思路 Lomuto 划分 利用划分求第k小元素 C语言实现 改进 参考资料 什么是选择问题 选择问题(selection problem)是求一个n个数列表的第k个最小元素的问题 ...
- Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小
7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...
最新文章
- APP程序内部打开某个APP的AppStore页面
- 017-平衡二叉树(三)
- 【Linux】一步一步学Linux——type命令(200)
- mysql查询时传入中文时的乱码问题
- 【Python-3.3】字典中存储列表
- vscode是什么(vscode干嘛用的)
- 前端bugger 后端debug 介绍系统内部逻辑 压测新增订单接口 tps上不去 ,oom ,常见性能问题 ,性能分析思路
- 铁血战士之异形大战铁血战士2 观感
- 解决 Ubuntu 22.04 Fractional Scaling 画面伸缩后应用程序模糊
- android gps定位工具类,Android原生GPS和网络定位工具类
- 群、环、域的概念,定义和理解.
- Banana Pi 消息
- Java实现递归 斐波那契数列 阶乘
- 植物大战僵尸:查找植物叠加种植CALL
- 多重引导的另一种方法
- 维特智能4g远程物联姿态三轴加速度角度传感器WT901IOT
- 多种详细讲解小程序页面传值
- 通信的数学理论_《香农传》告诉你为什么要学好数学
- 爬取(明星网)明星面部数据
- wpf中textblock竖立显示文本