数字魔法的加一操作 | 豆包MarsCode AI刷题

36 阅读3分钟

题目描述

数字魔法师小U发现了一种特殊的数字变换魔法。这个魔法可以对一个数字字符串进行"进位"操作。每次操作规则如下:

  • 对字符串中的每个数字进行加一操作
  • 当某位数字为9时,加一后变成 0,并在前面补 1

例如:

  • "798" 经过一次操作变成 "8109"(7→8, 9→0并向前增加一个1, 8→9)
  • "999" 经过一次操作变成 "101010"

现在给定一个数字字符串 num_str(长度为n)和操作次数 k,请计算经过 k 次操作后得到的最终结果。由于结果可能非常大,请将答案对 1000000007 (10^9 + 7) 取模。

输入

  • 第一行包含两个整数 n 和 k(1 ≤ n ≤ 50, 1 ≤ k ≤ 100)
  • 第二行包含一个长度为n的数字字符串 num_str,仅由数字0-9组成

返回

  • 返回一个整数,表示最终结果对 1000000007 取模后的值

测试样例

样例1:

输入:n = 3 ,k = 1 ,num_str = "798"
返回:8109
解释:798 经过一次操作变成 8109

样例2:

输入:n = 3 ,k = 3 ,num_str = "798"
返回:103221

  • 第一次操作:798 → 8109
  • 第二次操作:8109 → 92110
  • 第三次操作:92110 → 103221

样例3:

输入:n = 4 ,k = 3 ,num_str = "7989"
返回:10322132

解题思路

问题理解

题目要求我们对一个数字字符串进行多次"进位"操作,每次操作都会对字符串中的每个数字进行加一操作,并且在遇到9时需要特殊处理。最终结果可能非常大,因此需要对结果进行取模操作。

数据结构选择

由于我们需要对字符串进行频繁的修改和插入操作,使用字符串作为主要数据结构是合适的。字符串的插入操作可以通过 std::string 的 insert 方法高效实现。

算法步骤

  1. 初始化:从输入的字符串开始。

  2. 模拟操作:对字符串进行 k 次操作。每次操作包括:

    • 遍历字符串中的每个字符。
    • 对每个字符进行加一操作。
    • 如果字符是 '9',则将其变为 '0',并在前面插入 '1'。
  3. 处理大数:由于结果可能非常大,而模数是 1e9+7,因此处理的适合要开 long long 防溢出。

完整代码

string op(string s) {
  string res;
  for(int i = 0 ; i < s.size() ; i ++) {
    if(s[i] == '9') res += "10";
    else res += (s[i] + 1);
  }
  // cout << res << endl;
  return res;
}

int solution(int n, int k, std::string s) {
  for(int i = 0 ; i < k ; i ++) {
    s = op(s);
  }
  int mod = 1000000007;
  long long res = 0;
  for(int i = 0 ; i < s.size() ; i ++) {
    res = (res * 10 % mod + (s[i] - '0'));
  }
  // cout << res << endl;
  return res;
}