蓝桥杯 B 组试题 B:年号字串

2020/2/6
算法代码
Java

第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组

试题 B: 年号字串 【问题描述】

小明用字母 A 对应数字 1, B 对应 2, 以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或者更长的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 52, LQ 对应 329。

请问 2019 对应的字符串是什么?

这一道题可以看按进制的方式来处理,但是有几个注意点:

  1. 没有 0 这一数位,每个字符只能代表 1~26, 所以在取值和进位的时候多了一些限制
  2. 一些代码在用 2019 进行测试的时候,是可以得到正确结果的,但是如果传入的数对应的字符串存在 Z 或者邻近 Z 的情况,会发现很容易出错,因为这个原因我也改了挺久的代码
  3. 在计算该位最大取值的时候要算好后面位数可以取的最小值,否则会出现当前位的字符的数值取完,剩下的数比后面位数全取 A 时还小,这样算法可能不会报错,但是得出来的结果会比预想的大。

下面是我的 Java 实现代码,代码可以分为 3 个大步骤,在关键的第 3 步可以分为 3 个小部分。

public static String B(int num) {
    // 步骤1
    char[] S = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
    StringBuilder s = new StringBuilder();
    int sub = 0;
    // 步骤2
    for (int count = 0; (Math.pow(26, sub + 1)) + count < num; count += Math.pow(26, sub)) sub++;
    // 步骤3
    while (sub >= 0) {
        // 3.1
        int fig = 1;
        int POW = (int) Math.pow(26, sub);
        int count = 0;
        for (int i = sub - 1; i >= 0; i--) count += Math.pow(26, i);
        // 3.2
        while (num - POW * (fig + 1) >= (POW == 1 ? 0 : count)) fig++;
        num = num - POW * fig;
        // 3.3
        s.append(S[fig - 1]);
        sub--;
    }
    return s.toString();
}

步骤 1: 先初始化好存字符的数组、存字符串的 StringBuildfer、以及存储位数的 sub 变量

步骤 2: 计算这个数转化成字符串需要多少位个字符(多少位)

步骤 3:

  1. 初始化好代表当前位数值的 fig, 以及当前位 1 个 fig 代表多大的数,通过 for 循环来获取当前位后面位数可以存储的最小和 count, 以避免后面位数最小取值比剩余值大
  2. 通过循环计算 fig 可以取得最大值,当前位不是最后一位时,剩余值应当大于 count, 当前位是最后一位时,剩余值到达 0 停止
  3. 把当前位取值对应的字母添加到 s 里,进入下一位的循环

最后返回 s 的字符串

接下来传入测试数据来测试结果

public static void main(String[] args){
    int[] nums = {26, 27, 52, 329, 675, 676, 677, 702, 2019, 2027, 2028, 2029, 17575, 17576, 17577, 18278};
    for (int num : nums) {
        System.out.println(num + "的转化结果" + B(num));
    }
}

输出的结果应当如下所示:

26的转化结果Z
27的转化结果AA
52的转化结果AZ
329的转化结果LQ
675的转化结果YY
676的转化结果YZ
677的转化结果ZA
702的转化结果ZZ
2019的转化结果BYQ
2027的转化结果BYY
2028的转化结果BYZ
2029的转化结果BZA
17575的转化结果YYY
17576的转化结果YYZ
17577的转化结果YZA
18278的转化结果ZZZ
Post Order
By Time : DESC
Article Statistics
Article: 35
Categories: 4
Tags: 18