优化代码
#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;
}
}
运行超时,怎么优化代码 运行超时的问题通常是由于算法复杂度过高导致的。在这段代码中,存在一个时间复杂度较高的部分,即对每个数字进行字符串转换和查找字符的操作。
为了优化代码,可以考虑以下几点:
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;
}
通过上述优化,可以减少了字符串转换和字符查找的次数,从而提高了代码的运行效率。 代码优化建议:
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:} 试试O3
页:
[1]