lsmCC 发表于 2023-11-5 18:03:09

优化代码

#include <bits/stdc++.h>
using namespace std;
int n,m,l,r;
int main()
{
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
      scanf("%d %d",&l,&r);
      int res=0;
      for(int i=l;i<=r;i++)
      {
         string s=to_string(i);
            if(s.find('2')!=string::npos)
            {
                res++;

            }
      }
      cout<<res<<endl;
    }
   
}
运行超时,怎么优化代码

isdkz 发表于 2023-11-5 18:03:52

运行超时的问题通常是由于算法复杂度过高导致的。在这段代码中,存在一个时间复杂度较高的部分,即对每个数字进行字符串转换和查找字符的操作。

为了优化代码,可以考虑以下几点:

1. 避免重复的字符串转换操作:在循环中,对每个数字都进行了字符串转换操作,这是一个耗时的操作。可以在循环外部先将所有数字转换成字符串,然后在循环中直接使用转换后的字符串。

2. 减少字符查找的次数:在当前代码中,对每个数字都进行了字符查找操作。可以通过将数字转换成字符串后,使用一个标志变量来记录是否存在字符'2',而不是每次都进行查找操作。

3. 优化循环结构:可以考虑使用更高效的循环结构,例如使用递增的方式遍历数字,而不是从l到r的方式遍历。

下面是优化后的代码示例:

#include <bits/stdc++.h>
using namespace std;

int n, m, l, r;

int countDigits(int num) {
    int count = 0;
    while (num > 0) {
      if (num % 10 == 2) {
            return 1;
      }
      num /= 10;
    }
    return 0;
}

int main() {
    cin >> n >> m;
    vector<string> nums;
    for (int i = 0; i < m; i++) {
      scanf("%d %d", &l, &r);
      int res = 0;
      for (int j = l; j <= r; j++) {
            nums.push_back(to_string(j));
      }
      for (const string& s : nums) {
            res += countDigits(stoi(s));
      }
      cout << res << endl;
      nums.clear();
    }
    return 0;
}


通过上述优化,可以减少了字符串转换和字符查找的次数,从而提高了代码的运行效率。

Mike_python小 发表于 2023-11-5 18:03:58

代码优化建议:

1. 避免使用#include <bits/stdc++.h>,它是非标准的头文件,不建议在正式的项目中使用。应该根据需要包含具体的标准头文件,如<iostream>和<string>。

2. 尽量避免在循环中使用cin和cout,这会导致频繁的输入输出操作,影响程序的性能。可以考虑使用scanf和printf进行输入输出。

3. 使用算法和数据结构进行优化,而不是直接暴力遍历。在本题中,可以通过数学方法来计算每个区间内数字中包含数字'2'的个数。

4. 在循环之前进行预处理,将每个数字的字符串表示存储在数组中,避免在循环内部重复计算字符串。

综上所述,以下是经过优化的代码:


#include <iostream>
#include <vector>
using namespace std;

int countTwo(int num) {
    int count = 0;
    while (num > 0) {
      if (num % 10 == 2)
            count++;
      num /= 10;
    }
    return count;
}

int main() {
    int n, m;
    cin >> n >> m;

    vector<string> nums(n + 1);
    for (int i = 1; i <= n; i++) {
      nums = to_string(i);
    }

    for (int i = 0; i < m; i++) {
      int l, r;
      scanf("%d %d", &l, &r);

      int res = 0;
      for (int j = l; j <= r; j++) {
            res += countTwo(j);
      }

      cout << res << endl;
    }

    return 0;
}


这段代码通过使用数学方法和预处理的方式进行优化。在循环之前将每个数字的字符串表示存储在数组中,避免在循环内部重复计算。并且使用countTwo函数计算每个数字中包含数字'2'的个数。这样可以大大减少循环的次数,提高程序的效率。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

poly 发表于 2023-11-6 13:04:37

试试O3
页: [1]
查看完整版本: 优化代码