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;
			// 判断是否全部为 26
			for (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,使得能够正确匹配。

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

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

总结

牛,继续加油!!!

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WEB前端项目开发——(一)(2024)

目录 1 通过Git Bash安装 vue-cli 2 创建项目 3 解决Git Bash方向键失效 4 重新进行项目创建 5 浏览器输入地址查看 6 案例——简单修改v3-calendar中的内容 7 测试页面效果 本篇文章介绍通过了Git Bash创建v3-calendar项目&#xff0c;之后对v3-calendar进行简单…

ChatGPT国内镜像站大全

#今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像站到处都是&…

【GPT-SOVITS-04】SOVITS 模块-鉴别模型解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

【C语言】linux内核软中断

一、什么是软中断&#xff1f; 内核中的软中断&#xff08;Softirqs&#xff09;和任务下半部&#xff08;Tasklets&#xff09;是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程&#xff08;ISR&#xff09;中执行耗时操作或…

ChatGPT :确定性AI源自于确定性数据

ChatGPT 幻觉 大模型实际应用落地过程中&#xff0c;会遇到幻觉&#xff08;Hallucination&#xff09;问题。对于语言模型而言&#xff0c;当生成的文本语法正确流畅&#xff0c;但不遵循原文&#xff08;Faithfulness&#xff09;&#xff0c;或不符合事实&#xff08;Factua…

Linux下进程的调度与切换

&#x1f30e;进程的调度与切换 文章目录&#xff1a; 进程的调度与切换 进程切换 进程调度       活动状态进程队列       位图判断       过期队列 总结 前言&#xff1a; 在Linux操作系统中&#xff0c;进程的调度与切换是操作系统核心功能之一&#xff…

【LabVIEW FPGA入门】流水线

LabVIEW中流水线 在当今多核处理器和多线程应用程序的世界中&#xff0c;程序员在开发应用程序时需要不断思考如何最好地利用尖端 CPU 的强大功能。尽管用传统的基于文本的语言构建并行代码可能难以编程和可视化&#xff0c;但 NI LabVIEW 等图形开发环境越来越多地允许工程师和…

学习笔记 | 微信小程序项目day02

今日学习内容 安装uni-ui跟uni-helper/uni-ui-types配置pinia持久化请求工具类的拦截器请求工具类的请求函数 安装uni-ui跟uni-helper/uni-ui-types npm install -g cnpm --registryhttps://registry.npmmirror.com npm set registry https://registry.npmmirror.com npm i …

电脑充电器能充手机吗?如何给手机充电?

电脑充电器可以给手机充电吗&#xff1f; 电脑充电器可以给手机充电&#xff0c;但前提是电脑充电器的功率输出与手机的功率匹配且接口匹配。 假设电脑充电器的输出功率为5V/2A&#xff0c;手机也支持5V/2A的输入功率。 只要接口匹配&#xff0c;就可以使用电脑充电器给手机充…

2024智慧农场系统微信小程序前端如何上传以及配置

2024智慧农场系统微信小程序前端如何上传以及配置 首先下载微信开发者工具 下载好以后打开&#xff0c;然后导入项目 前端修改&#xff1a;siteinfo.js 里面的域名信息 改完之后开始在微信开发者工具中开发工具中编译、上传、发布即可

vim | 介绍vim以及配置vimrc文件

好像熟练使用vim 是玩linux 必修课 当然&#xff0c;初代玩家能在vim 完成编辑 并保存已是入门了&#xff0c;想当初在大学的时候&#xff0c;死活转不过来&#xff0c;玩不过来&#xff0c;甚至有些恐惧 但后来&#xff0c;弄清楚原理&#xff0c;反倒觉得简简单单已是完美了。…

19. UE5 RPG使用GameplayEffect的Attribute Based Modifiers

前几篇文章我也说了GE的基础使用&#xff0c;但是&#xff0c;对一些属性的应用没有述说&#xff0c;后续&#xff0c;我将一点一点的将它们如何使用书写下来。 这一篇&#xff0c;主要就讲解一下Attribute Based Modifiers使用&#xff0c;先说一下它的应用场景&#xff0c;一…

C++ -- 多态

多态 1. 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 2. 多态的定义及实现 2.1多态的构成条件 多态是在不同继承关系的类对象&#xff0c;去调用同一函…

实现界面跳转及注册界面编写(AndroidStudio)

目录 一、代码 二、最后效果 一、代码 1.先新建一个activity文件 2.注册界面的代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:la…

Docker学习之数据管理(超详解析)

Docker存储资源类型&#xff1a; 用户在使用 Docker 的过程中&#xff0c;势必需要查看容器内应用产生的数据&#xff0c;或者需要将容器内数据进行备份&#xff0c;甚至多个容器之间进行数据共享&#xff0c;这必然会涉及到容器的数据管理&#xff1a; &#xff08;1&#xff…

Java代码基础算法练习-判断素数-2024.03.17

任务描述&#xff1a; 输入一个数x&#xff0c;判断它是否是素数。 提示&#xff1a;素数是只能被1和它本身整除的数&#xff0c;1不是素数。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class March0317 {public …

LeetCode 面试经典150题 55.跳跃游戏

题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 思路…

django实现api接口

&#xff08;前期准备&#xff09;第一步&#xff1a;虚拟环境 在windows上使用virtualenvwrapper。 pip install virtualenvwrapper-win 接着&#xff0c;添加环境变量。 echo %WORKON_HOME% 接下来就是创建虚拟环境&#xff0c;假如创建myenv mkvirtualenv myenv 进入…

RabbitMQ——死信队列和延迟队列

文章目录 RabbitMQ——死信队列和延迟队列1、死信队列2、基于插件的延迟队列2.1、安装延迟队列插件2.2、代码实例 RabbitMQ——死信队列和延迟队列 1、死信队列 死信队列&#xff08;Dead Letter Queue&#xff0c;DLQ&#xff09;是 RabbitMQ 中的一种重要特性&#xff0c;用…

ChatGPT编程实现简易聊天工具

ChatGPT编程实现简易聊天工具 今天借助[[小蜜蜂]][https://zglg.work]网站的ChatGPT练习socket编程&#xff0c;实现一个简易聊天工具软件。 环境&#xff1a;Pycharm 2021 系统&#xff1a;Mac OS 向ChatGPT输入如下内容&#xff1a; ChatGPT收到后&#xff0c;根据返回结…
最新文章