华为OD机试之数列描述(Java源码)

news/2024/12/2 15:46:35/

数列描述

题目描述

有一个数列a[N] (N=60),从a[0]开始,每一项都是一个数字。数列中a[n+1]都是a[n]的描述。其中a[0]=1。规则如下:

  • a[0]:1
  • a[1]:11(含义:其前一项a[0]=1是1个1,即“11”。表示a[0]从左到右,连续出现了1次“1”)
  • a[2]:21(含义:其前一项a[1]=11,从左到右:是由两个1组成,即“21”。表示a[1]从左到右,连续出现了两次“1”)
  • a[3]:1211(含义:其前一项a[2]=21,从左到右:是由一个2和一个1组成,即“1211”。表示a[2]从左到右,连续出现了1次“2”,然后又连续出现了1次“1”)
  • a[4]:111221(含义:其前一项a[3]=1211,从左到右:是由一个1、一个2、两个1组成,即“111221”。表示a[3]从左到右,连续出现了1次“1”,连续出现了1次“2”,连续出现了两次“1”)

请输出这个数列的第n项结果(a[n],0≤n≤59)。

输入描述

数列的第n项(0≤n≤59) 例如
4

输出描述

数列的内容
111221

源码和解析
解析:

这个题重在理解 即求连续字符的个数与字符组成的新数字
如第一项为1 (1个1) 那么下一项是11 (2个1),下一项是21(1个2 和1个1)=>1211
(1个1,1个2,2个1)=>111221(3个1,2个2,1个1)=?312211…
这个题其实也还是偏逻辑性强一些,当然其也涉及到DP算法(动态规划算法),算法不知道无所谓,但是要有这种处理问题的思维。
注意:

  1. 如果这个题用String或者int来存储值,那么结果是打印不出来的。
    因为最大字符长度(65535) ,可以通过Integer.MAX_VALUE得到。
  2. 我这里使用的List来进行存储的。因为其长度可以自动扩展
  3. 如果使用的是Eclipse软件,那么其控制台打印字符长度也不能过长,否则就是空白。不利于测试。所以需要对Eclipse进行配置。
  4. 原本打算使用一个List内部装一个List,这样可以实现将前面所有产生的过程数据都存储起来,但是这样有点耗费内存。所以用一个List存储结果即可。

示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class T40 {public static void main(String[] args) {List<Character> first = new ArrayList<Character>();first.add('1');Scanner sc = new Scanner(System.in);int num = sc.nextInt();for (int i = 1; i < num + 1; i++) {first=next(first);}// String 超出长度就不显示了 大概37就超出了// StringBuilder是能存的 但是toString后就空白了System.out.println(first.size());for(Character c:first){System.out.print(c);}}public static List<Character> next(List<Character> number) {List<Character> numList = new ArrayList<Character>();if (number.size() == 1) {numList.add('1');numList.add(number.get(0));return numList;}int start = 0;int end = 1;while (end < number.size()) {if (number.get(end) == number.get(start)) {if (end == number.size() - 1) {// 相等且到达最后一位String num = "" + (end - start + 1);for (int i = 0; i < num.length(); i++) {numList.add(num.charAt(i));}numList.add(number.get(start));}end++;} else {String num = "" + (end - start);for (int i = 0; i < num.length(); i++) {numList.add(num.charAt(i));}numList.add(number.get(start));start = end;end++;// 有可能直接到达末尾if (end == number.size()) {String num1 = "" + (end - start);for (int i = 0; i < num1.length(); i++) {numList.add(num1.charAt(i));}numList.add(number.get(start));}}}return numList;}
}

示例图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当输入的索引为59时,其产生的序列长度12680852,一千多万的长度。用字符串怎么存??
在这里插入图片描述


http://www.ppmy.cn/news/117685.html

相关文章

IEEE1588工业以太网交换机

工业网络环境必备IEEE1588工业以太网交换机 SYN2421型IEEE1588工业以太网交换机是一款支持IEEE1588网络测控系统精确时钟同步协议的高性能网管型工业以太网交换机&#xff0c;支持基于硬件时间戳的IEEE1588v2&#xff0c;支持主时钟、从时钟、BC、P2P TC和E2E TC等多种时钟模式…

华为S2700以及S5700系列交换机 配置(详细)

1. 串口登录 a. 华为附带的232串口线&#xff0c;通过232转usb后连接交换机的console口和pc的usb口 因用的win7&#xff0c;安装超级终端Hyper Terminal&#xff0c;以及usb转com口驱动 b、登录配置如上图 c.命令&#xff1a; <Quidway> 用户视图 system-view命…

华为S5720交换机堆叠配置

前几天来了两台华为S5720交换机&#xff0c;做下堆叠&#xff0c;两条线&#xff0c;交叉互联&#xff08;即A交换机23口连到B交换机24口&#xff0c;A交换机24口连接B交换机23口&#xff09;。 PS&#xff1a; S5720堆叠可基于电口或者光口做&#xff0c;本次测试基于电口。 S…

华为交换机S5720-EI堆叠

华为交换机S5720-EI堆叠 一、背景 公司机房里有两台S5720-EI交换机&#xff0c;都是以级联的方式连接核心交换机&#xff0c;为了简化网络拓扑提高网络的冗余性&#xff0c;对两台设备进行堆叠。 二、前期准备 1、准备好一对堆叠卡或者是支持堆叠的光模块&#xff08;其实一…

迈普S5820万兆交换机配置策略路由案例

目录 一、背景介绍 &#xff08;一&#xff09;拓扑 ​&#xff08;二&#xff09;说明 二、配置参考 &#xff08;一&#xff09;配置三层动作组&#xff0c;将报文重定向到下一跳192.168.2.11 &#xff08;二&#xff09;配置扩展acl&#xff0c;绑定三层动作组 &…

s8050的参数

S8050是一款小功率NPN型硅管&#xff0c;集电极-基极(Vcbo)电压最大可为40V&#xff0c;集电极电流为(Ic)0.5A。S8050是电路硬件设计最常用半导体三极管型号之一。 下面是的s8050参数资料&#xff1a; 类型&#xff1a;NPN 集电极耗散功率Pc&#xff1a;0.625W(贴片&#xff1a…

h3c s5820交换机_简单配置

◆命令视图 需要配置某一个功能的某一条命令时,需要首先进入命令所在的视图。不同的试图具有不同的 提示符。

H3C s5820v2 堆叠2台机器配置说明

机器型号 IDC-JXQ-L8-CORE5 s5820v2连接线配置&#xff1a; R1 1/0/49 ——> R2 2/0/49 R1 1/0/50 ——> R2 2/0/50 查看命令&#xff1a; dis irf dis interface brief 初始化命令&#xff1a; reset saved-configuration 选择Y&#xff0c;然后 reboot 选择N&#xff…