当前位置: 首页 > news >正文

2023年蓝桥杯模拟省赛——列名

目录

题目链接:2.列名 - 蓝桥云课 (lanqiao.cn)

思路

高级思路:进制转换

难点一

难点二

难点三

总结


题目链接:2.列名 - 蓝桥云课 (lanqiao.cn)

思路

先来看我的暴力的思路吧

主要有以下步骤:

  1. 初始化一个长度为3的数组res用于存放结果,并且定义一个变量 表示目前数组中的有效长度 - 1(即当前操作的位置)。变量p的初始值为0,表示当前数组的有效长度为1。

  2. 通过一个for循环生成2022次操作。操作主要分为两步:

    第一步,判断当前数组中所有有效元素是否全部为26。如果是,就将数组的所有有效元素都重置为1,并且扩大数组的有效长度1位(即p加1)。

    第二步,将有效位置(p位置)的元素加1。若此元素达到26,将该元素归零,并令前一个元素加1。若前一个元素也达到26,则会连带影响到再前一个元素,依此类推。

  3. 当循环完成2022次 after 操作后,我们会得到一个长度为3的数组,该数组中的元素值在1至26之间,可映射为字母序列。

        这段代码就是通过特定的规则,生成一个特殊的字母序列。这个序列的特点是每个单词都不同,并且在字母顺序上是递增的。这个序列可以类比为一种自定义的26进制计数系统,每一位的取值范围是1-26,对应到字母就是A-Z,每次计数完成后,会在需要的时候往上进位。

package src;import java.util.Arrays;
//1:无需package
//2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {// StreamTokenizer st = new StreamTokenizer(new BufferedReader(new// InputStreamReader(System.in)));int[] res = new int[] { 0, 0, 0 };int p = 0;for (int i = 0; i < 2022; i++) {// System.out.println(Arrays.toString(res));boolean flag = true;// 判断是否全部为 26for (int j = 0; j <= p; j++) {if (flag && res[j] != 26) {flag = false;}}// 是,那么就要加一位了if (flag) {for (int j = p; j >= 0; j--) {res[j] = 1;}p++;}if (p > 0 && res[p] == 26) {res[p] = 0;boolean flag2 = true;if (res[p - 1] == 25) {flag2 = false;}if (flag2 && p - 1 > 0 && res[p - 1] == 26) {res[p - 1] = 0;res[p - 2]++;}res[p - 1]++;}res[p]++;}// ABCDEFGHIJKLMNOPQRSTUVWXYZ// !                  !    !// System.out.println(Arrays.toString(res));}
}

虽然说麻烦了一点,但你就是说能不能写出来吧沃kao

 


高级思路:进制转换

import java.util.Scanner;
// 1:无需package
public class 列名 {public static void main(String[] args) {int n = 2022;String s = "";while (n > 0) {s = (char)(--n % 26 + 'A') + s;n /= 26;}System.out.println(s);}
}

是不是看起来很简单但是很*****™看不懂是吧

我来解释一波

难点一

为什么这个是实现了进制转换的操作

答:

        在计算机科学中,进制转换是一项常见的操作。对于整数,我们通常使用除法和取余操作来实现进制转换。

假设我们有一个十进制数 n,我们想把它转化为 b 进制数,那么我们可以按照以下步骤操作:

  1. 对 n 求余数(对 b 取模),得到的余数是新进制下的最低位。
  2. 对 n 进行整除操作(除以 b),得到的商用于下一轮计算。
  3. 重复步骤 1 和 2,直到商为 0。

        结果就是所有余数(即新进制下的数字)的序列,只不过这个序列是从低位到高位排列的,所以我们需要将它反向输出。

        举个例子,把十进制的13转换为二进制:

  1. 13 % 2 = 1,13 / 2 = 6
  2. 6 % 2 = 0 ,  6 / 2 = 3
  3. 3 % 2 = 1,  3 / 2 = 1
  4. 1 % 2 = 1,  1 / 2 = 0

所以,13在二进制下的表示就是1101。

        在这个代码中,n模26得到的余数表示的是26进制下的某一位,然后除以26得到的商作为下一次计算的基数。所以这就是一个将十进制转换为26进制的过程。

难点二

为什么这里使用的是 --n 而不是 n--

        在这段代码中,"--n"是先减1再进行后续操作,原因在于我们把'A'到'Z'视为1到26,而非0到25。所以需要先减1来把范围转变为0到25,这样才能利用(char) (n % 26 + 'A')把0-25映射到'A'-'Z'。

        假设你使用“n--”,那么当n=26时,模26的结果为0,转换为字符得到的是'A'-1,这并不是我们想要的结果。所以我们需要先减1,使得n在被模之前就已经减1,这样我们在对模26的结果进行字符转换时得到的就是我们期望的结果。

        总的来说,“--n”是为了把'A'-'Z'对应到1-26而不是0-25,它确保了当n是26的倍数(如26, 52等)时,我们得到的结果是'Z'而不是'Y'。

        另一方面,对于“n--”和“--n”在循环体内的有无区别的问题,实际上在循环体内,“n--”和“--n”的区别只在于他们的值是在执行这条语句之后还是之前改变的。

难点三

你怎么知道可以使用进制转换,为毛啊!!!愤(•́へ•́╬)

        这题的本质在于对给定的十进制数字进行一个从1到26的映射,而这个映射在某种程度上就像是在做进制转换,具体来说,就是把十进制转换为26进制。

        为什么说它像进制转换呢? 因为在任意进制系统中,每增1,最低位就会+1,若已经达到该位可表示的最大值,那么就归0并使得上一位+1,这和在1到26之间映射的操作是一致的(如在十进制中,个位9加1后变为0,十位加1。在二进制中,1加1后变为10,个位由1变为0,并进一位到十位)。所以,我们可以把这道题视为一个进制转换问题来解决。

        在这道题中,我们假设'A'-'Z'分别表示1-26,那么给定一个十进制数n,n模26就得到26进制下的一个"数字",赋予它字符表示就等同于赋值字母'A'-'Z'。因为26进制数的每一位数都在0-25之间,但我们需要的是0-25所对应的'A'-'Z',所以在模操作前我们需要减1,使得能够正确匹配。

        之所以我们可以这样解决这道题,就是因为这道题的要求和进制转换的特性高度吻合,这种解法也能很好地满足题目的要求。

        而且这也算是一个模版类型,大家可以好好的记住哦!!!

总结

牛,继续加油!!!

但是还是要多看看,以免忘记

相关文章:

  • Qt5.9.6+VS2015 部署PCL1.8.1
  • Qt笔记 信号和槽
  • vue中动态显示时间
  • JavaScript 面试题
  • Vue2 和Vue3 双向数据绑定的区别和原理
  • word转pdf怎么转换?这几个转换技巧收好
  • Python将 PDF 转换为 png 图片的教程
  • 【vue2源码】模版编译
  • 室友打团太吵?一条命令断掉它的WiFi
  • Nanya(南亚科技)DRAM芯片选型详解
  • 10:00面试,10:06就出来了,问的问题有点变态。。。
  • 2024.3.19
  • diffusion model(十四): prompt-to-prompt 深度剖析
  • QT 驾校系统界面布局编写
  • Nginx安装和平滑升级
  • JavaScript-如何实现克隆(clone)函数
  • Angular 4.x 动态创建组件
  • Apache的80端口被占用以及访问时报错403
  • Javascript Math对象和Date对象常用方法详解
  • js
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue 配置sass、scss全局变量
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Wamp集成环境 添加PHP的新版本
  • 解析带emoji和链接的聊天系统消息
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端_面试
  • 前端设计模式
  • 实现简单的正则表达式引擎
  • 小程序button引导用户授权
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 1.Ext JS 建立web开发工程
  • python最赚钱的4个方向,你最心动的是哪个?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #android不同版本废弃api,新api。
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • ${factoryList }后面有空格不影响
  • (LeetCode 49)Anagrams
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (十) 初识 Docker file
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (轉貼) UML中文FAQ (OO) (UML)
  • *2 echo、printf、mkdir命令的应用
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Core 中间件验签
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 常见的偏门问题