蓝桥杯每日一题----第k个数

news2024/12/25 0:16:45

题目:第k个数
在这里插入图片描述
主要为了学习数字的构造方法,如何快速求1~n中前缀为pre的数字的个数。

题目分析

一开始想的是把数字转化为字符串,然后丢给sort排序就行了,但是n太大了,会出现溢出问题。走到这里也从侧面反映了对所有的数字排序然后输出第k个数字的方法是不可取的,那么可不可以直接构造出第k个数字呢?
首先查找一下以1开头的数字个数,假设是在1~321里面寻找,那么以1开头的数字有1+10+100=111个,如果k=13<111,说明可以确定排序为k的数字的第一位就是1,那么再枚举下一位,下一位枚举以10开头的数字个数(这里1是已经确定的,但是呢1也是以1开头的,在枚举10的时候相当于舍弃了数字1,所以这里要k–,减掉数字1)有1+10=11个,假设k=12>11,那么说明排序为k的数字的第二位不是0,那么按照字典序枚举下一个数字,但是此时,我们可以把以10开头的数字舍弃掉了,所以k-=11,k=1。即查找以11开头的数字的个数有1+10=11个,假设k<11,说明排名为k的数字是以11开头的,然后再找110开头的数字的个数是1个,刚好和k相等,说明我已经找到那个数字了,就是110。
我们自己按照字典序排一下,看一看是不是,
1,10,101,102,103,104,105,106,107,108,109,11,110
可以看到110刚好排在第13的位置,说明我们上面分析的过程是对的。接下来看一下刚刚那个代码应该怎么写。

 Scanner scanner = new Scanner(System.in);
 int n = scanner.nextInt();//数据范围为1~n
 int k = scanner.nextInt();//找字典序排名为第k的数字
  int cur = 1;//从以数字1开头的数字开始尝试
  while(k > 0) {
        long nums = get(n,cur,cur+1);//找以cur开头的数字的个数,具体怎么找后续讨论
        if(k==nums&&k==1) {//如果k和nums相等或者不相等,但是k=1了,都说明当前的数字cur就是我们要找的数字,
            System.out.println(cur);
            return;
        }
        if(nums < k) {//当前数字个数小于k,说明不是以cur开头的,就找下一个,即cur+1,同时排除掉以cur开头的数字,所以k-=num
            cur += 1;
            k -= nums;
        }else {//当前数字个数大于k,说明是以cur开头的,那么就令cur*=10,然后再接着找下一位应该是以啥开头,cur*=10说明我们舍弃了cur本身,所以这里k要减1
            cur *= 10;
            k -= 1;
        }
    }

接下来就是如何求以cur开头的数字个数了

方法一

假设求1~123中以cur=1开头的数字个数,这里再加一个辅助的cur1,cur1=cur+1=2,
数字位数为1位时:cur1-cur=2-1=1;
cur1*=10;cur*=10;
数字位数为2位时:cur1-cur=20-10=10;
cur1*=10;cur*=10;
数字位数为3位时:cur1-cur=200-100=100;(×)
我们达不到200,只能达到123,所以应该是
数字位数为3位时:min(cur1,n+1)-cur=123+1-100=24;
总结:
数字位数为p位时:num+=min(cur1,n+1)-cur;
所以这里的代码为,

private static long get(int n, long cur, long cur1) {
    // TODO Auto-generated method stub
    long nums = 0;//统计以cur开头的数字的个数
    while(cur <= n) {
        nums += Math.min(n+1, cur1)-cur;
        cur *= 10;
        cur1 *= 10;
    }
    return nums;
}

方法二

假设求1~123中以cur=1开头的数字个数,
base=cur=1;max=cur=1;
数字位数为1位时:max-base+1=1-1+1=1;
base*=10=10;max=max10+9=19;
数字位数为2位时:max-base+1=19-10+1=10;
base
=10=100;max=max*10+9=199;
数字位数为3位时:max-base=199-100+1=100;(×)
我们达不到200,只能达到123,所以应该是
数字位数为3位时:min(max,n)-base+1=123-100+1=24;
总结:
数字位数为p位时:num+=min(max,n)-base+1;
所以这里的代码为,

private static long get2(int n, long cur) {//13 1
    // TODO Auto-generated method stub
    long nums = 0;//统计以cur开头的数字的个数
    long base = cur;//19 13-10+1
    long max = cur;//10
    while(base <= n) {
        nums += Math.min(n, max)-base+1;
        max =max * 10+9;//和base位数相同但是是该位数下以cur开头的最大的数字
        base *= 10;
    }
    return nums;
}

全部代码



import java.util.Scanner;

public class Main{
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    int k = scanner.nextInt();
    int cur = 1;
//    k--;
    while(k > 0) {
//        long nums = get(n,cur,cur+1);
        long nums = get2(n,cur);
        if(k==nums&&k==1) {
            System.out.println(cur);
            return;
        }
//        System.out.println(cur + " " + nums);
        if(nums < k) {//当前字符个数小于k
            cur += 1;
            k -= nums;
        }else {
            cur *= 10;
            k -= 1;
        }
    }
    System.out.println(cur);
}

private static long get(int n, long cur, long cur1) {
    // TODO Auto-generated method stub
    long nums = 0;//统计以cur开头的数字的个数
    while(cur <= n) {
        nums += Math.min(n+1, cur1)-cur;
        cur *= 10;
        cur1 *= 10;
    }
    return nums;
}

private static long get2(int n, long cur) {//13 1
    // TODO Auto-generated method stub
    long nums = 0;//统计以cur开头的数字的个数
    long base = cur;//19 13-10+1
    long max = cur;//10
    while(base <= n) {
        nums += Math.min(n, max)-base+1;
        max =max * 10+9;//和base位数相同但是是该位数下以cur开头的最大的数字
        base *= 10;
    }
    return nums;
}
}

测试结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DBeaver添加阿里maven镜像

1、点击数据库->驱动管理器 2、选择任意数据库&#xff0c;点击编辑按钮 3、点击下载/更新(D) 4、点击下载配置 5、点击添加 6、添加阿里云地址 http://maven.aliyun.com/nexus/content/groups/public/ 7、将阿里云地址移动到首位并点击"应用并关闭"

【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现

盘点本年度探索对外服务的百万请求量的API网关设计实现 背景介绍高性能API网关API网关架构优化多级缓存架构设计多级缓存富客户端漏斗模型数据读取架构 异步刷新过期缓存网关异步化调用模型高性能批量API调用&#xff08;减少对于网关的交互和通信&#xff09;并行调用和请求合…

使用PHPStudy搭建本地web网站并实现任意浏览器公网访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

跟着pink老师前端入门教程-day18

3、CSS3 3D转换 生活中的环境是3D的&#xff0c;照片就是3D物体在2D平面呈现的例子 特点&#xff1a;近大远小&#xff0c;物体后面遮挡不可见 3.1 三维坐标系 三维坐标系其实就是指立体空间&#xff0c;立体空间是由3个轴共同组成的 x轴&#xff1a;水平向右 注意&#x…

【字符串】字典树

字典树就是利用一个这样的树状结构&#xff0c;可以记录字符串有没有出现过 放个板子 int nxt[100000][26], cnt; bool st[100000]; // 该结点结尾的字符串是否存在 void insert(string s, int l) // 插入字符串&#xff0c;l是字符串长度 { int p 0;for (int i 0; i < …

QT Linux下无法使用CTRL+ALT+P快捷键,不生效

文章目录 一、背景二、排查&#xff08;1&#xff09;检查创建&#xff0c;发现没问题。&#xff08;2&#xff09;查看 shortcutMap 是否注册&#xff08;3&#xff09;排查xcb有没有获取到该事件&#xff08;4&#xff09;排查是否是系统的问题&#xff08;5&#xff09;www.…

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

JS第一天、数据类型检测、内存释放

复习&#xff1a; 以下类型都是 object console.log(typeof new Object); console.log(typeof new Array()); console.log(typeof new Date()); console.log(typeof new RegExp()); console.log(typeof new String()); console.log(typeof new Number()); console.log(typeof…

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 哈希表实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int&g…

跨越视觉-语言界限:BLIP的多任务精细处理策略

BLIP 核心思想MED架构和CapFilt方法效果 总结CLIP模型 VS BLIP模型CLIP模型BLIP模型 核心思想 论文&#xff1a;https://proceedings.mlr.press/v162/li22n/li22n.pdf 代码&#xff1a;https://github.com/salesforce/BLIP BLIP&#xff08;Bootstrapping Language-Image Pre…

重生奇迹MU如何挂机

1、重生奇迹MU觉醒哪里挂机经验多挂机收益最大化&#xff0c;在重生奇迹MU中玩家可以通过副本获得大量的经验和金币&#xff0c;甚至挂机也有不错的收益&#xff0c;对于玩家来说 2、卡利玛神庙、血色城堡、迷失之城、恶魔广场甚至是挂机自动刷怪&#xff0c;组队都会有经验加…

linux安装naocs

一.安装jdk 二.安装nacos 1.下载nacos Releases alibaba/nacos GitHub 2.上传到服务器 3.解压nacos tar -zxvf nacos-server-2.3.0.tar.gz 会生成一个nacos文件夹 4.启动nacos 进入nacos/bin目录 cd nacos/bin 启动 ./startup.sh -m standalone 5.访问 http://…

【网络安全】2024年暗网威胁分析及发展预测

暗网因其非法活动而臭名昭著&#xff0c;现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心&#xff0c;为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势&#xff0c;近日&#xff0c;卡巴斯基的安全研究…

HarmonyOS远程真机调试方法

生成密钥库文件 打开DevEco Studio&#xff0c;点击菜单栏上的build&#xff0c; 填一些信息点击&#xff0c;没有key的话点击new一个新的key。 生成profile文件 AppGallery Connect (huawei.com) 进入该链接网站&#xff0c;点击用户与访问将刚生成的csr证书提交上去其中需…

每日学习笔记R2

【欧洲开发水面无人作战平台】 欧洲10个国家的23个企业联合开展“欧洲卫士”项目&#xff0c;目的是为欧洲多国海军开发一款配备远程控制系统的模块化水面无人作战潜艇。||项目成立的目的 该项目旨在通过提升作战平台和武器系统的先进化水平&#xff0c;满足欧盟各国海军日益…

DevOps落地笔记-15|混沌工程:通过问题注入提高系统可靠性

上一课时介绍了通过搭建一套部署流水线&#xff0c;高效、可靠的将软件部署到测试环境以及生产环境。到目前为止&#xff0c;我们学习了从用户需求到软件部署到生产环境交付给用户的全过程。随着软件工程不断发展&#xff0c;近几年&#xff0c;出现了一种新的实践&#xff0c;…

【240113】东北石油大学—调剂信息

东北石油大学 学校层级&#xff1a;双非 调剂专业&#xff1a;0857专业&#xff08;接收0854专业考生&#xff09; 发布时间&#xff1a;2024.1.13 发布来源&#xff1a;网络发布 背景&#xff1a;学习地点: 黑龙江省大庆市 (地处东北&#xff0c;冬季寒冷&#xff0c;需提…

springAop讲解

写在前面 本文旨在帮助入门和了解aop的概念以及基本用法&#xff0c;如有错误请在评论区指出&#xff0c;万分感谢。 部分资料出自尚硅谷课堂笔记,改内容更好&#xff0c;更完善。依赖准备 使用aop编程的话&#xff0c;我们需要先导入需要的依赖 spring-context: 包含Spring…

随记-Java项目处理SQL注入问题

现象&#xff1a;http://10.xx.xx.xx:xx/services/xxService 存在SQL注入情况 加固意见&#xff1a; 需要对网站所有参数中提交的数据进行过滤&#xff0c;禁止输入“"、"xor"、"or"、”--“、”#“、”select“、”and“等特殊字符&#xff1b;所有…

【LongChain-03】在本地运行LLM的另一些案例

​ 一、使用案例说明 PrivateGPT、 llama.cpp和 GPT4All等项目的流行 强调了在本地&#xff08;在您自己的设备上&#xff09;运行 LLM 的需求。 这至少有两个重要的好处&#xff1a; Privacy&#xff1a;您的数据不会发送给第三方&#xff0c;并且不受商业服务的服务条款的约…