​把数组排成最小的数(报错求指教)

把数组排成最小的数 
【题目】输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
代码如下: const int g_MaxNumberLength = 10;
char *g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];
char *g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1];
int compar(const void* strNumber1, const void* strNumber2)
{
	strcpy(g_StrCombine1, *(const char **)strNumber1);
	strcat(g_StrCombine1, *(const char **)strNumber2);
	strcpy(g_StrCombine2, *(const char **)strNumber2);
	strcat(g_StrCombine2, *(const char **)strNumber1);
	return strcmp(g_StrCombine1, g_StrCombine2);
}
class Solution {
public:
	
	string PrintMinNumber(vector<int> numbers) {
		int size = numbers.size();
		string MinNumber;
		if (size<=0)
			return MinNumber;
		char **strNumbers = (char**)(new int[size]);
		for (int i = 0; i<size; ++i)
		{
			strNumbers[i] = new char[g_MaxNumberLength + 1];
			sprintf(strNumbers[i], "%d", numbers[i]);
		}
		qsort(strNumbers, size, sizeof(char*), compar);
		for (int i = 0; i<size; ++i)
		{
			MinNumber += strNumbers[i];
		}
		return MinNumber;
	}

};
以上代码在VS2013中测试可以通过,但是提交到牛客网上报错如下:
不通过
您的代码已保存
运行错误:请检查是否存在数组、列表等越界非法访问,内存非法访问等情况
case通过率为0.00%
请大神指教!谢谢!
全部评论
【问题解决】 某大神说:假设size=10,那么char **strNumbers=(char**)(new int[size]),strNumbers指向分配区域大小为10*4=40。如果地址值是32位,这个strNumbers[i]读取正常;但是地址值是64位时,strNumber读到i=5时就会发生地址越界错误。内存地址是32位时,指针大小就是4个字节;内存地址是64位时,指针大小是8个字节。 而我的VS2013用的是win32控制台应用程序。 牛客网看来是64位的咯。 改成:char **strNumbers = (char**)(new long[size]);  或者:char **strNumbers=new char*[size]; 或者:char* strNumbers[1000]; 都可以通过。 不过,以后还是用string类型省心,指针太容易出错了。
点赞 回复
分享
发布于 2017-05-12 11:16
vector<int>是c++ 11的写法吧,而g++编译默认不是用的c++ 11...我猜的
点赞 回复
分享
发布于 2017-05-11 16:23
滴滴
校招火热招聘中
官网直投
在2013上不都得改成 strcpy_s,strcat_s,sprintf_s的形式么, 我试了下发现只有存在两个数字是十位数的时候,qsort函数会导致程序崩溃= = 原因不清楚,很奇怪。。应该是compar导致的,可是看不出哪里错了呀
点赞 回复
分享
发布于 2017-05-11 17:57
你的qsort怎么实现的?有没有可能超出INT_MAX
点赞 回复
分享
发布于 2017-05-11 19:27

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务