小U数数 | 豆包MarsCode AI 刷题

69 阅读3分钟

小U数数 | 豆包MarsCode AI 刷题

小U正在数偶数,从 (0, 2, 4, 6, 8, 10, 12, \ldots) 开始,依次将这些数连在一起,形成一个无穷长的字符串,例如:"0246810121416..."。小U想知道这个字符串中的第 ( n ) 个字符是什么。本文将探讨如何帮助小U找到这个字符,并提供详细的代码实现。

问题描述

小U正在数偶数,从 (0, 2, 4, 6, 8, 10, 12, \ldots) 开始,依次将这些数连在一起,形成一个无穷长的字符串。目标是帮助小U找到这个字符串中的第 ( n ) 个字符。

解决方案

为了帮助小U找到字符串中的第 ( n ) 个字符,我们可以分以下几个步骤来实现:

  1. 初始化变量
    • num:当前的偶数,初始值为0。
    • len:当前字符串的长度,初始值为0。
  2. 构建字符串
    • 使用一个循环,依次将每个偶数转换为字符串,并累加其长度。
    • 当累加的长度超过或等于 ( n ) 时,停止循环。
  3. 确定目标字符
    • 由于循环停止时,num 已经加了2,需要减去2以恢复到正确的偶数。
    • 计算目标字符在当前偶数字符串中的位置,并返回该字符。

代码实现

public class Main {
    public static int solution(int n) {
        int num = 0;
        int len = 0;
        
        // 构建字符串,直到长度超过或等于 n
        while (len < n) {
            String s = String.valueOf(num);
            len += s.length();
            num += 2;
        }
        
        // 恢复到正确的偶数
        num -= 2;
        
        // 计算目标字符在当前偶数字符串中的位置
        String s = String.valueOf(num);
        int index = n - (len - s.length()) - 1;
        
        // 返回目标字符
        return s.charAt(index) - '0';
    }
    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution(6) == 1);  // 输出:true
        System.out.println(solution(10) == 1);  // 输出:true
        System.out.println(solution(15) == 8);  // 输出:true
    }
}

代码解释

  1. 初始化变量
    • num:当前的偶数,初始值为0。
    • len:当前字符串的长度,初始值为0。
  2. 构建字符串
    • 使用一个 while 循环,依次将每个偶数转换为字符串 s,并累加其长度 len
    • 每次循环,num 增加2。
    • len 超过或等于 n 时,停止循环。
  3. 确定目标字符
    • 由于循环停止时,num 已经加了2,需要减去2以恢复到正确的偶数。
    • 计算目标字符在当前偶数字符串中的位置 index,即 n - (len - s.length()) - 1
    • 返回目标字符 s.charAt(index) - '0',将字符转换为整数。

测试样例

  • 样例1n = 6,输出:1
    • 解释:字符串 "0246810121416..." 中的第6个字符是 '1'。
  • 样例2n = 10,输出:1
    • 解释:字符串 "0246810121416..." 中的第10个字符是 '1'。
  • 样例3n = 15,输出:8
    • 解释:字符串 "0246810121416..." 中的第15个字符是 '8'。 通过上述方法,我们可以有效地帮助小U找到字符串中的第 ( n ) 个字符,确保在构建字符串的过程中,准确地定位到目标字符。