内存分配问题
Memory allocation issue
这是我解决这个问题的代码。代码在我的code::块上运行良好,但在spoj网站和ideone.com上运行不好。我遇到了运行时错误。我想spoj服务器无法分配所需的内存量。请提出一些建议。
http://paste.ubuntu.com/1277109/(MY代码)
您的代码声明了一个空字符串s
,然后分配给它的元素…
...
string s,res;int c=0;
int sum,carry=0;
for(int i=m-1;i>=0;i--)
{
sum=(a[i]-'0')*2+carry;
s[c]=sum%10+'0'; // This is undefined behavior, s is empty
carry=sum/10;
c++;
}
...
这是您的问题的可能答案,而不是您的问题。
我想这个问题有算法的味道,它的目的是找到时间复杂度最小的解决方案(可能是线性时间解决方案)。对与最佳时间复杂度相关的问题做一些前置处理是有帮助的。
因此,我计算了几个时间步长产生的模式(如下所示):
step pattern no. consecutive zero pairs
1 01 0
2 1001 1
3 01101001 1
4 1001011001101001 3
5 01101001100101101001011001101001 5
6 1001011001101001011010011001011001101001100101101001011001101001 11
7 0110100110010110100101100110100110010110011010010110100110010110 21
1001011001101001011010011001011001101001100101101001011001101001
8 1001011001101001011010011001011001101001100101101001011001101001 43
0110100110010110100101100110100110010110011010010110100110010110
0110100110010110100101100110100110010110011010010110100110010110
1001011001101001011010011001011001101001100101101001011001101001
9 0110100110010110100101100110100110010110011010010110100110010110 85
1001011001101001011010011001011001101001100101101001011001101001
1001011001101001011010011001011001101001100101101001011001101001
0110100110010110100101100110100110010110011010010110100110010110
1001011001101001011010011001011001101001100101101001011001101001
0110100110010110100101100110100110010110011010010110100110010110
0110100110010110100101100110100110010110011010010110100110010110
1001011001101001011010011001011001101001100101101001011001101001
产生上述图案的代码如下所示:
#include<iostream>
using namespace std;
main()
{
string s,t="";
s="paste pattern produced in a time-step here";
int i,l,n=0;
l=s.length();
cout <<"s.length - "<<l<<endl;
for(i=0;i<l;i++)
{
if(s[i]=='0')
{t+="10";}
else
{t+="01";}
}
l*=2;
for(i=0;i<l-1;i++)
{
if(t[i]=='0' && t[i+1]=='0')
{
n+=1;
}
}
cout <<"t - "<<t<<endl;
cout <<"no. of consecutive zero pairs - "<<n<<endl;
}
以下是一些重要的观察结果:
1) 每个时间步骤中的字符数是前一步骤的两倍。
2) 在上一个时间步长中,组合01会产生一对连续的零。
3) 任何模式的后半部分都将是前半部分的NOT。
现在是有趣的部分。请参阅为每个步骤生成的连续零对的数量。如果我们将第一步的结果赋值,比如n为零:
对于步骤2,我们得到的结果为n*2+1,其中n为0。
对于步骤3,我们得到的结果是n*2-1,其中n是1。
对于步骤4,我们得到的结果是n*2+1,其中n是1。
对于步骤5,我们得到的结果是n*2-1,其中n是3。
或者一般情况下,我们的结果等于n*2-1(对于奇数时间步长)并且结果等于n*2+1(对于偶数时间步长)
这不会解决我们的问题,因为n是一个变量,我们需要找到一个与初始结果相关的数学公式(对于时间步长1)并且在任何时间步长的结果说t.
但我们有一条简单的出路。
看看数字0,1,1,3,5,11,21,43,85…
它形成了雅各布序列。
这是我们的解决方案。
1) 浏览输入的数字,找出最大。这需要O(n)时间。
2) 创建Jacobthal数的查找表(LUT),最大值为。这需要不超过O(n)时间,因为您只需要前两个Jacobthal数作为当前Jacobthal值。从Jacobthal数的性质可以看出这一点。
3) 再次遍历输入数字,这次输出相应的LUT的序列号。查找表需要O(1)时间n个数将是O(n)。
4) 整个问题的时间复杂度为O(n)。
这种方法的一个优点是我们不必处理大字符串。
这只是@6502答案的扩展。
看起来奥斯特林斯tream非常适合你想要的东西。
ostringstream oss;
string s,res;
int c=0;
int sum,carry=0;
for(int i=m-1;i>=0;i--)
{
sum=(a[i]-'0')*2+carry;
oss << (sum%10) << '0'; //Were you trying to concatenate a '0' as well?
carry=sum/10;
}
s = oss.str();
- 在c++中使用动态分配的问题
- C++中的移动分配出现问题.非法指令: 4.
- 在函数中分配内存时出现问题
- 使用同一类中的方法重新分配字段时出现问题
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 使用 Libssh 将文件从服务器复制到客户端:分配文件复制目标路径时出现问题
- C++ DLL 堆内存分配问题
- 分配具有主参数类型的数组时出现问题
- 在C 中动态分配的内存的问题
- 未分配正在释放的指针 - 指针问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- 单链表分配问题 (nullptr)
- C++函数问题中的数组分配
- 复制到新阵列时出现动态内存分配问题
- 我不知道为什么会发生堆损坏(关于内存分配问题)
- QFILE INIT/分配OP问题当对象是类成员时
- 使用队列和列表 STL 进行C++分配。在将数据填充到列表或队列中然后打印该数据时遇到问题
- C++内存管理问题(分配大量内存,但从不释放内存)
- 有问题分配字符串指针字符串值