这是问题count and say 我的接受代码在这里。我写了main函数,提交时只需复制countAndSay函数。
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
char* countAndSay(int n)
{
if( n == 1 )
return "1";
char *cur = (char *)malloc(2*sizeof(char));
char *res;
cur[0]='1';
cur[1]='\0';
int len, idx, j, count;
for(int i = 2; i <= n; ++i)
{
len = strlen(cur);
res = (char *)malloc(len * 2 + 1);
memset(res, '\0', len * 2 + 1);
count = 1;
for(idx = 1, j = 0; idx < len; ++idx)
{
if(cur[idx] == cur[idx-1])
{
++count;
}
else
{
res[j++] = '0' + count;
res[j++] = cur[idx-1];
count = 1;
}
}//end of for
res[j++] = '0' + count;
res[j++] = cur[len-1];
free(cur);
cur = res;
}
return cur;
}
int main()
{
char *s = countAndSay(INT_MAX);
printf("%s\n",s);
free(s);
return 0;
}
这段代码我从讨论部分和模型部分看到。我只是困惑 为什么使用res [j ++] ='0'+ count因为count可能是11或12,当count大于9时,res [j ++]不是'0'和'9'之间的字符,所以我运行了代码,它出了问题。
ctci(1720,0x100392380)malloc: * mach_vm_map(size = 18446744071713468416)失败(错误代码= 3) * 错误:无法分配区域 ***在malloc_error_break中设置断点以进行调试 程序以退出代码结束:9
我猜可能系列太长了,我的电脑内存不够。所以我把数字改为500,还是错了。
无法想象出原因。
按照@ WhozCraig的建议,我将len打印到malloc,结果就是这样。
1
2
2
4
6
6
8
10
14
20
26
34
46
62
78
102
134
176
226
302
408
528
678
904
1182
1540
2012
2606
3410
4462
5808
7586
9898
12884
16774
21890
28528
37158
48410
63138
82350
107312
139984
182376
237746
310036
403966
526646
686646
894810
1166642
1520986
1982710
2584304
3369156
4391702
5724486
7462860
9727930
12680852
16530884
21549544
28091184
36619162
47736936
62226614
81117366
105745224
137842560
179691598
234241786
305351794
398049970
518891358
676414798
881752750
1149440192
ctci(1828,0x100392380) malloc: *** mach_vm_map(size=18446744071713468416) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Program ended with exit code: 9
所以1149440192B,1149440192 /(1024 * 1024)MB = 1096MB,我只看内存,它大于1096.1915893555MB。
答案 0 :(得分:0)
您的内存不足。
每次绕过循环for(int i = 2; i <= n; ++i)
都可能使res
的大小加倍,而您使用n == INT_MAX
对其进行了调用。宇宙中没有可以分配1<<INT_MAX
字节RAM的计算机。
问题说明说要运行n == 30
。您的输出表明有足够的RAM可以运行30。